mirror of
https://github.com/postgres/postgres.git
synced 2025-10-28 11:55:03 +03:00
Re-allow SRFs and window functions within sub-selects within aggregates.
check_agg_arguments_walker threw an error upon seeing a SRF or window function, but that is too aggressive: if the function is within a sub-select then it's perfectly fine. I broke the SRF case in commit0436f6bdeby copying the logic for window functions ... but that was broken too, and had been since commiteaccfded9. Repair both cases in HEAD, and the window function case back to 9.3. 9.2 gets this right.
This commit is contained in:
@@ -705,7 +705,14 @@ check_agg_arguments_walker(Node *node,
|
||||
}
|
||||
/* Continue and descend into subtree */
|
||||
}
|
||||
/* We can throw error on sight for a set-returning function */
|
||||
|
||||
/*
|
||||
* SRFs and window functions can be rejected immediately, unless we are
|
||||
* within a sub-select within the aggregate's arguments; in that case
|
||||
* they're OK.
|
||||
*/
|
||||
if (context->sublevels_up == 0)
|
||||
{
|
||||
if ((IsA(node, FuncExpr) &&((FuncExpr *) node)->funcretset) ||
|
||||
(IsA(node, OpExpr) &&((OpExpr *) node)->opretset))
|
||||
ereport(ERROR,
|
||||
@@ -713,13 +720,13 @@ check_agg_arguments_walker(Node *node,
|
||||
errmsg("aggregate function calls cannot contain set-returning function calls"),
|
||||
errhint("You might be able to move the set-returning function into a LATERAL FROM item."),
|
||||
parser_errposition(context->pstate, exprLocation(node))));
|
||||
/* We can throw error on sight for a window function */
|
||||
if (IsA(node, WindowFunc))
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_GROUPING_ERROR),
|
||||
errmsg("aggregate function calls cannot contain window function calls"),
|
||||
parser_errposition(context->pstate,
|
||||
((WindowFunc *) node)->location)));
|
||||
}
|
||||
if (IsA(node, Query))
|
||||
{
|
||||
/* Recurse into subselects */
|
||||
|
||||
@@ -212,6 +212,20 @@ ERROR: aggregate function calls cannot contain set-returning function calls
|
||||
LINE 1: SELECT min(generate_series(1, 3)) FROM few;
|
||||
^
|
||||
HINT: You might be able to move the set-returning function into a LATERAL FROM item.
|
||||
-- ... unless they're within a sub-select
|
||||
SELECT sum((3 = ANY(SELECT generate_series(1,4)))::int);
|
||||
sum
|
||||
-----
|
||||
1
|
||||
(1 row)
|
||||
|
||||
SELECT sum((3 = ANY(SELECT lag(x) over(order by x)
|
||||
FROM generate_series(1,4) x))::int);
|
||||
sum
|
||||
-----
|
||||
1
|
||||
(1 row)
|
||||
|
||||
-- SRFs are not allowed in window function arguments, either
|
||||
SELECT min(generate_series(1, 3)) OVER() FROM few;
|
||||
ERROR: window function calls cannot contain set-returning function calls
|
||||
|
||||
@@ -61,6 +61,12 @@ SELECT q1, coalesce(generate_series(1,3), 0) FROM int8_tbl;
|
||||
-- SRFs are not allowed in aggregate arguments
|
||||
SELECT min(generate_series(1, 3)) FROM few;
|
||||
|
||||
-- ... unless they're within a sub-select
|
||||
SELECT sum((3 = ANY(SELECT generate_series(1,4)))::int);
|
||||
|
||||
SELECT sum((3 = ANY(SELECT lag(x) over(order by x)
|
||||
FROM generate_series(1,4) x))::int);
|
||||
|
||||
-- SRFs are not allowed in window function arguments, either
|
||||
SELECT min(generate_series(1, 3)) OVER() FROM few;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user