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.c79
1 files changed, 43 insertions, 36 deletions
diff --git a/src/backend/optimizer/path/indxpath.c b/src/backend/optimizer/path/indxpath.c
index 9319f8c1474..ace494ba20b 100644
--- a/src/backend/optimizer/path/indxpath.c
+++ b/src/backend/optimizer/path/indxpath.c
@@ -9,7 +9,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/optimizer/path/indxpath.c,v 1.142 2003/05/28 16:03:56 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/optimizer/path/indxpath.c,v 1.143 2003/05/28 22:32:49 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -417,10 +417,11 @@ extract_or_indexqual_conditions(RelOptInfo *rel,
IndexOptInfo *index,
Expr *orsubclause)
{
- List *quals = NIL;
+ FastList quals;
int indexcol = 0;
Oid *classes = index->classlist;
+ FastListInit(&quals);
/*
* Extract relevant indexclauses in indexkey order. This is
* essentially just like group_clauses_by_indexkey() except that the
@@ -430,9 +431,10 @@ extract_or_indexqual_conditions(RelOptInfo *rel,
do
{
Oid curClass = classes[0];
- List *clausegroup = NIL;
+ FastList clausegroup;
List *item;
+ FastListInit(&clausegroup);
if (and_clause((Node *) orsubclause))
{
foreach(item, ((BoolExpr *) orsubclause)->args)
@@ -442,21 +444,23 @@ extract_or_indexqual_conditions(RelOptInfo *rel,
if (match_clause_to_indexcol(rel, index,
indexcol, curClass,
subsubclause))
- clausegroup = nconc(clausegroup,
- expand_indexqual_condition(subsubclause,
- curClass));
+ FastConc(&clausegroup,
+ expand_indexqual_condition(subsubclause,
+ curClass));
}
}
else if (match_clause_to_indexcol(rel, index,
indexcol, curClass,
orsubclause))
- clausegroup = expand_indexqual_condition(orsubclause, curClass);
+ FastConc(&clausegroup,
+ expand_indexqual_condition(orsubclause,
+ curClass));
/*
* If we found no clauses for this indexkey in the OR subclause
* itself, try looking in the rel's top-level restriction list.
*/
- if (clausegroup == NIL)
+ if (FastListValue(&clausegroup) == NIL)
{
foreach(item, rel->baserestrictinfo)
{
@@ -465,9 +469,9 @@ extract_or_indexqual_conditions(RelOptInfo *rel,
if (match_clause_to_indexcol(rel, index,
indexcol, curClass,
rinfo->clause))
- clausegroup = nconc(clausegroup,
- expand_indexqual_condition(rinfo->clause,
- curClass));
+ FastConc(&clausegroup,
+ expand_indexqual_condition(rinfo->clause,
+ curClass));
}
}
@@ -475,20 +479,20 @@ extract_or_indexqual_conditions(RelOptInfo *rel,
* If still no clauses match this key, we're done; we don't want
* to look at keys to its right.
*/
- if (clausegroup == NIL)
+ if (FastListValue(&clausegroup) == NIL)
break;
- quals = nconc(quals, clausegroup);
+ FastConcFast(&quals, &clausegroup);
indexcol++;
classes++;
} while (!DoneMatchingIndexKeys(classes));
- if (quals == NIL)
+ if (FastListValue(&quals) == NIL)
elog(ERROR, "extract_or_indexqual_conditions: no matching clause");
- return quals;
+ return FastListValue(&quals);
}
@@ -520,7 +524,7 @@ extract_or_indexqual_conditions(RelOptInfo *rel,
static List *
group_clauses_by_indexkey(RelOptInfo *rel, IndexOptInfo *index)
{
- List *clausegroup_list = NIL;
+ FastList clausegroup_list;
List *restrictinfo_list = rel->baserestrictinfo;
int indexcol = 0;
Oid *classes = index->classlist;
@@ -528,12 +532,14 @@ group_clauses_by_indexkey(RelOptInfo *rel, IndexOptInfo *index)
if (restrictinfo_list == NIL)
return NIL;
+ FastListInit(&clausegroup_list);
do
{
Oid curClass = classes[0];
- List *clausegroup = NIL;
+ FastList clausegroup;
List *i;
+ FastListInit(&clausegroup);
foreach(i, restrictinfo_list)
{
RestrictInfo *rinfo = (RestrictInfo *) lfirst(i);
@@ -543,24 +549,24 @@ group_clauses_by_indexkey(RelOptInfo *rel, IndexOptInfo *index)
indexcol,
curClass,
rinfo->clause))
- clausegroup = lappend(clausegroup, rinfo);
+ FastAppend(&clausegroup, rinfo);
}
/*
* If no clauses match this key, we're done; we don't want to look
* at keys to its right.
*/
- if (clausegroup == NIL)
+ if (FastListValue(&clausegroup) == NIL)
break;
- clausegroup_list = lappend(clausegroup_list, clausegroup);
+ FastAppend(&clausegroup_list, FastListValue(&clausegroup));
indexcol++;
classes++;
} while (!DoneMatchingIndexKeys(classes));
- return clausegroup_list;
+ return FastListValue(&clausegroup_list);
}
/*
@@ -580,17 +586,20 @@ static List *
group_clauses_by_indexkey_for_join(RelOptInfo *rel, IndexOptInfo *index,
Relids outer_relids, bool isouterjoin)
{
- List *clausegroup_list = NIL;
+ FastList clausegroup_list;
bool jfound = false;
int indexcol = 0;
Oid *classes = index->classlist;
+ FastListInit(&clausegroup_list);
do
{
Oid curClass = classes[0];
- List *clausegroup = NIL;
+ FastList clausegroup;
List *i;
+ FastListInit(&clausegroup);
+
/* Look for joinclauses that are usable with given outer_relids */
foreach(i, rel->joininfo)
{
@@ -614,7 +623,7 @@ group_clauses_by_indexkey_for_join(RelOptInfo *rel, IndexOptInfo *index,
curClass,
rinfo->clause))
{
- clausegroup = lappend(clausegroup, rinfo);
+ FastAppend(&clausegroup, rinfo);
jfound = true;
}
}
@@ -634,17 +643,17 @@ group_clauses_by_indexkey_for_join(RelOptInfo *rel, IndexOptInfo *index,
indexcol,
curClass,
rinfo->clause))
- clausegroup = lappend(clausegroup, rinfo);
+ FastAppend(&clausegroup, rinfo);
}
/*
* If no clauses match this key, we're done; we don't want to look
* at keys to its right.
*/
- if (clausegroup == NIL)
+ if (FastListValue(&clausegroup) == NIL)
break;
- clausegroup_list = lappend(clausegroup_list, clausegroup);
+ FastAppend(&clausegroup_list, FastListValue(&clausegroup));
indexcol++;
classes++;
@@ -653,12 +662,9 @@ group_clauses_by_indexkey_for_join(RelOptInfo *rel, IndexOptInfo *index,
/* if no join clause was matched then forget it, per comments above */
if (!jfound)
- {
- freeList(clausegroup_list);
return NIL;
- }
- return clausegroup_list;
+ return FastListValue(&clausegroup_list);
}
@@ -1870,12 +1876,13 @@ match_special_index_operator(Expr *clause, Oid opclass,
List *
expand_indexqual_conditions(IndexOptInfo *index, List *clausegroups)
{
- List *resultquals = NIL;
+ FastList resultquals;
Oid *classes = index->classlist;
if (clausegroups == NIL)
return NIL;
+ FastListInit(&resultquals);
do
{
Oid curClass = classes[0];
@@ -1885,9 +1892,9 @@ expand_indexqual_conditions(IndexOptInfo *index, List *clausegroups)
{
RestrictInfo *rinfo = (RestrictInfo *) lfirst(i);
- resultquals = nconc(resultquals,
- expand_indexqual_condition(rinfo->clause,
- curClass));
+ FastConc(&resultquals,
+ expand_indexqual_condition(rinfo->clause,
+ curClass));
}
clausegroups = lnext(clausegroups);
@@ -1898,7 +1905,7 @@ expand_indexqual_conditions(IndexOptInfo *index, List *clausegroups)
Assert(clausegroups == NIL); /* else more groups than indexkeys... */
- return resultquals;
+ return FastListValue(&resultquals);
}
/*