postgres.git / summary / log / commit / refs

commit    0736b11318daaa38f808197f707fabed79b3aef8
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 c85af8be611..595d7a46b8a 100644 --- a/src/backend/parser/parse_agg.c +++ b/src/backend/parser/parse_agg.c @@ -695,8 +695,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 bacec2216b2..a0a0895e5fd 100644 --- a/src/test/regress/expected/aggregates.out +++ b/src/test/regress/expected/aggregates.out @@ -954,6 +954,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 4b358397293..93730c689be 100644 --- a/src/test/regress/sql/aggregates.sql +++ b/src/test/regress/sql/aggregates.sql @@ -334,6 +334,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: b18327489b3b]