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
This commit is contained in:
parent
0359d83212
commit
00376eaa2e
@ -15233,6 +15233,7 @@ ATExecDetachPartition(Relation rel, RangeVar *name)
|
|||||||
{
|
{
|
||||||
Oid idxid = lfirst_oid(cell);
|
Oid idxid = lfirst_oid(cell);
|
||||||
Relation idx;
|
Relation idx;
|
||||||
|
Oid constrOid;
|
||||||
|
|
||||||
if (!has_superclass(idxid))
|
if (!has_superclass(idxid))
|
||||||
continue;
|
continue;
|
||||||
@ -15244,6 +15245,23 @@ ATExecDetachPartition(Relation rel, RangeVar *name)
|
|||||||
IndexSetParentIndex(idx, InvalidOid);
|
IndexSetParentIndex(idx, InvalidOid);
|
||||||
update_relispartition(classRel, idxid, false);
|
update_relispartition(classRel, idxid, false);
|
||||||
index_close(idx, NoLock);
|
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);
|
heap_close(classRel, RowExclusiveLock);
|
||||||
|
|
||||||
|
@ -1387,3 +1387,18 @@ DETAIL: Key (a)=(4) already exists.
|
|||||||
create unique index on covidxpart (b) include (a); -- should fail
|
create unique index on covidxpart (b) include (a); -- should fail
|
||||||
ERROR: insufficient columns in UNIQUE constraint definition
|
ERROR: insufficient columns in UNIQUE constraint definition
|
||||||
DETAIL: UNIQUE constraint on table "covidxpart" lacks column "a" which is part of the partition key.
|
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;
|
||||||
|
@ -740,3 +740,17 @@ alter table covidxpart attach partition covidxpart4 for values in (4);
|
|||||||
insert into covidxpart values (4, 1);
|
insert into covidxpart values (4, 1);
|
||||||
insert into covidxpart values (4, 1);
|
insert into covidxpart values (4, 1);
|
||||||
create unique index on covidxpart (b) include (a); -- should fail
|
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;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user