aboutsummaryrefslogtreecommitdiff
path: root/src/backend/optimizer/path/indxpath.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/optimizer/path/indxpath.c')
-rw-r--r--src/backend/optimizer/path/indxpath.c53
1 files changed, 31 insertions, 22 deletions
diff --git a/src/backend/optimizer/path/indxpath.c b/src/backend/optimizer/path/indxpath.c
index b9ccc770a43..c2fe837db65 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.150 2003/12/18 00:22:12 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/optimizer/path/indxpath.c,v 1.151 2003/12/30 23:53:14 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -64,9 +64,11 @@ static List *group_clauses_by_indexkey_for_join(Query *root,
Relids outer_relids,
JoinType jointype, bool isouterjoin);
static bool match_clause_to_indexcol(RelOptInfo *rel, IndexOptInfo *index,
- int indexcol, Oid opclass, Expr *clause);
+ int indexcol, Oid opclass,
+ Expr *clause, RestrictInfo *rinfo);
static bool match_join_clause_to_indexcol(RelOptInfo *rel, IndexOptInfo *index,
- int indexcol, Oid opclass, Expr *clause);
+ int indexcol, Oid opclass,
+ RestrictInfo *rinfo);
static Oid indexable_operator(Expr *clause, Oid opclass,
bool indexkey_on_left);
static bool pred_test(List *predicate_list, List *restrictinfo_list,
@@ -374,14 +376,14 @@ match_or_subclause_to_indexkey(RelOptInfo *rel,
foreach(item, ((BoolExpr *) clause)->args)
{
if (match_clause_to_indexcol(rel, index, 0, opclass,
- lfirst(item)))
+ lfirst(item), NULL))
return true;
}
return false;
}
else
return match_clause_to_indexcol(rel, index, 0, opclass,
- clause);
+ clause, NULL);
}
/*----------
@@ -445,7 +447,7 @@ extract_or_indexqual_conditions(RelOptInfo *rel,
if (match_clause_to_indexcol(rel, index,
indexcol, curClass,
- subsubclause))
+ subsubclause, NULL))
FastConc(&clausegroup,
expand_indexqual_condition(subsubclause,
curClass));
@@ -453,7 +455,7 @@ extract_or_indexqual_conditions(RelOptInfo *rel,
}
else if (match_clause_to_indexcol(rel, index,
indexcol, curClass,
- orsubclause))
+ orsubclause, NULL))
FastConc(&clausegroup,
expand_indexqual_condition(orsubclause,
curClass));
@@ -470,7 +472,7 @@ extract_or_indexqual_conditions(RelOptInfo *rel,
if (match_clause_to_indexcol(rel, index,
indexcol, curClass,
- rinfo->clause))
+ rinfo->clause, rinfo))
FastConc(&clausegroup,
expand_indexqual_condition(rinfo->clause,
curClass));
@@ -550,7 +552,8 @@ group_clauses_by_indexkey(RelOptInfo *rel, IndexOptInfo *index)
index,
indexcol,
curClass,
- rinfo->clause))
+ rinfo->clause,
+ rinfo))
FastAppend(&clausegroup, rinfo);
}
@@ -625,7 +628,8 @@ group_clauses_by_indexkey_for_join(Query *root,
index,
indexcol,
curClass,
- rinfo->clause))
+ rinfo->clause,
+ rinfo))
FastAppend(&clausegroup, rinfo);
}
@@ -654,7 +658,7 @@ group_clauses_by_indexkey_for_join(Query *root,
index,
indexcol,
curClass,
- rinfo->clause))
+ rinfo))
{
FastAppend(&clausegroup, rinfo);
if (!jfoundhere)
@@ -726,6 +730,7 @@ group_clauses_by_indexkey_for_join(Query *root,
* 'indexcol' is a column number of 'index' (counting from 0).
* 'opclass' is the corresponding operator class.
* 'clause' is the clause to be tested.
+ * 'rinfo' is the clause's RestrictInfo, if available (NULL if not).
*
* Returns true if the clause can be used with this index key.
*
@@ -737,7 +742,8 @@ match_clause_to_indexcol(RelOptInfo *rel,
IndexOptInfo *index,
int indexcol,
Oid opclass,
- Expr *clause)
+ Expr *clause,
+ RestrictInfo *rinfo)
{
Node *leftop,
*rightop;
@@ -754,9 +760,13 @@ match_clause_to_indexcol(RelOptInfo *rel,
* Check for clauses of the form: (indexkey operator constant) or
* (constant operator indexkey). Anything that is a "pseudo constant"
* expression will do.
+ *
+ * If we have the RestrictInfo available, we can make a more efficient
+ * test for pseudo-constness.
*/
if (match_index_to_operand(leftop, indexcol, rel, index) &&
- is_pseudo_constant_clause(rightop))
+ (rinfo ? is_pseudo_constant_clause_relids(rightop, rinfo->right_relids)
+ : is_pseudo_constant_clause(rightop)))
{
if (is_indexable_operator(clause, opclass, true))
return true;
@@ -771,7 +781,8 @@ match_clause_to_indexcol(RelOptInfo *rel,
}
if (match_index_to_operand(rightop, indexcol, rel, index) &&
- is_pseudo_constant_clause(leftop))
+ (rinfo ? is_pseudo_constant_clause_relids(leftop, rinfo->left_relids)
+ : is_pseudo_constant_clause(leftop)))
{
if (is_indexable_operator(clause, opclass, false))
return true;
@@ -813,7 +824,7 @@ match_clause_to_indexcol(RelOptInfo *rel,
* 'index' is an index on 'rel'.
* 'indexcol' is a column number of 'index' (counting from 0).
* 'opclass' is the corresponding operator class.
- * 'clause' is the clause to be tested.
+ * 'rinfo' is the clause to be tested (as a RestrictInfo node).
*
* Returns true if the clause can be used with this index key.
*
@@ -825,8 +836,9 @@ match_join_clause_to_indexcol(RelOptInfo *rel,
IndexOptInfo *index,
int indexcol,
Oid opclass,
- Expr *clause)
+ RestrictInfo *rinfo)
{
+ Expr *clause = rinfo->clause;
Node *leftop,
*rightop;
@@ -846,27 +858,25 @@ match_join_clause_to_indexcol(RelOptInfo *rel,
*/
if (match_index_to_operand(leftop, indexcol, rel, index))
{
- Relids othervarnos = pull_varnos(rightop);
+ Relids othervarnos = rinfo->right_relids;
bool isIndexable;
isIndexable =
!bms_overlap(rel->relids, othervarnos) &&
!contain_volatile_functions(rightop) &&
is_indexable_operator(clause, opclass, true);
- bms_free(othervarnos);
return isIndexable;
}
if (match_index_to_operand(rightop, indexcol, rel, index))
{
- Relids othervarnos = pull_varnos(leftop);
+ Relids othervarnos = rinfo->left_relids;
bool isIndexable;
isIndexable =
!bms_overlap(rel->relids, othervarnos) &&
!contain_volatile_functions(leftop) &&
is_indexable_operator(clause, opclass, false);
- bms_free(othervarnos);
return isIndexable;
}
@@ -1351,7 +1361,6 @@ indexable_outerrelids(RelOptInfo *rel, IndexOptInfo *index)
foreach(j, joininfo->jinfo_restrictinfo)
{
RestrictInfo *rinfo = (RestrictInfo *) lfirst(j);
- Expr *clause = rinfo->clause;
int indexcol = 0;
Oid *classes = index->classlist;
@@ -1363,7 +1372,7 @@ indexable_outerrelids(RelOptInfo *rel, IndexOptInfo *index)
index,
indexcol,
curClass,
- clause))
+ rinfo))
{
match_found = true;
break;