Commit 69b90fb2 authored by evgen@moonbone.local's avatar evgen@moonbone.local

Merge epotemkin@lsmy3:/data/users/bk/mysql-5.0-opt-bugs

into moonbone.local:/work/18739-bug-5.0-mysql
parents 3c06a20b eb53a5b0
...@@ -3302,7 +3302,7 @@ sub valgrind_arguments { ...@@ -3302,7 +3302,7 @@ sub valgrind_arguments {
if ( $opt_valgrind_options ) if ( $opt_valgrind_options )
{ {
mtr_add_arg($args, split(' ', $opt_valgrind_options)); mtr_add_arg($args, '%s', $_) for (split(' ', $opt_valgrind_options));
} }
......
...@@ -175,6 +175,14 @@ SELECT CASE '1' WHEN '2' THEN 'BUG' ELSE 'nobug' END; ...@@ -175,6 +175,14 @@ SELECT CASE '1' WHEN '2' THEN 'BUG' ELSE 'nobug' END;
case+union+test case+union+test
case+union+test case+union+test
nobug nobug
create table t1(a float, b int default 3);
insert into t1 (a) values (2), (11), (8);
select min(a), min(case when 1=1 then a else NULL end),
min(case when 1!=1 then NULL else a end)
from t1 where b=3 group by b;
min(a) min(case when 1=1 then a else NULL end) min(case when 1!=1 then NULL else a end)
2 2 2
drop table t1;
CREATE TABLE t1 (EMPNUM INT); CREATE TABLE t1 (EMPNUM INT);
INSERT INTO t1 VALUES (0), (2); INSERT INTO t1 VALUES (0), (2);
CREATE TABLE t2 (EMPNUM DECIMAL (4, 2)); CREATE TABLE t2 (EMPNUM DECIMAL (4, 2));
......
...@@ -122,6 +122,17 @@ SELECT 'case+union+test' ...@@ -122,6 +122,17 @@ SELECT 'case+union+test'
UNION UNION
SELECT CASE '1' WHEN '2' THEN 'BUG' ELSE 'nobug' END; SELECT CASE '1' WHEN '2' THEN 'BUG' ELSE 'nobug' END;
#
# Bug #17896: problem with MIN(CASE...)
#
create table t1(a float, b int default 3);
insert into t1 (a) values (2), (11), (8);
select min(a), min(case when 1=1 then a else NULL end),
min(case when 1!=1 then NULL else a end)
from t1 where b=3 group by b;
drop table t1;
# End of 4.1 tests # End of 4.1 tests
......
...@@ -41,10 +41,25 @@ static Item_result item_store_type(Item_result a,Item_result b) ...@@ -41,10 +41,25 @@ static Item_result item_store_type(Item_result a,Item_result b)
static void agg_result_type(Item_result *type, Item **items, uint nitems) static void agg_result_type(Item_result *type, Item **items, uint nitems)
{ {
uint i; Item **item, **item_end;
type[0]= items[0]->result_type();
for (i=1 ; i < nitems ; i++) *type= STRING_RESULT;
type[0]= item_store_type(type[0], items[i]->result_type()); /* Skip beginning NULL items */
for (item= items, item_end= item + nitems; item < item_end; item++)
{
if ((*item)->type() != Item::NULL_ITEM)
{
*type= (*item)->result_type();
item++;
break;
}
}
/* Combine result types. Note: NULL items don't affect the result */
for (; item < item_end; item++)
{
if ((*item)->type() != Item::NULL_ITEM)
*type= item_store_type(type[0], (*item)->result_type());
}
} }
......
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