diff options
author | unknown <Sinisa@sinisa.nasamreza.org> | 2002-11-15 19:59:12 +0200 |
---|---|---|
committer | unknown <Sinisa@sinisa.nasamreza.org> | 2002-11-15 19:59:12 +0200 |
commit | 342dafb0335aa58c3ec0ab14d4067476b6b30691 (patch) | |
tree | d696a6ac332a01ac89e4eeaa40fe260f5b9544c3 | |
parent | 27b7b8abbd399982ffb8a16cf3dd2ac882acca57 (diff) | |
parent | ecd4ac2a3c16db45653b74e8b73dcc7815fd42f5 (diff) | |
download | mariadb-git-342dafb0335aa58c3ec0ab14d4067476b6b30691.tar.gz |
Merge sinisa@work.mysql.com:/home/bk/mysql-4.1
into sinisa.nasamreza.org:/mnt/work/mysql-4.1
-rw-r--r-- | heap/heapdef.h | 3 | ||||
-rw-r--r-- | heap/hp_hash.c | 29 | ||||
-rw-r--r-- | heap/hp_rkey.c | 6 | ||||
-rw-r--r-- | mysql-test/r/heap_btree.result | 14 | ||||
-rw-r--r-- | mysql-test/t/heap_btree.test | 7 |
5 files changed, 42 insertions, 17 deletions
diff --git a/heap/heapdef.h b/heap/heapdef.h index b651bf4bcb1..63109badb05 100644 --- a/heap/heapdef.h +++ b/heap/heapdef.h @@ -97,7 +97,8 @@ extern uint hp_rb_null_key_length(HP_KEYDEF *keydef, const byte *key); extern my_bool hp_if_null_in_key(HP_KEYDEF *keyinfo, const byte *record); extern int hp_close(register HP_INFO *info); extern void hp_clear(HP_SHARE *info); -extern uint hp_rb_pack_key(HP_KEYDEF *keydef, uchar *key, const uchar *old); +extern uint hp_rb_pack_key(HP_KEYDEF *keydef, uchar *key, const uchar *old, + uint k_len); #ifdef THREAD extern pthread_mutex_t THR_LOCK_heap; #else diff --git a/heap/hp_hash.c b/heap/hp_hash.c index e28f4725caf..946659621fe 100644 --- a/heap/hp_hash.c +++ b/heap/hp_hash.c @@ -30,27 +30,27 @@ ha_rows hp_rb_records_in_range(HP_INFO *info, int inx, const byte *start_key, TREE *rb_tree = &keyinfo->rb_tree; heap_rb_param custom_arg; - info->lastinx = inx; - custom_arg.keyseg = keyinfo->seg; - custom_arg.search_flag = SEARCH_FIND | SEARCH_SAME; - custom_arg.key_length = start_key_len; + info->lastinx= inx; + custom_arg.keyseg= keyinfo->seg; + custom_arg.search_flag= SEARCH_FIND | SEARCH_SAME; if (start_key) { - hp_rb_pack_key(keyinfo, info->recbuf, start_key); + custom_arg.key_length= hp_rb_pack_key(keyinfo, info->recbuf, start_key, + start_key_len); start_pos= tree_record_pos(rb_tree, info->recbuf, start_search_flag, - &custom_arg); + &custom_arg); } else { start_pos= 0; } - custom_arg.key_length = end_key_len; if (end_key) { - hp_rb_pack_key(keyinfo, info->recbuf, end_key); + custom_arg.key_length= hp_rb_pack_key(keyinfo, info->recbuf, end_key, + end_key_len); end_pos= tree_record_pos(rb_tree, info->recbuf, end_search_flag, - &custom_arg); + &custom_arg); } else { @@ -450,21 +450,26 @@ uint hp_rb_make_key(HP_KEYDEF *keydef, byte *key, return key - start_key; } -uint hp_rb_pack_key(HP_KEYDEF *keydef, uchar *key, const uchar *old) +uint hp_rb_pack_key(HP_KEYDEF *keydef, uchar *key, const uchar *old, uint k_len) { HA_KEYSEG *seg, *endseg; uchar *start_key= key; - for (seg= keydef->seg, endseg= seg + keydef->keysegs; seg < endseg; - old+= seg->length, seg++) + for (seg= keydef->seg, endseg= seg + keydef->keysegs; + seg < endseg && (int) k_len > 0; old+= seg->length, seg++) { if (seg->null_bit) { + k_len--; if (!(*key++= (char) 1 - *old++)) + { + k_len-= seg->length; continue; + } } memcpy((byte*) key, old, seg->length); key+= seg->length; + k_len-= seg->length; } return key - start_key; } diff --git a/heap/hp_rkey.c b/heap/hp_rkey.c index 4e47fd52e9b..92d2982a457 100644 --- a/heap/hp_rkey.c +++ b/heap/hp_rkey.c @@ -36,10 +36,9 @@ int heap_rkey(HP_INFO *info, byte *record, int inx, const byte *key, { heap_rb_param custom_arg; - hp_rb_pack_key(keyinfo, info->recbuf, key); - custom_arg.keyseg= info->s->keydef[inx].seg; - custom_arg.key_length= key_len; + custom_arg.key_length= info->lastkey_len= + hp_rb_pack_key(keyinfo, info->recbuf, key, key_len); custom_arg.search_flag= SEARCH_FIND | SEARCH_SAME; /* for next rkey() after deletion */ if (find_flag == HA_READ_AFTER_KEY) @@ -48,7 +47,6 @@ int heap_rkey(HP_INFO *info, byte *record, int inx, const byte *key, info->last_find_flag= HA_READ_KEY_OR_PREV; else info->last_find_flag= find_flag; - info->lastkey_len= key_len; if (!(pos= tree_search_key(&keyinfo->rb_tree, info->recbuf, info->parents, &info->last_pos, find_flag, &custom_arg))) { diff --git a/mysql-test/r/heap_btree.result b/mysql-test/r/heap_btree.result index 12d07bf6660..a33f237a312 100644 --- a/mysql-test/r/heap_btree.result +++ b/mysql-test/r/heap_btree.result @@ -213,6 +213,20 @@ a b INSERT INTO t1 VALUES (1,3); Duplicate entry '3' for key 1 DROP TABLE t1; +CREATE TABLE t1 (a int, b int, c int, key using BTREE (a, b, c)) type=heap; +INSERT INTO t1 VALUES (1, NULL, NULL), (1, 1, NULL), (1, NULL, 1); +SELECT * FROM t1 WHERE a=1 and b IS NULL; +a b c +1 NULL NULL +1 NULL 1 +SELECT * FROM t1 WHERE a=1 and c IS NULL; +a b c +1 NULL NULL +1 1 NULL +SELECT * FROM t1 WHERE a=1 and b IS NULL and c IS NULL; +a b c +1 NULL NULL +DROP TABLE t1; CREATE TABLE t1 (a int not null, primary key using BTREE (a)) type=heap; INSERT into t1 values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11); DELETE from t1 where a < 100; diff --git a/mysql-test/t/heap_btree.test b/mysql-test/t/heap_btree.test index 3dd22f2da03..5c0002fede4 100644 --- a/mysql-test/t/heap_btree.test +++ b/mysql-test/t/heap_btree.test @@ -137,6 +137,13 @@ SELECT * FROM t1 WHERE b<=>NULL; INSERT INTO t1 VALUES (1,3); DROP TABLE t1; +CREATE TABLE t1 (a int, b int, c int, key using BTREE (a, b, c)) type=heap; +INSERT INTO t1 VALUES (1, NULL, NULL), (1, 1, NULL), (1, NULL, 1); +SELECT * FROM t1 WHERE a=1 and b IS NULL; +SELECT * FROM t1 WHERE a=1 and c IS NULL; +SELECT * FROM t1 WHERE a=1 and b IS NULL and c IS NULL; +DROP TABLE t1; + # # Test when deleting all rows # |