diff options
author | unknown <igor@olga.mysql.com> | 2007-06-25 22:44:22 -0700 |
---|---|---|
committer | unknown <igor@olga.mysql.com> | 2007-06-25 22:44:22 -0700 |
commit | 0127c1a30faaf04be32837306a88c0908a0cbbe9 (patch) | |
tree | f09d03e32cc2cbaaeb0f1aa8edbac3fcefe511ef | |
parent | 19446015866646659ddeaec722cd40dd900be7c3 (diff) | |
download | mariadb-git-0127c1a30faaf04be32837306a88c0908a0cbbe9.tar.gz |
Fixed bug #29087. This bug manifested itself for queries that performed
a lookup into a BINARY index by a key ended with spaces. It caused
an assertion abort for a debug version and wrong results for non-debug
versions.
The problem occurred because the function _mi_pack_key stripped off
the trailing spaces from binary search keys while the function _mi_make_key
did not do it when keys were inserted into the index.
Now the function _mi_pack_key does not remove the trailing spaces from
search keys if they are of the binary type.
mysql-test/r/binary.result:
Added a test case for bug #29087.
mysql-test/t/binary.test:
Added a test case for bug #29087.
-rw-r--r-- | myisam/mi_key.c | 12 | ||||
-rw-r--r-- | mysql-test/r/binary.result | 38 | ||||
-rw-r--r-- | mysql-test/t/binary.test | 38 |
3 files changed, 82 insertions, 6 deletions
diff --git a/myisam/mi_key.c b/myisam/mi_key.c index b203286d544..377972b5a5f 100644 --- a/myisam/mi_key.c +++ b/myisam/mi_key.c @@ -252,16 +252,16 @@ uint _mi_pack_key(register MI_INFO *info, uint keynr, uchar *key, uchar *old, if (keyseg->flag & HA_SPACE_PACK) { uchar *end=pos+length; - if (type != HA_KEYTYPE_NUM) - { - while (end > pos && end[-1] == ' ') - end--; - } - else + if (type == HA_KEYTYPE_NUM) { while (pos < end && pos[0] == ' ') pos++; } + else if (type != HA_KEYTYPE_BINARY) + { + while (end > pos && end[-1] == ' ') + end--; + } k_length-=length; length=(uint) (end-pos); FIX_LENGTH(cs, pos, length, char_length); diff --git a/mysql-test/r/binary.result b/mysql-test/r/binary.result index c5673d1c00d..c8b3768b7ce 100644 --- a/mysql-test/r/binary.result +++ b/mysql-test/r/binary.result @@ -160,3 +160,41 @@ hex(col1) 62000000000000000000 62200000000000000000 drop table t1; +CREATE TABLE t1 ( +a binary(20) NOT NULL DEFAULT '\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0', +index idx(a) +); +INSERT INTO t1 SET a=unhex('1F9480179366F2BF567E1C4B964C1EF029087575'); +INSERT INTO t1 SET a=unhex('1F9480179366F2BF567E1C4B964C1EF029082020'); +INSERT INTO t1 SET a=unhex('1F9480179366F2BF567E1C4B964C1EF029080707'); +SELECT hex(a) FROM t1 order by a; +hex(a) +1F9480179366F2BF567E1C4B964C1EF029080707 +1F9480179366F2BF567E1C4B964C1EF029082020 +1F9480179366F2BF567E1C4B964C1EF029087575 +EXPLAIN SELECT hex(a) FROM t1 order by a; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 index NULL idx 20 NULL 3 Using index +SELECT hex(a) from t1 WHERE a=unhex('1F9480179366F2BF567E1C4B964C1EF029082020'); +hex(a) +1F9480179366F2BF567E1C4B964C1EF029082020 +EXPLAIN +SELECT hex(a) from t1 WHERE a=unhex('1F9480179366F2BF567E1C4B964C1EF029082020'); +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 ref idx idx 20 const 1 Using where; Using index +SELECT hex(a) from t1 WHERE a=unhex('1F9480179366F2BF567E1C4B964C1EF02908'); +hex(a) +DROP TABLE t1; +CREATE TABLE t1 ( +id numeric(20) NOT NULL, +lang varchar(8) NOT NULL, +msg varchar(32) NOT NULL, +PRIMARY KEY (id,lang) +); +INSERT INTO t1 VALUES (33, 'en', 'zzzzzzz'); +INSERT INTO t1 VALUES (31, 'en', 'xxxxxxx'); +INSERT INTO t1 VALUES (32, 'en', 'yyyyyyy'); +SELECT * FROM t1 WHERE id=32; +id lang msg +32 en yyyyyyy +DROP TABLE t1; diff --git a/mysql-test/t/binary.test b/mysql-test/t/binary.test index 4ab6ee9eaf1..1cc6ae07675 100644 --- a/mysql-test/t/binary.test +++ b/mysql-test/t/binary.test @@ -101,3 +101,41 @@ select hex(col1) from t1; insert into t1 values ('b'),('b '); select hex(col1) from t1; drop table t1; + +# +# Bug #29087: assertion abort for a search in a BINARY non-nullable index +# by a key with trailing spaces +# + +CREATE TABLE t1 ( + a binary(20) NOT NULL DEFAULT '\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0', + index idx(a) +); +INSERT INTO t1 SET a=unhex('1F9480179366F2BF567E1C4B964C1EF029087575'); +INSERT INTO t1 SET a=unhex('1F9480179366F2BF567E1C4B964C1EF029082020'); +INSERT INTO t1 SET a=unhex('1F9480179366F2BF567E1C4B964C1EF029080707'); + +SELECT hex(a) FROM t1 order by a; +EXPLAIN SELECT hex(a) FROM t1 order by a; + +SELECT hex(a) from t1 WHERE a=unhex('1F9480179366F2BF567E1C4B964C1EF029082020'); +EXPLAIN +SELECT hex(a) from t1 WHERE a=unhex('1F9480179366F2BF567E1C4B964C1EF029082020'); + +SELECT hex(a) from t1 WHERE a=unhex('1F9480179366F2BF567E1C4B964C1EF02908'); + +DROP TABLE t1; + +CREATE TABLE t1 ( + id numeric(20) NOT NULL, + lang varchar(8) NOT NULL, + msg varchar(32) NOT NULL, + PRIMARY KEY (id,lang) +); +INSERT INTO t1 VALUES (33, 'en', 'zzzzzzz'); +INSERT INTO t1 VALUES (31, 'en', 'xxxxxxx'); +INSERT INTO t1 VALUES (32, 'en', 'yyyyyyy'); +SELECT * FROM t1 WHERE id=32; + +DROP TABLE t1; + |