Commit 219f4f97 authored by gluh@gluh.mysql.r18.ru's avatar gluh@gluh.mysql.r18.ru

Merge sgluhov@bk-internal.mysql.com:/home/bk/mysql-4.0

into gluh.mysql.r18.ru:/home/gluh/MySQL-BUGS/mysql-4.0
parents 89fcb8ee 1786a388
...@@ -28,3 +28,12 @@ find_in_set("abc","abc") find_in_set("ab","abc") find_in_set("abcd","abc") ...@@ -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"); ...@@ -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=','; ...@@ -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() ...@@ -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;
......
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