summaryrefslogtreecommitdiff
path: root/src/backend/optimizer/path
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/optimizer/path')
-rw-r--r--src/backend/optimizer/path/indxpath.c30
-rw-r--r--src/backend/optimizer/path/orindxpath.c22
2 files changed, 24 insertions, 28 deletions
diff --git a/src/backend/optimizer/path/indxpath.c b/src/backend/optimizer/path/indxpath.c
index 3100c92d3d8..856e399fa2e 100644
--- a/src/backend/optimizer/path/indxpath.c
+++ b/src/backend/optimizer/path/indxpath.c
@@ -9,7 +9,7 @@
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/optimizer/path/indxpath.c,v 1.227.2.1 2008/09/12 14:56:19 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/optimizer/path/indxpath.c,v 1.227.2.2 2009/04/16 20:42:28 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -2254,11 +2254,7 @@ expand_indexqual_conditions(IndexOptInfo *index, List *clausegroups)
if (boolqual)
{
resultquals = lappend(resultquals,
- make_restrictinfo(boolqual,
- true,
- false,
- false,
- NULL));
+ make_simple_restrictinfo(boolqual));
continue;
}
}
@@ -2289,11 +2285,7 @@ expand_indexqual_conditions(IndexOptInfo *index, List *clausegroups)
{
Assert(index->amsearchnulls);
resultquals = lappend(resultquals,
- make_restrictinfo(clause,
- true,
- false,
- false,
- NULL));
+ make_simple_restrictinfo(clause));
}
else
elog(ERROR, "unsupported indexqual type: %d",
@@ -2652,7 +2644,7 @@ expand_indexqual_rowcompare(RestrictInfo *rinfo,
matching_cols);
rc->rargs = list_truncate((List *) copyObject(clause->rargs),
matching_cols);
- return make_restrictinfo((Expr *) rc, true, false, false, NULL);
+ return make_simple_restrictinfo((Expr *) rc);
}
else
{
@@ -2661,7 +2653,7 @@ expand_indexqual_rowcompare(RestrictInfo *rinfo,
opexpr = make_opclause(linitial_oid(new_ops), BOOLOID, false,
copyObject(linitial(clause->largs)),
copyObject(linitial(clause->rargs)));
- return make_restrictinfo(opexpr, true, false, false, NULL);
+ return make_simple_restrictinfo(opexpr);
}
}
@@ -2749,7 +2741,7 @@ prefix_quals(Node *leftop, Oid opfamily,
elog(ERROR, "no = operator for opfamily %u", opfamily);
expr = make_opclause(oproid, BOOLOID, false,
(Expr *) leftop, (Expr *) prefix_const);
- result = list_make1(make_restrictinfo(expr, true, false, false, NULL));
+ result = list_make1(make_simple_restrictinfo(expr));
return result;
}
@@ -2764,7 +2756,7 @@ prefix_quals(Node *leftop, Oid opfamily,
elog(ERROR, "no >= operator for opfamily %u", opfamily);
expr = make_opclause(oproid, BOOLOID, false,
(Expr *) leftop, (Expr *) prefix_const);
- result = list_make1(make_restrictinfo(expr, true, false, false, NULL));
+ result = list_make1(make_simple_restrictinfo(expr));
/*-------
* If we can create a string larger than the prefix, we can say
@@ -2781,8 +2773,7 @@ prefix_quals(Node *leftop, Oid opfamily,
{
expr = make_opclause(oproid, BOOLOID, false,
(Expr *) leftop, (Expr *) greaterstr);
- result = lappend(result,
- make_restrictinfo(expr, true, false, false, NULL));
+ result = lappend(result, make_simple_restrictinfo(expr));
}
return result;
@@ -2845,7 +2836,7 @@ network_prefix_quals(Node *leftop, Oid expr_op, Oid opfamily, Datum rightop)
(Expr *) leftop,
(Expr *) makeConst(datatype, -1, -1, opr1right,
false, false));
- result = list_make1(make_restrictinfo(expr, true, false, false, NULL));
+ result = list_make1(make_simple_restrictinfo(expr));
/* create clause "key <= network_scan_last( rightop )" */
@@ -2860,8 +2851,7 @@ network_prefix_quals(Node *leftop, Oid expr_op, Oid opfamily, Datum rightop)
(Expr *) leftop,
(Expr *) makeConst(datatype, -1, -1, opr2right,
false, false));
- result = lappend(result,
- make_restrictinfo(expr, true, false, false, NULL));
+ result = lappend(result, make_simple_restrictinfo(expr));
return result;
}
diff --git a/src/backend/optimizer/path/orindxpath.c b/src/backend/optimizer/path/orindxpath.c
index 1556bf74df6..c13a48d46b6 100644
--- a/src/backend/optimizer/path/orindxpath.c
+++ b/src/backend/optimizer/path/orindxpath.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/optimizer/path/orindxpath.c,v 1.84 2008/01/09 20:42:27 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/optimizer/path/orindxpath.c,v 1.84.2.1 2009/04/16 20:42:28 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -89,12 +89,18 @@ create_or_index_quals(PlannerInfo *root, RelOptInfo *rel)
ListCell *i;
/*
- * Find potentially interesting OR joinclauses. Note we must ignore any
- * joinclauses that are marked outerjoin_delayed or !is_pushed_down,
- * because they cannot be pushed down to the per-relation level due to
- * outer-join rules. (XXX in some cases it might be possible to allow
- * this, but it would require substantially more bookkeeping about where
- * the clause came from.)
+ * Find potentially interesting OR joinclauses.
+ *
+ * We must ignore clauses for which the target rel is in nullable_relids;
+ * that means there's an outer join below the clause and so it can't be
+ * enforced at the relation scan level.
+ *
+ * We must also ignore clauses that are marked !is_pushed_down (ie they
+ * are themselves outer-join clauses). It would be safe to extract an
+ * index condition from such a clause if we are within the nullable rather
+ * than the non-nullable side of its join, but we haven't got enough
+ * context here to tell which applies. OR clauses in outer-join quals
+ * aren't exactly common, so we'll let that case go unoptimized for now.
*/
foreach(i, rel->joininfo)
{
@@ -102,7 +108,7 @@ create_or_index_quals(PlannerInfo *root, RelOptInfo *rel)
if (restriction_is_or_clause(rinfo) &&
rinfo->is_pushed_down &&
- !rinfo->outerjoin_delayed)
+ !bms_is_member(rel->relid, rinfo->nullable_relids))
{
/*
* Use the generate_bitmap_or_paths() machinery to estimate the