diff options
author | unknown <bar@mysql.com> | 2005-09-06 16:16:10 +0500 |
---|---|---|
committer | unknown <bar@mysql.com> | 2005-09-06 16:16:10 +0500 |
commit | 965afd45a18f0af3395c4750c072788e1f9b2ee1 (patch) | |
tree | f5e60a5cc5b8f3d74322e27c60478d1b679f3f79 | |
parent | e254105bec21fc101326ca366ef85cd0d8d4ed98 (diff) | |
download | mariadb-git-965afd45a18f0af3395c4750c072788e1f9b2ee1.tar.gz |
func_like.result, func_like.test:
adding test case.
item_cmpfunc.cc:
Bug#12611
ESCAPE + LIKE do not work when the escape char is a multibyte one
Additional fix for 8bit character sets:
escape character must be converted into
operation character set.
sql/item_cmpfunc.cc:
Bug#12611
ESCAPE + LIKE do not work when the escape char is a multibyte one
Additional fix for 8bit character sets:
escape character must be converted into
operation character set.
mysql-test/t/func_like.test:
adding test case.
mysql-test/r/func_like.result:
adding test case.
-rw-r--r-- | mysql-test/r/func_like.result | 7 | ||||
-rw-r--r-- | mysql-test/t/func_like.test | 17 | ||||
-rw-r--r-- | sql/item_cmpfunc.cc | 19 |
3 files changed, 42 insertions, 1 deletions
diff --git a/mysql-test/r/func_like.result b/mysql-test/r/func_like.result index a58432cb06e..bc658f9f7de 100644 --- a/mysql-test/r/func_like.result +++ b/mysql-test/r/func_like.result @@ -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 diff --git a/mysql-test/t/func_like.test b/mysql-test/t/func_like.test index 684d7032038..4e1183afeff 100644 --- a/mysql-test/t/func_like.test +++ b/mysql-test/t/func_like.test @@ -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 diff --git a/sql/item_cmpfunc.cc b/sql/item_cmpfunc.cc index c869e7f5c65..ead07892bee 100644 --- a/sql/item_cmpfunc.cc +++ b/sql/item_cmpfunc.cc @@ -2307,7 +2307,24 @@ bool Item_func_like::fix_fields(THD *thd, TABLE_LIST *tlist, Item ** ref) } else { - escape= *(escape_str->ptr()); + /* + 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 |