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,