• Alvaro Herrera's avatar
    Fix relcache inconsistency hazard in partition detach · 8aba9322
    Alvaro Herrera authored
    During queries coming from ri_triggers.c, we need to omit partitions
    that are marked pending detach -- otherwise, the RI query is tricked
    into allowing a row into the referencing table whose corresponding row
    is in the detached partition.  Which is bogus: once the detach operation
    completes, the row becomes an orphan.
    
    However, the code was not doing that in repeatable-read transactions,
    because relcache kept a copy of the partition descriptor that included
    the partition, and used it in the RI query.  This commit changes the
    partdesc cache code to only keep descriptors that aren't dependent on
    a snapshot (namely: those where no detached partition exist, and those
    where detached partitions are included).  When a partdesc-without-
    detached-partitions is requested, we create one afresh each time; also,
    those partdescs are stored in PortalContext instead of
    CacheMemoryContext.
    
    find_inheritance_children gets a new output *detached_exist boolean,
    which indicates whether any partition marked pending-detach is found.
    Its "include_detached" input flag is changed to "omit_detached", because
    that name captures desired the semantics more naturally.
    CreatePartitionDirectory() and RelationGetPartitionDesc() arguments are
    identically renamed.
    
    This was noticed because a buildfarm member that runs with relcache
    clobbering, which would not keep the improperly cached partdesc, broke
    one test, which led us to realize that the expected output of that test
    was bogus.  This commit also corrects that expected output.
    
    Author: Amit Langote <amitlangote09@gmail.com>
    Author: Álvaro Herrera <alvherre@alvh.no-ip.org>
    Discussion: https://postgr.es/m/3269784.1617215412@sss.pgh.pa.us
    8aba9322
execPartition.c 66.8 KB