diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2017-06-27 17:51:11 -0400 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2017-06-27 17:51:11 -0400 |
commit | 9c7dc89282b3dac5685c39d4d792b02ca573c2d3 (patch) | |
tree | 9bb7d8b895e2836134a4a39e6aa4193e02da14a7 /src/backend/parser/parse_agg.c | |
parent | 2710ccd782d0308a3fa1ab193531183148e9b626 (diff) | |
download | postgresql-9c7dc89282b3dac5685c39d4d792b02ca573c2d3.tar.gz postgresql-9c7dc89282b3dac5685c39d4d792b02ca573c2d3.zip |
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 commit
0436f6bde by copying the logic for window functions ... but that was
broken too, and had been since commit eaccfded9.
Repair both cases in HEAD, and the window function case back to 9.3.
9.2 gets this right.
Diffstat (limited to 'src/backend/parser/parse_agg.c')
-rw-r--r-- | src/backend/parser/parse_agg.c | 37 |
1 files changed, 22 insertions, 15 deletions
diff --git a/src/backend/parser/parse_agg.c b/src/backend/parser/parse_agg.c index 613bdabd520..64111f315e3 100644 --- a/src/backend/parser/parse_agg.c +++ b/src/backend/parser/parse_agg.c @@ -705,21 +705,28 @@ check_agg_arguments_walker(Node *node, } /* 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)) - ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - 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))); + + /* + * 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, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + 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)))); + 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 */ |