Fix thinko in new match_join_clauses_to_index() logic.
authorTom Lane <tgl@sss.pgh.pa.us>
Tue, 28 Feb 2012 23:10:40 +0000 (18:10 -0500)
committerTom Lane <tgl@sss.pgh.pa.us>
Tue, 28 Feb 2012 23:10:40 +0000 (18:10 -0500)
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

index 82af4942965329f87006d71b9ebef7e868898442..2f088b797879fd67f27b5b8adbcdfce292fce0ea 100644 (file)
@@ -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 */