aboutsummaryrefslogtreecommitdiff
path: root/src/backend/executor/execMain.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/executor/execMain.c')
-rw-r--r--src/backend/executor/execMain.c12
1 files changed, 11 insertions, 1 deletions
diff --git a/src/backend/executor/execMain.c b/src/backend/executor/execMain.c
index 9d7bdb777c5..ebb6d8ea82c 100644
--- a/src/backend/executor/execMain.c
+++ b/src/backend/executor/execMain.c
@@ -26,7 +26,7 @@
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/executor/execMain.c,v 1.336 2009/12/09 21:57:51 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/executor/execMain.c,v 1.337 2009/12/11 18:14:43 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -1408,6 +1408,16 @@ EvalPlanQual(EState *estate, EPQState *epqstate,
slot = EvalPlanQualNext(epqstate);
/*
+ * If we got a tuple, force the slot to materialize the tuple so that
+ * it is not dependent on any local state in the EPQ query (in particular,
+ * it's highly likely that the slot contains references to any pass-by-ref
+ * datums that may be present in copyTuple). As with the next step,
+ * this is to guard against early re-use of the EPQ query.
+ */
+ if (!TupIsNull(slot))
+ (void) ExecMaterializeSlot(slot);
+
+ /*
* Clear out the test tuple. This is needed in case the EPQ query
* is re-used to test a tuple for a different relation. (Not clear
* that can really happen, but let's be safe.)