1
0
mirror of https://github.com/postgres/postgres.git synced 2025-08-14 02:22:38 +03:00

Detach constraints when partitions are detached

I (Álvaro) forgot to do this in eb7ed3f306, 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
This commit is contained in:
Alvaro Herrera
2019-01-23 23:57:46 -03:00
parent 0359d83212
commit 00376eaa2e
3 changed files with 47 additions and 0 deletions

View File

@@ -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);