Skip to content

Commit

Permalink
Fix failure to detect some cases of improperly-nested aggregates.
Browse files Browse the repository at this point in the history
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
  • Loading branch information
tglsfdc committed Mar 13, 2023
1 parent 96bef43 commit bc0bcce
Show file tree
Hide file tree
Showing 3 changed files with 10 additions and 2 deletions.
3 changes: 1 addition & 2 deletions src/backend/parser/parse_agg.c
Expand Up @@ -717,8 +717,7 @@ check_agg_arguments_walker(Node *node,
context->min_agglevel > agglevelsup)
context->min_agglevel = agglevelsup;
}
/* no need to examine args of the inner aggregate */
return false;
/* Continue and descend into subtree */
}
if (IsA(node, GroupingFunc))
{
Expand Down
6 changes: 6 additions & 0 deletions src/test/regress/expected/aggregates.out
Expand Up @@ -1187,6 +1187,12 @@ select (select max(min(unique1)) from int8_tbl) from tenk1;
ERROR: aggregate function calls cannot be nested
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
--
Expand Down
3 changes: 3 additions & 0 deletions src/test/regress/sql/aggregates.sql
Expand Up @@ -397,6 +397,9 @@ drop table minmaxtest cascade;
-- check for correct detection of nested-aggregate errors
select max(min(unique1)) 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
Expand Down

0 comments on commit bc0bcce

Please sign in to comment.