aboutsummaryrefslogtreecommitdiff
path: root/src/backend/optimizer/util/clauses.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/optimizer/util/clauses.c')
-rw-r--r--src/backend/optimizer/util/clauses.c93
1 files changed, 51 insertions, 42 deletions
diff --git a/src/backend/optimizer/util/clauses.c b/src/backend/optimizer/util/clauses.c
index 4d51e7ffbc0..0c2e652c795 100644
--- a/src/backend/optimizer/util/clauses.c
+++ b/src/backend/optimizer/util/clauses.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/optimizer/util/clauses.c,v 1.137 2003/05/28 16:03:56 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/optimizer/util/clauses.c,v 1.138 2003/05/28 22:32:49 tgl Exp $
*
* HISTORY
* AUTHOR DATE MAJOR EVENT
@@ -771,21 +771,24 @@ is_pseudo_constant_clause(Node *clause)
List *
pull_constant_clauses(List *quals, List **constantQual)
{
- List *constqual = NIL;
- List *restqual = NIL;
+ FastList constqual,
+ restqual;
List *q;
+ FastListInit(&constqual);
+ FastListInit(&restqual);
+
foreach(q, quals)
{
Node *qual = (Node *) lfirst(q);
if (is_pseudo_constant_clause(qual))
- constqual = lappend(constqual, qual);
+ FastAppend(&constqual, qual);
else
- restqual = lappend(restqual, qual);
+ FastAppend(&restqual, qual);
}
- *constantQual = constqual;
- return restqual;
+ *constantQual = FastListValue(&constqual);
+ return FastListValue(&restqual);
}
@@ -1187,16 +1190,17 @@ eval_const_expressions_mutator(Node *node, List *active_fns)
* when no input is TRUE and at least one is NULL.
*----------
*/
- List *newargs = NIL;
+ FastList newargs;
List *arg;
bool haveNull = false;
bool forceTrue = false;
+ FastListInit(&newargs);
foreach(arg, args)
{
if (!IsA(lfirst(arg), Const))
{
- newargs = lappend(newargs, lfirst(arg));
+ FastAppend(&newargs, lfirst(arg));
continue;
}
const_input = (Const *) lfirst(arg);
@@ -1217,15 +1221,15 @@ eval_const_expressions_mutator(Node *node, List *active_fns)
if (forceTrue)
return MAKEBOOLCONST(true, false);
if (haveNull)
- newargs = lappend(newargs, MAKEBOOLCONST(false, true));
+ FastAppend(&newargs, MAKEBOOLCONST(false, true));
/* If all the inputs are FALSE, result is FALSE */
- if (newargs == NIL)
+ if (FastListValue(&newargs) == NIL)
return MAKEBOOLCONST(false, false);
/* If only one nonconst-or-NULL input, it's the result */
- if (lnext(newargs) == NIL)
- return (Node *) lfirst(newargs);
+ if (lnext(FastListValue(&newargs)) == NIL)
+ return (Node *) lfirst(FastListValue(&newargs));
/* Else we still need an OR node */
- return (Node *) make_orclause(newargs);
+ return (Node *) make_orclause(FastListValue(&newargs));
}
case AND_EXPR:
{
@@ -1239,16 +1243,17 @@ eval_const_expressions_mutator(Node *node, List *active_fns)
* when no input is FALSE and at least one is NULL.
*----------
*/
- List *newargs = NIL;
+ FastList newargs;
List *arg;
bool haveNull = false;
bool forceFalse = false;
+ FastListInit(&newargs);
foreach(arg, args)
{
if (!IsA(lfirst(arg), Const))
{
- newargs = lappend(newargs, lfirst(arg));
+ FastAppend(&newargs, lfirst(arg));
continue;
}
const_input = (Const *) lfirst(arg);
@@ -1269,15 +1274,15 @@ eval_const_expressions_mutator(Node *node, List *active_fns)
if (forceFalse)
return MAKEBOOLCONST(false, false);
if (haveNull)
- newargs = lappend(newargs, MAKEBOOLCONST(false, true));
+ FastAppend(&newargs, MAKEBOOLCONST(false, true));
/* If all the inputs are TRUE, result is TRUE */
- if (newargs == NIL)
+ if (FastListValue(&newargs) == NIL)
return MAKEBOOLCONST(true, false);
/* If only one nonconst-or-NULL input, it's the result */
- if (lnext(newargs) == NIL)
- return (Node *) lfirst(newargs);
+ if (lnext(FastListValue(&newargs)) == NIL)
+ return (Node *) lfirst(FastListValue(&newargs));
/* Else we still need an AND node */
- return (Node *) make_andclause(newargs);
+ return (Node *) make_andclause(FastListValue(&newargs));
}
case NOT_EXPR:
Assert(length(args) == 1);
@@ -1370,11 +1375,12 @@ eval_const_expressions_mutator(Node *node, List *active_fns)
*/
CaseExpr *caseexpr = (CaseExpr *) node;
CaseExpr *newcase;
- List *newargs = NIL;
+ FastList newargs;
Node *defresult;
Const *const_input;
List *arg;
+ FastListInit(&newargs);
foreach(arg, caseexpr->args)
{
/* Simplify this alternative's condition and result */
@@ -1387,7 +1393,7 @@ eval_const_expressions_mutator(Node *node, List *active_fns)
if (casewhen->expr == NULL ||
!IsA(casewhen->expr, Const))
{
- newargs = lappend(newargs, casewhen);
+ FastAppend(&newargs, casewhen);
continue;
}
const_input = (Const *) casewhen->expr;
@@ -1399,13 +1405,13 @@ eval_const_expressions_mutator(Node *node, List *active_fns)
* Found a TRUE condition. If it's the first (un-dropped)
* alternative, the CASE reduces to just this alternative.
*/
- if (newargs == NIL)
+ if (FastListValue(&newargs) == NIL)
return (Node *) casewhen->result;
/*
* Otherwise, add it to the list, and drop all the rest.
*/
- newargs = lappend(newargs, casewhen);
+ FastAppend(&newargs, casewhen);
break;
}
@@ -1417,13 +1423,13 @@ eval_const_expressions_mutator(Node *node, List *active_fns)
* If no non-FALSE alternatives, CASE reduces to the default
* result
*/
- if (newargs == NIL)
+ if (FastListValue(&newargs) == NIL)
return defresult;
/* Otherwise we need a new CASE node */
newcase = makeNode(CaseExpr);
newcase->casetype = caseexpr->casetype;
newcase->arg = NULL;
- newcase->args = newargs;
+ newcase->args = FastListValue(&newargs);
newcase->defresult = (Expr *) defresult;
return (Node *) newcase;
}
@@ -1432,9 +1438,10 @@ eval_const_expressions_mutator(Node *node, List *active_fns)
ArrayExpr *arrayexpr = (ArrayExpr *) node;
ArrayExpr *newarray;
bool all_const = true;
- List *newelems = NIL;
+ FastList newelems;
List *element;
+ FastListInit(&newelems);
foreach(element, arrayexpr->elements)
{
Node *e;
@@ -1443,13 +1450,13 @@ eval_const_expressions_mutator(Node *node, List *active_fns)
active_fns);
if (!IsA(e, Const))
all_const = false;
- newelems = lappend(newelems, e);
+ FastAppend(&newelems, e);
}
newarray = makeNode(ArrayExpr);
newarray->array_typeid = arrayexpr->array_typeid;
newarray->element_typeid = arrayexpr->element_typeid;
- newarray->elements = newelems;
+ newarray->elements = FastListValue(&newelems);
newarray->ndims = arrayexpr->ndims;
if (all_const)
@@ -1462,9 +1469,10 @@ eval_const_expressions_mutator(Node *node, List *active_fns)
{
CoalesceExpr *coalesceexpr = (CoalesceExpr *) node;
CoalesceExpr *newcoalesce;
- List *newargs = NIL;
+ FastList newargs;
List *arg;
+ FastListInit(&newargs);
foreach(arg, coalesceexpr->args)
{
Node *e;
@@ -1480,15 +1488,15 @@ eval_const_expressions_mutator(Node *node, List *active_fns)
{
if (((Const *) e)->constisnull)
continue; /* drop null constant */
- if (newargs == NIL)
+ if (FastListValue(&newargs) == NIL)
return e; /* first expr */
}
- newargs = lappend(newargs, e);
+ FastAppend(&newargs, e);
}
newcoalesce = makeNode(CoalesceExpr);
newcoalesce->coalescetype = coalesceexpr->coalescetype;
- newcoalesce->args = newargs;
+ newcoalesce->args = FastListValue(&newargs);
return (Node *) newcoalesce;
}
if (IsA(node, FieldSelect))
@@ -2647,16 +2655,16 @@ expression_tree_mutator(Node *node,
* NOTE: this would fail badly on a list with integer
* elements!
*/
- List *resultlist = NIL;
+ FastList resultlist;
List *temp;
+ FastListInit(&resultlist);
foreach(temp, (List *) node)
{
- resultlist = lappend(resultlist,
- mutator((Node *) lfirst(temp),
- context));
+ FastAppend(&resultlist,
+ mutator((Node *) lfirst(temp), context));
}
- return (Node *) resultlist;
+ return (Node *) FastListValue(&resultlist);
}
break;
case T_FromExpr:
@@ -2739,7 +2747,7 @@ query_tree_mutator(Query *query,
void *context,
int flags)
{
- List *newrt = NIL;
+ FastList newrt;
List *rt;
Assert(query != NULL && IsA(query, Query));
@@ -2757,6 +2765,7 @@ query_tree_mutator(Query *query,
MUTATE(query->setOperations, query->setOperations, Node *);
MUTATE(query->havingQual, query->havingQual, Node *);
MUTATE(query->in_info_list, query->in_info_list, List *);
+ FastListInit(&newrt);
foreach(rt, query->rtable)
{
RangeTblEntry *rte = (RangeTblEntry *) lfirst(rt);
@@ -2791,9 +2800,9 @@ query_tree_mutator(Query *query,
rte = newrte;
break;
}
- newrt = lappend(newrt, rte);
+ FastAppend(&newrt, rte);
}
- query->rtable = newrt;
+ query->rtable = FastListValue(&newrt);
return query;
}