mirror of
https://github.com/MariaDB/server.git
synced 2025-01-18 04:53:01 +01:00
Merge mysql.com:/usr/home/bar/mysql-4.1.b12611
into mysql.com:/usr/home/bar/mysql-5.0
This commit is contained in:
commit
d261e1f5c5
6 changed files with 71 additions and 2 deletions
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -2811,7 +2811,42 @@ bool Item_func_like::fix_fields(THD *thd, 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
|
||||
{
|
||||
/*
|
||||
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
|
||||
escape= '\\';
|
||||
|
||||
/*
|
||||
We could also do boyer-more for non-const items, but as we would have to
|
||||
|
|
|
@ -966,7 +966,7 @@ class Item_func_like :public Item_bool_func2
|
|||
Item *escape_item;
|
||||
|
||||
public:
|
||||
char escape;
|
||||
int escape;
|
||||
|
||||
Item_func_like(Item *a,Item *b, Item *escape_arg)
|
||||
:Item_bool_func2(a,b), canDoTurboBM(FALSE), pattern(0), pattern_len(0),
|
||||
|
|
Loading…
Reference in a new issue