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-24 00:01:32 -0300 |
commit | ae366aa57762ad0e6a1a0885a7644e79541afe39 (patch) | |
tree | dcfced79b7f569908f7478cd7616788d481623c2 /src | |
parent | 289198c0d93a3d591f379c4134e90275bd426426 (diff) | |
download | postgresql-ae366aa57762ad0e6a1a0885a7644e79541afe39.tar.gz postgresql-ae366aa57762ad0e6a1a0885a7644e79541afe39.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')
-rw-r--r-- | src/backend/commands/tablecmds.c | 18 | ||||
-rw-r--r-- | src/test/regress/expected/indexing.out | 15 | ||||
-rw-r--r-- | src/test/regress/sql/indexing.sql | 14 |
3 files changed, 47 insertions, 0 deletions
diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c index 28a137bb537..738c1781078 100644 --- a/src/backend/commands/tablecmds.c +++ b/src/backend/commands/tablecmds.c @@ -15095,6 +15095,7 @@ ATExecDetachPartition(Relation rel, RangeVar *name) { Oid idxid = lfirst_oid(cell); Relation idx; + Oid constrOid; if (!has_superclass(idxid)) continue; @@ -15106,6 +15107,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); } table_close(classRel, RowExclusiveLock); diff --git a/src/test/regress/expected/indexing.out b/src/test/regress/expected/indexing.out index 118f2c78df4..b344351ee7f 100644 --- a/src/test/regress/expected/indexing.out +++ b/src/test/regress/expected/indexing.out @@ -1414,3 +1414,18 @@ 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_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" +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; +drop table parted_pk_detach_test, parted_pk_detach_test1; +create table parted_uniq_detach_test (a int unique) partition by list (a); +create table parted_uniq_detach_test1 partition of parted_uniq_detach_test for values in (1); +alter table parted_uniq_detach_test1 drop constraint parted_uniq_detach_test1_a_key; -- should fail +ERROR: cannot drop inherited constraint "parted_uniq_detach_test1_a_key" of relation "parted_uniq_detach_test1" +alter table parted_uniq_detach_test detach partition parted_uniq_detach_test1; +alter table parted_uniq_detach_test1 drop constraint parted_uniq_detach_test1_a_key; +drop table parted_uniq_detach_test, parted_uniq_detach_test1; diff --git a/src/test/regress/sql/indexing.sql b/src/test/regress/sql/indexing.sql index d4a64c18c7e..3d43a57da22 100644 --- a/src/test/regress/sql/indexing.sql +++ b/src/test/regress/sql/indexing.sql @@ -757,3 +757,17 @@ 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_test1 drop constraint parted_pk_detach_test1_pkey; -- should fail +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; +drop table parted_pk_detach_test, parted_pk_detach_test1; +create table parted_uniq_detach_test (a int unique) partition by list (a); +create table parted_uniq_detach_test1 partition of parted_uniq_detach_test for values in (1); +alter table parted_uniq_detach_test1 drop constraint parted_uniq_detach_test1_a_key; -- should fail +alter table parted_uniq_detach_test detach partition parted_uniq_detach_test1; +alter table parted_uniq_detach_test1 drop constraint parted_uniq_detach_test1_a_key; +drop table parted_uniq_detach_test, parted_uniq_detach_test1; |