• Michael Paquier's avatar
    Fix dependency handling of partitions and inheritance for ON COMMIT · 319a8101
    Michael Paquier authored
    This commit fixes a set of issues with ON COMMIT actions when used on
    partitioned tables and tables with inheritance children:
    - Applying ON COMMIT DROP on a partitioned table with partitions or on a
    table with inheritance children caused a failure at commit time, with
    complains about the children being already dropped as all relations are
    dropped one at the same time.
    - Applying ON COMMIT DELETE on a partition relying on a partitioned
    table which uses ON COMMIT DROP would cause the partition truncation to
    fail as the parent is removed first.
    
    The solution to the first problem is to handle the removal of all the
    dependencies in one go instead of dropping relations one-by-one, based
    on a suggestion from Álvaro Herrera.  So instead all the relation OIDs
    to remove are gathered and then processed in one round of multiple
    deletions.
    
    The solution to the second problem is to reorder the actions, with
    truncation happening first and relation drop done after.  Even if it
    means that a partition could be first truncated, then immediately
    dropped if its partitioned table is dropped, this has the merit to keep
    the code simple as there is no need to do existence checks on the
    relations to drop.
    
    Contrary to a manual TRUNCATE on a partitioned table, ON COMMIT DELETE
    does not cascade to its partitions.  The ON COMMIT action defined on
    each partition gets the priority.
    
    Author: Michael Paquier
    Reviewed-by: Amit Langote, Álvaro Herrera, Robert Haas
    Discussion: https://postgr.es/m/68f17907-ec98-1192-f99f-8011400517f5@lab.ntt.co.jp
    Backpatch-through: 10
    319a8101
temp.sql 5.79 KB