Commit 7bb97a4a authored by unknown's avatar unknown
Browse files

Bug #7730 Server crash using soundex on an utf8 table

Don't use my_tolower: it works only for 8bit charsets.

parent 427bdc28
Loading
Loading
Loading
Loading
+12 −0
Original line number Diff line number Diff line
@@ -817,3 +817,15 @@ drop table t1;
select 'c' like '\_' as want0;
want0
0
create table t1 (id integer, a varchar(100) character set utf8 collate utf8_unicode_ci);
insert into t1 values (1, 'Test');
select * from t1 where soundex(a) = soundex('Test');
id	a
1	Test
select * from t1 where soundex(a) = soundex('TEST');
id	a
1	Test
select * from t1 where soundex(a) = soundex('test');
id	a
1	Test
drop table t1;
+9 −0
Original line number Diff line number Diff line
@@ -666,3 +666,12 @@ drop table t1;
#
select 'c' like '\_' as want0; 

#
# Bug #7730 Server crash using soundex on an utf8 table
#
create table t1 (id integer, a varchar(100) character set utf8 collate utf8_unicode_ci);
insert into t1 values (1, 'Test');
select * from t1 where soundex(a) = soundex('Test');
select * from t1 where soundex(a) = soundex('TEST');
select * from t1 where soundex(a) = soundex('test');
drop table t1;
+10 −5
Original line number Diff line number Diff line
@@ -1562,9 +1562,14 @@ void Item_func_soundex::fix_length_and_dec()
  else return 0
*/

static char get_scode(CHARSET_INFO *cs,char *ptr)
static char soundex_toupper(char ch)
{
  uchar ch=my_toupper(cs,*ptr);
  return (ch >= 'a' && ch <= 'z') ? ch - 'a' + 'A' : ch;
}

static char get_scode(char *ptr)
{
  uchar ch= soundex_toupper(*ptr);
  if (ch < 'A' || ch > 'Z')
  {
					// Thread extended alfa (country spec)
@@ -1594,8 +1599,8 @@ String *Item_func_soundex::val_str(String *str)
    from++; /* purecov: inspected */
  if (from == end)
    return &my_empty_string;		// No alpha characters.
  *to++ = my_toupper(cs,*from);		// Copy first letter
  last_ch = get_scode(cs,from);		// code of the first letter
  *to++ = soundex_toupper(*from);	// Copy first letter
  last_ch = get_scode(from);		// code of the first letter
					// for the first 'double-letter check.
					// Loop on input letters until
					// end of input (null) or output
@@ -1604,7 +1609,7 @@ String *Item_func_soundex::val_str(String *str)
  {
    if (!my_isalpha(cs,*from))
      continue;
    ch=get_scode(cs,from);
    ch=get_scode(from);
    if ((ch != '0') && (ch != last_ch)) // if not skipped or double
    {
       *to++ = ch;			// letter, copy to output