• Tom Lane's avatar
    Fix hash partition pruning with asymmetric partition sets. · 1d9351a8
    Tom Lane authored
    perform_pruning_combine_step() was not taught about the number of
    partition indexes used in hash partitioning; more embarrassingly,
    get_matching_hash_bounds() also had it wrong.  These errors are masked
    in the common case where all the partitions have the same modulus
    and no partition is missing.  However, with missing or unequal-size
    partitions, we could erroneously prune some partitions that need
    to be scanned, leading to silently wrong query answers.
    
    While a minimal-footprint fix for this could be to export
    get_partition_bound_num_indexes and make the incorrect functions use it,
    I'm of the opinion that that function should never have existed in the
    first place.  It's not reasonable data structure design that
    PartitionBoundInfoData lacks any explicit record of the length of
    its indexes[] array.  Perhaps that was all right when it could always
    be assumed equal to ndatums, but something should have been done about
    it as soon as that stopped being true.  Putting in an explicit
    "nindexes" field makes both partition_bounds_equal() and
    partition_bounds_copy() simpler, safer, and faster than before,
    and removes explicit knowledge of the number-of-partition-indexes
    rules from some other places too.
    
    This change also makes get_hash_partition_greatest_modulus obsolete.
    I left that in place in case any external code uses it, but no core
    code does anymore.
    
    Per bug #16840 from Michał Albrycht.  Back-patch to v11 where the
    hash partitioning code came in.  (In the back branches, add the new
    field at the end of PartitionBoundInfoData to minimize ABI risks.)
    
    Discussion: https://postgr.es/m/16840-571a22976f829ad4@postgresql.org
    1d9351a8
execPartition.c 68.9 KB