mirror of
https://github.com/MariaDB/server.git
synced 2025-01-18 13:02:28 +01:00
Merge mronstrom@bk-internal.mysql.com:/home/bk/mysql-4.1
into c-5c0be253.1238-1-64736c10.cust.bredbandsbolaget.se:/home/pappa/bug12796
This commit is contained in:
commit
a69827f152
8 changed files with 62 additions and 27 deletions
|
@ -104,6 +104,7 @@ int heap_create(const char *name, uint keys, HP_KEYDEF *keydef,
|
|||
DBUG_RETURN(1);
|
||||
}
|
||||
share->keydef= (HP_KEYDEF*) (share + 1);
|
||||
share->key_stat_version= 1;
|
||||
keyseg= (HA_KEYSEG*) (share->keydef + keys);
|
||||
init_block(&share->block, reclength + 1, min_records, max_records);
|
||||
/* Fix keys */
|
||||
|
|
|
@ -136,6 +136,7 @@ typedef struct st_heap_share
|
|||
HP_KEYDEF *keydef;
|
||||
ulong min_records,max_records; /* Params to open */
|
||||
ulong data_length,index_length,max_table_size;
|
||||
uint key_stat_version; /* version to indicate insert/delete */
|
||||
uint records; /* records */
|
||||
uint blength; /* records rounded up to 2^n */
|
||||
uint deleted; /* Deleted records in database */
|
||||
|
|
|
@ -182,7 +182,7 @@ SELECT * FROM t1 WHERE a=NULL;
|
|||
a b
|
||||
explain SELECT * FROM t1 WHERE a IS NULL;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t1 ref a a 5 const 1 Using where
|
||||
1 SIMPLE t1 ref a a 5 const 2 Using where
|
||||
SELECT * FROM t1 WHERE a<=>NULL;
|
||||
a b
|
||||
NULL 99
|
||||
|
@ -296,3 +296,13 @@ insert into t1 values ("abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcd
|
|||
insert into t1 values ("abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz");
|
||||
ERROR 23000: Duplicate entry 'abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijkl' for key 1
|
||||
drop table t1;
|
||||
CREATE TABLE t1 (a int, key(a)) engine=heap;
|
||||
insert delayed into t1 values (0);
|
||||
delete from t1;
|
||||
select * from t1;
|
||||
a
|
||||
insert delayed into t1 values (0), (1);
|
||||
select * from t1 where a = 0;
|
||||
a
|
||||
0
|
||||
drop table t1;
|
||||
|
|
|
@ -182,7 +182,7 @@ SELECT * FROM t1 WHERE a=NULL;
|
|||
a b
|
||||
explain SELECT * FROM t1 WHERE a IS NULL;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t1 ref a a 5 const 1 Using where
|
||||
1 SIMPLE t1 ref a a 5 const 2 Using where
|
||||
SELECT * FROM t1 WHERE a<=>NULL;
|
||||
a b
|
||||
NULL 99
|
||||
|
@ -220,16 +220,16 @@ insert into t1 values ('aaag', 'prefill-hash=3',0);
|
|||
insert into t1 values ('aaah', 'prefill-hash=6',0);
|
||||
explain select * from t1 where a='aaaa';
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t1 ref a a 8 const 1 Using where
|
||||
1 SIMPLE t1 ref a a 8 const 2 Using where
|
||||
explain select * from t1 where a='aaab';
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t1 ref a a 8 const 1 Using where
|
||||
1 SIMPLE t1 ref a a 8 const 2 Using where
|
||||
explain select * from t1 where a='aaac';
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t1 ref a a 8 const 1 Using where
|
||||
1 SIMPLE t1 ref a a 8 const 2 Using where
|
||||
explain select * from t1 where a='aaad';
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t1 ref a a 8 const 1 Using where
|
||||
1 SIMPLE t1 ref a a 8 const 2 Using where
|
||||
insert into t1 select * from t1;
|
||||
flush tables;
|
||||
explain select * from t1 where a='aaaa';
|
||||
|
@ -291,25 +291,25 @@ insert into t1 (name) values ('Matt'), ('Lilu'), ('Corbin'), ('Carly'),
|
|||
insert into t2 select * from t1;
|
||||
explain select * from t1 where name='matt';
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t1 ref heap_idx,btree_idx heap_idx 20 const 1 Using where
|
||||
1 SIMPLE t1 ref heap_idx,btree_idx btree_idx 20 const 1 Using where
|
||||
explain select * from t2 where name='matt';
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t2 ref btree_idx,heap_idx btree_idx 20 const 1 Using where
|
||||
explain select * from t1 where name='Lilu';
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t1 ref heap_idx,btree_idx heap_idx 20 const 1 Using where
|
||||
1 SIMPLE t1 ref heap_idx,btree_idx btree_idx 20 const 1 Using where
|
||||
explain select * from t2 where name='Lilu';
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t2 ref btree_idx,heap_idx btree_idx 20 const 1 Using where
|
||||
explain select * from t1 where name='Phil';
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t1 ref heap_idx,btree_idx heap_idx 20 const 1 Using where
|
||||
1 SIMPLE t1 ref heap_idx,btree_idx btree_idx 20 const 1 Using where
|
||||
explain select * from t2 where name='Phil';
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t2 ref btree_idx,heap_idx btree_idx 20 const 1 Using where
|
||||
explain select * from t1 where name='Lilu';
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t1 ref heap_idx,btree_idx heap_idx 20 const 1 Using where
|
||||
1 SIMPLE t1 ref heap_idx,btree_idx btree_idx 20 const 1 Using where
|
||||
explain select * from t2 where name='Lilu';
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t2 ref btree_idx,heap_idx btree_idx 20 const 1 Using where
|
||||
|
@ -364,5 +364,5 @@ a
|
|||
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
|
||||
1 SIMPLE t1 range a a 5 NULL 4 Using where
|
||||
drop table t1;
|
||||
|
|
|
@ -554,7 +554,7 @@ Warnings:
|
|||
Note 1031 Table storage engine for 't1' doesn't have this option
|
||||
show keys from t1;
|
||||
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment
|
||||
t1 1 a 1 a NULL 1000 NULL NULL YES HASH
|
||||
t1 1 a 1 a NULL 500 NULL NULL YES HASH
|
||||
drop table t1,t2;
|
||||
create table t1 ( a tinytext, b char(1), index idx (a(1),b) );
|
||||
insert into t1 values (null,''), (null,'');
|
||||
|
|
|
@ -234,4 +234,15 @@ insert into t1 values ("abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcd
|
|||
insert into t1 values ("abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz");
|
||||
drop table t1;
|
||||
|
||||
#
|
||||
# Bug 12796: Record doesn't show when selecting through index
|
||||
#
|
||||
CREATE TABLE t1 (a int, key(a)) engine=heap;
|
||||
insert delayed into t1 values (0);
|
||||
delete from t1;
|
||||
select * from t1;
|
||||
insert delayed into t1 values (0), (1);
|
||||
select * from t1 where a = 0;
|
||||
drop table t1;
|
||||
|
||||
# End of 4.1 tests
|
||||
|
|
|
@ -68,7 +68,7 @@ int ha_heap::open(const char *name, int mode, uint test_if_locked)
|
|||
ha_heap::info(), which is always called before key statistics are
|
||||
used.
|
||||
*/
|
||||
key_stats_ok= FALSE;
|
||||
key_stat_version= file->s->key_stat_version-1;
|
||||
}
|
||||
return (file ? 0 : 1);
|
||||
}
|
||||
|
@ -114,14 +114,21 @@ void ha_heap::update_key_stats()
|
|||
continue;
|
||||
if (key->algorithm != HA_KEY_ALG_BTREE)
|
||||
{
|
||||
ha_rows hash_buckets= file->s->keydef[i].hash_buckets;
|
||||
key->rec_per_key[key->key_parts-1]=
|
||||
hash_buckets ? file->s->records/hash_buckets : 0;
|
||||
if (key->flags & HA_NOSAME)
|
||||
key->rec_per_key[key->key_parts-1]= 1;
|
||||
else
|
||||
{
|
||||
ha_rows hash_buckets= file->s->keydef[i].hash_buckets;
|
||||
uint no_records= hash_buckets ? file->s->records/hash_buckets : 2;
|
||||
if (no_records < 2)
|
||||
no_records= 2;
|
||||
key->rec_per_key[key->key_parts-1]= no_records;
|
||||
}
|
||||
}
|
||||
}
|
||||
records_changed= 0;
|
||||
/* At the end of update_key_stats() we can proudly claim they are OK. */
|
||||
key_stats_ok= TRUE;
|
||||
key_stat_version= file->s->key_stat_version;
|
||||
}
|
||||
|
||||
int ha_heap::write_row(byte * buf)
|
||||
|
@ -135,7 +142,7 @@ int ha_heap::write_row(byte * buf)
|
|||
res= heap_write(file,buf);
|
||||
if (!res && ++records_changed*HEAP_STATS_UPDATE_THRESHOLD >
|
||||
file->s->records)
|
||||
key_stats_ok= FALSE;
|
||||
file->s->key_stat_version++;
|
||||
return res;
|
||||
}
|
||||
|
||||
|
@ -148,7 +155,7 @@ int ha_heap::update_row(const byte * old_data, byte * new_data)
|
|||
res= heap_update(file,old_data,new_data);
|
||||
if (!res && ++records_changed*HEAP_STATS_UPDATE_THRESHOLD >
|
||||
file->s->records)
|
||||
key_stats_ok= FALSE;
|
||||
file->s->key_stat_version++;
|
||||
return res;
|
||||
}
|
||||
|
||||
|
@ -159,7 +166,7 @@ int ha_heap::delete_row(const byte * buf)
|
|||
res= heap_delete(file,buf);
|
||||
if (!res && table->tmp_table == NO_TMP_TABLE &&
|
||||
++records_changed*HEAP_STATS_UPDATE_THRESHOLD > file->s->records)
|
||||
key_stats_ok= FALSE;
|
||||
file->s->key_stat_version++;
|
||||
return res;
|
||||
}
|
||||
|
||||
|
@ -277,7 +284,7 @@ void ha_heap::info(uint flag)
|
|||
have to update the key statistics. Hoping that a table lock is now
|
||||
in place.
|
||||
*/
|
||||
if (! key_stats_ok)
|
||||
if (key_stat_version != file->s->key_stat_version)
|
||||
update_key_stats();
|
||||
}
|
||||
|
||||
|
@ -290,7 +297,7 @@ int ha_heap::delete_all_rows()
|
|||
{
|
||||
heap_clear(file);
|
||||
if (table->tmp_table == NO_TMP_TABLE)
|
||||
key_stats_ok= FALSE;
|
||||
file->s->key_stat_version++;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -451,9 +458,14 @@ ha_rows ha_heap::records_in_range(uint inx, key_range *min_key,
|
|||
return HA_POS_ERROR; // Can only use exact keys
|
||||
else
|
||||
{
|
||||
/* Assert that info() did run. We need current statistics here. */
|
||||
DBUG_ASSERT(key_stats_ok);
|
||||
return key->rec_per_key[key->key_parts-1];
|
||||
if (records <= 1)
|
||||
return records;
|
||||
else
|
||||
{
|
||||
/* Assert that info() did run. We need current statistics here. */
|
||||
DBUG_ASSERT(key_stat_version == file->s->key_stat_version);
|
||||
return key->rec_per_key[key->key_parts-1];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -29,10 +29,10 @@ class ha_heap: public handler
|
|||
key_map btree_keys;
|
||||
/* number of records changed since last statistics update */
|
||||
uint records_changed;
|
||||
bool key_stats_ok;
|
||||
uint key_stat_version;
|
||||
public:
|
||||
ha_heap(TABLE *table): handler(table), file(0), records_changed(0),
|
||||
key_stats_ok(0) {}
|
||||
key_stat_version(0) {}
|
||||
~ha_heap() {}
|
||||
const char *table_type() const { return "HEAP"; }
|
||||
const char *index_type(uint inx)
|
||||
|
|
Loading…
Reference in a new issue