• Alvaro Herrera's avatar
    Fix ALTER TABLE .. ATTACH PARTITION ... DEFAULT · 72cf7f31
    Alvaro Herrera authored
    If the table being attached contained values that contradict the default
    partition's partition constraint, it would fail to complain, because
    CommandCounterIncrement changes in 4dba331c coupled with some bogus
    coding in the existing ValidatePartitionConstraints prevented the
    partition constraint from being validated after all -- or rather, it
    caused to constraint to become an empty one, always succeeding.
    
    Fix by not re-reading the OID of the default partition in
    ATExecAttachPartition.  To forestall similar problems, revise the
    existing code:
    * rename routine from ValidatePartitionConstraints() to
      QueuePartitionConstraintValidation, to better represent what it
      actually does.
    * add an Assert() to make sure that when queueing a constraint for a
      partition we're not overwriting a constraint previously queued.
    * add an Assert() that we don't try to invoke the special-purpose
      validation of the default partition when attaching the default
      partition itself.
    
    While at it, change some loops to obtain partition OIDs from
    partdesc->oids rather than find_all_inheritors; reduce the lock level
    of partitions being scanned from AccessExclusiveLock to ShareLock;
    rewrite QueuePartitionConstraintValidation in a recursive fashion rather
    than repetitive.
    
    Author: Álvaro Herrera.  Tests written by Amit Langote
    Reported-by: Rushabh Lathia
    Diagnosed-by: Kyotaro HORIGUCHI, who also provided the initial fix.
    Reviewed-by: Kyotaro HORIGUCHI, Amit Langote, Jeevan Ladhe
    Discussion: https://postgr.es/m/CAGPqQf0W+v-Ci_qNV_5R3A=Z9LsK4+jO7LzgddRncpp_rrnJqQ@mail.gmail.com
    72cf7f31
alter_table.sql 93.6 KB