Commit 82942ebf authored by ram@mysql.r18.ru's avatar ram@mysql.r18.ru

Fix for the bug #803.

Now INTERVAL(NULL, N1, N2, ...) returns NULL.
parent c4c8ce93
...@@ -25,3 +25,6 @@ find_in_set("","a,b,c") find_in_set("","a,b,c,") find_in_set("",",a,b,c") ...@@ -25,3 +25,6 @@ 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");
find_in_set("abc","abc") find_in_set("ab","abc") find_in_set("abcd","abc") find_in_set("abc","abc") find_in_set("ab","abc") find_in_set("abcd","abc")
1 0 0 1 0 0
select interval(null, 1, 10, 100);
interval(null, 1, 10, 100)
NULL
...@@ -15,3 +15,4 @@ select export_set(9,"Y","N","-",5),export_set(9,"Y","N"),export_set(9,"Y","N","" ...@@ -15,3 +15,4 @@ select export_set(9,"Y","N","-",5),export_set(9,"Y","N"),export_set(9,"Y","N",""
select elt(2,1),field(NULL,"a","b","c"); 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);
...@@ -311,7 +311,7 @@ void Item_func_interval::split_sum_func(List<Item> &fields) ...@@ -311,7 +311,7 @@ void Item_func_interval::split_sum_func(List<Item> &fields)
} }
/* /*
return -1 if null value, return NULL if null value,
0 if lower than lowest 0 if lower than lowest
1 - arg_count if between args[n] and args[n+1] 1 - arg_count if between args[n] and args[n+1]
arg_count+1 if higher than biggest argument arg_count+1 if higher than biggest argument
...@@ -319,26 +319,28 @@ void Item_func_interval::split_sum_func(List<Item> &fields) ...@@ -319,26 +319,28 @@ void Item_func_interval::split_sum_func(List<Item> &fields)
longlong Item_func_interval::val_int() longlong Item_func_interval::val_int()
{ {
double value=item->val(); double value= item->val();
if (item->null_value) if (item->null_value)
return -1; // -1 if null /* purecov: inspected */ {
null_value= 1;
return -1;
}
if (intervals) if (intervals)
{ // Use binary search to find interval { // Use binary search to find interval
uint start,end; uint start= 0, end= arg_count - 1;
start=0; end=arg_count-1;
while (start != end) while (start != end)
{ {
uint mid=(start+end+1)/2; uint mid= (start + end + 1) / 2;
if (intervals[mid] <= value) if (intervals[mid] <= value)
start=mid; start= mid;
else else
end=mid-1; end= mid - 1;
} }
return (value < intervals[start]) ? 0 : start+1; return (value < intervals[start]) ? 0 : start + 1;
} }
if (args[0]->val() > value) if (args[0]->val() > value)
return 0; return 0;
for (uint i=1 ; i < arg_count ; i++) for (uint i= 1; i < arg_count; i++)
{ {
if (args[i]->val() > value) if (args[i]->val() > value)
return i; return i;
......
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