postgres.git / summary / log / commit / refs

commit    0140a11b9ba5b22e1e4807e178bca770d46c3e28
Author:   Tom Lane <tgl@sss.pgh.pa.us>
Date:     Tue Feb 28 23:10:40 2012 +0000
First released in: 9.2.0

    Fix thinko in new match_join_clauses_to_index() logic.
    
    We don't need to constrain the other side of an indexable join clause to
    not be below an outer join; an example here is
    
    SELECT FROM t1 LEFT JOIN t2 ON t1.a = t2.b LEFT JOIN t3 ON t2.c = t3.d;
    
    We can consider an inner indexscan on t3.d using c = d as indexqual, even
    though t2.c is potentially nulled by a previous outer join.  The comparable
    logic in orindxpath.c has always worked that way, but I was being overly
    cautious here.


src/backend/optimizer/path/indxpath.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/backend/optimizer/path/indxpath.c b/src/backend/optimizer/path/indxpath.c index 82af4942965..2f088b79787 100644 --- a/src/backend/optimizer/path/indxpath.c +++ b/src/backend/optimizer/path/indxpath.c @@ -1702,9 +1702,9 @@ match_join_clauses_to_index(PlannerInfo *root, * outer join rules. * * Instead of considering required_relids, we ignore clauses for which - * any referenced rel is in nullable_relids; that means there's an - * outer join below the clause and so it can't be checked at the - * relation scan level. + * the indexed rel is in nullable_relids; that means there's an outer + * join below the clause and so it can't be checked at the relation + * scan level. * * Note: unlike create_or_index_quals(), we can accept clauses that * are marked !is_pushed_down (ie they are themselves outer-join @@ -1712,7 +1712,7 @@ match_join_clauses_to_index(PlannerInfo *root, * could only be used in the inside of a nestloop join, which will be * the nullable side. */ - if (bms_overlap(rinfo->clause_relids, rinfo->nullable_relids)) + if (bms_overlap(rel->relids, rinfo->nullable_relids)) continue; /* Potentially usable, so see if it matches the index or is an OR */ [parent: 973e9fb294dc]