diff options
author | Alvaro Herrera <alvherre@alvh.no-ip.org> | 2019-01-23 23:57:46 -0300 |
---|---|---|
committer | Alvaro Herrera <alvherre@alvh.no-ip.org> | 2019-01-23 23:57:46 -0300 |
commit | 00376eaa2ec28db92efe349a895164b0e31b314c (patch) | |
tree | 52a278c33a6e40854bcabb621f5437b997607bae /src/backend | |
parent | 0359d832128485840bd7dcf0b09646ad752f6a72 (diff) | |
download | postgresql-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.c | 18 |
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); |