From: | jian he <jian(dot)universality(at)gmail(dot)com> |
---|---|
To: | Dmitry Koval <d(dot)koval(at)postgrespro(dot)ru> |
Cc: | Alexander Korotkov <aekorotkov(at)gmail(dot)com>, pgsql-hackers(at)lists(dot)postgresql(dot)org |
Subject: | Re: Add SPLIT PARTITION/MERGE PARTITIONS commands |
Date: | 2025-08-20 09:22:47 |
Message-ID: | CACJufxGEa6ZxP6d5VjZ6-Rpx=+u9zEE9ioRZRqQ=d_HYY6+daQ@mail.gmail.com |
Views: | Whole Thread | Raw Message | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-hackers |
hi.
this time, I only checked
v52-0001-Implement-ALTER-TABLE-.-MERGE-PARTITIONS-.-comma.patch
typedef struct PartitionCmd
{
NodeTag type;
RangeVar *name; /* name of partition to attach/detach/merge */
PartitionBoundSpec *bound; /* FOR VALUES, if attaching */
List *partlist; /* list of partitions, for MERGE PARTITION
* command */
bool concurrent;
} PartitionCmd;
The field "partlist" comments are not very helpful, IMO.
I think the following is more descriptive.
/* list of partitions to be merged, used only in ALTER TABLE MERGE PARTITION */
+ /*
+ * Search DEFAULT partition in the list. Open and lock partitions
+ * before calculating the boundary for resulting partition, we also
+ * check for ownership along the way. We need to use
+ * AccessExclusiveLock here, because these merged partitions will be
+ * detached then dropped in ATExecMergePartitions.
+ */
+ partOid = RangeVarGetRelidExtended(name,
+ AccessExclusiveLock,
+ false,
+ RangeVarCallbackOwnsRelation,
+ NULL);
here "false" should be "0"?
+ /* Ranges of partitions should not overlap. */
+ for (i = 1; i < nparts; i++)
+ {
+ int index = lower_bounds[i]->index;
+ int prev_index = lower_bounds[i - 1]->index;
+ check_two_partitions_bounds_range(parent,
+ (RangeVar *) list_nth(partNames, prev_index),
+ (PartitionBoundSpec *) list_nth(bounds, prev_index),
+ (RangeVar *) list_nth(partNames, index),
+ (PartitionBoundSpec *) list_nth(bounds, index),
+ pstate);
+ }
the comment should be
+ /* Ranges of partitions should be adjacent */
--- a/src/backend/catalog/heap.c
+++ b/src/backend/catalog/heap.c
@@ -102,11 +102,11 @@ static ObjectAddress AddNewRelationType(const
char *typeName,
Oid new_row_type,
Oid new_array_type);
static void RelationRemoveInheritance(Oid relid);
+static void StoreConstraints(Relation rel, List *cooked_constraints,
+ bool is_internal);
-static void StoreConstraints(Relation rel, List *cooked_constraints,
- bool is_internal);
Is this change necessary?
in createPartitionTable
+ /* Create the relation. */
+ newRelId = heap_create_with_catalog(newPartName->relname,
+ namespaceId,
+ parent_rel->rd_rel->reltablespace,
....
+ newPartName->relpersistence,
....
+
+ /*
+ * We intended to create the partition with the same persistence as the
+ * parent table, but we still need to recheck because that might be
+ * affected by the search_path. If the parent is permanent, so must be
+ * all of its partitions.
+ */
+ if (parent_rel->rd_rel->relpersistence != RELPERSISTENCE_TEMP &&
+ newRel->rd_rel->relpersistence == RELPERSISTENCE_TEMP)
+ ereport(ERROR,
+ errcode(ERRCODE_WRONG_OBJECT_TYPE),
+ errmsg("cannot create a temporary relation as partition of permanent
relation \"%s\"",
+ RelationGetRelationName(parent_rel)));
+
+ /* Permanent rels cannot be partitions belonging to temporary parent */
+ if (newRel->rd_rel->relpersistence != RELPERSISTENCE_TEMP &&
+ parent_rel->rd_rel->relpersistence == RELPERSISTENCE_TEMP)
+ ereport(ERROR,
+ errcode(ERRCODE_WRONG_OBJECT_TYPE),
+ errmsg("cannot create a permanent relation as partition of temporary
relation \"%s\"",
+ RelationGetRelationName(parent_rel)));
i raised this question in [1], you replied at [2].
I still think it's not intuitive.
parent->relpersistence is fixed. and newRel->relpersistence is the same as
the same as newPartName->relpersistence, see heap_create_with_catalog.
These relpersistence error checks can happen before heap_create_with_catalog.
I added a regress test for src/test/modules/test_ddl_deparse.
I refactored regress to make
src/test/regress/expected/partition_merge.out less verbose.
[1] https://postgr.es/m/CACJufxHM0sD8opy2hUxXLcdY3CQOCaMfsQtJs7yF3TS2YxSqKg@mail.gmail.com
[2] https://postgr.es/m/195b67ee-ef41-4451-9396-844442eef1a4@postgrespro.ru
Attachment | Content-Type | Size |
---|---|---|
v52-0001-misc-minor-fix.no-cfbot | application/octet-stream | 14.9 KB |
From | Date | Subject | |
---|---|---|---|
Next Message | Alaa Attya | 2025-08-20 10:05:01 | Add ALTER INDEX ENABLE/DISABLE for Temporarily Disabling Indexes |
Previous Message | Chao Li | 2025-08-20 09:18:53 | Re: Remove redundant assignment of a variable in function AlterPublicationTables |