216 foreach(
lc, targetList)
223 if (attno >= resultDesc->
natts)
226 errmsg(
"table row type and query-specified row type do not match"),
227 errdetail(
"Query has too many columns.")));
234 if (attr->attisdropped)
242 !((
Const *)
tle->expr)->constisnull)
245 errmsg(
"table row type and query-specified row type do not match"),
246 errdetail(
"Query provides a value for a dropped column at ordinal position %d.",
249 else if (attr->attgenerated)
259 !((
Const *)
tle->expr)->constisnull)
262 errmsg(
"table row type and query-specified row type do not match"),
263 errdetail(
"Query provides a value for a generated column at ordinal position %d.",
272 errmsg(
"table row type and query-specified row type do not match"),
273 errdetail(
"Table has type %s at ordinal position %d, but query expects %s.",
279 if (attno != resultDesc->
natts)
282 errmsg(
"table row type and query-specified row type do not match"),
283 errdetail(
"Query has too few columns.")));
401 errmsg(
"could not serialize access due to concurrent update")));
421 elog(
ERROR,
"failed to fetch conflicting tuple for ON CONFLICT");
448 int natts = tupdesc->
natts;
479 for (
int i = 0;
i < natts;
i++)
490 elog(
ERROR,
"no generation expression found for column number %d of table \"%s\"",
562 int natts = tupdesc->
natts;
601 for (
int i = 0;
i < natts;
i++)
796 return relinfo->ri_newTupleSlot;
809 econtext =
newProj->pi_exprContext;
836 econtext =
newProj->pi_exprContext;
1126 List *arbiterIndexes;
1232 slot, arbiterIndexes,
1505 resultRelInfo,
tupleid, oldtuple,
1715 errmsg(
"tuple to be deleted was already modified by an operation triggered by the current command"),
1716 errhint(
"Consider using an AFTER trigger instead of a BEFORE trigger to propagate changes to other rows.")));
1732 errmsg(
"could not serialize access due to concurrent update")));
1789 errmsg(
"tuple to be deleted was already modified by an operation triggered by the current command"),
1790 errhint(
"Consider using an AFTER trigger instead of a BEFORE trigger to propagate changes to other rows.")));
1809 elog(
ERROR,
"unexpected table_tuple_lock status: %u",
1822 errmsg(
"could not serialize access due to concurrent delete")));
1827 elog(
ERROR,
"unrecognized table_tuple_delete status: %u",
1877 if (oldtuple !=
NULL)
1885 elog(
ERROR,
"failed to fetch deleted tuple for DELETE RETURNING");
1988 errmsg(
"invalid ON UPDATE specification"),
1989 errdetail(
"The result tuple would appear in a different partition than the original tuple.")));
2078 elog(
ERROR,
"failed to fetch tuple being updated");
2149 resultRelInfo,
tupleid, oldtuple, slot,
2150 result, &context->
tmfd,
2243 resultRelInfo, slot, estate);
2438 if (!
trig->tgisclone &&
2450 errmsg(
"cannot move tuple across partitions when a non-root ancestor of the source partition is directly referenced in a foreign key"),
2451 errdetail(
"A foreign key points to ancestor \"%s\" but not the root ancestor \"%s\".",
2454 errhint(
"Consider defining the foreign key on table \"%s\".",
2507 elog(
ERROR,
"cannot UPDATE during bootstrap");
2601 errmsg(
"tuple to be updated was already modified by an operation triggered by the current command"),
2602 errhint(
"Consider using an AFTER trigger instead of a BEFORE trigger to propagate changes to other rows.")));
2618 errmsg(
"could not serialize access due to concurrent update")));
2666 elog(
ERROR,
"failed to fetch tuple being updated");
2691 errmsg(
"tuple to be updated was already modified by an operation triggered by the current command"),
2692 errhint(
"Consider using an AFTER trigger instead of a BEFORE trigger to propagate changes to other rows.")));
2697 elog(
ERROR,
"unexpected table_tuple_lock status: %u",
2709 errmsg(
"could not serialize access due to concurrent delete")));
2714 elog(
ERROR,
"unrecognized table_tuple_update status: %u",
2802 errmsg(
"%s command cannot affect row a second time",
2803 isUpdate ?
"ON CONFLICT DO UPDATE" :
"ON CONFLICT DO SELECT"),
2804 errhint(
"Ensure that no rows proposed for insertion within the same command have duplicate constrained values.")));
2807 elog(
ERROR,
"attempted to lock invisible tuple");
2817 elog(
ERROR,
"unexpected self-updated tuple");
2824 errmsg(
"could not serialize access due to concurrent update")));
2840 errmsg(
"could not serialize access due to concurrent delete")));
2847 elog(
ERROR,
"unrecognized table_tuple_lock status: %u",
test);
2966 *returning =
ExecUpdate(context, resultRelInfo,
2978 if (*returning !=
NULL &&
3027 elog(
ERROR,
"failed to fetch conflicting tuple for ON CONFLICT");
3033 switch (lockStrength)
3048 elog(
ERROR,
"Unexpected lock strength %d", (
int) lockStrength);
3196 canSetTag, &matched);
3296 if (oldtuple !=
NULL)
3319 elog(
ERROR,
"failed to fetch the target tuple");
3376 switch (commandType)
3391 if (result ==
TM_Ok)
3431 if (result ==
TM_Ok)
3444 if (result ==
TM_Ok)
3467 if (result ==
TM_Ok)
3481 elog(
ERROR,
"unknown action in MERGE WHEN clause");
3516 errmsg(
"tuple to be updated or deleted was already modified by an operation triggered by the current command"),
3517 errhint(
"Consider using an AFTER trigger instead of a BEFORE trigger to propagate changes to other rows.")));
3523 errmsg(
"%s command cannot affect row a second time",
3525 errhint(
"Ensure that not more than one source row matches any one target row.")));
3528 elog(
ERROR,
"attempted to update or delete invisible tuple");
3535 errmsg(
"could not serialize access due to concurrent delete")));
3555 errmsg(
"could not serialize access due to concurrent update")));
3599 errmsg(
"tuple to be merged was already moved to another partition due to concurrent update")));
3653 elog(
ERROR,
"failed to fetch the target tuple");
3713 errmsg(
"tuple to be updated or deleted was already modified by an operation triggered by the current command"),
3714 errhint(
"Consider using an AFTER trigger instead of a BEFORE trigger to propagate changes to other rows.")));
3720 errmsg(
"%s command cannot affect row a second time",
3722 errhint(
"Ensure that not more than one source row matches any one target row.")));
3725 elog(
ERROR,
"attempted to update or delete invisible tuple");
3730 elog(
ERROR,
"unexpected table_tuple_lock status: %u",
3740 elog(
ERROR,
"unexpected tuple operation result: %d", result);
3747 switch (commandType)
3771 elog(
ERROR,
"unrecognized commandType: %d",
3829 CmdType commandType = action->mas_action->commandType;
3839 if (!
ExecQual(action->mas_whenqual, econtext))
3843 switch (commandType)
3863 elog(
ERROR,
"unknown action in MERGE WHEN NOT MATCHED clause");
3890 if (mergeActionLists ==
NIL)
3907 foreach(
lc, mergeActionLists)
3910 Node *joinCondition;
3927 foreach(l, mergeActionList)
3951 switch (action->commandType)
3956 action->targetList);
3969 if (
rootRelInfo->ri_RelationDesc->rd_rel->relkind ==
4025 action->updateColnos,
4038 elog(
ERROR,
"unknown action in MERGE WHEN clause");
4065 bool found_whole_row;
4113 List *returningList;
4134 returningList = (
List *)
4379 elog(
ERROR,
"ModifyTable should not be called during EvalPlanQual");
4686 slot =
ExecInsert(&context, resultRelInfo, slot,
4702 if (oldtuple !=
NULL)
4721 elog(
ERROR,
"failed to fetch tuple being updated");
4841 List *withCheckOptionLists =
NIL;
4843 List *updateColnosLists =
NIL;
4845 List *mergeJoinConditions =
NIL;
4888 resultRelations =
lappend_int(resultRelations, rti);
4903 returningLists =
lappend(returningLists, returningList);
4915 mergeActionLists =
lappend(mergeActionLists, mergeActionList);
4921 mergeJoinConditions =
lappend(mergeJoinConditions, mergeJoinCondition);
5003 foreach(l, resultRelations)
5008 if (mergeActionLists)
5046 for (
i = 0;
i < nrels;
i++)
5092 elog(
ERROR,
"could not find junk ctid column");
5113 elog(
ERROR,
"could not find junk wholerow column");
5122 elog(
ERROR,
"could not find junk wholerow column");
5157 foreach(l, withCheckOptionLists)
5203 foreach(l, returningLists)
5297 onconfl->oc_WhereClause = qualexpr;
5347#ifdef USE_ASSERT_CHECKING
5348#define MT_NRELS_HASH 4
5350#define MT_NRELS_HASH 64
5363 for (
i = 0;
i < nrels;
i++)
5492 elog(
ERROR,
"ExecReScanModifyTable is not implemented");
AttrMap * build_attrmap_by_name(TupleDesc indesc, TupleDesc outdesc, bool missing_ok)
#define AttributeNumberIsValid(attributeNumber)
bool bms_is_member(int x, const Bitmapset *a)
Bitmapset * bms_add_member(Bitmapset *a, int x)
bool bms_overlap(const Bitmapset *a, const Bitmapset *b)
static Datum values[MAXATTR]
#define Assert(condition)
Datum datumCopy(Datum value, bool typByVal, int typLen)
void * hash_search(HTAB *hashp, const void *keyPtr, HASHACTION action, bool *foundPtr)
HTAB * hash_create(const char *tabname, int64 nelem, const HASHCTL *info, int flags)
int errcode(int sqlerrcode)
int errhint(const char *fmt,...) pg_attribute_printf(1
int errdetail(const char *fmt,...) pg_attribute_printf(1
#define ereport(elevel,...)
ExprState * ExecPrepareExpr(Expr *node, EState *estate)
ProjectionInfo * ExecBuildProjectionInfo(List *targetList, ExprContext *econtext, TupleTableSlot *slot, PlanState *parent, TupleDesc inputDesc)
ExprState * ExecInitQual(List *qual, PlanState *parent)
ProjectionInfo * ExecBuildUpdateProjection(List *targetList, bool evalTargetList, List *targetColnos, TupleDesc relDesc, ExprContext *econtext, TupleTableSlot *slot, PlanState *parent)
List * ExecInsertIndexTuples(ResultRelInfo *resultRelInfo, EState *estate, bits32 flags, TupleTableSlot *slot, List *arbiterIndexes, bool *specConflict)
void ExecOpenIndices(ResultRelInfo *resultRelInfo, bool speculative)
bool ExecCheckIndexConstraints(ResultRelInfo *resultRelInfo, TupleTableSlot *slot, EState *estate, ItemPointer conflictTid, const ItemPointerData *tupleid, List *arbiterIndexes)
AttrNumber ExecFindJunkAttributeInTlist(List *targetlist, const char *attrName)
LockTupleMode ExecUpdateLockMode(EState *estate, ResultRelInfo *relinfo)
ExecRowMark * ExecFindRowMark(EState *estate, Index rti, bool missing_ok)
ExecAuxRowMark * ExecBuildAuxRowMark(ExecRowMark *erm, List *targetlist)
TupleTableSlot * EvalPlanQualSlot(EPQState *epqstate, Relation relation, Index rti)
void CheckValidResultRel(ResultRelInfo *resultRelInfo, CmdType operation, OnConflictAction onConflictAction, List *mergeActions)
void EvalPlanQualBegin(EPQState *epqstate)
bool ExecPartitionCheck(ResultRelInfo *resultRelInfo, TupleTableSlot *slot, EState *estate, bool emitError)
void EvalPlanQualInit(EPQState *epqstate, EState *parentestate, Plan *subplan, List *auxrowmarks, int epqParam, List *resultRelations)
void ExecWithCheckOptions(WCOKind kind, ResultRelInfo *resultRelInfo, TupleTableSlot *slot, EState *estate)
void EvalPlanQualEnd(EPQState *epqstate)
void EvalPlanQualSetPlan(EPQState *epqstate, Plan *subplan, List *auxrowmarks)
TupleTableSlot * EvalPlanQual(EPQState *epqstate, Relation relation, Index rti, TupleTableSlot *inputslot)
void ExecPartitionCheckEmitError(ResultRelInfo *resultRelInfo, TupleTableSlot *slot, EState *estate)
void ExecConstraints(ResultRelInfo *resultRelInfo, TupleTableSlot *slot, EState *estate)
List * ExecGetAncestorResultRels(EState *estate, ResultRelInfo *resultRelInfo)
PartitionTupleRouting * ExecSetupPartitionTupleRouting(EState *estate, Relation rel)
ResultRelInfo * ExecFindPartition(ModifyTableState *mtstate, ResultRelInfo *rootResultRelInfo, PartitionTupleRouting *proute, TupleTableSlot *slot, EState *estate)
void ExecCleanupTupleRouting(ModifyTableState *mtstate, PartitionTupleRouting *proute)
void ExecEndNode(PlanState *node)
PlanState * ExecInitNode(Plan *node, EState *estate, int eflags)
TupleTableSlot * MakeSingleTupleTableSlot(TupleDesc tupdesc, const TupleTableSlotOps *tts_ops)
const TupleTableSlotOps TTSOpsVirtual
void ExecDropSingleTupleTableSlot(TupleTableSlot *slot)
TupleTableSlot * ExecStoreVirtualTuple(TupleTableSlot *slot)
void ExecInitResultTypeTL(PlanState *planstate)
void ExecInitResultTupleSlotTL(PlanState *planstate, const TupleTableSlotOps *tts_ops)
TupleTableSlot * ExecStoreAllNullTuple(TupleTableSlot *slot)
void ExecForceStoreHeapTuple(HeapTuple tuple, TupleTableSlot *slot, bool shouldFree)
TupleConversionMap * ExecGetRootToChildMap(ResultRelInfo *resultRelInfo, EState *estate)
TupleConversionMap * ExecGetChildToRootMap(ResultRelInfo *resultRelInfo)
Bitmapset * ExecGetUpdatedCols(ResultRelInfo *relinfo, EState *estate)
void ExecInitResultRelation(EState *estate, ResultRelInfo *resultRelInfo, Index rti)
void ExecAssignExprContext(EState *estate, PlanState *planstate)
TupleTableSlot * ExecGetAllNullSlot(EState *estate, ResultRelInfo *relInfo)
TupleTableSlot * ExecGetReturningSlot(EState *estate, ResultRelInfo *relInfo)
#define InstrCountFiltered1(node, delta)
#define outerPlanState(node)
#define InstrCountTuples2(node, delta)
#define EEO_FLAG_NEW_IS_NULL
#define EEO_FLAG_OLD_IS_NULL
#define EXEC_FLAG_BACKWARD
#define ResetPerTupleExprContext(estate)
static TupleTableSlot * ExecProject(ProjectionInfo *projInfo)
#define GetPerTupleExprContext(estate)
static RangeTblEntry * exec_rt_fetch(Index rti, EState *estate)
#define ResetExprContext(econtext)
#define GetPerTupleMemoryContext(estate)
#define EIIT_ONLY_SUMMARIZING
static bool ExecQual(ExprState *state, ExprContext *econtext)
static TupleTableSlot * ExecProcNode(PlanState *node)
#define EvalPlanQualSetSlot(epqstate, slot)
static Datum ExecEvalExpr(ExprState *state, ExprContext *econtext, bool *isNull)
#define EXEC_FLAG_EXPLAIN_ONLY
static Datum ExecGetJunkAttribute(TupleTableSlot *slot, AttrNumber attno, bool *isNull)
#define EIIT_NO_DUPE_ERROR
#define palloc_array(type, count)
#define DatumGetHeapTupleHeader(X)
static uint32 HeapTupleHeaderGetDatumLength(const HeapTupleHeaderData *tup)
#define INJECTION_POINT(name, arg)
void InstrUpdateTupleCount(Instrumentation *instr, double nTuples)
static void ItemPointerSetInvalid(ItemPointerData *pointer)
static bool ItemPointerIndicatesMovedPartitions(const ItemPointerData *pointer)
ItemPointerData * ItemPointer
static void ItemPointerCopy(const ItemPointerData *fromPointer, ItemPointerData *toPointer)
static bool ItemPointerIsValid(const ItemPointerData *pointer)
List * lappend(List *list, void *datum)
List * lappend_int(List *list, int datum)
List * lcons(void *datum, List *list)
bool list_member_ptr(const List *list, const void *datum)
void list_free(List *list)
void UnlockTuple(Relation relation, const ItemPointerData *tid, LOCKMODE lockmode)
uint32 SpeculativeInsertionLockAcquire(TransactionId xid)
void SpeculativeInsertionLockRelease(TransactionId xid)
void LockTuple(Relation relation, const ItemPointerData *tid, LOCKMODE lockmode)
#define InplaceUpdateTupleLock
@ LockTupleNoKeyExclusive
void pfree(void *pointer)
void * palloc0(Size size)
MemoryContext CurrentMemoryContext
#define IsBootstrapProcessingMode()
#define CHECK_FOR_INTERRUPTS()
Oid exprType(const Node *expr)
static bool ExecOnConflictSelect(ModifyTableContext *context, ResultRelInfo *resultRelInfo, ItemPointer conflictTid, TupleTableSlot *excludedSlot, bool canSetTag, TupleTableSlot **returning)
static void ExecInitInsertProjection(ModifyTableState *mtstate, ResultRelInfo *resultRelInfo)
ResultRelInfo * ExecLookupResultRelByOid(ModifyTableState *node, Oid resultoid, bool missing_ok, bool update_cache)
static void ExecPendingInserts(EState *estate)
static void ExecSetupTransitionCaptureState(ModifyTableState *mtstate, EState *estate)
void ExecInitMergeTupleSlots(ModifyTableState *mtstate, ResultRelInfo *resultRelInfo)
static void ExecUpdatePrepareSlot(ResultRelInfo *resultRelInfo, TupleTableSlot *slot, EState *estate)
static TupleTableSlot * ExecInsert(ModifyTableContext *context, ResultRelInfo *resultRelInfo, TupleTableSlot *slot, bool canSetTag, TupleTableSlot **inserted_tuple, ResultRelInfo **insert_destrel)
ModifyTableState * ExecInitModifyTable(ModifyTable *node, EState *estate, int eflags)
static TupleTableSlot * ExecMergeMatched(ModifyTableContext *context, ResultRelInfo *resultRelInfo, ItemPointer tupleid, HeapTuple oldtuple, bool canSetTag, bool *matched)
static TupleTableSlot * ExecModifyTable(PlanState *pstate)
static bool ExecDeletePrologue(ModifyTableContext *context, ResultRelInfo *resultRelInfo, ItemPointer tupleid, HeapTuple oldtuple, TupleTableSlot **epqreturnslot, TM_Result *result)
static void ExecCheckPlanOutput(Relation resultRel, List *targetList)
TupleTableSlot * ExecGetUpdateNewTuple(ResultRelInfo *relinfo, TupleTableSlot *planSlot, TupleTableSlot *oldSlot)
static void ExecCrossPartitionUpdateForeignKey(ModifyTableContext *context, ResultRelInfo *sourcePartInfo, ResultRelInfo *destPartInfo, ItemPointer tupleid, TupleTableSlot *oldslot, TupleTableSlot *newslot)
static void ExecInitUpdateProjection(ModifyTableState *mtstate, ResultRelInfo *resultRelInfo)
static void ExecCheckTIDVisible(EState *estate, ResultRelInfo *relinfo, ItemPointer tid, TupleTableSlot *tempSlot)
static TM_Result ExecDeleteAct(ModifyTableContext *context, ResultRelInfo *resultRelInfo, ItemPointer tupleid, bool changingPart)
static void ExecCheckTupleVisible(EState *estate, Relation rel, TupleTableSlot *slot)
static TupleTableSlot * ExecUpdate(ModifyTableContext *context, ResultRelInfo *resultRelInfo, ItemPointer tupleid, HeapTuple oldtuple, TupleTableSlot *oldSlot, TupleTableSlot *slot, bool canSetTag)
void ExecComputeStoredGenerated(ResultRelInfo *resultRelInfo, EState *estate, TupleTableSlot *slot, CmdType cmdtype)
static TupleTableSlot * ExecPrepareTupleRouting(ModifyTableState *mtstate, EState *estate, PartitionTupleRouting *proute, ResultRelInfo *targetRelInfo, TupleTableSlot *slot, ResultRelInfo **partRelInfo)
static TupleTableSlot * ExecGetInsertNewTuple(ResultRelInfo *relinfo, TupleTableSlot *planSlot)
static TM_Result ExecUpdateAct(ModifyTableContext *context, ResultRelInfo *resultRelInfo, ItemPointer tupleid, HeapTuple oldtuple, TupleTableSlot *slot, bool canSetTag, UpdateContext *updateCxt)
static void ExecUpdateEpilogue(ModifyTableContext *context, UpdateContext *updateCxt, ResultRelInfo *resultRelInfo, ItemPointer tupleid, HeapTuple oldtuple, TupleTableSlot *slot)
void ExecInitGenerated(ResultRelInfo *resultRelInfo, EState *estate, CmdType cmdtype)
static bool ExecOnConflictLockRow(ModifyTableContext *context, TupleTableSlot *existing, ItemPointer conflictTid, Relation relation, LockTupleMode lockmode, bool isUpdate)
static void fireBSTriggers(ModifyTableState *node)
void ExecReScanModifyTable(ModifyTableState *node)
static TupleTableSlot * ExecDelete(ModifyTableContext *context, ResultRelInfo *resultRelInfo, ItemPointer tupleid, HeapTuple oldtuple, bool processReturning, bool changingPart, bool canSetTag, TM_Result *tmresult, bool *tupleDeleted, TupleTableSlot **epqreturnslot)
void ExecEndModifyTable(ModifyTableState *node)
static void fireASTriggers(ModifyTableState *node)
static bool ExecOnConflictUpdate(ModifyTableContext *context, ResultRelInfo *resultRelInfo, ItemPointer conflictTid, TupleTableSlot *excludedSlot, bool canSetTag, TupleTableSlot **returning)
static void ExecBatchInsert(ModifyTableState *mtstate, ResultRelInfo *resultRelInfo, TupleTableSlot **slots, TupleTableSlot **planSlots, int numSlots, EState *estate, bool canSetTag)
static bool ExecUpdatePrologue(ModifyTableContext *context, ResultRelInfo *resultRelInfo, ItemPointer tupleid, HeapTuple oldtuple, TupleTableSlot *slot, TM_Result *result)
static void ExecDeleteEpilogue(ModifyTableContext *context, ResultRelInfo *resultRelInfo, ItemPointer tupleid, HeapTuple oldtuple, bool changingPart)
static TupleTableSlot * ExecMergeNotMatched(ModifyTableContext *context, ResultRelInfo *resultRelInfo, bool canSetTag)
static TupleTableSlot * ExecMerge(ModifyTableContext *context, ResultRelInfo *resultRelInfo, ItemPointer tupleid, HeapTuple oldtuple, bool canSetTag)
static TupleTableSlot * ExecProcessReturning(ModifyTableContext *context, ResultRelInfo *resultRelInfo, bool isDelete, TupleTableSlot *oldSlot, TupleTableSlot *newSlot, TupleTableSlot *planSlot)
static bool ExecCrossPartitionUpdate(ModifyTableContext *context, ResultRelInfo *resultRelInfo, ItemPointer tupleid, HeapTuple oldtuple, TupleTableSlot *slot, bool canSetTag, UpdateContext *updateCxt, TM_Result *tmresult, TupleTableSlot **retry_slot, TupleTableSlot **inserted_tuple, ResultRelInfo **insert_destrel)
static void ExecInitMerge(ModifyTableState *mtstate, EState *estate)
#define IsA(nodeptr, _type_)
#define castNode(_type_, nodeptr)
static MemoryContext MemoryContextSwitchTo(MemoryContext context)
@ WCO_RLS_MERGE_UPDATE_CHECK
@ WCO_RLS_MERGE_DELETE_CHECK
FormData_pg_attribute * Form_pg_attribute
#define lfirst_node(type, lc)
static int list_length(const List *l)
#define forboth(cell1, list1, cell2, list2)
static void * list_nth(const List *list, int n)
#define list_nth_node(type, list, n)
#define ERRCODE_T_R_SERIALIZATION_FAILURE
static Oid DatumGetObjectId(Datum X)
static Pointer DatumGetPointer(Datum X)
static TransactionId DatumGetTransactionId(Datum X)
@ MERGE_WHEN_NOT_MATCHED_BY_TARGET
@ MERGE_WHEN_NOT_MATCHED_BY_SOURCE
#define RelationGetForm(relation)
#define RelationGetRelid(relation)
#define RelationGetDescr(relation)
#define RelationGetRelationName(relation)
Node * build_column_default(Relation rel, int attrno)
Node * map_variable_attnos(Node *node, int target_varno, int sublevels_up, const AttrMap *attno_map, Oid to_rowtype, bool *found_whole_row)
int RI_FKey_trigger_type(Oid tgfoid)
Bitmapset * es_unpruned_relids
List * es_insert_pending_result_relations
MemoryContext es_query_cxt
struct EPQState * es_epq_active
List * es_insert_pending_modifytables
List * es_auxmodifytables
Snapshot es_crosscheck_snapshot
TupleTableSlot * ecxt_innertuple
TupleTableSlot * ecxt_newtuple
TupleTableSlot * ecxt_scantuple
TupleTableSlot * ecxt_oldtuple
TupleTableSlot * ecxt_outertuple
BeginForeignModify_function BeginForeignModify
EndForeignModify_function EndForeignModify
ExecForeignInsert_function ExecForeignInsert
ExecForeignUpdate_function ExecForeignUpdate
ExecForeignBatchInsert_function ExecForeignBatchInsert
GetForeignModifyBatchSize_function GetForeignModifyBatchSize
ExecForeignDelete_function ExecForeignDelete
ProjectionInfo * mas_proj
TupleTableSlot * planSlot
TupleTableSlot * cpDeletedSlot
TupleTableSlot * cpUpdateReturningSlot
ModifyTableState * mtstate
List * mt_mergeJoinConditions
TupleTableSlot * mt_merge_pending_not_matched
ResultRelInfo * resultRelInfo
struct PartitionTupleRouting * mt_partition_tuple_routing
List * mt_updateColnosLists
TupleTableSlot * mt_root_tuple_slot
List * mt_mergeActionLists
ResultRelInfo * rootResultRelInfo
struct TransitionCaptureState * mt_transition_capture
struct TransitionCaptureState * mt_oc_transition_capture
MergeActionState * mt_merge_action
List * mergeJoinConditions
Bitmapset * fdwDirectModifyPlans
List * withCheckOptionLists
LockClauseStrength onConflictLockStrength
OnConflictAction onConflictAction
ExprState * oc_WhereClause
ProjectionInfo * oc_ProjInfo
TupleTableSlot * oc_ProjSlot
TupleTableSlot * oc_Existing
LockClauseStrength oc_LockStrength
ExprContext * ps_ExprContext
TupleTableSlot * ps_ResultTupleSlot
ExecProcNodeMtd ExecProcNode
OnConflictActionState * ri_onConflict
TupleTableSlot * ri_PartitionTupleSlot
bool ri_projectNewInfoValid
List * ri_onConflictArbiterIndexes
struct ResultRelInfo * ri_RootResultRelInfo
TupleTableSlot ** ri_Slots
ExprState * ri_MergeJoinCondition
RelationPtr ri_IndexRelationDescs
int ri_NumSlotsInitialized
List * ri_WithCheckOptions
TupleTableSlot * ri_oldTupleSlot
bool ri_extraUpdatedCols_valid
TriggerDesc * ri_TrigDesc
Bitmapset * ri_extraUpdatedCols
ExprState ** ri_GeneratedExprsI
int ri_NumGeneratedNeededU
List * ri_MergeActions[NUM_MERGE_MATCH_KINDS]
TupleTableSlot * ri_newTupleSlot
List * ri_WithCheckOptionExprs
ProjectionInfo * ri_projectNew
ProjectionInfo * ri_projectReturning
ExprState ** ri_GeneratedExprsU
struct FdwRoutine * ri_FdwRoutine
TupleTableSlot ** ri_PlanSlots
bool ri_usesFdwDirectModify
int ri_NumGeneratedNeededI
TupleTableSlot * tcs_original_insert_tuple
bool tcs_update_new_table
bool tcs_update_old_table
bool trig_delete_before_row
bool trig_update_instead_row
bool trig_delete_instead_row
bool trig_update_after_row
bool trig_insert_instead_row
bool trig_update_before_row
bool trig_insert_before_row
bool has_generated_virtual
bool has_generated_stored
TupleDesc tts_tupleDescriptor
const TupleTableSlotOps *const tts_ops
TU_UpdateIndexes updateIndexes
#define MinTransactionIdAttributeNumber
#define FirstLowInvalidHeapAttributeNumber
TupleTableSlot * table_slot_create(Relation relation, List **reglist)
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)
static void table_tuple_insert_speculative(Relation rel, TupleTableSlot *slot, CommandId cid, int options, BulkInsertStateData *bistate, uint32 specToken)
static void table_tuple_complete_speculative(Relation rel, TupleTableSlot *slot, uint32 specToken, bool succeeded)
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, TU_UpdateIndexes *update_indexes)
static TM_Result table_tuple_delete(Relation rel, ItemPointer tid, CommandId cid, Snapshot snapshot, Snapshot crosscheck, bool wait, TM_FailureData *tmfd, bool changingPart)
#define TUPLE_LOCK_FLAG_FIND_LAST_VERSION
static void table_tuple_insert(Relation rel, TupleTableSlot *slot, CommandId cid, int options, BulkInsertStateData *bistate)
static bool table_tuple_satisfies_snapshot(Relation rel, TupleTableSlot *slot, Snapshot snapshot)
static bool table_tuple_fetch_row_version(Relation rel, ItemPointer tid, Snapshot snapshot, TupleTableSlot *slot)
bool ExecBRUpdateTriggers(EState *estate, EPQState *epqstate, ResultRelInfo *relinfo, ItemPointer tupleid, HeapTuple fdw_trigtuple, TupleTableSlot *newslot, TM_Result *tmresult, TM_FailureData *tmfd, bool is_merge_update)
TransitionCaptureState * MakeTransitionCaptureState(TriggerDesc *trigdesc, Oid relid, CmdType cmdType)
void ExecARDeleteTriggers(EState *estate, ResultRelInfo *relinfo, ItemPointer tupleid, HeapTuple fdw_trigtuple, TransitionCaptureState *transition_capture, bool is_crosspart_update)
void ExecBSInsertTriggers(EState *estate, ResultRelInfo *relinfo)
bool ExecBRInsertTriggers(EState *estate, ResultRelInfo *relinfo, TupleTableSlot *slot)
bool ExecIRDeleteTriggers(EState *estate, ResultRelInfo *relinfo, HeapTuple trigtuple)
void ExecBSDeleteTriggers(EState *estate, ResultRelInfo *relinfo)
bool ExecIRInsertTriggers(EState *estate, ResultRelInfo *relinfo, TupleTableSlot *slot)
void ExecARUpdateTriggers(EState *estate, ResultRelInfo *relinfo, ResultRelInfo *src_partinfo, ResultRelInfo *dst_partinfo, ItemPointer tupleid, HeapTuple fdw_trigtuple, TupleTableSlot *newslot, List *recheckIndexes, TransitionCaptureState *transition_capture, bool is_crosspart_update)
bool ExecBRDeleteTriggers(EState *estate, EPQState *epqstate, ResultRelInfo *relinfo, ItemPointer tupleid, HeapTuple fdw_trigtuple, TupleTableSlot **epqslot, TM_Result *tmresult, TM_FailureData *tmfd, bool is_merge_delete)
void ExecASUpdateTriggers(EState *estate, ResultRelInfo *relinfo, TransitionCaptureState *transition_capture)
void ExecASDeleteTriggers(EState *estate, ResultRelInfo *relinfo, TransitionCaptureState *transition_capture)
void ExecARInsertTriggers(EState *estate, ResultRelInfo *relinfo, TupleTableSlot *slot, List *recheckIndexes, TransitionCaptureState *transition_capture)
void ExecASInsertTriggers(EState *estate, ResultRelInfo *relinfo, TransitionCaptureState *transition_capture)
bool ExecIRUpdateTriggers(EState *estate, ResultRelInfo *relinfo, HeapTuple trigtuple, TupleTableSlot *newslot)
void ExecBSUpdateTriggers(EState *estate, ResultRelInfo *relinfo)
TupleTableSlot * execute_attr_map_slot(AttrMap *attrMap, TupleTableSlot *in_slot, TupleTableSlot *out_slot)
TupleDesc CreateTupleDescCopy(TupleDesc tupdesc)
static FormData_pg_attribute * TupleDescAttr(TupleDesc tupdesc, int i)
static CompactAttribute * TupleDescCompactAttr(TupleDesc tupdesc, int i)
static Datum slot_getsysattr(TupleTableSlot *slot, int attnum, bool *isnull)
static TupleTableSlot * ExecClearTuple(TupleTableSlot *slot)
static void slot_getallattrs(TupleTableSlot *slot)
static TupleTableSlot * ExecCopySlot(TupleTableSlot *dstslot, TupleTableSlot *srcslot)
static void ExecMaterializeSlot(TupleTableSlot *slot)
void pull_varattnos(Node *node, Index varno, Bitmapset **varattnos)
bool TransactionIdIsCurrentTransactionId(TransactionId xid)
TransactionId GetCurrentTransactionId(void)
#define IsolationUsesXactSnapshot()