Loading mysql-test/r/case.result +8 −0 Original line number Diff line number Diff line Loading @@ -169,3 +169,11 @@ SELECT CASE '1' WHEN '2' THEN 'BUG' ELSE 'nobug' END; case+union+test case+union+test 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; mysql-test/t/case.test +11 −0 Original line number Diff line number Diff line Loading @@ -119,4 +119,15 @@ SELECT 'case+union+test' UNION 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 sql/item_cmpfunc.cc +19 −4 Original line number Diff line number Diff line Loading @@ -37,10 +37,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) { uint i; type[0]= items[0]->result_type(); for (i=1 ; i < nitems ; i++) type[0]= item_store_type(type[0], items[i]->result_type()); Item **item, **item_end; *type= STRING_RESULT; /* 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()); } } static void agg_cmp_type(Item_result *type, Item **items, uint nitems) Loading Loading
mysql-test/r/case.result +8 −0 Original line number Diff line number Diff line Loading @@ -169,3 +169,11 @@ SELECT CASE '1' WHEN '2' THEN 'BUG' ELSE 'nobug' END; case+union+test case+union+test 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;
mysql-test/t/case.test +11 −0 Original line number Diff line number Diff line Loading @@ -119,4 +119,15 @@ SELECT 'case+union+test' UNION 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
sql/item_cmpfunc.cc +19 −4 Original line number Diff line number Diff line Loading @@ -37,10 +37,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) { uint i; type[0]= items[0]->result_type(); for (i=1 ; i < nitems ; i++) type[0]= item_store_type(type[0], items[i]->result_type()); Item **item, **item_end; *type= STRING_RESULT; /* 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()); } } static void agg_cmp_type(Item_result *type, Item **items, uint nitems) Loading