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:
@ -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;
|
|||||||
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)
|
|||||||
{
|
{
|
||||||
/* 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
|
||||||
|
Reference in New Issue
Block a user