aboutsummaryrefslogtreecommitdiff
path: root/src/backend/executor/execReplication.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/executor/execReplication.c')
-rw-r--r--src/backend/executor/execReplication.c30
1 files changed, 30 insertions, 0 deletions
diff --git a/src/backend/executor/execReplication.c b/src/backend/executor/execReplication.c
index ede89ea3cf9..53ddd25c42d 100644
--- a/src/backend/executor/execReplication.c
+++ b/src/backend/executor/execReplication.c
@@ -432,6 +432,30 @@ retry:
}
/*
+ * Build additional index information necessary for conflict detection.
+ */
+static void
+BuildConflictIndexInfo(ResultRelInfo *resultRelInfo, Oid conflictindex)
+{
+ for (int i = 0; i < resultRelInfo->ri_NumIndices; i++)
+ {
+ Relation indexRelation = resultRelInfo->ri_IndexRelationDescs[i];
+ IndexInfo *indexRelationInfo = resultRelInfo->ri_IndexRelationInfo[i];
+
+ if (conflictindex != RelationGetRelid(indexRelation))
+ continue;
+
+ /*
+ * This Assert will fail if BuildSpeculativeIndexInfo() is called
+ * twice for the given index.
+ */
+ Assert(indexRelationInfo->ii_UniqueOps == NULL);
+
+ BuildSpeculativeIndexInfo(indexRelation, indexRelationInfo);
+ }
+}
+
+/*
* Find the tuple that violates the passed unique index (conflictindex).
*
* If the conflicting tuple is found return true, otherwise false.
@@ -452,6 +476,12 @@ FindConflictTuple(ResultRelInfo *resultRelInfo, EState *estate,
*conflictslot = NULL;
+ /*
+ * Build additional information required to check constraints violations.
+ * See check_exclusion_or_unique_constraint().
+ */
+ BuildConflictIndexInfo(resultRelInfo, conflictindex);
+
retry:
if (ExecCheckIndexConstraints(resultRelInfo, slot, estate,
&conflictTid, &slot->tts_tid,