0001_master_fix_detach_partition_concurrently_issue.patch
application/octet-stream
Filename: 0001_master_fix_detach_partition_concurrently_issue.patch
Type: application/octet-stream
Part: 0
Patch
Same data as JSON:
GET /api/v1/attachments/:id/patch
the parsed metadata as JSON — format, series position, per-file stats; never the diff bytes.
API reference →
Format: unified
| File | + | − |
|---|---|---|
| src/backend/commands/tablecmds.c | 0 | 50 |
| src/test/regress/expected/alter_table.out | 24 | 2 |
| src/test/regress/sql/alter_table.sql | 13 | 0 |
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