diff options
author | unknown <sergefp@mysql.com> | 2005-02-08 23:44:51 +0300 |
---|---|---|
committer | unknown <sergefp@mysql.com> | 2005-02-08 23:44:51 +0300 |
commit | 37e2873fe38db47548ecac5bd3afaac23b8791be (patch) | |
tree | 6a54fa75f12baa5932602964a2ca08830e947d0a | |
parent | ffe417fddeb68274166153a357d9d534675d1823 (diff) | |
download | mariadb-git-37e2873fe38db47548ecac5bd3afaac23b8791be.tar.gz |
Fix for BUG#8371: wrong rec_per_key value for hash index on temporary table
mysql-test/r/heap_hash.result:
Testcase for BUG#8371: wrong rec_per_key value for hash index on temporary table
mysql-test/t/heap_hash.test:
Testcase for BUG#8371: wrong rec_per_key value for hash index on temporary table
sql/ha_heap.cc:
Fix for BUG#8371: wrong rec_per_key value for hash index on temporary table:
Don't assume that table->rec_per_key==NULL if table->tmp_table != NO_TMP_TABLE,
this is not true for tables created with "CREATE TEMPORARY TABLE" (while it holds
for temporary tables created during query execution)
sql/sql_select.cc:
Initialize rec_per_key for all keys in temporary table.
-rw-r--r-- | mysql-test/r/heap_hash.result | 10 | ||||
-rw-r--r-- | mysql-test/t/heap_hash.test | 6 | ||||
-rw-r--r-- | sql/ha_heap.cc | 13 | ||||
-rw-r--r-- | sql/sql_select.cc | 1 |
4 files changed, 24 insertions, 6 deletions
diff --git a/mysql-test/r/heap_hash.result b/mysql-test/r/heap_hash.result index 4f5de197858..d3673cd2a63 100644 --- a/mysql-test/r/heap_hash.result +++ b/mysql-test/r/heap_hash.result @@ -355,3 +355,13 @@ id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t1 ref heap_idx heap_idx 20 const 7 Using where 1 SIMPLE t3 ref a a 40 func,const 6 Using where drop table t1, t2, t3; +create temporary table t1 ( a int, index (a) ) engine=memory; +insert into t1 values (1),(2),(3),(4),(5); +select a from t1 where a in (1,3); +a +1 +3 +explain select a from t1 where a in (1,3); +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 range a a 5 NULL 2 Using where +drop table t1; diff --git a/mysql-test/t/heap_hash.test b/mysql-test/t/heap_hash.test index 6d8fdec4b9e..6d27f19dfad 100644 --- a/mysql-test/t/heap_hash.test +++ b/mysql-test/t/heap_hash.test @@ -251,3 +251,9 @@ explain select * from t1 ignore key(btree_idx), t3 where t1.name='matt' and t3.a drop table t1, t2, t3; +# Fix for BUG#8371: wrong rec_per_key value for hash index on temporary table +create temporary table t1 ( a int, index (a) ) engine=memory; +insert into t1 values (1),(2),(3),(4),(5); +select a from t1 where a in (1,3); +explain select a from t1 where a in (1,3); +drop table t1; diff --git a/sql/ha_heap.cc b/sql/ha_heap.cc index 96c19ce0705..3c2249ce281 100644 --- a/sql/ha_heap.cc +++ b/sql/ha_heap.cc @@ -60,8 +60,7 @@ int ha_heap::open(const char *name, int mode, uint test_if_locked) { /* Initialize variables for the opened table */ set_keys_for_scanning(); - if (table->tmp_table == NO_TMP_TABLE) - update_key_stats(); + update_key_stats(); } return (file ? 0 : 1); } @@ -103,6 +102,8 @@ void ha_heap::update_key_stats() for (uint i= 0; i < table->keys; i++) { KEY *key=table->key_info+i; + if (!key->rec_per_key) + continue; if (key->algorithm != HA_KEY_ALG_BTREE) { ha_rows hash_buckets= file->s->keydef[i].hash_buckets; @@ -122,8 +123,8 @@ int ha_heap::write_row(byte * buf) if (table->next_number_field && buf == table->record[0]) update_auto_increment(); res= heap_write(file,buf); - if (!res && table->tmp_table == NO_TMP_TABLE && - ++records_changed*HEAP_STATS_UPDATE_THRESHOLD > file->s->records) + if (!res && ++records_changed*HEAP_STATS_UPDATE_THRESHOLD > + file->s->records) update_key_stats(); return res; } @@ -135,8 +136,8 @@ int ha_heap::update_row(const byte * old_data, byte * new_data) if (table->timestamp_field_type & TIMESTAMP_AUTO_SET_ON_UPDATE) table->timestamp_field->set_time(); res= heap_update(file,old_data,new_data); - if (!res && table->tmp_table == NO_TMP_TABLE && - ++records_changed*HEAP_STATS_UPDATE_THRESHOLD > file->s->records) + if (!res && ++records_changed*HEAP_STATS_UPDATE_THRESHOLD > + file->s->records) update_key_stats(); return res; } diff --git a/sql/sql_select.cc b/sql/sql_select.cc index 8353ca9333d..96265a96386 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -5289,6 +5289,7 @@ create_tmp_table(THD *thd,TMP_TABLE_PARAM *param,List<Item> &fields, keyinfo->key_length=(uint16) reclength; keyinfo->name=(char*) "tmp"; keyinfo->algorithm= HA_KEY_ALG_UNDEF; + keyinfo->rec_per_key=0; if (null_pack_length) { key_part_info->null_bit=0; |