mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
Fix for bug #30885: MEMORY returns incorrect data if BTREE index is used for NULL lookup
Problem: creating an rb-tree key we store length (2 bytes) before the actual data for varchar key parts. The fact was missed for NULL key parts, when we set NULL byte and skip the rest. Fix: take into account the length of the varchar key parts for NULLs.
This commit is contained in:

parent
1ba3f4f56b
commit
b4b7cf2a95
@ -808,6 +808,12 @@ uint hp_rb_pack_key(HP_KEYDEF *keydef, uchar *key, const uchar *old,
|
|||||||
if (!(*key++= (char) 1 - *old++))
|
if (!(*key++= (char) 1 - *old++))
|
||||||
{
|
{
|
||||||
k_len-= seg->length;
|
k_len-= seg->length;
|
||||||
|
/*
|
||||||
|
Take into account length (2 bytes) of varchar key parts
|
||||||
|
stored before the data.
|
||||||
|
*/
|
||||||
|
if (seg->flag & (HA_VAR_LENGTH_PART | HA_BLOB_PART))
|
||||||
|
k_len-= 2;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -321,4 +321,12 @@ DROP TABLE t1;
|
|||||||
CREATE TABLE t1 (a INT, UNIQUE USING BTREE(a)) ENGINE=MEMORY;
|
CREATE TABLE t1 (a INT, UNIQUE USING BTREE(a)) ENGINE=MEMORY;
|
||||||
INSERT INTO t1 VALUES(NULL),(NULL);
|
INSERT INTO t1 VALUES(NULL),(NULL);
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
|
create table t1(a varchar(255), b varchar(255),
|
||||||
|
key using btree (a,b)) engine=memory;
|
||||||
|
insert into t1 values (1, 1), (3, 3), (2, 2), (NULL, 1), (NULL, NULL), (0, 0);
|
||||||
|
select * from t1 where a is null;
|
||||||
|
a b
|
||||||
|
NULL NULL
|
||||||
|
NULL 1
|
||||||
|
drop table t1;
|
||||||
End of 5.0 tests
|
End of 5.0 tests
|
||||||
|
@ -235,5 +235,14 @@ CREATE TABLE t1 (a INT, UNIQUE USING BTREE(a)) ENGINE=MEMORY;
|
|||||||
INSERT INTO t1 VALUES(NULL),(NULL);
|
INSERT INTO t1 VALUES(NULL),(NULL);
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
#
|
||||||
|
# Bug #30885: MEMORY returns incorrect data if BTREE index is used for NULL lookup
|
||||||
|
#
|
||||||
|
create table t1(a varchar(255), b varchar(255),
|
||||||
|
key using btree (a,b)) engine=memory;
|
||||||
|
insert into t1 values (1, 1), (3, 3), (2, 2), (NULL, 1), (NULL, NULL), (0, 0);
|
||||||
|
select * from t1 where a is null;
|
||||||
|
drop table t1;
|
||||||
|
|
||||||
--echo End of 5.0 tests
|
--echo End of 5.0 tests
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user