Loading mysql-test/r/ctype_utf8.result +4 −0 Original line number Diff line number Diff line Loading @@ -955,6 +955,10 @@ char_length(a) length(a) a 2 4 ан drop table t1; set names utf8; select 'andre%' like 'andreñ%' escape 'ñ'; 'andre%' like 'andreñ%' escape 'ñ' 1 set names utf8; select 'a\\' like 'a\\'; 'a\\' like 'a\\' 1 Loading mysql-test/r/func_like.result +7 −0 Original line number Diff line number Diff line Loading @@ -158,3 +158,10 @@ DROP TABLE t1; select _cp866'aaaaaaaaa' like _cp866'%aaaa%' collate cp866_bin; _cp866'aaaaaaaaa' like _cp866'%aaaa%' collate cp866_bin 1 set names koi8r; select 'andre%' like 'andre%' escape ''; 'andre%' like 'andre%' escape '' 1 select _cp1251'andre%' like convert('andre%' using cp1251) escape ''; _cp1251'andre%' like convert('andre%' using cp1251) escape '' 1 mysql-test/t/ctype_utf8.test +6 −0 Original line number Diff line number Diff line Loading @@ -810,6 +810,12 @@ alter table t1 modify a char(2) character set utf8; select char_length(a), length(a), a from t1 order by a; drop table t1; # # Bugs#12611 # ESCAPE + LIKE do not work when the escape char is a multibyte one # set names utf8; select 'andre%' like 'andreñ%' escape 'ñ'; # # Bugs#11754: SET NAMES utf8 followed by SELECT "A\\" LIKE "A\\" returns 0 Loading mysql-test/t/func_like.test +17 −0 Original line number Diff line number Diff line Loading @@ -96,4 +96,21 @@ DROP TABLE t1; # select _cp866'aaaaaaaaa' like _cp866'%aaaa%' collate cp866_bin; # # Check 8bit escape character # set names koi8r; select 'andre%' like 'andre%' escape ''; # Check 8bit escape character with charset conversion: # For "a LIKE b ESCAPE c" expressions, # escape character is converted into the operation character set, # which is result of aggregation of character sets of "a" and "b". # "c" itself doesn't take part in aggregation, because its collation # doesn't matter, escape character is always compared binary. # In the example below, escape character is converted from koi8r into cp1251: # select _cp1251'andre%' like convert('andre%' using cp1251) escape ''; # # End of 4.1 tests sql/item_cmpfunc.cc +36 −1 Original line number Diff line number Diff line Loading @@ -2293,7 +2293,42 @@ bool Item_func_like::fix_fields(THD *thd, TABLE_LIST *tlist, Item ** ref) { /* If we are on execution stage */ String *escape_str= escape_item->val_str(&tmp_value1); escape= escape_str ? *(escape_str->ptr()) : '\\'; if (escape_str) { CHARSET_INFO *cs= cmp.cmp_collation.collation; if (use_mb(cs)) { my_wc_t wc; int rc= cs->cset->mb_wc(cs, &wc, (const uchar*) escape_str->ptr(), (const uchar*) escape_str->ptr() + escape_str->length()); escape= (int) (rc > 0 ? wc : '\\'); } else { /* In the case of 8bit character set, we pass native code instead of Unicode code as "escape" argument. Convert to "cs" if charset of escape differs. */ uint32 unused; if (escape_str->needs_conversion(escape_str->length(), escape_str->charset(), cs, &unused)) { char ch; uint errors; uint32 cnvlen= copy_and_convert(&ch, 1, cs, escape_str->ptr(), escape_str->length(), escape_str->charset(), &errors); escape= cnvlen ? ch : '\\'; } else escape= *(escape_str->ptr()); } } else escape= '\\'; /* We could also do boyer-more for non-const items, but as we would have to Loading Loading
mysql-test/r/ctype_utf8.result +4 −0 Original line number Diff line number Diff line Loading @@ -955,6 +955,10 @@ char_length(a) length(a) a 2 4 ан drop table t1; set names utf8; select 'andre%' like 'andreñ%' escape 'ñ'; 'andre%' like 'andreñ%' escape 'ñ' 1 set names utf8; select 'a\\' like 'a\\'; 'a\\' like 'a\\' 1 Loading
mysql-test/r/func_like.result +7 −0 Original line number Diff line number Diff line Loading @@ -158,3 +158,10 @@ DROP TABLE t1; select _cp866'aaaaaaaaa' like _cp866'%aaaa%' collate cp866_bin; _cp866'aaaaaaaaa' like _cp866'%aaaa%' collate cp866_bin 1 set names koi8r; select 'andre%' like 'andre%' escape ''; 'andre%' like 'andre%' escape '' 1 select _cp1251'andre%' like convert('andre%' using cp1251) escape ''; _cp1251'andre%' like convert('andre%' using cp1251) escape '' 1
mysql-test/t/ctype_utf8.test +6 −0 Original line number Diff line number Diff line Loading @@ -810,6 +810,12 @@ alter table t1 modify a char(2) character set utf8; select char_length(a), length(a), a from t1 order by a; drop table t1; # # Bugs#12611 # ESCAPE + LIKE do not work when the escape char is a multibyte one # set names utf8; select 'andre%' like 'andreñ%' escape 'ñ'; # # Bugs#11754: SET NAMES utf8 followed by SELECT "A\\" LIKE "A\\" returns 0 Loading
mysql-test/t/func_like.test +17 −0 Original line number Diff line number Diff line Loading @@ -96,4 +96,21 @@ DROP TABLE t1; # select _cp866'aaaaaaaaa' like _cp866'%aaaa%' collate cp866_bin; # # Check 8bit escape character # set names koi8r; select 'andre%' like 'andre%' escape ''; # Check 8bit escape character with charset conversion: # For "a LIKE b ESCAPE c" expressions, # escape character is converted into the operation character set, # which is result of aggregation of character sets of "a" and "b". # "c" itself doesn't take part in aggregation, because its collation # doesn't matter, escape character is always compared binary. # In the example below, escape character is converted from koi8r into cp1251: # select _cp1251'andre%' like convert('andre%' using cp1251) escape ''; # # End of 4.1 tests
sql/item_cmpfunc.cc +36 −1 Original line number Diff line number Diff line Loading @@ -2293,7 +2293,42 @@ bool Item_func_like::fix_fields(THD *thd, TABLE_LIST *tlist, Item ** ref) { /* If we are on execution stage */ String *escape_str= escape_item->val_str(&tmp_value1); escape= escape_str ? *(escape_str->ptr()) : '\\'; if (escape_str) { CHARSET_INFO *cs= cmp.cmp_collation.collation; if (use_mb(cs)) { my_wc_t wc; int rc= cs->cset->mb_wc(cs, &wc, (const uchar*) escape_str->ptr(), (const uchar*) escape_str->ptr() + escape_str->length()); escape= (int) (rc > 0 ? wc : '\\'); } else { /* In the case of 8bit character set, we pass native code instead of Unicode code as "escape" argument. Convert to "cs" if charset of escape differs. */ uint32 unused; if (escape_str->needs_conversion(escape_str->length(), escape_str->charset(), cs, &unused)) { char ch; uint errors; uint32 cnvlen= copy_and_convert(&ch, 1, cs, escape_str->ptr(), escape_str->length(), escape_str->charset(), &errors); escape= cnvlen ? ch : '\\'; } else escape= *(escape_str->ptr()); } } else escape= '\\'; /* We could also do boyer-more for non-const items, but as we would have to Loading