From 42cb636ce6acee717fa19f6b69bf40aacc402852 Mon Sep 17 00:00:00 2001 From: amit Date: Wed, 23 Jan 2019 18:33:09 +0900 Subject: [PATCH] Detach primary key constraint when detaching partition --- src/backend/commands/tablecmds.c | 11 +++++++++++ src/test/regress/expected/indexing.out | 9 +++++++++ src/test/regress/sql/indexing.sql | 9 +++++++++ 3 files changed, 29 insertions(+) diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c index 28a137bb53..897f74119d 100644 --- a/src/backend/commands/tablecmds.c +++ b/src/backend/commands/tablecmds.c @@ -15094,6 +15094,7 @@ ATExecDetachPartition(Relation rel, RangeVar *name) foreach(cell, indexes) { Oid idxid = lfirst_oid(cell); + Oid constrOid; Relation idx; if (!has_superclass(idxid)) @@ -15106,6 +15107,16 @@ ATExecDetachPartition(Relation rel, RangeVar *name) IndexSetParentIndex(idx, InvalidOid); update_relispartition(classRel, idxid, false); index_close(idx, NoLock); + + /* Detach any associated constraint as well. */ + if (!idx->rd_index->indisprimary) + continue; + constrOid = get_relation_idx_constraint_oid(RelationGetRelid(partRel), + idxid); + if (!OidIsValid(constrOid)) + elog(ERROR, "missing pg_constraint entry of index %u of %u", + idxid, RelationGetRelid(partRel)); + ConstraintSetParentConstraint(constrOid, InvalidOid); } table_close(classRel, RowExclusiveLock); diff --git a/src/test/regress/expected/indexing.out b/src/test/regress/expected/indexing.out index 118f2c78df..ebf86d7bfc 100644 --- a/src/test/regress/expected/indexing.out +++ b/src/test/regress/expected/indexing.out @@ -1414,3 +1414,12 @@ DETAIL: Key (a)=(4) already exists. create unique index on covidxpart (b) include (a); -- should fail ERROR: insufficient columns in UNIQUE constraint definition DETAIL: UNIQUE constraint on table "covidxpart" lacks column "a" which is part of the partition key. +-- check that detaching a partition also detaches the primary key constraint +create table parted_pk_detach_test (a int primary key) partition by list (a); +create table parted_pk_detach_test1 partition of parted_pk_detach_test for values in (1); +alter table parted_pk_detach_test detach partition parted_pk_detach_test1; +alter table parted_pk_detach_test1 drop constraint parted_pk_detach_test1_pkey; +alter table parted_pk_detach_test attach partition parted_pk_detach_test1 for values in (1); +alter table parted_pk_detach_test1 drop constraint parted_pk_detach_test1_pkey; -- should fail +ERROR: cannot drop inherited constraint "parted_pk_detach_test1_pkey" of relation "parted_pk_detach_test1" +drop table parted_pk_detach_test; diff --git a/src/test/regress/sql/indexing.sql b/src/test/regress/sql/indexing.sql index d4a64c18c7..c110f0bdb8 100644 --- a/src/test/regress/sql/indexing.sql +++ b/src/test/regress/sql/indexing.sql @@ -757,3 +757,12 @@ alter table covidxpart attach partition covidxpart4 for values in (4); insert into covidxpart values (4, 1); insert into covidxpart values (4, 1); create unique index on covidxpart (b) include (a); -- should fail + +-- check that detaching a partition also detaches the primary key constraint +create table parted_pk_detach_test (a int primary key) partition by list (a); +create table parted_pk_detach_test1 partition of parted_pk_detach_test for values in (1); +alter table parted_pk_detach_test detach partition parted_pk_detach_test1; +alter table parted_pk_detach_test1 drop constraint parted_pk_detach_test1_pkey; +alter table parted_pk_detach_test attach partition parted_pk_detach_test1 for values in (1); +alter table parted_pk_detach_test1 drop constraint parted_pk_detach_test1_pkey; -- should fail +drop table parted_pk_detach_test; -- 2.11.0