mirror of
https://github.com/postgres/postgres.git
synced 2025-10-18 04:29:09 +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 commit0436f6bde
by 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,21 +705,28 @@ check_agg_arguments_walker(Node *node,
|
|||||||
}
|
}
|
||||||
/* Continue and descend into subtree */
|
/* Continue and descend into subtree */
|
||||||
}
|
}
|
||||||
/* We can throw error on sight for a set-returning function */
|
|
||||||
if ((IsA(node, FuncExpr) &&((FuncExpr *) node)->funcretset) ||
|
/*
|
||||||
(IsA(node, OpExpr) &&((OpExpr *) node)->opretset))
|
* SRFs and window functions can be rejected immediately, unless we are
|
||||||
ereport(ERROR,
|
* within a sub-select within the aggregate's arguments; in that case
|
||||||
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
|
* they're OK.
|
||||||
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."),
|
if (context->sublevels_up == 0)
|
||||||
parser_errposition(context->pstate, exprLocation(node))));
|
{
|
||||||
/* We can throw error on sight for a window function */
|
if ((IsA(node, FuncExpr) &&((FuncExpr *) node)->funcretset) ||
|
||||||
if (IsA(node, WindowFunc))
|
(IsA(node, OpExpr) &&((OpExpr *) node)->opretset))
|
||||||
ereport(ERROR,
|
ereport(ERROR,
|
||||||
(errcode(ERRCODE_GROUPING_ERROR),
|
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
|
||||||
errmsg("aggregate function calls cannot contain window function calls"),
|
errmsg("aggregate function calls cannot contain set-returning function calls"),
|
||||||
parser_errposition(context->pstate,
|
errhint("You might be able to move the set-returning function into a LATERAL FROM item."),
|
||||||
((WindowFunc *) node)->location)));
|
parser_errposition(context->pstate, exprLocation(node))));
|
||||||
|
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))
|
if (IsA(node, Query))
|
||||||
{
|
{
|
||||||
/* Recurse into subselects */
|
/* 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;
|
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.
|
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
|
-- SRFs are not allowed in window function arguments, either
|
||||||
SELECT min(generate_series(1, 3)) OVER() FROM few;
|
SELECT min(generate_series(1, 3)) OVER() FROM few;
|
||||||
ERROR: window function calls cannot contain set-returning function calls
|
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
|
-- SRFs are not allowed in aggregate arguments
|
||||||
SELECT min(generate_series(1, 3)) FROM few;
|
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
|
-- SRFs are not allowed in window function arguments, either
|
||||||
SELECT min(generate_series(1, 3)) OVER() FROM few;
|
SELECT min(generate_series(1, 3)) OVER() FROM few;
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user