aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2012-02-28 18:10:40 -0500
committerTom Lane <tgl@sss.pgh.pa.us>2012-02-28 18:10:40 -0500
commit0140a11b9ba5b22e1e4807e178bca770d46c3e28 (patch)
tree8a3fad77d82609258449d6a89939edc73f5a7655 /src
parent973e9fb294dc05a384ecae7623923ae53cb81806 (diff)
downloadpostgresql-0140a11b9ba5b22e1e4807e178bca770d46c3e28.tar.gz
postgresql-0140a11b9ba5b22e1e4807e178bca770d46c3e28.zip
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.
Diffstat (limited to 'src')
-rw-r--r--src/backend/optimizer/path/indxpath.c8
1 files 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 */