• Tom Lane's avatar
    Fix matching of sub-partitions when a partitioned plan is stale. · 7a980dfc
    Tom Lane authored
    Since we no longer require AccessExclusiveLock to add a partition,
    the executor may see that a partitioned table has more partitions
    than the planner saw.  ExecCreatePartitionPruneState's code for
    matching up the partition lists in such cases was faulty, and would
    misbehave if the planner had successfully pruned any partitions from
    the query.  (Thus, trouble would occur only if a partition addition
    happens concurrently with a query that uses both static and dynamic
    partition pruning.)  This led to an Assert failure in debug builds,
    and probably to crashes or query misbehavior in production builds.
    
    To repair the bug, just explicitly skip zeroes in the plan's
    relid_map[] list.  I also made some cosmetic changes to make the code
    more readable (IMO anyway).  Also, convert the cross-checking Assert
    to a regular test-and-elog, since it's now apparent that this logic
    is more fragile than one would like.
    
    Currently, there's no way to repeatably exercise this code, except
    with manual use of a debugger to stop the backend between planning
    and execution.  Hence, no test case in this patch.  We oughta do
    something about that testability gap, but that's for another day.
    
    Amit Langote and Tom Lane, per report from Justin Pryzby.  Oversight
    in commit 898e5e32; backpatch to v12 where that appeared.
    
    Discussion: https://postgr.es/m/20200802181131.GA27754@telsasoft.com
    7a980dfc
execPartition.c 66 KB