bug-17809.patch
text/x-patch
Filename: bug-17809.patch
Type: text/x-patch
Part: 0
Patch
Format: unified
| File | + | − |
|---|---|---|
| src/backend/commands/trigger.c | 3 | 2 |
| src/backend/executor/execReplication.c | 1 | 1 |
| src/backend/executor/nodeModifyTable.c | 8 | 4 |
| src/include/commands/trigger.h | 2 | 1 |
| src/include/executor/executor.h | 2 | 1 |
diff --git a/src/backend/commands/trigger.c b/src/backend/commands/trigger.c
new file mode 100644
index d7abde1..fb4b918
--- a/src/backend/commands/trigger.c
+++ b/src/backend/commands/trigger.c
@@ -2938,7 +2938,8 @@ ExecBRUpdateTriggers(EState *estate, EPQ
ItemPointer tupleid,
HeapTuple fdw_trigtuple,
TupleTableSlot *newslot,
- TM_FailureData *tmfd)
+ TM_FailureData *tmfd,
+ MergeActionState *relaction)
{
TriggerDesc *trigdesc = relinfo->ri_TrigDesc;
TupleTableSlot *oldslot = ExecGetTriggerOldSlot(estate, relinfo);
@@ -2983,7 +2984,7 @@ ExecBRUpdateTriggers(EState *estate, EPQ
TupleTableSlot *epqslot_clean;
epqslot_clean = ExecGetUpdateNewTuple(relinfo, epqslot_candidate,
- oldslot);
+ oldslot, relaction);
if (newslot != epqslot_clean)
ExecCopySlot(newslot, epqslot_clean);
diff --git a/src/backend/executor/execReplication.c b/src/backend/executor/execReplication.c
new file mode 100644
index c484f5c..afc946b
--- a/src/backend/executor/execReplication.c
+++ b/src/backend/executor/execReplication.c
@@ -486,7 +486,7 @@ ExecSimpleRelationUpdate(ResultRelInfo *
resultRelInfo->ri_TrigDesc->trig_update_before_row)
{
if (!ExecBRUpdateTriggers(estate, epqstate, resultRelInfo,
- tid, NULL, slot, NULL))
+ tid, NULL, slot, NULL, NULL))
skip_tuple = true; /* "do nothing" */
}
diff --git a/src/backend/executor/nodeModifyTable.c b/src/backend/executor/nodeModifyTable.c
new file mode 100644
index 6f0543a..5852bee
--- a/src/backend/executor/nodeModifyTable.c
+++ b/src/backend/executor/nodeModifyTable.c
@@ -708,14 +708,18 @@ ExecGetInsertNewTuple(ResultRelInfo *rel
TupleTableSlot *
ExecGetUpdateNewTuple(ResultRelInfo *relinfo,
TupleTableSlot *planSlot,
- TupleTableSlot *oldSlot)
+ TupleTableSlot *oldSlot,
+ MergeActionState *relaction)
{
/* Use a few extra Asserts to protect against outside callers */
Assert(relinfo->ri_projectNewInfoValid);
Assert(planSlot != NULL && !TTS_EMPTY(planSlot));
Assert(oldSlot != NULL && !TTS_EMPTY(oldSlot));
- return internalGetUpdateNewTuple(relinfo, planSlot, oldSlot, NULL);
+ if (relaction)
+ return mergeGetUpdateNewTuple(relinfo, planSlot, oldSlot, relaction);
+ else
+ return internalGetUpdateNewTuple(relinfo, planSlot, oldSlot, NULL);
}
/*
@@ -1903,7 +1907,7 @@ ExecUpdatePrologue(ModifyTableContext *c
return ExecBRUpdateTriggers(context->estate, context->epqstate,
resultRelInfo, tupleid, oldtuple, slot,
- &context->tmfd);
+ &context->tmfd, context->relaction);
}
return true;
@@ -2395,7 +2399,7 @@ redo_act:
oldSlot))
elog(ERROR, "failed to fetch tuple being updated");
slot = ExecGetUpdateNewTuple(resultRelInfo,
- epqslot, oldSlot);
+ epqslot, oldSlot, NULL);
goto redo_act;
case TM_Deleted:
diff --git a/src/include/commands/trigger.h b/src/include/commands/trigger.h
new file mode 100644
index 39d764d..52b4ae3
--- a/src/include/commands/trigger.h
+++ b/src/include/commands/trigger.h
@@ -232,7 +232,8 @@ extern bool ExecBRUpdateTriggers(EState
ItemPointer tupleid,
HeapTuple fdw_trigtuple,
TupleTableSlot *newslot,
- TM_FailureData *tmfd);
+ TM_FailureData *tmfd,
+ MergeActionState *relaction);
extern void ExecARUpdateTriggers(EState *estate,
ResultRelInfo *relinfo,
ResultRelInfo *src_partinfo,
diff --git a/src/include/executor/executor.h b/src/include/executor/executor.h
new file mode 100644
index e7e25c0..17e57ba
--- a/src/include/executor/executor.h
+++ b/src/include/executor/executor.h
@@ -659,7 +659,8 @@ extern void CheckSubscriptionRelkind(cha
*/
extern TupleTableSlot *ExecGetUpdateNewTuple(ResultRelInfo *relinfo,
TupleTableSlot *planSlot,
- TupleTableSlot *oldSlot);
+ TupleTableSlot *oldSlot,
+ MergeActionState *relaction);
extern ResultRelInfo *ExecLookupResultRelByOid(ModifyTableState *node,
Oid resultoid,
bool missing_ok,