postgres.git / summary / log / commit / refs
commit 5fd61bdc114f85ce57da1f139c8bda0f41d1951b
Author: Tom Lane <tgl@sss.pgh.pa.us>
Date: Mon Mar 13 16:40:28 2023 +0000
First released in: 16.0, 11.20, 12.15, 13.11, 14.8, 15.3
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
src/backend/parser/parse_agg.c | 3 +--
src/test/regress/expected/aggregates.out | 6 ++++++
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 3ef9e8ee5e1..ece4dd03296 100644
--- a/src/backend/parser/parse_agg.c
+++ b/src/backend/parser/parse_agg.c
@@ -735,8 +735,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 0a23a39aa29..26031bc7800 100644
--- a/src/test/regress/expected/aggregates.out
+++ b/src/test/regress/expected/aggregates.out
@@ -1258,6 +1258,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 2f5d0e00f3d..48bea8af5f8 100644
--- a/src/test/regress/sql/aggregates.sql
+++ b/src/test/regress/sql/aggregates.sql
@@ -434,6 +434,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
[parent: da6257eee35d]