Commit b4b7cf2a authored by ramil/ram@mysql.com/ramil.myoffice.izhnet.ru's avatar ramil/ram@mysql.com/ramil.myoffice.izhnet.ru
Browse files

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.
parent 1ba3f4f5
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -808,6 +808,12 @@ uint hp_rb_pack_key(HP_KEYDEF *keydef, uchar *key, const uchar *old,
      if (!(*key++= (char) 1 - *old++))
      {
        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;
      }
    }
+8 −0
Original line number Diff line number Diff line
@@ -321,4 +321,12 @@ DROP TABLE t1;
CREATE TABLE t1 (a INT, UNIQUE USING BTREE(a)) ENGINE=MEMORY;
INSERT INTO t1 VALUES(NULL),(NULL);
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
+9 −0
Original line number Diff line number Diff line
@@ -235,5 +235,14 @@ CREATE TABLE t1 (a INT, UNIQUE USING BTREE(a)) ENGINE=MEMORY;
INSERT INTO t1 VALUES(NULL),(NULL);
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