Re: Add SPLIT PARTITION/MERGE PARTITIONS commands
От | jian he |
---|---|
Тема | Re: Add SPLIT PARTITION/MERGE PARTITIONS commands |
Дата | |
Msg-id | CACJufxGEa6ZxP6d5VjZ6-Rpx=+u9zEE9ioRZRqQ=d_HYY6+daQ@mail.gmail.com обсуждение исходный текст |
Ответ на | Re: Add SPLIT PARTITION/MERGE PARTITIONS commands (Dmitry Koval <d.koval@postgrespro.ru>) |
Ответы |
Re: Add SPLIT PARTITION/MERGE PARTITIONS commands
|
Список | 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
Вложения
В списке pgsql-hackers по дате отправления: