1
0
mirror of https://github.com/MariaDB/server.git synced 2025-07-29 05:21:33 +03:00

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
This commit is contained in:
unknown
2005-08-31 14:04:54 +05:00
parent f17853cb85
commit d02ec2b5d9
3 changed files with 29 additions and 1 deletions

View File

@ -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

View File

@ -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

View File

@ -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