Commit d02ec2b5 authored by unknown's avatar unknown
Browse files

Bug#12611: ESCAPE + LIKE do not work when the escape char is a multibyte one

item_cmpfunc.cc:
  Pass unicode value as "escape" argument to my_wildcmp
  if a multibyte character set is used.
  For single byte character set nothing has changed:
  native (non-unicode) character code is still passed.

ctype_utf8.result, ctype_utf8.test:
  adding test case


sql/item_cmpfunc.cc:
  Bug#12611: ESCAPE + LIKE do not work when the escape char is a multibyte one
  Pass unicode code instead of native code as
  "escape" argument to my_wildcmp.
mysql-test/t/ctype_utf8.test:
  adding test
mysql-test/r/ctype_utf8.result:
  adding test
parent f17853cb
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -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
+6 −0
Original line number Diff line number Diff line
@@ -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
+19 −1
Original line number Diff line number Diff line
@@ -2293,7 +2293,25 @@ 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
      {
        escape= *(escape_str->ptr());
      }
    }
    else
      escape= '\\';
 
    /*
      We could also do boyer-more for non-const items, but as we would have to