• Alvaro Herrera's avatar
    ALTER TABLE ... DETACH PARTITION ... CONCURRENTLY · 71f4c8c6
    Alvaro Herrera authored
    Allow a partition be detached from its partitioned table without
    blocking concurrent queries, by running in two transactions and only
    requiring ShareUpdateExclusive in the partitioned table.
    
    Because it runs in two transactions, it cannot be used in a transaction
    block.  This is the main reason to use dedicated syntax: so that users
    can choose to use the original mode if they need it.  But also, it
    doesn't work when a default partition exists (because an exclusive lock
    would still need to be obtained on it, in order to change its partition
    constraint.)
    
    In case the second transaction is cancelled or a crash occurs, there's
    ALTER TABLE .. DETACH PARTITION .. FINALIZE, which executes the final
    steps.
    
    The main trick to make this work is the addition of column
    pg_inherits.inhdetachpending, initially false; can only be set true in
    the first part of this command.  Once that is committed, concurrent
    transactions that use a PartitionDirectory will include or ignore
    partitions so marked: in optimizer they are ignored if the row is marked
    committed for the snapshot; in executor they are always included.  As a
    result, and because of the way PartitionDirectory caches partition
    descriptors, queries that were planned before the detach will see the
    rows in the detached partition and queries that are planned after the
    detach, won't.
    
    A CHECK constraint is created that duplicates the partition constraint.
    This is probably not strictly necessary, and some users will prefer to
    remove it afterwards, but if the partition is re-attached to a
    partitioned table, the constraint needn't be rechecked.
    
    Author: Álvaro Herrera <alvherre@alvh.no-ip.org>
    Reviewed-by: default avatarAmit Langote <amitlangote09@gmail.com>
    Reviewed-by: default avatarJustin Pryzby <pryzby@telsasoft.com>
    Discussion: https://postgr.es/m/20200803234854.GA24158@alvherre.pgsql
    71f4c8c6
partition-removal-1.out 5.34 KB