diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2023-03-13 12:40:28 -0400 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2023-03-13 12:40:28 -0400 |
commit | 096e708056ead615f82a851d0825d9d6b40f7c96 (patch) | |
tree | bfdf5c37f2718e004bf4bad3959fd2f970a7b173 /src | |
parent | 7e319231c6bba7bad4a71a47ed0aefadf71e1103 (diff) | |
download | postgresql-096e708056ead615f82a851d0825d9d6b40f7c96.tar.gz postgresql-096e708056ead615f82a851d0825d9d6b40f7c96.zip |
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
Diffstat (limited to 'src')
-rw-r--r-- | src/backend/parser/parse_agg.c | 3 | ||||
-rw-r--r-- | src/test/regress/expected/aggregates.out | 6 | ||||
-rw-r--r-- | src/test/regress/sql/aggregates.sql | 3 |
3 files changed, 10 insertions, 2 deletions
diff --git a/src/backend/parser/parse_agg.c b/src/backend/parser/parse_agg.c index 00c0c00a00b..828cd99bc1e 100644 --- a/src/backend/parser/parse_agg.c +++ b/src/backend/parser/parse_agg.c @@ -728,8 +728,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)) { diff --git a/src/test/regress/expected/aggregates.out b/src/test/regress/expected/aggregates.out index 5949996ebc0..ffdfed8fef9 100644 --- a/src/test/regress/expected/aggregates.out +++ b/src/test/regress/expected/aggregates.out @@ -1248,6 +1248,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 -- diff --git a/src/test/regress/sql/aggregates.sql b/src/test/regress/sql/aggregates.sql index 7cf86465e94..3d5df2e469e 100644 --- a/src/test/regress/sql/aggregates.sql +++ b/src/test/regress/sql/aggregates.sql @@ -419,6 +419,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 |