From a227e7e72d917726085001027c350d2fda2ad3c4 Mon Sep 17 00:00:00 2001 From: "Andrey V. Lepikhov" Date: Tue, 27 Feb 2024 11:00:23 +0700 Subject: [PATCH] Force eval_const_expressions_mutator to return a copy of the node. In some situations, when SubPlan or AlternativeSubPlan nodes are on the top of the expression tree, this routine returns the same node, which could baffle users who, remembering the mutator convention, wanted to free the evaluation result immediately. Author: a.rybakina. --- src/backend/optimizer/util/clauses.c | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/src/backend/optimizer/util/clauses.c b/src/backend/optimizer/util/clauses.c index edc25d712e..f09c6c6420 100644 --- a/src/backend/optimizer/util/clauses.c +++ b/src/backend/optimizer/util/clauses.c @@ -2907,15 +2907,28 @@ eval_const_expressions_mutator(Node *node, } case T_SubPlan: + { + SubPlan *subplan = makeNode(SubPlan); + + memcpy(subplan, node, sizeof(SubPlan)); + + /* + * Return a SubPlan unchanged. If the subplan had been uncorrelated + * it already have been converted to an InitPlan. + */ + return (Node *) subplan; + } case T_AlternativeSubPlan: + { + AlternativeSubPlan *subplan = makeNode(AlternativeSubPlan); + + memcpy(subplan, node, sizeof(AlternativeSubPlan)); /* * Return a SubPlan unchanged --- too late to do anything with it. - * - * XXX should we ereport() here instead? Probably this routine - * should never be invoked after SubPlan creation. */ - return node; + return (Node *) subplan; + } case T_RelabelType: { RelabelType *relabel = (RelabelType *) node; -- 2.43.2