From bfe553fb49f00ef74021ca044794f27c13511342 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Thu, 15 Feb 2007 03:07:13 +0000 Subject: Repair oversight in 8.2 change that improved the handling of "pseudoconstant" WHERE clauses. createplan.c is now willing to stick a gating Result node almost anywhere in the plan tree, and in particular one can wind up directly underneath a MergeJoin node. This means it had better be willing to handle Mark/Restore. Fortunately, that's trivial in such cases, since we can just pass off the call to the input node (which the planner has previously ensured can handle Mark/Restore). Per report from Phil Frost. --- src/backend/executor/nodeResult.c | 36 +++++++++++++++++++++++++++++++++--- 1 file changed, 33 insertions(+), 3 deletions(-) (limited to 'src/backend/executor/nodeResult.c') diff --git a/src/backend/executor/nodeResult.c b/src/backend/executor/nodeResult.c index 9765103cbe..2d20079569 100644 --- a/src/backend/executor/nodeResult.c +++ b/src/backend/executor/nodeResult.c @@ -38,7 +38,7 @@ * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/executor/nodeResult.c,v 1.37 2007/02/02 00:07:03 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/executor/nodeResult.c,v 1.38 2007/02/15 03:07:13 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -166,6 +166,36 @@ ExecResult(ResultState *node) return NULL; } +/* ---------------------------------------------------------------- + * ExecResultMarkPos + * ---------------------------------------------------------------- + */ +void +ExecResultMarkPos(ResultState *node) +{ + PlanState *outerPlan = outerPlanState(node); + + if (outerPlan != NULL) + ExecMarkPos(outerPlan); + else + elog(DEBUG2, "Result nodes do not support mark/restore"); +} + +/* ---------------------------------------------------------------- + * ExecResultRestrPos + * ---------------------------------------------------------------- + */ +void +ExecResultRestrPos(ResultState *node) +{ + PlanState *outerPlan = outerPlanState(node); + + if (outerPlan != NULL) + ExecRestrPos(outerPlan); + else + elog(ERROR, "Result nodes do not support mark/restore"); +} + /* ---------------------------------------------------------------- * ExecInitResult * @@ -180,8 +210,8 @@ ExecInitResult(Result *node, EState *estate, int eflags) ResultState *resstate; /* check for unsupported flags */ - Assert(!(eflags & EXEC_FLAG_MARK)); - Assert(!(eflags & EXEC_FLAG_BACKWARD) || outerPlan(node) != NULL); + Assert(!(eflags & (EXEC_FLAG_MARK | EXEC_FLAG_BACKWARD)) || + outerPlan(node) != NULL); /* * create state structure -- cgit v1.2.1