aboutsummaryrefslogtreecommitdiff
path: root/src/backend
diff options
context:
space:
mode:
authorAlvaro Herrera <alvherre@alvh.no-ip.org>2019-01-23 23:57:46 -0300
committerAlvaro Herrera <alvherre@alvh.no-ip.org>2019-01-23 23:57:46 -0300
commit00376eaa2ec28db92efe349a895164b0e31b314c (patch)
tree52a278c33a6e40854bcabb621f5437b997607bae /src/backend
parent0359d832128485840bd7dcf0b09646ad752f6a72 (diff)
downloadpostgresql-00376eaa2ec28db92efe349a895164b0e31b314c.tar.gz
postgresql-00376eaa2ec28db92efe349a895164b0e31b314c.zip
Detach constraints when partitions are detached
I (Álvaro) forgot to do this in eb7ed3f30634, leading to undroppable constraints after partitions are detached. Repair. Reported-by: Amit Langote Author: Amit Langote Discussion: https://postgr.es/m/c1c9b688-b886-84f7-4048-1e4ebe9b1d06@lab.ntt.co.jp
Diffstat (limited to 'src/backend')
-rw-r--r--src/backend/commands/tablecmds.c18
1 files changed, 18 insertions, 0 deletions
diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c
index 5a62adbafcd..32eb5f88bf7 100644
--- a/src/backend/commands/tablecmds.c
+++ b/src/backend/commands/tablecmds.c
@@ -15233,6 +15233,7 @@ ATExecDetachPartition(Relation rel, RangeVar *name)
{
Oid idxid = lfirst_oid(cell);
Relation idx;
+ Oid constrOid;
if (!has_superclass(idxid))
continue;
@@ -15244,6 +15245,23 @@ ATExecDetachPartition(Relation rel, RangeVar *name)
IndexSetParentIndex(idx, InvalidOid);
update_relispartition(classRel, idxid, false);
index_close(idx, NoLock);
+
+ /*
+ * Detach any constraints associated with the index too. Only UNIQUE
+ * and PRIMARY KEY index constraints can be inherited, so no need
+ * to check for others.
+ */
+ if (!idx->rd_index->indisprimary && !idx->rd_index->indisunique)
+ continue;
+
+ constrOid = get_relation_idx_constraint_oid(RelationGetRelid(partRel),
+ idxid);
+ if (!OidIsValid(constrOid))
+ elog(ERROR, "missing pg_constraint entry of index \"%s\" of partition \"%s\"",
+ RelationGetRelationName(idx),
+ RelationGetRelationName(partRel));
+
+ ConstraintSetParentConstraint(constrOid, InvalidOid);
}
heap_close(classRel, RowExclusiveLock);