mirror of
https://github.com/MariaDB/server.git
synced 2025-08-08 11:22:35 +03:00
Fix for bug #4340: find_in_set is case insensitive even on binary operators(2nd version)
mysql-test/r/func_set.result: Fix for bug #4340: find_in_set is case insensitive even on binary operators mysql-test/t/func_set.test: Fix for bug #4340: find_in_set is case insensitive even on binary operators sql/item_func.cc: Fix for bug #4340: find_in_set is case insensitive even on binary operators
This commit is contained in:
@@ -28,3 +28,12 @@ find_in_set("abc","abc") find_in_set("ab","abc") find_in_set("abcd","abc")
|
||||
select interval(null, 1, 10, 100);
|
||||
interval(null, 1, 10, 100)
|
||||
-1
|
||||
select find_in_set(binary 'a',binary 'A,B,C');
|
||||
find_in_set(binary 'a',binary 'A,B,C')
|
||||
0
|
||||
select find_in_set('a',binary 'A,B,C');
|
||||
find_in_set('a',binary 'A,B,C')
|
||||
0
|
||||
select find_in_set(binary 'a', 'A,B,C');
|
||||
find_in_set(binary 'a', 'A,B,C')
|
||||
0
|
||||
|
@@ -16,3 +16,11 @@ select elt(2,1),field(NULL,"a","b","c");
|
||||
select find_in_set("","a,b,c"),find_in_set("","a,b,c,"),find_in_set("",",a,b,c");
|
||||
select find_in_set("abc","abc"),find_in_set("ab","abc"),find_in_set("abcd","abc");
|
||||
select interval(null, 1, 10, 100);
|
||||
|
||||
#
|
||||
# Bug4340: find_in_set is case insensitive even on binary operators
|
||||
#
|
||||
|
||||
select find_in_set(binary 'a',binary 'A,B,C');
|
||||
select find_in_set('a',binary 'A,B,C');
|
||||
select find_in_set(binary 'a', 'A,B,C');
|
||||
|
@@ -1071,6 +1071,7 @@ static const char separator=',';
|
||||
|
||||
longlong Item_func_find_in_set::val_int()
|
||||
{
|
||||
bool binary_cmp= args[0]->binary || args[1]->binary;
|
||||
if (enum_value)
|
||||
{
|
||||
ulonglong tmp=(ulonglong) args[1]->val_int();
|
||||
@@ -1103,12 +1104,25 @@ longlong Item_func_find_in_set::val_int()
|
||||
do
|
||||
{
|
||||
const char *pos= f_pos;
|
||||
while (pos != f_end)
|
||||
if (binary_cmp)
|
||||
{
|
||||
if (toupper(*str) != toupper(*pos))
|
||||
goto not_found;
|
||||
str++;
|
||||
pos++;
|
||||
while (pos != f_end)
|
||||
{
|
||||
if (*str != *pos)
|
||||
goto not_found;
|
||||
str++;
|
||||
pos++;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
while (pos != f_end)
|
||||
{
|
||||
if (toupper(*str) != toupper(*pos))
|
||||
goto not_found;
|
||||
str++;
|
||||
pos++;
|
||||
}
|
||||
}
|
||||
if (str == real_end || str[0] == separator)
|
||||
return (longlong) position;
|
||||
|
Reference in New Issue
Block a user