Commit 2eeab0b0 authored by unknown's avatar unknown

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
...@@ -85,6 +85,7 @@ int heap_create(const char *name, uint keys, HP_KEYDEF *keydef, ...@@ -85,6 +85,7 @@ int heap_create(const char *name, uint keys, HP_KEYDEF *keydef,
if (!my_binary_compare(keyinfo->seg[j].charset)) if (!my_binary_compare(keyinfo->seg[j].charset))
keyinfo->flag|= HA_END_SPACE_KEY; keyinfo->flag|= HA_END_SPACE_KEY;
keyinfo->flag|= HA_VAR_LENGTH_KEY; keyinfo->flag|= HA_VAR_LENGTH_KEY;
length+= 2;
/* Save number of bytes used to store length */ /* Save number of bytes used to store length */
keyinfo->seg[j].bit_start= 1; keyinfo->seg[j].bit_start= 1;
break; break;
...@@ -95,6 +96,7 @@ int heap_create(const char *name, uint keys, HP_KEYDEF *keydef, ...@@ -95,6 +96,7 @@ int heap_create(const char *name, uint keys, HP_KEYDEF *keydef,
if (!my_binary_compare(keyinfo->seg[j].charset)) if (!my_binary_compare(keyinfo->seg[j].charset))
keyinfo->flag|= HA_END_SPACE_KEY; keyinfo->flag|= HA_END_SPACE_KEY;
keyinfo->flag|= HA_VAR_LENGTH_KEY; keyinfo->flag|= HA_VAR_LENGTH_KEY;
length+= 2;
/* Save number of bytes used to store length */ /* Save number of bytes used to store length */
keyinfo->seg[j].bit_start= 2; keyinfo->seg[j].bit_start= 2;
/* /*
......
...@@ -718,3 +718,16 @@ Name Engine Version Row_format Rows Avg_row_length Data_length Max_data_length I ...@@ -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 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 t2 MEMORY 10 Fixed 0 12 0 # 0 0 NULL NULL NULL NULL latin1_swedish_ci NULL
drop table t1, t2; 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;
...@@ -458,4 +458,16 @@ create table t2 (c varchar(10)) engine=memory; ...@@ -458,4 +458,16 @@ create table t2 (c varchar(10)) engine=memory;
show table status like 't_'; show table status like 't_';
drop table t1, t2; 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 # End of 5.0 tests
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