95 foreach(lc, targetList)
103 if (attno >= resultDesc->
natts)
105 (
errcode(ERRCODE_DATATYPE_MISMATCH),
106 errmsg(
"table row type and query-specified row type do not match"),
107 errdetail(
"Query has too many columns.")));
111 if (!attr->attisdropped)
116 (
errcode(ERRCODE_DATATYPE_MISMATCH),
117 errmsg(
"table row type and query-specified row type do not match"),
118 errdetail(
"Table has type %s at ordinal position %d, but query expects %s.",
133 (
errcode(ERRCODE_DATATYPE_MISMATCH),
134 errmsg(
"table row type and query-specified row type do not match"),
135 errdetail(
"Query provides a value for a dropped column at ordinal position %d.",
139 if (attno != resultDesc->
natts)
141 (
errcode(ERRCODE_DATATYPE_MISMATCH),
142 errmsg(
"table row type and query-specified row type do not match"),
143 errdetail(
"Query has too few columns.")));
216 (
errcode(ERRCODE_T_R_SERIALIZATION_FAILURE),
217 errmsg(
"could not serialize access due to concurrent update")));
237 elog(
ERROR,
"failed to fetch conflicting tuple for ON CONFLICT");
252 int natts = tupdesc->
natts;
272 for (
int i = 0;
i < natts;
i++)
274 if (
TupleDescAttr(tupdesc,
i)->attgenerated == ATTRIBUTE_GENERATED_STORED)
295 elog(
ERROR,
"no generation expression found for column number %d of table \"%s\"",
315 values =
palloc(
sizeof(*values) * natts);
316 nulls =
palloc(
sizeof(*nulls) * natts);
319 memcpy(nulls, slot->
tts_isnull,
sizeof(*nulls) * natts);
321 for (
int i = 0;
i < natts;
i++)
325 if (attr->attgenerated == ATTRIBUTE_GENERATED_STORED &&
342 val =
datumCopy(val, attr->attbyval, attr->attlen);
355 memcpy(slot->
tts_values, values,
sizeof(*values) * natts);
356 memcpy(slot->
tts_isnull, nulls,
sizeof(*nulls) * natts);
404 resultRelInfo = partRelInfo;
510 if (resultRelationDesc->
rd_rel->relispartition &&
522 List *arbiterIndexes;
539 specConflict =
false;
541 &conflictTid, arbiterIndexes))
555 &conflictTid, planSlot, slot,
556 estate, canSetTag, &returning))
602 slot, estate,
false,
true,
608 specToken, !specConflict);
670 ar_insert_trig_tcs = NULL;
731 bool processReturning,
744 *tupleDeleted =
false;
753 tupleid, oldtuple, epqreturnslot);
847 (
errcode(ERRCODE_TRIGGERED_DATA_CHANGE_VIOLATION),
848 errmsg(
"tuple to be deleted was already modified by an operation triggered by the current command"),
849 errhint(
"Consider using an AFTER trigger instead of a BEFORE trigger to propagate changes to other rows.")));
864 (
errcode(ERRCODE_T_R_SERIALIZATION_FAILURE),
865 errmsg(
"could not serialize access due to concurrent update")));
900 *epqreturnslot = epqslot;
921 (
errcode(ERRCODE_TRIGGERED_DATA_CHANGE_VIOLATION),
922 errmsg(
"tuple to be deleted was already modified by an operation triggered by the current command"),
923 errhint(
"Consider using an AFTER trigger instead of a BEFORE trigger to propagate changes to other rows.")));
942 elog(
ERROR,
"unexpected table_tuple_lock status: %u",
954 (
errcode(ERRCODE_T_R_SERIALIZATION_FAILURE),
955 errmsg(
"could not serialize access due to concurrent delete")));
960 elog(
ERROR,
"unrecognized table_tuple_delete status: %u",
980 *tupleDeleted =
true;
1003 ar_delete_trig_tcs = NULL;
1008 ar_delete_trig_tcs);
1027 if (oldtuple != NULL)
1035 elog(
ERROR,
"failed to fetch deleted tuple for DELETE RETURNING");
1077 EPQState *epqstate,
bool canSetTag,
1087 *inserted_tuple = NULL;
1097 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
1098 errmsg(
"invalid ON UPDATE specification"),
1099 errdetail(
"The result tuple would appear in a different partition than the original tuple.")));
1113 ExecDelete(mtstate, resultRelInfo, tupleid, oldtuple, planSlot,
1118 &tuple_deleted, &epqslot);
1162 if (tupconv_map != NULL)
1169 planSlot, estate, canSetTag);
1224 elog(
ERROR,
"cannot UPDATE during bootstrap");
1233 tupleid, oldtuple, slot))
1276 bool partition_constraint_failed;
1277 bool update_indexes;
1314 partition_constraint_failed =
1315 resultRelationDesc->
rd_rel->relispartition &&
1318 if (!partition_constraint_failed &&
1326 resultRelInfo, slot, estate);
1333 if (partition_constraint_failed)
1347 oldtuple, slot, planSlot,
1348 epqstate, canSetTag,
1349 &retry_slot, &inserted_tuple);
1356 return inserted_tuple;
1382 &tmfd, &lockmode, &update_indexes);
1413 (
errcode(ERRCODE_TRIGGERED_DATA_CHANGE_VIOLATION),
1414 errmsg(
"tuple to be updated was already modified by an operation triggered by the current command"),
1415 errhint(
"Consider using an AFTER trigger instead of a BEFORE trigger to propagate changes to other rows.")));
1430 (
errcode(ERRCODE_T_R_SERIALIZATION_FAILURE),
1431 errmsg(
"could not serialize access due to concurrent update")));
1482 (
errcode(ERRCODE_TRIGGERED_DATA_CHANGE_VIOLATION),
1483 errmsg(
"tuple to be updated was already modified by an operation triggered by the current command"),
1484 errhint(
"Consider using an AFTER trigger instead of a BEFORE trigger to propagate changes to other rows.")));
1489 elog(
ERROR,
"unexpected table_tuple_lock status: %u",
1500 (
errcode(ERRCODE_T_R_SERIALIZATION_FAILURE),
1501 errmsg(
"could not serialize access due to concurrent delete")));
1506 elog(
ERROR,
"unrecognized table_tuple_update status: %u",
1514 slot, estate,
true,
false,
1627 (
errcode(ERRCODE_CARDINALITY_VIOLATION),
1628 errmsg(
"ON CONFLICT DO UPDATE command cannot affect row a second time"),
1629 errhint(
"Ensure that no rows proposed for insertion within the same command have duplicate constrained values.")));
1632 elog(
ERROR,
"attempted to lock invisible tuple");
1642 elog(
ERROR,
"unexpected self-updated tuple");
1648 (
errcode(ERRCODE_T_R_SERIALIZATION_FAILURE),
1649 errmsg(
"could not serialize access due to concurrent update")));
1672 (
errcode(ERRCODE_T_R_SERIALIZATION_FAILURE),
1673 errmsg(
"could not serialize access due to concurrent delete")));
1681 elog(
ERROR,
"unrecognized table_tuple_lock status: %u", test);
1712 if (!
ExecQual(onConflictSetWhere, econtext))
1754 *returning =
ExecUpdate(mtstate, resultRelInfo, conflictTid, NULL,
1894 bool has_before_insert_row_trig;
1896 has_before_insert_row_trig = (partrel->
ri_TrigDesc &&
1900 !has_before_insert_row_trig ? slot : NULL;
1914 *partRelInfo = partrel;
1953 elog(
ERROR,
"ModifyTable should not be called during EvalPlanQual");
2052 if (junkfilter != NULL)
2064 if (relkind == RELKIND_RELATION || relkind == RELKIND_MATVIEW)
2074 tuple_ctid = *tupleid;
2075 tupleid = &tuple_ctid;
2110 oldtuple = &oldtupdata;
2113 Assert(relkind == RELKIND_FOREIGN_TABLE);
2126 slot =
ExecInsert(node, resultRelInfo, slot, planSlot,
2130 slot =
ExecUpdate(node, resultRelInfo, tupleid, oldtuple, slot,
2135 slot =
ExecDelete(node, resultRelInfo, tupleid, oldtuple,
2297 update_tuple_routing_needed =
true;
2330 if (update_tuple_routing_needed ||
2347 if (rel->
rd_rel->relkind != RELKIND_PARTITIONED_TABLE)
2348 update_tuple_routing_needed =
false;
2354 if (rel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE &&
2355 (operation ==
CMD_INSERT || update_tuple_routing_needed))
2364 if (update_tuple_routing_needed)
2377 foreach(ll, wcoList)
2383 wcoExprs =
lappend(wcoExprs, wcoExpr);
2522 for (i = 0; i < nplans; i++)
2555 bool junk_filter_needed =
false;
2566 junk_filter_needed =
true;
2573 junk_filter_needed =
true;
2580 if (junk_filter_needed)
2583 for (i = 0; i < nplans; i++)
2617 if (relkind == RELKIND_RELATION ||
2618 relkind == RELKIND_MATVIEW ||
2619 relkind == RELKIND_PARTITIONED_TABLE)
2623 elog(
ERROR,
"could not find junk ctid column");
2625 else if (relkind == RELKIND_FOREIGN_TABLE)
2637 elog(
ERROR,
"could not find junk wholerow column");
2738 elog(
ERROR,
"ExecReScanModifyTable is not implemented");
TupleTableSlot * table_slot_create(Relation relation, List **reglist)
ExecForeignDelete_function ExecForeignDelete
static TupleTableSlot * ExecCopySlot(TupleTableSlot *dstslot, TupleTableSlot *srcslot)
JunkFilter * ri_junkFilter
struct TransitionCaptureState * mt_oc_transition_capture
bool tcs_update_old_table
bool ExecIRDeleteTriggers(EState *estate, ResultRelInfo *relinfo, HeapTuple trigtuple)
#define IsA(nodeptr, _type_)
Bitmapset * fdwDirectModifyPlans
void SpeculativeInsertionLockRelease(TransactionId xid)
static bool ExecOnConflictUpdate(ModifyTableState *mtstate, ResultRelInfo *resultRelInfo, ItemPointer conflictTid, TupleTableSlot *planSlot, TupleTableSlot *excludedSlot, EState *estate, bool canSetTag, TupleTableSlot **returning)
int errhint(const char *fmt,...)
void ExecARInsertTriggers(EState *estate, ResultRelInfo *relinfo, TupleTableSlot *slot, List *recheckIndexes, TransitionCaptureState *transition_capture)
void ExecWithCheckOptions(WCOKind kind, ResultRelInfo *resultRelInfo, TupleTableSlot *slot, EState *estate)
#define forboth(cell1, list1, cell2, list2)
TupleTableSlot * ExecInitExtraTupleSlot(EState *estate, TupleDesc tupledesc, const TupleTableSlotOps *tts_ops)
void ExecBSDeleteTriggers(EState *estate, ResultRelInfo *relinfo)
TupleTableSlot * ExecGetReturningSlot(EState *estate, ResultRelInfo *relInfo)
void ExecReScanModifyTable(ModifyTableState *node)
static TupleTableSlot * ExecClearTuple(TupleTableSlot *slot)
#define ResetPerTupleExprContext(estate)
struct PartitionTupleRouting * mt_partition_tuple_routing
TupleTableSlot * ExecStoreAllNullTuple(TupleTableSlot *slot)
#define RelationGetDescr(relation)
bool TransactionIdIsCurrentTransactionId(TransactionId xid)
List * withCheckOptionLists
#define castNode(_type_, nodeptr)
void ExecEndNode(PlanState *node)
void ExecInitResultRelation(EState *estate, ResultRelInfo *resultRelInfo, Index rti)
ResultRelInfo * resultRelInfo
AttrNumber ExecFindJunkAttribute(JunkFilter *junkfilter, const char *attrName)
#define TupleDescAttr(tupdesc, i)
ExecForeignInsert_function ExecForeignInsert
Relation ri_PartitionRoot
ExprContext * ps_ExprContext
TupleTableSlot ** mt_scans
const TupleTableSlotOps * table_slot_callbacks(Relation relation)
static void fireBSTriggers(ModifyTableState *node)
const TupleTableSlotOps TTSOpsVirtual
void ExecConstraints(ResultRelInfo *resultRelInfo, TupleTableSlot *slot, EState *estate)
static MemoryContext MemoryContextSwitchTo(MemoryContext context)
#define IsolationUsesXactSnapshot()
TupleConversionMap * ri_ChildToRootMap
JunkFilter * ExecInitJunkFilterInsertion(List *targetList, TupleDesc cleanTupType, TupleTableSlot *slot)
Snapshot es_crosscheck_snapshot
const TupleTableSlotOps *const tts_ops
int errcode(int sqlerrcode)
uint32 SpeculativeInsertionLockAcquire(TransactionId xid)
void ExecComputeStoredGenerated(ResultRelInfo *resultRelInfo, EState *estate, TupleTableSlot *slot, CmdType cmdtype)
ResultRelInfo * rootResultRelInfo
#define FirstLowInvalidHeapAttributeNumber
void EvalPlanQualSetPlan(EPQState *epqstate, Plan *subplan, List *auxrowmarks)
static void ExecCheckTupleVisible(EState *estate, Relation rel, TupleTableSlot *slot)
static bool ExecQual(ExprState *state, ExprContext *econtext)
List * ExecInsertIndexTuples(ResultRelInfo *resultRelInfo, TupleTableSlot *slot, EState *estate, bool update, bool noDupErr, bool *specConflict, List *arbiterIndexes)
ExprState * ExecPrepareExpr(Expr *node, EState *estate)
static void table_tuple_complete_speculative(Relation rel, TupleTableSlot *slot, uint32 specToken, bool succeeded)
#define DatumGetHeapTupleHeader(X)
void ExecFreeExprContext(PlanState *planstate)
void ExecForceStoreHeapTuple(HeapTuple tuple, TupleTableSlot *slot, bool shouldFree)
static void table_tuple_insert(Relation rel, TupleTableSlot *slot, CommandId cid, int options, struct BulkInsertStateData *bistate)
struct EPQState * es_epq_active
ExprState * ExecInitQual(List *qual, PlanState *parent)
void ExecASDeleteTriggers(EState *estate, ResultRelInfo *relinfo, TransitionCaptureState *transition_capture)
void ExecOpenIndices(ResultRelInfo *resultRelInfo, bool speculative)
void EvalPlanQualEnd(EPQState *epqstate)
ItemPointerData * ItemPointer
List * ri_WithCheckOptionExprs
bool ExecBRDeleteTriggers(EState *estate, EPQState *epqstate, ResultRelInfo *relinfo, ItemPointer tupleid, HeapTuple fdw_trigtuple, TupleTableSlot **epqslot)
void ExecARDeleteTriggers(EState *estate, ResultRelInfo *relinfo, ItemPointer tupleid, HeapTuple fdw_trigtuple, TransitionCaptureState *transition_capture)
TupleTableSlot * oc_Existing
bool trig_insert_instead_row
#define GetPerTupleExprContext(estate)
bool has_generated_stored
Bitmapset * extraUpdatedCols
TupleTableSlot * ps_ResultTupleSlot
MemoryContext es_query_cxt
ProjectionInfo * oc_ProjInfo
void ExecCleanupTupleRouting(ModifyTableState *mtstate, PartitionTupleRouting *proute)
static void * list_nth(const List *list, int n)
bool ExecBRInsertTriggers(EState *estate, ResultRelInfo *relinfo, TupleTableSlot *slot)
static void ExecCheckTIDVisible(EState *estate, ResultRelInfo *relinfo, ItemPointer tid, TupleTableSlot *tempSlot)
static TM_Result table_tuple_lock(Relation rel, ItemPointer tid, Snapshot snapshot, TupleTableSlot *slot, CommandId cid, LockTupleMode mode, LockWaitPolicy wait_policy, uint8 flags, TM_FailureData *tmfd)
TupleTableSlot * ri_PartitionTupleSlot
TupleTableSlot * EvalPlanQualSlot(EPQState *epqstate, Relation relation, Index rti)
static void slot_getallattrs(TupleTableSlot *slot)
bool ri_usesFdwDirectModify
static void ExecSetupTransitionCaptureState(ModifyTableState *mtstate, EState *estate)
static TupleTableSlot * ExecUpdate(ModifyTableState *mtstate, ResultRelInfo *resultRelInfo, ItemPointer tupleid, HeapTuple oldtuple, TupleTableSlot *slot, TupleTableSlot *planSlot, EPQState *epqstate, EState *estate, bool canSetTag)
void CheckValidResultRel(ResultRelInfo *resultRelInfo, CmdType operation)
#define EXEC_FLAG_BACKWARD
#define lfirst_node(type, lc)
TransactionId GetCurrentTransactionId(void)
TupleConversionMap * convert_tuples_by_name(TupleDesc indesc, TupleDesc outdesc)
void ExecBSInsertTriggers(EState *estate, ResultRelInfo *relinfo)
struct TransitionCaptureState * mt_transition_capture
void ExecDropSingleTupleTableSlot(TupleTableSlot *slot)
static Datum ExecEvalExpr(ExprState *state, ExprContext *econtext, bool *isNull)
void ExecInitResultTypeTL(PlanState *planstate)
int errdetail(const char *fmt,...)
void ExecPartitionCheckEmitError(ResultRelInfo *resultRelInfo, TupleTableSlot *slot, EState *estate)
TupleTableSlot * ecxt_innertuple
ExprState ** ri_GeneratedExprs
bool trig_update_before_row
#define RelationGetRelationName(relation)
TupleTableSlot * EvalPlanQual(EPQState *epqstate, Relation relation, Index rti, TupleTableSlot *inputslot)
ProjectionInfo * ri_projectReturning
static RangeTblEntry * exec_rt_fetch(Index rti, EState *estate)
FormData_pg_attribute * Form_pg_attribute
struct FdwRoutine * ri_FdwRoutine
ModifyTableState * ExecInitModifyTable(ModifyTable *node, EState *estate, int eflags)
static TupleTableSlot * ExecPrepareTupleRouting(ModifyTableState *mtstate, EState *estate, PartitionTupleRouting *proute, ResultRelInfo *targetRelInfo, TupleTableSlot *slot, ResultRelInfo **partRelInfo)
#define InstrCountTuples2(node, delta)
ExprState * oc_WhereClause
bool tcs_update_new_table
EndForeignModify_function EndForeignModify
#define InstrCountFiltered1(node, delta)
PartitionTupleRouting * ExecSetupPartitionTupleRouting(EState *estate, ModifyTableState *mtstate, Relation rel)
Datum datumCopy(Datum value, bool typByVal, int typLen)
TriggerDesc * ri_TrigDesc
List * lappend(List *list, void *datum)
static bool table_tuple_fetch_row_version(Relation rel, ItemPointer tid, Snapshot snapshot, TupleTableSlot *slot)
int ri_NumGeneratedNeeded
bool trig_update_instead_row
static TupleTableSlot * ExecProcessReturning(ResultRelInfo *resultRelInfo, TupleTableSlot *tupleSlot, TupleTableSlot *planSlot)
void ExecARUpdateTriggers(EState *estate, ResultRelInfo *relinfo, ItemPointer tupleid, HeapTuple fdw_trigtuple, TupleTableSlot *newslot, List *recheckIndexes, TransitionCaptureState *transition_capture)
void EvalPlanQualInit(EPQState *epqstate, EState *parentestate, Plan *subplan, List *auxrowmarks, int epqParam)
OnConflictSetState * ri_onConflict
#define AttributeNumberIsValid(attributeNumber)
static TupleTableSlot * ExecInsert(ModifyTableState *mtstate, ResultRelInfo *resultRelInfo, TupleTableSlot *slot, TupleTableSlot *planSlot, EState *estate, bool canSetTag)
static void fireASTriggers(ModifyTableState *node)
static TupleTableSlot * ExecModifyTable(PlanState *pstate)
Node * build_column_default(Relation rel, int attrno)
bool trig_insert_before_row
bool trig_delete_instead_row
void ExecASUpdateTriggers(EState *estate, ResultRelInfo *relinfo, TransitionCaptureState *transition_capture)
void * palloc0(Size size)
List * es_auxmodifytables
ExecProcNodeMtd ExecProcNode
void ExecASInsertTriggers(EState *estate, ResultRelInfo *relinfo, TransitionCaptureState *transition_capture)
TupleTableSlot * ExecFilterJunk(JunkFilter *junkfilter, TupleTableSlot *slot)
static void table_tuple_insert_speculative(Relation rel, TupleTableSlot *slot, CommandId cid, int options, struct BulkInsertStateData *bistate, uint32 specToken)
static TupleTableSlot * ExecProcNode(PlanState *node)
List * ri_WithCheckOptions
TransitionCaptureState * MakeTransitionCaptureState(TriggerDesc *trigdesc, Oid relid, CmdType cmdType)
#define ItemPointerIndicatesMovedPartitions(pointer)
static TM_Result table_tuple_delete(Relation rel, ItemPointer tid, CommandId cid, Snapshot snapshot, Snapshot crosscheck, bool wait, TM_FailureData *tmfd, bool changingPart)
static void ExecMaterializeSlot(TupleTableSlot *slot)
#define ereport(elevel,...)
TupleTableSlot * oc_ProjSlot
ExecForeignUpdate_function ExecForeignUpdate
List * lcons(void *datum, List *list)
TupleTableSlot * ecxt_outertuple
static void ExecCheckPlanOutput(Relation resultRel, List *targetList)
TupleTableSlot * execute_attr_map_slot(AttrMap *attrMap, TupleTableSlot *in_slot, TupleTableSlot *out_slot)
#define Assert(condition)
static bool table_tuple_satisfies_snapshot(Relation rel, TupleTableSlot *slot, Snapshot snapshot)
LockTupleMode ExecUpdateLockMode(EState *estate, ResultRelInfo *relinfo)
bool ExecIRInsertTriggers(EState *estate, ResultRelInfo *relinfo, TupleTableSlot *slot)
OnConflictAction onConflictAction
void ExecAssignExprContext(EState *estate, PlanState *planstate)
Oid exprType(const Node *expr)
static int list_length(const List *l)
TupleDesc ExecTypeFromTL(List *targetList)
TupleTableSlot * ecxt_scantuple
void ExecInitResultTupleSlotTL(PlanState *planstate, const TupleTableSlotOps *tts_ops)
#define TUPLE_LOCK_FLAG_FIND_LAST_VERSION
TupleTableSlot * mt_root_tuple_slot
TupleDesc ExecGetResultType(PlanState *planstate)
#define GetPerTupleMemoryContext(estate)
#define DatumGetPointer(X)
static Datum values[MAXATTR]
#define IsBootstrapProcessingMode()
#define DatumGetTransactionId(X)
void ExecBSUpdateTriggers(EState *estate, ResultRelInfo *relinfo)
#define ItemPointerSetInvalid(pointer)
bool ExecCheckIndexConstraints(ResultRelInfo *resultRelInfo, TupleTableSlot *slot, EState *estate, ItemPointer conflictTid, List *arbiterIndexes)
TupleConversionMap * ri_RootToPartitionMap
ProjectionInfo * ExecBuildProjectionInfo(List *targetList, ExprContext *econtext, TupleTableSlot *slot, PlanState *parent, TupleDesc inputDesc)
int errmsg(const char *fmt,...)
bool ExecIRUpdateTriggers(EState *estate, ResultRelInfo *relinfo, HeapTuple trigtuple, TupleTableSlot *newslot)
Datum ExecGetJunkAttribute(TupleTableSlot *slot, AttrNumber attno, bool *isNull)
void list_free(List *list)
bool ExecBRUpdateTriggers(EState *estate, EPQState *epqstate, ResultRelInfo *relinfo, ItemPointer tupleid, HeapTuple fdw_trigtuple, TupleTableSlot *newslot)
bool ExecPartitionCheck(ResultRelInfo *resultRelInfo, TupleTableSlot *slot, EState *estate, bool emitError)
#define CHECK_FOR_INTERRUPTS()
static TupleTableSlot * ExecDelete(ModifyTableState *mtstate, ResultRelInfo *resultRelInfo, ItemPointer tupleid, HeapTuple oldtuple, TupleTableSlot *planSlot, EPQState *epqstate, EState *estate, bool processReturning, bool canSetTag, bool changingPart, bool *tupleDeleted, TupleTableSlot **epqreturnslot)
ResultRelInfo * ExecFindPartition(ModifyTableState *mtstate, ResultRelInfo *rootResultRelInfo, PartitionTupleRouting *proute, TupleTableSlot *slot, EState *estate)
static TM_Result table_tuple_update(Relation rel, ItemPointer otid, TupleTableSlot *slot, CommandId cid, Snapshot snapshot, Snapshot crosscheck, bool wait, TM_FailureData *tmfd, LockTupleMode *lockmode, bool *update_indexes)
static Datum slot_getsysattr(TupleTableSlot *slot, int attnum, bool *isnull)
ExprContext * pi_exprContext
BeginForeignModify_function BeginForeignModify
#define MinTransactionIdAttributeNumber
PlanState * ExecInitNode(Plan *node, EState *estate, int eflags)
bool bms_is_member(int x, const Bitmapset *a)
#define EXEC_FLAG_EXPLAIN_ONLY
#define RelationGetRelid(relation)
static bool ExecCrossPartitionUpdate(ModifyTableState *mtstate, ResultRelInfo *resultRelInfo, ItemPointer tupleid, HeapTuple oldtuple, TupleTableSlot *slot, TupleTableSlot *planSlot, EPQState *epqstate, bool canSetTag, TupleTableSlot **retry_slot, TupleTableSlot **inserted_tuple)
JunkFilter * ExecInitJunkFilter(List *targetList, TupleTableSlot *slot)
void EvalPlanQualBegin(EPQState *epqstate)
List * ri_onConflictArbiterIndexes
void ExecEndModifyTable(ModifyTableState *node)
RelationPtr ri_IndexRelationDescs
ExecAuxRowMark * ExecBuildAuxRowMark(ExecRowMark *erm, List *targetlist)
static TupleTableSlot * ExecProject(ProjectionInfo *projInfo)
#define ResetExprContext(econtext)
TupleTableSlot * ExecStoreVirtualTuple(TupleTableSlot *slot)
#define EvalPlanQualSetSlot(epqstate, slot)
bool trig_delete_before_row
ExecRowMark * ExecFindRowMark(EState *estate, Index rti, bool missing_ok)
#define HeapTupleHeaderGetDatumLength(tup)
TupleTableSlot * tcs_original_insert_tuple