Commit 342dafb0 authored by unknown's avatar unknown

Merge sinisa@work.mysql.com:/home/bk/mysql-4.1

into sinisa.nasamreza.org:/mnt/work/mysql-4.1

parents 27b7b8ab ecd4ac2a
...@@ -97,7 +97,8 @@ extern uint hp_rb_null_key_length(HP_KEYDEF *keydef, const byte *key); ...@@ -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 my_bool hp_if_null_in_key(HP_KEYDEF *keyinfo, const byte *record);
extern int hp_close(register HP_INFO *info); extern int hp_close(register HP_INFO *info);
extern void hp_clear(HP_SHARE *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 #ifdef THREAD
extern pthread_mutex_t THR_LOCK_heap; extern pthread_mutex_t THR_LOCK_heap;
#else #else
......
...@@ -30,27 +30,27 @@ ha_rows hp_rb_records_in_range(HP_INFO *info, int inx, const byte *start_key, ...@@ -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; TREE *rb_tree = &keyinfo->rb_tree;
heap_rb_param custom_arg; heap_rb_param custom_arg;
info->lastinx = inx; info->lastinx= inx;
custom_arg.keyseg = keyinfo->seg; custom_arg.keyseg= keyinfo->seg;
custom_arg.search_flag = SEARCH_FIND | SEARCH_SAME; custom_arg.search_flag= SEARCH_FIND | SEARCH_SAME;
custom_arg.key_length = start_key_len;
if (start_key) 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, start_pos= tree_record_pos(rb_tree, info->recbuf, start_search_flag,
&custom_arg); &custom_arg);
} }
else else
{ {
start_pos= 0; start_pos= 0;
} }
custom_arg.key_length = end_key_len;
if (end_key) 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, end_pos= tree_record_pos(rb_tree, info->recbuf, end_search_flag,
&custom_arg); &custom_arg);
} }
else else
{ {
...@@ -450,21 +450,26 @@ uint hp_rb_make_key(HP_KEYDEF *keydef, byte *key, ...@@ -450,21 +450,26 @@ uint hp_rb_make_key(HP_KEYDEF *keydef, byte *key,
return key - start_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; HA_KEYSEG *seg, *endseg;
uchar *start_key= key; uchar *start_key= key;
for (seg= keydef->seg, endseg= seg + keydef->keysegs; seg < endseg; for (seg= keydef->seg, endseg= seg + keydef->keysegs;
old+= seg->length, seg++) seg < endseg && (int) k_len > 0; old+= seg->length, seg++)
{ {
if (seg->null_bit) if (seg->null_bit)
{ {
k_len--;
if (!(*key++= (char) 1 - *old++)) if (!(*key++= (char) 1 - *old++))
{
k_len-= seg->length;
continue; continue;
}
} }
memcpy((byte*) key, old, seg->length); memcpy((byte*) key, old, seg->length);
key+= seg->length; key+= seg->length;
k_len-= seg->length;
} }
return key - start_key; return key - start_key;
} }
......
...@@ -36,10 +36,9 @@ int heap_rkey(HP_INFO *info, byte *record, int inx, const byte *key, ...@@ -36,10 +36,9 @@ int heap_rkey(HP_INFO *info, byte *record, int inx, const byte *key,
{ {
heap_rb_param custom_arg; heap_rb_param custom_arg;
hp_rb_pack_key(keyinfo, info->recbuf, key);
custom_arg.keyseg= info->s->keydef[inx].seg; 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; custom_arg.search_flag= SEARCH_FIND | SEARCH_SAME;
/* for next rkey() after deletion */ /* for next rkey() after deletion */
if (find_flag == HA_READ_AFTER_KEY) if (find_flag == HA_READ_AFTER_KEY)
...@@ -48,7 +47,6 @@ int heap_rkey(HP_INFO *info, byte *record, int inx, const byte *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; info->last_find_flag= HA_READ_KEY_OR_PREV;
else else
info->last_find_flag= find_flag; info->last_find_flag= find_flag;
info->lastkey_len= key_len;
if (!(pos= tree_search_key(&keyinfo->rb_tree, info->recbuf, info->parents, if (!(pos= tree_search_key(&keyinfo->rb_tree, info->recbuf, info->parents,
&info->last_pos, find_flag, &custom_arg))) &info->last_pos, find_flag, &custom_arg)))
{ {
......
...@@ -213,6 +213,20 @@ a b ...@@ -213,6 +213,20 @@ a b
INSERT INTO t1 VALUES (1,3); INSERT INTO t1 VALUES (1,3);
Duplicate entry '3' for key 1 Duplicate entry '3' for key 1
DROP TABLE t1; 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; 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); INSERT into t1 values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11);
DELETE from t1 where a < 100; DELETE from t1 where a < 100;
......
...@@ -137,6 +137,13 @@ SELECT * FROM t1 WHERE b<=>NULL; ...@@ -137,6 +137,13 @@ SELECT * FROM t1 WHERE b<=>NULL;
INSERT INTO t1 VALUES (1,3); INSERT INTO t1 VALUES (1,3);
DROP TABLE t1; 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 # Test when deleting all rows
# #
......
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