diff options
Diffstat (limited to 'src/backend/parser/parse_clause.c')
-rw-r--r-- | src/backend/parser/parse_clause.c | 81 |
1 files changed, 40 insertions, 41 deletions
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; |