Commit 5d8c5e79 authored by bar@mysql.com's avatar bar@mysql.com

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
parent b5c01d79
...@@ -955,6 +955,10 @@ char_length(a) length(a) a ...@@ -955,6 +955,10 @@ char_length(a) length(a) a
2 4 ан 2 4 ан
drop table t1; drop table t1;
set names utf8; set names utf8;
select 'andre%' like 'andreñ%' escape 'ñ';
'andre%' like 'andreñ%' escape 'ñ'
1
set names utf8;
select 'a\\' like 'a\\'; select 'a\\' like 'a\\';
'a\\' like 'a\\' 'a\\' like 'a\\'
1 1
......
...@@ -810,6 +810,12 @@ alter table t1 modify a char(2) character set utf8; ...@@ -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; select char_length(a), length(a), a from t1 order by a;
drop table t1; 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 # Bugs#11754: SET NAMES utf8 followed by SELECT "A\\" LIKE "A\\" returns 0
......
...@@ -2293,7 +2293,25 @@ bool Item_func_like::fix_fields(THD *thd, TABLE_LIST *tlist, Item ** ref) ...@@ -2293,7 +2293,25 @@ bool Item_func_like::fix_fields(THD *thd, TABLE_LIST *tlist, Item ** ref)
{ {
/* If we are on execution stage */ /* If we are on execution stage */
String *escape_str= escape_item->val_str(&tmp_value1); 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 We could also do boyer-more for non-const items, but as we would have to
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment