summaryrefslogtreecommitdiff
path: root/src/backend/executor/execMain.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/executor/execMain.c')
-rw-r--r--src/backend/executor/execMain.c27
1 files changed, 24 insertions, 3 deletions
diff --git a/src/backend/executor/execMain.c b/src/backend/executor/execMain.c
index 00bbcea2a5a..9ed8cd35380 100644
--- a/src/backend/executor/execMain.c
+++ b/src/backend/executor/execMain.c
@@ -984,12 +984,16 @@ InitPlan(QueryDesc *queryDesc, int eflags)
* For INSERT ON CONFLICT, the result relation is required to support the
* onConflictAction, regardless of whether a conflict actually occurs.
*
+ * For MERGE, mergeActions is the list of actions that may be performed. The
+ * result relation is required to support every action, regardless of whether
+ * or not they are all executed.
+ *
* Note: when changing this function, you probably also need to look at
* CheckValidRowMarkRel.
*/
void
CheckValidResultRelNew(ResultRelInfo *resultRelInfo, CmdType operation,
- OnConflictAction onConflictAction)
+ OnConflictAction onConflictAction, List *mergeActions)
{
Relation resultRel = resultRelInfo->ri_RelationDesc;
TriggerDesc *trigDesc = resultRel->trigdesc;
@@ -1003,7 +1007,24 @@ CheckValidResultRelNew(ResultRelInfo *resultRelInfo, CmdType operation,
{
case RELKIND_RELATION:
case RELKIND_PARTITIONED_TABLE:
- CheckCmdReplicaIdentity(resultRel, operation);
+
+ /*
+ * For MERGE, check that the target relation supports each action.
+ * For other operations, just check the operation itself.
+ */
+ if (operation == CMD_MERGE)
+ {
+ ListCell *lc;
+
+ foreach(lc, mergeActions)
+ {
+ MergeAction *action = (MergeAction *) lfirst(lc);
+
+ CheckCmdReplicaIdentity(resultRel, action->commandType);
+ }
+ }
+ else
+ CheckCmdReplicaIdentity(resultRel, operation);
/*
* For INSERT ON CONFLICT DO UPDATE, additionally check that the
@@ -1136,7 +1157,7 @@ CheckValidResultRelNew(ResultRelInfo *resultRelInfo, CmdType operation,
void
CheckValidResultRel(ResultRelInfo *resultRelInfo, CmdType operation)
{
- return CheckValidResultRelNew(resultRelInfo, operation, ONCONFLICT_NONE);
+ return CheckValidResultRelNew(resultRelInfo, operation, ONCONFLICT_NONE, NIL);
}
/*