diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c index b3ed69457fc..f78fca03182 100644 --- a/src/backend/commands/tablecmds.c +++ b/src/backend/commands/tablecmds.c @@ -720,7 +720,6 @@ static void QueuePartitionConstraintValidation(List **wqueue, Relation scanrel, List *partConstraint, bool validate_default); static void CloneRowTriggersToPartition(Relation parent, Relation partition); -static void DetachAddConstraintIfNeeded(List **wqueue, Relation partRel); static void DropClonedTriggersFromPartition(Oid partitionId); static ObjectAddress ATExecDetachPartition(List **wqueue, AlteredTableInfo *tab, Relation rel, RangeVar *name, @@ -20869,12 +20868,6 @@ ATExecDetachPartition(List **wqueue, AlteredTableInfo *tab, Relation rel, char *parentrelname; char *partrelname; - /* - * Add a new constraint to the partition being detached, which - * supplants the partition constraint (unless there is one already). - */ - DetachAddConstraintIfNeeded(wqueue, partRel); - /* * We're almost done now; the only traces that remain are the * pg_inherits tuple and the partition's relpartbounds. Before we can @@ -21323,49 +21316,6 @@ ATExecDetachPartitionFinalize(Relation rel, RangeVar *name) return address; } -/* - * DetachAddConstraintIfNeeded - * Subroutine for ATExecDetachPartition. Create a constraint that - * takes the place of the partition constraint, but avoid creating - * a dupe if a constraint already exists which implies the needed - * constraint. - */ -static void -DetachAddConstraintIfNeeded(List **wqueue, Relation partRel) -{ - List *constraintExpr; - - constraintExpr = RelationGetPartitionQual(partRel); - constraintExpr = (List *) eval_const_expressions(NULL, (Node *) constraintExpr); - - /* - * Avoid adding a new constraint if the needed constraint is implied by an - * existing constraint - */ - if (!PartConstraintImpliedByRelConstraint(partRel, constraintExpr)) - { - AlteredTableInfo *tab; - Constraint *n; - - tab = ATGetQueueEntry(wqueue, partRel); - - /* Add constraint on partition, equivalent to the partition constraint */ - n = makeNode(Constraint); - n->contype = CONSTR_CHECK; - n->conname = NULL; - n->location = -1; - n->is_no_inherit = false; - n->raw_expr = NULL; - n->cooked_expr = nodeToString(make_ands_explicit(constraintExpr)); - n->is_enforced = true; - n->initially_valid = true; - n->skip_validation = true; - /* It's a re-add, since it nominally already exists */ - ATAddCheckNNConstraint(wqueue, tab, partRel, n, - true, false, true, ShareUpdateExclusiveLock); - } -} - /* * DropClonedTriggersFromPartition * subroutine for ATExecDetachPartition to remove any triggers that were diff --git a/src/test/regress/expected/alter_table.out b/src/test/regress/expected/alter_table.out index 476266e3f4b..e2bffc7be21 100644 --- a/src/test/regress/expected/alter_table.out +++ b/src/test/regress/expected/alter_table.out @@ -4472,8 +4472,6 @@ Number of partitions: 0 Column | Type | Collation | Nullable | Default --------+---------+-----------+----------+--------- a | integer | | | -Check constraints: - "part_rp_a_check" CHECK (a IS NOT NULL AND a >= 0 AND a < 100) CREATE TABLE part_rp100 PARTITION OF range_parted2 (CHECK (a>=123 AND a<133 AND a IS NOT NULL)) FOR VALUES FROM (100) to (200); ALTER TABLE range_parted2 DETACH PARTITION part_rp100 CONCURRENTLY; @@ -4487,6 +4485,30 @@ Check constraints: "part_rp100_a_check" CHECK (a >= 123 AND a < 133 AND a IS NOT NULL) DROP TABLE range_parted2; +CREATE TABLE hash_parted2 ( + a int +) PARTITION BY HASH(a); +CREATE TABLE part_hp PARTITION OF hash_parted2 FOR VALUES WITH (MODULUS 2, REMAINDER 0); +ALTER TABLE hash_parted2 DETACH PARTITION part_hp CONCURRENTLY; +\d+ hash_parted2 + Partitioned table "public.hash_parted2" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+---------+-----------+----------+---------+---------+--------------+------------- + a | integer | | | | plain | | +Partition key: HASH (a) +Number of partitions: 0 + +-- constraint should not be created +\d part_hp + Table "public.part_hp" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + a | integer | | | + +DROP TABLE hash_parted2; +-- work fine +INSERT INTO part_hp VALUES (1); +DROP TABLE part_hp; -- Check ALTER TABLE commands for partitioned tables and partitions -- cannot add/drop column to/from *only* the parent ALTER TABLE ONLY list_parted2 ADD COLUMN c int; diff --git a/src/test/regress/sql/alter_table.sql b/src/test/regress/sql/alter_table.sql index 5ce9d1e429f..06d4a8be60f 100644 --- a/src/test/regress/sql/alter_table.sql +++ b/src/test/regress/sql/alter_table.sql @@ -2832,6 +2832,19 @@ ALTER TABLE range_parted2 DETACH PARTITION part_rp100 CONCURRENTLY; \d part_rp100 DROP TABLE range_parted2; +CREATE TABLE hash_parted2 ( + a int +) PARTITION BY HASH(a); +CREATE TABLE part_hp PARTITION OF hash_parted2 FOR VALUES WITH (MODULUS 2, REMAINDER 0); +ALTER TABLE hash_parted2 DETACH PARTITION part_hp CONCURRENTLY; +\d+ hash_parted2 +-- constraint should not be created +\d part_hp +DROP TABLE hash_parted2; +-- work fine +INSERT INTO part_hp VALUES (1); +DROP TABLE part_hp; + -- Check ALTER TABLE commands for partitioned tables and partitions -- cannot add/drop column to/from *only* the parent