mirror of
https://github.com/MariaDB/server.git
synced 2025-08-07 00:04:31 +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);
|
select interval(null, 1, 10, 100);
|
||||||
interval(null, 1, 10, 100)
|
interval(null, 1, 10, 100)
|
||||||
-1
|
-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("","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 find_in_set("abc","abc"),find_in_set("ab","abc"),find_in_set("abcd","abc");
|
||||||
select interval(null, 1, 10, 100);
|
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()
|
longlong Item_func_find_in_set::val_int()
|
||||||
{
|
{
|
||||||
|
bool binary_cmp= args[0]->binary || args[1]->binary;
|
||||||
if (enum_value)
|
if (enum_value)
|
||||||
{
|
{
|
||||||
ulonglong tmp=(ulonglong) args[1]->val_int();
|
ulonglong tmp=(ulonglong) args[1]->val_int();
|
||||||
@@ -1103,12 +1104,25 @@ longlong Item_func_find_in_set::val_int()
|
|||||||
do
|
do
|
||||||
{
|
{
|
||||||
const char *pos= f_pos;
|
const char *pos= f_pos;
|
||||||
while (pos != f_end)
|
if (binary_cmp)
|
||||||
{
|
{
|
||||||
if (toupper(*str) != toupper(*pos))
|
while (pos != f_end)
|
||||||
goto not_found;
|
{
|
||||||
str++;
|
if (*str != *pos)
|
||||||
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)
|
if (str == real_end || str[0] == separator)
|
||||||
return (longlong) position;
|
return (longlong) position;
|
||||||
|
Reference in New Issue
Block a user