• Tomas Vondra's avatar
    Fix choose_best_statistics to check clauses individually · c676e659
    Tomas Vondra authored
    When picking the best extended statistics object for a list of clauses,
    it's not enough to look at attnums extracted from the clause list as a
    whole. Consider for example this query with OR clauses:
    
       SELECT * FROM t WHERE (t.a = 1) OR (t.b = 1) OR (t.c = 1)
    
    with a statistics defined on columns (a,b). Relying on attnums extracted
    from the whole OR clause, we'd consider the statistics usable. That does
    not work, as we see the conditions as a single OR-clause, referencing an
    attribute not covered by the statistic, leading to empty list of clauses
    to be estimated using the statistics and an assert failure.
    
    This changes choose_best_statistics to check which clauses are actually
    covered, and only using attributes from the fully covered ones. For the
    previous example this means the statistics object will not be considered
    as compatible with the OR-clause.
    
    Backpatch to 12, where MCVs were introduced. The issue does not affect
    older versions because functional dependencies don't handle OR clauses.
    
    Author: Tomas Vondra
    Reviewed-by: Dean Rasheed
    Reported-By: Manuel Rigger
    Discussion: https://postgr.es/m/CA+u7OA7H5rcE2=8f263w4NZD6ipO_XOrYB816nuLXbmSTH9pQQ@mail.gmail.com
    Backpatch-through: 12
    c676e659
statistics.h 4.44 KB