Fix failure to detect some cases of improperly-nested aggregates.
check_agg_arguments_walker() supposed that it needn't descend into the arguments of a lower-level aggregate function, but this is just wrong in the presence of multiple levels of sub-select. The oversight would lead to executor failures on queries that should be rejected. (Prior to v11, they actually were rejected, thanks to a "redundant" execution-time check.) Per bug #17835 from Anban Company. Back-patch to all supported branches. Discussion: https://postgr.es/m/17835-4f29f3098b2d0ba4@postgresql.org
This commit is contained in:
parent
b18327489b
commit
0736b11318
|
@ -695,8 +695,7 @@ check_agg_arguments_walker(Node *node,
|
||||||
context->min_agglevel > agglevelsup)
|
context->min_agglevel > agglevelsup)
|
||||||
context->min_agglevel = agglevelsup;
|
context->min_agglevel = agglevelsup;
|
||||||
}
|
}
|
||||||
/* no need to examine args of the inner aggregate */
|
/* Continue and descend into subtree */
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
if (IsA(node, GroupingFunc))
|
if (IsA(node, GroupingFunc))
|
||||||
{
|
{
|
||||||
|
|
|
@ -954,6 +954,12 @@ select (select max(min(unique1)) from int8_tbl) from tenk1;
|
||||||
ERROR: aggregate function calls cannot be nested
|
ERROR: aggregate function calls cannot be nested
|
||||||
LINE 1: select (select max(min(unique1)) from int8_tbl) from tenk1;
|
LINE 1: select (select max(min(unique1)) from int8_tbl) from tenk1;
|
||||||
^
|
^
|
||||||
|
select avg((select avg(a1.col1 order by (select avg(a2.col2) from tenk1 a3))
|
||||||
|
from tenk1 a1(col1)))
|
||||||
|
from tenk1 a2(col2);
|
||||||
|
ERROR: aggregate function calls cannot be nested
|
||||||
|
LINE 1: select avg((select avg(a1.col1 order by (select avg(a2.col2)...
|
||||||
|
^
|
||||||
--
|
--
|
||||||
-- Test removal of redundant GROUP BY columns
|
-- Test removal of redundant GROUP BY columns
|
||||||
--
|
--
|
||||||
|
|
|
@ -334,6 +334,9 @@ drop table minmaxtest cascade;
|
||||||
-- check for correct detection of nested-aggregate errors
|
-- check for correct detection of nested-aggregate errors
|
||||||
select max(min(unique1)) from tenk1;
|
select max(min(unique1)) from tenk1;
|
||||||
select (select max(min(unique1)) from int8_tbl) from tenk1;
|
select (select max(min(unique1)) from int8_tbl) from tenk1;
|
||||||
|
select avg((select avg(a1.col1 order by (select avg(a2.col2) from tenk1 a3))
|
||||||
|
from tenk1 a1(col1)))
|
||||||
|
from tenk1 a2(col2);
|
||||||
|
|
||||||
--
|
--
|
||||||
-- Test removal of redundant GROUP BY columns
|
-- Test removal of redundant GROUP BY columns
|
||||||
|
|
Loading…
Reference in New Issue