diff options
Diffstat (limited to 'src/backend/executor/execUtils.c')
-rw-r--r-- | src/backend/executor/execUtils.c | 18 |
1 files changed, 16 insertions, 2 deletions
diff --git a/src/backend/executor/execUtils.c b/src/backend/executor/execUtils.c index c6ae2d4296f..5d6473dfc69 100644 --- a/src/backend/executor/execUtils.c +++ b/src/backend/executor/execUtils.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/executor/execUtils.c,v 1.168 2010/01/02 16:57:41 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/executor/execUtils.c,v 1.169 2010/01/02 17:53:56 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -1167,7 +1167,9 @@ check_exclusion_constraint(Relation heap, Relation index, IndexInfo *indexInfo, int i; bool conflict; bool found_self; + ExprContext *econtext; TupleTableSlot *existing_slot; + TupleTableSlot *save_scantuple; /* * If any of the input values are NULL, the constraint check is assumed @@ -1194,9 +1196,19 @@ check_exclusion_constraint(Relation heap, Relation index, IndexInfo *indexInfo, values[i]); } - /* Need a TupleTableSlot to put existing tuples in */ + /* + * Need a TupleTableSlot to put existing tuples in. + * + * To use FormIndexDatum, we have to make the econtext's scantuple point + * to this slot. Be sure to save and restore caller's value for + * scantuple. + */ existing_slot = MakeSingleTupleTableSlot(RelationGetDescr(heap)); + econtext = GetPerTupleExprContext(estate); + save_scantuple = econtext->ecxt_scantuple; + econtext->ecxt_scantuple = existing_slot; + /* * May have to restart scan from this point if a potential * conflict is found. @@ -1311,6 +1323,8 @@ retry: RelationGetRelationName(index)), errhint("This may be because of a non-immutable index expression."))); + econtext->ecxt_scantuple = save_scantuple; + ExecDropSingleTupleTableSlot(existing_slot); return !conflict; |