• David Rowley's avatar
    Fix timing issue with ALTER TABLE's validate constraint · f1fcf2d3
    David Rowley authored
    An ALTER TABLE to validate a foreign key in which another subcommand
    already caused a pending table rewrite could fail due to ALTER TABLE
    attempting to validate the foreign key before the actual table rewrite
    takes place.  This situation could result in an error such as:
    
    ERROR:  could not read block 0 in file "base/nnnnn/nnnnn": read only 0 of 8192 bytes
    
    The failure here was due to the SPI call which validates the foreign key
    trying to access an index which is yet to be rebuilt.
    
    Similarly, we also incorrectly tried to validate CHECK constraints before
    the heap had been rewritten.
    
    The fix for both is to delay constraint validation until phase 3, after
    the table has been rewritten.  For CHECK constraints this means a slight
    behavioral change.  Previously ALTER TABLE VALIDATE CONSTRAINT on
    inheritance tables would be validated from the bottom up.  This was
    different from the order of evaluation when a new CHECK constraint was
    added.  The changes made here aligns the VALIDATE CONSTRAINT evaluation
    order for inheritance tables to be the same as ADD CONSTRAINT, which is
    generally top-down.
    
    Reported-by: Nazli Ugur Koyluoglu, using SQLancer
    Discussion: https://postgr.es/m/CAApHDvp%3DZXv8wiRyk_0rWr00skhGkt8vXDrHJYXRMft3TjkxCA%40mail.gmail.com
    Backpatch-through: 9.5 (all supported versions)
    f1fcf2d3
alter_table.sql 106 KB