diff --git a/mysql-test/r/ctype_utf8.result b/mysql-test/r/ctype_utf8.result index 0b98d9432ae..0ed3444581c 100644 --- a/mysql-test/r/ctype_utf8.result +++ b/mysql-test/r/ctype_utf8.result @@ -750,3 +750,32 @@ SELECT id FROM t1 WHERE (list_id = 1) AND (term = "letterd"); id 4 DROP TABLE t1; +SET NAMES latin1; +CREATE TABLE t1 ( +id int unsigned NOT NULL auto_increment, +list_id smallint unsigned NOT NULL, +term text NOT NULL, +PRIMARY KEY(id), +INDEX(list_id, term(19)) +) TYPE=MyISAM CHARSET=utf8; +Warnings: +Warning 1287 'TYPE=storage_engine' is deprecated; use 'ENGINE=storage_engine' instead +INSERT INTO t1 set list_id = 1, term = "testétest"; +INSERT INTO t1 set list_id = 1, term = "testetest"; +INSERT INTO t1 set list_id = 1, term = "testètest"; +SELECT id, term FROM t1 where (list_id = 1) AND (term = "testétest"); +id term +1 testétest +2 testetest +3 testètest +SELECT id, term FROM t1 where (list_id = 1) AND (term = "testetest"); +id term +1 testétest +2 testetest +3 testètest +SELECT id, term FROM t1 where (list_id = 1) AND (term = "testètest"); +id term +1 testétest +2 testetest +3 testètest +DROP TABLE t1; diff --git a/mysql-test/t/ctype_utf8.test b/mysql-test/t/ctype_utf8.test index 4a8eb63ed36..36aeec7145e 100644 --- a/mysql-test/t/ctype_utf8.test +++ b/mysql-test/t/ctype_utf8.test @@ -592,3 +592,23 @@ SELECT id FROM t1 WHERE (list_id = 1) AND (term = "letterb"); SELECT id FROM t1 WHERE (list_id = 1) AND (term = "lettera"); SELECT id FROM t1 WHERE (list_id = 1) AND (term = "letterd"); DROP TABLE t1; + + +# +# Bug #6043 erratic searching for diacriticals in indexed MyISAM UTF-8 table +# +SET NAMES latin1; +CREATE TABLE t1 ( + id int unsigned NOT NULL auto_increment, + list_id smallint unsigned NOT NULL, + term text NOT NULL, + PRIMARY KEY(id), + INDEX(list_id, term(19)) +) TYPE=MyISAM CHARSET=utf8; +INSERT INTO t1 set list_id = 1, term = "testétest"; +INSERT INTO t1 set list_id = 1, term = "testetest"; +INSERT INTO t1 set list_id = 1, term = "testètest"; +SELECT id, term FROM t1 where (list_id = 1) AND (term = "testétest"); +SELECT id, term FROM t1 where (list_id = 1) AND (term = "testetest"); +SELECT id, term FROM t1 where (list_id = 1) AND (term = "testètest"); +DROP TABLE t1; diff --git a/sql/field.cc b/sql/field.cc index ec3bd72878d..3dc1375dff3 100644 --- a/sql/field.cc +++ b/sql/field.cc @@ -5000,10 +5000,10 @@ String *Field_blob::val_str(String *val_buffer __attribute__((unused)), int Field_blob::cmp(const char *a,uint32 a_length, const char *b, uint32 b_length) { - int diff=my_strnncoll(field_charset, - (const uchar*)a,min(a_length,b_length), - (const uchar*)b,min(a_length,b_length)); - return diff ? diff : (int) (a_length - b_length); + return field_charset->coll->strnncoll(field_charset, + (const uchar*)a, a_length, + (const uchar*)b, b_length, + 0); } @@ -5087,8 +5087,8 @@ void Field_blob::get_key_image(char *buff,uint length, get_ptr(&blob); uint char_length= length / cs->mbmaxlen; - char_length= my_charpos(cs, blob, blob + length, char_length); - set_if_smaller(length, char_length); + char_length= my_charpos(cs, blob, blob + blob_length, char_length); + set_if_smaller(blob_length, char_length); if ((uint32) length > blob_length) {