diff options
author | unknown <bar@bar.intranet.mysql.r18.ru> | 2004-02-04 18:16:28 +0400 |
---|---|---|
committer | unknown <bar@bar.intranet.mysql.r18.ru> | 2004-02-04 18:16:28 +0400 |
commit | 03f098d57e194ea363b1985a9e2df955a312baab (patch) | |
tree | 1398ce19ea74b3965d7ae01b49539ca0f784ab6c | |
parent | 7f6f30284e8834985884578dc723582e1e266aea (diff) | |
download | mariadb-git-03f098d57e194ea363b1985a9e2df955a312baab.tar.gz |
http://bugs.mysql.com/bug.php?id=2619
Bug #2619 ucs2 LIKE comparison fails in some cases
Fixes
-rw-r--r-- | mysql-test/r/ctype_ucs.result | 75 | ||||
-rw-r--r-- | mysql-test/t/ctype_ucs.test | 29 | ||||
-rw-r--r-- | strings/ctype-ucs2.c | 22 |
3 files changed, 116 insertions, 10 deletions
diff --git a/mysql-test/r/ctype_ucs.result b/mysql-test/r/ctype_ucs.result index 8d9c7579771..30795aaf106 100644 --- a/mysql-test/r/ctype_ucs.result +++ b/mysql-test/r/ctype_ucs.result @@ -77,6 +77,9 @@ a test select * from t1 where a like "%a%"; a +a +abc +abcd select * from t1 where a like "%abcd%"; a abcd @@ -84,6 +87,78 @@ select * from t1 where a like "%abc\d%"; a abcd drop table t1; +select 'AA' like 'AA'; +'AA' like 'AA' +1 +select 'AA' like 'A%A'; +'AA' like 'A%A' +1 +select 'AA' like 'A%%A'; +'AA' like 'A%%A' +1 +select 'AA' like 'AA%'; +'AA' like 'AA%' +1 +select 'AA' like '%AA%'; +'AA' like '%AA%' +1 +select 'AA' like '%A'; +'AA' like '%A' +1 +select 'AA' like '%AA'; +'AA' like '%AA' +1 +select 'AA' like 'A%A%'; +'AA' like 'A%A%' +1 +select 'AA' like '_%_%'; +'AA' like '_%_%' +1 +select 'AA' like '%A%A'; +'AA' like '%A%A' +1 +select 'AAA'like 'A%A%A'; +'AAA'like 'A%A%A' +1 +select 'AZ' like 'AZ'; +'AZ' like 'AZ' +1 +select 'AZ' like 'A%Z'; +'AZ' like 'A%Z' +1 +select 'AZ' like 'A%%Z'; +'AZ' like 'A%%Z' +1 +select 'AZ' like 'AZ%'; +'AZ' like 'AZ%' +1 +select 'AZ' like '%AZ%'; +'AZ' like '%AZ%' +1 +select 'AZ' like '%Z'; +'AZ' like '%Z' +1 +select 'AZ' like '%AZ'; +'AZ' like '%AZ' +1 +select 'AZ' like 'A%Z%'; +'AZ' like 'A%Z%' +1 +select 'AZ' like '_%_%'; +'AZ' like '_%_%' +1 +select 'AZ' like '%A%Z'; +'AZ' like '%A%Z' +1 +select 'AZ' like 'A_'; +'AZ' like 'A_' +1 +select 'AZ' like '_Z'; +'AZ' like '_Z' +1 +select 'AMZ'like 'A%M%Z'; +'AMZ'like 'A%M%Z' +1 CREATE TABLE t1 (a VARCHAR(10) CHARACTER SET ucs2); INSERT INTO t1 VALUES ('ÆÙ×Á'),('æÙ×Á'),('Æù×Á'),('ÆÙ÷Á'),('ÆÙ×á'),('æù÷á'); INSERT INTO t1 VALUES ('ÆÙ×ÁÐÒÏÌÄÖ'),('æÙ×ÁÐÒÏÌÄÖ'),('Æù×ÁÐÒÏÌÄÖ'),('ÆÙ÷ÁÐÒÏÌÄÖ'); diff --git a/mysql-test/t/ctype_ucs.test b/mysql-test/t/ctype_ucs.test index 021147e258a..5b1a5923ad4 100644 --- a/mysql-test/t/ctype_ucs.test +++ b/mysql-test/t/ctype_ucs.test @@ -69,6 +69,35 @@ select * from t1 where a like "%abcd%"; select * from t1 where a like "%abc\d%"; drop table t1; +# +# More LIKE test: bug#2619 +# +select 'AA' like 'AA'; +select 'AA' like 'A%A'; +select 'AA' like 'A%%A'; +select 'AA' like 'AA%'; +select 'AA' like '%AA%'; +select 'AA' like '%A'; +select 'AA' like '%AA'; +select 'AA' like 'A%A%'; +select 'AA' like '_%_%'; +select 'AA' like '%A%A'; +select 'AAA'like 'A%A%A'; + +select 'AZ' like 'AZ'; +select 'AZ' like 'A%Z'; +select 'AZ' like 'A%%Z'; +select 'AZ' like 'AZ%'; +select 'AZ' like '%AZ%'; +select 'AZ' like '%Z'; +select 'AZ' like '%AZ'; +select 'AZ' like 'A%Z%'; +select 'AZ' like '_%_%'; +select 'AZ' like '%A%Z'; +select 'AZ' like 'A_'; +select 'AZ' like '_Z'; +select 'AMZ'like 'A%M%Z'; + CREATE TABLE t1 (a VARCHAR(10) CHARACTER SET ucs2); INSERT INTO t1 VALUES ('ÆÙ×Á'),('æÙ×Á'),('Æù×Á'),('ÆÙ÷Á'),('ÆÙ×á'),('æù÷á'); INSERT INTO t1 VALUES ('ÆÙ×ÁÐÒÏÌÄÖ'),('æÙ×ÁÐÒÏÌÄÖ'),('Æù×ÁÐÒÏÌÄÖ'),('ÆÙ÷ÁÐÒÏÌÄÖ'); diff --git a/strings/ctype-ucs2.c b/strings/ctype-ucs2.c index a7a59fc50f7..775501027d0 100644 --- a/strings/ctype-ucs2.c +++ b/strings/ctype-ucs2.c @@ -1044,14 +1044,13 @@ int my_wildcmp_ucs2(CHARSET_INFO *cs, scan= my_ucs2_uni(cs,&w_wc, (const uchar*)wildstr, (const uchar*)wildend); if (scan <= 0) return 1; - wildstr+= scan; if (w_wc == (my_wc_t)escape) { + wildstr+= scan; scan= my_ucs2_uni(cs,&w_wc, (const uchar*)wildstr, (const uchar*)wildend); if (scan <= 0) return 1; - wildstr+= scan; } if (w_wc == (my_wc_t)w_many) @@ -1060,6 +1059,7 @@ int my_wildcmp_ucs2(CHARSET_INFO *cs, break; } + wildstr+= scan; scan= my_ucs2_uni(cs, &s_wc, (const uchar*)str, (const uchar*)str_end); if (scan <=0) return 1; @@ -1095,13 +1095,16 @@ int my_wildcmp_ucs2(CHARSET_INFO *cs, scan= my_ucs2_uni(cs,&w_wc, (const uchar*)wildstr, (const uchar*)wildend); if (scan <= 0) return 1; - wildstr+= scan; if (w_wc == (my_wc_t)w_many) + { + wildstr+= scan; continue; + } if (w_wc == (my_wc_t)w_one) { + wildstr+= scan; scan= my_ucs2_uni(cs, &s_wc, (const uchar*)str, (const uchar*)str_end); if (scan <=0) return 1; @@ -1120,17 +1123,16 @@ int my_wildcmp_ucs2(CHARSET_INFO *cs, scan= my_ucs2_uni(cs,&w_wc, (const uchar*)wildstr, (const uchar*)wildend); if (scan <= 0) return 1; - wildstr+= scan; if (w_wc == (my_wc_t)escape) { + wildstr+= scan; scan= my_ucs2_uni(cs,&w_wc, (const uchar*)wildstr, (const uchar*)wildend); if (scan <= 0) return 1; - wildstr+= scan; } - do + while (1) { /* Skip until the first character from wildstr is found */ while (str != str_end) @@ -1138,8 +1140,6 @@ int my_wildcmp_ucs2(CHARSET_INFO *cs, scan= my_ucs2_uni(cs,&s_wc, (const uchar*)str, (const uchar*)str_end); if (scan <= 0) return 1; - str+= scan; - if (weights) { plane=(s_wc>>8) & 0xFF; @@ -1150,17 +1150,19 @@ int my_wildcmp_ucs2(CHARSET_INFO *cs, if (s_wc == w_wc) break; + str+= scan; } if (str == str_end) return -1; result= my_wildcmp_ucs2(cs,str,str_end,wildstr,wildend,escape, w_one,w_many,weights); + if (result <= 0) return result; - } while (str != str_end && w_wc != (my_wc_t)w_many); - return -1; + str+= scan; + } } } return (str != str_end ? 1 : 0); |