• Tom Lane's avatar
    Refactor the representation of indexable clauses in IndexPaths. · 1a8d5afb
    Tom Lane authored
    In place of three separate but interrelated lists (indexclauses,
    indexquals, and indexqualcols), an IndexPath now has one list
    "indexclauses" of IndexClause nodes.  This holds basically the same
    information as before, but in a more useful format: in particular, there
    is now a clear connection between an indexclause (an original restriction
    clause from WHERE or JOIN/ON) and the indexquals (directly usable index
    conditions) derived from it.
    
    We also change the ground rules a bit by mandating that clause commutation,
    if needed, be done up-front so that what is stored in the indexquals list
    is always directly usable as an index condition.  This gets rid of repeated
    re-determination of which side of the clause is the indexkey during costing
    and plan generation, as well as repeated lookups of the commutator
    operator.  To minimize the added up-front cost, the typical case of
    commuting a plain OpExpr is handled by a new special-purpose function
    commute_restrictinfo().  For RowCompareExprs, generating the new clause
    properly commuted to begin with is not really any more complex than before,
    it's just different --- and we can save doing that work twice, as the
    pretty-klugy original implementation did.
    
    Tracking the connection between original and derived clauses lets us
    also track explicitly whether the derived clauses are an exact or lossy
    translation of the original.  This provides a cheap solution to getting
    rid of unnecessary rechecks of boolean index clauses, which previously
    seemed like it'd be more expensive than it was worth.
    
    Another pleasant (IMO) side-effect is that EXPLAIN now always shows
    index clauses with the indexkey on the left; this seems less confusing.
    
    This commit leaves expand_indexqual_conditions() and some related
    functions in a slightly messy state.  I didn't bother to change them
    any more than minimally necessary to work with the new data structure,
    because all that code is going to be refactored out of existence in
    a follow-on patch.
    
    Discussion: https://postgr.es/m/22182.1549124950@sss.pgh.pa.us
    1a8d5afb
join.out 229 KB