Bug #7730 Server crash using soundex on an utf8 table
Don't use my_tolower: it works only for 8bit charsets.
This commit is contained in:
parent
8b3b364893
commit
2bd854c859
@ -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;
|
|||||||
#
|
#
|
||||||
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()
|
|||||||
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)
|
|||||||
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)
|
|||||||
{
|
{
|
||||||
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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user