Commit 4fdf0ce3 authored by unknown's avatar unknown
Browse files

Merge abarkov@bk-internal.mysql.com:/home/bk/mysql-4.1

into  mysql.com:/usr/home/bar/mysql-4.1.b12611

parents 44e289b4 965afd45
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -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
+7 −0
Original line number Diff line number Diff line
@@ -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
+6 −0
Original line number Diff line number Diff line
@@ -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
+17 −0
Original line number Diff line number Diff line
@@ -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
+36 −1
Original line number Diff line number Diff line
@@ -2293,7 +2293,42 @@ bool Item_func_like::fix_fields(THD *thd, TABLE_LIST *tlist, 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
Loading