public inbox for [email protected]  
help / color / mirror / Atom feed
From: jian he <[email protected]>
To: Dmitry Koval <[email protected]>
Cc: Alexander Korotkov <[email protected]>
Cc: [email protected]
Subject: Re: Add SPLIT PARTITION/MERGE PARTITIONS commands
Date: Wed, 20 Aug 2025 17:22:47 +0800
Message-ID: <CACJufxGEa6ZxP6d5VjZ6-Rpx=+u9zEE9ioRZRqQ=d_HYY6+daQ@mail.gmail.com> (raw)
In-Reply-To: <[email protected]>
References: <171085360143.2046436.7217841141682511557.pgcf@coridan.postgresql.org>
	<CACJufxHakPGgUHfe4uThY2u_Hzq3YOP9m4B3gjZUTUm2mbVryA@mail.gmail.com>
	<CACJufxHo0u=PzgCn88VZEW0mtB=JopchqBTESudUMH+HCyiTpg@mail.gmail.com>
	<[email protected]>
	<CACJufxFTiAiN_27FzAE60Hm5yQ124EJ+b1dpNDstcSdCApFzLw@mail.gmail.com>
	<[email protected]>
	<CACJufxHjpdeDtOsmz9TyGX7jFU73LBEjX=JQpRQdAvDadT0coA@mail.gmail.com>
	<[email protected]>
	<CACJufxGSwvUwu2gyZfTzv=3TJ8Zu4=Kq-GB_pg3x5_5dpwYQkA@mail.gmail.com>
	<[email protected]>
	<CACJufxHM0sD8opy2hUxXLcdY3CQOCaMfsQtJs7yF3TS2YxSqKg@mail.gmail.com>
	<[email protected]>
	<CACJufxEWtK3utKjd7yMxRTGE54dJ8B+uigqvt1ocA4Q1mQ8qiQ@mail.gmail.com>
	<[email protected]>
	<CAPpHfdsW5_rFLwTfkYuG42nX5RbJCVhaC2vkn8p5GsT8Lseuyw@mail.gmail.com>
	<[email protected]>

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/[email protected]


Attachments:

  [application/octet-stream] v52-0001-misc-minor-fix.no-cfbot (14.9K, ../CACJufxGEa6ZxP6d5VjZ6-Rpx=+u9zEE9ioRZRqQ=d_HYY6+daQ@mail.gmail.com/2-v52-0001-misc-minor-fix.no-cfbot)
  download

view thread (165+ messages)  latest in thread

reply

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Reply to all the recipients using the --to and --cc options:
  reply via email

  To: [email protected]
  Cc: [email protected], [email protected], [email protected], [email protected]
  Subject: Re: Add SPLIT PARTITION/MERGE PARTITIONS commands
  In-Reply-To: <CACJufxGEa6ZxP6d5VjZ6-Rpx=+u9zEE9ioRZRqQ=d_HYY6+daQ@mail.gmail.com>

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

This inbox is served by agora; see mirroring instructions
for how to clone and mirror all data and code used for this inbox