summaryrefslogtreecommitdiff
path: root/src/backend/commands/tablecmds.c
diff options
context:
space:
mode:
authorPeter Eisentraut <peter@eisentraut.org>2024-11-21 13:50:18 +0100
committerPeter Eisentraut <peter@eisentraut.org>2024-11-21 13:50:18 +0100
commit79b575d3bc09cc67a7b5c2da454aeb35f4beccc5 (patch)
tree8305b53045cc839112ae67188a650bd6e173d6d4 /src/backend/commands/tablecmds.c
parentda94e871e8877d1f1054277b24b604bf1c0036a6 (diff)
Fix ALTER TABLE / REPLICA IDENTITY for temporal tables
REPLICA IDENTITY USING INDEX did not accept a GiST index. This should be allowed when used as a temporal primary key. Author: Paul Jungwirth <pj@illuminatedcomputing.com> Discussion: https://www.postgresql.org/message-id/04579cbf-b134-45e1-8f2d-8c54c849c1ee@illuminatedcomputing.com
Diffstat (limited to 'src/backend/commands/tablecmds.c')
-rw-r--r--src/backend/commands/tablecmds.c11
1 files changed, 8 insertions, 3 deletions
diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c
index c632d1e8245..f53129a1c48 100644
--- a/src/backend/commands/tablecmds.c
+++ b/src/backend/commands/tablecmds.c
@@ -17296,9 +17296,14 @@ ATExecReplicaIdentity(Relation rel, ReplicaIdentityStmt *stmt, LOCKMODE lockmode
errmsg("\"%s\" is not an index for table \"%s\"",
RelationGetRelationName(indexRel),
RelationGetRelationName(rel))));
- /* The AM must support uniqueness, and the index must in fact be unique. */
- if (!indexRel->rd_indam->amcanunique ||
- !indexRel->rd_index->indisunique)
+ /*
+ * The AM must support uniqueness, and the index must in fact be unique.
+ * If we have a WITHOUT OVERLAPS constraint (identified by uniqueness +
+ * exclusion), we can use that too.
+ */
+ if ((!indexRel->rd_indam->amcanunique ||
+ !indexRel->rd_index->indisunique) &&
+ !(indexRel->rd_index->indisunique && indexRel->rd_index->indisexclusion))
ereport(ERROR,
(errcode(ERRCODE_WRONG_OBJECT_TYPE),
errmsg("cannot use non-unique index \"%s\" as replica identity",