Commit 37e2873f authored by unknown's avatar unknown
Browse files

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.
parent ffe417fd
Loading
Loading
Loading
Loading
+10 −0
Original line number Diff line number Diff line
@@ -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;
+6 −0
Original line number Diff line number Diff line
@@ -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;
+7 −6
Original line number Diff line number Diff line
@@ -60,7 +60,6 @@ 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();
  }
  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;
}
+1 −0
Original line number Diff line number Diff line
@@ -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;