From: Peter Eisentraut Date: Sat, 27 Jun 2026 07:07:07 +0000 (+0200) Subject: Move FOR PORTION OF volatile check into planner X-Git-Tag: REL_19_BETA2~113 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=a272a58b94249879c3f7e170a5ebfaeec940d411;p=thirdparty%2Fpostgresql.git Move FOR PORTION OF volatile check into planner This needs to be wary of the function volatility changing after we check it. We cannot enforce this when checking at parse time, so move it later, into the planner. Author: Paul A. Jungwirth Reported-by: Tom Lane Reviewed-by: jian he Discussion: https://www.postgresql.org/message-id/flat/CA%2BrenyUte0_UJsJiDJQi82oaBsMJn%3Dcct0Wn%3DvOqXtuDn%3DYYJA%40mail.gmail.com --- diff --git a/src/backend/optimizer/plan/planner.c b/src/backend/optimizer/plan/planner.c index f4689e7c9f8..846bd7c1fbe 100644 --- a/src/backend/optimizer/plan/planner.c +++ b/src/backend/optimizer/plan/planner.c @@ -1081,6 +1081,18 @@ subquery_planner(PlannerGlobal *glob, Query *parse, char *plan_name, /* exclRelTlist contains only Vars, so no preprocessing needed */ } + if (parse->forPortionOf) + { + parse->forPortionOf->targetRange = + preprocess_expression(root, + parse->forPortionOf->targetRange, + EXPRKIND_TARGET); + if (contain_volatile_functions(parse->forPortionOf->targetRange)) + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("FOR PORTION OF bounds cannot contain volatile functions"))); + } + foreach(l, parse->mergeActionList) { MergeAction *action = (MergeAction *) lfirst(l); diff --git a/src/backend/parser/analyze.c b/src/backend/parser/analyze.c index 93fa66ae57c..76758adefb6 100644 --- a/src/backend/parser/analyze.c +++ b/src/backend/parser/analyze.c @@ -1489,9 +1489,6 @@ transformForPortionOfClause(ParseState *pstate, args, InvalidOid, InvalidOid, COERCE_EXPLICIT_CALL); } - if (contain_volatile_functions_after_planning((Expr *) result->targetRange)) - ereport(ERROR, - (errmsg("FOR PORTION OF bounds cannot contain volatile functions"))); /* * Build overlapsExpr to use as an extra qual. This means we only hit rows