From c3c483e0918aaba7925a86a53018fd4cb5e03a82 Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 23 Aug 2004 20:12:39 +0500 Subject: [PATCH] Bug#4594: column index make = failed for gbk, but like works Fix for HEAP+HASH prefix keys. --- mysql-test/r/ctype_utf8.result | 10 ++++++++++ mysql-test/t/ctype_utf8.test | 12 ++++++++++++ sql/key.cc | 15 +++++++++++---- 3 files changed, 33 insertions(+), 4 deletions(-) diff --git a/mysql-test/r/ctype_utf8.result b/mysql-test/r/ctype_utf8.result index 6a0bd21c551..ef5ec012078 100644 --- a/mysql-test/r/ctype_utf8.result +++ b/mysql-test/r/ctype_utf8.result @@ -560,3 +560,13 @@ select * from t1 where str='str'; str str drop table t1; +create table t1 ( +str varchar(255) character set utf8 not null, +key str using hash (str(2)) +) engine=heap; +INSERT INTO t1 VALUES ('str'); +INSERT INTO t1 VALUES ('str2'); +select * from t1 where str='str'; +str +str +drop table t1; diff --git a/mysql-test/t/ctype_utf8.test b/mysql-test/t/ctype_utf8.test index 17b89ba1050..83055d05830 100644 --- a/mysql-test/t/ctype_utf8.test +++ b/mysql-test/t/ctype_utf8.test @@ -417,3 +417,15 @@ INSERT INTO t1 VALUES ('str'); INSERT INTO t1 VALUES ('str2'); select * from t1 where str='str'; drop table t1; + +# the same for HEAP+HASH +# + +create table t1 ( + str varchar(255) character set utf8 not null, + key str using hash (str(2)) +) engine=heap; +INSERT INTO t1 VALUES ('str'); +INSERT INTO t1 VALUES ('str2'); +select * from t1 where str='str'; +drop table t1; diff --git a/sql/key.cc b/sql/key.cc index 9425a368669..b1f4c9533a9 100644 --- a/sql/key.cc +++ b/sql/key.cc @@ -211,10 +211,17 @@ bool key_cmp_if_same(TABLE *table,const byte *key,uint idx,uint key_length) if (!(key_part->key_type & (FIELDFLAG_NUMBER+FIELDFLAG_BINARY+ FIELDFLAG_PACK))) { - if (my_strnncoll(key_part->field->charset(), - (const uchar*) key, length, - (const uchar*) table->record[0]+key_part->offset, - length)) + CHARSET_INFO *cs= key_part->field->charset(); + uint char_length= key_part->length / cs->mbmaxlen; + const byte *pos= table->record[0] + key_part->offset; + if (length > char_length) + { + char_length= my_charpos(cs, pos, pos + length, char_length); + set_if_smaller(char_length, length); + } + if (cs->coll->strnncollsp(cs, + (const uchar*) key, length, + (const uchar*) pos, char_length)) return 1; } else if (memcmp(key,table->record[0]+key_part->offset,length))