Commit 2eeab0b0 authored by unknown's avatar unknown
Browse files

BUG#18233 - Memory tables INDEX USING HASH (a,b) returns 1 row on

            SELECT WHERE a= AND b=

Selecting data from memory table with varchar column and hash index over it
returns only first row matched.

Problem was that key length calculation for varchar columns didn't include
number of bytes to store length.

Fixed key length for varchar fields to include number of bytes to store length.


heap/hp_create.c:
  Fixed key length for varchar fields to include number of bytes to store length.
mysql-test/r/heap.result:
  Testcase for BUG#18233.
mysql-test/t/heap.test:
  Testcase for BUG#18233.
parent 8052fafd
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -85,6 +85,7 @@ int heap_create(const char *name, uint keys, HP_KEYDEF *keydef,
          if (!my_binary_compare(keyinfo->seg[j].charset))
            keyinfo->flag|= HA_END_SPACE_KEY;
          keyinfo->flag|= HA_VAR_LENGTH_KEY;
          length+= 2;
          /* Save number of bytes used to store length */
          keyinfo->seg[j].bit_start= 1;
          break;
@@ -95,6 +96,7 @@ int heap_create(const char *name, uint keys, HP_KEYDEF *keydef,
          if (!my_binary_compare(keyinfo->seg[j].charset))
            keyinfo->flag|= HA_END_SPACE_KEY;
          keyinfo->flag|= HA_VAR_LENGTH_KEY;
          length+= 2;
          /* Save number of bytes used to store length */
          keyinfo->seg[j].bit_start= 2;
          /*
+13 −0
Original line number Diff line number Diff line
@@ -718,3 +718,16 @@ Name Engine Version Row_format Rows Avg_row_length Data_length Max_data_length I
t1	MEMORY	10	Fixed	0	11	0	#	0	0	NULL	NULL	NULL	NULL	latin1_swedish_ci	NULL		
t2	MEMORY	10	Fixed	0	12	0	#	0	0	NULL	NULL	NULL	NULL	latin1_swedish_ci	NULL		
drop table t1, t2;
CREATE TABLE t1(a VARCHAR(1), b VARCHAR(2), c VARCHAR(256),
KEY(a), KEY(b), KEY(c)) ENGINE=MEMORY;
INSERT INTO t1 VALUES('a','aa',REPEAT('a', 256)),('a','aa',REPEAT('a',256));
SELECT COUNT(*) FROM t1 WHERE a='a';
COUNT(*)
2
SELECT COUNT(*) FROM t1 WHERE b='aa';
COUNT(*)
2
SELECT COUNT(*) FROM t1 WHERE c=REPEAT('a',256);
COUNT(*)
2
DROP TABLE t1;
+12 −0
Original line number Diff line number Diff line
@@ -458,4 +458,16 @@ create table t2 (c varchar(10)) engine=memory;
show table status like 't_';
drop table t1, t2;

#
# BUG#18233 - Memory tables INDEX USING HASH (a,b) returns 1 row on
#             SELECT WHERE a= AND b=
#
CREATE TABLE t1(a VARCHAR(1), b VARCHAR(2), c VARCHAR(256),
                KEY(a), KEY(b), KEY(c)) ENGINE=MEMORY;
INSERT INTO t1 VALUES('a','aa',REPEAT('a', 256)),('a','aa',REPEAT('a',256));
SELECT COUNT(*) FROM t1 WHERE a='a';
SELECT COUNT(*) FROM t1 WHERE b='aa';
SELECT COUNT(*) FROM t1 WHERE c=REPEAT('a',256);
DROP TABLE t1;

# End of 5.0 tests