mirror of
https://github.com/MariaDB/server.git
synced 2025-01-29 10:14:19 +01:00
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.
This commit is contained in:
parent
ffe417fdde
commit
37e2873fe3
4 changed files with 24 additions and 6 deletions
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Add table
Reference in a new issue