Commit dcc65b77 authored by sergefp@mysql.com's avatar sergefp@mysql.com

Fix for BUG#8371: wrong rec_per_key value for hash index on temporary table

parent 1c2f4ffe
...@@ -355,3 +355,13 @@ id select_type table type possible_keys key key_len ref rows Extra ...@@ -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 t1 ref heap_idx heap_idx 20 const 7 Using where
1 SIMPLE t3 ref a a 40 func,const 6 Using where 1 SIMPLE t3 ref a a 40 func,const 6 Using where
drop table t1, t2, t3; 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;
...@@ -251,3 +251,9 @@ explain select * from t1 ignore key(btree_idx), t3 where t1.name='matt' and t3.a ...@@ -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; 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;
...@@ -60,7 +60,6 @@ int ha_heap::open(const char *name, int mode, uint test_if_locked) ...@@ -60,7 +60,6 @@ int ha_heap::open(const char *name, int mode, uint test_if_locked)
{ {
/* Initialize variables for the opened table */ /* Initialize variables for the opened table */
set_keys_for_scanning(); set_keys_for_scanning();
if (table->tmp_table == NO_TMP_TABLE)
update_key_stats(); update_key_stats();
} }
return (file ? 0 : 1); return (file ? 0 : 1);
...@@ -103,6 +102,8 @@ void ha_heap::update_key_stats() ...@@ -103,6 +102,8 @@ void ha_heap::update_key_stats()
for (uint i= 0; i < table->keys; i++) for (uint i= 0; i < table->keys; i++)
{ {
KEY *key=table->key_info+i; KEY *key=table->key_info+i;
if (!key->rec_per_key)
continue;
if (key->algorithm != HA_KEY_ALG_BTREE) if (key->algorithm != HA_KEY_ALG_BTREE)
{ {
ha_rows hash_buckets= file->s->keydef[i].hash_buckets; ha_rows hash_buckets= file->s->keydef[i].hash_buckets;
...@@ -122,8 +123,8 @@ int ha_heap::write_row(byte * buf) ...@@ -122,8 +123,8 @@ int ha_heap::write_row(byte * buf)
if (table->next_number_field && buf == table->record[0]) if (table->next_number_field && buf == table->record[0])
update_auto_increment(); update_auto_increment();
res= heap_write(file,buf); res= heap_write(file,buf);
if (!res && table->tmp_table == NO_TMP_TABLE && if (!res && ++records_changed*HEAP_STATS_UPDATE_THRESHOLD >
++records_changed*HEAP_STATS_UPDATE_THRESHOLD > file->s->records) file->s->records)
update_key_stats(); update_key_stats();
return res; return res;
} }
...@@ -135,8 +136,8 @@ int ha_heap::update_row(const byte * old_data, byte * new_data) ...@@ -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) if (table->timestamp_field_type & TIMESTAMP_AUTO_SET_ON_UPDATE)
table->timestamp_field->set_time(); table->timestamp_field->set_time();
res= heap_update(file,old_data,new_data); res= heap_update(file,old_data,new_data);
if (!res && table->tmp_table == NO_TMP_TABLE && if (!res && ++records_changed*HEAP_STATS_UPDATE_THRESHOLD >
++records_changed*HEAP_STATS_UPDATE_THRESHOLD > file->s->records) file->s->records)
update_key_stats(); update_key_stats();
return res; return res;
} }
......
...@@ -5289,6 +5289,7 @@ create_tmp_table(THD *thd,TMP_TABLE_PARAM *param,List<Item> &fields, ...@@ -5289,6 +5289,7 @@ create_tmp_table(THD *thd,TMP_TABLE_PARAM *param,List<Item> &fields,
keyinfo->key_length=(uint16) reclength; keyinfo->key_length=(uint16) reclength;
keyinfo->name=(char*) "tmp"; keyinfo->name=(char*) "tmp";
keyinfo->algorithm= HA_KEY_ALG_UNDEF; keyinfo->algorithm= HA_KEY_ALG_UNDEF;
keyinfo->rec_per_key=0;
if (null_pack_length) if (null_pack_length)
{ {
key_part_info->null_bit=0; key_part_info->null_bit=0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment