From 32e42531f79b36481de0d5d7d46a9ff49fbdca28 Mon Sep 17 00:00:00 2001 From: jian he Date: Sun, 10 May 2026 11:54:30 +0800 Subject: [PATCH v14 1/2] export ExecInsert The ExecInsert function encapsulates core logic for the insertion pipeline, including partition routing, BEFORE ROW triggers, INSTEAD OF triggers, and AFTER ROW triggers and others. reference: https://postgr.es/m/CACJufxHi53OpGYPAe6SdCb4m=-+H8L+7LDbUWvTiJp=V4YYEqA@mail.gmail.com reference: https://postgr.es/m/752672.1699474336%40sss.pgh.pa.us discussion: https://postgr.es/m/CACJufxH_OJpVra=0c4ow8fbxHj7heMcVaTNEPa5vAurSeNA-6Q@mail.gmail.com commitfest entry: https://commitfest.postgresql.org/patch/4817 --- src/backend/executor/nodeModifyTable.c | 40 +---------------------- src/include/executor/nodeModifyTable.h | 45 ++++++++++++++++++++++++++ 2 files changed, 46 insertions(+), 39 deletions(-) diff --git a/src/backend/executor/nodeModifyTable.c b/src/backend/executor/nodeModifyTable.c index b9781eb3b95..518c3d07b13 100644 --- a/src/backend/executor/nodeModifyTable.c +++ b/src/backend/executor/nodeModifyTable.c @@ -84,44 +84,6 @@ typedef struct MTTargetRelLookup int relationIndex; /* rel's index in resultRelInfo[] array */ } MTTargetRelLookup; -/* - * Context struct for a ModifyTable operation, containing basic execution - * state and some output variables populated by ExecUpdateAct() and - * ExecDeleteAct() to report the result of their actions to callers. - */ -typedef struct ModifyTableContext -{ - /* Operation state */ - ModifyTableState *mtstate; - EPQState *epqstate; - EState *estate; - - /* - * Slot containing tuple obtained from ModifyTable's subplan. Used to - * access "junk" columns that are not going to be stored. - */ - TupleTableSlot *planSlot; - - /* - * Information about the changes that were made concurrently to a tuple - * being updated or deleted - */ - TM_FailureData tmfd; - - /* - * The tuple deleted when doing a cross-partition UPDATE with a RETURNING - * clause that refers to OLD columns (converted to the root's tuple - * descriptor). - */ - TupleTableSlot *cpDeletedSlot; - - /* - * The tuple projected by the INSERT's RETURNING clause, when doing a - * cross-partition UPDATE - */ - TupleTableSlot *cpUpdateReturningSlot; -} ModifyTableContext; - /* * Context struct containing output data specific to UPDATE operations. */ @@ -870,7 +832,7 @@ ExecGetUpdateNewTuple(ResultRelInfo *relinfo, * save the previous value to avoid losing track of it. * ---------------------------------------------------------------- */ -static TupleTableSlot * +TupleTableSlot * ExecInsert(ModifyTableContext *context, ResultRelInfo *resultRelInfo, TupleTableSlot *slot, diff --git a/src/include/executor/nodeModifyTable.h b/src/include/executor/nodeModifyTable.h index f6070e1cdf3..250bd64ad15 100644 --- a/src/include/executor/nodeModifyTable.h +++ b/src/include/executor/nodeModifyTable.h @@ -13,8 +13,47 @@ #ifndef NODEMODIFYTABLE_H #define NODEMODIFYTABLE_H +#include "access/tableam.h" #include "nodes/execnodes.h" +/* + * Context struct for a ModifyTable operation, containing basic execution + * state and some output variables populated by ExecUpdateAct() and + * ExecDeleteAct() to report the result of their actions to callers. + */ +typedef struct ModifyTableContext +{ + /* Operation state */ + ModifyTableState *mtstate; + EPQState *epqstate; + EState *estate; + + /* + * Slot containing tuple obtained from ModifyTable's subplan. Used to + * access "junk" columns that are not going to be stored. + */ + TupleTableSlot *planSlot; + + /* + * Information about the changes that were made concurrently to a tuple + * being updated or deleted + */ + TM_FailureData tmfd; + + /* + * The tuple deleted when doing a cross-partition UPDATE with a RETURNING + * clause that refers to OLD columns (converted to the root's tuple + * descriptor). + */ + TupleTableSlot *cpDeletedSlot; + + /* + * The tuple projected by the INSERT's RETURNING clause, when doing a + * cross-partition UPDATE + */ + TupleTableSlot *cpUpdateReturningSlot; +} ModifyTableContext; + extern void ExecInitGenerated(ResultRelInfo *resultRelInfo, EState *estate, CmdType cmdtype); @@ -24,6 +63,12 @@ extern void ExecComputeStoredGenerated(ResultRelInfo *resultRelInfo, CmdType cmdtype); extern ModifyTableState *ExecInitModifyTable(ModifyTable *node, EState *estate, int eflags); +extern TupleTableSlot *ExecInsert(ModifyTableContext *context, + ResultRelInfo *resultRelInfo, + TupleTableSlot *slot, + bool canSetTag, + TupleTableSlot **inserted_tuple, + ResultRelInfo **insert_destrel); extern void ExecEndModifyTable(ModifyTableState *node); extern void ExecReScanModifyTable(ModifyTableState *node); -- 2.34.1