Commit 2bd854c8 authored by bar@mysql.com's avatar bar@mysql.com

Bug #7730 Server crash using soundex on an utf8 table

Don't use my_tolower: it works only for 8bit charsets.
parent 8b3b3648
...@@ -817,3 +817,15 @@ drop table t1; ...@@ -817,3 +817,15 @@ drop table t1;
select 'c' like '\_' as want0; select 'c' like '\_' as want0;
want0 want0
0 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;
...@@ -666,3 +666,12 @@ drop table t1; ...@@ -666,3 +666,12 @@ drop table t1;
# #
select 'c' like '\_' as want0; 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;
...@@ -1562,9 +1562,14 @@ void Item_func_soundex::fix_length_and_dec() ...@@ -1562,9 +1562,14 @@ void Item_func_soundex::fix_length_and_dec()
else return 0 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') if (ch < 'A' || ch > 'Z')
{ {
// Thread extended alfa (country spec) // Thread extended alfa (country spec)
...@@ -1594,8 +1599,8 @@ String *Item_func_soundex::val_str(String *str) ...@@ -1594,8 +1599,8 @@ String *Item_func_soundex::val_str(String *str)
from++; /* purecov: inspected */ from++; /* purecov: inspected */
if (from == end) if (from == end)
return &my_empty_string; // No alpha characters. return &my_empty_string; // No alpha characters.
*to++ = my_toupper(cs,*from); // Copy first letter *to++ = soundex_toupper(*from); // Copy first letter
last_ch = get_scode(cs,from); // code of the first letter last_ch = get_scode(from); // code of the first letter
// for the first 'double-letter check. // for the first 'double-letter check.
// Loop on input letters until // Loop on input letters until
// end of input (null) or output // end of input (null) or output
...@@ -1604,7 +1609,7 @@ String *Item_func_soundex::val_str(String *str) ...@@ -1604,7 +1609,7 @@ String *Item_func_soundex::val_str(String *str)
{ {
if (!my_isalpha(cs,*from)) if (!my_isalpha(cs,*from))
continue; continue;
ch=get_scode(cs,from); ch=get_scode(from);
if ((ch != '0') && (ch != last_ch)) // if not skipped or double if ((ch != '0') && (ch != last_ch)) // if not skipped or double
{ {
*to++ = ch; // letter, copy to output *to++ = ch; // letter, copy to output
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment