Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Fix failure to detect some cases of improperly-nested aggregates.
authorTom Lane <tgl@sss.pgh.pa.us>
Mon, 13 Mar 2023 16:40:28 +0000 (12:40 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Mon, 13 Mar 2023 16:40:28 +0000 (12:40 -0400)
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
src/test/regress/expected/aggregates.out
src/test/regress/sql/aggregates.sql

index 3ef9e8ee5e1ee05016df5a95881b1d021ad90d00..ece4dd03296e7a103602e375724a92ba4c6a0510 100644 (file)
@@ -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))
    {
index 0a23a39aa2932de55c336b52bc4c3003d5ee5d79..26031bc780037858f2657e4a383ebe0a5c5f1e88 100644 (file)
@@ -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
 --
index 2f5d0e00f3dcb61870c0f775824f32b34d9b5dc1..48bea8af5f8cda235b147400f172a04b2cb3f99f 100644 (file)
@@ -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