aboutsummaryrefslogtreecommitdiff
path: root/src/backend/parser
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/parser')
-rw-r--r--src/backend/parser/analyze.c217
-rw-r--r--src/backend/parser/gram.y22
-rw-r--r--src/backend/parser/parse_agg.c18
-rw-r--r--src/backend/parser/parse_clause.c81
-rw-r--r--src/backend/parser/parse_coerce.c14
-rw-r--r--src/backend/parser/parse_expr.c114
-rw-r--r--src/backend/parser/parse_func.c116
-rw-r--r--src/backend/parser/parse_node.c4
-rw-r--r--src/backend/parser/parse_relation.c91
-rw-r--r--src/backend/parser/parse_target.c16
-rw-r--r--src/backend/parser/parse_type.c16
11 files changed, 345 insertions, 364 deletions
diff --git a/src/backend/parser/analyze.c b/src/backend/parser/analyze.c
index 2b1eddbcf09..9da8937dc7b 100644
--- a/src/backend/parser/analyze.c
+++ b/src/backend/parser/analyze.c
@@ -6,7 +6,7 @@
* Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
- * $PostgreSQL: pgsql/src/backend/parser/analyze.c,v 1.300 2004/05/23 17:10:54 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/parser/analyze.c,v 1.301 2004/05/26 04:41:29 neilc Exp $
*
*-------------------------------------------------------------------------
*/
@@ -240,28 +240,20 @@ do_parse_analyze(Node *parseTree, ParseState *pstate)
List *extras_before = NIL;
List *extras_after = NIL;
Query *query;
- List *listscan;
+ ListCell *l;
query = transformStmt(pstate, parseTree, &extras_before, &extras_after);
/* don't need to access result relation any more */
release_pstate_resources(pstate);
- while (extras_before != NIL)
- {
- result = nconc(result,
- parse_sub_analyze(lfirst(extras_before), pstate));
- extras_before = lnext(extras_before);
- }
+ foreach(l, extras_before)
+ result = nconc(result, parse_sub_analyze(lfirst(l), pstate));
result = lappend(result, query);
- while (extras_after != NIL)
- {
- result = nconc(result,
- parse_sub_analyze(lfirst(extras_after), pstate));
- extras_after = lnext(extras_after);
- }
+ foreach(l, extras_after)
+ result = nconc(result, parse_sub_analyze(lfirst(l), pstate));
/*
* Make sure that only the original query is marked original. We have
@@ -270,9 +262,9 @@ do_parse_analyze(Node *parseTree, ParseState *pstate)
* mark only the original query as allowed to set the command-result
* tag.
*/
- foreach(listscan, result)
+ foreach(l, result)
{
- Query *q = lfirst(listscan);
+ Query *q = lfirst(l);
if (q == query)
{
@@ -428,8 +420,8 @@ transformViewStmt(ParseState *pstate, ViewStmt *stmt,
*/
if (stmt->aliases != NIL)
{
- List *aliaslist = stmt->aliases;
- List *targetList;
+ ListCell *alist_item = list_head(stmt->aliases);
+ ListCell *targetList;
foreach(targetList, stmt->query->targetList)
{
@@ -442,13 +434,13 @@ transformViewStmt(ParseState *pstate, ViewStmt *stmt,
/* junk columns don't get aliases */
if (rd->resjunk)
continue;
- rd->resname = pstrdup(strVal(lfirst(aliaslist)));
- aliaslist = lnext(aliaslist);
- if (aliaslist == NIL)
+ rd->resname = pstrdup(strVal(lfirst(alist_item)));
+ alist_item = lnext(alist_item);
+ if (alist_item == NULL)
break; /* done assigning aliases */
}
- if (aliaslist != NIL)
+ if (alist_item != NULL)
ereport(ERROR,
(errcode(ERRCODE_SYNTAX_ERROR),
errmsg("CREATE VIEW specifies more column "
@@ -506,9 +498,9 @@ transformInsertStmt(ParseState *pstate, InsertStmt *stmt,
List *sub_namespace;
List *icolumns;
List *attrnos;
- List *icols; /* to become ListCell */
- List *attnos; /* to become ListCell */
- List *tl;
+ ListCell *icols;
+ ListCell *attnos;
+ ListCell *tl;
qry->commandType = CMD_INSERT;
pstate->p_is_insert = true;
@@ -666,14 +658,14 @@ transformInsertStmt(ParseState *pstate, InsertStmt *stmt,
/*
* Prepare columns for assignment to target table.
*/
- icols = icolumns;
- attnos = attrnos;
+ icols = list_head(icolumns);
+ attnos = list_head(attrnos);
foreach(tl, qry->targetList)
{
TargetEntry *tle = (TargetEntry *) lfirst(tl);
ResTarget *col;
- if (icols == NIL || attnos == NIL)
+ if (icols == NULL || attnos == NULL)
ereport(ERROR,
(errcode(ERRCODE_SYNTAX_ERROR),
errmsg("INSERT has more expressions than target columns")));
@@ -694,7 +686,7 @@ transformInsertStmt(ParseState *pstate, InsertStmt *stmt,
* present in the columns list. Don't do the check unless an explicit
* columns list was given, though.
*/
- if (stmt->cols != NIL && (icols != NIL || attnos != NIL))
+ if (stmt->cols != NIL && (icols != NULL || attnos != NULL))
ereport(ERROR,
(errcode(ERRCODE_SYNTAX_ERROR),
errmsg("INSERT has more target columns than expressions")));
@@ -810,7 +802,7 @@ transformCreateStmt(ParseState *pstate, CreateStmt *stmt,
{
CreateStmtContext cxt;
Query *q;
- List *elements;
+ ListCell *elements;
cxt.stmtType = "CREATE TABLE";
cxt.relation = stmt->relation;
@@ -895,7 +887,7 @@ transformColumnDefinition(ParseState *pstate, CreateStmtContext *cxt,
bool is_serial;
bool saw_nullable;
Constraint *constraint;
- List *clist;
+ ListCell *clist;
cxt->columns = lappend(cxt->columns, column);
@@ -903,7 +895,7 @@ transformColumnDefinition(ParseState *pstate, CreateStmtContext *cxt,
is_serial = false;
if (length(column->typename->names) == 1)
{
- char *typname = strVal(lfirst(column->typename->names));
+ char *typname = strVal(linitial(column->typename->names));
if (strcmp(typname, "serial") == 0 ||
strcmp(typname, "serial4") == 0)
@@ -1256,13 +1248,10 @@ transformInhRelation(ParseState *pstate, CreateStmtContext *cxt,
static void
transformIndexConstraints(ParseState *pstate, CreateStmtContext *cxt)
{
- List *listptr;
- List *keys;
IndexStmt *index;
- IndexElem *iparam;
- ColumnDef *column;
- List *columns;
List *indexlist = NIL;
+ ListCell *listptr;
+ ListCell *l;
/*
* Run through the constraints that need to generate an index. For
@@ -1273,6 +1262,8 @@ transformIndexConstraints(ParseState *pstate, CreateStmtContext *cxt)
foreach(listptr, cxt->ixconstraints)
{
Constraint *constraint = lfirst(listptr);
+ ListCell *keys;
+ IndexElem *iparam;
Assert(IsA(constraint, Constraint));
Assert((constraint->contype == CONSTR_PRIMARY)
@@ -1317,11 +1308,12 @@ transformIndexConstraints(ParseState *pstate, CreateStmtContext *cxt)
{
char *key = strVal(lfirst(keys));
bool found = false;
+ ColumnDef *column = NULL;
+ ListCell *columns;
- column = NULL;
foreach(columns, cxt->columns)
{
- column = lfirst(columns);
+ column = (ColumnDef *) lfirst(columns);
Assert(IsA(column, ColumnDef));
if (strcmp(column->colname, key) == 0)
{
@@ -1347,11 +1339,11 @@ transformIndexConstraints(ParseState *pstate, CreateStmtContext *cxt)
else if (cxt->inhRelations)
{
/* try inherited tables */
- List *inher;
+ ListCell *inher;
foreach(inher, cxt->inhRelations)
{
- RangeVar *inh = lfirst(inher);
+ RangeVar *inh = (RangeVar *) lfirst(inher);
Relation rel;
int count;
@@ -1447,41 +1439,40 @@ transformIndexConstraints(ParseState *pstate, CreateStmtContext *cxt)
/* Make sure we keep the PKEY index in preference to others... */
cxt->alist = makeList1(cxt->pkey);
}
- while (indexlist != NIL)
+
+ foreach(l, indexlist)
{
- index = lfirst(indexlist);
+ bool keep = true;
+ ListCell *k;
+
+ index = lfirst(l);
/* if it's pkey, it's already in cxt->alist */
- if (index != cxt->pkey)
+ if (index == cxt->pkey)
+ continue;
+
+ foreach(k, cxt->alist)
{
- bool keep = true;
- List *priorlist;
+ IndexStmt *priorindex = lfirst(k);
- foreach(priorlist, cxt->alist)
+ if (equal(index->indexParams, priorindex->indexParams))
{
- IndexStmt *priorindex = lfirst(priorlist);
-
- if (equal(index->indexParams, priorindex->indexParams))
- {
- /*
- * If the prior index is as yet unnamed, and this one
- * is named, then transfer the name to the prior
- * index. This ensures that if we have named and
- * unnamed constraints, we'll use (at least one of)
- * the names for the index.
- */
- if (priorindex->idxname == NULL)
- priorindex->idxname = index->idxname;
- keep = false;
- break;
- }
+ /*
+ * If the prior index is as yet unnamed, and this one
+ * is named, then transfer the name to the prior
+ * index. This ensures that if we have named and
+ * unnamed constraints, we'll use (at least one of)
+ * the names for the index.
+ */
+ if (priorindex->idxname == NULL)
+ priorindex->idxname = index->idxname;
+ keep = false;
+ break;
}
-
- if (keep)
- cxt->alist = lappend(cxt->alist, index);
}
- indexlist = lnext(indexlist);
+ if (keep)
+ cxt->alist = lappend(cxt->alist, index);
}
}
@@ -1489,7 +1480,7 @@ static void
transformFKConstraints(ParseState *pstate, CreateStmtContext *cxt,
bool skipValidation, bool isAddConstraint)
{
- List *fkclist;
+ ListCell *fkclist;
if (cxt->fkconstraints == NIL)
return;
@@ -1550,7 +1541,7 @@ transformIndexStmt(ParseState *pstate, IndexStmt *stmt)
{
Query *qry;
RangeTblEntry *rte = NULL;
- List *l;
+ ListCell *l;
qry = makeNode(Query);
qry->commandType = CMD_UTILITY;
@@ -1721,15 +1712,15 @@ transformRuleStmt(ParseState *pstate, RuleStmt *stmt,
}
else
{
- List *oldactions;
+ ListCell *l;
List *newactions = NIL;
/*
* transform each statement, like parse_sub_analyze()
*/
- foreach(oldactions, stmt->actions)
+ foreach(l, stmt->actions)
{
- Node *action = (Node *) lfirst(oldactions);
+ Node *action = (Node *) lfirst(l);
ParseState *sub_pstate = make_parsestate(pstate->parentParseState);
Query *sub_qry,
*top_subqry;
@@ -1986,9 +1977,9 @@ transformSetOperationStmt(ParseState *pstate, SelectStmt *stmt)
Node *limitCount;
List *forUpdate;
Node *node;
- List *lefttl,
- *dtlist,
- *targetvars,
+ ListCell *left_tlist,
+ *dtlist;
+ List *targetvars,
*targetnames,
*sv_namespace,
*sv_rtable;
@@ -2067,15 +2058,17 @@ transformSetOperationStmt(ParseState *pstate, SelectStmt *stmt)
qry->targetList = NIL;
targetvars = NIL;
targetnames = NIL;
- lefttl = leftmostQuery->targetList;
+ left_tlist = list_head(leftmostQuery->targetList);
+
foreach(dtlist, sostmt->colTypes)
{
Oid colType = lfirsto(dtlist);
- Resdom *leftResdom = ((TargetEntry *) lfirst(lefttl))->resdom;
+ Resdom *leftResdom;
char *colName;
Resdom *resdom;
Expr *expr;
+ leftResdom = ((TargetEntry *) lfirst(left_tlist))->resdom;
Assert(!leftResdom->resjunk);
colName = pstrdup(leftResdom->resname);
resdom = makeResdom((AttrNumber) pstate->p_next_resno++,
@@ -2092,7 +2085,7 @@ transformSetOperationStmt(ParseState *pstate, SelectStmt *stmt)
makeTargetEntry(resdom, expr));
targetvars = lappend(targetvars, expr);
targetnames = lappend(targetnames, makeString(colName));
- lefttl = lnext(lefttl);
+ left_tlist = lnext(left_tlist);
}
/*
@@ -2239,7 +2232,7 @@ transformSetOperationTree(ParseState *pstate, SelectStmt *stmt)
selectList = parse_sub_analyze((Node *) stmt, pstate);
Assert(length(selectList) == 1);
- selectQuery = (Query *) lfirst(selectList);
+ selectQuery = (Query *) linitial(selectList);
Assert(IsA(selectQuery, Query));
/*
@@ -2282,6 +2275,8 @@ transformSetOperationTree(ParseState *pstate, SelectStmt *stmt)
SetOperationStmt *op = makeNode(SetOperationStmt);
List *lcoltypes;
List *rcoltypes;
+ ListCell *l;
+ ListCell *r;
const char *context;
context = (stmt->op == SETOP_UNION ? "UNION" :
@@ -2308,18 +2303,17 @@ transformSetOperationTree(ParseState *pstate, SelectStmt *stmt)
(errcode(ERRCODE_SYNTAX_ERROR),
errmsg("each %s query must have the same number of columns",
context)));
+
op->colTypes = NIL;
- while (lcoltypes != NIL)
+ forboth(l, lcoltypes, r, rcoltypes)
{
- Oid lcoltype = lfirsto(lcoltypes);
- Oid rcoltype = lfirsto(rcoltypes);
+ Oid lcoltype = lfirsto(l);
+ Oid rcoltype = lfirsto(r);
Oid rescoltype;
rescoltype = select_common_type(makeListo2(lcoltype, rcoltype),
context);
op->colTypes = lappendo(op->colTypes, rescoltype);
- lcoltypes = lnext(lcoltypes);
- rcoltypes = lnext(rcoltypes);
}
return (Node *) op;
@@ -2339,7 +2333,7 @@ getSetColTypes(ParseState *pstate, Node *node)
RangeTblEntry *rte = rt_fetch(rtr->rtindex, pstate->p_rtable);
Query *selectQuery = rte->subquery;
List *result = NIL;
- List *tl;
+ ListCell *tl;
Assert(selectQuery != NULL);
/* Get types of non-junk columns */
@@ -2373,22 +2367,25 @@ getSetColTypes(ParseState *pstate, Node *node)
static void
applyColumnNames(List *dst, List *src)
{
+ ListCell *dst_item = list_head(dst);
+ ListCell *src_item = list_head(src);
+
if (length(src) > length(dst))
ereport(ERROR,
(errcode(ERRCODE_SYNTAX_ERROR),
errmsg("CREATE TABLE AS specifies too many column names")));
- while (src != NIL && dst != NIL)
+ while (src_item != NULL && dst_item != NULL)
{
- TargetEntry *d = (TargetEntry *) lfirst(dst);
- ColumnDef *s = (ColumnDef *) lfirst(src);
+ TargetEntry *d = (TargetEntry *) lfirst(dst_item);
+ ColumnDef *s = (ColumnDef *) lfirst(src_item);
Assert(d->resdom && !d->resdom->resjunk);
d->resdom->resname = pstrdup(s->colname);
- dst = lnext(dst);
- src = lnext(src);
+ dst_item = lnext(dst_item);
+ src_item = lnext(src_item);
}
}
@@ -2402,8 +2399,8 @@ transformUpdateStmt(ParseState *pstate, UpdateStmt *stmt)
{
Query *qry = makeNode(Query);
Node *qual;
- List *origTargetList;
- List *tl;
+ ListCell *origTargetList;
+ ListCell *tl;
qry->commandType = CMD_UPDATE;
pstate->p_is_update = true;
@@ -2441,7 +2438,8 @@ transformUpdateStmt(ParseState *pstate, UpdateStmt *stmt)
pstate->p_next_resno = pstate->p_target_relation->rd_rel->relnatts + 1;
/* Prepare non-junk columns for assignment to target table */
- origTargetList = stmt->targetList;
+ origTargetList = list_head(stmt->targetList);
+
foreach(tl, qry->targetList)
{
TargetEntry *tle = (TargetEntry *) lfirst(tl);
@@ -2460,7 +2458,7 @@ transformUpdateStmt(ParseState *pstate, UpdateStmt *stmt)
resnode->resname = NULL;
continue;
}
- if (origTargetList == NIL)
+ if (origTargetList == NULL)
elog(ERROR, "UPDATE target count mismatch --- internal error");
origTarget = (ResTarget *) lfirst(origTargetList);
@@ -2471,7 +2469,7 @@ transformUpdateStmt(ParseState *pstate, UpdateStmt *stmt)
origTargetList = lnext(origTargetList);
}
- if (origTargetList != NIL)
+ if (origTargetList != NULL)
elog(ERROR, "UPDATE target count mismatch --- internal error");
return qry;
@@ -2487,7 +2485,7 @@ transformAlterTableStmt(ParseState *pstate, AlterTableStmt *stmt,
{
CreateStmtContext cxt;
Query *qry;
- List *lcmd,
+ ListCell *lcmd,
*l;
List *newcmds = NIL;
bool skipValidation = true;
@@ -2687,7 +2685,7 @@ transformPrepareStmt(ParseState *pstate, PrepareStmt *stmt)
if (nargs)
{
- List *l;
+ ListCell *l;
int i = 0;
argtoids = (Oid *) palloc(nargs * sizeof(Oid));
@@ -2717,7 +2715,7 @@ transformPrepareStmt(ParseState *pstate, PrepareStmt *stmt)
if (length(queries) != 1)
elog(ERROR, "unexpected extra stuff in prepared statement");
- stmt->query = lfirst(queries);
+ stmt->query = linitial(queries);
return result;
}
@@ -2737,7 +2735,7 @@ transformExecuteStmt(ParseState *pstate, ExecuteStmt *stmt)
{
int nparams = length(stmt->params);
int nexpected = length(paramtypes);
- List *l;
+ ListCell *l, *l2;
int i = 1;
if (nparams != nexpected)
@@ -2748,11 +2746,11 @@ transformExecuteStmt(ParseState *pstate, ExecuteStmt *stmt)
errdetail("Expected %d parameters but got %d.",
nexpected, nparams)));
- foreach(l, stmt->params)
+ forboth(l, stmt->params, l2, paramtypes)
{
Node *expr = lfirst(l);
- Oid expected_type_id,
- given_type_id;
+ Oid expected_type_id = lfirsto(l2);
+ Oid given_type_id;
expr = transformExpr(pstate, expr);
@@ -2767,7 +2765,6 @@ transformExecuteStmt(ParseState *pstate, ExecuteStmt *stmt)
errmsg("cannot use aggregate function in EXECUTE parameter")));
given_type_id = exprType(expr);
- expected_type_id = lfirsto(paramtypes);
expr = coerce_to_target_type(pstate, expr, given_type_id,
expected_type_id, -1,
@@ -2784,8 +2781,6 @@ transformExecuteStmt(ParseState *pstate, ExecuteStmt *stmt)
errhint("You will need to rewrite or cast the expression.")));
lfirst(l) = expr;
-
- paramtypes = lnext(paramtypes);
i++;
}
}
@@ -2825,13 +2820,13 @@ static void
transformForUpdate(Query *qry, List *forUpdate)
{
List *rowMarks = qry->rowMarks;
- List *l;
- List *rt;
+ ListCell *l;
+ ListCell *rt;
Index i;
CheckSelectForUpdate(qry);
- if (lfirst(forUpdate) == NULL)
+ if (linitial(forUpdate) == NULL)
{
/* all regular tables used in query */
i = 0;
@@ -2912,7 +2907,7 @@ transformForUpdate(Query *qry, List *forUpdate)
break; /* out of foreach loop */
}
}
- if (rt == NIL)
+ if (rt == NULL)
ereport(ERROR,
(errcode(ERRCODE_UNDEFINED_TABLE),
errmsg("relation \"%s\" in FOR UPDATE clause not found in FROM clause",
@@ -2938,7 +2933,7 @@ transformConstraintAttrs(List *constraintList)
Node *lastprimarynode = NULL;
bool saw_deferrability = false;
bool saw_initially = false;
- List *clist;
+ ListCell *clist;
foreach(clist, constraintList)
{
@@ -3113,7 +3108,7 @@ analyzeCreateSchemaStmt(CreateSchemaStmt *stmt)
{
CreateSchemaStmtContext cxt;
List *result;
- List *elements;
+ ListCell *elements;
cxt.stmtType = "CREATE SCHEMA";
cxt.schemaname = stmt->schemaname;
diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y
index b9becf91dbb..654341ddfe8 100644
--- a/src/backend/parser/gram.y
+++ b/src/backend/parser/gram.y
@@ -11,7 +11,7 @@
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/parser/gram.y,v 2.454 2004/05/10 22:44:45 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/parser/gram.y,v 2.455 2004/05/26 04:41:29 neilc Exp $
*
* HISTORY
* AUTHOR DATE MAJOR EVENT
@@ -2385,15 +2385,15 @@ DefineStmt:
case 1:
r->catalogname = NULL;
r->schemaname = NULL;
- r->relname = strVal(lfirst($3));
+ r->relname = strVal(linitial($3));
break;
case 2:
r->catalogname = NULL;
- r->schemaname = strVal(lfirst($3));
+ r->schemaname = strVal(linitial($3));
r->relname = strVal(lsecond($3));
break;
case 3:
- r->catalogname = strVal(lfirst($3));
+ r->catalogname = strVal(linitial($3));
r->schemaname = strVal(lsecond($3));
r->relname = strVal(lthird($3));
break;
@@ -6020,7 +6020,7 @@ a_expr: c_expr { $$ = $1; }
else
{
Node *n = NULL;
- List *l;
+ ListCell *l;
foreach(l, (List *) $3)
{
Node *cmp;
@@ -6052,7 +6052,7 @@ a_expr: c_expr { $$ = $1; }
else
{
Node *n = NULL;
- List *l;
+ ListCell *l;
foreach(l, (List *) $4)
{
Node *cmp;
@@ -7168,11 +7168,11 @@ qualified_name:
{
case 2:
$$->catalogname = NULL;
- $$->schemaname = strVal(lfirst($1));
+ $$->schemaname = strVal(linitial($1));
$$->relname = strVal(lsecond($1));
break;
case 3:
- $$->catalogname = strVal(lfirst($1));
+ $$->catalogname = strVal(linitial($1));
$$->schemaname = strVal(lsecond($1));
$$->relname = strVal(lthird($1));
break;
@@ -7864,8 +7864,8 @@ makeBoolAConst(bool state)
static Node *
makeRowNullTest(NullTestType test, RowExpr *row)
{
- Node *result = NULL;
- List *arg;
+ Node *result = NULL;
+ ListCell *arg;
foreach(arg, row->args)
{
@@ -7928,7 +7928,7 @@ static List *
extractArgTypes(List *parameters)
{
List *result = NIL;
- List *i;
+ ListCell *i;
foreach(i, parameters)
{
diff --git a/src/backend/parser/parse_agg.c b/src/backend/parser/parse_agg.c
index 6f85595610d..e9c73ee946a 100644
--- a/src/backend/parser/parse_agg.c
+++ b/src/backend/parser/parse_agg.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/parser/parse_agg.c,v 1.61 2004/01/28 07:46:44 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/parser/parse_agg.c,v 1.62 2004/05/26 04:41:29 neilc Exp $
*
*-------------------------------------------------------------------------
*/
@@ -99,7 +99,7 @@ parseCheckAggregates(ParseState *pstate, Query *qry)
{
List *groupClauses = NIL;
bool have_non_var_grouping;
- List *lst;
+ ListCell *l;
bool hasJoinRTEs;
Node *clause;
@@ -129,9 +129,9 @@ parseCheckAggregates(ParseState *pstate, Query *qry)
* While we are at it, build a list of the acceptable GROUP BY
* expressions for use by check_ungrouped_columns().
*/
- foreach(lst, qry->groupClause)
+ foreach(l, qry->groupClause)
{
- GroupClause *grpcl = (GroupClause *) lfirst(lst);
+ GroupClause *grpcl = (GroupClause *) lfirst(l);
Node *expr;
expr = get_sortgroupclause_expr(grpcl, qry->targetList);
@@ -151,9 +151,9 @@ parseCheckAggregates(ParseState *pstate, Query *qry)
* no rangetable entries are RTE_JOIN kind.
*/
hasJoinRTEs = false;
- foreach(lst, pstate->p_rtable)
+ foreach(l, pstate->p_rtable)
{
- RangeTblEntry *rte = (RangeTblEntry *) lfirst(lst);
+ RangeTblEntry *rte = (RangeTblEntry *) lfirst(l);
if (rte->rtekind == RTE_JOIN)
{
@@ -172,9 +172,9 @@ parseCheckAggregates(ParseState *pstate, Query *qry)
* recursive scans. (Note we have to flatten aliases before this.)
*/
have_non_var_grouping = false;
- foreach(lst, groupClauses)
+ foreach(l, groupClauses)
{
- if (!IsA((Node *) lfirst(lst), Var))
+ if (!IsA((Node *) lfirst(l), Var))
{
have_non_var_grouping = true;
break;
@@ -236,7 +236,7 @@ static bool
check_ungrouped_columns_walker(Node *node,
check_ungrouped_columns_context *context)
{
- List *gl;
+ ListCell *gl;
if (node == NULL)
return false;
diff --git a/src/backend/parser/parse_clause.c b/src/backend/parser/parse_clause.c
index 2c6e9942899..610c4fa2960 100644
--- a/src/backend/parser/parse_clause.c
+++ b/src/backend/parser/parse_clause.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/parser/parse_clause.c,v 1.129 2004/05/23 17:10:54 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/parser/parse_clause.c,v 1.130 2004/05/26 04:41:29 neilc Exp $
*
*-------------------------------------------------------------------------
*/
@@ -79,7 +79,7 @@ static TargetEntry *findTargetlistEntry(ParseState *pstate, Node *node,
void
transformFromClause(ParseState *pstate, List *frmList)
{
- List *fl;
+ ListCell *fl;
/*
* The grammar will have produced a list of RangeVars,
@@ -231,14 +231,15 @@ extractRemainingColumns(List *common_colnames,
{
List *new_colnames = NIL;
List *new_colvars = NIL;
- List *lnames,
- *lvars = src_colvars;
+ ListCell *lnames, *lvars;
- foreach(lnames, src_colnames)
+ Assert(length(src_colnames) == length(src_colvars));
+
+ forboth(lnames, src_colnames, lvars, src_colvars)
{
char *colname = strVal(lfirst(lnames));
bool match = false;
- List *cnames;
+ ListCell *cnames;
foreach(cnames, common_colnames)
{
@@ -256,8 +257,6 @@ extractRemainingColumns(List *common_colnames,
new_colnames = lappend(new_colnames, lfirst(lnames));
new_colvars = lappend(new_colvars, lfirst(lvars));
}
-
- lvars = lnext(lvars);
}
*res_colnames = new_colnames;
@@ -273,8 +272,7 @@ static Node *
transformJoinUsingClause(ParseState *pstate, List *leftVars, List *rightVars)
{
Node *result = NULL;
- List *lvars,
- *rvars = rightVars;
+ ListCell *lvars, *rvars;
/*
* We cheat a little bit here by building an untransformed operator
@@ -282,7 +280,7 @@ transformJoinUsingClause(ParseState *pstate, List *leftVars, List *rightVars)
* because transformExpr() won't complain about already-transformed
* subnodes.
*/
- foreach(lvars, leftVars)
+ forboth(lvars, leftVars, rvars, rightVars)
{
Node *lvar = (Node *) lfirst(lvars);
Node *rvar = (Node *) lfirst(rvars);
@@ -299,8 +297,6 @@ transformJoinUsingClause(ParseState *pstate, List *leftVars, List *rightVars)
a = makeA_Expr(AEXPR_AND, NIL, result, (Node *) e);
result = (Node *) a;
}
-
- rvars = lnext(rvars);
}
/*
@@ -314,7 +310,7 @@ transformJoinUsingClause(ParseState *pstate, List *leftVars, List *rightVars)
result = coerce_to_boolean(pstate, result, "JOIN/USING");
return result;
-} /* transformJoinUsingClause() */
+}
/* transformJoinOnClause()
* Transform the qual conditions for JOIN/ON.
@@ -435,7 +431,7 @@ transformRangeSubselect(ParseState *pstate, RangeSubselect *r)
*/
if (length(parsetrees) != 1)
elog(ERROR, "unexpected parse analysis result for subquery in FROM");
- query = (Query *) lfirst(parsetrees);
+ query = (Query *) linitial(parsetrees);
if (query == NULL || !IsA(query, Query))
elog(ERROR, "unexpected parse analysis result for subquery in FROM");
@@ -686,7 +682,7 @@ transformFromClauseItem(ParseState *pstate, Node *n, List **containedRels)
if (j->isNatural)
{
List *rlist = NIL;
- List *lx,
+ ListCell *lx,
*rx;
Assert(j->using == NIL); /* shouldn't have USING() too */
@@ -731,14 +727,14 @@ transformFromClauseItem(ParseState *pstate, Node *n, List **containedRels)
List *ucols = j->using;
List *l_usingvars = NIL;
List *r_usingvars = NIL;
- List *ucol;
+ ListCell *ucol;
Assert(j->quals == NULL); /* shouldn't have ON() too */
foreach(ucol, ucols)
{
char *u_colname = strVal(lfirst(ucol));
- List *col;
+ ListCell *col;
int ndx;
int l_index = -1;
int r_index = -1;
@@ -1083,7 +1079,7 @@ static TargetEntry *
findTargetlistEntry(ParseState *pstate, Node *node, List **tlist, int clause)
{
TargetEntry *target_result = NULL;
- List *tl;
+ ListCell *tl;
Node *expr;
/*----------
@@ -1129,7 +1125,7 @@ findTargetlistEntry(ParseState *pstate, Node *node, List **tlist, int clause)
length(((ColumnRef *) node)->fields) == 1 &&
((ColumnRef *) node)->indirection == NIL)
{
- char *name = strVal(lfirst(((ColumnRef *) node)->fields));
+ char *name = strVal(linitial(((ColumnRef *) node)->fields));
if (clause == GROUP_CLAUSE)
{
@@ -1255,8 +1251,11 @@ List *
transformGroupClause(ParseState *pstate, List *grouplist,
List **targetlist, List *sortClause)
{
- List *glist = NIL,
- *gl;
+ List *glist = NIL;
+ ListCell *gl;
+ ListCell *sortItem;
+
+ sortItem = list_head(sortClause);
foreach(gl, grouplist)
{
@@ -1293,17 +1292,17 @@ transformGroupClause(ParseState *pstate, List *grouplist,
* any user-supplied ordering operator will bring equal values
* together, which is all that GROUP BY needs.
*/
- if (sortClause &&
- ((SortClause *) lfirst(sortClause))->tleSortGroupRef ==
+ if (sortItem &&
+ ((SortClause *) lfirst(sortItem))->tleSortGroupRef ==
tle->resdom->ressortgroupref)
{
- ordering_op = ((SortClause *) lfirst(sortClause))->sortop;
- sortClause = lnext(sortClause);
+ ordering_op = ((SortClause *) lfirst(sortItem))->sortop;
+ sortItem = lnext(sortItem);
}
else
{
ordering_op = ordering_oper_opid(restype);
- sortClause = NIL; /* disregard ORDER BY once match fails */
+ sortItem = NULL; /* disregard ORDER BY once match fails */
}
grpcl = makeNode(GroupClause);
@@ -1329,7 +1328,7 @@ transformSortClause(ParseState *pstate,
bool resolveUnknown)
{
List *sortlist = NIL;
- List *olitem;
+ ListCell *olitem;
foreach(olitem, orderlist)
{
@@ -1361,14 +1360,14 @@ transformDistinctClause(ParseState *pstate, List *distinctlist,
List **targetlist, List **sortClause)
{
List *result = NIL;
- List *slitem;
- List *dlitem;
+ ListCell *slitem;
+ ListCell *dlitem;
/* No work if there was no DISTINCT clause */
if (distinctlist == NIL)
return NIL;
- if (lfirst(distinctlist) == NIL)
+ if (linitial(distinctlist) == NULL)
{
/* We had SELECT DISTINCT */
@@ -1423,7 +1422,7 @@ transformDistinctClause(ParseState *pstate, List *distinctlist,
* match in any order, but implementing that check seems like more
* trouble than it's worth.
*/
- List *nextsortlist = *sortClause;
+ ListCell *nextsortlist = list_head(*sortClause);
foreach(dlitem, distinctlist)
{
@@ -1432,7 +1431,7 @@ transformDistinctClause(ParseState *pstate, List *distinctlist,
tle = findTargetlistEntry(pstate, lfirst(dlitem),
targetlist, DISTINCT_ON_CLAUSE);
- if (nextsortlist != NIL)
+ if (nextsortlist != NULL)
{
SortClause *scl = (SortClause *) lfirst(nextsortlist);
@@ -1463,7 +1462,7 @@ transformDistinctClause(ParseState *pstate, List *distinctlist,
break;
}
}
- if (slitem == NIL) /* should not happen */
+ if (slitem == NULL) /* should not happen */
elog(ERROR, "failed to add DISTINCT ON clause to target list");
}
}
@@ -1486,11 +1485,11 @@ List *
addAllTargetsToSortList(ParseState *pstate, List *sortlist,
List *targetlist, bool resolveUnknown)
{
- List *i;
+ ListCell *l;
- foreach(i, targetlist)
+ foreach(l, targetlist)
{
- TargetEntry *tle = (TargetEntry *) lfirst(i);
+ TargetEntry *tle = (TargetEntry *) lfirst(l);
if (!tle->resdom->resjunk)
sortlist = addTargetToSortList(pstate, tle,
@@ -1575,7 +1574,7 @@ Index
assignSortGroupRef(TargetEntry *tle, List *tlist)
{
Index maxRef;
- List *l;
+ ListCell *l;
if (tle->resdom->ressortgroupref) /* already has one? */
return tle->resdom->ressortgroupref;
@@ -1605,15 +1604,15 @@ bool
targetIsInSortList(TargetEntry *tle, List *sortList)
{
Index ref = tle->resdom->ressortgroupref;
- List *i;
+ ListCell *l;
/* no need to scan list if tle has no marker */
if (ref == 0)
return false;
- foreach(i, sortList)
+ foreach(l, sortList)
{
- SortClause *scl = (SortClause *) lfirst(i);
+ SortClause *scl = (SortClause *) lfirst(l);
if (scl->tleSortGroupRef == ref)
return true;
diff --git a/src/backend/parser/parse_coerce.c b/src/backend/parser/parse_coerce.c
index c7a8c3c83bb..ba3210946ab 100644
--- a/src/backend/parser/parse_coerce.c
+++ b/src/backend/parser/parse_coerce.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/parser/parse_coerce.c,v 2.115 2004/05/10 22:44:46 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/parser/parse_coerce.c,v 2.116 2004/05/26 04:41:30 neilc Exp $
*
*-------------------------------------------------------------------------
*/
@@ -546,7 +546,7 @@ coerce_record_to_complex(ParseState *pstate, Node *node,
List *args = NIL;
List *newargs;
int i;
- List *arg;
+ ListCell *arg;
if (node && IsA(node, RowExpr))
{
@@ -720,14 +720,15 @@ select_common_type(List *typeids, const char *context)
{
Oid ptype;
CATEGORY pcategory;
- List *l;
+ ListCell *type_item;
Assert(typeids != NIL);
- ptype = getBaseType(lfirsto(typeids));
+ ptype = getBaseType(linitial_oid(typeids));
pcategory = TypeCategory(ptype);
- foreach(l, lnext(typeids))
+
+ for_each_cell(type_item, lnext(list_head(typeids)))
{
- Oid ntype = getBaseType(lfirsto(l));
+ Oid ntype = getBaseType(lfirsto(type_item));
/* move on to next one if no new information... */
if ((ntype != InvalidOid) && (ntype != UNKNOWNOID) && (ntype != ptype))
@@ -746,7 +747,6 @@ select_common_type(List *typeids, const char *context)
*/
ereport(ERROR,
(errcode(ERRCODE_DATATYPE_MISMATCH),
-
/*
* translator: first %s is name of a SQL construct, eg
* CASE
diff --git a/src/backend/parser/parse_expr.c b/src/backend/parser/parse_expr.c
index d4a8cdcc8b6..9efebdfdb48 100644
--- a/src/backend/parser/parse_expr.c
+++ b/src/backend/parser/parse_expr.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/parser/parse_expr.c,v 1.170 2004/05/10 22:44:46 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/parser/parse_expr.c,v 1.171 2004/05/26 04:41:30 neilc Exp $
*
*-------------------------------------------------------------------------
*/
@@ -100,7 +100,7 @@ transformExpr(ParseState *pstate, Node *expr)
int paramno = pref->number;
ParseState *toppstate;
Param *param;
- List *fields;
+ ListCell *fields;
/*
* Find topmost ParseState, which is where paramtype info
@@ -176,7 +176,7 @@ transformExpr(ParseState *pstate, Node *expr)
case T_ExprFieldSelect:
{
ExprFieldSelect *efs = (ExprFieldSelect *) expr;
- List *fields;
+ ListCell *fields;
result = transformExpr(pstate, efs->arg);
/* handle qualification, if any */
@@ -219,7 +219,7 @@ transformExpr(ParseState *pstate, Node *expr)
*/
if (Transform_null_equals &&
length(a->name) == 1 &&
- strcmp(strVal(lfirst(a->name)), "=") == 0 &&
+ strcmp(strVal(linitial(a->name)), "=") == 0 &&
(exprIsNullConstant(lexpr) ||
exprIsNullConstant(rexpr)))
{
@@ -396,7 +396,7 @@ transformExpr(ParseState *pstate, Node *expr)
* Checking an expression for match to type.
* Will result in a boolean constant node.
*/
- List *telem;
+ ListCell *telem;
A_Const *n;
Oid ltype,
rtype;
@@ -418,7 +418,7 @@ transformExpr(ParseState *pstate, Node *expr)
* Flip the sense of the result for not
* equals.
*/
- if (strcmp(strVal(lfirst(a->name)), "!=") == 0)
+ if (strcmp(strVal(linitial(a->name)), "!=") == 0)
matched = (!matched);
n = makeNode(A_Const);
@@ -436,12 +436,15 @@ transformExpr(ParseState *pstate, Node *expr)
{
FuncCall *fn = (FuncCall *) expr;
List *targs;
- List *args;
+ ListCell *args;
/*
* Transform the list of arguments. We use a shallow list
* copy and then transform-in-place to avoid O(N^2)
* behavior from repeated lappend's.
+ *
+ * XXX: repeated lappend() would no longer result in
+ * O(n^2) behavior; worth reconsidering this design?
*/
targs = listCopy(fn->args);
foreach(args, targs)
@@ -473,7 +476,7 @@ transformExpr(ParseState *pstate, Node *expr)
qtrees = parse_sub_analyze(sublink->subselect, pstate);
if (length(qtrees) != 1)
elog(ERROR, "bad query in sub-select");
- qtree = (Query *) lfirst(qtrees);
+ qtree = (Query *) linitial(qtrees);
if (qtree->commandType != CMD_SELECT ||
qtree->resultRelation != 0)
elog(ERROR, "bad query in sub-select");
@@ -493,20 +496,20 @@ transformExpr(ParseState *pstate, Node *expr)
else if (sublink->subLinkType == EXPR_SUBLINK ||
sublink->subLinkType == ARRAY_SUBLINK)
{
- List *tlist = qtree->targetList;
+ ListCell *tlist_item = list_head(qtree->targetList);
/*
* Make sure the subselect delivers a single column
* (ignoring resjunk targets).
*/
- if (tlist == NIL ||
- ((TargetEntry *) lfirst(tlist))->resdom->resjunk)
+ if (tlist_item == NULL ||
+ ((TargetEntry *) lfirst(tlist_item))->resdom->resjunk)
ereport(ERROR,
(errcode(ERRCODE_SYNTAX_ERROR),
errmsg("subquery must return a column")));
- while ((tlist = lnext(tlist)) != NIL)
+ while ((tlist_item = lnext(tlist_item)) != NULL)
{
- if (!((TargetEntry *) lfirst(tlist))->resdom->resjunk)
+ if (!((TargetEntry *) lfirst(tlist_item))->resdom->resjunk)
ereport(ERROR,
(errcode(ERRCODE_SYNTAX_ERROR),
errmsg("subquery must return only one column")));
@@ -531,11 +534,12 @@ transformExpr(ParseState *pstate, Node *expr)
bool needNot = false;
List *op = sublink->operName;
char *opname = strVal(llast(op));
- List *elist;
+ ListCell *l;
+ ListCell *ll_item;
/* transform lefthand expressions */
- foreach(elist, left_list)
- lfirst(elist) = transformExpr(pstate, lfirst(elist));
+ foreach(l, left_list)
+ lfirst(l) = transformExpr(pstate, lfirst(l));
/*
* If the expression is "<> ALL" (with unqualified
@@ -578,23 +582,23 @@ transformExpr(ParseState *pstate, Node *expr)
*/
sublink->operOids = NIL;
- while (right_list != NIL)
+ ll_item = list_head(left_list);
+ foreach(l, right_list)
{
- TargetEntry *tent = (TargetEntry *) lfirst(right_list);
+ TargetEntry *tent = (TargetEntry *) lfirst(l);
Node *lexpr;
Operator optup;
Form_pg_operator opform;
- right_list = lnext(right_list);
if (tent->resdom->resjunk)
continue;
- if (left_list == NIL)
+ if (ll_item == NULL)
ereport(ERROR,
(errcode(ERRCODE_SYNTAX_ERROR),
errmsg("subquery has too many columns")));
- lexpr = lfirst(left_list);
- left_list = lnext(left_list);
+ lexpr = lfirst(ll_item);
+ ll_item = lnext(ll_item);
/*
* It's OK to use oper() not compatible_oper()
@@ -627,7 +631,7 @@ transformExpr(ParseState *pstate, Node *expr)
ReleaseSysCache(optup);
}
- if (left_list != NIL)
+ if (ll_item != NULL)
ereport(ERROR,
(errcode(ERRCODE_SYNTAX_ERROR),
errmsg("subquery has too few columns")));
@@ -651,7 +655,7 @@ transformExpr(ParseState *pstate, Node *expr)
CaseTestExpr *placeholder;
List *newargs;
List *typeids;
- List *args;
+ ListCell *l;
Node *defresult;
Oid ptype;
@@ -679,9 +683,9 @@ transformExpr(ParseState *pstate, Node *expr)
/* transform the list of arguments */
newargs = NIL;
typeids = NIL;
- foreach(args, c->args)
+ foreach(l, c->args)
{
- CaseWhen *w = (CaseWhen *) lfirst(args);
+ CaseWhen *w = (CaseWhen *) lfirst(l);
CaseWhen *neww = makeNode(CaseWhen);
Node *warg;
@@ -741,9 +745,9 @@ transformExpr(ParseState *pstate, Node *expr)
"CASE/ELSE");
/* Convert when-clause results, if necessary */
- foreach(args, newc->args)
+ foreach(l, newc->args)
{
- CaseWhen *w = (CaseWhen *) lfirst(args);
+ CaseWhen *w = (CaseWhen *) lfirst(l);
w->result = (Expr *)
coerce_to_common_type(pstate,
@@ -763,7 +767,7 @@ transformExpr(ParseState *pstate, Node *expr)
List *newelems = NIL;
List *newcoercedelems = NIL;
List *typeids = NIL;
- List *element;
+ ListCell *element;
Oid array_type;
Oid element_type;
@@ -827,7 +831,7 @@ transformExpr(ParseState *pstate, Node *expr)
RowExpr *r = (RowExpr *) expr;
RowExpr *newr = makeNode(RowExpr);
List *newargs = NIL;
- List *arg;
+ ListCell *arg;
/* Transform the field expressions */
foreach(arg, r->args)
@@ -855,7 +859,7 @@ transformExpr(ParseState *pstate, Node *expr)
List *newargs = NIL;
List *newcoercedargs = NIL;
List *typeids = NIL;
- List *args;
+ ListCell *args;
foreach(args, c->args)
{
@@ -1024,7 +1028,7 @@ transformColumnRef(ParseState *pstate, ColumnRef *cref)
{
case 1:
{
- char *name = strVal(lfirst(cref->fields));
+ char *name = strVal(linitial(cref->fields));
/* Try to identify as an unqualified column */
node = colNameToVar(pstate, name, false);
@@ -1070,7 +1074,7 @@ transformColumnRef(ParseState *pstate, ColumnRef *cref)
}
case 2:
{
- char *name1 = strVal(lfirst(cref->fields));
+ char *name1 = strVal(linitial(cref->fields));
char *name2 = strVal(lsecond(cref->fields));
/* Whole-row reference? */
@@ -1099,7 +1103,7 @@ transformColumnRef(ParseState *pstate, ColumnRef *cref)
}
case 3:
{
- char *name1 = strVal(lfirst(cref->fields));
+ char *name1 = strVal(linitial(cref->fields));
char *name2 = strVal(lsecond(cref->fields));
char *name3 = strVal(lthird(cref->fields));
@@ -1125,7 +1129,7 @@ transformColumnRef(ParseState *pstate, ColumnRef *cref)
}
case 4:
{
- char *name1 = strVal(lfirst(cref->fields));
+ char *name1 = strVal(linitial(cref->fields));
char *name2 = strVal(lsecond(cref->fields));
char *name3 = strVal(lthird(cref->fields));
char *name4 = strVal(lfourth(cref->fields));
@@ -1316,7 +1320,7 @@ exprType(Node *expr)
if (!qtree || !IsA(qtree, Query))
elog(ERROR, "cannot get type for untransformed sublink");
- tent = (TargetEntry *) lfirst(qtree->targetList);
+ tent = (TargetEntry *) linitial(qtree->targetList);
Assert(IsA(tent, TargetEntry));
Assert(!tent->resdom->resjunk);
if (sublink->subLinkType == EXPR_SUBLINK)
@@ -1355,7 +1359,7 @@ exprType(Node *expr)
/* get the type of the subselect's first target column */
TargetEntry *tent;
- tent = (TargetEntry *) lfirst(subplan->plan->targetlist);
+ tent = (TargetEntry *) linitial(subplan->plan->targetlist);
Assert(IsA(tent, TargetEntry));
Assert(!tent->resdom->resjunk);
if (subplan->subLinkType == EXPR_SUBLINK)
@@ -1403,7 +1407,7 @@ exprType(Node *expr)
type = ((CoalesceExpr *) expr)->coalescetype;
break;
case T_NullIfExpr:
- type = exprType((Node *) lfirst(((NullIfExpr *) expr)->args));
+ type = exprType((Node *) linitial(((NullIfExpr *) expr)->args));
break;
case T_NullTest:
type = BOOLOID;
@@ -1481,7 +1485,7 @@ exprTypmod(Node *expr)
CaseExpr *cexpr = (CaseExpr *) expr;
Oid casetype = cexpr->casetype;
int32 typmod;
- List *arg;
+ ListCell *arg;
if (!cexpr->defresult)
return -1;
@@ -1514,9 +1518,9 @@ exprTypmod(Node *expr)
CoalesceExpr *cexpr = (CoalesceExpr *) expr;
Oid coalescetype = cexpr->coalescetype;
int32 typmod;
- List *arg;
+ ListCell *arg;
- typmod = exprTypmod((Node *) lfirst(cexpr->args));
+ typmod = exprTypmod((Node *) linitial(cexpr->args));
foreach(arg, cexpr->args)
{
Node *e = (Node *) lfirst(arg);
@@ -1533,7 +1537,7 @@ exprTypmod(Node *expr)
{
NullIfExpr *nexpr = (NullIfExpr *) expr;
- return exprTypmod((Node *) lfirst(nexpr->args));
+ return exprTypmod((Node *) linitial(nexpr->args));
}
break;
case T_CoerceToDomain:
@@ -1644,8 +1648,8 @@ make_row_op(ParseState *pstate, List *opname, Node *ltree, Node *rtree)
*rrow;
List *largs,
*rargs;
- List *largl,
- *rargl;
+ ListCell *l,
+ *r;
char *oprname;
BoolExprType boolop;
@@ -1690,15 +1694,12 @@ make_row_op(ParseState *pstate, List *opname, Node *ltree, Node *rtree)
boolop = 0; /* keep compiler quiet */
}
- /* XXX use forboth */
- rargl = rargs;
- foreach(largl, largs)
+ forboth(l, largs, r, rargs)
{
- Node *larg = (Node *) lfirst(largl);
- Node *rarg = (Node *) lfirst(rargl);
+ Node *larg = (Node *) lfirst(l);
+ Node *rarg = (Node *) lfirst(r);
Node *cmp;
- rargl = lnext(rargl);
cmp = (Node *) make_op(pstate, opname, larg, rarg);
cmp = coerce_to_boolean(pstate, cmp, "row comparison");
if (result == NULL)
@@ -1732,8 +1733,8 @@ make_row_distinct_op(ParseState *pstate, List *opname,
*rrow;
List *largs,
*rargs;
- List *largl,
- *rargl;
+ ListCell *l,
+ *r;
/* Inputs are untransformed RowExprs */
lrow = (RowExpr *) transformExpr(pstate, ltree);
@@ -1748,15 +1749,12 @@ make_row_distinct_op(ParseState *pstate, List *opname,
(errcode(ERRCODE_SYNTAX_ERROR),
errmsg("unequal number of entries in row expression")));
- /* XXX use forboth */
- rargl = rargs;
- foreach(largl, largs)
+ forboth(l, largs, r, rargs)
{
- Node *larg = (Node *) lfirst(largl);
- Node *rarg = (Node *) lfirst(rargl);
+ Node *larg = (Node *) lfirst(l);
+ Node *rarg = (Node *) lfirst(r);
Node *cmp;
- rargl = lnext(rargl);
cmp = (Node *) make_distinct_op(pstate, opname, larg, rarg);
if (result == NULL)
result = cmp;
diff --git a/src/backend/parser/parse_func.c b/src/backend/parser/parse_func.c
index 64da3bb8425..2b48ef488d7 100644
--- a/src/backend/parser/parse_func.c
+++ b/src/backend/parser/parse_func.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/parser/parse_func.c,v 1.168 2004/04/02 21:30:44 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/parser/parse_func.c,v 1.169 2004/05/26 04:41:30 neilc Exp $
*
*-------------------------------------------------------------------------
*/
@@ -67,7 +67,7 @@ ParseFuncOrColumn(ParseState *pstate, List *funcname, List *fargs,
{
Oid rettype;
Oid funcid;
- List *i;
+ ListCell *l;
Node *first_arg = NULL;
int nargs = length(fargs);
int argn;
@@ -91,7 +91,7 @@ ParseFuncOrColumn(ParseState *pstate, List *funcname, List *fargs,
if (fargs)
{
- first_arg = lfirst(fargs);
+ first_arg = linitial(fargs);
Assert(first_arg != NULL);
}
@@ -108,7 +108,7 @@ ParseFuncOrColumn(ParseState *pstate, List *funcname, List *fargs,
if (argtype == RECORDOID || ISCOMPLEX(argtype))
{
retval = ParseComplexProjection(pstate,
- strVal(lfirst(funcname)),
+ strVal(linitial(funcname)),
first_arg);
if (retval)
return retval;
@@ -126,9 +126,9 @@ ParseFuncOrColumn(ParseState *pstate, List *funcname, List *fargs,
MemSet(actual_arg_types, 0, FUNC_MAX_ARGS * sizeof(Oid));
argn = 0;
- foreach(i, fargs)
+ foreach(l, fargs)
{
- Node *arg = lfirst(i);
+ Node *arg = lfirst(l);
actual_arg_types[argn++] = exprType(arg);
}
@@ -149,8 +149,8 @@ ParseFuncOrColumn(ParseState *pstate, List *funcname, List *fargs,
* We can do it as a trivial coercion. coerce_type can handle
* these cases, so why duplicate code...
*/
- return coerce_type(pstate, lfirst(fargs), actual_arg_types[0],
- rettype,
+ return coerce_type(pstate, linitial(fargs),
+ actual_arg_types[0], rettype,
COERCION_EXPLICIT, COERCE_EXPLICIT_CALL);
}
else if (fdresult == FUNCDETAIL_NORMAL)
@@ -183,7 +183,7 @@ ParseFuncOrColumn(ParseState *pstate, List *funcname, List *fargs,
{
Assert(nargs == 1);
Assert(length(funcname) == 1);
- unknown_attribute(pstate, first_arg, strVal(lfirst(funcname)));
+ unknown_attribute(pstate, first_arg, strVal(linitial(funcname)));
}
/*
@@ -240,7 +240,7 @@ ParseFuncOrColumn(ParseState *pstate, List *funcname, List *fargs,
aggref->aggfnoid = funcid;
aggref->aggtype = rettype;
- aggref->target = lfirst(fargs);
+ aggref->target = linitial(fargs);
aggref->aggstar = agg_star;
aggref->aggdistinct = agg_distinct;
@@ -725,7 +725,7 @@ func_get_detail(List *funcname,
!ISCOMPLEX(targetType))
{
Oid sourceType = argtypes[0];
- Node *arg1 = lfirst(fargs);
+ Node *arg1 = linitial(fargs);
if ((sourceType == UNKNOWNOID && IsA(arg1, Const)) ||
(find_coercion_pathway(targetType, sourceType,
@@ -896,37 +896,51 @@ static int
find_inheritors(Oid relid, Oid **supervec)
{
Relation inhrel;
- HeapScanDesc inhscan;
- ScanKeyData skey;
- HeapTuple inhtup;
- Oid *relidvec;
int nvisited;
List *visited,
*queue;
- List *elt;
- bool newrelid;
+ ListCell *queue_item;
- nvisited = 0;
- queue = NIL;
+ /*
+ * Begin the search at the relation itself, so add relid to the
+ * queue.
+ */
+ queue = list_make1_oid(relid);
visited = NIL;
inhrel = heap_openr(InheritsRelationName, AccessShareLock);
/*
- * Use queue to do a breadth-first traversal of the inheritance graph
- * from the relid supplied up to the root. At the top of the loop,
- * relid is the OID of the reltype to check next, queue is the list of
- * pending relids to check after this one, and visited is the list of
- * relids we need to output.
+ * Use queue to do a breadth-first traversal of the inheritance
+ * graph from the relid supplied up to the root. Notice that we
+ * append to the queue inside the loop --- this is okay because
+ * the foreach() macro doesn't advance queue_item until the next
+ * loop iteration begins.
*/
- do
+ foreach(queue_item, queue)
{
- /* find all types this relid inherits from, and add them to queue */
+ Oid this_relid = lfirst_oid(queue_item);
+ ScanKeyData skey;
+ HeapScanDesc inhscan;
+ HeapTuple inhtup;
+
+ /* If we've seen this relid already, skip it */
+ if (list_member_oid(visited, this_relid))
+ continue;
+
+ /*
+ * Okay, this is a not-yet-seen relid. Add it to the list of
+ * already-visited OIDs, then find all the types this relid
+ * inherits from and add them to the queue. The one exception
+ * is we don't add the original relation to 'visited'.
+ */
+ if (queue_item != list_head(queue))
+ visited = lappend_oid(visited, this_relid);
ScanKeyInit(&skey,
Anum_pg_inherits_inhrelid,
BTEqualStrategyNumber, F_OIDEQ,
- ObjectIdGetDatum(relid));
+ ObjectIdGetDatum(this_relid));
inhscan = heap_beginscan(inhrel, SnapshotNow, 1, &skey);
@@ -934,54 +948,34 @@ find_inheritors(Oid relid, Oid **supervec)
{
Form_pg_inherits inh = (Form_pg_inherits) GETSTRUCT(inhtup);
- queue = lappendo(queue, inh->inhparent);
+ queue = lappend_oid(queue, inh->inhparent);
}
heap_endscan(inhscan);
-
- /* pull next unvisited relid off the queue */
-
- newrelid = false;
- while (queue != NIL)
- {
- relid = lfirsto(queue);
- queue = lnext(queue);
- if (!oidMember(relid, visited))
- {
- newrelid = true;
- break;
- }
- }
-
- if (newrelid)
- {
- visited = lappendo(visited, relid);
- nvisited++;
- }
- } while (newrelid);
+ }
heap_close(inhrel, AccessShareLock);
+ nvisited = list_length(visited);
if (nvisited > 0)
{
- relidvec = (Oid *) palloc(nvisited * sizeof(Oid));
+ Oid *relidvec;
+ ListCell *l;
+
+ relidvec = (Oid *) palloc(nvisited * sizeof(*relidvec));
*supervec = relidvec;
- foreach(elt, visited)
+ foreach(l, visited)
{
/* return the type id, rather than the relation id */
- *relidvec++ = get_rel_type_id(lfirsto(elt));
+ *relidvec++ = get_rel_type_id(lfirst_oid(l));
}
}
else
*supervec = NULL;
freeList(visited);
-
- /*
- * there doesn't seem to be any equally easy way to release the queue
- * list cells, but since they're palloc'd space it's not critical.
- */
+ freeList(queue);
return nvisited;
}
@@ -1117,7 +1111,7 @@ make_fn_arguments(ParseState *pstate,
Oid *actual_arg_types,
Oid *declared_arg_types)
{
- List *current_fargs;
+ ListCell *current_fargs;
int i = 0;
foreach(current_fargs, fargs)
@@ -1403,6 +1397,7 @@ LookupFuncNameTypeNames(List *funcname, List *argtypes, bool noError)
Oid argoids[FUNC_MAX_ARGS];
int argcount;
int i;
+ ListCell *args_item;
MemSet(argoids, 0, FUNC_MAX_ARGS * sizeof(Oid));
argcount = length(argtypes);
@@ -1412,9 +1407,10 @@ LookupFuncNameTypeNames(List *funcname, List *argtypes, bool noError)
errmsg("functions cannot have more than %d arguments",
FUNC_MAX_ARGS)));
+ args_item = list_head(argtypes);
for (i = 0; i < argcount; i++)
{
- TypeName *t = (TypeName *) lfirst(argtypes);
+ TypeName *t = (TypeName *) lfirst(args_item);
argoids[i] = LookupTypeName(t);
@@ -1424,7 +1420,7 @@ LookupFuncNameTypeNames(List *funcname, List *argtypes, bool noError)
errmsg("type \"%s\" does not exist",
TypeNameToString(t))));
- argtypes = lnext(argtypes);
+ args_item = lnext(args_item);
}
return LookupFuncName(funcname, argcount, argoids, noError);
diff --git a/src/backend/parser/parse_node.c b/src/backend/parser/parse_node.c
index 00b4c8e513e..c46c27481a5 100644
--- a/src/backend/parser/parse_node.c
+++ b/src/backend/parser/parse_node.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/parser/parse_node.c,v 1.82 2003/11/29 19:51:52 pgsql Exp $
+ * $PostgreSQL: pgsql/src/backend/parser/parse_node.c,v 1.83 2004/05/26 04:41:30 neilc Exp $
*
*-------------------------------------------------------------------------
*/
@@ -106,7 +106,7 @@ transformArraySubscripts(ParseState *pstate,
bool isSlice = forceSlice;
List *upperIndexpr = NIL;
List *lowerIndexpr = NIL;
- List *idx;
+ ListCell *idx;
ArrayRef *aref;
/* Get the type tuple for the array */
diff --git a/src/backend/parser/parse_relation.c b/src/backend/parser/parse_relation.c
index de4bf093ee9..d7d50e187e3 100644
--- a/src/backend/parser/parse_relation.c
+++ b/src/backend/parser/parse_relation.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/parser/parse_relation.c,v 1.94 2004/04/18 18:12:58 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/parser/parse_relation.c,v 1.95 2004/05/26 04:41:30 neilc Exp $
*
*-------------------------------------------------------------------------
*/
@@ -140,7 +140,7 @@ scanNameSpaceForRefname(ParseState *pstate, Node *nsnode,
return NULL;
if (IsA(nsnode, RangeTblRef))
{
- int varno = ((RangeTblRef *) nsnode)->rtindex;
+ int varno = ((RangeTblRef *) nsnode)->rtindex;
RangeTblEntry *rte = rt_fetch(varno, pstate->p_rtable);
if (strcmp(rte->eref->aliasname, refname) == 0)
@@ -174,7 +174,7 @@ scanNameSpaceForRefname(ParseState *pstate, Node *nsnode,
}
else if (IsA(nsnode, List))
{
- List *l;
+ ListCell *l;
foreach(l, (List *) nsnode)
{
@@ -249,7 +249,7 @@ scanNameSpaceForRelid(ParseState *pstate, Node *nsnode, Oid relid)
}
else if (IsA(nsnode, List))
{
- List *l;
+ ListCell *l;
foreach(l, (List *) nsnode)
{
@@ -321,7 +321,7 @@ checkNameSpaceConflicts(ParseState *pstate, Node *namespace1,
}
else if (IsA(namespace1, List))
{
- List *l;
+ ListCell *l;
foreach(l, (List *) namespace1)
checkNameSpaceConflicts(pstate, lfirst(l), namespace2);
@@ -378,7 +378,7 @@ scanNameSpaceForConflict(ParseState *pstate, Node *nsnode,
}
else if (IsA(nsnode, List))
{
- List *l;
+ ListCell *l;
foreach(l, (List *) nsnode)
scanNameSpaceForConflict(pstate, lfirst(l), rte1, aliasname1);
@@ -397,7 +397,7 @@ int
RTERangeTablePosn(ParseState *pstate, RangeTblEntry *rte, int *sublevels_up)
{
int index;
- List *temp;
+ ListCell *l;
if (sublevels_up)
*sublevels_up = 0;
@@ -405,9 +405,9 @@ RTERangeTablePosn(ParseState *pstate, RangeTblEntry *rte, int *sublevels_up)
while (pstate != NULL)
{
index = 1;
- foreach(temp, pstate->p_rtable)
+ foreach(l, pstate->p_rtable)
{
- if (rte == (RangeTblEntry *) lfirst(temp))
+ if (rte == (RangeTblEntry *) lfirst(l))
return index;
index++;
}
@@ -460,7 +460,7 @@ scanRTEForColumn(ParseState *pstate, RangeTblEntry *rte, char *colname)
{
Node *result = NULL;
int attnum = 0;
- List *c;
+ ListCell *c;
/*
* Scan the user column names (or aliases) for a match. Complain if
@@ -546,7 +546,7 @@ colNameToVar(ParseState *pstate, char *colname, bool localonly)
while (pstate != NULL)
{
- List *ns;
+ ListCell *ns;
/*
* We need to look only at top-level namespace items, and even for
@@ -841,7 +841,7 @@ addRangeTableEntryForSubquery(ParseState *pstate,
Alias *eref;
int numaliases;
int varattno;
- List *tlistitem;
+ ListCell *tlistitem;
rte->rtekind = RTE_SUBQUERY;
rte->relid = InvalidOid;
@@ -1027,7 +1027,7 @@ addRangeTableEntryForFunction(ParseState *pstate,
}
else if (functyptype == 'p' && funcrettype == RECORDOID)
{
- List *col;
+ ListCell *col;
/* Use the column definition list to form the alias list */
eref->colnames = NIL;
@@ -1101,11 +1101,8 @@ addRangeTableEntryForJoin(ParseState *pstate,
/* fill in any unspecified alias columns */
if (numaliases < length(colnames))
- {
- while (numaliases-- > 0)
- colnames = lnext(colnames);
- eref->colnames = nconc(eref->colnames, colnames);
- }
+ eref->colnames = nconc(eref->colnames,
+ list_copy_tail(colnames, numaliases));
rte->eref = eref;
@@ -1145,7 +1142,7 @@ isForUpdate(ParseState *pstate, char *refname)
{
if (pstate->p_forUpdate != NIL)
{
- if (lfirst(pstate->p_forUpdate) == NULL)
+ if (linitial(pstate->p_forUpdate) == NULL)
{
/* all tables used in query */
return true;
@@ -1153,7 +1150,7 @@ isForUpdate(ParseState *pstate, char *refname)
else
{
/* just the named tables */
- List *l;
+ ListCell *l;
foreach(l, pstate->p_forUpdate)
{
@@ -1282,8 +1279,8 @@ expandRTE(ParseState *pstate, RangeTblEntry *rte,
case RTE_SUBQUERY:
{
/* Subquery RTE */
- List *aliasp = rte->eref->colnames;
- List *tlistitem;
+ ListCell *aliasp_item = list_head(rte->eref->colnames);
+ ListCell *tlistitem;
varattno = 0;
foreach(tlistitem, rte->subquery->targetList)
@@ -1298,10 +1295,10 @@ expandRTE(ParseState *pstate, RangeTblEntry *rte,
if (colnames)
{
/* Assume there is one alias per target item */
- char *label = strVal(lfirst(aliasp));
+ char *label = strVal(lfirst(aliasp_item));
*colnames = lappend(*colnames, makeString(pstrdup(label)));
- aliasp = lnext(aliasp);
+ aliasp_item = lnext(aliasp_item);
}
if (colvars)
@@ -1385,7 +1382,7 @@ expandRTE(ParseState *pstate, RangeTblEntry *rte,
*/
if (colnames)
*colnames = lappend(*colnames,
- lfirst(rte->eref->colnames));
+ linitial(rte->eref->colnames));
if (colvars)
{
@@ -1400,7 +1397,7 @@ expandRTE(ParseState *pstate, RangeTblEntry *rte,
}
else if (functyptype == 'p' && funcrettype == RECORDOID)
{
- List *col;
+ ListCell *col;
int attnum = 0;
foreach(col, coldeflist)
@@ -1442,39 +1439,36 @@ expandRTE(ParseState *pstate, RangeTblEntry *rte,
case RTE_JOIN:
{
/* Join RTE */
- List *aliasp = rte->eref->colnames;
- List *aliasvars = rte->joinaliasvars;
+ ListCell *colname;
+ ListCell *aliasvar;
+
+ Assert(length(rte->eref->colnames) == length(rte->joinaliasvars));
varattno = 0;
- while (aliasp)
+ forboth (colname, rte->eref->colnames, aliasvar, rte->joinaliasvars)
{
- Assert(aliasvars);
varattno++;
if (colnames)
{
- char *label = strVal(lfirst(aliasp));
+ char *label = strVal(lfirst(colname));
*colnames = lappend(*colnames, makeString(pstrdup(label)));
}
if (colvars)
{
- Node *aliasvar = (Node *) lfirst(aliasvars);
+ Node *avar = (Node *) lfirst(aliasvar);
Var *varnode;
varnode = makeVar(rtindex, varattno,
- exprType(aliasvar),
- exprTypmod(aliasvar),
+ exprType(avar),
+ exprTypmod(avar),
sublevels_up);
*colvars = lappend(*colvars, varnode);
}
-
- aliasp = lnext(aliasp);
- aliasvars = lnext(aliasvars);
}
- Assert(aliasvars == NIL);
}
break;
default:
@@ -1492,14 +1486,16 @@ expandRelAttrs(ParseState *pstate, RangeTblEntry *rte)
{
List *names,
*vars;
+ ListCell *name,
+ *var;
List *te_list = NIL;
expandRTE(pstate, rte, &names, &vars);
- while (names)
+ forboth (name, names, var, vars)
{
- char *label = strVal(lfirst(names));
- Node *varnode = (Node *) lfirst(vars);
+ char *label = strVal(lfirst(name));
+ Node *varnode = (Node *) lfirst(var);
TargetEntry *te = makeNode(TargetEntry);
te->resdom = makeResdom((AttrNumber) pstate->p_next_resno++,
@@ -1509,12 +1505,9 @@ expandRelAttrs(ParseState *pstate, RangeTblEntry *rte)
false);
te->expr = (Expr *) varnode;
te_list = lappend(te_list, te);
-
- names = lnext(names);
- vars = lnext(vars);
}
- Assert(vars == NIL); /* lists not same length? */
+ Assert(name == NULL && var == NULL); /* lists not the same length? */
return te_list;
}
@@ -1790,11 +1783,11 @@ get_rte_attribute_is_dropped(RangeTblEntry *rte, AttrNumber attnum)
TargetEntry *
get_tle_by_resno(List *tlist, AttrNumber resno)
{
- List *i;
+ ListCell *l;
- foreach(i, tlist)
+ foreach(l, tlist)
{
- TargetEntry *tle = (TargetEntry *) lfirst(i);
+ TargetEntry *tle = (TargetEntry *) lfirst(l);
if (tle->resdom->resno == resno)
return tle;
@@ -1917,7 +1910,7 @@ static void
warnAutoRange(ParseState *pstate, RangeVar *relation)
{
bool foundInFromCl = false;
- List *temp;
+ ListCell *temp;
if (!add_missing_from)
{
diff --git a/src/backend/parser/parse_target.c b/src/backend/parser/parse_target.c
index fbee22b37d3..9eaf9eb53a9 100644
--- a/src/backend/parser/parse_target.c
+++ b/src/backend/parser/parse_target.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/parser/parse_target.c,v 1.117 2004/05/10 22:44:46 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/parser/parse_target.c,v 1.118 2004/05/26 04:41:30 neilc Exp $
*
*-------------------------------------------------------------------------
*/
@@ -93,7 +93,7 @@ List *
transformTargetList(ParseState *pstate, List *targetlist)
{
FastList p_target;
- List *o_target;
+ ListCell *o_target;
FastListInit(&p_target);
@@ -134,15 +134,15 @@ transformTargetList(ParseState *pstate, List *targetlist)
{
case 2:
schemaname = NULL;
- relname = strVal(lfirst(fields));
+ relname = strVal(linitial(fields));
break;
case 3:
- schemaname = strVal(lfirst(fields));
+ schemaname = strVal(linitial(fields));
relname = strVal(lsecond(fields));
break;
case 4:
{
- char *name1 = strVal(lfirst(fields));
+ char *name1 = strVal(linitial(fields));
/*
* We check the catalog name and then ignore
@@ -215,7 +215,7 @@ transformTargetList(ParseState *pstate, List *targetlist)
void
markTargetListOrigins(ParseState *pstate, List *targetlist)
{
- List *l;
+ ListCell *l;
foreach(l, targetlist)
{
@@ -468,7 +468,7 @@ checkInsertTargets(ParseState *pstate, List *cols, List **attrnos)
/*
* Do initial validation of user-supplied INSERT column list.
*/
- List *tl;
+ ListCell *tl;
foreach(tl, cols)
{
@@ -502,7 +502,7 @@ ExpandAllTables(ParseState *pstate)
{
List *target = NIL;
bool found_table = false;
- List *ns;
+ ListCell *ns;
foreach(ns, pstate->p_namespace)
{
diff --git a/src/backend/parser/parse_type.c b/src/backend/parser/parse_type.c
index e6e8b00cda4..473d52399e3 100644
--- a/src/backend/parser/parse_type.c
+++ b/src/backend/parser/parse_type.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/parser/parse_type.c,v 1.65 2004/03/21 22:29:11 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/parser/parse_type.c,v 1.66 2004/05/26 04:41:30 neilc Exp $
*
*-------------------------------------------------------------------------
*/
@@ -63,16 +63,16 @@ LookupTypeName(const TypeName *typename)
NameListToString(typename->names))));
break;
case 2:
- rel->relname = strVal(lfirst(typename->names));
+ rel->relname = strVal(linitial(typename->names));
field = strVal(lsecond(typename->names));
break;
case 3:
- rel->schemaname = strVal(lfirst(typename->names));
+ rel->schemaname = strVal(linitial(typename->names));
rel->relname = strVal(lsecond(typename->names));
field = strVal(lthird(typename->names));
break;
case 4:
- rel->catalogname = strVal(lfirst(typename->names));
+ rel->catalogname = strVal(linitial(typename->names));
rel->schemaname = strVal(lsecond(typename->names));
rel->relname = strVal(lthird(typename->names));
field = strVal(lfourth(typename->names));
@@ -155,11 +155,11 @@ TypeNameToString(const TypeName *typename)
if (typename->names != NIL)
{
/* Emit possibly-qualified name as-is */
- List *l;
+ ListCell *l;
foreach(l, typename->names)
{
- if (l != typename->names)
+ if (l != list_head(typename->names))
appendStringInfoChar(&string, '.');
appendStringInfoString(&string, strVal(lfirst(l)));
}
@@ -488,7 +488,7 @@ parseTypeString(const char *str, Oid *type_id, int32 *typmod)
*/
if (length(raw_parsetree_list) != 1)
goto fail;
- stmt = (SelectStmt *) lfirst(raw_parsetree_list);
+ stmt = (SelectStmt *) linitial(raw_parsetree_list);
if (stmt == NULL ||
!IsA(stmt, SelectStmt) ||
stmt->distinctClause != NIL ||
@@ -505,7 +505,7 @@ parseTypeString(const char *str, Oid *type_id, int32 *typmod)
goto fail;
if (length(stmt->targetList) != 1)
goto fail;
- restarget = (ResTarget *) lfirst(stmt->targetList);
+ restarget = (ResTarget *) linitial(stmt->targetList);
if (restarget == NULL ||
!IsA(restarget, ResTarget) ||
restarget->name != NULL ||