Loading mysql-test/r/func_group.result +1 −1 Original line number Diff line number Diff line Loading @@ -1013,7 +1013,7 @@ SELECT SQL_NO_CACHE WHERE ttt.a = ccc.b AND ttt.a = t.a GROUP BY ttt.a) AS minid FROM t1 t, t2 c WHERE t.a = c.b; minid NULL 1 DROP TABLE t1,t2; create table t1 select variance(0); show create table t1; Loading mysql-test/r/subselect.result +61 −0 Original line number Diff line number Diff line Loading @@ -3422,3 +3422,64 @@ id select_type table type possible_keys key key_len ref rows Extra 4 UNION t12 system NULL NULL NULL NULL 0 const row not found NULL UNION RESULT <union2,4> ALL NULL NULL NULL NULL NULL DROP TABLE t1; CREATE TABLE t1 (a INT, b INT); CREATE TABLE t2 (a INT); INSERT INTO t2 values (1); INSERT INTO t1 VALUES (1,1),(1,2),(2,3),(3,4); SELECT (SELECT COUNT(DISTINCT t1.b) from t2) FROM t1 GROUP BY t1.a; (SELECT COUNT(DISTINCT t1.b) from t2) 2 1 1 SELECT (SELECT COUNT(DISTINCT t1.b) from t2 union select 1 from t2 where 12 < 3) FROM t1 GROUP BY t1.a; (SELECT COUNT(DISTINCT t1.b) from t2 union select 1 from t2 where 12 < 3) 2 1 1 SELECT COUNT(DISTINCT t1.b), (SELECT COUNT(DISTINCT t1.b)) FROM t1 GROUP BY t1.a; COUNT(DISTINCT t1.b) (SELECT COUNT(DISTINCT t1.b)) 2 2 1 1 1 1 SELECT COUNT(DISTINCT t1.b), (SELECT COUNT(DISTINCT t1.b) union select 1 from DUAL where 12 < 3) FROM t1 GROUP BY t1.a; COUNT(DISTINCT t1.b) (SELECT COUNT(DISTINCT t1.b) union select 1 from DUAL where 12 < 3) 2 2 1 1 1 1 SELECT ( SELECT ( SELECT COUNT(DISTINCT t1.b) ) ) FROM t1 GROUP BY t1.a; ( SELECT ( SELECT COUNT(DISTINCT t1.b) ) ) 2 1 1 SELECT ( SELECT ( SELECT ( SELECT COUNT(DISTINCT t1.b) ) ) FROM t1 GROUP BY t1.a LIMIT 1) FROM t1 t2 GROUP BY t2.a; ( SELECT ( SELECT ( SELECT COUNT(DISTINCT t1.b) ) ) FROM t1 GROUP BY t1.a LIMIT 1) 2 2 2 DROP TABLE t1,t2; mysql-test/t/subselect.test +31 −0 Original line number Diff line number Diff line Loading @@ -2332,3 +2332,34 @@ explain select * from t1 where not exists ((select t11.i from t1 t11) union (select t12.i from t1 t12)); DROP TABLE t1; # # Bug #21540: Subqueries with no from and aggregate functions return # wrong results CREATE TABLE t1 (a INT, b INT); CREATE TABLE t2 (a INT); INSERT INTO t2 values (1); INSERT INTO t1 VALUES (1,1),(1,2),(2,3),(3,4); SELECT (SELECT COUNT(DISTINCT t1.b) from t2) FROM t1 GROUP BY t1.a; SELECT (SELECT COUNT(DISTINCT t1.b) from t2 union select 1 from t2 where 12 < 3) FROM t1 GROUP BY t1.a; SELECT COUNT(DISTINCT t1.b), (SELECT COUNT(DISTINCT t1.b)) FROM t1 GROUP BY t1.a; SELECT COUNT(DISTINCT t1.b), (SELECT COUNT(DISTINCT t1.b) union select 1 from DUAL where 12 < 3) FROM t1 GROUP BY t1.a; SELECT ( SELECT ( SELECT COUNT(DISTINCT t1.b) ) ) FROM t1 GROUP BY t1.a; SELECT ( SELECT ( SELECT ( SELECT COUNT(DISTINCT t1.b) ) ) FROM t1 GROUP BY t1.a LIMIT 1) FROM t1 t2 GROUP BY t2.a; DROP TABLE t1,t2; sql/item_sum.cc +21 −1 Original line number Diff line number Diff line Loading @@ -246,7 +246,27 @@ bool Item_sum::register_sum_func(THD *thd, Item **ref) aggr_sl->inner_sum_func_list->next= this; } aggr_sl->inner_sum_func_list= this; aggr_sl->with_sum_func= 1; /* Mark Item_subselect(s) as containing aggregate function all the way up to aggregate function's calculation context. Note that we must not mark the Item of calculation context itself because with_sum_func on the calculation context st_select_lex is already set above. with_sum_func being set for an Item means that this Item refers (somewhere in it, e.g. one of its arguments if it's a function) directly or through intermediate items to an aggregate function that is calculated in a context "outside" of the Item (e.g. in the current or outer select). with_sum_func being set for an st_select_lex means that this st_select_lex has aggregate functions directly referenced (i.e. not through a sub-select). */ for (sl= thd->lex->current_select; sl && sl != aggr_sl && sl->master_unit()->item; sl= sl->master_unit()->outer_select() ) sl->master_unit()->item->with_sum_func= 1; } return FALSE; } Loading Loading
mysql-test/r/func_group.result +1 −1 Original line number Diff line number Diff line Loading @@ -1013,7 +1013,7 @@ SELECT SQL_NO_CACHE WHERE ttt.a = ccc.b AND ttt.a = t.a GROUP BY ttt.a) AS minid FROM t1 t, t2 c WHERE t.a = c.b; minid NULL 1 DROP TABLE t1,t2; create table t1 select variance(0); show create table t1; Loading
mysql-test/r/subselect.result +61 −0 Original line number Diff line number Diff line Loading @@ -3422,3 +3422,64 @@ id select_type table type possible_keys key key_len ref rows Extra 4 UNION t12 system NULL NULL NULL NULL 0 const row not found NULL UNION RESULT <union2,4> ALL NULL NULL NULL NULL NULL DROP TABLE t1; CREATE TABLE t1 (a INT, b INT); CREATE TABLE t2 (a INT); INSERT INTO t2 values (1); INSERT INTO t1 VALUES (1,1),(1,2),(2,3),(3,4); SELECT (SELECT COUNT(DISTINCT t1.b) from t2) FROM t1 GROUP BY t1.a; (SELECT COUNT(DISTINCT t1.b) from t2) 2 1 1 SELECT (SELECT COUNT(DISTINCT t1.b) from t2 union select 1 from t2 where 12 < 3) FROM t1 GROUP BY t1.a; (SELECT COUNT(DISTINCT t1.b) from t2 union select 1 from t2 where 12 < 3) 2 1 1 SELECT COUNT(DISTINCT t1.b), (SELECT COUNT(DISTINCT t1.b)) FROM t1 GROUP BY t1.a; COUNT(DISTINCT t1.b) (SELECT COUNT(DISTINCT t1.b)) 2 2 1 1 1 1 SELECT COUNT(DISTINCT t1.b), (SELECT COUNT(DISTINCT t1.b) union select 1 from DUAL where 12 < 3) FROM t1 GROUP BY t1.a; COUNT(DISTINCT t1.b) (SELECT COUNT(DISTINCT t1.b) union select 1 from DUAL where 12 < 3) 2 2 1 1 1 1 SELECT ( SELECT ( SELECT COUNT(DISTINCT t1.b) ) ) FROM t1 GROUP BY t1.a; ( SELECT ( SELECT COUNT(DISTINCT t1.b) ) ) 2 1 1 SELECT ( SELECT ( SELECT ( SELECT COUNT(DISTINCT t1.b) ) ) FROM t1 GROUP BY t1.a LIMIT 1) FROM t1 t2 GROUP BY t2.a; ( SELECT ( SELECT ( SELECT COUNT(DISTINCT t1.b) ) ) FROM t1 GROUP BY t1.a LIMIT 1) 2 2 2 DROP TABLE t1,t2;
mysql-test/t/subselect.test +31 −0 Original line number Diff line number Diff line Loading @@ -2332,3 +2332,34 @@ explain select * from t1 where not exists ((select t11.i from t1 t11) union (select t12.i from t1 t12)); DROP TABLE t1; # # Bug #21540: Subqueries with no from and aggregate functions return # wrong results CREATE TABLE t1 (a INT, b INT); CREATE TABLE t2 (a INT); INSERT INTO t2 values (1); INSERT INTO t1 VALUES (1,1),(1,2),(2,3),(3,4); SELECT (SELECT COUNT(DISTINCT t1.b) from t2) FROM t1 GROUP BY t1.a; SELECT (SELECT COUNT(DISTINCT t1.b) from t2 union select 1 from t2 where 12 < 3) FROM t1 GROUP BY t1.a; SELECT COUNT(DISTINCT t1.b), (SELECT COUNT(DISTINCT t1.b)) FROM t1 GROUP BY t1.a; SELECT COUNT(DISTINCT t1.b), (SELECT COUNT(DISTINCT t1.b) union select 1 from DUAL where 12 < 3) FROM t1 GROUP BY t1.a; SELECT ( SELECT ( SELECT COUNT(DISTINCT t1.b) ) ) FROM t1 GROUP BY t1.a; SELECT ( SELECT ( SELECT ( SELECT COUNT(DISTINCT t1.b) ) ) FROM t1 GROUP BY t1.a LIMIT 1) FROM t1 t2 GROUP BY t2.a; DROP TABLE t1,t2;
sql/item_sum.cc +21 −1 Original line number Diff line number Diff line Loading @@ -246,7 +246,27 @@ bool Item_sum::register_sum_func(THD *thd, Item **ref) aggr_sl->inner_sum_func_list->next= this; } aggr_sl->inner_sum_func_list= this; aggr_sl->with_sum_func= 1; /* Mark Item_subselect(s) as containing aggregate function all the way up to aggregate function's calculation context. Note that we must not mark the Item of calculation context itself because with_sum_func on the calculation context st_select_lex is already set above. with_sum_func being set for an Item means that this Item refers (somewhere in it, e.g. one of its arguments if it's a function) directly or through intermediate items to an aggregate function that is calculated in a context "outside" of the Item (e.g. in the current or outer select). with_sum_func being set for an st_select_lex means that this st_select_lex has aggregate functions directly referenced (i.e. not through a sub-select). */ for (sl= thd->lex->current_select; sl && sl != aggr_sl && sl->master_unit()->item; sl= sl->master_unit()->outer_select() ) sl->master_unit()->item->with_sum_func= 1; } return FALSE; } Loading