Thread

  1. Re: Add SPLIT PARTITION/MERGE PARTITIONS commands

    Dmitry Koval <d.koval@postgrespro.ru> — 2025-06-09T22:48:33Z

    Hi, Jian He!
    
    Thanks for the suggestions and patches!
    This email contains comments to three emails (05/06/2025).
    I hope to read two emails (for 06/06/2025) tomorrow.
    
    1.
     >What should we do when any to be merged partition has constraints?
     >...
     >Maybe this is expected, but we need to mention it somewhere and have
     >some tests on it saying that MERGE PARTITIONS will effectively drop
     >the partitions, so if any object depends on that partition
     >then MERGE PARTITIONS can not be done.
    
    Added following phrases to the documentation (I hope this should be 
    enough?):
    
    If merged partitions have individual constraints, those constraints will 
    be dropped because command uses partitioned table as a model to create 
    the constraints.
    If merged partitions have some objects dependent on them, the command 
    can not be done (CASCADE is not used, an error will be returned).
    
    
    2.
     > ... so this error check can be performed as early as the
     >transformPartitionCmdForMerge stage?
    
    Function createPartitionTable will be used for various other cases 
    besides MERGE PARTITIONS: for SPLIT PARTITION, for PARTITION BY 
    REFERENCE (I hope).
    So I think it's better to minimize the amount of code and not move the 
    same one check into different functions (transformPartitionCmdForMerge, 
    transformPartitionCmdForSplit, ...).
    
    
    3.
     >i think, we can do the following way:
     >if (modelRel->rd_rel->relam)
     >  elog(ERROR, "error");
     >relamId = modelRel->rd_rel->relam;
    
    Can you clarify what is reason to change the current AM-logic for 
    creating a new partition?
    
    +	/* Look up the access method for new relation. */
    +	relamId = (modelRel->rd_rel->relam != InvalidOid) ? 
    modelRel->rd_rel->relam : HEAP_TABLE_AM_OID;
    
    (If AM is set for a partitioned table, then use it, otherwise use AM for 
    heap tables.)
    
    
    4.
     > Attached is some refactoring in moveMergedTablesRows, hope it's 
    straightforward.
    
    Thanks, these changes are useful.
    
    
    5.
     >bug in transformPartitionCmdForMerge "equal(name, name2))"
     > ...
     >ALTER TABLE sales_range MERGE PARTITIONS (sales_feb2022,
     >public.sales_feb2022) INTO sales_feb_mar2022;
     >ERROR:  lower bound of partition "sales_feb2022" conflicts with upper
     >bound of previous partition "sales_feb2022"
     >in this context. "sales_feb2022" is the same as "public.sales_feb2022".
    
    Added check and test for this case.
    
    
    6.
     >When using ALTER TABLE ... MERGE PARTITIONS, some of the new
     >partition's properties will not be inherited from to be merged
     >partitions; instead, they will be directly copied from the root
     >partitioned table.
     >So we need to test this behavior.
     >The attached test file is for test table properties:
     >(COMMENTS, COMPRESSION, DEFAULTS, GENERATED, STATISTICS, STORAGE).
    
    Some tests already exist (GENERATED, DEFAULTS) - see 
    partition_merge.sql, lines after:
    
    +-- Test for:
    +--   * composite partition key;
    +--   * GENERATED column;
    +--   * column with DEFAULT value.
    ...
    
    But the complex test is probably also interesting.
    Test added.
    
    --
    
    Similar changes are made for the second commit (SPLIT PARTITION).
    
    -- 
    With best regards,
    Dmitry Koval
    
    Postgres Professional: http://postgrespro.com