]> granicus.if.org Git - postgresql/commitdiff
Reimplement the linked list data structure used throughout the backend.
authorNeil Conway <neilc@samurai.com>
Wed, 26 May 2004 04:41:50 +0000 (04:41 +0000)
committerNeil Conway <neilc@samurai.com>
Wed, 26 May 2004 04:41:50 +0000 (04:41 +0000)
In the past, we used a 'Lispy' linked list implementation: a "list" was
merely a pointer to the head node of the list. The problem with that
design is that it makes lappend() and length() linear time. This patch
fixes that problem (and others) by maintaining a count of the list
length and a pointer to the tail node along with each head node pointer.
A "list" is now a pointer to a structure containing some meta-data
about the list; the head and tail pointers in that structure refer
to ListCell structures that maintain the actual linked list of nodes.

The function names of the list API have also been changed to, I hope,
be more logically consistent. By default, the old function names are
still available; they will be disabled-by-default once the rest of
the tree has been updated to use the new API names.

125 files changed:
src/backend/access/common/printtup.c
src/backend/access/common/tupdesc.c
src/backend/access/nbtree/nbtxlog.c
src/backend/bootstrap/bootparse.y
src/backend/catalog/aclchk.c
src/backend/catalog/dependency.c
src/backend/catalog/heap.c
src/backend/catalog/index.c
src/backend/catalog/namespace.c
src/backend/catalog/pg_proc.c
src/backend/commands/aggregatecmds.c
src/backend/commands/alter.c
src/backend/commands/analyze.c
src/backend/commands/async.c
src/backend/commands/cluster.c
src/backend/commands/comment.c
src/backend/commands/copy.c
src/backend/commands/dbcommands.c
src/backend/commands/define.c
src/backend/commands/explain.c
src/backend/commands/functioncmds.c
src/backend/commands/indexcmds.c
src/backend/commands/lockcmds.c
src/backend/commands/opclasscmds.c
src/backend/commands/operatorcmds.c
src/backend/commands/portalcmds.c
src/backend/commands/prepare.c
src/backend/commands/schemacmds.c
src/backend/commands/sequence.c
src/backend/commands/tablecmds.c
src/backend/commands/trigger.c
src/backend/commands/typecmds.c
src/backend/commands/user.c
src/backend/commands/vacuum.c
src/backend/commands/variable.c
src/backend/commands/view.c
src/backend/executor/execAmi.c
src/backend/executor/execJunk.c
src/backend/executor/execMain.c
src/backend/executor/execProcnode.c
src/backend/executor/execQual.c
src/backend/executor/execScan.c
src/backend/executor/execTuples.c
src/backend/executor/execUtils.c
src/backend/executor/functions.c
src/backend/executor/nodeAgg.c
src/backend/executor/nodeAppend.c
src/backend/executor/nodeFunctionscan.c
src/backend/executor/nodeHash.c
src/backend/executor/nodeHashjoin.c
src/backend/executor/nodeIndexscan.c
src/backend/executor/nodeMergejoin.c
src/backend/executor/nodeSubplan.c
src/backend/executor/nodeTidscan.c
src/backend/executor/spi.c
src/backend/libpq/crypt.c
src/backend/libpq/hba.c
src/backend/nodes/copyfuncs.c
src/backend/nodes/equalfuncs.c
src/backend/nodes/list.c
src/backend/nodes/outfuncs.c
src/backend/nodes/print.c
src/backend/nodes/read.c
src/backend/nodes/readfuncs.c
src/backend/optimizer/geqo/geqo_eval.c
src/backend/optimizer/path/allpaths.c
src/backend/optimizer/path/clausesel.c
src/backend/optimizer/path/costsize.c
src/backend/optimizer/path/indxpath.c
src/backend/optimizer/path/joinpath.c
src/backend/optimizer/path/joinrels.c
src/backend/optimizer/path/orindxpath.c
src/backend/optimizer/path/pathkeys.c
src/backend/optimizer/path/tidpath.c
src/backend/optimizer/plan/createplan.c
src/backend/optimizer/plan/initsplan.c
src/backend/optimizer/plan/planner.c
src/backend/optimizer/plan/setrefs.c
src/backend/optimizer/plan/subselect.c
src/backend/optimizer/prep/prepjointree.c
src/backend/optimizer/prep/prepqual.c
src/backend/optimizer/prep/preptlist.c
src/backend/optimizer/prep/prepunion.c
src/backend/optimizer/util/clauses.c
src/backend/optimizer/util/joininfo.c
src/backend/optimizer/util/pathnode.c
src/backend/optimizer/util/plancat.c
src/backend/optimizer/util/relnode.c
src/backend/optimizer/util/restrictinfo.c
src/backend/optimizer/util/tlist.c
src/backend/optimizer/util/var.c
src/backend/parser/analyze.c
src/backend/parser/gram.y
src/backend/parser/parse_agg.c
src/backend/parser/parse_clause.c
src/backend/parser/parse_coerce.c
src/backend/parser/parse_expr.c
src/backend/parser/parse_func.c
src/backend/parser/parse_node.c
src/backend/parser/parse_relation.c
src/backend/parser/parse_target.c
src/backend/parser/parse_type.c
src/backend/rewrite/rewriteDefine.c
src/backend/rewrite/rewriteHandler.c
src/backend/rewrite/rewriteManip.c
src/backend/tcop/postgres.c
src/backend/tcop/pquery.c
src/backend/tcop/utility.c
src/backend/utils/adt/name.c
src/backend/utils/adt/regproc.c
src/backend/utils/adt/ri_triggers.c
src/backend/utils/adt/ruleutils.c
src/backend/utils/adt/selfuncs.c
src/backend/utils/adt/tid.c
src/backend/utils/adt/varlena.c
src/backend/utils/cache/catcache.c
src/backend/utils/cache/relcache.c
src/backend/utils/cache/typcache.c
src/backend/utils/init/miscinit.c
src/backend/utils/misc/guc.c
src/include/nodes/nodes.h
src/include/nodes/pg_list.h
src/include/parser/parsetree.h
src/pl/plpgsql/src/pl_exec.c
src/pl/tcl/pltcl.c

index 664c884a71219f59a861d265da324dc7a6e2ae67..eb05c994b465784e43a478f9cf7dcce5c927cd76 100644 (file)
@@ -9,7 +9,7 @@
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/access/common/printtup.c,v 1.80 2004/01/07 18:56:23 neilc Exp $
+ *       $PostgreSQL: pgsql/src/backend/access/common/printtup.c,v 1.81 2004/05/26 04:41:03 neilc Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -138,7 +138,7 @@ printtup_startup(DestReceiver *self, int operation, TupleDesc typeinfo)
                List       *targetlist;
 
                if (portal->strategy == PORTAL_ONE_SELECT)
-                       targetlist = ((Query *) lfirst(portal->parseTrees))->targetList;
+                       targetlist = ((Query *) linitial(portal->parseTrees))->targetList;
                else
                        targetlist = NIL;
 
@@ -176,6 +176,7 @@ SendRowDescriptionMessage(TupleDesc typeinfo, List *targetlist, int16 *formats)
        int                     proto = PG_PROTOCOL_MAJOR(FrontendProtocol);
        int                     i;
        StringInfoData buf;
+       ListCell   *tlist_item = list_head(targetlist);
 
        pq_beginmessage(&buf, 'T'); /* tuple descriptor message type */
        pq_sendint(&buf, natts, 2); /* # of attrs in tuples */
@@ -191,16 +192,16 @@ SendRowDescriptionMessage(TupleDesc typeinfo, List *targetlist, int16 *formats)
                if (proto >= 3)
                {
                        /* Do we have a non-resjunk tlist item? */
-                       while (targetlist &&
-                                  ((TargetEntry *) lfirst(targetlist))->resdom->resjunk)
-                               targetlist = lnext(targetlist);
-                       if (targetlist)
+                       while (tlist_item &&
+                                  ((TargetEntry *) lfirst(tlist_item))->resdom->resjunk)
+                               tlist_item = lnext(tlist_item);
+                       if (tlist_item)
                        {
-                               Resdom     *res = ((TargetEntry *) lfirst(targetlist))->resdom;
+                               Resdom     *res = ((TargetEntry *) lfirst(tlist_item))->resdom;
 
                                pq_sendint(&buf, res->resorigtbl, 4);
                                pq_sendint(&buf, res->resorigcol, 2);
-                               targetlist = lnext(targetlist);
+                               tlist_item = lnext(tlist_item);
                        }
                        else
                        {
index 1a016d86f80302631e542faea5c11449ba7df802..4a3c2721c7b6595c82308dba37437870c5dec001 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/access/common/tupdesc.c,v 1.102 2004/04/01 21:28:43 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/access/common/tupdesc.c,v 1.103 2004/05/26 04:41:03 neilc Exp $
  *
  * NOTES
  *       some of the executor utility code such as "ExecTypeFromTL" should be
@@ -472,7 +472,7 @@ BuildDescForRelation(List *schema)
 {
        int                     natts;
        AttrNumber      attnum;
-       List       *p;
+       ListCell   *l;
        TupleDesc       desc;
        AttrDefault *attrdef = NULL;
        TupleConstr *constr = (TupleConstr *) palloc0(sizeof(TupleConstr));
@@ -490,9 +490,9 @@ BuildDescForRelation(List *schema)
 
        attnum = 0;
 
-       foreach(p, schema)
+       foreach(l, schema)
        {
-               ColumnDef  *entry = lfirst(p);
+               ColumnDef  *entry = lfirst(l);
 
                /*
                 * for each entry in the list, get the name and type information
@@ -661,7 +661,7 @@ TypeGetTupleDesc(Oid typeoid, List *colaliases)
                                         errmsg("number of aliases does not match number of columns")));
 
                /* OK, get the column alias */
-               attname = strVal(lfirst(colaliases));
+               attname = strVal(linitial(colaliases));
 
                tupdesc = CreateTemplateTupleDesc(1, false);
                TupleDescInitEntry(tupdesc,
index 02dbd33341d643d90f59afbb6430180eb3d0ce72..693279f12ac99064326297e587f24e80253aa702 100644 (file)
@@ -8,7 +8,7 @@
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/access/nbtree/nbtxlog.c,v 1.10 2004/01/07 18:56:24 neilc Exp $
+ *       $PostgreSQL: pgsql/src/backend/access/nbtree/nbtxlog.c,v 1.11 2004/05/26 04:41:05 neilc Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -59,7 +59,7 @@ forget_matching_split(Relation reln, RelFileNode node,
        Page            page;
        BTItem          btitem;
        BlockNumber rightblk;
-       List       *l;
+       ListCell   *l;
 
        /* Get downlink TID from page */
        buffer = XLogReadBuffer(false, reln, insertblk);
@@ -964,7 +964,7 @@ btree_xlog_startup(void)
 void
 btree_xlog_cleanup(void)
 {
-       List       *l;
+       ListCell   *l;
 
        foreach(l, incomplete_splits)
        {
index debf24e892d5738c2810e59071f75456540fbf47..4047958b1d978851c800e4c4bf304dbfa37f59f6 100644 (file)
@@ -9,7 +9,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/bootstrap/bootparse.y,v 1.67 2004/05/21 05:07:56 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/bootstrap/bootparse.y,v 1.68 2004/05/26 04:41:05 neilc Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -271,7 +271,7 @@ Boot_BuildIndsStmt:
 
 boot_index_params:
                boot_index_params COMMA boot_index_param        { $$ = lappend($1, $3); }
-               | boot_index_param                                                      { $$ = makeList1($1); }
+               | boot_index_param                                                      { $$ = list_make1($1); }
                ;
 
 boot_index_param:
@@ -280,7 +280,7 @@ boot_index_param:
                                        IndexElem *n = makeNode(IndexElem);
                                        n->name = LexIDStr($1);
                                        n->expr = NULL;
-                                       n->opclass = makeList1(makeString(LexIDStr($2)));
+                                       n->opclass = list_make1(makeString(LexIDStr($2)));
                                        $$ = n;
                                }
                ;
index 8e27f10d39a8226f70b57ae67b6eccf77ec42f49..cabeb690884ae9882899e76944dd6db7f5cc8e87 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/catalog/aclchk.c,v 1.98 2004/05/11 17:36:12 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/catalog/aclchk.c,v 1.99 2004/05/26 04:41:06 neilc Exp $
  *
  * NOTES
  *       See acl.h.
@@ -110,7 +110,7 @@ merge_acl_with_grant(Acl *old_acl, bool is_grant,
                                         AclId grantor_uid, AclId owner_uid)
 {
        unsigned        modechg;
-       List       *j;
+       ListCell   *j;
        Acl                *new_acl;
 
        modechg = is_grant ? ACL_MODECHG_ADD : ACL_MODECHG_DEL;
@@ -221,16 +221,16 @@ static void
 ExecuteGrantStmt_Relation(GrantStmt *stmt)
 {
        AclMode         privileges;
-       List       *i;
+       ListCell   *i;
 
-       if (lfirsti(stmt->privileges) == ACL_ALL_RIGHTS)
+       if (linitial_int(stmt->privileges) == ACL_ALL_RIGHTS)
                privileges = ACL_ALL_RIGHTS_RELATION;
        else
        {
                privileges = ACL_NO_RIGHTS;
                foreach(i, stmt->privileges)
                {
-                       AclMode         priv = lfirsti(i);
+                       AclMode         priv = lfirst_int(i);
 
                        if (priv & ~((AclMode) ACL_ALL_RIGHTS_RELATION))
                                ereport(ERROR,
@@ -328,16 +328,16 @@ static void
 ExecuteGrantStmt_Database(GrantStmt *stmt)
 {
        AclMode         privileges;
-       List       *i;
+       ListCell   *i;
 
-       if (lfirsti(stmt->privileges) == ACL_ALL_RIGHTS)
+       if (linitial_int(stmt->privileges) == ACL_ALL_RIGHTS)
                privileges = ACL_ALL_RIGHTS_DATABASE;
        else
        {
                privileges = ACL_NO_RIGHTS;
                foreach(i, stmt->privileges)
                {
-                       AclMode         priv = lfirsti(i);
+                       AclMode         priv = lfirst_int(i);
 
                        if (priv & ~((AclMode) ACL_ALL_RIGHTS_DATABASE))
                                ereport(ERROR,
@@ -433,16 +433,16 @@ static void
 ExecuteGrantStmt_Function(GrantStmt *stmt)
 {
        AclMode         privileges;
-       List       *i;
+       ListCell   *i;
 
-       if (lfirsti(stmt->privileges) == ACL_ALL_RIGHTS)
+       if (linitial_int(stmt->privileges) == ACL_ALL_RIGHTS)
                privileges = ACL_ALL_RIGHTS_FUNCTION;
        else
        {
                privileges = ACL_NO_RIGHTS;
                foreach(i, stmt->privileges)
                {
-                       AclMode         priv = lfirsti(i);
+                       AclMode         priv = lfirst_int(i);
 
                        if (priv & ~((AclMode) ACL_ALL_RIGHTS_FUNCTION))
                                ereport(ERROR,
@@ -534,16 +534,16 @@ static void
 ExecuteGrantStmt_Language(GrantStmt *stmt)
 {
        AclMode         privileges;
-       List       *i;
+       ListCell   *i;
 
-       if (lfirsti(stmt->privileges) == ACL_ALL_RIGHTS)
+       if (linitial_int(stmt->privileges) == ACL_ALL_RIGHTS)
                privileges = ACL_ALL_RIGHTS_LANGUAGE;
        else
        {
                privileges = ACL_NO_RIGHTS;
                foreach(i, stmt->privileges)
                {
-                       AclMode         priv = lfirsti(i);
+                       AclMode         priv = lfirst_int(i);
 
                        if (priv & ~((AclMode) ACL_ALL_RIGHTS_LANGUAGE))
                                ereport(ERROR,
@@ -643,16 +643,16 @@ static void
 ExecuteGrantStmt_Namespace(GrantStmt *stmt)
 {
        AclMode         privileges;
-       List       *i;
+       ListCell   *i;
 
-       if (lfirsti(stmt->privileges) == ACL_ALL_RIGHTS)
+       if (linitial_int(stmt->privileges) == ACL_ALL_RIGHTS)
                privileges = ACL_ALL_RIGHTS_NAMESPACE;
        else
        {
                privileges = ACL_NO_RIGHTS;
                foreach(i, stmt->privileges)
                {
-                       AclMode         priv = lfirsti(i);
+                       AclMode         priv = lfirst_int(i);
 
                        if (priv & ~((AclMode) ACL_ALL_RIGHTS_NAMESPACE))
                                ereport(ERROR,
index 5f2b2ea28a070b816449d3858861d820a9004de4..9d4e1c6a5c48773571b2d948d3769dbccee4ada0 100644 (file)
@@ -8,7 +8,7 @@
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/catalog/dependency.c,v 1.35 2004/05/05 04:48:45 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/catalog/dependency.c,v 1.36 2004/05/26 04:41:06 neilc Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -841,7 +841,7 @@ recordDependencyOnExpr(const ObjectAddress *depender,
        init_object_addresses(&context.addrs);
 
        /* Set up interpretation for Vars at varlevelsup = 0 */
-       context.rtables = makeList1(rtable);
+       context.rtables = list_make1(rtable);
 
        /* Scan the expression tree for referenceable objects */
        find_expr_references_walker(expr, &context);
@@ -883,7 +883,7 @@ recordDependencyOnSingleRelExpr(const ObjectAddress *depender,
        rte.rtekind = RTE_RELATION;
        rte.relid = relId;
 
-       context.rtables = makeList1(makeList1(&rte));
+       context.rtables = list_make1(list_make1(&rte));
 
        /* Scan the expression tree for referenceable objects */
        find_expr_references_walker(expr, &context);
@@ -960,24 +960,14 @@ find_expr_references_walker(Node *node,
        if (IsA(node, Var))
        {
                Var                *var = (Var *) node;
-               int                     levelsup;
-               List       *rtable,
-                                  *rtables;
+               List       *rtable;
                RangeTblEntry *rte;
 
                /* Find matching rtable entry, or complain if not found */
-               levelsup = var->varlevelsup;
-               rtables = context->rtables;
-               while (levelsup--)
-               {
-                       if (rtables == NIL)
-                               break;
-                       rtables = lnext(rtables);
-               }
-               if (rtables == NIL)
+               if (var->varlevelsup >= list_length(context->rtables))
                        elog(ERROR, "invalid varlevelsup %d", var->varlevelsup);
-               rtable = lfirst(rtables);
-               if (var->varno <= 0 || var->varno > length(rtable))
+               rtable = (List *) list_nth(context->rtables, var->varlevelsup);
+               if (var->varno <= 0 || var->varno > list_length(rtable))
                        elog(ERROR, "invalid varno %d", var->varno);
                rte = rt_fetch(var->varno, rtable);
                if (rte->rtekind == RTE_RELATION)
@@ -994,13 +984,15 @@ find_expr_references_walker(Node *node,
 
                        /* We must make the context appropriate for join's level */
                        save_rtables = context->rtables;
-                       context->rtables = rtables;
+                       context->rtables = list_copy_tail(context->rtables,
+                                                                                         var->varlevelsup);
                        if (var->varattno <= 0 ||
-                               var->varattno > length(rte->joinaliasvars))
+                               var->varattno > list_length(rte->joinaliasvars))
                                elog(ERROR, "invalid varattno %d", var->varattno);
-                       find_expr_references_walker((Node *) nth(var->varattno - 1,
-                                                                                                        rte->joinaliasvars),
+                       find_expr_references_walker((Node *) list_nth(rte->joinaliasvars,
+                                                                                                                 var->varattno - 1),
                                                                                context);
+                       list_free(context->rtables);
                        context->rtables = save_rtables;
                }
                return false;
@@ -1056,11 +1048,11 @@ find_expr_references_walker(Node *node,
        if (IsA(node, SubLink))
        {
                SubLink    *sublink = (SubLink *) node;
-               List       *opid;
+               ListCell   *opid;
 
                foreach(opid, sublink->operOids)
                {
-                       add_object_address(OCLASS_OPERATOR, lfirsto(opid), 0,
+                       add_object_address(OCLASS_OPERATOR, lfirst_oid(opid), 0,
                                                           &context->addrs);
                }
                /* fall through to examine arguments */
@@ -1074,7 +1066,7 @@ find_expr_references_walker(Node *node,
        {
                /* Recurse into RTE subquery or not-yet-planned sublink subquery */
                Query      *query = (Query *) node;
-               List       *rtable;
+               ListCell   *rtable;
                bool            result;
 
                /*
@@ -1099,7 +1091,7 @@ find_expr_references_walker(Node *node,
                                                                   find_expr_references_walker,
                                                                   (void *) context,
                                                                   QTW_IGNORE_JOINALIASES);
-               context->rtables = lnext(context->rtables);
+               context->rtables = list_delete_first(context->rtables);
                return result;
        }
        return expression_tree_walker(node, find_expr_references_walker,
index 94f1fd2a13d2570c1fb5787947e9162f0a254046..a7ffe38b53155f1611f7a4104d7c843ecd785c47 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/catalog/heap.c,v 1.264 2004/05/08 19:09:24 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/catalog/heap.c,v 1.265 2004/05/26 04:41:07 neilc Exp $
  *
  *
  * INTERFACE ROUTINES
@@ -1379,11 +1379,11 @@ StoreRelCheck(Relation rel, char *ccname, char *ccbin)
         * contents of subselects.
         */
        varList = pull_var_clause(expr, false);
-       keycount = length(varList);
+       keycount = list_length(varList);
 
        if (keycount > 0)
        {
-               List       *vl;
+               ListCell   *vl;
                int                     i = 0;
 
                attNos = (int16 *) palloc(keycount * sizeof(int16));
@@ -1505,7 +1505,7 @@ AddRelationRawConstraints(Relation rel,
        RangeTblEntry *rte;
        int                     numchecks;
        int                     constr_name_ctr = 0;
-       List       *listptr;
+       ListCell   *cell;
        Node       *expr;
        CookedConstraint *cooked;
 
@@ -1540,9 +1540,9 @@ AddRelationRawConstraints(Relation rel,
        /*
         * Process column default expressions.
         */
-       foreach(listptr, rawColDefaults)
+       foreach(cell, rawColDefaults)
        {
-               RawColumnDefault *colDef = (RawColumnDefault *) lfirst(listptr);
+               RawColumnDefault *colDef = (RawColumnDefault *) lfirst(cell);
                Form_pg_attribute atp = rel->rd_att->attrs[colDef->attnum - 1];
 
                expr = cookDefault(pstate, colDef->raw_default,
@@ -1563,9 +1563,9 @@ AddRelationRawConstraints(Relation rel,
         * Process constraint expressions.
         */
        numchecks = numoldchecks;
-       foreach(listptr, rawConstraints)
+       foreach(cell, rawConstraints)
        {
-               Constraint *cdef = (Constraint *) lfirst(listptr);
+               Constraint *cdef = (Constraint *) lfirst(cell);
                char       *ccname;
 
                if (cdef->contype != CONSTR_CHECK || cdef->raw_expr == NULL)
@@ -1575,7 +1575,7 @@ AddRelationRawConstraints(Relation rel,
                /* Check name uniqueness, or generate a new name */
                if (cdef->name != NULL)
                {
-                       List       *listptr2;
+                       ListCell   *cell2;
 
                        ccname = cdef->name;
                        /* Check against pre-existing constraints */
@@ -1589,9 +1589,9 @@ AddRelationRawConstraints(Relation rel,
                                                                ccname, RelationGetRelationName(rel))));
                        /* Check against other new constraints */
                        /* Needed because we don't do CommandCounterIncrement in loop */
-                       foreach(listptr2, rawConstraints)
+                       foreach(cell2, rawConstraints)
                        {
-                               Constraint *cdef2 = (Constraint *) lfirst(listptr2);
+                               Constraint *cdef2 = (Constraint *) lfirst(cell2);
 
                                if (cdef2 == cdef ||
                                        cdef2->contype != CONSTR_CHECK ||
@@ -1611,7 +1611,7 @@ AddRelationRawConstraints(Relation rel,
 
                        do
                        {
-                               List       *listptr2;
+                               ListCell   *cell2;
 
                                /*
                                 * Generate a name that does not conflict with
@@ -1629,9 +1629,9 @@ AddRelationRawConstraints(Relation rel,
                                 * name.
                                 */
                                success = true;
-                               foreach(listptr2, rawConstraints)
+                               foreach(cell2, rawConstraints)
                                {
-                                       Constraint *cdef2 = (Constraint *) lfirst(listptr2);
+                                       Constraint *cdef2 = (Constraint *) lfirst(cell2);
 
                                        if (cdef2 == cdef ||
                                                cdef2->contype != CONSTR_CHECK ||
@@ -1660,7 +1660,7 @@ AddRelationRawConstraints(Relation rel,
                /*
                 * Make sure no outside relations are referred to.
                 */
-               if (length(pstate->p_rtable) != 1)
+               if (list_length(pstate->p_rtable) != 1)
                        ereport(ERROR,
                                        (errcode(ERRCODE_INVALID_COLUMN_REFERENCE),
                                         errmsg("only table \"%s\" can be referenced in check constraint",
@@ -1949,7 +1949,7 @@ static void
 RelationTruncateIndexes(Oid heapId)
 {
        Relation        heapRelation;
-       List       *indlist;
+       ListCell   *indlist;
 
        /*
         * Open the heap rel.  We need grab no lock because we assume
@@ -1960,7 +1960,7 @@ RelationTruncateIndexes(Oid heapId)
        /* Ask the relcache to produce a list of the indexes of the rel */
        foreach(indlist, RelationGetIndexList(heapRelation))
        {
-               Oid                     indexId = lfirsto(indlist);
+               Oid                     indexId = lfirst_oid(indlist);
                Relation        currentIndex;
                IndexInfo  *indexInfo;
 
index d6d38795df8049bc8e481e556304a28860a92883..0ccecac66808f7986c7886255bc7c6c7aae1daab 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/catalog/index.c,v 1.231 2004/05/08 19:09:24 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/catalog/index.c,v 1.232 2004/05/26 04:41:07 neilc Exp $
  *
  *
  * INTERFACE ROUTINES
@@ -88,7 +88,7 @@ ConstructTupleDescriptor(Relation heapRelation,
                                                 Oid *classObjectId)
 {
        int                     numatts = indexInfo->ii_NumIndexAttrs;
-       List       *indexprs = indexInfo->ii_Expressions;
+       ListCell   *indexpr_item = list_head(indexInfo->ii_Expressions);
        TupleDesc       heapTupDesc;
        TupleDesc       indexTupDesc;
        int                     natts;                  /* #atts in heap rel --- for error checks */
@@ -165,10 +165,10 @@ ConstructTupleDescriptor(Relation heapRelation,
                        /* Expressional index */
                        Node       *indexkey;
 
-                       if (indexprs == NIL)    /* shouldn't happen */
+                       if (indexpr_item == NULL)       /* shouldn't happen */
                                elog(ERROR, "too few entries in indexprs list");
-                       indexkey = (Node *) lfirst(indexprs);
-                       indexprs = lnext(indexprs);
+                       indexkey = (Node *) lfirst(indexpr_item);
+                       indexpr_item = lnext(indexpr_item);
 
                        /*
                         * Make the attribute's name "pg_expresssion_nnn" (maybe think
@@ -928,7 +928,7 @@ FormIndexDatum(IndexInfo *indexInfo,
                           Datum *datum,
                           char *nullv)
 {
-       List       *indexprs;
+       ListCell   *indexpr_item;
        int                     i;
 
        if (indexInfo->ii_Expressions != NIL &&
@@ -941,7 +941,7 @@ FormIndexDatum(IndexInfo *indexInfo,
                /* Check caller has set up context correctly */
                Assert(GetPerTupleExprContext(estate)->ecxt_scantuple->val == heapTuple);
        }
-       indexprs = indexInfo->ii_ExpressionsState;
+       indexpr_item = list_head(indexInfo->ii_ExpressionsState);
 
        for (i = 0; i < indexInfo->ii_NumIndexAttrs; i++)
        {
@@ -962,19 +962,19 @@ FormIndexDatum(IndexInfo *indexInfo,
                        /*
                         * Index expression --- need to evaluate it.
                         */
-                       if (indexprs == NIL)
+                       if (indexpr_item == NULL)
                                elog(ERROR, "wrong number of index expressions");
-                       iDatum = ExecEvalExprSwitchContext((ExprState *) lfirst(indexprs),
+                       iDatum = ExecEvalExprSwitchContext((ExprState *) lfirst(indexpr_item),
                                                                                  GetPerTupleExprContext(estate),
                                                                                           &isNull,
                                                                                           NULL);
-                       indexprs = lnext(indexprs);
+                       indexpr_item = lnext(indexpr_item);
                }
                datum[i] = iDatum;
                nullv[i] = (isNull) ? 'n' : ' ';
        }
 
-       if (indexprs != NIL)
+       if (indexpr_item != NULL)
                elog(ERROR, "wrong number of index expressions");
 }
 
@@ -1738,8 +1738,8 @@ reindex_relation(Oid relid, bool toast_too)
        bool            is_pg_class;
        bool            result;
        List       *indexIds,
-                          *doneIndexes,
-                          *indexId;
+                          *doneIndexes;
+       ListCell   *indexId;
 
        /*
         * Ensure to hold an exclusive lock throughout the transaction. The
@@ -1780,7 +1780,7 @@ reindex_relation(Oid relid, bool toast_too)
        /* Reindex all the indexes. */
        foreach(indexId, indexIds)
        {
-               Oid             indexOid = lfirsto(indexId);
+               Oid             indexOid = lfirst_oid(indexId);
 
                if (is_pg_class)
                        RelationSetIndexList(rel, doneIndexes);
@@ -1790,7 +1790,7 @@ reindex_relation(Oid relid, bool toast_too)
                CommandCounterIncrement();
 
                if (is_pg_class)
-                       doneIndexes = lappendo(doneIndexes, indexOid);
+                       doneIndexes = lappend_oid(doneIndexes, indexOid);
        }
 
        if (is_pg_class)
index 91a604eac7eaa65398c8c9c590cdf60c34c4961b..e9b5a35ba72a368496762474fc1cd16badb95aa3 100644 (file)
@@ -13,7 +13,7 @@
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/catalog/namespace.c,v 1.63 2004/02/13 01:08:20 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/catalog/namespace.c,v 1.64 2004/05/26 04:41:07 neilc Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -276,13 +276,13 @@ Oid
 RelnameGetRelid(const char *relname)
 {
        Oid                     relid;
-       List       *lptr;
+       ListCell   *l;
 
        recomputeNamespacePath();
 
-       foreach(lptr, namespaceSearchPath)
+       foreach(l, namespaceSearchPath)
        {
-               Oid                     namespaceId = lfirsto(lptr);
+               Oid                     namespaceId = lfirst_oid(l);
 
                relid = get_relname_relid(relname, namespaceId);
                if (OidIsValid(relid))
@@ -320,11 +320,11 @@ RelationIsVisible(Oid relid)
        /*
         * Quick check: if it ain't in the path at all, it ain't visible.
         * Items in the system namespace are surely in the path and so we
-        * needn't even do oidMember() for them.
+        * needn't even do list_member_oid() for them.
         */
        relnamespace = relform->relnamespace;
        if (relnamespace != PG_CATALOG_NAMESPACE &&
-               !oidMember(relnamespace, namespaceSearchPath))
+               !list_member_oid(namespaceSearchPath, relnamespace))
                visible = false;
        else
        {
@@ -356,13 +356,13 @@ Oid
 TypenameGetTypid(const char *typname)
 {
        Oid                     typid;
-       List       *lptr;
+       ListCell   *l;
 
        recomputeNamespacePath();
 
-       foreach(lptr, namespaceSearchPath)
+       foreach(l, namespaceSearchPath)
        {
-               Oid                     namespaceId = lfirsto(lptr);
+               Oid                     namespaceId = lfirst_oid(l);
 
                typid = GetSysCacheOid(TYPENAMENSP,
                                                           PointerGetDatum(typname),
@@ -402,11 +402,11 @@ TypeIsVisible(Oid typid)
        /*
         * Quick check: if it ain't in the path at all, it ain't visible.
         * Items in the system namespace are surely in the path and so we
-        * needn't even do oidMember() for them.
+        * needn't even do list_member_oid() for them.
         */
        typnamespace = typform->typnamespace;
        if (typnamespace != PG_CATALOG_NAMESPACE &&
-               !oidMember(typnamespace, namespaceSearchPath))
+               !list_member_oid(namespaceSearchPath, typnamespace))
                visible = false;
        else
        {
@@ -496,15 +496,15 @@ FuncnameGetCandidates(List *names, int nargs)
                else
                {
                        /* Consider only procs that are in the search path */
-                       List       *nsp;
+                       ListCell   *nsp;
 
                        foreach(nsp, namespaceSearchPath)
                        {
-                               if (procform->pronamespace == lfirsto(nsp))
+                               if (procform->pronamespace == lfirst_oid(nsp))
                                        break;
                                pathpos++;
                        }
-                       if (nsp == NIL)
+                       if (nsp == NULL)
                                continue;               /* proc is not in search path */
 
                        /*
@@ -603,11 +603,11 @@ FunctionIsVisible(Oid funcid)
        /*
         * Quick check: if it ain't in the path at all, it ain't visible.
         * Items in the system namespace are surely in the path and so we
-        * needn't even do oidMember() for them.
+        * needn't even do list_member_oid() for them.
         */
        pronamespace = procform->pronamespace;
        if (pronamespace != PG_CATALOG_NAMESPACE &&
-               !oidMember(pronamespace, namespaceSearchPath))
+               !list_member_oid(namespaceSearchPath, pronamespace))
                visible = false;
        else
        {
@@ -623,7 +623,7 @@ FunctionIsVisible(Oid funcid)
 
                visible = false;
 
-               clist = FuncnameGetCandidates(makeList1(makeString(proname)), nargs);
+               clist = FuncnameGetCandidates(list_make1(makeString(proname)), nargs);
 
                for (; clist; clist = clist->next)
                {
@@ -727,15 +727,15 @@ OpernameGetCandidates(List *names, char oprkind)
                else
                {
                        /* Consider only opers that are in the search path */
-                       List       *nsp;
+                       ListCell   *nsp;
 
                        foreach(nsp, namespaceSearchPath)
                        {
-                               if (operform->oprnamespace == lfirsto(nsp))
+                               if (operform->oprnamespace == lfirst_oid(nsp))
                                        break;
                                pathpos++;
                        }
-                       if (nsp == NIL)
+                       if (nsp == NULL)
                                continue;               /* oper is not in search path */
 
                        /*
@@ -832,11 +832,11 @@ OperatorIsVisible(Oid oprid)
        /*
         * Quick check: if it ain't in the path at all, it ain't visible.
         * Items in the system namespace are surely in the path and so we
-        * needn't even do oidMember() for them.
+        * needn't even do list_member_oid() for them.
         */
        oprnamespace = oprform->oprnamespace;
        if (oprnamespace != PG_CATALOG_NAMESPACE &&
-               !oidMember(oprnamespace, namespaceSearchPath))
+               !list_member_oid(namespaceSearchPath, oprnamespace))
                visible = false;
        else
        {
@@ -852,7 +852,7 @@ OperatorIsVisible(Oid oprid)
 
                visible = false;
 
-               clist = OpernameGetCandidates(makeList1(makeString(oprname)),
+               clist = OpernameGetCandidates(list_make1(makeString(oprname)),
                                                                          oprform->oprkind);
 
                for (; clist; clist = clist->next)
@@ -903,16 +903,16 @@ OpclassGetCandidates(Oid amid)
                Form_pg_opclass opcform = (Form_pg_opclass) GETSTRUCT(opctup);
                int                     pathpos = 0;
                OpclassCandidateList newResult;
-               List       *nsp;
+               ListCell   *nsp;
 
                /* Consider only opclasses that are in the search path */
                foreach(nsp, namespaceSearchPath)
                {
-                       if (opcform->opcnamespace == lfirsto(nsp))
+                       if (opcform->opcnamespace == lfirst_oid(nsp))
                                break;
                        pathpos++;
                }
-               if (nsp == NIL)
+               if (nsp == NULL)
                        continue;                       /* opclass is not in search path */
 
                /*
@@ -998,13 +998,13 @@ Oid
 OpclassnameGetOpcid(Oid amid, const char *opcname)
 {
        Oid                     opcid;
-       List       *lptr;
+       ListCell   *l;
 
        recomputeNamespacePath();
 
-       foreach(lptr, namespaceSearchPath)
+       foreach(l, namespaceSearchPath)
        {
-               Oid                     namespaceId = lfirsto(lptr);
+               Oid                     namespaceId = lfirst_oid(l);
 
                opcid = GetSysCacheOid(CLAAMNAMENSP,
                                                           ObjectIdGetDatum(amid),
@@ -1045,11 +1045,11 @@ OpclassIsVisible(Oid opcid)
        /*
         * Quick check: if it ain't in the path at all, it ain't visible.
         * Items in the system namespace are surely in the path and so we
-        * needn't even do oidMember() for them.
+        * needn't even do list_member_oid() for them.
         */
        opcnamespace = opcform->opcnamespace;
        if (opcnamespace != PG_CATALOG_NAMESPACE &&
-               !oidMember(opcnamespace, namespaceSearchPath))
+               !list_member_oid(namespaceSearchPath, opcnamespace))
                visible = false;
        else
        {
@@ -1080,13 +1080,13 @@ Oid
 ConversionGetConid(const char *conname)
 {
        Oid                     conid;
-       List       *lptr;
+       ListCell   *l;
 
        recomputeNamespacePath();
 
-       foreach(lptr, namespaceSearchPath)
+       foreach(l, namespaceSearchPath)
        {
-               Oid                     namespaceId = lfirsto(lptr);
+               Oid                     namespaceId = lfirst_oid(l);
 
                conid = GetSysCacheOid(CONNAMENSP,
                                                           PointerGetDatum(conname),
@@ -1126,11 +1126,11 @@ ConversionIsVisible(Oid conid)
        /*
         * Quick check: if it ain't in the path at all, it ain't visible.
         * Items in the system namespace are surely in the path and so we
-        * needn't even do oidMember() for them.
+        * needn't even do list_member_oid() for them.
         */
        connamespace = conform->connamespace;
        if (connamespace != PG_CATALOG_NAMESPACE &&
-               !oidMember(connamespace, namespaceSearchPath))
+               !list_member_oid(namespaceSearchPath, connamespace))
                visible = false;
        else
        {
@@ -1166,17 +1166,17 @@ DeconstructQualifiedName(List *names,
        char       *schemaname = NULL;
        char       *objname = NULL;
 
-       switch (length(names))
+       switch (list_length(names))
        {
                case 1:
-                       objname = strVal(lfirst(names));
+                       objname = strVal(linitial(names));
                        break;
                case 2:
-                       schemaname = strVal(lfirst(names));
+                       schemaname = strVal(linitial(names));
                        objname = strVal(lsecond(names));
                        break;
                case 3:
-                       catalogname = strVal(lfirst(names));
+                       catalogname = strVal(linitial(names));
                        schemaname = strVal(lsecond(names));
                        objname = strVal(lthird(names));
 
@@ -1287,17 +1287,17 @@ makeRangeVarFromNameList(List *names)
 {
        RangeVar   *rel = makeRangeVar(NULL, NULL);
 
-       switch (length(names))
+       switch (list_length(names))
        {
                case 1:
-                       rel->relname = strVal(lfirst(names));
+                       rel->relname = strVal(linitial(names));
                        break;
                case 2:
-                       rel->schemaname = strVal(lfirst(names));
+                       rel->schemaname = strVal(linitial(names));
                        rel->relname = strVal(lsecond(names));
                        break;
                case 3:
-                       rel->catalogname = strVal(lfirst(names));
+                       rel->catalogname = strVal(linitial(names));
                        rel->schemaname = strVal(lsecond(names));
                        rel->relname = strVal(lthird(names));
                        break;
@@ -1323,13 +1323,13 @@ char *
 NameListToString(List *names)
 {
        StringInfoData string;
-       List       *l;
+       ListCell   *l;
 
        initStringInfo(&string);
 
        foreach(l, names)
        {
-               if (l != names)
+               if (l != list_head(names))
                        appendStringInfoChar(&string, '.');
                appendStringInfoString(&string, strVal(lfirst(l)));
        }
@@ -1348,13 +1348,13 @@ char *
 NameListToQuotedString(List *names)
 {
        StringInfoData string;
-       List       *l;
+       ListCell   *l;
 
        initStringInfo(&string);
 
        foreach(l, names)
        {
-               if (l != names)
+               if (l != list_head(names))
                        appendStringInfoChar(&string, '.');
                appendStringInfoString(&string, quote_identifier(strVal(lfirst(l))));
        }
@@ -1435,7 +1435,7 @@ FindConversionByName(List *name)
        char       *conversion_name;
        Oid                     namespaceId;
        Oid                     conoid;
-       List       *lptr;
+       ListCell   *l;
 
        /* deconstruct the name list */
        DeconstructQualifiedName(name, &schemaname, &conversion_name);
@@ -1451,9 +1451,9 @@ FindConversionByName(List *name)
                /* search for it in search path */
                recomputeNamespacePath();
 
-               foreach(lptr, namespaceSearchPath)
+               foreach(l, namespaceSearchPath)
                {
-                       namespaceId = lfirsto(lptr);
+                       namespaceId = lfirst_oid(l);
                        conoid = FindConversion(conversion_name, namespaceId);
                        if (OidIsValid(conoid))
                                return conoid;
@@ -1471,13 +1471,13 @@ Oid
 FindDefaultConversionProc(int4 for_encoding, int4 to_encoding)
 {
        Oid                     proc;
-       List       *lptr;
+       ListCell   *l;
 
        recomputeNamespacePath();
 
-       foreach(lptr, namespaceSearchPath)
+       foreach(l, namespaceSearchPath)
        {
-               Oid                     namespaceId = lfirsto(lptr);
+               Oid                     namespaceId = lfirst_oid(l);
 
                proc = FindDefaultConversion(namespaceId, for_encoding, to_encoding);
                if (OidIsValid(proc))
@@ -1499,7 +1499,7 @@ recomputeNamespacePath(void)
        List       *namelist;
        List       *oidlist;
        List       *newpath;
-       List       *l;
+       ListCell   *l;
        Oid                     firstNS;
        MemoryContext oldcxt;
 
@@ -1550,10 +1550,10 @@ recomputeNamespacePath(void)
                                                                                         0, 0, 0);
                                ReleaseSysCache(tuple);
                                if (OidIsValid(namespaceId) &&
-                                       !oidMember(namespaceId, oidlist) &&
+                                       !list_member_oid(oidlist, namespaceId) &&
                                        pg_namespace_aclcheck(namespaceId, userId,
                                                                                  ACL_USAGE) == ACLCHECK_OK)
-                                       oidlist = lappendo(oidlist, namespaceId);
+                                       oidlist = lappend_oid(oidlist, namespaceId);
                        }
                }
                else
@@ -1563,10 +1563,10 @@ recomputeNamespacePath(void)
                                                                                 CStringGetDatum(curname),
                                                                                 0, 0, 0);
                        if (OidIsValid(namespaceId) &&
-                               !oidMember(namespaceId, oidlist) &&
+                               !list_member_oid(oidlist, namespaceId) &&
                                pg_namespace_aclcheck(namespaceId, userId,
                                                                          ACL_USAGE) == ACLCHECK_OK)
-                               oidlist = lappendo(oidlist, namespaceId);
+                               oidlist = lappend_oid(oidlist, namespaceId);
                }
        }
 
@@ -1576,34 +1576,34 @@ recomputeNamespacePath(void)
        if (oidlist == NIL)
                firstNS = InvalidOid;
        else
-               firstNS = lfirsto(oidlist);
+               firstNS = linitial_oid(oidlist);
 
        /*
         * Add any implicitly-searched namespaces to the list.  Note these go
         * on the front, not the back; also notice that we do not check USAGE
         * permissions for these.
         */
-       if (!oidMember(PG_CATALOG_NAMESPACE, oidlist))
-               oidlist = lconso(PG_CATALOG_NAMESPACE, oidlist);
+       if (!list_member_oid(oidlist, PG_CATALOG_NAMESPACE))
+               oidlist = lcons_oid(PG_CATALOG_NAMESPACE, oidlist);
 
        if (OidIsValid(myTempNamespace) &&
-               !oidMember(myTempNamespace, oidlist))
-               oidlist = lconso(myTempNamespace, oidlist);
+               !list_member_oid(oidlist, myTempNamespace))
+               oidlist = lcons_oid(myTempNamespace, oidlist);
 
        if (OidIsValid(mySpecialNamespace) &&
-               !oidMember(mySpecialNamespace, oidlist))
-               oidlist = lconso(mySpecialNamespace, oidlist);
+               !list_member_oid(oidlist, mySpecialNamespace))
+               oidlist = lcons_oid(mySpecialNamespace, oidlist);
 
        /*
         * Now that we've successfully built the new list of namespace OIDs,
         * save it in permanent storage.
         */
        oldcxt = MemoryContextSwitchTo(TopMemoryContext);
-       newpath = listCopy(oidlist);
+       newpath = list_copy(oidlist);
        MemoryContextSwitchTo(oldcxt);
 
        /* Now safe to assign to state variable. */
-       freeList(namespaceSearchPath);
+       list_free(namespaceSearchPath);
        namespaceSearchPath = newpath;
 
        /*
@@ -1621,8 +1621,8 @@ recomputeNamespacePath(void)
 
        /* Clean up. */
        pfree(rawname);
-       freeList(namelist);
-       freeList(oidlist);
+       list_free(namelist);
+       list_free(oidlist);
 }
 
 /*
@@ -1783,7 +1783,7 @@ assign_search_path(const char *newval, bool doit, GucSource source)
 {
        char       *rawname;
        List       *namelist;
-       List       *l;
+       ListCell   *l;
 
        /* Need a modifiable copy of string */
        rawname = pstrdup(newval);
@@ -1793,7 +1793,7 @@ assign_search_path(const char *newval, bool doit, GucSource source)
        {
                /* syntax error in name list */
                pfree(rawname);
-               freeList(namelist);
+               list_free(namelist);
                return NULL;
        }
 
@@ -1831,7 +1831,7 @@ assign_search_path(const char *newval, bool doit, GucSource source)
        }
 
        pfree(rawname);
-       freeList(namelist);
+       list_free(namelist);
 
        /*
         * We mark the path as needing recomputation, but don't do anything
@@ -1862,7 +1862,7 @@ InitializeSearchPath(void)
                MemoryContext oldcxt;
 
                oldcxt = MemoryContextSwitchTo(TopMemoryContext);
-               namespaceSearchPath = makeListo1(PG_CATALOG_NAMESPACE);
+               namespaceSearchPath = list_make1_oid(PG_CATALOG_NAMESPACE);
                MemoryContextSwitchTo(oldcxt);
                defaultCreationNamespace = PG_CATALOG_NAMESPACE;
                firstExplicitNamespace = PG_CATALOG_NAMESPACE;
@@ -1895,12 +1895,12 @@ NamespaceCallback(Datum arg, Oid relid)
 }
 
 /*
- * Fetch the active search path, expressed as a List of OIDs.
+ * Fetch the active search path. The return value is a palloc'ed list
+ * of OIDs; the caller is responsible for freeing this storage as
+ * appropriate.
  *
  * The returned list includes the implicitly-prepended namespaces only if
  * includeImplicit is true.
- *
- * NB: caller must treat the list as read-only!
  */
 List *
 fetch_search_path(bool includeImplicit)
@@ -1909,11 +1909,11 @@ fetch_search_path(bool includeImplicit)
 
        recomputeNamespacePath();
 
-       result = namespaceSearchPath;
+       result = list_copy(namespaceSearchPath);
        if (!includeImplicit)
        {
-               while (result && lfirsto(result) != firstExplicitNamespace)
-                       result = lnext(result);
+               while (result && linitial_oid(result) != firstExplicitNamespace)
+                       result = list_delete_first(result);
        }
 
        return result;
index 749ad4412783a589c312e0e8476510031b358ba4..3a184182b8201cc8832316868969af10fba0e3b3 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/catalog/pg_proc.c,v 1.115 2004/04/02 23:14:05 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/catalog/pg_proc.c,v 1.116 2004/05/26 04:41:08 neilc Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -374,7 +374,7 @@ check_sql_fn_retval(Oid rettype, char fn_typtype, List *queryTreeList)
        Query      *parse;
        int                     cmd;
        List       *tlist;
-       List       *tlistitem;
+       ListCell   *tlistitem;
        int                     tlistlen;
        Oid                     typerelid;
        Oid                     restype;
@@ -396,7 +396,7 @@ check_sql_fn_retval(Oid rettype, char fn_typtype, List *queryTreeList)
        }
 
        /* find the final query */
-       parse = (Query *) llast(queryTreeList);
+       parse = (Query *) lfirst(list_tail(queryTreeList));
 
        cmd = parse->commandType;
        tlist = parse->targetList;
@@ -448,7 +448,7 @@ check_sql_fn_retval(Oid rettype, char fn_typtype, List *queryTreeList)
                                                        format_type_be(rettype)),
                         errdetail("Final SELECT must return exactly one column.")));
 
-               restype = ((TargetEntry *) lfirst(tlist))->resdom->restype;
+               restype = ((TargetEntry *) linitial(tlist))->resdom->restype;
                if (!IsBinaryCoercible(restype, rettype))
                        ereport(ERROR,
                                        (errcode(ERRCODE_INVALID_FUNCTION_DEFINITION),
@@ -471,7 +471,7 @@ check_sql_fn_retval(Oid rettype, char fn_typtype, List *queryTreeList)
                 */
                if (tlistlen == 1)
                {
-                       restype = ((TargetEntry *) lfirst(tlist))->resdom->restype;
+                       restype = ((TargetEntry *) linitial(tlist))->resdom->restype;
                        if (IsBinaryCoercible(restype, rettype))
                                return false;   /* NOT returning whole tuple */
                }
@@ -556,7 +556,7 @@ check_sql_fn_retval(Oid rettype, char fn_typtype, List *queryTreeList)
                 */
                if (tlistlen == 1)
                {
-                       restype = ((TargetEntry *) lfirst(tlist))->resdom->restype;
+                       restype = ((TargetEntry *) linitial(tlist))->resdom->restype;
                        if (IsBinaryCoercible(restype, rettype))
                                return false;   /* NOT returning whole tuple */
                }
index d587245ef97c257e24dc6ea4d38e2526f8b8e596..c8865b3dbde3851708699a5d66edfc638af29707 100644 (file)
@@ -9,7 +9,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/commands/aggregatecmds.c,v 1.17 2004/05/07 00:24:57 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/commands/aggregatecmds.c,v 1.18 2004/05/26 04:41:09 neilc Exp $
  *
  * DESCRIPTION
  *       The "DefineFoo" routines take the parse tree and pick out the
@@ -56,7 +56,7 @@ DefineAggregate(List *names, List *parameters)
        char       *initval = NULL;
        Oid                     baseTypeId;
        Oid                     transTypeId;
-       List       *pl;
+       ListCell   *pl;
 
        /* Convert list of names to a name and namespace */
        aggNamespace = QualifiedNameGetCreationNamespace(names, &aggName);
index 5bb3c51dd35c1780de38ae5d49af54c140b1723d..40a28103c77c07199912b9d89f85fa25ae3e48a0 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/commands/alter.c,v 1.6 2003/11/29 19:51:47 pgsql Exp $
+ *       $PostgreSQL: pgsql/src/backend/commands/alter.c,v 1.7 2004/05/26 04:41:09 neilc Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -41,7 +41,9 @@ ExecRenameStmt(RenameStmt *stmt)
        switch (stmt->renameType)
        {
                case OBJECT_AGGREGATE:
-                       RenameAggregate(stmt->object, (TypeName *) lfirst(stmt->objarg), stmt->newname);
+                       RenameAggregate(stmt->object,
+                                                       (TypeName *) linitial(stmt->objarg),
+                                                       stmt->newname);
                        break;
 
                case OBJECT_CONVERSION:
index 0f6ff2d37e6e124f2d066ab3ad0c8632c78b44c7..4efaf653ede959e6f6407e9b0f749f92ce4eee41 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/commands/analyze.c,v 1.72 2004/05/23 21:24:02 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/commands/analyze.c,v 1.73 2004/05/26 04:41:09 neilc Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -207,9 +207,9 @@ analyze_rel(Oid relid, VacuumStmt *vacstmt)
         */
        if (vacstmt->va_cols != NIL)
        {
-               List       *le;
+               ListCell   *le;
 
-               vacattrstats = (VacAttrStats **) palloc(length(vacstmt->va_cols) *
+               vacattrstats = (VacAttrStats **) palloc(list_length(vacstmt->va_cols) *
                                                                                                sizeof(VacAttrStats *));
                tcnt = 0;
                foreach(le, vacstmt->va_cols)
@@ -260,7 +260,7 @@ analyze_rel(Oid relid, VacuumStmt *vacstmt)
                        thisdata->tupleFract = 1.0;             /* fix later if partial */
                        if (indexInfo->ii_Expressions != NIL && vacstmt->va_cols == NIL)
                        {
-                               List       *indexprs = indexInfo->ii_Expressions;
+                               ListCell   *indexpr_item = list_head(indexInfo->ii_Expressions);
 
                                thisdata->vacattrstats = (VacAttrStats **)
                                        palloc(indexInfo->ii_NumIndexAttrs * sizeof(VacAttrStats *));
@@ -274,10 +274,10 @@ analyze_rel(Oid relid, VacuumStmt *vacstmt)
                                                /* Found an index expression */
                                                Node       *indexkey;
 
-                                               if (indexprs == NIL)    /* shouldn't happen */
+                                               if (indexpr_item == NULL)       /* shouldn't happen */
                                                        elog(ERROR, "too few entries in indexprs list");
-                                               indexkey = (Node *) lfirst(indexprs);
-                                               indexprs = lnext(indexprs);
+                                               indexkey = (Node *) lfirst(indexpr_item);
+                                               indexpr_item = lnext(indexpr_item);
 
                                                /*
                                                 * Can't analyze if the opclass uses a storage type
index 15d7c0aae5c191486cc8243caee65f7a66c8f447..847f73ff06ade9b0defbe791015ec0507b9d706d 100644 (file)
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/commands/async.c,v 1.111 2004/05/23 03:50:45 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/commands/async.c,v 1.112 2004/05/26 04:41:10 neilc Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -932,7 +932,7 @@ NotifyMyFrontEnd(char *relname, int32 listenerPID)
 static bool
 AsyncExistsPendingNotify(const char *relname)
 {
-       List       *p;
+       ListCell   *p;
 
        foreach(p, pendingNotifies)
        {
index 168ae749fa08f748f539625aca7f50851bb583d9..d9c4397176b9f50ac2985bf0a7cb892626910497 100644 (file)
@@ -11,7 +11,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/commands/cluster.c,v 1.123 2004/05/08 00:34:49 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/commands/cluster.c,v 1.124 2004/05/26 04:41:10 neilc Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -103,7 +103,7 @@ cluster(ClusterStmt *stmt)
 
                if (stmt->indexname == NULL)
                {
-                       List       *index;
+                       ListCell   *index;
 
                        /* We need to find the index that has indisclustered set. */
                        foreach(index, RelationGetIndexList(rel))
@@ -111,7 +111,7 @@ cluster(ClusterStmt *stmt)
                                HeapTuple       idxtuple;
                                Form_pg_index indexForm;
 
-                               indexOid = lfirsto(index);
+                               indexOid = lfirst_oid(index);
                                idxtuple = SearchSysCache(INDEXRELID,
                                                                                  ObjectIdGetDatum(indexOid),
                                                                                  0, 0, 0);
@@ -165,8 +165,8 @@ cluster(ClusterStmt *stmt)
                 * tables that have some index with indisclustered set.
                 */
                MemoryContext cluster_context;
-               List       *rv,
-                                  *rvs;
+               List       *rvs;
+               ListCell   *rv;
 
                /*
                 * We cannot run this form of CLUSTER inside a user transaction
@@ -408,7 +408,7 @@ mark_index_clustered(Relation rel, Oid indexOid)
        HeapTuple       indexTuple;
        Form_pg_index indexForm;
        Relation        pg_index;
-       List       *index;
+       ListCell   *index;
 
        /*
         * If the index is already marked clustered, no need to do anything.
@@ -438,7 +438,7 @@ mark_index_clustered(Relation rel, Oid indexOid)
 
        foreach(index, RelationGetIndexList(rel))
        {
-               Oid             thisIndexOid = lfirsto(index);
+               Oid             thisIndexOid = lfirst_oid(index);
 
                indexTuple = SearchSysCacheCopy(INDEXRELID,
                                                                                ObjectIdGetDatum(thisIndexOid),
index 423ab97570ae4289df00e50da97f22ff4c30f03e..4c0d65038b2336e600734b4f824c6dcbe50f2f71 100644 (file)
@@ -7,7 +7,7 @@
  * Copyright (c) 1996-2003, PostgreSQL Global Development Group
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/commands/comment.c,v 1.76 2004/03/08 21:35:59 momjian Exp $
+ *       $PostgreSQL: pgsql/src/backend/commands/comment.c,v 1.77 2004/05/26 04:41:10 neilc Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -379,11 +379,11 @@ CommentAttribute(List *qualname, char *comment)
        AttrNumber      attnum;
 
        /* Separate relname and attr name */
-       nnames = length(qualname);
+       nnames = list_length(qualname);
        if (nnames < 2)                         /* parser messed up */
                elog(ERROR, "must specify relation and attribute");
-       relname = ltruncate(nnames - 1, listCopy(qualname));
-       attrname = strVal(llast(qualname));
+       relname = list_truncate(list_copy(qualname), nnames - 1);
+       attrname = strVal(lfirst(list_tail(qualname)));
 
        /* Open the containing relation to ensure it won't go away meanwhile */
        rel = makeRangeVarFromNameList(relname);
@@ -429,11 +429,11 @@ CommentDatabase(List *qualname, char *comment)
        char       *database;
        Oid                     oid;
 
-       if (length(qualname) != 1)
+       if (list_length(qualname) != 1)
                ereport(ERROR,
                                (errcode(ERRCODE_SYNTAX_ERROR),
                                 errmsg("database name may not be qualified")));
-       database = strVal(lfirst(qualname));
+       database = strVal(linitial(qualname));
 
        /*
         * We cannot currently support cross-database comments (since other
@@ -493,11 +493,11 @@ CommentNamespace(List *qualname, char *comment)
        Oid                     classoid;
        char       *namespace;
 
-       if (length(qualname) != 1)
+       if (list_length(qualname) != 1)
                ereport(ERROR,
                                (errcode(ERRCODE_SYNTAX_ERROR),
                                 errmsg("schema name may not be qualified")));
-       namespace = strVal(lfirst(qualname));
+       namespace = strVal(linitial(qualname));
 
        oid = GetSysCacheOid(NAMESPACENAME,
                                                 CStringGetDatum(namespace),
@@ -548,7 +548,7 @@ CommentRule(List *qualname, char *comment)
        AclResult       aclcheck;
 
        /* Separate relname and trig name */
-       nnames = length(qualname);
+       nnames = list_length(qualname);
        if (nnames == 1)
        {
                /* Old-style: only a rule name is given */
@@ -556,7 +556,7 @@ CommentRule(List *qualname, char *comment)
                HeapScanDesc scanDesc;
                ScanKeyData scanKeyData;
 
-               rulename = strVal(lfirst(qualname));
+               rulename = strVal(linitial(qualname));
 
                /* Search pg_rewrite for such a rule */
                ScanKeyInit(&scanKeyData,
@@ -599,8 +599,8 @@ CommentRule(List *qualname, char *comment)
        {
                /* New-style: rule and relname both provided */
                Assert(nnames >= 2);
-               relname = ltruncate(nnames - 1, listCopy(qualname));
-               rulename = strVal(llast(qualname));
+               relname = list_truncate(list_copy(qualname), nnames - 1);
+               rulename = strVal(lfirst(list_tail(qualname)));
 
                /* Open the owning relation to ensure it won't go away meanwhile */
                rel = makeRangeVarFromNameList(relname);
@@ -683,7 +683,7 @@ CommentType(List *typename, char *comment)
 static void
 CommentAggregate(List *aggregate, List *arguments, char *comment)
 {
-       TypeName   *aggtype = (TypeName *) lfirst(arguments);
+       TypeName   *aggtype = (TypeName *) linitial(arguments);
        Oid                     baseoid,
                                oid;
 
@@ -750,7 +750,7 @@ CommentProc(List *function, List *arguments, char *comment)
 static void
 CommentOperator(List *opername, List *arguments, char *comment)
 {
-       TypeName   *typenode1 = (TypeName *) lfirst(arguments);
+       TypeName   *typenode1 = (TypeName *) linitial(arguments);
        TypeName   *typenode2 = (TypeName *) lsecond(arguments);
        Oid                     oid;
        Oid                     classoid;
@@ -794,11 +794,11 @@ CommentTrigger(List *qualname, char *comment)
        Oid                     oid;
 
        /* Separate relname and trig name */
-       nnames = length(qualname);
+       nnames = list_length(qualname);
        if (nnames < 2)                         /* parser messed up */
                elog(ERROR, "must specify relation and trigger");
-       relname = ltruncate(nnames - 1, listCopy(qualname));
-       trigname = strVal(llast(qualname));
+       relname = list_truncate(list_copy(qualname), nnames - 1);
+       trigname = strVal(lfirst(list_tail(qualname)));
 
        /* Open the owning relation to ensure it won't go away meanwhile */
        rel = makeRangeVarFromNameList(relname);
@@ -872,11 +872,11 @@ CommentConstraint(List *qualname, char *comment)
        Oid                     conOid = InvalidOid;
 
        /* Separate relname and constraint name */
-       nnames = length(qualname);
+       nnames = list_length(qualname);
        if (nnames < 2)                         /* parser messed up */
                elog(ERROR, "must specify relation and constraint");
-       relName = ltruncate(nnames - 1, listCopy(qualname));
-       conName = strVal(llast(qualname));
+       relName = list_truncate(list_copy(qualname), nnames - 1);
+       conName = strVal(lfirst(list_tail(qualname)));
 
        /* Open the owning relation to ensure it won't go away meanwhile */
        rel = makeRangeVarFromNameList(relName);
@@ -985,11 +985,11 @@ CommentLanguage(List *qualname, char *comment)
        Oid                     classoid;
        char       *language;
 
-       if (length(qualname) != 1)
+       if (list_length(qualname) != 1)
                ereport(ERROR,
                                (errcode(ERRCODE_SYNTAX_ERROR),
                                 errmsg("language name may not be qualified")));
-       language = strVal(lfirst(qualname));
+       language = strVal(linitial(qualname));
 
        oid = GetSysCacheOid(LANGNAME,
                                                 CStringGetDatum(language),
@@ -1032,8 +1032,8 @@ CommentOpClass(List *qualname, List *arguments, char *comment)
        Oid                     classoid;
        HeapTuple       tuple;
 
-       Assert(length(arguments) == 1);
-       amname = strVal(lfirst(arguments));
+       Assert(list_length(arguments) == 1);
+       amname = strVal(linitial(arguments));
 
        /*
         * Get the access method's OID.
@@ -1118,8 +1118,8 @@ CommentLargeObject(List *qualname, char *comment)
        Oid                     classoid;
        Node       *node; 
 
-       Assert(length(qualname) == 1);
-       node = (Node *) lfirst(qualname);
+       Assert(list_length(qualname) == 1);
+       node = (Node *) linitial(qualname);
 
        switch (nodeTag(node))
        {
@@ -1176,11 +1176,11 @@ CommentCast(List *qualname, List *arguments, char *comment)
        Oid                     castOid;
        Oid                     classoid;
 
-       Assert(length(qualname) == 1);
-       sourcetype = (TypeName *) lfirst(qualname);
+       Assert(list_length(qualname) == 1);
+       sourcetype = (TypeName *) linitial(qualname);
        Assert(IsA(sourcetype, TypeName));
-       Assert(length(arguments) == 1);
-       targettype = (TypeName *) lfirst(arguments);
+       Assert(list_length(arguments) == 1);
+       targettype = (TypeName *) linitial(arguments);
        Assert(IsA(targettype, TypeName));
        
        sourcetypeid = typenameTypeId(sourcetype);
index 74025ad041bea088ce9da915e41d394a68d9b302..a666516fb3994d97780b2ceb4a726fb7045eaccb 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/commands/copy.c,v 1.223 2004/04/21 00:34:18 momjian Exp $
+ *       $PostgreSQL: pgsql/src/backend/commands/copy.c,v 1.224 2004/05/26 04:41:10 neilc Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -685,7 +685,7 @@ DoCopy(const CopyStmt *stmt)
        char       *filename = stmt->filename;
        bool            is_from = stmt->is_from;
        bool            pipe = (stmt->filename == NULL);
-       List       *option;
+       ListCell   *option;
        List       *attnamelist = stmt->attlist;
        List       *attnumlist;
        bool            binary = false;
@@ -934,15 +934,15 @@ DoCopy(const CopyStmt *stmt)
        {
                TupleDesc       tupDesc = RelationGetDescr(rel);
                Form_pg_attribute *attr = tupDesc->attrs;
-               List       *cur;
+               ListCell   *cur;
 
                force_quote_atts = CopyGetAttnums(rel, force_quote);
 
                foreach(cur, force_quote_atts)
                {
-                       int                     attnum = lfirsti(cur);
+                       int                     attnum = lfirst_int(cur);
 
-                       if (!intMember(attnum, attnumlist))
+                       if (!list_member_int(attnumlist, attnum))
                                ereport(ERROR,
                                                (errcode(ERRCODE_INVALID_COLUMN_REFERENCE),
                                                 errmsg("FORCE QUOTE column \"%s\" not referenced by COPY",
@@ -955,7 +955,7 @@ DoCopy(const CopyStmt *stmt)
         */
        if (force_notnull)
        {
-               List       *cur;
+               ListCell   *cur;
                TupleDesc       tupDesc = RelationGetDescr(rel);
                Form_pg_attribute *attr = tupDesc->attrs;
 
@@ -963,9 +963,9 @@ DoCopy(const CopyStmt *stmt)
 
                foreach(cur, force_notnull_atts)
                {
-                       int                     attnum = lfirsti(cur);
+                       int                     attnum = lfirst_int(cur);
 
-                       if (!intMember(attnum, attnumlist))
+                       if (!list_member_int(attnumlist, attnum))
                                ereport(ERROR,
                                                (errcode(ERRCODE_INVALID_COLUMN_REFERENCE),
                                                 errmsg("FORCE NOT NULL column \"%s\" not referenced by COPY",
@@ -1011,7 +1011,7 @@ DoCopy(const CopyStmt *stmt)
                if (pipe)
                {
                        if (whereToSendOutput == Remote)
-                               ReceiveCopyBegin(binary, length(attnumlist));
+                               ReceiveCopyBegin(binary, list_length(attnumlist));
                        else
                                copy_file = stdin;
                }
@@ -1062,7 +1062,7 @@ DoCopy(const CopyStmt *stmt)
                if (pipe)
                {
                        if (whereToSendOutput == Remote)
-                               SendCopyBegin(binary, length(attnumlist));
+                               SendCopyBegin(binary, list_length(attnumlist));
                        else
                                copy_file = stdout;
                }
@@ -1147,14 +1147,14 @@ CopyTo(Relation rel, List *attnumlist, bool binary, bool oids,
        bool       *isvarlena;
        char       *string;
        Snapshot        mySnapshot;
-       List       *cur;
+       ListCell   *cur;
        MemoryContext oldcontext;
        MemoryContext mycontext;
 
        tupDesc = rel->rd_att;
        attr = tupDesc->attrs;
        num_phys_attrs = tupDesc->natts;
-       attr_count = length(attnumlist);
+       attr_count = list_length(attnumlist);
 
        /*
         * Get info about the columns we need to process.
@@ -1167,7 +1167,7 @@ CopyTo(Relation rel, List *attnumlist, bool binary, bool oids,
        force_quote = (bool *) palloc((num_phys_attrs + 1) * sizeof(bool));
        foreach(cur, attnumlist)
        {
-               int                     attnum = lfirsti(cur);
+               int                     attnum = lfirst_int(cur);
                Oid                     out_func_oid;
                
                if (binary)
@@ -1180,7 +1180,7 @@ CopyTo(Relation rel, List *attnumlist, bool binary, bool oids,
                                                          &isvarlena[attnum - 1]);
                fmgr_info(out_func_oid, &out_functions[attnum - 1]);
 
-               if (intMember(attnum, force_quote_atts))
+               if (list_member_int(force_quote_atts, attnum))
                        force_quote[attnum - 1] = true;
                else
                        force_quote[attnum - 1] = false;
@@ -1266,7 +1266,7 @@ CopyTo(Relation rel, List *attnumlist, bool binary, bool oids,
 
                foreach(cur, attnumlist)
                {
-                       int                     attnum = lfirsti(cur);
+                       int                     attnum = lfirst_int(cur);
                        Datum           value;
                        bool            isnull;
 
@@ -1451,7 +1451,6 @@ CopyFrom(Relation rel, List *attnumlist, bool binary, bool oids,
        bool            hasConstraints = false;
        int                     attnum;
        int                     i;
-       List       *cur;
        Oid                     in_func_oid;
        Datum      *values;
        char       *nulls;
@@ -1471,7 +1470,7 @@ CopyFrom(Relation rel, List *attnumlist, bool binary, bool oids,
        tupDesc = RelationGetDescr(rel);
        attr = tupDesc->attrs;
        num_phys_attrs = tupDesc->natts;
-       attr_count = length(attnumlist);
+       attr_count = list_length(attnumlist);
        num_defaults = 0;
 
        /*
@@ -1526,13 +1525,13 @@ CopyFrom(Relation rel, List *attnumlist, bool binary, bool oids,
                                                         &in_func_oid, &elements[attnum - 1]);
                fmgr_info(in_func_oid, &in_functions[attnum - 1]);
 
-               if (intMember(attnum, force_notnull_atts))
+               if (list_member_int(force_notnull_atts, attnum))
                        force_notnull[attnum - 1] = true;
                else
                        force_notnull[attnum - 1] = false;
                
                /* Get default info if needed */
-               if (!intMember(attnum, attnumlist))
+               if (!list_member_int(attnumlist, attnum))
                {
                        /* attribute is NOT to be copied from input */
                        /* use default value if one exists */
@@ -1681,6 +1680,7 @@ CopyFrom(Relation rel, List *attnumlist, bool binary, bool oids,
                {
                        CopyReadResult result = NORMAL_ATTR;
                        char       *string;
+                       ListCell   *cur;
 
                        /* Actually read the line into memory here */
                        done = CopyReadLine();
@@ -1722,7 +1722,7 @@ CopyFrom(Relation rel, List *attnumlist, bool binary, bool oids,
                         */
                        foreach(cur, attnumlist)
                        {
-                               int                     attnum = lfirsti(cur);
+                               int                     attnum = lfirst_int(cur);
                                int                     m = attnum - 1;
 
                                /*
@@ -1783,6 +1783,7 @@ CopyFrom(Relation rel, List *attnumlist, bool binary, bool oids,
                {
                        /* binary */
                        int16           fld_count;
+                       ListCell   *cur;
 
                        fld_count = CopyGetInt16();
                        if (CopyGetEof() || fld_count == -1)
@@ -1815,7 +1816,7 @@ CopyFrom(Relation rel, List *attnumlist, bool binary, bool oids,
                        i = 0;
                        foreach(cur, attnumlist)
                        {
-                               int                     attnum = lfirsti(cur);
+                               int                     attnum = lfirst_int(cur);
                                int                     m = attnum - 1;
 
                                copy_attname = NameStr(attr[m]->attname);
@@ -2642,13 +2643,13 @@ CopyGetAttnums(Relation rel, List *attnamelist)
                {
                        if (attr[i]->attisdropped)
                                continue;
-                       attnums = lappendi(attnums, i + 1);
+                       attnums = lappend_int(attnums, i + 1);
                }
        }
        else
        {
                /* Validate the user-supplied list and extract attnums */
-               List       *l;
+               ListCell   *l;
 
                foreach(l, attnamelist)
                {
@@ -2659,12 +2660,12 @@ CopyGetAttnums(Relation rel, List *attnamelist)
                        /* Note we disallow system columns here */
                        attnum = attnameAttNum(rel, name, false);
                        /* Check for duplicates */
-                       if (intMember(attnum, attnums))
+                       if (list_member_int(attnums, attnum))
                                ereport(ERROR,
                                                (errcode(ERRCODE_DUPLICATE_COLUMN),
                                          errmsg("column \"%s\" specified more than once",
                                                         name)));
-                       attnums = lappendi(attnums, attnum);
+                       attnums = lappend_int(attnums, attnum);
                }
        }
 
index 038db4de70e22d042a07c4bafc31ce24b5b67f55..9114983e75de93856286663ed2738bf34f55381a 100644 (file)
@@ -9,7 +9,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/commands/dbcommands.c,v 1.132 2004/04/19 17:42:57 momjian Exp $
+ *       $PostgreSQL: pgsql/src/backend/commands/dbcommands.c,v 1.133 2004/05/26 04:41:10 neilc Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -82,7 +82,7 @@ createdb(const CreatedbStmt *stmt)
        char            new_record_nulls[Natts_pg_database];
        Oid                     dboid;
        AclId           datdba;
-       List       *option;
+       ListCell   *option;
        DefElem    *downer = NULL;
        DefElem    *dpath = NULL;
        DefElem    *dtemplate = NULL;
index e4a62b77308ffe6289cad333bfa5c81e3fc0b961..1a12674fa772fa4e82d931b7cc5d2bda149114bd 100644 (file)
@@ -9,7 +9,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/commands/define.c,v 1.88 2004/05/14 16:11:25 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/commands/define.c,v 1.89 2004/05/26 04:41:10 neilc Exp $
  *
  * DESCRIPTION
  *       The "DefineFoo" routines take the parse tree and pick out the
@@ -190,7 +190,7 @@ defGetQualifiedName(DefElem *def)
                        return (List *) def->arg;
                case T_String:
                        /* Allow quoted name for backwards compatibility */
-                       return makeList1(def->arg);
+                       return list_make1(def->arg);
                default:
                        ereport(ERROR,
                                        (errcode(ERRCODE_SYNTAX_ERROR),
@@ -223,7 +223,7 @@ defGetTypeName(DefElem *def)
                                /* Allow quoted typename for backwards compatibility */
                                TypeName   *n = makeNode(TypeName);
 
-                               n->names = makeList1(def->arg);
+                               n->names = list_make1(def->arg);
                                n->typmod = -1;
                                return n;
                        }
index e2f3d4aa8136d10497418db50b134399e11be6fc..3658a00ea21f2bf4b4a7e6aa63c11d7f1bcf6cf2 100644 (file)
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1994-5, Regents of the University of California
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/commands/explain.c,v 1.120 2004/04/01 21:28:44 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/commands/explain.c,v 1.121 2004/05/26 04:41:10 neilc Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -72,7 +72,7 @@ ExplainQuery(ExplainStmt *stmt, DestReceiver *dest)
        Query      *query = stmt->query;
        TupOutputState *tstate;
        List       *rewritten;
-       List       *l;
+       ListCell   *l;
 
        /* prepare for projection of tuples */
        tstate = begin_tup_output_tupdesc(dest, ExplainResultDesc(stmt));
@@ -104,7 +104,7 @@ ExplainQuery(ExplainStmt *stmt, DestReceiver *dest)
                        {
                                ExplainOneQuery(lfirst(l), stmt, tstate);
                                /* put a blank line between plans */
-                               if (lnext(l) != NIL)
+                               if (lnext(l) != NULL)
                                        do_text_output_oneline(tstate, "");
                        }
                }
@@ -156,9 +156,9 @@ ExplainOneQuery(Query *query, ExplainStmt *stmt, TupOutputState *tstate)
                        /* Still need to rewrite cursor command */
                        Assert(query->commandType == CMD_SELECT);
                        rewritten = QueryRewrite(query);
-                       if (length(rewritten) != 1)
+                       if (list_length(rewritten) != 1)
                                elog(ERROR, "unexpected rewrite result");
-                       query = (Query *) lfirst(rewritten);
+                       query = (Query *) linitial(rewritten);
                        Assert(query->commandType == CMD_SELECT);
                        /* do not actually execute the underlying query! */
                        stmt->analyze = false;
@@ -317,7 +317,7 @@ explain_outNode(StringInfo str,
                                Plan *outer_plan,
                                int indent, ExplainState *es)
 {
-       List       *l;
+       ListCell        *l;
        char       *pname;
        int                     i;
 
@@ -491,7 +491,7 @@ explain_outNode(StringInfo str,
                        {
                                Relation        relation;
 
-                               relation = index_open(lfirsto(l));
+                               relation = index_open(lfirst_oid(l));
                                appendStringInfo(str, "%s%s",
                                                                 (++i > 1) ? ", " : "",
                                        quote_identifier(RelationGetRelationName(relation)));
@@ -699,7 +699,7 @@ explain_outNode(StringInfo str,
        if (plan->initPlan)
        {
                List       *saved_rtable = es->rtable;
-               List       *lst;
+               ListCell   *lst;
 
                for (i = 0; i < indent; i++)
                        appendStringInfo(str, "  ");
@@ -749,7 +749,7 @@ explain_outNode(StringInfo str,
        {
                Append     *appendplan = (Append *) plan;
                AppendState *appendstate = (AppendState *) planstate;
-               List       *lst;
+               ListCell   *lst;
                int                     j;
 
                j = 0;
@@ -797,7 +797,7 @@ explain_outNode(StringInfo str,
        if (planstate->subPlan)
        {
                List       *saved_rtable = es->rtable;
-               List       *lst;
+               ListCell   *lst;
 
                for (i = 0; i < indent; i++)
                        appendStringInfo(str, "  ");
@@ -839,11 +839,8 @@ show_scan_qual(List *qual, bool is_or_qual, const char *qlabel,
        /* No work if empty qual */
        if (qual == NIL)
                return;
-       if (is_or_qual)
-       {
-               if (lfirst(qual) == NIL && lnext(qual) == NIL)
-                       return;
-       }
+       if (is_or_qual && list_length(qual) == 1 && linitial(qual) == NIL)
+               return;
 
        /* Fix qual --- indexqual requires different processing */
        if (is_or_qual)
@@ -852,7 +849,7 @@ show_scan_qual(List *qual, bool is_or_qual, const char *qlabel,
                node = (Node *) make_ands_explicit(qual);
 
        /* Generate deparse context */
-       Assert(scanrelid > 0 && scanrelid <= length(es->rtable));
+       Assert(scanrelid > 0 && scanrelid <= list_length(es->rtable));
        rte = rt_fetch(scanrelid, es->rtable);
        scancontext = deparse_context_for_rte(rte);
 
@@ -984,7 +981,7 @@ show_sort_keys(List *tlist, int nkeys, AttrNumber *keycols,
                context = deparse_context_for_plan(0, NULL,
                                                                                   0, NULL,
                                                                                   es->rtable);
-               useprefix = length(es->rtable) > 1;
+               useprefix = list_length(es->rtable) > 1;
        }
        bms_free(varnos);
 
@@ -1017,17 +1014,16 @@ make_ors_ands_explicit(List *orclauses)
 {
        if (orclauses == NIL)
                return NULL;                    /* probably can't happen */
-       else if (lnext(orclauses) == NIL)
-               return (Node *) make_ands_explicit(lfirst(orclauses));
+       else if (list_length(orclauses) == 1)
+               return (Node *) make_ands_explicit(linitial(orclauses));
        else
        {
-               FastList        args;
-               List       *orptr;
+               List       *args = NIL;
+               ListCell   *orptr;
 
-               FastListInit(&args);
                foreach(orptr, orclauses)
-                       FastAppend(&args, make_ands_explicit(lfirst(orptr)));
+                       args = lappend(args, make_ands_explicit(lfirst(orptr)));
 
-               return (Node *) make_orclause(FastListValue(&args));
+               return (Node *) make_orclause(args);
        }
 }
index c118e8e3b5e7a615e7d64e445c5962a5d8f0a779..757869a925ae89bb9e7e445ddcc724e227cf792f 100644 (file)
@@ -10,7 +10,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/commands/functioncmds.c,v 1.46 2004/05/14 16:11:25 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/commands/functioncmds.c,v 1.47 2004/05/26 04:41:11 neilc Exp $
  *
  * DESCRIPTION
  *       These routines take the parse tree and pick out the
@@ -137,7 +137,7 @@ examine_parameter_list(List *parameter, Oid languageOid,
                                           Oid *parameterTypes, const char *parameterNames[])
 {
        int                     parameterCount = 0;
-       List       *x;
+       ListCell   *x;
 
        MemSet(parameterTypes, 0, FUNC_MAX_ARGS * sizeof(Oid));
        MemSet(parameterNames, 0, FUNC_MAX_ARGS * sizeof(char *));
@@ -202,14 +202,14 @@ examine_parameter_list(List *parameter, Oid languageOid,
  */
 
 static void
-compute_attributes_sql_style(const List *options,
+compute_attributes_sql_style(List *options,
                                                         List **as,
                                                         char **language,
                                                         char *volatility_p,
                                                         bool *strict_p,
                                                         bool *security_definer)
 {
-       const List *option;
+       ListCell   *option;
        DefElem    *as_item = NULL;
        DefElem    *language_item = NULL;
        DefElem    *volatility_item = NULL;
@@ -322,7 +322,7 @@ compute_attributes_sql_style(const List *options,
 static void
 compute_attributes_with_style(List *parameters, bool *isStrict_p, char *volatility_p)
 {
-       List       *pl;
+       ListCell   *pl;
 
        foreach(pl, parameters)
        {
@@ -357,7 +357,7 @@ compute_attributes_with_style(List *parameters, bool *isStrict_p, char *volatili
  */
 
 static void
-interpret_AS_clause(Oid languageOid, const char *languageName, const List *as,
+interpret_AS_clause(Oid languageOid, const char *languageName, List *as,
                                        char **prosrc_str_p, char **probin_str_p)
 {
        Assert(as != NIL);
@@ -368,8 +368,8 @@ interpret_AS_clause(Oid languageOid, const char *languageName, const List *as,
                 * For "C" language, store the file name in probin and, when
                 * given, the link symbol name in prosrc.
                 */
-               *probin_str_p = strVal(lfirst(as));
-               if (lnext(as) == NULL)
+               *probin_str_p = strVal(linitial(as));
+               if (list_length(as) == 1)
                        *prosrc_str_p = "-";
                else
                        *prosrc_str_p = strVal(lsecond(as));
@@ -377,10 +377,10 @@ interpret_AS_clause(Oid languageOid, const char *languageName, const List *as,
        else
        {
                /* Everything else wants the given string in prosrc. */
-               *prosrc_str_p = strVal(lfirst(as));
+               *prosrc_str_p = strVal(linitial(as));
                *probin_str_p = "-";
 
-               if (lnext(as) != NIL)
+               if (list_length(as) != 1)
                        ereport(ERROR,
                                        (errcode(ERRCODE_INVALID_FUNCTION_DEFINITION),
                                         errmsg("only one AS item needed for language \"%s\"",
index 448f99e1d37f54761b9089f0b360ab425d293b76..1fe8e58e585525e85b2e897fd66d6c776d28923e 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/commands/indexcmds.c,v 1.119 2004/05/08 00:34:49 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/commands/indexcmds.c,v 1.120 2004/05/26 04:41:11 neilc Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -109,7 +109,7 @@ DefineIndex(RangeVar *heapRelation,
        /*
         * count attributes in index
         */
-       numberOfAttributes = length(attributeList);
+       numberOfAttributes = list_length(attributeList);
        if (numberOfAttributes <= 0)
                ereport(ERROR,
                                (errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
@@ -165,7 +165,7 @@ DefineIndex(RangeVar *heapRelation,
                                                                                                namespaceId);
                else
                {
-                       IndexElem  *iparam = (IndexElem *) lfirst(attributeList);
+                       IndexElem  *iparam = (IndexElem *) linitial(attributeList);
 
                        indexRelationName = CreateIndexName(RelationGetRelationName(rel),
                                                                                                iparam->name,
@@ -208,7 +208,7 @@ DefineIndex(RangeVar *heapRelation,
         */
        if (rangetable != NIL)
        {
-               if (length(rangetable) != 1 || getrelid(1, rangetable) != relationId)
+               if (list_length(rangetable) != 1 || getrelid(1, rangetable) != relationId)
                        ereport(ERROR,
                                        (errcode(ERRCODE_INVALID_COLUMN_REFERENCE),
                                         errmsg("index expressions and predicates may refer only to the table being indexed")));
@@ -226,7 +226,7 @@ DefineIndex(RangeVar *heapRelation,
        if (primary)
        {
                List       *cmds;
-               List       *keys;
+               ListCell   *keys;
 
                /*
                 * If ALTER TABLE, check that there isn't already a PRIMARY KEY.
@@ -399,7 +399,7 @@ ComputeIndexAttrs(IndexInfo *indexInfo,
                                  Oid accessMethodId,
                                  bool isconstraint)
 {
-       List       *rest;
+       ListCell   *rest;
        int                     attn = 0;
 
        /*
@@ -516,9 +516,9 @@ GetIndexOpClass(List *opclass, Oid attrType,
         * Release 7.5 removes bigbox_ops (which was dead code for a long while
         * anyway).  tgl 2003/11/11
         */
-       if (length(opclass) == 1)
+       if (list_length(opclass) == 1)
        {
-               char       *claname = strVal(lfirst(opclass));
+               char       *claname = strVal(linitial(opclass));
 
                if (strcmp(claname, "network_ops") == 0 ||
                        strcmp(claname, "timespan_ops") == 0 ||
@@ -697,8 +697,8 @@ static bool
 relationHasPrimaryKey(Relation rel)
 {
        bool            result = false;
-       List       *indexoidlist,
-                          *indexoidscan;
+       List       *indexoidlist;
+       ListCell   *indexoidscan;
 
        /*
         * Get the list of index OIDs for the table from the relcache, and
@@ -709,7 +709,7 @@ relationHasPrimaryKey(Relation rel)
 
        foreach(indexoidscan, indexoidlist)
        {
-               Oid                     indexoid = lfirsto(indexoidscan);
+               Oid                     indexoid = lfirst_oid(indexoidscan);
                HeapTuple       indexTuple;
 
                indexTuple = SearchSysCache(INDEXRELID,
@@ -723,7 +723,7 @@ relationHasPrimaryKey(Relation rel)
                        break;
        }
 
-       freeList(indexoidlist);
+       list_free(indexoidlist);
 
        return result;
 }
@@ -843,12 +843,13 @@ void
 ReindexDatabase(const char *dbname, bool force /* currently unused */,
                                bool all)
 {
-       Relation        relationRelation;
+       Relation         relationRelation;
        HeapScanDesc scan;
-       HeapTuple       tuple;
+       HeapTuple        tuple;
        MemoryContext private_context;
        MemoryContext old;
-       List       *relids = NIL;
+       List            *relids = NIL;
+       ListCell        *l;
 
        AssertArg(dbname);
 
@@ -887,7 +888,7 @@ ReindexDatabase(const char *dbname, bool force /* currently unused */,
         * reindexing itself will try to update pg_class.
         */
        old = MemoryContextSwitchTo(private_context);
-       relids = lappendo(relids, RelOid_pg_class);
+       relids = lappend_oid(relids, RelOid_pg_class);
        MemoryContextSwitchTo(old);
 
        /*
@@ -921,7 +922,7 @@ ReindexDatabase(const char *dbname, bool force /* currently unused */,
                        continue;                       /* got it already */
 
                old = MemoryContextSwitchTo(private_context);
-               relids = lappendo(relids, HeapTupleGetOid(tuple));
+               relids = lappend_oid(relids, HeapTupleGetOid(tuple));
                MemoryContextSwitchTo(old);
        }
        heap_endscan(scan);
@@ -929,9 +930,9 @@ ReindexDatabase(const char *dbname, bool force /* currently unused */,
 
        /* Now reindex each rel in a separate transaction */
        CommitTransactionCommand();
-       while (relids)
+       foreach(l, relids)
        {
-               Oid             relid = lfirsto(relids);
+               Oid             relid = lfirst_oid(l);
 
                StartTransactionCommand();
                SetQuerySnapshot();             /* might be needed for functions in
@@ -941,7 +942,6 @@ ReindexDatabase(const char *dbname, bool force /* currently unused */,
                                        (errmsg("table \"%s\" was reindexed",
                                                        get_rel_name(relid))));
                CommitTransactionCommand();
-               relids = lnext(relids);
        }
        StartTransactionCommand();
 
index 58bee42f8fe8360d7539801285d9c7804edd1fe6..7ab0687e983b42308f4dcd9211214918e3eed3bc 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/commands/lockcmds.c,v 1.9 2004/03/11 01:47:35 ishii Exp $
+ *       $PostgreSQL: pgsql/src/backend/commands/lockcmds.c,v 1.10 2004/05/26 04:41:11 neilc Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -28,7 +28,7 @@
 void
 LockTableCommand(LockStmt *lockstmt)
 {
-       List       *p;
+       ListCell   *p;
 
        /*
         * Iterate over the list and open, lock, and close the relations one
index d3551a7349f02ae19a8c71d6798fa6a7d1427db0..db5c2ccabc92a67927dcbf8a391a79848a99469a 100644 (file)
@@ -9,7 +9,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/commands/opclasscmds.c,v 1.24 2003/11/29 19:51:47 pgsql Exp $
+ *       $PostgreSQL: pgsql/src/backend/commands/opclasscmds.c,v 1.25 2004/05/26 04:41:11 neilc Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -77,7 +77,7 @@ DefineOpClass(CreateOpClassStmt *stmt)
                                numProcs;               /* amsupport value */
        List       *operators;          /* OpClassMember list for operators */
        List       *procedures;         /* OpClassMember list for support procs */
-       List       *l;
+       ListCell   *l;
        Relation        rel;
        HeapTuple       tup;
        Datum           values[Natts_pg_opclass];
@@ -168,7 +168,7 @@ DefineOpClass(CreateOpClassStmt *stmt)
                                                                        item->number, numOperators)));
                                if (item->args != NIL)
                                {
-                                       TypeName   *typeName1 = (TypeName *) lfirst(item->args);
+                                       TypeName   *typeName1 = (TypeName *) linitial(item->args);
                                        TypeName   *typeName2 = (TypeName *) lsecond(item->args);
 
                                        operOid = LookupOperNameTypeNames(item->name,
@@ -506,7 +506,7 @@ assignProcSubtype(Oid amoid, Oid typeoid, Oid procOid)
 static void
 addClassMember(List **list, OpClassMember *member, bool isProc)
 {
-       List       *l;
+       ListCell   *l;
 
        foreach(l, *list)
        {
@@ -540,7 +540,7 @@ storeOperators(Oid opclassoid, List *operators)
        Datum           values[Natts_pg_amop];
        char            nulls[Natts_pg_amop];
        HeapTuple       tup;
-       List       *l;
+       ListCell   *l;
        int                     i;
 
        rel = heap_openr(AccessMethodOperatorRelationName, RowExclusiveLock);
@@ -584,7 +584,7 @@ storeProcedures(Oid opclassoid, List *procedures)
        Datum           values[Natts_pg_amproc];
        char            nulls[Natts_pg_amproc];
        HeapTuple       tup;
-       List       *l;
+       ListCell   *l;
        int                     i;
 
        rel = heap_openr(AccessMethodProcedureRelationName, RowExclusiveLock);
index a198f51eeebe09d34825a83dad62e88437bae9f5..d2ffae2ce56ea39c94b54b5fcc36b440b43f9fa9 100644 (file)
@@ -9,7 +9,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/commands/operatorcmds.c,v 1.15 2004/05/14 16:11:25 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/commands/operatorcmds.c,v 1.16 2004/05/26 04:41:11 neilc Exp $
  *
  * DESCRIPTION
  *       The "DefineFoo" routines take the parse tree and pick out the
@@ -79,7 +79,7 @@ DefineOperator(List *names, List *parameters)
        List       *rightSortName = NIL;        /* optional right sort operator */
        List       *ltCompareName = NIL;        /* optional < compare operator */
        List       *gtCompareName = NIL;        /* optional > compare operator */
-       List       *pl;
+       ListCell   *pl;
 
        /* Convert list of names to a name and namespace */
        oprNamespace = QualifiedNameGetCreationNamespace(names, &oprName);
@@ -167,13 +167,13 @@ DefineOperator(List *names, List *parameters)
        if (canMerge)
        {
                if (!leftSortName)
-                       leftSortName = makeList1(makeString("<"));
+                       leftSortName = list_make1(makeString("<"));
                if (!rightSortName)
-                       rightSortName = makeList1(makeString("<"));
+                       rightSortName = list_make1(makeString("<"));
                if (!ltCompareName)
-                       ltCompareName = makeList1(makeString("<"));
+                       ltCompareName = list_make1(makeString("<"));
                if (!gtCompareName)
-                       gtCompareName = makeList1(makeString(">"));
+                       gtCompareName = list_make1(makeString(">"));
        }
 
        /*
@@ -206,7 +206,7 @@ void
 RemoveOperator(RemoveOperStmt *stmt)
 {
        List       *operatorName = stmt->opname;
-       TypeName   *typeName1 = (TypeName *) lfirst(stmt->args);
+       TypeName   *typeName1 = (TypeName *) linitial(stmt->args);
        TypeName   *typeName2 = (TypeName *) lsecond(stmt->args);
        Oid                     operOid;
        HeapTuple       tup;
index 855c9391c18e4405b07d43060ad8f5b3a74bcb31..d2fa894a76ec4139eb7d11c347bbe445b62b9458 100644 (file)
@@ -14,7 +14,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/commands/portalcmds.c,v 1.26 2004/03/21 22:29:10 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/commands/portalcmds.c,v 1.27 2004/05/26 04:41:11 neilc Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -68,9 +68,9 @@ PerformCursorOpen(DeclareCursorStmt *stmt)
         * strange.
         */
        rewritten = QueryRewrite((Query *) stmt->query);
-       if (length(rewritten) != 1 || !IsA(lfirst(rewritten), Query))
+       if (list_length(rewritten) != 1 || !IsA(linitial(rewritten), Query))
                elog(ERROR, "unexpected rewrite result");
-       query = (Query *) lfirst(rewritten);
+       query = (Query *) linitial(rewritten);
        if (query->commandType != CMD_SELECT)
                elog(ERROR, "unexpected rewrite result");
 
@@ -100,8 +100,8 @@ PerformCursorOpen(DeclareCursorStmt *stmt)
        PortalDefineQuery(portal,
                                          NULL,         /* unfortunately don't have sourceText */
                                          "SELECT", /* cursor's query is always a SELECT */
-                                         makeList1(query),
-                                         makeList1(plan),
+                                         list_make1(query),
+                                         list_make1(plan),
                                          PortalGetHeapMemory(portal));
 
        MemoryContextSwitchTo(oldContext);
index d85d41c1ec7999b4c3a6ae7196c445db05c182b9..083ad2af5e78938ecae0500449f4db120c0397b5 100644 (file)
@@ -10,7 +10,7 @@
  * Copyright (c) 2002-2003, PostgreSQL Global Development Group
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/commands/prepare.c,v 1.26 2004/04/22 02:58:20 momjian Exp $
+ *       $PostgreSQL: pgsql/src/backend/commands/prepare.c,v 1.27 2004/05/26 04:41:11 neilc Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -125,7 +125,7 @@ ExecuteQuery(ExecuteStmt *stmt, DestReceiver *dest, char *completionTag)
        plan_list = entry->plan_list;
        qcontext = entry->context;
 
-       Assert(length(query_list) == length(plan_list));
+       Assert(list_length(query_list) == list_length(plan_list));
 
        /* Evaluate parameters, if any */
        if (entry->argtype_list != NIL)
@@ -162,11 +162,11 @@ ExecuteQuery(ExecuteStmt *stmt, DestReceiver *dest, char *completionTag)
                plan_list = copyObject(plan_list);
                qcontext = PortalGetHeapMemory(portal);
 
-               if (length(query_list) != 1)
+               if (list_length(query_list) != 1)
                        ereport(ERROR,
                                        (errcode(ERRCODE_WRONG_OBJECT_TYPE),
                                         errmsg("prepared statement is not a SELECT")));
-               query = (Query *) lfirst(query_list);
+               query = (Query *) linitial(query_list);
                if (query->commandType != CMD_SELECT)
                        ereport(ERROR,
                                        (errcode(ERRCODE_WRONG_OBJECT_TYPE),
@@ -208,14 +208,14 @@ ExecuteQuery(ExecuteStmt *stmt, DestReceiver *dest, char *completionTag)
 static ParamListInfo
 EvaluateParams(EState *estate, List *params, List *argtypes)
 {
-       int                     nargs = length(argtypes);
+       int                     nargs = list_length(argtypes);
        ParamListInfo paramLI;
        List       *exprstates;
-       List       *l;
+       ListCell   *l;
        int                     i = 0;
 
        /* Parser should have caught this error, but check for safety */
-       if (length(params) != nargs)
+       if (list_length(params) != nargs)
                elog(ERROR, "wrong number of arguments");
 
        exprstates = (List *) ExecPrepareExpr((Expr *) params, estate);
@@ -326,7 +326,7 @@ StorePreparedStatement(const char *stmt_name,
        qstring = query_string ? pstrdup(query_string) : NULL;
        query_list = (List *) copyObject(query_list);
        plan_list = (List *) copyObject(plan_list);
-       argtype_list = listCopy(argtype_list);
+       argtype_list = list_copy(argtype_list);
 
        /* Now we can add entry to hash table */
        entry = (PreparedStatement *) hash_search(prepared_queries,
@@ -419,11 +419,11 @@ FetchPreparedStatementResultDesc(PreparedStatement *stmt)
        switch (ChoosePortalStrategy(stmt->query_list))
        {
                case PORTAL_ONE_SELECT:
-                       query = (Query *) lfirst(stmt->query_list);
+                       query = (Query *) linitial(stmt->query_list);
                        return ExecCleanTypeFromTL(query->targetList, false);
 
                case PORTAL_UTIL_SELECT:
-                       query = (Query *) lfirst(stmt->query_list);
+                       query = (Query *) linitial(stmt->query_list);
                        return UtilityTupleDescriptor(query->utilityStmt);
 
                case PORTAL_MULTI_QUERY:
@@ -478,8 +478,9 @@ ExplainExecuteQuery(ExplainStmt *stmt, TupOutputState *tstate)
 {
        ExecuteStmt *execstmt = (ExecuteStmt *) stmt->query->utilityStmt;
        PreparedStatement *entry;
-       List       *l,
-                          *query_list,
+       ListCell   *q,
+                          *p;
+       List       *query_list,
                           *plan_list;
        ParamListInfo paramLI = NULL;
        EState     *estate = NULL;
@@ -493,7 +494,7 @@ ExplainExecuteQuery(ExplainStmt *stmt, TupOutputState *tstate)
        query_list = entry->query_list;
        plan_list = entry->plan_list;
 
-       Assert(length(query_list) == length(plan_list));
+       Assert(list_length(query_list) == list_length(plan_list));
 
        /* Evaluate parameters, if any */
        if (entry->argtype_list != NIL)
@@ -508,14 +509,13 @@ ExplainExecuteQuery(ExplainStmt *stmt, TupOutputState *tstate)
        }
 
        /* Explain each query */
-       foreach(l, query_list)
+       forboth (q, query_list, p, plan_list)
        {
-               Query      *query = (Query *) lfirst(l);
-               Plan       *plan = (Plan *) lfirst(plan_list);
+               Query      *query = (Query *) lfirst(q);
+               Plan       *plan = (Plan *) lfirst(p);
                bool            is_last_query;
 
-               plan_list = lnext(plan_list);
-               is_last_query = (plan_list == NIL);
+               is_last_query = (lnext(p) == NULL);
 
                if (query->commandType == CMD_UTILITY)
                {
index 8af564cf74bff510439d052f4eb1658f1450164a..18a212271ea27160ec6a22af0acebf3b203aedaa 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/commands/schemacmds.c,v 1.17 2003/11/29 19:51:47 pgsql Exp $
+ *       $PostgreSQL: pgsql/src/backend/commands/schemacmds.c,v 1.18 2004/05/26 04:41:11 neilc Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -42,7 +42,7 @@ CreateSchemaCommand(CreateSchemaStmt *stmt)
        const char *authId = stmt->authid;
        Oid                     namespaceId;
        List       *parsetree_list;
-       List       *parsetree_item;
+       ListCell   *parsetree_item;
        const char *owner_name;
        AclId           owner_userid;
        AclId           saved_userid;
@@ -129,8 +129,8 @@ CreateSchemaCommand(CreateSchemaStmt *stmt)
        foreach(parsetree_item, parsetree_list)
        {
                Node       *parsetree = (Node *) lfirst(parsetree_item);
-               List       *querytree_list,
-                                  *querytree_item;
+               List       *querytree_list;
+               ListCell   *querytree_item;
 
                querytree_list = parse_analyze(parsetree, NULL, 0);
 
@@ -166,11 +166,11 @@ RemoveSchema(List *names, DropBehavior behavior)
        Oid                     namespaceId;
        ObjectAddress object;
 
-       if (length(names) != 1)
+       if (list_length(names) != 1)
                ereport(ERROR,
                                (errcode(ERRCODE_SYNTAX_ERROR),
                                 errmsg("schema name may not be qualified")));
-       namespaceName = strVal(lfirst(names));
+       namespaceName = strVal(linitial(names));
 
        namespaceId = GetSysCacheOid(NAMESPACENAME,
                                                                 CStringGetDatum(namespaceName),
index 0ff1b386b5b167a7313314c0323315d22782c87a..351813b5decb055027428ac4444ac59b3ef8912a 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/commands/sequence.c,v 1.110 2004/05/08 19:09:24 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/commands/sequence.c,v 1.111 2004/05/26 04:41:11 neilc Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -862,7 +862,7 @@ init_params(List *options, Form_pg_sequence new, bool isInit)
        DefElem    *min_value = NULL;
        DefElem    *cache_value = NULL;
        DefElem    *is_cycled = NULL;
-       List       *option;
+       ListCell   *option;
 
        foreach(option, options)
        {
index bf308141facbff0dce1625d6d4a0e0ae337209d0..431c4ac742ae20294e9fa34f23593f185416d438 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/commands/tablecmds.c,v 1.107 2004/05/08 22:46:29 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/commands/tablecmds.c,v 1.108 2004/05/26 04:41:12 neilc Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -262,7 +262,7 @@ DefineRelation(CreateStmt *stmt, char relkind)
        bool            localHasOids;
        int                     parentOidCount;
        List       *rawDefaults;
-       List       *listptr;
+       ListCell   *listptr;
        int                     i;
        AttrNumber      attnum;
 
@@ -320,7 +320,7 @@ DefineRelation(CreateStmt *stmt, char relkind)
 
        if (old_constraints != NIL)
        {
-               ConstrCheck *check = (ConstrCheck *) palloc(length(old_constraints) *
+               ConstrCheck *check = (ConstrCheck *) palloc(list_length(old_constraints) *
                                                                                                        sizeof(ConstrCheck));
                int                     ncheck = 0;
                int                     constr_name_ctr = 0;
@@ -634,7 +634,7 @@ static List *
 MergeAttributes(List *schema, List *supers, bool istemp,
                                List **supOids, List **supconstr, int *supOidCount)
 {
-       List       *entry;
+       ListCell   *entry;
        List       *inhSchema = NIL;
        List       *parentOids = NIL;
        List       *constraints = NIL;
@@ -654,9 +654,9 @@ MergeAttributes(List *schema, List *supers, bool istemp,
        foreach(entry, schema)
        {
                ColumnDef  *coldef = lfirst(entry);
-               List       *rest;
+               ListCell   *rest;
 
-               foreach(rest, lnext(entry))
+               for_each_cell(rest, lnext(entry))
                {
                        ColumnDef  *restdef = lfirst(rest);
 
@@ -708,13 +708,13 @@ MergeAttributes(List *schema, List *supers, bool istemp,
                /*
                 * Reject duplications in the list of parents.
                 */
-               if (oidMember(RelationGetRelid(relation), parentOids))
+               if (list_member_oid(parentOids, RelationGetRelid(relation)))
                        ereport(ERROR,
                                        (errcode(ERRCODE_DUPLICATE_TABLE),
                                         errmsg("inherited relation \"%s\" duplicated",
                                                        parent->relname)));
 
-               parentOids = lappendo(parentOids, RelationGetRelid(relation));
+               parentOids = lappend_oid(parentOids, RelationGetRelid(relation));
 
                if (relation->rd_rel->relhasoids)
                        parentsWithOids++;
@@ -767,7 +767,7 @@ MergeAttributes(List *schema, List *supers, bool istemp,
                                ereport(NOTICE,
                                                (errmsg("merging multiple inherited definitions of column \"%s\"",
                                                                attributeName)));
-                               def = (ColumnDef *) nth(exist_attno - 1, inhSchema);
+                               def = (ColumnDef *) list_nth(inhSchema, exist_attno - 1);
                                if (typenameTypeId(def->typename) != attribute->atttypid ||
                                        def->typename->typmod != attribute->atttypmod)
                                        ereport(ERROR,
@@ -922,7 +922,7 @@ MergeAttributes(List *schema, List *supers, bool istemp,
                                ereport(NOTICE,
                                                (errmsg("merging column \"%s\" with inherited definition",
                                                                attributeName)));
-                               def = (ColumnDef *) nth(exist_attno - 1, inhSchema);
+                               def = (ColumnDef *) list_nth(inhSchema, exist_attno - 1);
                                if (typenameTypeId(def->typename) != typenameTypeId(newdef->typename) ||
                                        def->typename->typmod != newdef->typename->typmod)
                                        ereport(ERROR,
@@ -1033,7 +1033,7 @@ StoreCatalogInheritance(Oid relationId, List *supers)
        Relation        relation;
        TupleDesc       desc;
        int16           seqNumber;
-       List       *entry;
+       ListCell   *entry;
        HeapTuple       tuple;
 
        /*
@@ -1059,7 +1059,7 @@ StoreCatalogInheritance(Oid relationId, List *supers)
        seqNumber = 1;
        foreach(entry, supers)
        {
-               Oid                     parentOid = lfirsto(entry);
+               Oid                     parentOid = lfirst_oid(entry);
                Datum           datum[Natts_pg_inherits];
                char            nullarr[Natts_pg_inherits];
                ObjectAddress childobject,
@@ -1113,16 +1113,17 @@ StoreCatalogInheritance(Oid relationId, List *supers)
 static int
 findAttrByName(const char *attributeName, List *schema)
 {
-       List       *s;
-       int                     i = 0;
+       ListCell   *s;
+       int                     i = 1;
 
        foreach(s, schema)
        {
                ColumnDef  *def = lfirst(s);
 
-               ++i;
                if (strcmp(attributeName, def->colname) == 0)
                        return i;
+
+               i++;
        }
        return 0;
 }
@@ -1198,7 +1199,7 @@ renameatt(Oid myrelid,
        Form_pg_attribute attform;
        int                     attnum;
        List       *indexoidlist;
-       List       *indexoidscan;
+       ListCell   *indexoidscan;
 
        /*
         * Grab an exclusive lock on the target table, which we will NOT
@@ -1232,8 +1233,8 @@ renameatt(Oid myrelid,
         */
        if (recurse)
        {
-               List       *child,
-                                  *children;
+               ListCell   *child;
+               List       *children;
 
                /* this routine is actually in the planner */
                children = find_all_inheritors(myrelid);
@@ -1245,7 +1246,7 @@ renameatt(Oid myrelid,
                 */
                foreach(child, children)
                {
-                       Oid                     childrelid = lfirsto(child);
+                       Oid                     childrelid = lfirst_oid(child);
 
                        if (childrelid == myrelid)
                                continue;
@@ -1322,7 +1323,7 @@ renameatt(Oid myrelid,
 
        foreach(indexoidscan, indexoidlist)
        {
-               Oid                     indexoid = lfirsto(indexoidscan);
+               Oid                     indexoid = lfirst_oid(indexoidscan);
                HeapTuple       indextup;
                Form_pg_index indexform;
                int                     i;
@@ -1370,7 +1371,7 @@ renameatt(Oid myrelid,
                ReleaseSysCache(indextup);
        }
 
-       freeList(indexoidlist);
+       list_free(indexoidlist);
 
        heap_close(attrelation, RowExclusiveLock);
 
@@ -1765,7 +1766,7 @@ static void
 ATController(Relation rel, List *cmds, bool recurse)
 {
        List       *wqueue = NIL;
-       List       *lcmd;
+       ListCell   *lcmd;
 
        /* Phase 1: preliminary examination of commands, create work queue */
        foreach(lcmd, cmds)
@@ -1962,7 +1963,7 @@ static void
 ATRewriteCatalogs(List **wqueue)
 {
        int                     pass;
-       List       *ltab;
+       ListCell   *ltab;
 
        /*
         * We process all the tables "in parallel", one pass at a time.  This
@@ -1979,7 +1980,7 @@ ATRewriteCatalogs(List **wqueue)
                        AlteredTableInfo *tab = (AlteredTableInfo *) lfirst(ltab);
                        List       *subcmds = tab->subcmds[pass];
                        Relation        rel;
-                       List       *lcmd;
+                       ListCell   *lcmd;
 
                        if (subcmds == NIL)
                                continue;
@@ -2107,7 +2108,7 @@ ATExecCmd(AlteredTableInfo *tab, Relation rel, AlterTableCmd *cmd)
 static void
 ATRewriteTables(List **wqueue)
 {
-       List       *ltab;
+       ListCell   *ltab;
 
        /* Go through each table that needs to be checked or rewritten */
        foreach(ltab, *wqueue)
@@ -2215,7 +2216,7 @@ ATRewriteTables(List **wqueue)
        {
                AlteredTableInfo  *tab = (AlteredTableInfo *) lfirst(ltab);
                Relation                rel = NULL;
-               List       *lcon;
+               ListCell           *lcon;
 
                foreach(lcon, tab->constraints)
                {
@@ -2259,7 +2260,7 @@ ATRewriteTable(AlteredTableInfo *tab, Oid OIDNewHeap)
        TupleDesc       newTupDesc;
        bool            needscan = false;
        int                     i;
-       List       *l;
+       ListCell   *l;
        EState     *estate;
 
        /*
@@ -2473,7 +2474,7 @@ ATGetQueueEntry(List **wqueue, Relation rel)
 {
        Oid                     relid = RelationGetRelid(rel);
        AlteredTableInfo *tab;
-       List       *ltab;
+       ListCell   *ltab;
 
        foreach(ltab, *wqueue)
        {
@@ -2554,8 +2555,8 @@ ATSimpleRecursion(List **wqueue, Relation rel,
        if (recurse && rel->rd_rel->relkind == RELKIND_RELATION)
        {
                Oid                     relid = RelationGetRelid(rel);
-               List       *child,
-                                  *children;
+               ListCell   *child;
+               List       *children;
 
                /* this routine is actually in the planner */
                children = find_all_inheritors(relid);
@@ -2567,7 +2568,7 @@ ATSimpleRecursion(List **wqueue, Relation rel,
                 */
                foreach(child, children)
                {
-                       Oid                     childrelid = lfirsto(child);
+                       Oid                     childrelid = lfirst_oid(child);
                        Relation        childrel;
 
                        if (childrelid == relid)
@@ -2592,15 +2593,15 @@ ATOneLevelRecursion(List **wqueue, Relation rel,
                                        AlterTableCmd *cmd)
 {
        Oid                     relid = RelationGetRelid(rel);
-       List       *child,
-                          *children;
+       ListCell   *child;
+       List       *children;
 
        /* this routine is actually in the planner */
        children = find_inheritance_children(relid);
 
        foreach(child, children)
        {
-               Oid                     childrelid = lfirsto(child);
+               Oid                     childrelid = lfirst_oid(child);
                Relation        childrel;
 
                childrel = relation_open(childrelid, AccessExclusiveLock);
@@ -2764,7 +2765,7 @@ ATExecAddColumn(AlteredTableInfo *tab, Relation rel,
        attribute->atttypmod = colDef->typename->typmod;
        attribute->attnum = i;
        attribute->attbyval = tform->typbyval;
-       attribute->attndims = length(colDef->typename->arrayBounds);
+       attribute->attndims = list_length(colDef->typename->arrayBounds);
        attribute->attstorage = tform->typstorage;
        attribute->attalign = tform->typalign;
        attribute->attnotnull = colDef->is_not_null;
@@ -2814,7 +2815,7 @@ ATExecAddColumn(AlteredTableInfo *tab, Relation rel,
                 * This function is intended for CREATE TABLE, so it processes a
                 * _list_ of defaults, but we just do one.
                 */
-               AddRelationRawConstraints(rel, makeList1(rawEnt), NIL);
+               AddRelationRawConstraints(rel, list_make1(rawEnt), NIL);
 
                /* Make the additional catalog changes visible */
                CommandCounterIncrement();
@@ -2880,7 +2881,7 @@ ATExecDropNotNull(Relation rel, const char *colName)
        AttrNumber      attnum;
        Relation        attr_rel;
        List       *indexoidlist;
-       List       *indexoidscan;
+       ListCell   *indexoidscan;
 
        /*
         * lookup the attribute
@@ -2913,7 +2914,7 @@ ATExecDropNotNull(Relation rel, const char *colName)
 
        foreach(indexoidscan, indexoidlist)
        {
-               Oid                     indexoid = lfirsto(indexoidscan);
+               Oid                     indexoid = lfirst_oid(indexoidscan);
                HeapTuple       indexTuple;
                Form_pg_index indexStruct;
                int                     i;
@@ -2945,7 +2946,7 @@ ATExecDropNotNull(Relation rel, const char *colName)
                ReleaseSysCache(indexTuple);
        }
 
-       freeList(indexoidlist);
+       list_free(indexoidlist);
 
        /*
         * Okay, actually perform the catalog change ... if needed
@@ -3067,7 +3068,7 @@ ATExecColumnDefault(Relation rel, const char *colName,
                 * This function is intended for CREATE TABLE, so it processes a
                 * _list_ of defaults, but we just do one.
                 */
-               AddRelationRawConstraints(rel, makeList1(rawEnt), NIL);
+               AddRelationRawConstraints(rel, list_make1(rawEnt), NIL);
        }
 }
 
@@ -3292,12 +3293,12 @@ ATExecDropColumn(Relation rel, const char *colName,
        if (children)
        {
                Relation        attr_rel;
-               List       *child;
+               ListCell   *child;
 
                attr_rel = heap_openr(AttributeRelationName, RowExclusiveLock);
                foreach(child, children)
                {
-                       Oid                     childrelid = lfirsto(child);
+                       Oid                     childrelid = lfirst_oid(child);
                        Relation        childrel;
                        Form_pg_attribute childatt;
 
@@ -3464,14 +3465,14 @@ ATExecAddConstraint(AlteredTableInfo *tab, Relation rel, Node *newConstraint)
                                case CONSTR_CHECK:
                                {
                                        List       *newcons;
-                                       List       *lcon;
+                                       ListCell   *lcon;
 
                                        /*
                                         * Call AddRelationRawConstraints to do the work.
                                         * It returns a list of cooked constraints.
                                         */
                                        newcons = AddRelationRawConstraints(rel, NIL,
-                                                                                                               makeList1(constr));
+                                                                                                               list_make1(constr));
                                        /* Add each constraint to Phase 3's queue */
                                        foreach(lcon, newcons)
                                        { 
@@ -3676,7 +3677,7 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
                 * get the right answer from the test below on opclass membership
                 * unless we select the proper operator.)
                 */
-               Operator        o = oper(makeList1(makeString("=")),
+               Operator        o = oper(list_make1(makeString("=")),
                                                         pktypoid[i], fktypoid[i], true);
 
                if (o == NULL)
@@ -3687,8 +3688,8 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
                                                        fkconstraint->constr_name),
                                         errdetail("Key columns \"%s\" and \"%s\" "
                                                           "are of incompatible types: %s and %s.",
-                                                          strVal(nth(i, fkconstraint->fk_attrs)),
-                                                          strVal(nth(i, fkconstraint->pk_attrs)),
+                                                          strVal(list_nth(fkconstraint->fk_attrs, i)),
+                                                          strVal(list_nth(fkconstraint->pk_attrs, i)),
                                                           format_type_be(fktypoid[i]),
                                                           format_type_be(pktypoid[i]))));
 
@@ -3704,8 +3705,8 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
                                                        fkconstraint->constr_name),
                                         errdetail("Key columns \"%s\" and \"%s\" "
                                                           "are of different types: %s and %s.",
-                                                          strVal(nth(i, fkconstraint->fk_attrs)),
-                                                          strVal(nth(i, fkconstraint->pk_attrs)),
+                                                          strVal(list_nth(fkconstraint->fk_attrs, i)),
+                                                          strVal(list_nth(fkconstraint->pk_attrs, i)),
                                                           format_type_be(fktypoid[i]),
                                                           format_type_be(pktypoid[i]))));
 
@@ -3774,7 +3775,7 @@ static int
 transformColumnNameList(Oid relId, List *colList,
                                                int16 *attnums, Oid *atttypids)
 {
-       List       *l;
+       ListCell   *l;
        int                     attnum;
 
        attnum = 0;
@@ -3821,8 +3822,8 @@ transformFkeyGetPrimaryKey(Relation pkrel, Oid *indexOid,
                                                   int16 *attnums, Oid *atttypids,
                                                   Oid *opclasses)
 {
-       List       *indexoidlist,
-                          *indexoidscan;
+       List       *indexoidlist;
+       ListCell   *indexoidscan;
        HeapTuple       indexTuple = NULL;
        Form_pg_index indexStruct = NULL;
        int                     i;
@@ -3836,7 +3837,7 @@ transformFkeyGetPrimaryKey(Relation pkrel, Oid *indexOid,
 
        foreach(indexoidscan, indexoidlist)
        {
-               Oid                     indexoid = lfirsto(indexoidscan);
+               Oid                     indexoid = lfirst_oid(indexoidscan);
 
                indexTuple = SearchSysCache(INDEXRELID,
                                                                        ObjectIdGetDatum(indexoid),
@@ -3853,7 +3854,7 @@ transformFkeyGetPrimaryKey(Relation pkrel, Oid *indexOid,
                indexStruct = NULL;
        }
 
-       freeList(indexoidlist);
+       list_free(indexoidlist);
 
        /*
         * Check that we found it
@@ -3900,8 +3901,8 @@ transformFkeyCheckAttrs(Relation pkrel,
 {
        Oid                     indexoid = InvalidOid;
        bool            found = false;
-       List       *indexoidlist,
-                          *indexoidscan;
+       List       *indexoidlist;
+       ListCell   *indexoidscan;
 
        /*
         * Get the list of index OIDs for the table from the relcache, and
@@ -3917,7 +3918,7 @@ transformFkeyCheckAttrs(Relation pkrel,
                int                     i,
                                        j;
 
-               indexoid = lfirsto(indexoidscan);
+               indexoid = lfirst_oid(indexoidscan);
                indexTuple = SearchSysCache(INDEXRELID,
                                                                        ObjectIdGetDatum(indexoid),
                                                                        0, 0, 0);
@@ -3982,7 +3983,7 @@ transformFkeyCheckAttrs(Relation pkrel,
                                 errmsg("there is no unique constraint matching given keys for referenced table \"%s\"",
                                                RelationGetRelationName(pkrel))));
 
-       freeList(indexoidlist);
+       list_free(indexoidlist);
 
        return indexoid;
 }
@@ -4001,7 +4002,7 @@ validateForeignKeyConstraint(FkConstraint *fkconstraint,
        HeapScanDesc scan;
        HeapTuple       tuple;
        Trigger         trig;
-       List       *list;
+       ListCell   *list;
        int                     count;
 
        /*
@@ -4026,8 +4027,8 @@ validateForeignKeyConstraint(FkConstraint *fkconstraint,
        trig.tginitdeferred = FALSE;
 
        trig.tgargs = (char **) palloc(sizeof(char *) *
-                                                                  (4 + length(fkconstraint->fk_attrs)
-                                                                       + length(fkconstraint->pk_attrs)));
+                                                                  (4 + list_length(fkconstraint->fk_attrs)
+                                                                       + list_length(fkconstraint->pk_attrs)));
 
        trig.tgargs[0] = trig.tgname;
        trig.tgargs[1] = RelationGetRelationName(rel);
@@ -4094,8 +4095,8 @@ createForeignKeyTriggers(Relation rel, FkConstraint *fkconstraint,
 {
        RangeVar   *myRel;
        CreateTrigStmt *fk_trigger;
-       List       *fk_attr;
-       List       *pk_attr;
+       ListCell   *fk_attr;
+       ListCell   *pk_attr;
        ObjectAddress trigobj,
                                constrobj;
 
@@ -4146,19 +4147,16 @@ createForeignKeyTriggers(Relation rel, FkConstraint *fkconstraint,
                                                         makeString(fkconstraint->pktable->relname));
        fk_trigger->args = lappend(fk_trigger->args,
                        makeString(fkMatchTypeToString(fkconstraint->fk_matchtype)));
-       fk_attr = fkconstraint->fk_attrs;
-       pk_attr = fkconstraint->pk_attrs;
-       if (length(fk_attr) != length(pk_attr))
+       if (list_length(fkconstraint->fk_attrs) != list_length(fkconstraint->pk_attrs))
                ereport(ERROR,
                                (errcode(ERRCODE_INVALID_FOREIGN_KEY),
                                 errmsg("number of referencing and referenced columns for foreign key disagree")));
 
-       while (fk_attr != NIL)
+       forboth(fk_attr, fkconstraint->fk_attrs,
+                       pk_attr, fkconstraint->pk_attrs)
        {
                fk_trigger->args = lappend(fk_trigger->args, lfirst(fk_attr));
                fk_trigger->args = lappend(fk_trigger->args, lfirst(pk_attr));
-               fk_attr = lnext(fk_attr);
-               pk_attr = lnext(pk_attr);
        }
 
        trigobj.objectId = CreateTrigger(fk_trigger, true);
@@ -4219,14 +4217,11 @@ createForeignKeyTriggers(Relation rel, FkConstraint *fkconstraint,
                                                         makeString(fkconstraint->pktable->relname));
        fk_trigger->args = lappend(fk_trigger->args,
                        makeString(fkMatchTypeToString(fkconstraint->fk_matchtype)));
-       fk_attr = fkconstraint->fk_attrs;
-       pk_attr = fkconstraint->pk_attrs;
-       while (fk_attr != NIL)
+       forboth(fk_attr, fkconstraint->fk_attrs,
+                       pk_attr, fkconstraint->pk_attrs)
        {
                fk_trigger->args = lappend(fk_trigger->args, lfirst(fk_attr));
                fk_trigger->args = lappend(fk_trigger->args, lfirst(pk_attr));
-               fk_attr = lnext(fk_attr);
-               pk_attr = lnext(pk_attr);
        }
 
        trigobj.objectId = CreateTrigger(fk_trigger, true);
@@ -4286,14 +4281,11 @@ createForeignKeyTriggers(Relation rel, FkConstraint *fkconstraint,
                                                         makeString(fkconstraint->pktable->relname));
        fk_trigger->args = lappend(fk_trigger->args,
                        makeString(fkMatchTypeToString(fkconstraint->fk_matchtype)));
-       fk_attr = fkconstraint->fk_attrs;
-       pk_attr = fkconstraint->pk_attrs;
-       while (fk_attr != NIL)
+       forboth(fk_attr, fkconstraint->fk_attrs,
+                       pk_attr, fkconstraint->pk_attrs)
        {
                fk_trigger->args = lappend(fk_trigger->args, lfirst(fk_attr));
                fk_trigger->args = lappend(fk_trigger->args, lfirst(pk_attr));
-               fk_attr = lnext(fk_attr);
-               pk_attr = lnext(pk_attr);
        }
 
        trigobj.objectId = CreateTrigger(fk_trigger, true);
@@ -4626,9 +4618,9 @@ ATExecAlterColumnType(AlteredTableInfo *tab, Relation rel,
                                if (relKind == RELKIND_INDEX)
                                {
                                        Assert(foundObject.objectSubId == 0);
-                                       if (!oidMember(foundObject.objectId, tab->changedIndexOids))
+                                       if (!list_member_oid(tab->changedIndexOids, foundObject.objectId))
                                        {
-                                               tab->changedIndexOids = lappendo(tab->changedIndexOids,
+                                               tab->changedIndexOids = lappend_oid(tab->changedIndexOids,
                                                                                                                 foundObject.objectId);
                                                tab->changedIndexDefs = lappend(tab->changedIndexDefs,
                                                                                                                pg_get_indexdef_string(foundObject.objectId));
@@ -4653,9 +4645,9 @@ ATExecAlterColumnType(AlteredTableInfo *tab, Relation rel,
 
                        case OCLASS_CONSTRAINT:
                                Assert(foundObject.objectSubId == 0);
-                               if (!oidMember(foundObject.objectId, tab->changedConstraintOids))
+                               if (!list_member_oid(tab->changedConstraintOids, foundObject.objectId))
                                {
-                                       tab->changedConstraintOids = lappendo(tab->changedConstraintOids,
+                                       tab->changedConstraintOids = lappend_oid(tab->changedConstraintOids,
                                                                                                                  foundObject.objectId);
                                        tab->changedConstraintDefs = lappend(tab->changedConstraintDefs,
                                                                                                                 pg_get_constraintdef_string(foundObject.objectId));
@@ -4750,7 +4742,7 @@ ATExecAlterColumnType(AlteredTableInfo *tab, Relation rel,
         */
        attTup->atttypid = targettype;
        attTup->atttypmod = typename->typmod;
-       attTup->attndims = length(typename->arrayBounds);
+       attTup->attndims = list_length(typename->arrayBounds);
        attTup->attlen = tform->typlen;
        attTup->attbyval = tform->typbyval;
        attTup->attalign = tform->typalign;
@@ -4805,7 +4797,7 @@ static void
 ATPostAlterTypeCleanup(List **wqueue, AlteredTableInfo *tab)
 {
        ObjectAddress obj;
-       List    *l;
+       ListCell         *l;
 
        /*
         * Re-parse the index and constraint definitions, and attach them to
@@ -4835,7 +4827,7 @@ ATPostAlterTypeCleanup(List **wqueue, AlteredTableInfo *tab)
                obj.classId = get_system_catalog_relid(ConstraintRelationName);
        foreach(l, tab->changedConstraintOids)
        {
-               obj.objectId = lfirsto(l);
+               obj.objectId = lfirst_oid(l);
                obj.objectSubId = 0;
                performDeletion(&obj, DROP_RESTRICT);
        }
@@ -4843,7 +4835,7 @@ ATPostAlterTypeCleanup(List **wqueue, AlteredTableInfo *tab)
        obj.classId = RelOid_pg_class;
        foreach(l, tab->changedIndexOids)
        {
-               obj.objectId = lfirsto(l);
+               obj.objectId = lfirst_oid(l);
                obj.objectSubId = 0;
                performDeletion(&obj, DROP_RESTRICT);
        }
@@ -4859,7 +4851,7 @@ ATPostAlterTypeParse(char *cmd, List **wqueue)
 {
        List       *raw_parsetree_list;
        List       *querytree_list;
-       List       *list_item;
+       ListCell   *list_item;
 
        /*
         * We expect that we only have to do raw parsing and parse analysis, not
@@ -4871,7 +4863,7 @@ ATPostAlterTypeParse(char *cmd, List **wqueue)
        {
                Node       *parsetree = (Node *) lfirst(list_item);
 
-               querytree_list = nconc(querytree_list,
+               querytree_list = list_concat(querytree_list,
                                                           parse_analyze(parsetree, NULL, 0));
        }
 
@@ -4907,7 +4899,7 @@ ATPostAlterTypeParse(char *cmd, List **wqueue)
                        case T_AlterTableStmt:
                        {
                                AlterTableStmt *stmt = (AlterTableStmt *) query->utilityStmt;
-                               List       *lcmd;
+                               ListCell           *lcmd;
 
                                rel = relation_openrv(stmt->relation, AccessExclusiveLock);
                                tab = ATGetQueueEntry(wqueue, rel);
@@ -5002,17 +4994,17 @@ ATExecChangeOwner(Oid relationOid, int32 newOwnerSysId)
        if (tuple_class->relkind == RELKIND_RELATION ||
                tuple_class->relkind == RELKIND_TOASTVALUE)
        {
-               List       *index_oid_list,
-                                  *i;
+               List       *index_oid_list;
+               ListCell   *i;
 
                /* Find all the indexes belonging to this relation */
                index_oid_list = RelationGetIndexList(target_rel);
 
                /* For each index, recursively change its ownership */
                foreach(i, index_oid_list)
-                       ATExecChangeOwner(lfirsto(i), newOwnerSysId);
+                       ATExecChangeOwner(lfirst_oid(i), newOwnerSysId);
 
-               freeList(index_oid_list);
+               list_free(index_oid_list);
        }
 
        if (tuple_class->relkind == RELKIND_RELATION)
@@ -5362,7 +5354,7 @@ register_on_commit_action(Oid relid, OnCommitAction action)
 void
 remove_on_commit_action(Oid relid)
 {
-       List       *l;
+       ListCell   *l;
 
        foreach(l, on_commits)
        {
@@ -5385,7 +5377,7 @@ remove_on_commit_action(Oid relid)
 void
 PreCommit_on_commit_actions(void)
 {
-       List       *l;
+       ListCell   *l;
 
        foreach(l, on_commits)
        {
@@ -5437,40 +5429,34 @@ PreCommit_on_commit_actions(void)
 void
 AtEOXact_on_commit_actions(bool isCommit)
 {
-       List       *l,
-                          *prev;
+       ListCell *cur_item;
+       ListCell *prev_item;
 
-       prev = NIL;
-       l = on_commits;
-       while (l != NIL)
+       prev_item = NULL;
+       cur_item = list_head(on_commits);
+
+       while (cur_item != NULL)
        {
-               OnCommitItem *oc = (OnCommitItem *) lfirst(l);
+               OnCommitItem *oc = (OnCommitItem *) lfirst(cur_item);
 
                if (isCommit ? oc->deleted_in_cur_xact :
                        oc->created_in_cur_xact)
                {
-                       /* This entry must be removed */
-                       if (prev != NIL)
-                       {
-                               lnext(prev) = lnext(l);
-                               pfree(l);
-                               l = lnext(prev);
-                       }
-                       else
-                       {
-                               on_commits = lnext(l);
-                               pfree(l);
-                               l = on_commits;
-                       }
+                       /* cur_item must be removed */
+                       on_commits = list_delete_cell(on_commits, cur_item, prev_item);
                        pfree(oc);
+                       if (prev_item)
+                               cur_item = lnext(prev_item);
+                       else
+                               cur_item = list_head(on_commits);
                }
                else
                {
-                       /* This entry must be preserved */
-                       oc->created_in_cur_xact = false;
+                       /* cur_item must be preserved */
                        oc->deleted_in_cur_xact = false;
-                       prev = l;
-                       l = lnext(l);
+                       oc->created_in_cur_xact = false;
+                       prev_item = cur_item;
+                       cur_item = lnext(prev_item);
                }
        }
 }
index bddf3f5ad68b7e97c6de952cc21ce4aca587d74d..cfbd58e4282a540528a64d8062bddc5d67c0fdb4 100644 (file)
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/commands/trigger.c,v 1.164 2004/02/10 01:55:25 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/commands/trigger.c,v 1.165 2004/05/26 04:41:12 neilc Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -111,19 +111,19 @@ CreateTrigger(CreateTrigStmt *stmt, bool forConstraint)
                bool            needconstrrelid = false;
                void       *elem = NULL;
 
-               if (strncmp(strVal(llast(stmt->funcname)), "RI_FKey_check_", 14) == 0)
+               if (strncmp(strVal(lfirst(list_tail((stmt->funcname)))), "RI_FKey_check_", 14) == 0)
                {
                        /* A trigger on FK table. */
                        needconstrrelid = true;
-                       if (length(stmt->args) > RI_PK_RELNAME_ARGNO)
-                               elem = nth(RI_PK_RELNAME_ARGNO, stmt->args);
+                       if (list_length(stmt->args) > RI_PK_RELNAME_ARGNO)
+                               elem = list_nth(stmt->args, RI_PK_RELNAME_ARGNO);
                }
-               else if (strncmp(strVal(llast(stmt->funcname)), "RI_FKey_", 8) == 0)
+               else if (strncmp(strVal(lfirst(list_tail((stmt->funcname)))), "RI_FKey_", 8) == 0)
                {
                        /* A trigger on PK table. */
                        needconstrrelid = true;
-                       if (length(stmt->args) > RI_FK_RELNAME_ARGNO)
-                               elem = nth(RI_FK_RELNAME_ARGNO, stmt->args);
+                       if (list_length(stmt->args) > RI_FK_RELNAME_ARGNO)
+                               elem = list_nth(stmt->args, RI_FK_RELNAME_ARGNO);
                }
                if (elem != NULL)
                {
@@ -318,9 +318,9 @@ CreateTrigger(CreateTrigStmt *stmt, bool forConstraint)
 
        if (stmt->args)
        {
-               List       *le;
+               ListCell   *le;
                char       *args;
-               int16           nargs = length(stmt->args);
+               int16           nargs = list_length(stmt->args);
                int                     len = 0;
 
                foreach(le, stmt->args)
@@ -1691,7 +1691,7 @@ static bool
 deferredTriggerCheckState(Oid tgoid, int32 itemstate)
 {
        MemoryContext oldcxt;
-       List       *sl;
+       ListCell   *sl;
        DeferredTriggerStatus trigstate;
 
        /*
@@ -2193,7 +2193,7 @@ DeferredTriggerAbortXact(void)
 void
 DeferredTriggerSetState(ConstraintsSetStmt *stmt)
 {
-       List       *l;
+       ListCell           *l;
 
        /*
         * Ignore call if we aren't in a transaction.
@@ -2210,15 +2210,7 @@ DeferredTriggerSetState(ConstraintsSetStmt *stmt)
                 * Drop all per-transaction information about individual trigger
                 * states.
                 */
-               l = deferredTriggers->deftrig_trigstates;
-               while (l != NIL)
-               {
-                       List       *next = lnext(l);
-
-                       pfree(lfirst(l));
-                       pfree(l);
-                       l = next;
-               }
+               list_free_deep(deferredTriggers->deftrig_trigstates);
                deferredTriggers->deftrig_trigstates = NIL;
 
                /*
@@ -2233,7 +2225,7 @@ DeferredTriggerSetState(ConstraintsSetStmt *stmt)
                MemoryContext oldcxt;
                bool            found;
                DeferredTriggerStatus state;
-               List       *ls;
+               ListCell   *ls;
                List       *loid = NIL;
 
                /* ----------
@@ -2293,7 +2285,7 @@ DeferredTriggerSetState(ConstraintsSetStmt *stmt)
                                                                        cname)));
 
                                constr_oid = HeapTupleGetOid(htup);
-                               loid = lappendo(loid, constr_oid);
+                               loid = lappend_oid(loid, constr_oid);
                                found = true;
                        }
 
@@ -2321,7 +2313,7 @@ DeferredTriggerSetState(ConstraintsSetStmt *stmt)
                        foreach(ls, deferredTriggers->deftrig_trigstates)
                        {
                                state = (DeferredTriggerStatus) lfirst(ls);
-                               if (state->dts_tgoid == lfirsto(l))
+                               if (state->dts_tgoid == lfirst_oid(l))
                                {
                                        state->dts_tgisdeferred = stmt->deferred;
                                        found = true;
@@ -2332,7 +2324,7 @@ DeferredTriggerSetState(ConstraintsSetStmt *stmt)
                        {
                                state = (DeferredTriggerStatus)
                                        palloc(sizeof(DeferredTriggerStatusData));
-                               state->dts_tgoid = lfirsto(l);
+                               state->dts_tgoid = lfirst_oid(l);
                                state->dts_tgisdeferred = stmt->deferred;
 
                                deferredTriggers->deftrig_trigstates =
index 03428369ff485feb00b508b03d2b96e5288ed3e6..d8a2a5b20f5d91c7dfc32d48ae7edc8c80357857 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/commands/typecmds.c,v 1.56 2004/05/14 16:11:25 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/commands/typecmds.c,v 1.57 2004/05/26 04:41:12 neilc Exp $
  *
  * DESCRIPTION
  *       The "DefineFoo" routines take the parse tree and pick out the
@@ -114,7 +114,7 @@ DefineType(List *names, List *parameters)
        Oid                     sendOid = InvalidOid;
        Oid                     analyzeOid = InvalidOid;
        char       *shadow_type;
-       List       *pl;
+       ListCell   *pl;
        Oid                     typoid;
        Oid                     resulttype;
 
@@ -502,10 +502,10 @@ DefineDomain(CreateDomainStmt *stmt)
        bool            typNotNull = false;
        bool            nullDefined = false;
        Oid                     basetypelem;
-       int32           typNDims = length(stmt->typename->arrayBounds);
+       int32           typNDims = list_length(stmt->typename->arrayBounds);
        HeapTuple       typeTup;
        List       *schema = stmt->constraints;
-       List       *listptr;
+       ListCell   *listptr;
        Oid                     basetypeoid;
        Oid                     domainoid;
        Form_pg_type baseType;
@@ -1304,7 +1304,7 @@ AlterDomainNotNull(List *names, bool notNull)
        if (notNull)
        {
                List       *rels;
-               List       *rt;
+               ListCell   *rt;
 
                /* Fetch relation list with attributes based on this domain */
                /* ShareLock is sufficient to prevent concurrent data changes */
@@ -1461,7 +1461,7 @@ AlterDomainAddConstraint(List *names, Node *newConstraint)
        HeapTuple       tup;
        Form_pg_type typTup;
        List       *rels;
-       List       *rt;
+       ListCell   *rt;
        EState     *estate;
        ExprContext *econtext;
        char       *ccbin;
@@ -1681,7 +1681,7 @@ get_rels_with_domain(Oid domainOid, LOCKMODE lockmode)
        {
                Form_pg_depend pg_depend = (Form_pg_depend) GETSTRUCT(depTup);
                RelToCheck *rtc = NULL;
-               List       *rellist;
+               ListCell   *rellist;
                Form_pg_attribute pg_att;
                int                     ptr;
 
@@ -1848,7 +1848,7 @@ domainAddConstraint(Oid domainOid, Oid domainNamespace, Oid baseTypeOid,
        /*
         * Make sure no outside relations are referred to.
         */
-       if (length(pstate->p_rtable) != 0)
+       if (list_length(pstate->p_rtable) != 0)
                ereport(ERROR,
                                (errcode(ERRCODE_INVALID_COLUMN_REFERENCE),
                                 errmsg("cannot use table references in domain check constraint")));
index 476e7e1865e4597899db327b80dae2f870dae9a7..255428fadc7d62491e51c7371d9adb07d18503f2 100644 (file)
@@ -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/commands/user.c,v 1.140 2004/05/06 16:59:16 momjian Exp $
+ * $PostgreSQL: pgsql/src/backend/commands/user.c,v 1.141 2004/05/26 04:41:12 neilc Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -491,8 +491,8 @@ CreateUser(CreateUserStmt *stmt)
                                sysid_exists = false,
                                havesysid = false;
        int                     max_id;
-       List       *item,
-                          *option;
+       ListCell   *item;
+       ListCell   *option;
        char       *password = NULL;    /* PostgreSQL user password */
        bool            encrypt_password = Password_encryption; /* encrypt password? */
        char            encrypted_password[MD5_PASSWD_LEN + 1];
@@ -715,7 +715,7 @@ CreateUser(CreateUserStmt *stmt)
                ags.name = strVal(lfirst(item));                /* the group name to add
                                                                                                 * this in */
                ags.action = +1;
-               ags.listUsers = makeList1(makeInteger(sysid));
+               ags.listUsers = list_make1(makeInteger(sysid));
                AlterGroup(&ags, "CREATE USER");
        }
 
@@ -746,7 +746,7 @@ AlterUser(AlterUserStmt *stmt)
        TupleDesc       pg_shadow_dsc;
        HeapTuple       tuple,
                                new_tuple;
-       List       *option;
+       ListCell   *option;
        char       *password = NULL;    /* PostgreSQL user password */
        bool            encrypt_password = Password_encryption; /* encrypt password? */
        char            encrypted_password[MD5_PASSWD_LEN + 1];
@@ -1017,7 +1017,7 @@ DropUser(DropUserStmt *stmt)
 {
        Relation        pg_shadow_rel;
        TupleDesc       pg_shadow_dsc;
-       List       *item;
+       ListCell   *item;
 
        if (!superuser())
                ereport(ERROR,
@@ -1122,7 +1122,7 @@ DropUser(DropUserStmt *stmt)
                        /* the group name from which to try to drop the user: */
                        ags.name = pstrdup(NameStr(((Form_pg_group) GETSTRUCT(tmp_tuple))->groname));
                        ags.action = -1;
-                       ags.listUsers = makeList1(makeInteger(usesysid));
+                       ags.listUsers = list_make1(makeInteger(usesysid));
                        AlterGroup(&ags, "DROP USER");
                }
                heap_endscan(scan);
@@ -1283,9 +1283,9 @@ CreateGroup(CreateGroupStmt *stmt)
        int                     max_id;
        Datum           new_record[Natts_pg_group];
        char            new_record_nulls[Natts_pg_group];
-       List       *item,
-                          *option,
-                          *newlist = NIL;
+       ListCell   *item;
+       ListCell   *option;
+       List       *newlist = NIL;
        IdList     *grolist;
        int                     sysid = 0;
        List       *userElts = NIL;
@@ -1397,8 +1397,8 @@ CreateGroup(CreateGroupStmt *stmt)
                const char *groupuser = strVal(lfirst(item));
                int32           userid = get_usesysid(groupuser);
 
-               if (!intMember(userid, newlist))
-                       newlist = lappendi(newlist, userid);
+               if (!list_member_int(newlist, userid))
+                       newlist = lappend_int(newlist, userid);
        }
 
        /* build an array to insert */
@@ -1454,8 +1454,8 @@ AlterGroup(AlterGroupStmt *stmt, const char *tag)
        IdList     *oldarray;
        Datum           datum;
        bool            null;
-       List       *newlist,
-                          *item;
+       List       *newlist;
+       ListCell   *item;
 
        /*
         * Make sure the user can do this.
@@ -1525,8 +1525,8 @@ AlterGroup(AlterGroupStmt *stmt, const char *tag)
                                sysid = 0;              /* keep compiler quiet */
                        }
 
-                       if (!intMember(sysid, newlist))
-                               newlist = lappendi(newlist, sysid);
+                       if (!list_member_int(newlist, sysid))
+                               newlist = lappend_int(newlist, sysid);
                }
 
                /* Do the update */
@@ -1565,8 +1565,8 @@ AlterGroup(AlterGroupStmt *stmt, const char *tag)
                                        /* for dropuser we already know the uid */
                                        sysid = intVal(lfirst(item));
                                }
-                               if (intMember(sysid, newlist))
-                                       newlist = lremovei(sysid, newlist);
+                               if (list_member_int(newlist, sysid))
+                                       newlist = list_delete_int(newlist, sysid);
                                else if (!is_dropuser)
                                        ereport(WARNING,
                                                        (errcode(ERRCODE_WARNING),
@@ -1636,9 +1636,9 @@ UpdateGroupMembership(Relation group_rel, HeapTuple group_tuple,
 static IdList *
 IdListToArray(List *members)
 {
-       int                     nmembers = length(members);
+       int                     nmembers = list_length(members);
        IdList     *newarray;
-       List       *item;
+       ListCell   *item;
        int                     i;
 
        newarray = palloc(ARR_OVERHEAD(1) + nmembers * sizeof(int32));
@@ -1650,7 +1650,7 @@ IdListToArray(List *members)
        ARR_DIMS(newarray)[0] = nmembers;       /* axis is this long */
        i = 0;
        foreach(item, members)
-               ((int *) ARR_DATA_PTR(newarray))[i++] = lfirsti(item);
+               ((int *) ARR_DATA_PTR(newarray))[i++] = lfirst_int(item);
 
        return newarray;
 }
@@ -1679,8 +1679,8 @@ IdArrayToList(IdList *oldarray)
 
                sysid = ((int32 *) ARR_DATA_PTR(oldarray))[i];
                /* filter out any duplicates --- probably a waste of time */
-               if (!intMember(sysid, newlist))
-                       newlist = lappendi(newlist, sysid);
+               if (!list_member_int(newlist, sysid))
+                       newlist = lappend_int(newlist, sysid);
        }
 
        return newlist;
index 5822b7f210cbc42ea2d88d70f00594e3884c6ed2..b2ebda8e975b4af405c732ac30a3c8c44bc57e26 100644 (file)
@@ -13,7 +13,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/commands/vacuum.c,v 1.277 2004/05/22 23:14:38 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/commands/vacuum.c,v 1.278 2004/05/26 04:41:12 neilc Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -164,8 +164,8 @@ vacuum(VacuumStmt *vacstmt)
        bool            all_rels,
                                in_outer_xact,
                                use_own_xacts;
-       List       *relations,
-                          *cur;
+       List       *relations;
+       ListCell   *cur;
 
        if (vacstmt->verbose)
                elevel = INFO;
@@ -276,7 +276,7 @@ vacuum(VacuumStmt *vacstmt)
                Assert(vacstmt->analyze);
                if (in_outer_xact)
                        use_own_xacts = false;
-               else if (length(relations) > 1)
+               else if (list_length(relations) > 1)
                        use_own_xacts = true;
                else
                        use_own_xacts = false;
@@ -312,7 +312,7 @@ vacuum(VacuumStmt *vacstmt)
         */
        foreach(cur, relations)
        {
-               Oid                     relid = lfirsto(cur);
+               Oid                     relid = lfirst_oid(cur);
 
                if (vacstmt->vacuum)
                {
@@ -431,7 +431,7 @@ get_rel_oids(const RangeVar *vacrel, const char *stmttype)
 
                /* Make a relation list entry for this guy */
                oldcontext = MemoryContextSwitchTo(vac_context);
-               oid_list = lappendo(oid_list, relid);
+               oid_list = lappend_oid(oid_list, relid);
                MemoryContextSwitchTo(oldcontext);
        }
        else
@@ -455,7 +455,7 @@ get_rel_oids(const RangeVar *vacrel, const char *stmttype)
                {
                        /* Make a relation list entry for this guy */
                        oldcontext = MemoryContextSwitchTo(vac_context);
-                       oid_list = lappendo(oid_list, HeapTupleGetOid(tuple));
+                       oid_list = lappend_oid(oid_list, HeapTupleGetOid(tuple));
                        MemoryContextSwitchTo(oldcontext);
                }
 
@@ -3061,13 +3061,13 @@ vac_cmp_vtlinks(const void *left, const void *right)
 void
 vac_open_indexes(Relation relation, int *nindexes, Relation **Irel)
 {
-       List       *indexoidlist,
-                          *indexoidscan;
+       List       *indexoidlist;
+       ListCell   *indexoidscan;
        int                     i;
 
        indexoidlist = RelationGetIndexList(relation);
 
-       *nindexes = length(indexoidlist);
+       *nindexes = list_length(indexoidlist);
 
        if (*nindexes > 0)
                *Irel = (Relation *) palloc(*nindexes * sizeof(Relation));
@@ -3077,13 +3077,13 @@ vac_open_indexes(Relation relation, int *nindexes, Relation **Irel)
        i = 0;
        foreach(indexoidscan, indexoidlist)
        {
-               Oid                     indexoid = lfirsto(indexoidscan);
+               Oid                     indexoid = lfirst_oid(indexoidscan);
 
                (*Irel)[i] = index_open(indexoid);
                i++;
        }
 
-       freeList(indexoidlist);
+       list_free(indexoidlist);
 }
 
 
index 58cf97408f3193c46338029c780488a5191d8ef7..4a58419079ada18a80ce980b416e6e072ad4c4d9 100644 (file)
@@ -9,7 +9,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/commands/variable.c,v 1.96 2004/05/23 23:12:11 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/commands/variable.c,v 1.97 2004/05/26 04:41:13 neilc Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -48,7 +48,7 @@ assign_datestyle(const char *value, bool doit, GucSource source)
        char       *rawstring;
        char       *result;
        List       *elemlist;
-       List       *l;
+       ListCell   *l;
 
        /* Need a modifiable copy of string */
        rawstring = pstrdup(value);
@@ -58,7 +58,7 @@ assign_datestyle(const char *value, bool doit, GucSource source)
        {
                /* syntax error in list */
                pfree(rawstring);
-               freeList(elemlist);
+               list_free(elemlist);
                if (source >= PGC_S_INTERACTIVE)
                        ereport(ERROR,
                                        (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
@@ -159,7 +159,7 @@ assign_datestyle(const char *value, bool doit, GucSource source)
                ok = false;
 
        pfree(rawstring);
-       freeList(elemlist);
+       list_free(elemlist);
 
        if (!ok)
        {
index a8c3cb5ce07ca2d220c0c8c2f295928d4bb2381e..4c27bd67199113ab98da4576010f54b6241eea88 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/commands/view.c,v 1.81 2004/01/14 23:01:54 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/commands/view.c,v 1.82 2004/05/26 04:41:13 neilc Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -47,8 +47,8 @@ DefineVirtualRelation(const RangeVar *relation, List *tlist, bool replace)
        Oid                     viewOid,
                                namespaceId;
        CreateStmt *createStmt = makeNode(CreateStmt);
-       List       *attrList,
-                          *t;
+       List       *attrList;
+       ListCell   *t;
 
        /*
         * create a list of ColumnDef nodes based on the names and types of
@@ -217,7 +217,7 @@ FormViewRetrieveRule(const RangeVar *view, Query *viewParse, bool replace)
        rule->whereClause = NULL;
        rule->event = CMD_SELECT;
        rule->instead = true;
-       rule->actions = makeList1(viewParse);
+       rule->actions = list_make1(viewParse);
        rule->replace = replace;
 
        return rule;
index 8bbd1942eba02fa7a0c7c51be0a02501c28a651c..fdf55b31c0c88120ce4078689b59bb0f52e66beb 100644 (file)
@@ -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/executor/execAmi.c,v 1.78 2004/03/02 18:56:15 tgl Exp $
+ *     $PostgreSQL: pgsql/src/backend/executor/execAmi.c,v 1.79 2004/05/26 04:41:14 neilc Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -64,11 +64,11 @@ ExecReScan(PlanState *node, ExprContext *exprCtxt)
        /* If we have changed parameters, propagate that info */
        if (node->chgParam != NULL)
        {
-               List       *lst;
+               ListCell        *l;
 
-               foreach(lst, node->initPlan)
+               foreach(l, node->initPlan)
                {
-                       SubPlanState *sstate = (SubPlanState *) lfirst(lst);
+                       SubPlanState *sstate = (SubPlanState *) lfirst(l);
                        PlanState  *splan = sstate->planstate;
 
                        if (splan->plan->extParam != NULL)      /* don't care about child
@@ -77,9 +77,9 @@ ExecReScan(PlanState *node, ExprContext *exprCtxt)
                        if (splan->chgParam != NULL)
                                ExecReScanSetParamPlan(sstate, node);
                }
-               foreach(lst, node->subPlan)
+               foreach(l, node->subPlan)
                {
-                       SubPlanState *sstate = (SubPlanState *) lfirst(lst);
+                       SubPlanState *sstate = (SubPlanState *) lfirst(l);
                        PlanState  *splan = sstate->planstate;
 
                        if (splan->plan->extParam != NULL)
@@ -315,7 +315,7 @@ ExecSupportsBackwardScan(Plan *node)
 
                case T_Append:
                        {
-                               List       *l;
+                               ListCell   *l;
 
                                foreach(l, ((Append *) node)->appendplans)
                                {
index 0411e2e553d57fb6576cb84bf15de4afef8105c8..20c385134b272d95ec8c3afb91c2d1e8d6cef512 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/executor/execJunk.c,v 1.39 2004/04/07 18:46:12 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/executor/execJunk.c,v 1.40 2004/05/26 04:41:14 neilc Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -68,7 +68,7 @@ ExecInitJunkFilter(List *targetList, TupleDesc tupType,
        int                     len,
                                cleanLength;
        TupleDesc       cleanTupType;
-       List       *t;
+       ListCell   *t;
        TargetEntry *tle;
        Resdom     *resdom,
                           *cleanResdom;
@@ -184,7 +184,7 @@ ExecGetJunkAttribute(JunkFilter *junkfilter,
                                         bool *isNull)
 {
        List       *targetList;
-       List       *t;
+       ListCell   *t;
        AttrNumber      resno;
        TupleDesc       tupType;
        HeapTuple       tuple;
index e8ed4ce5cc46f702a438610d2332d659eb15dc73..5ee954ab4d68593474e997efe6a16a6e43920898 100644 (file)
@@ -26,7 +26,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/executor/execMain.c,v 1.231 2004/05/11 17:36:12 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/executor/execMain.c,v 1.232 2004/05/26 04:41:14 neilc Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -353,11 +353,11 @@ ExecutorRewind(QueryDesc *queryDesc)
 void
 ExecCheckRTPerms(List *rangeTable)
 {
-       List       *lp;
+       ListCell   *l;
 
-       foreach(lp, rangeTable)
+       foreach(l, rangeTable)
        {
-               RangeTblEntry *rte = lfirst(lp);
+               RangeTblEntry *rte = lfirst(l);
 
                ExecCheckRTEPerms(rte);
        }
@@ -427,7 +427,7 @@ ExecCheckRTEPerms(RangeTblEntry *rte)
 static void
 ExecCheckXactReadOnly(Query *parsetree)
 {
-       List       *lp;
+       ListCell   *l;
 
        /*
         * CREATE TABLE AS or SELECT INTO?
@@ -438,9 +438,9 @@ ExecCheckXactReadOnly(Query *parsetree)
                goto fail;
 
        /* Fail if write permissions are requested on any non-temp table */
-       foreach(lp, parsetree->rtable)
+       foreach(l, parsetree->rtable)
        {
-               RangeTblEntry *rte = lfirst(lp);
+               RangeTblEntry *rte = lfirst(l);
 
                if (rte->rtekind == RTE_SUBQUERY)
                {
@@ -521,20 +521,20 @@ InitPlan(QueryDesc *queryDesc, bool explainOnly)
                         * Multiple result relations (due to inheritance)
                         * parseTree->resultRelations identifies them all
                         */
-                       ResultRelInfo *resultRelInfo;
+                       ResultRelInfo   *resultRelInfo;
+                       ListCell                *l;
 
                        numResultRelations = length(resultRelations);
                        resultRelInfos = (ResultRelInfo *)
                                palloc(numResultRelations * sizeof(ResultRelInfo));
                        resultRelInfo = resultRelInfos;
-                       while (resultRelations != NIL)
+                       foreach(l, resultRelations)
                        {
                                initResultRelInfo(resultRelInfo,
-                                                                 lfirsti(resultRelations),
+                                                                 lfirst_int(l),
                                                                  rangeTable,
                                                                  operation);
                                resultRelInfo++;
-                               resultRelations = lnext(resultRelations);
                        }
                }
                else
@@ -586,7 +586,7 @@ InitPlan(QueryDesc *queryDesc, bool explainOnly)
        estate->es_rowMark = NIL;
        if (parseTree->rowMarks != NIL)
        {
-               List       *l;
+               ListCell   *l;
 
                foreach(l, parseTree->rowMarks)
                {
@@ -651,7 +651,7 @@ InitPlan(QueryDesc *queryDesc, bool explainOnly)
         */
        {
                bool            junk_filter_needed = false;
-               List       *tlist;
+               ListCell   *tlist;
 
                switch (operation)
                {
@@ -950,7 +950,7 @@ ExecEndPlan(PlanState *planstate, EState *estate)
 {
        ResultRelInfo *resultRelInfo;
        int                     i;
-       List       *l;
+       ListCell   *l;
 
        /*
         * shut down any PlanQual processing we were doing
@@ -1132,7 +1132,7 @@ lnext:    ;
                        }
                        else if (estate->es_rowMark != NIL)
                        {
-                               List       *l;
+                               ListCell   *l;
 
                lmark:  ;
                                foreach(l, estate->es_rowMark)
@@ -1785,7 +1785,7 @@ EvalPlanQual(EState *estate, Index rti, ItemPointer tid)
                relation = estate->es_result_relation_info->ri_RelationDesc;
        else
        {
-               List       *l;
+               ListCell   *l;
 
                relation = NULL;
                foreach(l, estate->es_rowMark)
index 4a50c4bc9096c2cb6fbcd450f23adf0396cde760..dbe1b9b9fd692d91e45b03218e2fccd367e36ae4 100644 (file)
@@ -12,7 +12,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/executor/execProcnode.c,v 1.42 2004/03/02 22:17:34 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/executor/execProcnode.c,v 1.43 2004/05/26 04:41:15 neilc Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -119,7 +119,7 @@ ExecInitNode(Plan *node, EState *estate)
 {
        PlanState  *result;
        List       *subps;
-       List       *subp;
+       ListCell   *l;
 
        /*
         * do nothing when we get to the end of a leaf on tree.
@@ -224,9 +224,9 @@ ExecInitNode(Plan *node, EState *estate)
         * them in a separate list for us.
         */
        subps = NIL;
-       foreach(subp, node->initPlan)
+       foreach(l, node->initPlan)
        {
-               SubPlan    *subplan = (SubPlan *) lfirst(subp);
+               SubPlan    *subplan = (SubPlan *) lfirst(l);
                SubPlanState *sstate;
 
                Assert(IsA(subplan, SubPlan));
@@ -242,9 +242,9 @@ ExecInitNode(Plan *node, EState *estate)
         * do this after initializing initPlans, in case their arguments
         * contain subPlans (is that actually possible? perhaps not).
         */
-       foreach(subp, result->subPlan)
+       foreach(l, result->subPlan)
        {
-               SubPlanState *sstate = (SubPlanState *) lfirst(subp);
+               SubPlanState *sstate = (SubPlanState *) lfirst(l);
 
                Assert(IsA(sstate, SubPlanState));
                ExecInitSubPlan(sstate, estate);
@@ -483,7 +483,7 @@ ExecCountSlotsNode(Plan *node)
 void
 ExecEndNode(PlanState *node)
 {
-       List       *subp;
+       ListCell   *subp;
 
        /*
         * do nothing when we get to the end of a leaf on tree.
index d44f580be024486d921c42476f75d873d1fc3945..9308848964717a893a315257043d335e0817052a 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/executor/execQual.c,v 1.159 2004/05/10 22:44:43 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/executor/execQual.c,v 1.160 2004/05/26 04:41:15 neilc Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -217,7 +217,7 @@ ExecEvalArrayRef(ArrayRefExprState *astate,
        ArrayType  *array_source;
        ArrayType  *resultArray;
        bool            isAssignment = (arrayRef->refassgnexpr != NULL);
-       List       *elt;
+       ListCell   *l;
        int                     i = 0,
                                j = 0;
        IntArray        upper,
@@ -258,9 +258,9 @@ ExecEvalArrayRef(ArrayRefExprState *astate,
                array_source = NULL;
        }
 
-       foreach(elt, astate->refupperindexpr)
+       foreach(l, astate->refupperindexpr)
        {
-               ExprState  *eltstate = (ExprState *) lfirst(elt);
+               ExprState  *eltstate = (ExprState *) lfirst(l);
 
                if (i >= MAXDIM)
                        ereport(ERROR,
@@ -284,9 +284,9 @@ ExecEvalArrayRef(ArrayRefExprState *astate,
 
        if (astate->reflowerindexpr != NIL)
        {
-               foreach(elt, astate->reflowerindexpr)
+               foreach(l, astate->reflowerindexpr)
                {
-                       ExprState  *eltstate = (ExprState *) lfirst(elt);
+                       ExprState  *eltstate = (ExprState *) lfirst(l);
 
                        if (j >= MAXDIM)
                                ereport(ERROR,
@@ -798,7 +798,7 @@ ExecEvalFuncArgs(FunctionCallInfo fcinfo,
 {
        ExprDoneCond argIsDone;
        int                     i;
-       List       *arg;
+       ListCell   *arg;
 
        argIsDone = ExprSingleResult;           /* default assumption */
 
@@ -1070,7 +1070,7 @@ ExecMakeFunctionResultNoSets(FuncExprState *fcache,
                                                         bool *isNull,
                                                         ExprDoneCond *isDone)
 {
-       List       *arg;
+       ListCell   *arg;
        Datum           result;
        FunctionCallInfoData fcinfo;
        int                     i;
@@ -1703,7 +1703,7 @@ static Datum
 ExecEvalNot(BoolExprState *notclause, ExprContext *econtext,
                        bool *isNull, ExprDoneCond *isDone)
 {
-       ExprState  *clause = lfirst(notclause->args);
+       ExprState  *clause = linitial(notclause->args);
        Datum           expr_value;
 
        if (isDone)
@@ -1734,7 +1734,7 @@ ExecEvalOr(BoolExprState *orExpr, ExprContext *econtext,
                   bool *isNull, ExprDoneCond *isDone)
 {
        List       *clauses = orExpr->args;
-       List       *clause;
+       ListCell   *clause;
        bool            AnyNull;
 
        if (isDone)
@@ -1786,7 +1786,7 @@ ExecEvalAnd(BoolExprState *andExpr, ExprContext *econtext,
                        bool *isNull, ExprDoneCond *isDone)
 {
        List       *clauses = andExpr->args;
-       List       *clause;
+       ListCell   *clause;
        bool            AnyNull;
 
        if (isDone)
@@ -1802,6 +1802,7 @@ ExecEvalAnd(BoolExprState *andExpr, ExprContext *econtext,
         * when you interpret NULL as "don't know", using the same sort of
         * reasoning as for OR, above.
         */
+
        foreach(clause, clauses)
        {
                ExprState  *clausestate = (ExprState *) lfirst(clause);
@@ -1838,7 +1839,7 @@ ExecEvalCase(CaseExprState *caseExpr, ExprContext *econtext,
                         bool *isNull, ExprDoneCond *isDone)
 {
        List       *clauses = caseExpr->args;
-       List       *clause;
+       ListCell   *clause;
        Datum           save_datum;
        bool            save_isNull;
 
@@ -1938,7 +1939,7 @@ ExecEvalArray(ArrayExprState *astate, ExprContext *econtext,
 {
        ArrayExpr  *arrayExpr = (ArrayExpr *) astate->xprstate.expr;
        ArrayType  *result;
-       List       *element;
+       ListCell   *element;
        Oid                     element_type = arrayExpr->element_typeid;
        int                     ndims = 0;
        int                     dims[MAXDIM];
@@ -2118,7 +2119,7 @@ ExecEvalRow(RowExprState *rstate,
        Datum      *values;
        char       *nulls;
        int                     nargs;
-       List       *arg;
+       ListCell   *arg;
        int                     i;
 
        /* Set default values for result flags: non-null, not a set result */
@@ -2161,7 +2162,7 @@ static Datum
 ExecEvalCoalesce(CoalesceExprState *coalesceExpr, ExprContext *econtext,
                                 bool *isNull, ExprDoneCond *isDone)
 {
-       List       *arg;
+       ListCell   *arg;
 
        if (isDone)
                *isDone = ExprSingleResult;
@@ -2390,7 +2391,7 @@ ExecEvalCoerceToDomain(CoerceToDomainState *cstate, ExprContext *econtext,
 {
        CoerceToDomain *ctest = (CoerceToDomain *) cstate->xprstate.expr;
        Datum           result;
-       List       *l;
+       ListCell   *l;
 
        result = ExecEvalExpr(cstate->arg, econtext, isNull, isDone);
 
@@ -2826,14 +2827,14 @@ ExecInitExpr(Expr *node, PlanState *parent)
                                CaseExpr   *caseexpr = (CaseExpr *) node;
                                CaseExprState *cstate = makeNode(CaseExprState);
                                FastList        outlist;
-                               List       *inlist;
+                               ListCell   *l;
 
                                cstate->xprstate.evalfunc = (ExprStateEvalFunc) ExecEvalCase;
                                cstate->arg = ExecInitExpr(caseexpr->arg, parent);
                                FastListInit(&outlist);
-                               foreach(inlist, caseexpr->args)
+                               foreach(l, caseexpr->args)
                                {
-                                       CaseWhen   *when = (CaseWhen *) lfirst(inlist);
+                                       CaseWhen   *when = (CaseWhen *) lfirst(l);
                                        CaseWhenState *wstate = makeNode(CaseWhenState);
 
                                        Assert(IsA(when, CaseWhen));
@@ -2853,13 +2854,13 @@ ExecInitExpr(Expr *node, PlanState *parent)
                                ArrayExpr  *arrayexpr = (ArrayExpr *) node;
                                ArrayExprState *astate = makeNode(ArrayExprState);
                                FastList        outlist;
-                               List       *inlist;
+                               ListCell   *l;
 
                                astate->xprstate.evalfunc = (ExprStateEvalFunc) ExecEvalArray;
                                FastListInit(&outlist);
-                               foreach(inlist, arrayexpr->elements)
+                               foreach(l, arrayexpr->elements)
                                {
-                                       Expr       *e = (Expr *) lfirst(inlist);
+                                       Expr       *e = (Expr *) lfirst(l);
                                        ExprState  *estate;
 
                                        estate = ExecInitExpr(e, parent);
@@ -2879,13 +2880,13 @@ ExecInitExpr(Expr *node, PlanState *parent)
                                RowExpr    *rowexpr = (RowExpr *) node;
                                RowExprState *rstate = makeNode(RowExprState);
                                List       *outlist;
-                               List       *inlist;
+                               ListCell   *l;
 
                                rstate->xprstate.evalfunc = (ExprStateEvalFunc) ExecEvalRow;
                                outlist = NIL;
-                               foreach(inlist, rowexpr->args)
+                               foreach(l, rowexpr->args)
                                {
-                                       Expr       *e = (Expr *) lfirst(inlist);
+                                       Expr       *e = (Expr *) lfirst(l);
                                        ExprState  *estate;
 
                                        estate = ExecInitExpr(e, parent);
@@ -2912,13 +2913,13 @@ ExecInitExpr(Expr *node, PlanState *parent)
                                CoalesceExpr *coalesceexpr = (CoalesceExpr *) node;
                                CoalesceExprState *cstate = makeNode(CoalesceExprState);
                                FastList        outlist;
-                               List       *inlist;
+                               ListCell   *l;
 
                                cstate->xprstate.evalfunc = (ExprStateEvalFunc) ExecEvalCoalesce;
                                FastListInit(&outlist);
-                               foreach(inlist, coalesceexpr->args)
+                               foreach(l, coalesceexpr->args)
                                {
-                                       Expr       *e = (Expr *) lfirst(inlist);
+                                       Expr       *e = (Expr *) lfirst(l);
                                        ExprState  *estate;
 
                                        estate = ExecInitExpr(e, parent);
@@ -2984,13 +2985,13 @@ ExecInitExpr(Expr *node, PlanState *parent)
                case T_List:
                        {
                                FastList        outlist;
-                               List       *inlist;
+                               ListCell   *l;
 
                                FastListInit(&outlist);
-                               foreach(inlist, (List *) node)
+                               foreach(l, (List *) node)
                                {
                                        FastAppend(&outlist,
-                                                          ExecInitExpr((Expr *) lfirst(inlist),
+                                                          ExecInitExpr((Expr *) lfirst(l),
                                                                                        parent));
                                }
                                /* Don't fall through to the "common" code below */
@@ -3101,7 +3102,7 @@ ExecQual(List *qual, ExprContext *econtext, bool resultForNull)
 {
        bool            result;
        MemoryContext oldContext;
-       List       *qlist;
+       ListCell   *l;
 
        /*
         * debugging stuff
@@ -3131,9 +3132,9 @@ ExecQual(List *qual, ExprContext *econtext, bool resultForNull)
         */
        result = true;
 
-       foreach(qlist, qual)
+       foreach(l, qual)
        {
-               ExprState  *clause = (ExprState *) lfirst(qlist);
+               ExprState  *clause = (ExprState *) lfirst(l);
                Datum           expr_value;
                bool            isNull;
 
@@ -3179,7 +3180,7 @@ int
 ExecCleanTargetListLength(List *targetlist)
 {
        int                     len = 0;
-       List       *tl;
+       ListCell   *tl;
 
        foreach(tl, targetlist)
        {
@@ -3219,7 +3220,7 @@ ExecTargetList(List *targetlist,
                           ExprDoneCond *isDone)
 {
        MemoryContext oldContext;
-       List       *tl;
+       ListCell   *tl;
        bool            isNull;
        bool            haveDoneSets;
 
index 2508a9f2b1b26e705a85cc1f5870fbeaee9d5e0e..9564dd16740f7af6582b1b97228e53bcd476e5d6 100644 (file)
@@ -12,7 +12,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/executor/execScan.c,v 1.30 2004/01/22 02:23:21 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/executor/execScan.c,v 1.31 2004/05/26 04:41:15 neilc Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -195,6 +195,7 @@ tlist_matches_tupdesc(PlanState *ps, List *tlist, Index varno, TupleDesc tupdesc
        int                     numattrs = tupdesc->natts;
        int                     attrno;
        bool            hasoid;
+       ListCell   *tlist_item = list_head(tlist);
 
        /* Check the tlist attributes */
        for (attrno = 1; attrno <= numattrs; attrno++)
@@ -202,9 +203,9 @@ tlist_matches_tupdesc(PlanState *ps, List *tlist, Index varno, TupleDesc tupdesc
                Form_pg_attribute att_tup = tupdesc->attrs[attrno - 1];
                Var                *var;
 
-               if (tlist == NIL)
+               if (tlist_item == NULL)
                        return false;           /* tlist too short */
-               var = (Var *) ((TargetEntry *) lfirst(tlist))->expr;
+               var = (Var *) ((TargetEntry *) lfirst(tlist_item))->expr;
                if (!var || !IsA(var, Var))
                        return false;           /* tlist item not a Var */
                Assert(var->varno == varno);
@@ -216,10 +217,10 @@ tlist_matches_tupdesc(PlanState *ps, List *tlist, Index varno, TupleDesc tupdesc
                Assert(var->vartype == att_tup->atttypid);
                Assert(var->vartypmod == att_tup->atttypmod);
 
-               tlist = lnext(tlist);
+               tlist_item = lnext(tlist_item);
        }
 
-       if (tlist)
+       if (tlist_item)
                return false;                   /* tlist too long */
 
        /*
index 725b8fea0ffcc9cacc3bae759ff6c260bf69b389..a28735c0f1eb73777a99e31e522f5fdf8acc20ad 100644 (file)
@@ -15,7 +15,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/executor/execTuples.c,v 1.77 2004/05/10 22:44:44 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/executor/execTuples.c,v 1.78 2004/05/26 04:41:15 neilc Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -569,7 +569,7 @@ static TupleDesc
 ExecTypeFromTLInternal(List *targetList, bool hasoid, bool skipjunk)
 {
        TupleDesc        typeInfo;
-       List            *l;
+       ListCell        *l;
        int                      len;
        int                      cur_resno = 1;
 
@@ -606,7 +606,7 @@ TupleDesc
 ExecTypeFromExprList(List *exprList)
 {
        TupleDesc        typeInfo;
-       List            *l;
+       ListCell        *l;
        int                      cur_resno = 1;
        char            fldname[NAMEDATALEN];
 
index 9702b1cf0aa7dc2cca0d4bdc984a974207ef74fc..811ec513e03eef80d72c4444d0e1709918d61377 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/executor/execUtils.c,v 1.110 2004/03/17 20:48:42 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/executor/execUtils.c,v 1.111 2004/05/26 04:41:15 neilc Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -248,7 +248,10 @@ FreeExecutorState(EState *estate)
         */
        while (estate->es_exprcontexts)
        {
-               FreeExprContext((ExprContext *) lfirst(estate->es_exprcontexts));
+               /* XXX: seems there ought to be a faster way to implement this
+                * than repeated lremove(), no?
+                */
+               FreeExprContext((ExprContext *) linitial(estate->es_exprcontexts));
                /* FreeExprContext removed the list link for us */
        }
 
@@ -636,8 +639,8 @@ void
 ExecOpenIndices(ResultRelInfo *resultRelInfo)
 {
        Relation        resultRelation = resultRelInfo->ri_RelationDesc;
-       List       *indexoidlist,
-                          *indexoidscan;
+       List       *indexoidlist;
+       ListCell   *l;
        int                     len,
                                i;
        RelationPtr relationDescs;
@@ -671,9 +674,9 @@ ExecOpenIndices(ResultRelInfo *resultRelInfo)
         * For each index, open the index relation and save pg_index info.
         */
        i = 0;
-       foreach(indexoidscan, indexoidlist)
+       foreach(l, indexoidlist)
        {
-               Oid                     indexOid = lfirsto(indexoidscan);
+               Oid                     indexOid = lfirsto(l);
                Relation        indexDesc;
                IndexInfo  *ii;
 
index c07eac5faf6d8bd4c09051f135060e68235c33ce..2e75813a2ab97873c8788f963db097dcce6a4e86 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/executor/functions.c,v 1.80 2004/04/02 23:14:08 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/executor/functions.c,v 1.81 2004/05/26 04:41:15 neilc Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -92,7 +92,7 @@ init_execution_state(List *queryTree_list)
 {
        execution_state *firstes = NULL;
        execution_state *preves = NULL;
-       List       *qtl_item;
+       ListCell            *qtl_item;
 
        foreach(qtl_item, queryTree_list)
        {
index 0a872221276b4da83ef5e1b874e633da9c1beb54..9884cfecd38637e1503e3e956b317c58e1c5560f 100644 (file)
@@ -45,7 +45,7 @@
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/executor/nodeAgg.c,v 1.119 2004/03/13 00:54:10 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/executor/nodeAgg.c,v 1.120 2004/05/26 04:41:15 neilc Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -1033,7 +1033,7 @@ ExecInitAgg(Agg *node, EState *estate)
        ExprContext *econtext;
        int                     numaggs,
                                aggno;
-       List       *alist;
+       ListCell   *l;
 
        /*
         * create state structure
@@ -1187,9 +1187,9 @@ ExecInitAgg(Agg *node, EState *estate)
         * result entry by giving them duplicate aggno values.
         */
        aggno = -1;
-       foreach(alist, aggstate->aggs)
+       foreach(l, aggstate->aggs)
        {
-               AggrefExprState *aggrefstate = (AggrefExprState *) lfirst(alist);
+               AggrefExprState *aggrefstate = (AggrefExprState *) lfirst(l);
                Aggref     *aggref = (Aggref *) aggrefstate->xprstate.expr;
                AggStatePerAgg peraggstate;
                Oid                     inputType;
index c0d74c47784d072469881445c40e006f99ea17b9..f23554e0bc8c82512d5cd880e08d9a6efbc3559f 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/executor/nodeAppend.c,v 1.56 2004/01/22 02:23:21 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/executor/nodeAppend.c,v 1.57 2004/05/26 04:41:15 neilc Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -237,7 +237,7 @@ ExecInitAppend(Append *node, EState *estate)
 int
 ExecCountSlotsAppend(Append *node)
 {
-       List       *plan;
+       ListCell   *plan;
        int                     nSlots = 0;
 
        foreach(plan, node->appendplans)
index 7847b24ffe20f2e316e847cf2fefe1a36c4ad6f7..55aa120ec9b46f7a4acbc02ee3e54fc71105b6f0 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/executor/nodeFunctionscan.c,v 1.24 2004/04/01 21:28:44 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/executor/nodeFunctionscan.c,v 1.25 2004/05/26 04:41:15 neilc Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -201,7 +201,7 @@ ExecInitFunctionScan(FunctionScan *node, EState *estate)
        else if (functyptype == 'b' || functyptype == 'd')
        {
                /* Must be a base data type, i.e. scalar */
-               char       *attname = strVal(lfirst(rte->eref->colnames));
+               char       *attname = strVal(linitial(rte->eref->colnames));
 
                tupdesc = CreateTemplateTupleDesc(1, false);
                TupleDescInitEntry(tupdesc,
index a6a386f97f628f1ccd1225bd84892faf2e1066f6..bf9ed89e9491a0a9199bd3ed73b11ce6295f0f76 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/executor/nodeHash.c,v 1.83 2004/03/17 01:02:23 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/executor/nodeHash.c,v 1.84 2004/05/26 04:41:15 neilc Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -202,7 +202,7 @@ ExecHashTableCreate(Hash *node, List *hashOperators)
        int                     nbatch;
        int                     nkeys;
        int                     i;
-       List       *ho;
+       ListCell   *ho;
        MemoryContext oldcxt;
 
        /*
@@ -518,7 +518,7 @@ ExecHashGetBucket(HashJoinTable hashtable,
 {
        uint32          hashkey = 0;
        int                     bucketno;
-       List       *hk;
+       ListCell   *hk;
        int                     i = 0;
        MemoryContext oldContext;
 
index f0c1ee69e69bf8063142b9f98f683cfa9dd18e7c..da2f6cdac8c9680032f2f560e75a6fae68d7b612 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/executor/nodeHashjoin.c,v 1.60 2004/01/07 18:56:26 neilc Exp $
+ *       $PostgreSQL: pgsql/src/backend/executor/nodeHashjoin.c,v 1.61 2004/05/26 04:41:15 neilc Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -311,7 +311,7 @@ ExecInitHashJoin(HashJoin *node, EState *estate)
        List       *lclauses;
        List       *rclauses;
        List       *hoperators;
-       List       *hcl;
+       ListCell   *l;
 
        /*
         * create state structure
@@ -419,15 +419,15 @@ ExecInitHashJoin(HashJoin *node, EState *estate)
        lclauses = NIL;
        rclauses = NIL;
        hoperators = NIL;
-       foreach(hcl, hjstate->hashclauses)
+       foreach(l, hjstate->hashclauses)
        {
-               FuncExprState *fstate = (FuncExprState *) lfirst(hcl);
+               FuncExprState *fstate = (FuncExprState *) lfirst(l);
                OpExpr     *hclause;
 
                Assert(IsA(fstate, FuncExprState));
                hclause = (OpExpr *) fstate->xprstate.expr;
                Assert(IsA(hclause, OpExpr));
-               lclauses = lappend(lclauses, lfirst(fstate->args));
+               lclauses = lappend(lclauses, linitial(fstate->args));
                rclauses = lappend(rclauses, lsecond(fstate->args));
                hoperators = lappendo(hoperators, hclause->opno);
        }
index a68dbf1dca975ea10efa3ffbe49cb9b1746f994a..c306e4563b94419a4f1058b589aebe6fd35d89a2 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/executor/nodeIndexscan.c,v 1.93 2004/04/21 18:24:26 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/executor/nodeIndexscan.c,v 1.94 2004/05/26 04:41:16 neilc Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -146,7 +146,7 @@ IndexNext(IndexScanState *node)
        if (estate->es_evTuple != NULL &&
                estate->es_evTuple[scanrelid - 1] != NULL)
        {
-               List       *qual;
+               ListCell   *qual;
 
                if (estate->es_evTupleNull[scanrelid - 1])
                        return slot;            /* return empty slot */
@@ -164,7 +164,7 @@ IndexNext(IndexScanState *node)
                        if (ExecQual((List *) lfirst(qual), econtext, false))
                                break;
                }
-               if (qual == NIL)                /* would not be returned by indices */
+               if (qual == NULL)               /* would not be returned by indices */
                        slot->val = NULL;
 
                /* Flag for the next call that no more tuples */
@@ -283,11 +283,11 @@ IndexNext(IndexScanState *node)
                                {
                                        bool            prev_matches = false;
                                        int                     prev_index;
-                                       List       *qual;
+                                       ListCell   *qual;
 
                                        econtext->ecxt_scantuple = slot;
                                        ResetExprContext(econtext);
-                                       qual = node->indxqualorig;
+                                       qual = list_head(node->indxqualorig);
                                        for (prev_index = 0;
                                                 prev_index < node->iss_IndexPtr;
                                                 prev_index++)
@@ -641,11 +641,11 @@ IndexScanState *
 ExecInitIndexScan(IndexScan *node, EState *estate)
 {
        IndexScanState *indexstate;
-       List       *indxqual;
-       List       *indxstrategy;
-       List       *indxsubtype;
-       List       *indxlossy;
-       List       *indxid;
+       ListCell   *indxqual;
+       ListCell   *indxstrategy;
+       ListCell   *indxsubtype;
+       ListCell   *indxlossy;
+       ListCell   *indxid_item;
        int                     i;
        int                     numIndices;
        int                     indexPtr;
@@ -719,8 +719,8 @@ ExecInitIndexScan(IndexScan *node, EState *estate)
        /*
         * get the index node information
         */
-       indxid = node->indxid;
-       numIndices = length(indxid);
+       indxid_item = list_head(node->indxid);
+       numIndices = length(node->indxid);
        indexPtr = -1;
 
        CXT1_printf("ExecInitIndexScan: context is %d\n", CurrentMemoryContext);
@@ -745,28 +745,32 @@ ExecInitIndexScan(IndexScan *node, EState *estate)
        /*
         * build the index scan keys from the index qualification
         */
-       indxqual = node->indxqual;
-       indxstrategy = node->indxstrategy;
-       indxsubtype = node->indxsubtype;
-       indxlossy = node->indxlossy;
+       indxqual = list_head(node->indxqual);
+       indxstrategy = list_head(node->indxstrategy);
+       indxsubtype = list_head(node->indxsubtype);
+       indxlossy = list_head(node->indxlossy);
        for (i = 0; i < numIndices; i++)
        {
                List       *quals;
                List       *strategies;
                List       *subtypes;
                List       *lossyflags;
+               ListCell   *qual_cell;
+               ListCell   *strategy_cell;
+               ListCell   *subtype_cell;
+               ListCell   *lossyflag_cell;
                int                     n_keys;
                ScanKey         scan_keys;
                ExprState **run_keys;
                int                     j;
 
-               quals = lfirst(indxqual);
+               quals = (List *) lfirst(indxqual);
                indxqual = lnext(indxqual);
-               strategies = lfirst(indxstrategy);
+               strategies = (List *) lfirst(indxstrategy);
                indxstrategy = lnext(indxstrategy);
-               subtypes = lfirst(indxsubtype);
+               subtypes = (List *) lfirst(indxsubtype);
                indxsubtype = lnext(indxsubtype);
-               lossyflags = lfirst(indxlossy);
+               lossyflags = (List *) lfirst(indxlossy);
                indxlossy = lnext(indxlossy);
                n_keys = length(quals);
                scan_keys = (n_keys <= 0) ? NULL :
@@ -778,6 +782,10 @@ ExecInitIndexScan(IndexScan *node, EState *estate)
                 * for each opclause in the given qual, convert each qual's
                 * opclause into a single scan key
                 */
+               qual_cell = list_head(quals);
+               strategy_cell = list_head(strategies);
+               subtype_cell = list_head(subtypes);
+               lossyflag_cell = list_head(lossyflags);
                for (j = 0; j < n_keys; j++)
                {
                        OpExpr     *clause;                     /* one clause of index qual */
@@ -794,14 +802,14 @@ ExecInitIndexScan(IndexScan *node, EState *estate)
                        /*
                         * extract clause information from the qualification
                         */
-                       clause = (OpExpr *) lfirst(quals);
-                       quals = lnext(quals);
-                       strategy = lfirsti(strategies);
-                       strategies = lnext(strategies);
-                       subtype = lfirsto(subtypes);
-                       subtypes = lnext(subtypes);
-                       lossy = lfirsti(lossyflags);
-                       lossyflags = lnext(lossyflags);
+                       clause = (OpExpr *) lfirst(qual_cell);
+                       qual_cell = lnext(qual_cell);
+                       strategy = lfirsti(strategy_cell);
+                       strategy_cell = lnext(strategy_cell);
+                       subtype = lfirsto(subtype_cell);
+                       subtype_cell = lnext(subtype_cell);
+                       lossy = lfirsti(lossyflag_cell);
+                       lossyflag_cell = lnext(lossyflag_cell);
 
                        if (!IsA(clause, OpExpr))
                                elog(ERROR, "indxqual is not an OpExpr");
@@ -972,7 +980,7 @@ ExecInitIndexScan(IndexScan *node, EState *estate)
         */
        for (i = 0; i < numIndices; i++)
        {
-               Oid                     indexOid = lfirsto(indxid);
+               Oid                     indexOid = lfirsto(indxid_item);
 
                indexDescs[i] = index_open(indexOid);
                scanDescs[i] = index_beginscan(currentRelation,
@@ -980,7 +988,7 @@ ExecInitIndexScan(IndexScan *node, EState *estate)
                                                                           estate->es_snapshot,
                                                                           numScanKeys[i],
                                                                           scanKeys[i]);
-               indxid = lnext(indxid);
+               indxid_item = lnext(indxid_item);
        }
 
        indexstate->iss_RelationDescs = indexDescs;
index 9c44102611a6d8fd528e5426909065f1e76da833..e9ca17317e30625a3a8ef8d1f225851874e075b2 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/executor/nodeMergejoin.c,v 1.64 2004/03/17 01:02:23 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/executor/nodeMergejoin.c,v 1.65 2004/05/26 04:41:16 neilc Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -104,10 +104,10 @@ static void
 MJFormSkipQuals(List *qualList, List **ltQuals, List **gtQuals,
                                PlanState *parent)
 {
-       List       *ltexprs,
-                          *gtexprs,
-                          *ltcdr,
-                          *gtcdr;
+       List            *ltexprs,
+                               *gtexprs;
+       ListCell        *ltcdr,
+                               *gtcdr;
 
        /*
         * Make modifiable copies of the qualList.
@@ -119,8 +119,7 @@ MJFormSkipQuals(List *qualList, List **ltQuals, List **gtQuals,
         * Scan both lists in parallel, so that we can update the operators
         * with the minimum number of syscache searches.
         */
-       ltcdr = ltexprs;
-       foreach(gtcdr, gtexprs)
+       forboth(ltcdr, ltexprs, gtcdr, gtexprs)
        {
                OpExpr     *ltop = (OpExpr *) lfirst(ltcdr);
                OpExpr     *gtop = (OpExpr *) lfirst(gtcdr);
@@ -140,8 +139,6 @@ MJFormSkipQuals(List *qualList, List **ltQuals, List **gtQuals,
                                                          &gtop->opno,
                                                          &ltop->opfuncid,
                                                          &gtop->opfuncid);
-
-               ltcdr = lnext(ltcdr);
        }
 
        /*
@@ -173,8 +170,8 @@ MergeCompare(List *eqQual, List *compareQual, ExprContext *econtext)
 {
        bool            result;
        MemoryContext oldContext;
-       List       *clause;
-       List       *eqclause;
+       ListCell   *clause;
+       ListCell   *eqclause;
 
        /*
         * Do expression eval in short-lived context.
@@ -188,8 +185,12 @@ MergeCompare(List *eqQual, List *compareQual, ExprContext *econtext)
         */
        result = false;                         /* assume 'false' result */
 
-       eqclause = eqQual;
-       foreach(clause, compareQual)
+       /*
+        * We can't run out of one list before the other
+        */
+       Assert(length(compareQual) == length(eqQual));
+
+       forboth(clause, compareQual, eqclause, eqQual)
        {
                ExprState  *clauseexpr = (ExprState *) lfirst(clause);
                ExprState  *eqclauseexpr = (ExprState *) lfirst(eqclause);
@@ -220,8 +221,6 @@ MergeCompare(List *eqQual, List *compareQual, ExprContext *econtext)
 
                if (!DatumGetBool(const_value) || isNull)
                        break;                          /* return false */
-
-               eqclause = lnext(eqclause);
        }
 
        MemoryContextSwitchTo(oldContext);
index 8c667b70e7851e19478b2ddab55b15598dc93bea..d7db23b2c3e2f321bf8bf0387f18313a546afd30 100644 (file)
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/executor/nodeSubplan.c,v 1.61 2004/03/17 01:02:23 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/executor/nodeSubplan.c,v 1.62 2004/05/26 04:41:16 neilc Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -212,8 +212,8 @@ ExecScanSubPlan(SubPlanState *node,
        TupleTableSlot *slot;
        Datum           result;
        bool            found = false;  /* TRUE if got at least one subplan tuple */
-       List       *pvar;
-       List       *lst;
+       ListCell   *pvar;
+       ListCell   *l;
        ArrayBuildState *astate = NULL;
 
        /*
@@ -228,21 +228,19 @@ ExecScanSubPlan(SubPlanState *node,
         * calculation we have to do is done in the parent econtext, since the
         * Param values don't need to have per-query lifetime.)
         */
-       pvar = node->args;
-       foreach(lst, subplan->parParam)
+       Assert(length(subplan->parParam) == length(node->args));
+
+       forboth(l, subplan->parParam, pvar, node->args)
        {
-               int                     paramid = lfirsti(lst);
+               int                     paramid = lfirst_int(l);
                ParamExecData *prm = &(econtext->ecxt_param_exec_vals[paramid]);
 
-               Assert(pvar != NIL);
                prm->value = ExecEvalExprSwitchContext((ExprState *) lfirst(pvar),
                                                                                           econtext,
                                                                                           &(prm->isnull),
                                                                                           NULL);
-               pvar = lnext(pvar);
                planstate->chgParam = bms_add_member(planstate->chgParam, paramid);
        }
-       Assert(pvar == NIL);
 
        ExecReScan(planstate, NULL);
 
@@ -278,7 +276,7 @@ ExecScanSubPlan(SubPlanState *node,
                Datum           rowresult = BoolGetDatum(!useOr);
                bool            rownull = false;
                int                     col = 1;
-               List       *plst;
+               ListCell   *plst;
 
                if (subLinkType == EXISTS_SUBLINK)
                {
@@ -343,11 +341,12 @@ ExecScanSubPlan(SubPlanState *node,
                 * For ALL, ANY, and MULTIEXPR sublinks, iterate over combining
                 * operators for columns of tuple.
                 */
-               plst = subplan->paramIds;
-               foreach(lst, node->exprs)
+               Assert(length(node->exprs) == length(subplan->paramIds));
+
+               forboth(l, node->exprs, plst, subplan->paramIds)
                {
-                       ExprState  *exprstate = (ExprState *) lfirst(lst);
-                       int                     paramid = lfirsti(plst);
+                       ExprState  *exprstate = (ExprState *) lfirst(l);
+                       int                     paramid = lfirst_int(plst);
                        ParamExecData *prmdata;
                        Datum           expresult;
                        bool            expnull;
@@ -400,7 +399,6 @@ ExecScanSubPlan(SubPlanState *node,
                                }
                        }
 
-                       plst = lnext(plst);
                        col++;
                }
 
@@ -559,7 +557,7 @@ buildSubPlanHash(SubPlanState *node)
                HeapTuple       tup = slot->val;
                TupleDesc       tdesc = slot->ttc_tupleDescriptor;
                int                     col = 1;
-               List       *plst;
+               ListCell   *plst;
                bool            isnew;
 
                /*
@@ -737,7 +735,7 @@ ExecInitSubPlan(SubPlanState *node, EState *estate)
         */
        if (subplan->setParam != NIL)
        {
-               List       *lst;
+               ListCell   *lst;
 
                foreach(lst, subplan->setParam)
                {
@@ -762,8 +760,8 @@ ExecInitSubPlan(SubPlanState *node, EState *estate)
                List       *lefttlist,
                                   *righttlist,
                                   *leftptlist,
-                                  *rightptlist,
-                                  *lexpr;
+                                  *rightptlist;
+               ListCell   *lexpr;
 
                /* We need a memory context to hold the hash table(s) */
                node->tablecxt =
@@ -815,7 +813,7 @@ ExecInitSubPlan(SubPlanState *node, EState *estate)
                        Assert(length(fstate->args) == 2);
 
                        /* Process lefthand argument */
-                       exstate = (ExprState *) lfirst(fstate->args);
+                       exstate = (ExprState *) linitial(fstate->args);
                        expr = exstate->expr;
                        tle = makeTargetEntry(makeResdom(i,
                                                                                         exprType((Node *) expr),
@@ -914,7 +912,7 @@ ExecSetParamPlan(SubPlanState *node, ExprContext *econtext)
        SubLinkType subLinkType = subplan->subLinkType;
        MemoryContext oldcontext;
        TupleTableSlot *slot;
-       List       *lst;
+       ListCell        *l;
        bool            found = false;
        ArrayBuildState *astate = NULL;
 
@@ -941,7 +939,7 @@ ExecSetParamPlan(SubPlanState *node, ExprContext *econtext)
                if (subLinkType == EXISTS_SUBLINK)
                {
                        /* There can be only one param... */
-                       int                     paramid = lfirsti(subplan->setParam);
+                       int                     paramid = linitial_int(subplan->setParam);
                        ParamExecData *prm = &(econtext->ecxt_param_exec_vals[paramid]);
 
                        prm->execPlan = NULL;
@@ -992,9 +990,9 @@ ExecSetParamPlan(SubPlanState *node, ExprContext *econtext)
                /*
                 * Now set all the setParam params from the columns of the tuple
                 */
-               foreach(lst, subplan->setParam)
+               foreach(l, subplan->setParam)
                {
-                       int                     paramid = lfirsti(lst);
+                       int                     paramid = lfirsti(l);
                        ParamExecData *prm = &(econtext->ecxt_param_exec_vals[paramid]);
 
                        prm->execPlan = NULL;
@@ -1008,7 +1006,7 @@ ExecSetParamPlan(SubPlanState *node, ExprContext *econtext)
                if (subLinkType == EXISTS_SUBLINK)
                {
                        /* There can be only one param... */
-                       int                     paramid = lfirsti(subplan->setParam);
+                       int                     paramid = linitial_int(subplan->setParam);
                        ParamExecData *prm = &(econtext->ecxt_param_exec_vals[paramid]);
 
                        prm->execPlan = NULL;
@@ -1017,9 +1015,9 @@ ExecSetParamPlan(SubPlanState *node, ExprContext *econtext)
                }
                else
                {
-                       foreach(lst, subplan->setParam)
+                       foreach(l, subplan->setParam)
                        {
-                               int                     paramid = lfirsti(lst);
+                               int                     paramid = lfirsti(l);
                                ParamExecData *prm = &(econtext->ecxt_param_exec_vals[paramid]);
 
                                prm->execPlan = NULL;
@@ -1031,7 +1029,7 @@ ExecSetParamPlan(SubPlanState *node, ExprContext *econtext)
        else if (subLinkType == ARRAY_SUBLINK)
        {
                /* There can be only one param... */
-               int                     paramid = lfirsti(subplan->setParam);
+               int                     paramid = linitial_int(subplan->setParam);
                ParamExecData *prm = &(econtext->ecxt_param_exec_vals[paramid]);
 
                Assert(astate != NULL);
@@ -1074,7 +1072,7 @@ ExecReScanSetParamPlan(SubPlanState *node, PlanState *parent)
        PlanState  *planstate = node->planstate;
        SubPlan    *subplan = (SubPlan *) node->xprstate.expr;
        EState     *estate = parent->state;
-       List       *lst;
+       ListCell   *l;
 
        /* sanity checks */
        if (subplan->parParam != NIL)
@@ -1091,9 +1089,9 @@ ExecReScanSetParamPlan(SubPlanState *node, PlanState *parent)
        /*
         * Mark this subplan's output parameters as needing recalculation
         */
-       foreach(lst, subplan->setParam)
+       foreach(l, subplan->setParam)
        {
-               int                     paramid = lfirsti(lst);
+               int                     paramid = lfirsti(l);
                ParamExecData *prm = &(estate->es_param_exec_vals[paramid]);
 
                prm->execPlan = node;
index ee928deff5de0e3caa7bd6582faf09d7ac5fc191..0d321b0866605ab59c98d7922cbcc8427ebb59a5 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/executor/nodeTidscan.c,v 1.37 2004/04/21 18:24:26 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/executor/nodeTidscan.c,v 1.38 2004/05/26 04:41:16 neilc Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -45,18 +45,18 @@ TidListCreate(TidScanState *tidstate)
        ExprContext *econtext = tidstate->ss.ps.ps_ExprContext;
        ItemPointerData *tidList;
        int                     numTids = 0;
-       List       *lst;
+       ListCell   *l;
 
        tidList = (ItemPointerData *)
                palloc(length(tidstate->tss_tideval) * sizeof(ItemPointerData));
 
-       foreach(lst, evalList)
+       foreach(l, evalList)
        {
                ItemPointer itemptr;
                bool            isNull;
 
                itemptr = (ItemPointer)
-                       DatumGetPointer(ExecEvalExprSwitchContext(lfirst(lst),
+                       DatumGetPointer(ExecEvalExprSwitchContext(lfirst(l),
                                                                                                          econtext,
                                                                                                          &isNull,
                                                                                                          NULL));
index bcf7f8d52b68cffd345aee4f0f3c580840a1c4f8..4d8fade3d6456e1bd52631c21574dba7b9538f02 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/executor/spi.c,v 1.113 2004/04/01 21:28:44 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/executor/spi.c,v 1.114 2004/05/26 04:41:16 neilc Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -744,8 +744,8 @@ SPI_cursor_open(const char *name, void *plan, Datum *Values, const char *Nulls)
                ereport(ERROR,
                                (errcode(ERRCODE_INVALID_CURSOR_DEFINITION),
                                 errmsg("cannot open multi-query plan as cursor")));
-       queryTree = (Query *) lfirst((List *) lfirst(qtlist));
-       planTree = (Plan *) lfirst(ptlist);
+       queryTree = (Query *) linitial((List *) linitial(qtlist));
+       planTree = (Plan *) linitial(ptlist);
 
        if (queryTree->commandType != CMD_SELECT)
                ereport(ERROR,
@@ -953,7 +953,7 @@ SPI_is_cursor_plan(void *plan)
        qtlist = spiplan->qtlist;
        if (length(spiplan->ptlist) == 1 && length(qtlist) == 1)
        {
-               Query *queryTree = (Query *) lfirst((List *) lfirst(qtlist));
+               Query *queryTree = (Query *) linitial((List *) linitial(qtlist));
 
                if (queryTree->commandType == CMD_SELECT && queryTree->into == NULL)
                        return true;
@@ -1062,7 +1062,7 @@ _SPI_execute(const char *src, int tcount, _SPI_plan *plan)
        List       *raw_parsetree_list;
        List       *query_list_list;
        List       *plan_list;
-       List       *list_item;
+       ListCell   *list_item;
        ErrorContextCallback spierrcontext;
        int                     nargs = 0;
        Oid                *argtypes = NULL;
@@ -1110,7 +1110,7 @@ _SPI_execute(const char *src, int tcount, _SPI_plan *plan)
        {
                Node       *parsetree = (Node *) lfirst(list_item);
                List       *query_list;
-               List       *query_list_item;
+               ListCell   *query_list_item;
 
                query_list = pg_analyze_and_rewrite(parsetree, argtypes, nargs);
 
@@ -1207,8 +1207,8 @@ _SPI_execute_plan(_SPI_plan *plan, Datum *Values, const char *Nulls,
                                  bool useCurrentSnapshot, int tcount)
 {
        List       *query_list_list = plan->qtlist;
-       List       *plan_list = plan->ptlist;
-       List       *query_list_list_item;
+       ListCell   *plan_list_item = list_head(plan->ptlist);
+       ListCell   *query_list_list_item;
        ErrorContextCallback spierrcontext;
        int                     nargs = plan->nargs;
        int                     res = 0;
@@ -1254,7 +1254,7 @@ _SPI_execute_plan(_SPI_plan *plan, Datum *Values, const char *Nulls,
        foreach(query_list_list_item, query_list_list)
        {
                List       *query_list = lfirst(query_list_list_item);
-               List       *query_list_item;
+               ListCell   *query_list_item;
 
                /* Reset state for each original parsetree */
                /* (at most one of its querytrees will be marked canSetTag) */
@@ -1270,8 +1270,8 @@ _SPI_execute_plan(_SPI_plan *plan, Datum *Values, const char *Nulls,
                        QueryDesc  *qdesc;
                        DestReceiver *dest;
 
-                       planTree = lfirst(plan_list);
-                       plan_list = lnext(plan_list);
+                       planTree = lfirst(plan_list_item);
+                       plan_list_item = lnext(plan_list_item);
 
                        dest = CreateDestReceiver(queryTree->canSetTag ? SPI : None, NULL);
                        if (queryTree->commandType == CMD_UTILITY)
index 8b8fa6abf96a5fde2c7ebd1a1ff9a04503a06a0c..dda111fc6885dcc038b5bf304bed5b9d46364ed5 100644 (file)
@@ -9,7 +9,7 @@
  * Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/backend/libpq/crypt.c,v 1.58 2003/11/29 19:51:49 pgsql Exp $
+ * $PostgreSQL: pgsql/src/backend/libpq/crypt.c,v 1.59 2004/05/26 04:41:18 neilc Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -36,14 +36,14 @@ md5_crypt_verify(const Port *port, const char *user, char *client_pass)
                           *crypt_pwd;
        int                     retval = STATUS_ERROR;
        List      **line;
-       List       *token;
+       ListCell   *token;
        char       *crypt_client_pass = client_pass;
 
        if ((line = get_user_line(user)) == NULL)
                return STATUS_ERROR;
 
-       /* Skip over line number and username */
-       token = lnext(lnext(*line));
+       /* Skip over username */
+       token = lnext(list_head(*line));
        if (token)
        {
                shadow_pass = lfirst(token);
index d4204acfd576acaec5d7913b921381d5147622e9..25666af6902df92d948f6552778dc13a5ceff98d 100644 (file)
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/libpq/hba.c,v 1.122 2004/05/25 19:11:14 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/libpq/hba.c,v 1.123 2004/05/26 04:41:18 neilc Exp $
  *
  *-------------------------------------------------------------------------
  */
 #include "postgres.h"
 
+#define DISABLE_LIST_COMPAT
+
 #include <errno.h>
 #include <pwd.h>
 #include <fcntl.h>
  * one string per token on the line.  Note there will always be at least
  * one token, since blank lines are not entered in the data structure.
  */
-static List *hba_lines = NIL;  /* pre-parsed contents of hba file */
-static List *ident_lines = NIL; /* pre-parsed contents of ident file */
-static List *group_lines = NIL; /* pre-parsed contents of group file */
-static List *user_lines = NIL; /* pre-parsed contents of user password
-                                                                * file */
+
+/* pre-parsed content of CONF_FILE and corresponding line #s */
+static List *hba_lines                 = NIL;
+static List *hba_line_nums             = NIL;
+/* pre-parsed content of USERMAP_FILE and corresponding line #s */
+static List *ident_lines               = NIL;
+static List *ident_line_nums   = NIL;
+/* pre-parsed content of group file and corresponding line #s */
+static List *group_lines               = NIL;
+static List *group_line_nums   = NIL;
+/* pre-parsed content of user passwd file and corresponding line #s */
+static List *user_lines                        = NIL;
+static List *user_line_nums            = NIL;
 
 /* sorted entries so we can do binary search lookups */
 static List **user_sorted = NULL;              /* sorted user list, for bsearch() */
@@ -76,7 +86,7 @@ static List **group_sorted = NULL;            /* sorted group list, for
 static int     user_length;
 static int     group_length;
 
-static List *tokenize_file(FILE *file);
+static void tokenize_file(FILE *file, List **lines, List **line_nums);
 static char *tokenize_inc_file(const char *inc_filename);
 
 /*
@@ -250,28 +260,45 @@ next_token_expand(FILE *file)
  * Free memory used by lines/tokens (i.e., structure built by tokenize_file)
  */
 static void
-free_lines(List **lines)
+free_lines(List **lines, List **line_nums)
 {
+       /*
+        * Either both must be non-NULL, or both must be NULL
+        */
+       Assert((*lines != NIL && *line_nums != NIL) ||
+                  (*lines == NIL && *line_nums == NIL));
+
        if (*lines)
        {
-               List       *line,
-                                  *token;
+               /*
+                * "lines" is a list of lists; each of those sublists consists
+                * of palloc'ed tokens, so we want to free each pointed-to
+                * token in a sublist, followed by the sublist itself, and
+                * finally the whole list.
+                */
+               ListCell   *line;
 
                foreach(line, *lines)
                {
                        List       *ln = lfirst(line);
+                       ListCell   *token;
 
-                       /* free the pstrdup'd tokens (don't try it on the line number) */
-                       foreach(token, lnext(ln))
+                       foreach(token, ln)
                                pfree(lfirst(token));
                        /* free the sublist structure itself */
-                       freeList(ln);
+                       list_free(ln);
                }
                /* free the list structure itself */
-               freeList(*lines);
+               list_free(*lines);
                /* clear the static variable */
                *lines = NIL;
        }
+
+       if (*line_nums)
+       {
+               list_free(*line_nums);
+               *line_nums = NIL;
+       }
 }
 
 
@@ -281,7 +308,8 @@ tokenize_inc_file(const char *inc_filename)
        char       *inc_fullname;
        FILE       *inc_file;
        List       *inc_lines;
-       List       *line;
+       List       *inc_line_nums;
+       ListCell   *line;
        char       *comma_str = pstrdup("");
 
        inc_fullname = (char *) palloc(strlen(DataDir) + 1 +
@@ -305,17 +333,16 @@ tokenize_inc_file(const char *inc_filename)
        pfree(inc_fullname);
 
        /* There is possible recursion here if the file contains @ */
-       inc_lines = tokenize_file(inc_file);
+       tokenize_file(inc_file, &inc_lines, &inc_line_nums);
        FreeFile(inc_file);
 
        /* Create comma-separate string from List */
        foreach(line, inc_lines)
        {
-               List       *ln = lfirst(line);
-               List       *token;
+               List               *token_list = (List *) lfirst(line);
+               ListCell           *token;
 
-               /* First entry is line number */
-               foreach(token, lnext(ln))
+               foreach(token, token_list)
                {
                        if (strlen(comma_str))
                        {
@@ -328,24 +355,26 @@ tokenize_inc_file(const char *inc_filename)
                }
        }
 
-       free_lines(&inc_lines);
+       free_lines(&inc_lines, &inc_line_nums);
 
        return comma_str;
 }
 
 
-
 /*
- *     Read the given file and create a list of line sublists.
+ * Tokenize the given file, storing the resulting data into two lists:
+ * a list of sublists, each sublist containing the tokens in a line of
+ * the file, and a list of line numbers.
  */
-static List *
-tokenize_file(FILE *file)
+static void
+tokenize_file(FILE *file, List **lines, List **line_nums)
 {
-       List       *lines = NIL;
-       List       *next_line = NIL;
+       List       *current_line = NIL;
        int                     line_number = 1;
        char       *buf;
 
+       *lines = *line_nums = NIL;
+
        while (!feof(file))
        {
                buf = next_token_expand(file);
@@ -353,27 +382,27 @@ tokenize_file(FILE *file)
                /* add token to list, unless we are at EOL or comment start */
                if (buf[0] != '\0')
                {
-                       if (next_line == NIL)
+                       if (current_line == NIL)
+                       {
+                               /* make a new line List, record its line number */
+                               current_line = lappend(current_line, buf);
+                               *lines = lappend(*lines, current_line);
+                               *line_nums = lappend_int(*line_nums, line_number);
+                       }
+                       else
                        {
-                               /* make a new line List */
-                               next_line = makeListi1(line_number);
-                               lines = lappend(lines, next_line);
+                               /* append token to current line's list */
+                               current_line = lappend(current_line, buf);
                        }
-                       /* append token to current line's list */
-                       next_line = lappend(next_line, buf);
                }
                else
                {
                        /* we are at real or logical EOL, so force a new line List */
-                       next_line = NIL;
-               }
-
-               /* Advance line number whenever we reach EOL */
-               if (next_line == NIL)
+                       current_line = NIL;
+                       /* Advance line number whenever we reach EOL */
                        line_number++;
+               }
        }
-
-       return lines;
 }
 
 
@@ -385,9 +414,8 @@ tokenize_file(FILE *file)
 static int
 user_group_qsort_cmp(const void *list1, const void *list2)
 {
-       /* first node is line number */
-       char       *user1 = lfirst(lnext(*(List **) list1));
-       char       *user2 = lfirst(lnext(*(List **) list2));
+       char       *user1 = linitial(*(List **) list1);
+       char       *user2 = linitial(*(List **) list2);
 
        return strcmp(user1, user2);
 }
@@ -401,8 +429,7 @@ user_group_qsort_cmp(const void *list1, const void *list2)
 static int
 user_group_bsearch_cmp(const void *user, const void *list)
 {
-       /* first node is line number */
-       char       *user2 = lfirst(lnext(*(List **) list));
+       char       *user2 = linitial(*(List **) list);
 
        return strcmp(user, user2);
 }
@@ -450,14 +477,18 @@ get_user_line(const char *user)
 static bool
 check_group(char *group, char *user)
 {
-       List      **line,
-                          *l;
+       List      **line;
 
        if ((line = get_group_line(group)) != NULL)
        {
-               foreach(l, lnext(lnext(*line)))
-                       if (strcmp(lfirst(l), user) == 0)
-                       return true;
+               ListCell *line_item;
+
+               /* skip over the group name */
+               for_each_cell(line_item, lnext(list_head(*line)))
+               {
+                       if (strcmp(lfirst(line_item), user) == 0)
+                               return true;
+               }
        }
 
        return false;
@@ -518,24 +549,24 @@ check_db(char *dbname, char *user, char *param_str)
 /*
  *     Scan the rest of a host record (after the mask field)
  *     and return the interpretation of it as *userauth_p, *auth_arg_p, and
- *     *error_p.  *line points to the next token of the line, and is
+ *     *error_p.  *line_item points to the next token of the line, and is
  *     advanced over successfully-read tokens.
  */
 static void
-parse_hba_auth(List **line, UserAuth *userauth_p, char **auth_arg_p,
-                          bool *error_p)
+parse_hba_auth(ListCell **line_item, UserAuth *userauth_p,
+                          char **auth_arg_p, bool *error_p)
 {
        char       *token;
 
        *auth_arg_p = NULL;
 
-       /* Get authentication type token. */
-       if (!*line)
+       if (!*line_item)
        {
                *error_p = true;
                return;
        }
-       token = lfirst(*line);
+
+       token = lfirst(*line_item);
        if (strcmp(token, "trust") == 0)
                *userauth_p = uaTrust;
        else if (strcmp(token, "ident") == 0)
@@ -561,16 +592,16 @@ parse_hba_auth(List **line, UserAuth *userauth_p, char **auth_arg_p,
                *error_p = true;
                return;
        }
-       *line = lnext(*line);
+       *line_item = lnext(*line_item);
 
        /* Get the authentication argument token, if any */
-       if (*line)
+       if (*line_item)
        {
-               token = lfirst(*line);
+               token = lfirst(*line_item);
                *auth_arg_p = pstrdup(token);
-               *line = lnext(*line);
+               *line_item = lnext(*line_item);
                /* If there is more on the line, it is an error */
-               if (*line)
+               if (*line_item)
                        *error_p = true;
        }
 }
@@ -587,9 +618,9 @@ parse_hba_auth(List **line, UserAuth *userauth_p, char **auth_arg_p,
  *     leave *error_p as it was.
  */
 static void
-parse_hba(List *line, hbaPort *port, bool *found_p, bool *error_p)
+parse_hba(List *line, int line_num, hbaPort *port,
+                 bool *found_p, bool *error_p)
 {
-       int                     line_number;
        char       *token;
        char       *db;
        char       *user;
@@ -599,33 +630,32 @@ parse_hba(List *line, hbaPort *port, bool *found_p, bool *error_p)
        struct sockaddr_storage addr;
        struct sockaddr_storage mask;
        char       *cidr_slash;
+       ListCell   *line_item;
 
-       Assert(line != NIL);
-       line_number = lfirsti(line);
-       line = lnext(line);
-       Assert(line != NIL);
+       line_item = list_head(line);
        /* Check the record type. */
-       token = lfirst(line);
+       token = lfirst(line_item);
        if (strcmp(token, "local") == 0)
        {
                /* Get the database. */
-               line = lnext(line);
-               if (!line)
+               line_item = lnext(line_item);
+               if (!line_item)
                        goto hba_syntax;
-               db = lfirst(line);
+               db = lfirst(line_item);
 
                /* Get the user. */
-               line = lnext(line);
-               if (!line)
+               line_item = lnext(line_item);
+               if (!line_item)
                        goto hba_syntax;
-               user = lfirst(line);
+               user = lfirst(line_item);
 
-               line = lnext(line);
-               if (!line)
+               line_item = lnext(line_item);
+               if (!line_item)
                        goto hba_syntax;
 
                /* Read the rest of the line. */
-               parse_hba_auth(&line, &port->auth_method, &port->auth_arg, error_p);
+               parse_hba_auth(&line_item, &port->auth_method,
+                                          &port->auth_arg, error_p);
                if (*error_p)
                        goto hba_syntax;
 
@@ -669,22 +699,22 @@ parse_hba(List *line, hbaPort *port, bool *found_p, bool *error_p)
 #endif
 
                /* Get the database. */
-               line = lnext(line);
-               if (!line)
+               line_item = lnext(line_item);
+               if (!line_item)
                        goto hba_syntax;
-               db = lfirst(line);
+               db = lfirst(line_item);
 
                /* Get the user. */
-               line = lnext(line);
-               if (!line)
+               line_item = lnext(line_item);
+               if (!line_item)
                        goto hba_syntax;
-               user = lfirst(line);
+               user = lfirst(line_item);
 
                /* Read the IP address field. (with or without CIDR netmask) */
-               line = lnext(line);
-               if (!line)
+               line_item = lnext(line_item);
+               if (!line_item)
                        goto hba_syntax;
-               token = lfirst(line);
+               token = lfirst(line_item);
 
                /* Check if it has a CIDR suffix and if so isolate it */
                cidr_slash = strchr(token, '/');
@@ -707,7 +737,7 @@ parse_hba(List *line, hbaPort *port, bool *found_p, bool *error_p)
                        ereport(LOG,
                                        (errcode(ERRCODE_CONFIG_FILE_ERROR),
                                         errmsg("invalid IP address \"%s\" in pg_hba.conf file line %d: %s",
-                                                       token, line_number, gai_strerror(ret))));
+                                                       token, line_num, gai_strerror(ret))));
                        if (cidr_slash)
                                *cidr_slash = '/';
                        if (gai_result)
@@ -730,10 +760,10 @@ parse_hba(List *line, hbaPort *port, bool *found_p, bool *error_p)
                else
                {
                        /* Read the mask field. */
-                       line = lnext(line);
-                       if (!line)
+                       line_item = lnext(line_item);
+                       if (!line_item)
                                goto hba_syntax;
-                       token = lfirst(line);
+                       token = lfirst(line_item);
 
                        ret = getaddrinfo_all(token, NULL, &hints, &gai_result);
                        if (ret || !gai_result)
@@ -741,7 +771,7 @@ parse_hba(List *line, hbaPort *port, bool *found_p, bool *error_p)
                                ereport(LOG,
                                                (errcode(ERRCODE_CONFIG_FILE_ERROR),
                                                 errmsg("invalid IP mask \"%s\" in pg_hba.conf file line %d: %s",
-                                                               token, line_number, gai_strerror(ret))));
+                                                               token, line_num, gai_strerror(ret))));
                                if (gai_result)
                                        freeaddrinfo_all(hints.ai_family, gai_result);
                                goto hba_other_error;
@@ -755,7 +785,7 @@ parse_hba(List *line, hbaPort *port, bool *found_p, bool *error_p)
                                ereport(LOG,
                                                (errcode(ERRCODE_CONFIG_FILE_ERROR),
                                                 errmsg("IP address and mask do not match in pg_hba.conf file line %d",
-                                                               line_number)));
+                                                               line_num)));
                                goto hba_other_error;
                        }
                }
@@ -787,10 +817,11 @@ parse_hba(List *line, hbaPort *port, bool *found_p, bool *error_p)
                        return;
 
                /* Read the rest of the line. */
-               line = lnext(line);
-               if (!line)
+               line_item = lnext(line_item);
+               if (!line_item)
                        goto hba_syntax;
-               parse_hba_auth(&line, &port->auth_method, &port->auth_arg, error_p);
+               parse_hba_auth(&line_item, &port->auth_method,
+                                          &port->auth_arg, error_p);
                if (*error_p)
                        goto hba_syntax;
        }
@@ -808,16 +839,16 @@ parse_hba(List *line, hbaPort *port, bool *found_p, bool *error_p)
        return;
 
 hba_syntax:
-       if (line)
+       if (line_item)
                ereport(LOG,
                                (errcode(ERRCODE_CONFIG_FILE_ERROR),
                                 errmsg("invalid entry in pg_hba.conf file at line %d, token \"%s\"",
-                                               line_number, (const char *) lfirst(line))));
+                                               line_num, (char *) lfirst(line_item))));
        else
                ereport(LOG,
                                (errcode(ERRCODE_CONFIG_FILE_ERROR),
-                       errmsg("missing field in pg_hba.conf file at end of line %d",
-                                  line_number)));
+                                errmsg("missing field in pg_hba.conf file at end of line %d",
+                                               line_num)));
 
        /* Come here if suitable message already logged */
 hba_other_error:
@@ -834,11 +865,13 @@ check_hba(hbaPort *port)
 {
        bool            found_entry = false;
        bool            error = false;
-       List       *line;
+       ListCell   *line;
+       ListCell   *line_num;
 
-       foreach(line, hba_lines)
+       forboth(line, hba_lines, line_num, hba_line_nums)
        {
-               parse_hba(lfirst(line), port, &found_entry, &error);
+               parse_hba(lfirst(line), lfirst_int(line_num),
+                                 port, &found_entry, &error);
                if (found_entry || error)
                        break;
        }
@@ -911,11 +944,10 @@ void
 load_group(void)
 {
        FILE       *group_file;
-       List       *line;
 
        /* Discard any old data */
-       if (group_lines)
-               free_lines(&group_lines);
+       if (group_lines || group_line_nums)
+               free_lines(&group_lines, &group_line_nums);
        if (group_sorted)
                pfree(group_sorted);
        group_sorted = NULL;
@@ -924,14 +956,15 @@ load_group(void)
        group_file = group_openfile();
        if (!group_file)
                return;
-       group_lines = tokenize_file(group_file);
+       tokenize_file(group_file, &group_lines, &group_line_nums);
        FreeFile(group_file);
 
        /* create sorted lines for binary searching */
-       group_length = length(group_lines);
+       group_length = list_length(group_lines);
        if (group_length)
        {
                int                     i = 0;
+               ListCell   *line;
 
                group_sorted = palloc(group_length * sizeof(List *));
 
@@ -953,11 +986,10 @@ void
 load_user(void)
 {
        FILE       *user_file;
-       List       *line;
 
        /* Discard any old data */
-       if (user_lines)
-               free_lines(&user_lines);
+       if (user_lines || user_line_nums)
+               free_lines(&user_lines, &user_line_nums);
        if (user_sorted)
                pfree(user_sorted);
        user_sorted = NULL;
@@ -966,14 +998,15 @@ load_user(void)
        user_file = user_openfile();
        if (!user_file)
                return;
-       user_lines = tokenize_file(user_file);
+       tokenize_file(user_file, &user_lines, &user_line_nums);
        FreeFile(user_file);
 
        /* create sorted lines for binary searching */
-       user_length = length(user_lines);
+       user_length = list_length(user_lines);
        if (user_length)
        {
                int                     i = 0;
+               ListCell   *line;
 
                user_sorted = palloc(user_length * sizeof(List *));
 
@@ -1002,8 +1035,8 @@ load_hba(void)
        FILE       *file;                       /* The config file we have to read */
        char       *conf_file;          /* The name of the config file */
 
-       if (hba_lines)
-               free_lines(&hba_lines);
+       if (hba_lines || hba_line_nums)
+               free_lines(&hba_lines, &hba_line_nums);
 
        /* Put together the full pathname to the config file. */
        bufsize = (strlen(DataDir) + strlen(CONF_FILE) + 2) * sizeof(char);
@@ -1017,7 +1050,7 @@ load_hba(void)
                                 errmsg("could not open configuration file \"%s\": %m",
                                                conf_file)));
 
-       hba_lines = tokenize_file(file);
+       tokenize_file(file, &hba_lines, &hba_line_nums);
        FreeFile(file);
        pfree(conf_file);
 }
@@ -1030,10 +1063,11 @@ load_hba(void)
  *     *found_p and *error_p are set according to our results.
  */
 static void
-parse_ident_usermap(List *line, const char *usermap_name, const char *pg_user,
-                                       const char *ident_user, bool *found_p, bool *error_p)
+parse_ident_usermap(List *line, int line_number, const char *usermap_name,
+                                       const char *pg_user, const char *ident_user,
+                                       bool *found_p, bool *error_p)
 {
-       int                     line_number;
+       ListCell   *line_item;
        char       *token;
        char       *file_map;
        char       *file_pguser;
@@ -1043,26 +1077,24 @@ parse_ident_usermap(List *line, const char *usermap_name, const char *pg_user,
        *error_p = false;
 
        Assert(line != NIL);
-       line_number = lfirsti(line);
-       line = lnext(line);
-       Assert(line != NIL);
+       line_item = list_head(line);
 
        /* Get the map token (must exist) */
-       token = lfirst(line);
+       token = lfirst(line_item);
        file_map = token;
 
        /* Get the ident user token (must be provided) */
-       line = lnext(line);
+       line_item = lnext(line_item);
        if (!line)
                goto ident_syntax;
-       token = lfirst(line);
+       token = lfirst(line_item);
        file_ident_user = token;
 
        /* Get the PG username token */
-       line = lnext(line);
+       line_item = lnext(line_item);
        if (!line)
                goto ident_syntax;
-       token = lfirst(line);
+       token = lfirst(line_item);
        file_pguser = token;
 
        /* Match? */
@@ -1073,11 +1105,11 @@ parse_ident_usermap(List *line, const char *usermap_name, const char *pg_user,
        return;
 
 ident_syntax:
-       if (line)
+       if (line_item)
                ereport(LOG,
                                (errcode(ERRCODE_CONFIG_FILE_ERROR),
                                 errmsg("invalid entry in pg_ident.conf file at line %d, token \"%s\"",
-                                               line_number, (const char *) lfirst(line))));
+                                               line_number, (const char *) lfirst(line_item))));
        else
                ereport(LOG,
                                (errcode(ERRCODE_CONFIG_FILE_ERROR),
@@ -1105,7 +1137,6 @@ check_ident_usermap(const char *usermap_name,
                                        const char *pg_user,
                                        const char *ident_user)
 {
-       List       *line;
        bool            found_entry = false,
                                error = false;
 
@@ -1125,10 +1156,13 @@ check_ident_usermap(const char *usermap_name,
        }
        else
        {
-               foreach(line, ident_lines)
+               ListCell *line_cell, *num_cell;
+
+               forboth(line_cell, ident_lines, num_cell, ident_line_nums)
                {
-                       parse_ident_usermap(lfirst(line), usermap_name, pg_user,
-                                                               ident_user, &found_entry, &error);
+                       parse_ident_usermap(lfirst(line_cell), lfirst_int(num_cell),
+                                                               usermap_name, pg_user, ident_user,
+                                                               &found_entry, &error);
                        if (found_entry || error)
                                break;
                }
@@ -1148,8 +1182,8 @@ load_ident(void)
                                                                 * read */
        int                     bufsize;
 
-       if (ident_lines)
-               free_lines(&ident_lines);
+       if (ident_lines || ident_line_nums)
+               free_lines(&ident_lines, &ident_line_nums);
 
        /* put together the full pathname to the map file */
        bufsize = (strlen(DataDir) + strlen(USERMAP_FILE) + 2) * sizeof(char);
@@ -1166,7 +1200,7 @@ load_ident(void)
        }
        else
        {
-               ident_lines = tokenize_file(file);
+               tokenize_file(file, &ident_lines, &ident_line_nums);
                FreeFile(file);
        }
        pfree(map_file);
index 91fb3b08343ca38dcb61ea8f145598c84f20196e..21cef8879221dd90ebc3f3da22473784f88e3205 100644 (file)
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/nodes/copyfuncs.c,v 1.281 2004/05/10 22:44:44 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/nodes/copyfuncs.c,v 1.282 2004/05/26 04:41:18 neilc Exp $
  *
  *-------------------------------------------------------------------------
  */
 
+#define DISABLE_LIST_COMPAT
+
 #include "postgres.h"
 
 #include "nodes/parsenodes.h"
 #define COPY_NODE_FIELD(fldname) \
        (newnode->fldname = copyObject(from->fldname))
 
-/* Copy a field that is a pointer to a list of integers */
-#define COPY_INTLIST_FIELD(fldname) \
-       (newnode->fldname = listCopy(from->fldname))
-
-/* Copy a field that is a pointer to a list of Oids */
-#define COPY_OIDLIST_FIELD(fldname) \
-       (newnode->fldname = listCopy(from->fldname))
-
 /* Copy a field that is a pointer to a Bitmapset */
 #define COPY_BITMAPSET_FIELD(fldname) \
        (newnode->fldname = bms_copy(from->fldname))
        } while (0)
 
 
-/*
- * listCopy
- *       This copy function only copies the "cons-cells" of the list, not the
- *       pointed-to objects.  (Use copyObject if you want a "deep" copy.)
- *
- *       We also use this function for copying lists of integers and Oids,
- *       which is notationally a bit ugly, but perfectly safe.
- *
- *       Note that copyObject will surely coredump if applied to a list
- *       of integers or Oids!
- */
-List *
-listCopy(List *list)
-{
-       List       *newlist,
-                          *oldl,
-                          *newcell,
-                          *prev;
-
-       /* rather ugly coding for speed... */
-       if (list == NIL)
-               return NIL;
-
-       newcell = makeNode(List);
-       newcell->elem = list->elem;
-
-       newlist = prev = newcell;
-
-       foreach(oldl, lnext(list))
-       {
-               newcell = makeNode(List);
-               newcell->elem = oldl->elem;
-               prev->next = newcell;
-               prev = newcell;
-       }
-       prev->next = NIL;
-
-       return newlist;
-}
-
 /* ****************************************************************
  *                                      plannodes.h copy functions
  * ****************************************************************
@@ -259,42 +213,12 @@ _copyIndexScan(IndexScan *from)
        /*
         * copy remainder of node
         */
-       COPY_OIDLIST_FIELD(indxid);
+       COPY_NODE_FIELD(indxid);
        COPY_NODE_FIELD(indxqual);
        COPY_NODE_FIELD(indxqualorig);
-       /* this can become COPY_NODE_FIELD when intlists are normal objects: */
-       {
-               List    *newstrat = NIL;
-               List    *tmp;
-
-               foreach(tmp, from->indxstrategy)
-               {
-                       newstrat = lappend(newstrat, listCopy(lfirst(tmp)));
-               }
-               newnode->indxstrategy = newstrat;
-       }
-       /* this can become COPY_NODE_FIELD when OID lists are normal objects: */
-       {
-               List    *newsubtype = NIL;
-               List    *tmp;
-
-               foreach(tmp, from->indxsubtype)
-               {
-                       newsubtype = lappend(newsubtype, listCopy(lfirst(tmp)));
-               }
-               newnode->indxsubtype = newsubtype;
-       }
-       /* this can become COPY_NODE_FIELD when intlists are normal objects: */
-       {
-               List    *newstrat = NIL;
-               List    *tmp;
-
-               foreach(tmp, from->indxlossy)
-               {
-                       newstrat = lappend(newstrat, listCopy(lfirst(tmp)));
-               }
-               newnode->indxlossy = newstrat;
-       }
+       COPY_NODE_FIELD(indxstrategy);
+       COPY_NODE_FIELD(indxsubtype);
+       COPY_NODE_FIELD(indxlossy);
        COPY_SCALAR_FIELD(indxorderdir);
 
        return newnode;
@@ -876,7 +800,7 @@ _copySubLink(SubLink *from)
        COPY_SCALAR_FIELD(useOr);
        COPY_NODE_FIELD(lefthand);
        COPY_NODE_FIELD(operName);
-       COPY_OIDLIST_FIELD(operOids);
+       COPY_NODE_FIELD(operOids);
        COPY_NODE_FIELD(subselect);
 
        return newnode;
@@ -893,14 +817,14 @@ _copySubPlan(SubPlan *from)
        COPY_SCALAR_FIELD(subLinkType);
        COPY_SCALAR_FIELD(useOr);
        COPY_NODE_FIELD(exprs);
-       COPY_INTLIST_FIELD(paramIds);
+       COPY_NODE_FIELD(paramIds);
        COPY_NODE_FIELD(plan);
        COPY_SCALAR_FIELD(plan_id);
        COPY_NODE_FIELD(rtable);
        COPY_SCALAR_FIELD(useHashTable);
        COPY_SCALAR_FIELD(unknownEqFalse);
-       COPY_INTLIST_FIELD(setParam);
-       COPY_INTLIST_FIELD(parParam);
+       COPY_NODE_FIELD(setParam);
+       COPY_NODE_FIELD(parParam);
        COPY_NODE_FIELD(args);
 
        return newnode;
@@ -1582,7 +1506,7 @@ _copyQuery(Query *from)
        COPY_SCALAR_FIELD(hasSubLinks);
        COPY_NODE_FIELD(rtable);
        COPY_NODE_FIELD(jointree);
-       COPY_INTLIST_FIELD(rowMarks);
+       COPY_NODE_FIELD(rowMarks);
        COPY_NODE_FIELD(targetList);
        COPY_NODE_FIELD(groupClause);
        COPY_NODE_FIELD(havingQual);
@@ -1591,7 +1515,7 @@ _copyQuery(Query *from)
        COPY_NODE_FIELD(limitOffset);
        COPY_NODE_FIELD(limitCount);
        COPY_NODE_FIELD(setOperations);
-       COPY_INTLIST_FIELD(resultRelations);
+       COPY_NODE_FIELD(resultRelations);
        COPY_NODE_FIELD(in_info_list);
        COPY_SCALAR_FIELD(hasJoinRTEs);
 
@@ -1679,7 +1603,7 @@ _copySetOperationStmt(SetOperationStmt *from)
        COPY_SCALAR_FIELD(all);
        COPY_NODE_FIELD(larg);
        COPY_NODE_FIELD(rarg);
-       COPY_OIDLIST_FIELD(colTypes);
+       COPY_NODE_FIELD(colTypes);
 
        return newnode;
 }
@@ -1731,7 +1655,7 @@ _copyGrantStmt(GrantStmt *from)
        COPY_SCALAR_FIELD(is_grant);
        COPY_SCALAR_FIELD(objtype);
        COPY_NODE_FIELD(objects);
-       COPY_INTLIST_FIELD(privileges);
+       COPY_NODE_FIELD(privileges);
        COPY_NODE_FIELD(grantees);
        COPY_SCALAR_FIELD(grant_option);
        COPY_SCALAR_FIELD(behavior);
@@ -2477,7 +2401,7 @@ _copyPrepareStmt(PrepareStmt *from)
 
        COPY_STRING_FIELD(name);
        COPY_NODE_FIELD(argtypes);
-       COPY_OIDLIST_FIELD(argtype_oids);
+       COPY_NODE_FIELD(argtype_oids);
        COPY_NODE_FIELD(query);
 
        return newnode;
@@ -2511,6 +2435,47 @@ _copyDeallocateStmt(DeallocateStmt *from)
  * ****************************************************************
  */
 
+/*
+ * Perform a deep copy of the specified list, using copyObject(). The
+ * list MUST be of type T_List; T_IntList and T_OidList nodes don't
+ * need deep copies, so they should be copied via list_copy()
+ */
+#define COPY_NODE_CELL(new, old)                                       \
+       (new) = (ListCell *) palloc(sizeof(ListCell));  \
+       lfirst(new) = copyObject(lfirst(old));
+
+static List *
+_copyList(List *from)
+{
+       List            *new;
+       ListCell        *curr_old;
+       ListCell        *prev_new;
+
+       Assert(list_length(from) >= 1);
+
+       new = makeNode(List);
+       new->length = from->length;
+
+       COPY_NODE_CELL(new->head, from->head);
+       prev_new = new->head;
+       curr_old = lnext(from->head);
+
+       while (curr_old)
+       {
+               COPY_NODE_CELL(prev_new->next, curr_old);
+               prev_new = prev_new->next;
+               curr_old = curr_old->next;
+       }
+       prev_new->next = NULL;
+       new->tail = prev_new;
+
+       return new;
+}
+
+/* ****************************************************************
+ *                                     value.h copy functions
+ * ****************************************************************
+ */
 static Value *
 _copyValue(Value *from)
 {
@@ -2752,30 +2717,21 @@ copyObject(void *from)
                case T_Null:
                        retval = _copyValue(from);
                        break;
+
+                       /*
+                        * LIST NODES
+                        */
                case T_List:
-                       {
-                               List       *list = from,
-                                                  *oldl,
-                                                  *newcell,
-                                                  *prev;
-
-                               /* rather ugly coding for speed... */
-                               /* Note the input list cannot be NIL if we got here. */
-                               newcell = makeNode(List);
-                               lfirst(newcell) = copyObject(lfirst(list));
-
-                               retval = (void *) newcell;
-                               prev = newcell;
-
-                               foreach(oldl, lnext(list))
-                               {
-                                       newcell = makeNode(List);
-                                       lfirst(newcell) = copyObject(lfirst(oldl));
-                                       prev->next = newcell;
-                                       prev = newcell;
-                               }
-                               prev->next = NIL;
-                       }
+                       retval = _copyList(from);
+                       break;
+                       /*
+                        * Lists of integers and OIDs don't need to be
+                        * deep-copied, so we perform a shallow copy via
+                        * list_copy()
+                        */
+               case T_IntList:
+               case T_OidList:
+                       retval = list_copy(from);
                        break;
 
                        /*
index 19ffbb1be708ba647a1424536bf012163261f095..236061eee2a461bfe2653913f253c878fa5b5f83 100644 (file)
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/nodes/equalfuncs.c,v 1.220 2004/05/10 22:44:44 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/nodes/equalfuncs.c,v 1.221 2004/05/26 04:41:19 neilc Exp $
  *
  *-------------------------------------------------------------------------
  */
 
+#define DISABLE_LIST_COMPAT
+
 #include "postgres.h"
 
 #include "nodes/params.h"
                        return false; \
        } while (0)
 
-/* Compare a field that is a pointer to a list of integers */
-#define COMPARE_INTLIST_FIELD(fldname) \
-       do { \
-               if (!equali(a->fldname, b->fldname)) \
-                       return false; \
-       } while (0)
-
-/* Compare a field that is a pointer to a list of Oids */
-#define COMPARE_OIDLIST_FIELD(fldname) \
-       do { \
-               if (!equalo(a->fldname, b->fldname)) \
-                       return false; \
-       } while (0)
-
 /* Compare a field that is a pointer to a Bitmapset */
 #define COMPARE_BITMAPSET_FIELD(fldname) \
        do { \
@@ -328,7 +316,7 @@ _equalSubLink(SubLink *a, SubLink *b)
        COMPARE_SCALAR_FIELD(useOr);
        COMPARE_NODE_FIELD(lefthand);
        COMPARE_NODE_FIELD(operName);
-       COMPARE_OIDLIST_FIELD(operOids);
+       COMPARE_NODE_FIELD(operOids);
        COMPARE_NODE_FIELD(subselect);
 
        return true;
@@ -340,14 +328,14 @@ _equalSubPlan(SubPlan *a, SubPlan *b)
        COMPARE_SCALAR_FIELD(subLinkType);
        COMPARE_SCALAR_FIELD(useOr);
        COMPARE_NODE_FIELD(exprs);
-       COMPARE_INTLIST_FIELD(paramIds);
+       COMPARE_NODE_FIELD(paramIds);
        /* should compare plans, but have to settle for comparing plan IDs */
        COMPARE_SCALAR_FIELD(plan_id);
        COMPARE_NODE_FIELD(rtable);
        COMPARE_SCALAR_FIELD(useHashTable);
        COMPARE_SCALAR_FIELD(unknownEqFalse);
-       COMPARE_INTLIST_FIELD(setParam);
-       COMPARE_INTLIST_FIELD(parParam);
+       COMPARE_NODE_FIELD(setParam);
+       COMPARE_NODE_FIELD(parParam);
        COMPARE_NODE_FIELD(args);
 
        return true;
@@ -636,7 +624,7 @@ _equalQuery(Query *a, Query *b)
        COMPARE_SCALAR_FIELD(hasSubLinks);
        COMPARE_NODE_FIELD(rtable);
        COMPARE_NODE_FIELD(jointree);
-       COMPARE_INTLIST_FIELD(rowMarks);
+       COMPARE_NODE_FIELD(rowMarks);
        COMPARE_NODE_FIELD(targetList);
        COMPARE_NODE_FIELD(groupClause);
        COMPARE_NODE_FIELD(havingQual);
@@ -645,7 +633,7 @@ _equalQuery(Query *a, Query *b)
        COMPARE_NODE_FIELD(limitOffset);
        COMPARE_NODE_FIELD(limitCount);
        COMPARE_NODE_FIELD(setOperations);
-       COMPARE_INTLIST_FIELD(resultRelations);
+       COMPARE_NODE_FIELD(resultRelations);
        COMPARE_NODE_FIELD(in_info_list);
        COMPARE_SCALAR_FIELD(hasJoinRTEs);
 
@@ -720,7 +708,7 @@ _equalSetOperationStmt(SetOperationStmt *a, SetOperationStmt *b)
        COMPARE_SCALAR_FIELD(all);
        COMPARE_NODE_FIELD(larg);
        COMPARE_NODE_FIELD(rarg);
-       COMPARE_OIDLIST_FIELD(colTypes);
+       COMPARE_NODE_FIELD(colTypes);
 
        return true;
 }
@@ -764,7 +752,7 @@ _equalGrantStmt(GrantStmt *a, GrantStmt *b)
        COMPARE_SCALAR_FIELD(is_grant);
        COMPARE_SCALAR_FIELD(objtype);
        COMPARE_NODE_FIELD(objects);
-       COMPARE_INTLIST_FIELD(privileges);
+       COMPARE_NODE_FIELD(privileges);
        COMPARE_NODE_FIELD(grantees);
        COMPARE_SCALAR_FIELD(grant_option);
        COMPARE_SCALAR_FIELD(behavior);
@@ -1389,7 +1377,7 @@ _equalPrepareStmt(PrepareStmt *a, PrepareStmt *b)
 {
        COMPARE_STRING_FIELD(name);
        COMPARE_NODE_FIELD(argtypes);
-       COMPARE_OIDLIST_FIELD(argtype_oids);
+       COMPARE_NODE_FIELD(argtype_oids);
        COMPARE_NODE_FIELD(query);
 
        return true;
@@ -1648,6 +1636,65 @@ _equalFkConstraint(FkConstraint *a, FkConstraint *b)
  * Stuff from pg_list.h
  */
 
+static bool
+_equalList(List *a, List *b)
+{
+       ListCell *item_a;
+       ListCell *item_b;
+
+       /*
+        * Try to reject by simple scalar checks before grovelling through
+        * all the list elements...
+        */
+       COMPARE_SCALAR_FIELD(type);
+       COMPARE_SCALAR_FIELD(length);
+
+       /*
+        * We place the switch outside the loop for the sake of
+        * efficiency; this may not be worth doing...
+        */
+       switch (a->type)
+       {
+               case T_List:
+                       forboth(item_a, a, item_b, b)
+                       {
+                               if (!equal(lfirst(item_a), lfirst(item_b)))
+                                       return false;
+                       }
+                       break;
+               case T_IntList:
+                       forboth(item_a, a, item_b, b)
+                       {
+                               if (lfirst_int(item_a) != lfirst_int(item_b))
+                                       return false;
+                       }
+                       break;
+               case T_OidList:
+                       forboth(item_a, a, item_b, b)
+                       {
+                               if (lfirst_oid(item_a) != lfirst_oid(item_b))
+                                       return false;
+                       }
+                       break;
+               default:
+                       elog(ERROR, "unrecognized list node type: %d",
+                                (int) a->type);
+                       return false;           /* keep compiler quiet */
+       }
+
+       /*
+        * If we got here, we should have run out of elements of both lists
+        */
+       Assert(item_a == NULL);
+       Assert(item_b == NULL);
+
+       return true;
+}
+
+/*
+ * Stuff from value.h
+ */
+
 static bool
 _equalValue(Value *a, Value *b)
 {
@@ -1818,30 +1865,10 @@ equal(void *a, void *b)
                case T_InClauseInfo:
                        retval = _equalInClauseInfo(a, b);
                        break;
-
-                       /*
-                        * LIST NODES
-                        */
                case T_List:
-                       {
-                               List       *la = (List *) a;
-                               List       *lb = (List *) b;
-                               List       *l;
-
-                               /*
-                                * Try to reject by length check before we grovel through
-                                * all the elements...
-                                */
-                               if (length(la) != length(lb))
-                                       return false;
-                               foreach(l, la)
-                               {
-                                       if (!equal(lfirst(l), lfirst(lb)))
-                                               return false;
-                                       lb = lnext(lb);
-                               }
-                               retval = true;
-                       }
+               case T_IntList:
+               case T_OidList:
+                       retval = _equalList(a, b);
                        break;
 
                case T_Integer:
index aeda02d17029a3dd43a0509ebde9c36f0a0af725..6fd7b064a6b531be48da7bd321556447b169966c 100644 (file)
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/nodes/list.c,v 1.56 2004/01/07 18:43:36 neilc Exp $
+ *       $PostgreSQL: pgsql/src/backend/nodes/list.c,v 1.57 2004/05/26 04:41:19 neilc Exp $
  *
  *-------------------------------------------------------------------------
  */
+#define DISABLE_LIST_COMPAT
+
 #include "postgres.h"
+#include "nodes/pg_list.h"
 
-#include "nodes/parsenodes.h"
+/*
+ * Routines to simplify writing assertions about the type of a list; a
+ * NIL list is considered to be an empty list of any type.
+ */
+#define IsPointerList(l)               ((l) == NIL || IsA((l), List))
+#define IsIntegerList(l)               ((l) == NIL || IsA((l), IntList))
+#define IsOidList(l)                   ((l) == NIL || IsA((l), OidList))
 
+#ifdef USE_ASSERT_CHECKING
 /*
- *     lcons
- *
- *     Add obj to the front of list, or make a new list if 'list' is NIL
+ * Check that the specified List is valid (so far as we can tell).
  */
-List *
-lcons(void *obj, List *list)
+static void
+check_list_invariants(List *list)
 {
-       List       *l = makeNode(List);
+       if (list == NIL)
+               return;
+
+       Assert(list->length > 0);
+       Assert(list->head != NULL);
+       Assert(list->tail != NULL);
+
+       Assert(list->type == T_List ||
+                  list->type == T_IntList ||
+                  list->type == T_OidList);
+
+       if (list->length == 1)
+               Assert(list->head == list->tail);
+       if (list->length == 2)
+               Assert(list->head->next == list->tail);
+       Assert(list->tail->next == NULL);
+}
+#else
+#define check_list_invariants(l)
+#endif /* USE_ASSERT_CHECKING */
+
+/*
+ * Return a freshly allocated List. Since empty non-NIL lists are
+ * invalid, new_list() also allocates the head cell of the new list:
+ * the caller should be sure to fill in that cell's data.
+ */
+static List *
+new_list(NodeTag type)
+{
+       List            *new_list;
+       ListCell        *new_head;
+
+       new_head = (ListCell *) palloc(sizeof(*new_head));
+       new_head->next = NULL;
+       /* new_head->data is left undefined! */
 
-       lfirst(l) = obj;
-       lnext(l) = list;
-       return l;
+       new_list = (List *) palloc(sizeof(*new_list));
+       new_list->type = type;
+       new_list->length = 1;
+       new_list->head = new_head;
+       new_list->tail = new_head;
+
+       return new_list;
 }
 
 /*
- *     lconsi
+ * Allocate a new cell and make it the head of the specified
+ * list. Assumes the list it is passed is non-NIL.
  *
- *     Same as lcons, but for integer data
+ * The data in the new head cell is undefined; the caller should be
+ * sure to fill it in
  */
-List *
-lconsi(int datum, List *list)
+static void
+new_head_cell(List *list)
 {
-       List       *l = makeNode(List);
+       ListCell *new_head;
+
+       new_head = (ListCell *) palloc(sizeof(*new_head));
+       new_head->next = list->head;
 
-       lfirsti(l) = datum;
-       lnext(l) = list;
-       return l;
+       list->head = new_head;
+       list->length++;
 }
 
 /*
- *     lconso
+ * Allocate a new cell and make it the tail of the specified
+ * list. Assumes the list it is passed is non-NIL.
  *
- *     Same as lcons, but for Oid data
+ * The data in the new tail cell is undefined; the caller should be
+ * sure to fill it in
  */
-List *
-lconso(Oid datum, List *list)
+static void
+new_tail_cell(List *list)
 {
-       List       *l = makeNode(List);
+       ListCell *new_tail;
+
+       new_tail = (ListCell *) palloc(sizeof(*new_tail));
+       new_tail->next = NULL;
 
-       lfirsto(l) = datum;
-       lnext(l) = list;
-       return l;
+       list->tail->next = new_tail;
+       list->tail = new_tail;
+       list->length++;
 }
 
 /*
- *     lappend
- *
- *     Add obj to the end of list, or make a new list if 'list' is NIL
- *
- * MORE EXPENSIVE THAN lcons
+ * Append a pointer to the list. A pointer to the modified list is
+ * returned. Note that this function may or may not destructively
+ * modify the list; callers should always use this function's return
+ * value, rather than continuing to use the pointer passed as the
+ * first argument.
  */
 List *
 lappend(List *list, void *datum)
 {
-       return nconc(list, makeList1(datum));
+       Assert(IsPointerList(list));
+
+       if (list == NIL)
+               list = new_list(T_List);
+       else
+               new_tail_cell(list);
+
+       lfirst(list->tail) = datum;
+       check_list_invariants(list);
+       return list;
 }
 
 /*
- *     lappendi
- *
- *     Same as lappend, but for integers
+ * Append an integer to the specified list. See lappend()
  */
-List *
-lappendi(List *list, int datum)
+List * 
+lappend_int(List *list, int datum)
 {
-       return nconc(list, makeListi1(datum));
+       Assert(IsIntegerList(list));
+
+       if (list == NIL)
+               list = new_list(T_IntList);
+       else
+               new_tail_cell(list);
+
+       lfirst_int(list->tail) = datum;
+       check_list_invariants(list);
+       return list;
 }
 
 /*
- *     lappendo
- *
- *     Same as lappend, but for Oids
+ * Append an OID to the specified list. See lappend()
  */
-List *
-lappendo(List *list, Oid datum)
+List * 
+lappend_oid(List *list, Oid datum)
 {
-       return nconc(list, makeListo1(datum));
+       Assert(IsOidList(list));
+
+       if (list == NIL)
+               list = new_list(T_OidList);
+       else
+               new_tail_cell(list);
+
+       lfirst_oid(list->tail) = datum;
+       check_list_invariants(list);
+       return list;
 }
 
 /*
- *     nconc
- *
- *     Concat l2 on to the end of l1
- *
- * NB: l1 is destructively changed!  Use nconc(listCopy(l1), l2)
- * if you need to make a merged list without touching the original lists.
+ * Add a new cell to the list, in the position after 'prev_cell'. The
+ * data in the cell is left undefined, and must be filled in by the
+ * caller. 'list' is assumed to be non-NIL, and 'prev_cell' is assumed
+ * to be non-NULL and a member of 'list'.
  */
-List *
-nconc(List *l1, List *l2)
+static ListCell *
+add_new_cell(List *list, ListCell *prev_cell)
 {
-       List       *temp;
+       ListCell *new_cell;
 
-       if (l1 == NIL)
-               return l2;
-       if (l2 == NIL)
-               return l1;
-       if (l1 == l2)
-               elog(ERROR, "cannot nconc a list to itself");
+       new_cell = (ListCell *) palloc(sizeof(*new_cell));
+       /* new_cell->data is left undefined! */
+       new_cell->next = prev_cell->next;
+       prev_cell->next = new_cell;
 
-       for (temp = l1; lnext(temp) != NIL; temp = lnext(temp))
-               ;
+       if (list->tail == prev_cell)
+               list->tail = new_cell;
+
+       list->length++;
 
-       lnext(temp) = l2;
-       return l1;                                      /* list1 is now list1+list2  */
+       return new_cell;
 }
 
 /*
- * FastAppend - append to a FastList.
+ * Add a new cell to the specified list (which must be non-NIL);
+ * it will be placed after the list cell 'prev' (which must be
+ * non-NULL and a member of 'list'). The data placed in the new cell
+ * is 'datum'. The newly-constructed cell is returned.
+ */
+ListCell *
+lappend_cell(List *list, ListCell *prev, void *datum)
+{
+       ListCell *new_cell;
+
+       Assert(IsPointerList(list));
+
+       new_cell = add_new_cell(list, prev);
+       lfirst(new_cell) = datum;
+       check_list_invariants(list);
+       return new_cell;
+}
+
+ListCell *
+lappend_cell_int(List *list, ListCell *prev, int datum)
+{
+       ListCell *new_cell;
+
+       Assert(IsIntegerList(list));
+
+       new_cell = add_new_cell(list, prev);
+       lfirst_int(new_cell) = datum;
+       check_list_invariants(list);
+       return new_cell;
+}
+
+ListCell *
+lappend_cell_oid(List *list, ListCell *prev, Oid datum)
+{
+       ListCell *new_cell;
+
+       Assert(IsOidList(list));
+
+       new_cell = add_new_cell(list, prev);
+       lfirst_oid(new_cell) = datum;
+       check_list_invariants(list);
+       return new_cell;
+}
+
+/*
+ * Prepend a new element to the list. A pointer to the modified list
+ * is returned. Note that this function may or may not destructively
+ * modify the list; callers should always use this function's return
+ * value, rather than continuing to use the pointer passed as the
+ * second argument.
  *
- * For long lists this is significantly faster than repeated lappend's,
- * since we avoid having to chase down the list again each time.
+ * Caution: before Postgres 7.5, the original List was unmodified and
+ * could be considered to retain its separate identity.  This is no longer
+ * the case.
  */
-void
-FastAppend(FastList *fl, void *datum)
+List *
+lcons(void *datum, List *list)
 {
-       List       *cell = makeList1(datum);
+       Assert(IsPointerList(list));
 
-       if (fl->tail)
-       {
-               lnext(fl->tail) = cell;
-               fl->tail = cell;
-       }
+       if (list == NIL)
+               list = new_list(T_List);
        else
-       {
-               /* First cell of list */
-               Assert(fl->head == NIL);
-               fl->head = fl->tail = cell;
-       }
+               new_head_cell(list);
+
+       lfirst(list->head) = datum;
+       check_list_invariants(list);
+       return list;
 }
 
 /*
- * FastAppendi - same for integers
+ * Prepend an integer to the list. See lcons()
  */
-void
-FastAppendi(FastList *fl, int datum)
+List *
+lcons_int(int datum, List *list)
 {
-       List       *cell = makeListi1(datum);
+       Assert(IsIntegerList(list));
 
-       if (fl->tail)
-       {
-               lnext(fl->tail) = cell;
-               fl->tail = cell;
-       }
+       if (list == NIL)
+               list = new_list(T_IntList);
        else
-       {
-               /* First cell of list */
-               Assert(fl->head == NIL);
-               fl->head = fl->tail = cell;
-       }
+               new_head_cell(list);
+
+       lfirst_int(list->head) = datum;
+       check_list_invariants(list);
+       return list;
 }
 
 /*
- * FastAppendo - same for Oids
+ * Prepend an OID to the list. See lcons()
  */
-void
-FastAppendo(FastList *fl, Oid datum)
+List * 
+lcons_oid(Oid datum, List *list)
 {
-       List       *cell = makeListo1(datum);
+       Assert(IsOidList(list));
 
-       if (fl->tail)
-       {
-               lnext(fl->tail) = cell;
-               fl->tail = cell;
-       }
+       if (list == NIL)
+               list = new_list(T_OidList);
        else
-       {
-               /* First cell of list */
-               Assert(fl->head == NIL);
-               fl->head = fl->tail = cell;
-       }
+               new_head_cell(list);
+
+       lfirst_oid(list->head) = datum;
+       check_list_invariants(list);
+       return list;
 }
 
 /*
- * FastConc - nconc() for FastList building
+ * Concatenate list2 to the end of list1, and return list1. list1 is
+ * destructively changed. Callers should be sure to use the return
+ * value as the new pointer to the concatenated list: the 'list1'
+ * input pointer may or may not be the same as the returned pointer.
  *
- * Note that the cells of the second argument are absorbed into the FastList.
+ * The nodes in list2 are merely appended to the end of list1 in-place
+ * (i.e. they aren't copied; the two lists will share some of the same
+ * storage). Therefore, invoking list_free() on list2 will also
+ * invalidate a portion of list1.
  */
-void
-FastConc(FastList *fl, List *cells)
+List *
+list_concat(List *list1, List *list2)
 {
-       if (cells == NIL)
-               return;                                 /* nothing to do */
-       if (fl->tail)
-               lnext(fl->tail) = cells;
-       else
-       {
-               /* First cell of list */
-               Assert(fl->head == NIL);
-               fl->head = cells;
-       }
-       while (lnext(cells) != NIL)
-               cells = lnext(cells);
-       fl->tail = cells;
+       if (list1 == NIL)
+               return list2;
+       if (list2 == NIL)
+               return list1;
+       if (list1 == list2)
+               elog(ERROR, "cannot list_concat() a list to itself");
+
+       Assert(list1->type == list2->type);
+
+       list1->length += list2->length;
+       list1->tail->next = list2->head;
+       list1->tail = list2->tail;
+
+       check_list_invariants(list1);
+       return list1;
 }
 
 /*
- * FastConcFast - nconc() for FastList building
+ * Truncate 'list' to contain no more than 'new_size' elements. This
+ * modifies the list in-place! Despite this, callers should use the
+ * pointer returned by this function to refer to the newly truncated
+ * list -- it may or may not be the same as the pointer that was
+ * passed.
  *
- * Note that the cells of the second argument are absorbed into the first.
+ * Note that any cells removed by list_truncate() are NOT pfree'd.
  */
-void
-FastConcFast(FastList *fl, FastList *fl2)
+List *
+list_truncate(List *list, int new_size)
 {
-       if (fl2->head == NIL)
-               return;                                 /* nothing to do */
-       if (fl->tail)
-               lnext(fl->tail) = fl2->head;
-       else
+       ListCell        *cell;
+       int                      n;
+
+       if (new_size <= 0)
+               return NIL;             /* truncate to zero length */
+
+       /* If asked to effectively extend the list, do nothing */
+       if (new_size >= list_length(list))
+               return list;
+
+       n = 1;
+       foreach (cell, list)
        {
-               /* First cell of list */
-               Assert(fl->head == NIL);
-               fl->head = fl2->head;
+               if (n == new_size)
+               {
+                       cell->next = NULL;
+                       list->tail = cell;
+                       list->length = new_size;
+                       check_list_invariants(list);
+                       return list;
+               }
+               n++;
        }
-       fl->tail = fl2->tail;
+
+       /* keep the compiler quiet; never reached */
+       Assert(false);
+       return list;
 }
 
 /*
- *     nth
- *
- *     Get the n'th element of the list.  First element is 0th.
+ * Locate the n'th cell (counting from 0) of the list.  It is an assertion
+ * error if there isn't one.
+ */
+static ListCell *
+list_nth_cell(List *list, int n)
+{
+       ListCell *match;
+
+       Assert(list != NIL);
+       Assert(n >= 0);
+       Assert(n < list->length);
+       check_list_invariants(list);
+
+       /* Does the caller actually mean to fetch the tail? */
+       if (n == list->length - 1)
+               return list->tail;
+
+       for (match = list->head; n-- > 0; match = match->next)
+               ;
+
+       return match;
+}
+
+/*
+ * Return the data value contained in the n'th element of the
+ * specified list. (List elements begin at 0.)
  */
 void *
-nth(int n, List *l)
+list_nth(List *list, int n)
 {
-       /* XXX assume list is long enough */
-       while (n-- > 0)
-               l = lnext(l);
-       return lfirst(l);
+       Assert(IsPointerList(list));
+       return lfirst(list_nth_cell(list, n));
 }
 
 /*
- *     length
- *
- *     Get the length of l
+ * Return the integer value contained in the n'th element of the
+ * specified list.
  */
 int
-length(List *l)
+list_nth_int(List *list, int n)
 {
-       int                     i = 0;
-
-       while (l != NIL)
-       {
-               l = lnext(l);
-               i++;
-       }
-       return i;
+       Assert(IsIntegerList(list));
+       return lfirst_int(list_nth_cell(list, n));
 }
 
 /*
- *     llast
- *
- *     Get the last element of l ... error if empty list
+ * Return the OID value contained in the n'th element of the specified
+ * list.
  */
-void *
-llast(List *l)
+Oid
+list_nth_oid(List *list, int n)
 {
-       if (l == NIL)
-               elog(ERROR, "empty list does not have a last item");
-       while (lnext(l) != NIL)
-               l = lnext(l);
-       return lfirst(l);
+       Assert(IsOidList(list));
+       return lfirst_oid(list_nth_cell(list, n));
 }
 
 /*
- *     llastnode
- *
- *     Get the last node of l ... NIL if empty list
+ * Return true iff 'datum' is a member of the list. Equality is
+ * determined via equal(), so callers should ensure that they pass a
+ * Node as 'datum'.
  */
-List *
-llastnode(List *l)
+bool
+list_member(List *list, void *datum)
 {
-       if (l == NIL)
-               return NIL;
-       while (lnext(l) != NIL)
-               l = lnext(l);
-       return l;
+       ListCell *cell;
+
+       Assert(IsPointerList(list));
+       check_list_invariants(list);
+
+       foreach (cell, list)
+       {
+               if (equal(lfirst(cell), datum))
+                       return true;
+       }
+
+       return false;
 }
 
 /*
- *     freeList
- *
- *     Free the List nodes of a list
- *     The pointed-to nodes, if any, are NOT freed.
- *     This works for integer and Oid lists too.
+ * Return true iff 'datum' is a member of the list. Equality is
+ * determined by using simple pointer comparison.
  */
-void
-freeList(List *list)
+bool
+list_member_ptr(List *list, void *datum)
 {
-       while (list != NIL)
-       {
-               List       *l = list;
+       ListCell *cell;
 
-               list = lnext(list);
-               pfree(l);
+       Assert(IsPointerList(list));
+       check_list_invariants(list);
+
+       foreach (cell, list)
+       {
+               if (lfirst(cell) == datum)
+                       return true;
        }
+
+       return false;
 }
 
 /*
- * equali
- *       compares two lists of integers
+ * Return true iff the integer 'datum' is a member of the list.
  */
 bool
-equali(List *list1, List *list2)
+list_member_int(List *list, int datum)
 {
-       List       *l;
+       ListCell *cell;
+
+       Assert(IsIntegerList(list));
+       check_list_invariants(list);
 
-       foreach(l, list1)
+       foreach (cell, list)
        {
-               if (list2 == NIL)
-                       return false;
-               if (lfirsti(l) != lfirsti(list2))
-                       return false;
-               list2 = lnext(list2);
+               if (lfirst_int(cell) == datum)
+                       return true;
        }
-       if (list2 != NIL)
-               return false;
-       return true;
+
+       return false;
 }
 
 /*
- * equalo
- *       compares two lists of Oids
+ * Return true iff the OID 'datum' is a member of the list.
  */
 bool
-equalo(List *list1, List *list2)
+list_member_oid(List *list, Oid datum)
 {
-       List       *l;
+       ListCell *cell;
+
+       Assert(IsOidList(list));
+       check_list_invariants(list);
 
-       foreach(l, list1)
+       foreach (cell, list)
        {
-               if (list2 == NIL)
-                       return false;
-               if (lfirsto(l) != lfirsto(list2))
-                       return false;
-               list2 = lnext(list2);
+               if (lfirst_oid(cell) == datum)
+                       return true;
        }
-       if (list2 != NIL)
-               return false;
-       return true;
+
+       return false;
 }
 
 /*
- * Generate the union of two lists,
- * ie, l1 plus all members of l2 that are not already in l1.
- *
- * NOTE: if there are duplicates in l1 they will still be duplicate in the
- * result; but duplicates in l2 are discarded.
+ * Delete 'cell' from 'list'; 'prev' is the previous element to 'cell'
+ * in 'list', if any (i.e. prev == NULL iff list->head == cell)
  *
- * The result is a fresh List, but it points to the same member nodes
- * as were in the inputs.
+ * The cell is pfree'd, as is the List header if this was the last member.
  */
 List *
-set_union(List *l1, List *l2)
+list_delete_cell(List *list, ListCell *cell, ListCell *prev)
 {
-       List       *retval = listCopy(l1);
-       List       *i;
+       check_list_invariants(list);
+       Assert(prev != NULL ? lnext(prev) == cell : list_head(list) == cell);
+
+       /*
+        * If we're about to delete the last node from the list, free the
+        * whole list instead and return NIL, which is the only valid
+        * representation of a zero-length list.
+        */
+       if (list->length == 1)
+       {
+               list_free(list);
+               return NIL;
+       }
 
-       foreach(i, l2)
+       /*
+        * Otherwise, adjust the necessary list links, deallocate the
+        * particular node we have just removed, and return the list we
+        * were given.
+        */
+       list->length--;
+
+       if (prev)
+               prev->next = cell->next;
+       else
+               list->head = cell->next;
+
+       if (list->tail == cell)
+               list->tail = prev;
+
+       pfree(cell);
+       return list;
+}
+
+/*
+ * Delete the first cell in list that matches datum, if any.
+ * Equality is determined via equal().
+ */
+List *
+list_delete(List *list, void *datum)
+{
+       ListCell        *cell;
+       ListCell        *prev;
+
+       Assert(IsPointerList(list));
+       check_list_invariants(list);
+
+       prev = NULL;
+       foreach (cell, list)
        {
-               if (!member(lfirst(i), retval))
-                       retval = lappend(retval, lfirst(i));
+               if (equal(lfirst(cell), datum))
+                       return list_delete_cell(list, cell, prev);
+
+               prev = cell;
        }
-       return retval;
+
+       /* Didn't find a match: return the list unmodified */
+       return list;
 }
 
-/* set_union for Oid lists */
+/* As above, but use simple pointer equality */
 List *
-set_uniono(List *l1, List *l2)
+list_delete_ptr(List *list, void *datum)
 {
-       List       *retval = listCopy(l1);
-       List       *i;
+       ListCell        *cell;
+       ListCell        *prev;
 
-       foreach(i, l2)
+       Assert(IsPointerList(list));
+       check_list_invariants(list);
+
+       prev = NULL;
+       foreach (cell, list)
        {
-               if (!oidMember(lfirsto(i), retval))
-                       retval = lappendo(retval, lfirsto(i));
+               if (lfirst(cell) == datum)
+                       return list_delete_cell(list, cell, prev);
+
+               prev = cell;
        }
-       return retval;
+
+       /* Didn't find a match: return the list unmodified */
+       return list;
 }
 
-/* set_union when pointer-equality comparison is sufficient */
+/* As above, but for integers */
 List *
-set_ptrUnion(List *l1, List *l2)
+list_delete_int(List *list, int datum)
 {
-       List       *retval = listCopy(l1);
-       List       *i;
+       ListCell        *cell;
+       ListCell        *prev;
+
+       Assert(IsIntegerList(list));
+       check_list_invariants(list);
 
-       foreach(i, l2)
+       prev = NULL;
+       foreach (cell, list)
        {
-               if (!ptrMember(lfirst(i), retval))
-                       retval = lappend(retval, lfirst(i));
+               if (lfirst_int(cell) == datum)
+                       return list_delete_cell(list, cell, prev);
+
+               prev = cell;
        }
-       return retval;
+
+       /* Didn't find a match: return the list unmodified */
+       return list;
+}
+
+/* As above, but for OIDs */
+List *
+list_delete_oid(List *list, Oid datum)
+{
+       ListCell        *cell;
+       ListCell        *prev;
+
+       Assert(IsOidList(list));
+       check_list_invariants(list);
+
+       prev = NULL;
+       foreach (cell, list)
+       {
+               if (lfirst_oid(cell) == datum)
+                       return list_delete_cell(list, cell, prev);
+
+               prev = cell;
+       }
+
+       /* Didn't find a match: return the list unmodified */
+       return list;
 }
 
 /*
- * Generate the intersection of two lists,
- * ie, all members of both l1 and l2.
- *
- * NOTE: if there are duplicates in l1 they will still be duplicate in the
- * result; but duplicates in l2 are discarded.
+ * Delete the first element of the list.
  *
- * The result is a fresh List, but it points to the same member nodes
- * as were in the inputs.
+ * This is useful to replace the Lisp-y code "list = lnext(list);" in cases
+ * where the intent is to alter the list rather than just traverse it.
+ * Beware that the removed cell is freed, whereas the lnext() coding leaves
+ * the original list head intact if there's another pointer to it.
  */
-#ifdef NOT_USED
 List *
-set_intersect(List *l1, List *l2)
+list_delete_first(List *list)
 {
-       List       *retval = NIL;
-       List       *i;
+       check_list_invariants(list);
 
-       foreach(i, l1)
-       {
-               if (member(lfirst(i), l2))
-                       retval = lappend(retval, lfirst(i));
-       }
-       return retval;
+       if (list == NIL)
+               return NIL;                             /* would an error be better? */
+
+       return list_delete_cell(list, list_head(list), NULL);
 }
-#endif
 
 /*
- * member()
- *     nondestructive, returns t iff l1 is a member of the list l2
+ * Generate the union of two lists. This is calculated by copying
+ * list1 via list_copy(), then adding to it all the members of list2
+ * that aren't already in list1.
+ *
+ * Whether an element is already a member of the list is determined
+ * via equal().
+ *
+ * The returned list is newly-allocated, although the content of the
+ * cells is the same (i.e. any pointed-to objects are not copied).
+ *
+ * NB: Bizarrely, this function will NOT remove any duplicates that
+ * are present in list1 (so it is not really a union at all!). Also,
+ * this function could probably be implemented a lot faster if it is a
+ * performance bottleneck.
  */
-bool
-member(void *l1, List *l2)
+List *
+list_union(List *list1, List *list2)
 {
-       List       *i;
+       List            *result;
+       ListCell        *cell;
+
+       Assert(IsPointerList(list1));
+       Assert(IsPointerList(list2));
 
-       foreach(i, l2)
+       result = list_copy(list1);
+       foreach(cell, list2)
        {
-               if (equal((Node *) l1, (Node *) lfirst(i)))
-                       return true;
+               if (!list_member(result, lfirst(cell)))
+                       result = lappend(result, lfirst(cell));
        }
-       return false;
+
+       check_list_invariants(result);
+       return result;
 }
 
 /*
- * like member(), but use when pointer-equality comparison is sufficient
+ * This variant of list_union() determines duplicates via simple
+ * pointer comparison.
  */
-bool
-ptrMember(void *l1, List *l2)
+List *
+list_union_ptr(List *list1, List *list2)
 {
-       List       *i;
+       List            *result;
+       ListCell        *cell;
 
-       foreach(i, l2)
+       Assert(IsPointerList(list1));
+       Assert(IsPointerList(list2));
+
+       result = list_copy(list1);
+       foreach(cell, list2)
        {
-               if (l1 == lfirst(i))
-                       return true;
+               if (!list_member_ptr(result, lfirst(cell)))
+                       result = lappend(result, lfirst(cell));
        }
-       return false;
+
+       check_list_invariants(result);
+       return result;
 }
 
 /*
- * membership test for integer lists
+ * This variant of list_union() operates upon lists of integers.
  */
-bool
-intMember(int l1, List *l2)
+List *
+list_union_int(List *list1, List *list2)
 {
-       List       *i;
+       List            *result;
+       ListCell        *cell;
+
+       Assert(IsIntegerList(list1));
+       Assert(IsIntegerList(list2));
 
-       foreach(i, l2)
+       result = list_copy(list1);
+       foreach(cell, list2)
        {
-               if (l1 == lfirsti(i))
-                       return true;
+               if (!list_member_int(result, lfirst_int(cell)))
+                       result = lappend_int(result, lfirst_int(cell));
        }
-       return false;
+
+       check_list_invariants(result);
+       return result;
 }
 
 /*
- * membership test for Oid lists
+ * This variant of list_union() operates upon lists of OIDs.
  */
-bool
-oidMember(Oid l1, List *l2)
+List *
+list_union_oid(List *list1, List *list2)
 {
-       List       *i;
+       List            *result;
+       ListCell        *cell;
+
+       Assert(IsOidList(list1));
+       Assert(IsOidList(list2));
 
-       foreach(i, l2)
+       result = list_copy(list1);
+       foreach(cell, list2)
        {
-               if (l1 == lfirsto(i))
-                       return true;
+               if (!list_member_oid(result, lfirst_oid(cell)))
+                       result = lappend_oid(result, lfirst_oid(cell));
        }
-       return false;
+
+       check_list_invariants(result);
+       return result;
 }
 
 /*
- * lremove
- *       Removes 'elem' from the linked list (destructively changing the list!).
- *       (If there is more than one equal list member, the first is removed.)
+ * Return a list that contains all the cells in list1 that are not in
+ * list2. The returned list is freshly allocated via palloc(), but the
+ * cells themselves point to the same objects as the cells of the
+ * input lists.
  *
- *       This version matches 'elem' using simple pointer comparison.
- *       See also LispRemove.
+ * This variant works on lists of pointers, and determines list
+ * membership via equal()
  */
 List *
-lremove(void *elem, List *list)
+list_difference(List *list1, List *list2)
 {
-       List       *l;
-       List       *prev = NIL;
-       List       *result = list;
+       ListCell        *cell;
+       List            *result = NIL;
 
-       foreach(l, list)
-       {
-               if (elem == lfirst(l))
-                       break;
-               prev = l;
-       }
-       if (l != NIL)
+       Assert(IsPointerList(list1));
+       Assert(IsPointerList(list2));
+
+       if (list2 == NIL)
+               return list_copy(list1);
+
+       foreach (cell, list1)
        {
-               if (prev == NIL)
-                       result = lnext(l);
-               else
-                       lnext(prev) = lnext(l);
-               pfree(l);
+               if (!list_member(list2, lfirst(cell)))
+                       result = lappend(result, lfirst(cell));
        }
+
+       check_list_invariants(result);
        return result;
 }
 
 /*
- *     LispRemove
- *       Removes 'elem' from the linked list (destructively changing the list!).
- *       (If there is more than one equal list member, the first is removed.)
- *
- *       This version matches 'elem' using equal().
- *       See also lremove.
+ * This variant of list_difference() determines list membership via
+ * simple pointer equality.
  */
 List *
-LispRemove(void *elem, List *list)
+list_difference_ptr(List *list1, List *list2)
 {
-       List       *l;
-       List       *prev = NIL;
-       List       *result = list;
+       ListCell        *cell;
+       List            *result = NIL;
 
-       foreach(l, list)
-       {
-               if (equal(elem, lfirst(l)))
-                       break;
-               prev = l;
-       }
-       if (l != NIL)
+       Assert(IsPointerList(list1));
+       Assert(IsPointerList(list2));
+
+       if (list2 == NIL)
+               return list_copy(list1);
+
+       foreach (cell, list1)
        {
-               if (prev == NIL)
-                       result = lnext(l);
-               else
-                       lnext(prev) = lnext(l);
-               pfree(l);
+               if (!list_member_ptr(list2, lfirst(cell)))
+                       result = lappend(result, lfirst(cell));
        }
+
+       check_list_invariants(result);
        return result;
 }
 
 /*
- *     lremovei
- *             lremove() for integer lists.
+ * This variant of list_difference() operates upon lists of integers.
  */
 List *
-lremovei(int elem, List *list)
+list_difference_int(List *list1, List *list2)
 {
-       List       *l;
-       List       *prev = NIL;
-       List       *result = list;
+       ListCell        *cell;
+       List            *result = NIL;
 
-       foreach(l, list)
-       {
-               if (elem == lfirsti(l))
-                       break;
-               prev = l;
-       }
-       if (l != NIL)
+       Assert(IsIntegerList(list1));
+       Assert(IsIntegerList(list2));
+
+       if (list2 == NIL)
+               return list_copy(list1);
+
+       foreach (cell, list1)
        {
-               if (prev == NIL)
-                       result = lnext(l);
-               else
-                       lnext(prev) = lnext(l);
-               pfree(l);
+               if (!list_member_int(list2, lfirst_int(cell)))
+                       result = lappend_int(result, lfirst_int(cell));
        }
+
+       check_list_invariants(result);
        return result;
 }
 
 /*
- * ltruncate
- *             Truncate a list to n elements.
- *             Does nothing if n >= length(list).
- *             NB: the list is modified in-place!
+ * This variant of list_difference() operates upon lists of OIDs.
  */
 List *
-ltruncate(int n, List *list)
+list_difference_oid(List *list1, List *list2)
 {
-       List       *ptr;
+       ListCell        *cell;
+       List            *result = NIL;
 
-       if (n <= 0)
-               return NIL;                             /* truncate to zero length */
+       Assert(IsOidList(list1));
+       Assert(IsOidList(list2));
 
-       foreach(ptr, list)
+       if (list2 == NIL)
+               return list_copy(list1);
+
+       foreach (cell, list1)
        {
-               if (--n == 0)
-               {
-                       lnext(ptr) = NIL;
-                       break;
-               }
+               if (!list_member_oid(list2, lfirst_oid(cell)))
+                       result = lappend_oid(result, lfirst_oid(cell));
        }
-       return list;
+
+       check_list_invariants(result);
+       return result;
+}
+
+/* Free all storage in a list, and optionally the pointed-to elements */
+static void
+list_free_private(List *list, bool deep)
+{
+       ListCell        *cell;
+
+       check_list_invariants(list);
+
+       cell = list_head(list);
+       while (cell != NULL)
+       {
+               ListCell *tmp = cell;
+
+               cell = lnext(cell);
+               if (deep)
+                       pfree(lfirst(tmp));
+               pfree(tmp);
+       }
+
+       if (list)
+               pfree(list);
 }
 
 /*
- *     set_difference
+ * Free all the cells of the list, as well as the list itself. Any
+ * objects that are pointed-to by the cells of the list are NOT
+ * free'd.
  *
- *     Return l1 without the elements in l2.
+ * On return, the argument to this function has been freed, so the
+ * caller would be wise to set it to NIL for safety's sake.
+ */
+void
+list_free(List *list)
+{
+       list_free_private(list, false);
+}
+
+/*
+ * Free all the cells of the list, the list itself, and all the
+ * objects pointed-to by the cells of the list (each element in the
+ * list must contain a pointer to a palloc()'d region of memory!)
  *
- * The result is a fresh List, but it points to the same member nodes
- * as were in l1.
+ * On return, the argument to this function has been freed, so the
+ * caller would be wise to set it to NIL for safety's sake.
+ */
+void
+list_free_deep(List *list)
+{
+       /*
+        * A "deep" free operation only makes sense on a list of pointers.
+        */
+       Assert(IsPointerList(list));
+       list_free_private(list, true);
+}
+
+/*
+ * Return a shallow copy of the specified list.
  */
 List *
-set_difference(List *l1, List *l2)
+list_copy(List *oldlist)
 {
-       List       *result = NIL;
-       List       *i;
+       List            *newlist;
+       ListCell        *newlist_prev;
+       ListCell        *oldlist_cur;
+
+       if (oldlist == NIL)
+               return NIL;
 
-       if (l2 == NIL)
-               return listCopy(l1);    /* slightly faster path for empty l2 */
+       newlist = new_list(oldlist->type);
+       newlist->length = oldlist->length;
 
-       foreach(i, l1)
+       /*
+        * Copy over the data in the first cell; new_list() has already
+        * allocated the head cell itself
+        */
+       newlist->head->data = oldlist->head->data;
+
+       newlist_prev = newlist->head;
+       oldlist_cur = oldlist->head->next;
+       while (oldlist_cur)
        {
-               if (!member(lfirst(i), l2))
-                       result = lappend(result, lfirst(i));
+               ListCell *newlist_cur;
+
+               newlist_cur = (ListCell *) palloc(sizeof(*newlist_cur));
+               newlist_cur->data = oldlist_cur->data;
+               newlist_prev->next = newlist_cur;
+
+               newlist_prev = newlist_cur;
+               oldlist_cur = oldlist_cur->next;
        }
-       return result;
+
+       newlist_prev->next = NULL;
+       newlist->tail = newlist_prev;
+
+       check_list_invariants(newlist);
+       return newlist;
 }
 
 /*
- *     set_differenceo
- *
- *     Same as set_difference, but for Oid lists
+ * Return a shallow copy of the specified list, without the first N elements.
  */
 List *
-set_differenceo(List *l1, List *l2)
+list_copy_tail(List *oldlist, int nskip)
 {
-       List       *result = NIL;
-       List       *i;
+       List            *newlist;
+       ListCell        *newlist_prev;
+       ListCell        *oldlist_cur;
+
+       if (nskip < 0)
+               nskip = 0;                              /* would it be better to elog? */
 
-       if (l2 == NIL)
-               return listCopy(l1);    /* slightly faster path for empty l2 */
+       if (oldlist == NIL || nskip >= oldlist->length)
+               return NIL;
 
-       foreach(i, l1)
+       newlist = new_list(oldlist->type);
+       newlist->length = oldlist->length - nskip;
+
+       /*
+        * Skip over the unwanted elements.
+        */
+       oldlist_cur = oldlist->head;
+       while (nskip-- > 0)
+               oldlist_cur = oldlist_cur->next;
+
+       /*
+        * Copy over the data in the first remaining cell; new_list() has already
+        * allocated the head cell itself
+        */
+       newlist->head->data = oldlist_cur->data;
+
+       newlist_prev = newlist->head;
+       oldlist_cur = oldlist_cur->next;
+       while (oldlist_cur)
        {
-               if (!oidMember(lfirsto(i), l2))
-                       result = lappendo(result, lfirsto(i));
+               ListCell *newlist_cur;
+
+               newlist_cur = (ListCell *) palloc(sizeof(*newlist_cur));
+               newlist_cur->data = oldlist_cur->data;
+               newlist_prev->next = newlist_cur;
+
+               newlist_prev = newlist_cur;
+               oldlist_cur = oldlist_cur->next;
        }
-       return result;
+
+       newlist_prev->next = NULL;
+       newlist->tail = newlist_prev;
+
+       check_list_invariants(newlist);
+       return newlist;
 }
 
 /*
- *     set_ptrDifference
+ * When using non-GCC compilers, we can't define these as inline
+ * functions in pg_list.h, so they are defined here.
  *
- *     Same as set_difference, when pointer-equality comparison is sufficient
+ * TODO: investigate supporting inlining for some non-GCC compilers.
  */
-List *
-set_ptrDifference(List *l1, List *l2)
+#ifndef __GNUC__
+
+ListCell *
+list_head(List *l)
 {
-       List       *result = NIL;
-       List       *i;
+       return l ? l->head : NULL;
+}
 
-       if (l2 == NIL)
-               return listCopy(l1);    /* slightly faster path for empty l2 */
+ListCell *
+list_tail(List *l)
+{
+       return l ? l->tail : NULL;
+}
 
-       foreach(i, l1)
-       {
-               if (!ptrMember(lfirst(i), l2))
-                       result = lappend(result, lfirst(i));
-       }
-       return result;
+int
+list_length(List *l)
+{
+       return l ? l->length : 0;
 }
 
+#endif /* ! __GNUC__ */
+
 /*
- * Reverse a list, non-destructively
+ * Temporary compatibility functions
+ *
+ * In order to avoid warnings for these function definitions, we need
+ * to include a prototype here as well as in pg_list.h. That's because
+ * we explicitly disable list API compatibility in list.c, so we
+ * don't see the prototypes for these functions.
  */
-#ifdef NOT_USED
+
+/*
+ * Given a list, return its length. This is merely defined for the
+ * sake of backward compatibility: we can't afford to define a macro
+ * called "length", so it must be a function. New code should use the
+ * list_length() macro in order to avoid the overhead of a function
+ * call.
+ */
+int length(List *list);
+
+int
+length(List *list)
+{
+       return list_length(list);
+}
+
+/*
+ * This code implements the old "Fast List" API, making use of the new
+ * List code to do so. There's no need for FastList anymore, so this
+ * code is a bit sloppy -- it will be removed soon.
+ */
+void FastListInit(FastList *fl);
+
+void
+FastListInit(FastList *fl)
+{
+       fl->list = NIL;
+}
+
+void FastListFromList(FastList *fl, List *l);
+
+void
+FastListFromList(FastList *fl, List *list)
+{
+       fl->list = list;
+}
+
+List *FastListValue(FastList *fl);
+
 List *
-lreverse(List *l)
+FastListValue(FastList *fl)
+{
+       return fl->list;
+}
+
+void makeFastList1(FastList *fl, void *elem);
+
+void
+makeFastList1(FastList *fl, void *elem)
 {
-       List       *result = NIL;
-       List       *i;
+       fl->list = list_make1(elem);
+}
 
-       foreach(i, l)
-               result = lcons(lfirst(i), result);
-       return result;
+void FastAppend(FastList *fl, void *datum);
+
+void
+FastAppend(FastList *fl, void *datum)
+{
+       fl->list = lappend(fl->list, datum);
 }
 
-#endif
+void FastAppendi(FastList *fl, int datum);
+
+void
+FastAppendi(FastList *fl, int datum)
+{
+       fl->list = lappend_int(fl->list, datum);
+}
+
+void FastAppendo(FastList *fl, Oid datum);
+
+void
+FastAppendo(FastList *fl, Oid datum)
+{
+       fl->list = lappend_oid(fl->list, datum);
+}
+
+void FastConc(FastList *fl, List *cells);
+
+void
+FastConc(FastList *fl, List *cells)
+{
+       fl->list = list_concat(fl->list, cells);
+}
+
+void FastConcFast(FastList *fl1, FastList *fl2);
+
+void
+FastConcFast(FastList *fl1, FastList *fl2)
+{
+       fl1->list = list_concat(fl1->list, fl2->list);
+}
index e919a851940a8f241b9d45ceeac34080416e9807..f9e3f7fbcb6a43dd05c6160de45e5a28efd9081d 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/nodes/outfuncs.c,v 1.236 2004/05/10 22:44:44 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/nodes/outfuncs.c,v 1.237 2004/05/26 04:41:19 neilc Exp $
  *
  * NOTES
  *       Every node type that can appear in stored rules' parsetrees *must*
@@ -19,6 +19,8 @@
  *
  *-------------------------------------------------------------------------
  */
+#define DISABLE_LIST_COMPAT
+
 #include "postgres.h"
 
 #include <ctype.h>
        (appendStringInfo(str, " :" CppAsString(fldname) " "), \
         _outNode(str, node->fldname))
 
-/* Write an integer-list field */
-#define WRITE_INTLIST_FIELD(fldname) \
-       (appendStringInfo(str, " :" CppAsString(fldname) " "), \
-        _outIntList(str, node->fldname))
-
-/* Write an OID-list field */
-#define WRITE_OIDLIST_FIELD(fldname) \
-       (appendStringInfo(str, " :" CppAsString(fldname) " "), \
-        _outOidList(str, node->fldname))
-
 /* Write a bitmapset field */
 #define WRITE_BITMAPSET_FIELD(fldname) \
        (appendStringInfo(str, " :" CppAsString(fldname) " "), \
@@ -145,35 +137,40 @@ _outToken(StringInfo str, char *s)
        }
 }
 
-/*
- * _outIntList -
- *        converts a List of integers
- */
 static void
-_outIntList(StringInfo str, List *list)
+_outList(StringInfo str, List *node)
 {
-       List       *l;
+       ListCell *lc;
 
        appendStringInfoChar(str, '(');
-       appendStringInfoChar(str, 'i');
-       foreach(l, list)
-               appendStringInfo(str, " %d", lfirsti(l));
-       appendStringInfoChar(str, ')');
-}
 
-/*
- * _outOidList -
- *        converts a List of OIDs
- */
-static void
-_outOidList(StringInfo str, List *list)
-{
-       List       *l;
+       if (IsA(node, IntList))
+               appendStringInfoChar(str, 'i');
+       else if (IsA(node, OidList))
+               appendStringInfoChar(str, 'o');
+
+       foreach (lc, node)
+       {
+               /*
+                * For the sake of backward compatibility, we emit a slightly
+                * different whitespace format for lists of nodes vs. other
+                * types of lists. XXX: is this necessary?
+                */
+               if (IsA(node, List))
+               {
+                       _outNode(str, lfirst(lc));
+                       if (lnext(lc))
+                               appendStringInfoChar(str, ' ');
+               }
+               else if (IsA(node, IntList))
+                       appendStringInfo(str, " %d", lfirst_int(lc));
+               else if (IsA(node, OidList))
+                       appendStringInfo(str, " %u", lfirst_oid(lc));
+               else
+                       elog(ERROR, "unrecognized list node type: %d",
+                                (int) node->type);
+       }
 
-       appendStringInfoChar(str, '(');
-       appendStringInfoChar(str, 'o');
-       foreach(l, list)
-               appendStringInfo(str, " %u", lfirsto(l));
        appendStringInfoChar(str, ')');
 }
 
@@ -336,39 +333,12 @@ _outIndexScan(StringInfo str, IndexScan *node)
 
        _outScanInfo(str, (Scan *) node);
 
-       WRITE_OIDLIST_FIELD(indxid);
+       WRITE_NODE_FIELD(indxid);
        WRITE_NODE_FIELD(indxqual);
        WRITE_NODE_FIELD(indxqualorig);
-       /* this can become WRITE_NODE_FIELD when intlists are normal objects: */
-       {
-               List    *tmp;
-
-               appendStringInfo(str, " :indxstrategy ");
-               foreach(tmp, node->indxstrategy)
-               {
-                       _outIntList(str, lfirst(tmp));
-               }
-       }
-       /* this can become WRITE_NODE_FIELD when OID lists are normal objects: */
-       {
-               List    *tmp;
-
-               appendStringInfo(str, " :indxsubtype ");
-               foreach(tmp, node->indxsubtype)
-               {
-                       _outOidList(str, lfirst(tmp));
-               }
-       }
-       /* this can become WRITE_NODE_FIELD when intlists are normal objects: */
-       {
-               List    *tmp;
-
-               appendStringInfo(str, " :indxlossy ");
-               foreach(tmp, node->indxlossy)
-               {
-                       _outIntList(str, lfirst(tmp));
-               }
-       }
+       WRITE_NODE_FIELD(indxstrategy);
+       WRITE_NODE_FIELD(indxsubtype);
+       WRITE_NODE_FIELD(indxlossy);
        WRITE_ENUM_FIELD(indxorderdir, ScanDirection);
 }
 
@@ -743,7 +713,7 @@ _outSubLink(StringInfo str, SubLink *node)
        WRITE_BOOL_FIELD(useOr);
        WRITE_NODE_FIELD(lefthand);
        WRITE_NODE_FIELD(operName);
-       WRITE_OIDLIST_FIELD(operOids);
+       WRITE_NODE_FIELD(operOids);
        WRITE_NODE_FIELD(subselect);
 }
 
@@ -755,14 +725,14 @@ _outSubPlan(StringInfo str, SubPlan *node)
        WRITE_ENUM_FIELD(subLinkType, SubLinkType);
        WRITE_BOOL_FIELD(useOr);
        WRITE_NODE_FIELD(exprs);
-       WRITE_INTLIST_FIELD(paramIds);
+       WRITE_NODE_FIELD(paramIds);
        WRITE_NODE_FIELD(plan);
        WRITE_INT_FIELD(plan_id);
        WRITE_NODE_FIELD(rtable);
        WRITE_BOOL_FIELD(useHashTable);
        WRITE_BOOL_FIELD(unknownEqFalse);
-       WRITE_INTLIST_FIELD(setParam);
-       WRITE_INTLIST_FIELD(parParam);
+       WRITE_NODE_FIELD(setParam);
+       WRITE_NODE_FIELD(parParam);
        WRITE_NODE_FIELD(args);
 }
 
@@ -1302,7 +1272,7 @@ _outQuery(StringInfo str, Query *node)
        WRITE_BOOL_FIELD(hasSubLinks);
        WRITE_NODE_FIELD(rtable);
        WRITE_NODE_FIELD(jointree);
-       WRITE_INTLIST_FIELD(rowMarks);
+       WRITE_NODE_FIELD(rowMarks);
        WRITE_NODE_FIELD(targetList);
        WRITE_NODE_FIELD(groupClause);
        WRITE_NODE_FIELD(havingQual);
@@ -1311,7 +1281,7 @@ _outQuery(StringInfo str, Query *node)
        WRITE_NODE_FIELD(limitOffset);
        WRITE_NODE_FIELD(limitCount);
        WRITE_NODE_FIELD(setOperations);
-       WRITE_INTLIST_FIELD(resultRelations);
+       WRITE_NODE_FIELD(resultRelations);
 
        /* planner-internal fields are not written out */
 }
@@ -1343,7 +1313,7 @@ _outSetOperationStmt(StringInfo str, SetOperationStmt *node)
        WRITE_BOOL_FIELD(all);
        WRITE_NODE_FIELD(larg);
        WRITE_NODE_FIELD(rarg);
-       WRITE_OIDLIST_FIELD(colTypes);
+       WRITE_NODE_FIELD(colTypes);
 }
 
 static void
@@ -1444,7 +1414,6 @@ _outValue(StringInfo str, Value *value)
                        appendStringInfo(str, "%ld", value->val.ival);
                        break;
                case T_Float:
-
                        /*
                         * We assume the value is a valid numeric literal and so does
                         * not need quoting.
@@ -1572,24 +1541,9 @@ static void
 _outNode(StringInfo str, void *obj)
 {
        if (obj == NULL)
-       {
                appendStringInfo(str, "<>");
-               return;
-       }
-
-       if (IsA(obj, List))
-       {
-               List       *l;
-
-               appendStringInfoChar(str, '(');
-               foreach(l, (List *) obj)
-               {
-                       _outNode(str, lfirst(l));
-                       if (lnext(l))
-                               appendStringInfoChar(str, ' ');
-               }
-               appendStringInfoChar(str, ')');
-       }
+       else if (IsA(obj, List) || IsA(obj, IntList) || IsA(obj, OidList))
+               _outList(str, obj);
        else if (IsA(obj, Integer) ||
                         IsA(obj, Float) ||
                         IsA(obj, String) ||
index 14f73b1860ea2d12a37b9dac644d915d7736c6d5..8da0726d7ccbd9793c878e690b44fa5a68a4c489 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/nodes/print.c,v 1.66 2004/05/08 21:21:18 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/nodes/print.c,v 1.67 2004/05/26 04:41:19 neilc Exp $
  *
  * HISTORY
  *       AUTHOR                        DATE                    MAJOR EVENT
@@ -255,7 +255,7 @@ pretty_format_node_dump(const char *dump)
 void
 print_rt(List *rtable)
 {
-       List       *l;
+       ListCell   *l;
        int                     i = 1;
 
        printf("resno\trefname  \trelid\tinFromCl\n");
@@ -395,7 +395,7 @@ print_expr(Node *expr, List *rtable)
        {
                FuncExpr   *e = (FuncExpr *) expr;
                char       *funcname;
-               List       *l;
+               ListCell   *l;
 
                funcname = get_func_name(e->funcid);
                printf("%s(", ((funcname != NULL) ? funcname : "(invalid function)"));
@@ -418,18 +418,18 @@ print_expr(Node *expr, List *rtable)
 void
 print_pathkeys(List *pathkeys, List *rtable)
 {
-       List       *i,
-                          *k;
+       ListCell   *i;
 
        printf("(");
        foreach(i, pathkeys)
        {
-               List       *pathkey = lfirst(i);
+               List       *pathkey = (List *) lfirst(i);
+               ListCell   *k;
 
                printf("(");
                foreach(k, pathkey)
                {
-                       PathKeyItem *item = lfirst(k);
+                       PathKeyItem *item = (PathKeyItem *) lfirst(k);
 
                        print_expr(item->key, rtable);
                        if (lnext(k))
@@ -449,12 +449,12 @@ print_pathkeys(List *pathkeys, List *rtable)
 void
 print_tl(List *tlist, List *rtable)
 {
-       List       *tl;
+       ListCell   *tl;
 
        printf("(\n");
        foreach(tl, tlist)
        {
-               TargetEntry *tle = lfirst(tl);
+               TargetEntry *tle = (TargetEntry *) lfirst(tl);
 
                printf("\t%d %s\t", tle->resdom->resno,
                           tle->resdom->resname ? tle->resdom->resname : "<null>");
@@ -590,13 +590,13 @@ print_plan_recursive(Plan *p, Query *parsetree, int indentLevel, char *label)
 
        if (IsA(p, Append))
        {
-               List       *lst;
+               ListCell   *l;
                int                     whichplan = 0;
                Append     *appendplan = (Append *) p;
 
-               foreach(lst, appendplan->appendplans)
+               foreach(l, appendplan->appendplans)
                {
-                       Plan       *subnode = (Plan *) lfirst(lst);
+                       Plan       *subnode = (Plan *) lfirst(l);
 
                        /*
                         * I don't think we need to fiddle with the range table here,
index e90b413591c22f2bec2097dc55397b5d9879f1b5..6822909225be20835ad96a6421c622336a66a8ab 100644 (file)
@@ -9,7 +9,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/nodes/read.c,v 1.41 2004/05/08 21:21:18 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/nodes/read.c,v 1.42 2004/05/26 04:41:19 neilc Exp $
  *
  * HISTORY
  *       AUTHOR                        DATE                    MAJOR EVENT
@@ -384,7 +384,6 @@ nodeRead(char *token, int tok_len)
                        }
                        break;
                case T_Integer:
-
                        /*
                         * we know that the token terminates on a char atol will stop
                         * at
index 253b5a3eafa3c5ae8826b9c757f22124075e948c..792a6156eb895426f3ab0adec0a6a6cb859d3b17 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/nodes/readfuncs.c,v 1.169 2004/05/10 22:44:44 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/nodes/readfuncs.c,v 1.170 2004/05/26 04:41:19 neilc Exp $
  *
  * NOTES
  *       Path and Plan nodes do not have any readfuncs support, because we
@@ -18,6 +18,8 @@
  *
  *-------------------------------------------------------------------------
  */
+#define DISABLE_LIST_COMPAT
+
 #include "postgres.h"
 
 #include <math.h>
  * routine.
  */
 
-/* Declare appropriate local variables */
-#define READ_LOCALS(nodeTypeName) \
-       nodeTypeName *local_node = makeNode(nodeTypeName); \
-       char       *token; \
-       int                     length
+/* Macros for declaring appropriate local variables */
 
 /* A few guys need only local_node */
 #define READ_LOCALS_NO_FIELDS(nodeTypeName) \
        nodeTypeName *local_node = makeNode(nodeTypeName)
 
 /* And a few guys need only the pg_strtok support fields */
-#define READ_TEMP_LOCALS() \
-       char       *token; \
+#define READ_TEMP_LOCALS()     \
+       char       *token;              \
        int                     length
 
+/* ... but most need both */
+#define READ_LOCALS(nodeTypeName)                      \
+       READ_LOCALS_NO_FIELDS(nodeTypeName);    \
+       READ_TEMP_LOCALS()
+
 /* Read an integer field (anything written as ":fldname %d") */
 #define READ_INT_FIELD(fldname) \
        token = pg_strtok(&length);             /* skip :fldname */ \
        token = pg_strtok(&length);             /* skip :fldname */ \
        local_node->fldname = nodeRead(NULL, 0)
 
-/* Read an integer-list field (XXX combine me with READ_NODE_FIELD) */
-#define READ_INTLIST_FIELD(fldname) \
-       token = pg_strtok(&length);             /* skip :fldname */ \
-       local_node->fldname = nodeRead(NULL, 0)
-
-/* Read an OID-list field (XXX combine me with READ_NODE_FIELD) */
-#define READ_OIDLIST_FIELD(fldname) \
-       token = pg_strtok(&length);             /* skip :fldname */ \
-       local_node->fldname = nodeRead(NULL, 0)
-
 /* Routine exit */
 #define READ_DONE() \
        return local_node
@@ -153,7 +146,7 @@ _readQuery(void)
        READ_BOOL_FIELD(hasSubLinks);
        READ_NODE_FIELD(rtable);
        READ_NODE_FIELD(jointree);
-       READ_INTLIST_FIELD(rowMarks);
+       READ_NODE_FIELD(rowMarks);
        READ_NODE_FIELD(targetList);
        READ_NODE_FIELD(groupClause);
        READ_NODE_FIELD(havingQual);
@@ -162,7 +155,7 @@ _readQuery(void)
        READ_NODE_FIELD(limitOffset);
        READ_NODE_FIELD(limitCount);
        READ_NODE_FIELD(setOperations);
-       READ_INTLIST_FIELD(resultRelations);
+       READ_NODE_FIELD(resultRelations);
 
        /* planner-internal fields are left zero */
 
@@ -237,7 +230,7 @@ _readSetOperationStmt(void)
        READ_BOOL_FIELD(all);
        READ_NODE_FIELD(larg);
        READ_NODE_FIELD(rarg);
-       READ_OIDLIST_FIELD(colTypes);
+       READ_NODE_FIELD(colTypes);
 
        READ_DONE();
 }
@@ -526,7 +519,7 @@ _readSubLink(void)
        READ_BOOL_FIELD(useOr);
        READ_NODE_FIELD(lefthand);
        READ_NODE_FIELD(operName);
-       READ_OIDLIST_FIELD(operOids);
+       READ_NODE_FIELD(operOids);
        READ_NODE_FIELD(subselect);
 
        READ_DONE();
index ccb095aad03bd528e34bd344a0b92a4697ba611a..1642f34b4087a3a5e7ab356a37798aaacb33f8eb 100644 (file)
@@ -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/optimizer/geqo/geqo_eval.c,v 1.67 2004/01/23 23:54:21 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/optimizer/geqo/geqo_eval.c,v 1.68 2004/05/26 04:41:20 neilc Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -238,14 +238,14 @@ static bool
 desirable_join(Query *root,
                           RelOptInfo *outer_rel, RelOptInfo *inner_rel)
 {
-       List       *i;
+       ListCell   *l;
 
        /*
         * Join if there is an applicable join clause.
         */
-       foreach(i, outer_rel->joininfo)
+       foreach(l, outer_rel->joininfo)
        {
-               JoinInfo   *joininfo = (JoinInfo *) lfirst(i);
+               JoinInfo   *joininfo = (JoinInfo *) lfirst(l);
 
                if (bms_is_subset(joininfo->unjoined_relids, inner_rel->relids))
                        return true;
@@ -256,9 +256,9 @@ desirable_join(Query *root,
         * needed to improve the odds that we will find a valid solution in
         * a case where an IN sub-select has a clauseless join.
         */
-       foreach(i, root->in_info_list)
+       foreach(l, root->in_info_list)
        {
-               InClauseInfo *ininfo = (InClauseInfo *) lfirst(i);
+               InClauseInfo *ininfo = (InClauseInfo *) lfirst(l);
 
                if (bms_is_subset(outer_rel->relids, ininfo->righthand) &&
                        bms_is_subset(inner_rel->relids, ininfo->righthand))
index 217f06a6b2bc207b57e8f817394d7ed2fcb710fc..a4bc92b1c3b80173481e536a91012f53f39d8ca3 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/optimizer/path/allpaths.c,v 1.114 2004/05/10 22:44:44 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/optimizer/path/allpaths.c,v 1.115 2004/05/26 04:41:21 neilc Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -102,11 +102,11 @@ make_one_rel(Query *root)
 static void
 set_base_rel_pathlists(Query *root)
 {
-       List       *rellist;
+       ListCell           *l;
 
-       foreach(rellist, root->base_rel_list)
+       foreach(l, root->base_rel_list)
        {
-               RelOptInfo *rel = (RelOptInfo *) lfirst(rellist);
+               RelOptInfo *rel = (RelOptInfo *) lfirst(l);
                Index           rti = rel->relid;
                RangeTblEntry *rte;
                List       *inheritlist;
@@ -212,7 +212,7 @@ set_inherited_rel_pathlist(Query *root, RelOptInfo *rel,
        int                     parentRTindex = rti;
        Oid                     parentOID = rte->relid;
        List       *subpaths = NIL;
-       List       *il;
+       ListCell   *il;
 
        /*
         * XXX for now, can't handle inherited expansion of FOR UPDATE; can we
@@ -247,8 +247,8 @@ set_inherited_rel_pathlist(Query *root, RelOptInfo *rel,
                Oid                     childOID;
                RelOptInfo *childrel;
                List       *reltlist;
-               List       *parentvars;
-               List       *childvars;
+               ListCell   *parentvars;
+               ListCell   *childvars;
 
                childrte = rt_fetch(childRTindex, root->rtable);
                childOID = childrte->relid;
@@ -300,7 +300,7 @@ set_inherited_rel_pathlist(Query *root, RelOptInfo *rel,
                if (childrel->width > rel->width)
                        rel->width = childrel->width;
 
-               childvars = FastListValue(&childrel->reltargetlist);
+               childvars = list_head(FastListValue(&childrel->reltargetlist));
                foreach(parentvars, FastListValue(&rel->reltargetlist))
                {
                        Var                *parentvar = (Var *) lfirst(parentvars);
@@ -366,11 +366,11 @@ set_subquery_pathlist(Query *root, RelOptInfo *rel,
        {
                /* OK to consider pushing down individual quals */
                List       *upperrestrictlist = NIL;
-               List       *lst;
+               ListCell   *l;
 
-               foreach(lst, rel->baserestrictinfo)
+               foreach(l, rel->baserestrictinfo)
                {
-                       RestrictInfo *rinfo = (RestrictInfo *) lfirst(lst);
+                       RestrictInfo *rinfo = (RestrictInfo *) lfirst(l);
                        Node       *clause = (Node *) rinfo->clause;
 
                        if (qual_is_pushdown_safe(subquery, rti, clause, differentTypes))
@@ -434,7 +434,7 @@ make_fromexpr_rel(Query *root, FromExpr *from)
 {
        int                     levels_needed;
        List       *initial_rels = NIL;
-       List       *jt;
+       ListCell   *jt;
 
        /*
         * Count the number of child jointree nodes.  This is the depth of the
@@ -464,7 +464,7 @@ make_fromexpr_rel(Query *root, FromExpr *from)
                /*
                 * Single jointree node, so we're done.
                 */
-               return (RelOptInfo *) lfirst(initial_rels);
+               return (RelOptInfo *) linitial(initial_rels);
        }
        else
        {
@@ -516,7 +516,7 @@ make_one_rel_by_joins(Query *root, int levels_needed, List *initial_rels)
 
        for (lev = 2; lev <= levels_needed; lev++)
        {
-               List       *x;
+               ListCell   *x;
 
                /*
                 * Determine all possible pairs of relations to be joined at this
@@ -548,7 +548,7 @@ make_one_rel_by_joins(Query *root, int levels_needed, List *initial_rels)
                elog(ERROR, "failed to build any %d-way joins", levels_needed);
        Assert(length(joinitems[levels_needed]) == 1);
 
-       rel = (RelOptInfo *) lfirst(joinitems[levels_needed]);
+       rel = (RelOptInfo *) linitial(joinitems[levels_needed]);
 
        return rel;
 }
@@ -660,21 +660,22 @@ static void
 compare_tlist_datatypes(List *tlist, List *colTypes,
                                                bool *differentTypes)
 {
-       List       *i;
+       ListCell   *l;
+       ListCell   *colType = list_head(colTypes);
 
-       foreach(i, tlist)
+       foreach(l, tlist)
        {
-               TargetEntry *tle = (TargetEntry *) lfirst(i);
+               TargetEntry *tle = (TargetEntry *) lfirst(l);
 
                if (tle->resdom->resjunk)
                        continue;                       /* ignore resjunk columns */
-               if (colTypes == NIL)
+               if (colType == NULL)
                        elog(ERROR, "wrong number of tlist entries");
-               if (tle->resdom->restype != lfirsto(colTypes))
+               if (tle->resdom->restype != lfirst_oid(colType))
                        differentTypes[tle->resdom->resno] = true;
-               colTypes = lnext(colTypes);
+               colType = lnext(colType);
        }
-       if (colTypes != NIL)
+       if (colType != NULL)
                elog(ERROR, "wrong number of tlist entries");
 }
 
@@ -712,7 +713,7 @@ qual_is_pushdown_safe(Query *subquery, Index rti, Node *qual,
 {
        bool            safe = true;
        List       *vars;
-       List       *vl;
+       ListCell   *vl;
        Bitmapset  *tested = NULL;
 
        /* Refuse subselects (point 1) */
@@ -869,7 +870,7 @@ print_relids(Relids relids)
 static void
 print_restrictclauses(Query *root, List *clauses)
 {
-       List       *l;
+       ListCell   *l;
 
        foreach(l, clauses)
        {
@@ -987,7 +988,7 @@ print_path(Query *root, Path *path, int indent)
 void
 debug_print_rel(Query *root, RelOptInfo *rel)
 {
-       List       *l;
+       ListCell   *l;
 
        printf("RELOPTINFO (");
        print_relids(rel->relids);
index 96ce94c8fcbc0bc7c8f6b98666c32f94cd4bdd0d..c8b54bf223affd17e3111d8c53a751b2daaa06ce 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/optimizer/path/clausesel.c,v 1.65 2004/05/10 22:44:45 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/optimizer/path/clausesel.c,v 1.66 2004/05/26 04:41:21 neilc Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -98,16 +98,16 @@ clauselist_selectivity(Query *root,
 {
        Selectivity s1 = 1.0;
        RangeQueryClause *rqlist = NULL;
-       List       *clist;
+       ListCell   *l;
 
        /*
         * Initial scan over clauses.  Anything that doesn't look like a
         * potential rangequery clause gets multiplied into s1 and forgotten.
         * Anything that does gets inserted into an rqlist entry.
         */
-       foreach(clist, clauses)
+       foreach(l, clauses)
        {
-               Node       *clause = (Node *) lfirst(clist);
+               Node       *clause = (Node *) lfirst(l);
                RestrictInfo *rinfo;
                Selectivity s2;
 
@@ -143,7 +143,7 @@ clauselist_selectivity(Query *root,
                                        (is_pseudo_constant_clause_relids(lsecond(expr->args),
                                                                                                          rinfo->right_relids) ||
                                         (varonleft = false,
-                                         is_pseudo_constant_clause_relids(lfirst(expr->args),
+                                         is_pseudo_constant_clause_relids(linitial(expr->args),
                                                                                                           rinfo->left_relids)));
                        }
                        else
@@ -151,7 +151,7 @@ clauselist_selectivity(Query *root,
                                ok = (NumRelids(clause) == 1) &&
                                        (is_pseudo_constant_clause(lsecond(expr->args)) ||
                                         (varonleft = false,
-                                         is_pseudo_constant_clause(lfirst(expr->args))));
+                                         is_pseudo_constant_clause(linitial(expr->args))));
                        }
 
                        if (ok)
@@ -521,7 +521,7 @@ clause_selectivity(Query *root,
                 *
                 * XXX is this too conservative?
                 */
-               List       *arg;
+               ListCell   *arg;
 
                s1 = 0.0;
                foreach(arg, ((BoolExpr *) clause)->args)
index 94ce4446fa27073a2e9b1cf98ee2699de78c9a3e..71b879b134a0231cc1ec3bf7e1cdf9a5714088e1 100644 (file)
@@ -49,7 +49,7 @@
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/optimizer/path/costsize.c,v 1.126 2004/04/06 18:46:03 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/optimizer/path/costsize.c,v 1.127 2004/05/26 04:41:21 neilc Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -920,7 +920,7 @@ cost_mergejoin(MergePath *path, Query *root)
         */
        if (mergeclauses)
        {
-               firstclause = (RestrictInfo *) lfirst(mergeclauses);
+               firstclause = (RestrictInfo *) linitial(mergeclauses);
                if (firstclause->left_mergescansel < 0) /* not computed yet? */
                        mergejoinscansel(root, (Node *) firstclause->clause,
                                                         &firstclause->left_mergescansel,
@@ -1069,7 +1069,7 @@ cost_hashjoin(HashPath *path, Query *root)
        int                     numbatches;
        Selectivity innerbucketsize;
        Selectivity joininfactor;
-       List       *hcl;
+       ListCell   *hcl;
 
        if (!enable_hashjoin)
                startup_cost += disable_cost;
@@ -1267,7 +1267,7 @@ cost_hashjoin(HashPath *path, Query *root)
 void
 cost_qual_eval(QualCost *cost, List *quals)
 {
-       List       *l;
+       ListCell   *l;
 
        cost->startup = 0;
        cost->per_tuple = 0;
@@ -1444,7 +1444,7 @@ static Selectivity
 approx_selectivity(Query *root, List *quals, JoinType jointype)
 {
        Selectivity total = 1.0;
-       List       *l;
+       ListCell   *l;
 
        foreach(l, quals)
        {
@@ -1699,7 +1699,7 @@ static void
 set_rel_width(Query *root, RelOptInfo *rel)
 {
        int32           tuple_width = 0;
-       List       *tllist;
+       ListCell   *tllist;
 
        foreach(tllist, FastListValue(&rel->reltargetlist))
        {
index 565e9018daa81c0aafdb4099f60b5a7fc07b4a15..7c72b540647b2100a30cdbd22f5c093194ae5330 100644 (file)
@@ -9,7 +9,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/optimizer/path/indxpath.c,v 1.158 2004/03/27 00:24:28 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/optimizer/path/indxpath.c,v 1.159 2004/05/26 04:41:21 neilc Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -121,7 +121,7 @@ void
 create_index_paths(Query *root, RelOptInfo *rel)
 {
        Relids          all_join_outerrelids = NULL;
-       List       *ilist;
+       ListCell   *ilist;
 
        foreach(ilist, rel->indexlist)
        {
@@ -250,12 +250,12 @@ group_clauses_by_indexkey(RelOptInfo *rel, IndexOptInfo *index)
        {
                Oid                     curClass = classes[0];
                FastList        clausegroup;
-               List       *i;
+               ListCell   *l;
 
                FastListInit(&clausegroup);
-               foreach(i, restrictinfo_list)
+               foreach(l, restrictinfo_list)
                {
-                       RestrictInfo *rinfo = (RestrictInfo *) lfirst(i);
+                       RestrictInfo *rinfo = (RestrictInfo *) lfirst(l);
 
                        if (match_clause_to_indexcol(rel,
                                                                                 index,
@@ -312,7 +312,7 @@ group_clauses_by_indexkey_for_join(Query *root,
                Oid                     curClass = classes[0];
                FastList        clausegroup;
                int                     numsources;
-               List       *i;
+               ListCell   *l;
 
                FastListInit(&clausegroup);
 
@@ -324,9 +324,9 @@ group_clauses_by_indexkey_for_join(Query *root,
                 * of a non-join clause if it appears after a join clause it is
                 * redundant with.
                 */
-               foreach(i, rel->baserestrictinfo)
+               foreach(l, rel->baserestrictinfo)
                {
-                       RestrictInfo *rinfo = (RestrictInfo *) lfirst(i);
+                       RestrictInfo *rinfo = (RestrictInfo *) lfirst(l);
 
                        /* Can't use pushed-down clauses in outer join */
                        if (isouterjoin && rinfo->is_pushed_down)
@@ -344,11 +344,11 @@ group_clauses_by_indexkey_for_join(Query *root,
                numsources = (FastListValue(&clausegroup) != NIL) ? 1 : 0;
 
                /* Look for joinclauses that are usable with given outer_relids */
-               foreach(i, rel->joininfo)
+               foreach(l, rel->joininfo)
                {
-                       JoinInfo   *joininfo = (JoinInfo *) lfirst(i);
+                       JoinInfo   *joininfo = (JoinInfo *) lfirst(l);
                        bool            jfoundhere = false;
-                       List       *j;
+                       ListCell   *j;
 
                        if (!bms_is_subset(joininfo->unjoined_relids, outer_relids))
                                continue;
@@ -448,7 +448,7 @@ group_clauses_by_indexkey_for_or(RelOptInfo *rel,
        {
                Oid                     curClass = classes[0];
                FastList        clausegroup;
-               List       *item;
+               ListCell   *item;
 
                FastListInit(&clausegroup);
 
@@ -511,7 +511,6 @@ group_clauses_by_indexkey_for_or(RelOptInfo *rel,
 
                indexcol++;
                classes++;
-
        } while (!DoneMatchingIndexKeys(classes));
 
        /* if OR clause was not used then forget it, per comments above */
@@ -738,7 +737,7 @@ void
 check_partial_indexes(Query *root, RelOptInfo *rel)
 {
        List       *restrictinfo_list = rel->baserestrictinfo;
-       List       *ilist;
+       ListCell   *ilist;
 
        foreach(ilist, rel->indexlist)
        {
@@ -772,7 +771,7 @@ check_partial_indexes(Query *root, RelOptInfo *rel)
 static bool
 pred_test(List *predicate_list, List *restrictinfo_list)
 {
-       List       *pred;
+       ListCell   *pred;
 
        /*
         * Note: if Postgres tried to optimize queries by forming equivalence
@@ -815,7 +814,7 @@ pred_test(List *predicate_list, List *restrictinfo_list)
 static bool
 pred_test_restrict_list(Expr *predicate, List *restrictinfo_list)
 {
-       List       *item;
+       ListCell   *item;
 
        foreach(item, restrictinfo_list)
        {
@@ -839,8 +838,8 @@ pred_test_restrict_list(Expr *predicate, List *restrictinfo_list)
 static bool
 pred_test_recurse_clause(Expr *predicate, Node *clause)
 {
-       List       *items,
-                          *item;
+       List       *items;
+       ListCell   *item;
 
        Assert(clause != NULL);
        if (or_clause(clause))
@@ -883,8 +882,8 @@ pred_test_recurse_clause(Expr *predicate, Node *clause)
 static bool
 pred_test_recurse_pred(Expr *predicate, Node *clause)
 {
-       List       *items,
-                          *item;
+       List       *items;
+       ListCell   *item;
 
        Assert(predicate != NULL);
        if (or_clause((Node *) predicate))
@@ -1360,13 +1359,13 @@ static Relids
 indexable_outerrelids(RelOptInfo *rel, IndexOptInfo *index)
 {
        Relids          outer_relids = NULL;
-       List       *i;
+       ListCell   *l;
 
-       foreach(i, rel->joininfo)
+       foreach(l, rel->joininfo)
        {
-               JoinInfo   *joininfo = (JoinInfo *) lfirst(i);
+               JoinInfo   *joininfo = (JoinInfo *) lfirst(l);
                bool            match_found = false;
-               List       *j;
+               ListCell   *j;
 
                /*
                 * Examine each joinclause in the JoinInfo node's list to see if
@@ -1433,8 +1432,8 @@ best_inner_indexscan(Query *root, RelOptInfo *rel,
 {
        Path       *cheapest = NULL;
        bool            isouterjoin;
-       List       *ilist;
-       List       *jlist;
+       ListCell   *ilist;
+       ListCell   *jlist;
        InnerIndexscanInfo *info;
        MemoryContext oldcontext;
 
@@ -1538,7 +1537,7 @@ best_inner_indexscan(Query *root, RelOptInfo *rel,
                        }
                }
 
-               if (jlist == NIL)               /* failed to find a match? */
+               if (jlist == NULL)              /* failed to find a match? */
                {
                        List       *clausegroups;
 
@@ -1676,7 +1675,7 @@ List *
 flatten_clausegroups_list(List *clausegroups)
 {
        List       *allclauses = NIL;
-       List       *l;
+       ListCell   *l;
 
        foreach(l, clausegroups)
        {
@@ -1697,7 +1696,7 @@ Expr *
 make_expr_from_indexclauses(List *indexclauses)
 {
        List       *orclauses = NIL;
-       List       *orlist;
+       ListCell   *orlist;
 
        /* There's no such thing as an indexpath with zero scans */
        Assert(indexclauses != NIL);
@@ -1715,7 +1714,7 @@ make_expr_from_indexclauses(List *indexclauses)
        if (length(orclauses) > 1)
                return make_orclause(orclauses);
        else
-               return (Expr *) lfirst(orclauses);
+               return (Expr *) linitial(orclauses);
 }
 
 
@@ -1768,23 +1767,23 @@ match_index_to_operand(Node *operand,
                 * could be avoided, at the cost of complicating all the callers
                 * of this routine; doesn't seem worth it.)
                 */
-               List       *indexprs;
+               ListCell   *indexpr_item;
                int                     i;
                Node       *indexkey;
 
-               indexprs = index->indexprs;
+               indexpr_item = list_head(index->indexprs);
                for (i = 0; i < indexcol; i++)
                {
                        if (index->indexkeys[i] == 0)
                        {
-                               if (indexprs == NIL)
+                               if (indexpr_item == NULL)
                                        elog(ERROR, "wrong number of index expressions");
-                               indexprs = lnext(indexprs);
+                               indexpr_item = lnext(indexpr_item);
                        }
                }
-               if (indexprs == NIL)
+               if (indexpr_item == NULL)
                        elog(ERROR, "wrong number of index expressions");
-               indexkey = (Node *) lfirst(indexprs);
+               indexkey = (Node *) lfirst(indexpr_item);
 
                /*
                 * Does it match the operand?  Again, strip any relabeling.
@@ -2013,32 +2012,32 @@ List *
 expand_indexqual_conditions(IndexOptInfo *index, List *clausegroups)
 {
        FastList        resultquals;
+       ListCell   *clausegroup_item;
        Oid                *classes = index->classlist;
 
        if (clausegroups == NIL)
                return NIL;
 
        FastListInit(&resultquals);
+       clausegroup_item = list_head(clausegroups);
        do
        {
                Oid                     curClass = classes[0];
-               List       *i;
+               ListCell   *l;
 
-               foreach(i, (List *) lfirst(clausegroups))
+               foreach(l, (List *) lfirst(clausegroup_item))
                {
-                       RestrictInfo *rinfo = (RestrictInfo *) lfirst(i);
+                       RestrictInfo *rinfo = (RestrictInfo *) lfirst(l);
 
                        FastConc(&resultquals,
                                         expand_indexqual_condition(rinfo, curClass));
                }
 
-               clausegroups = lnext(clausegroups);
-
+               clausegroup_item = lnext(clausegroup_item);
                classes++;
+       } while (clausegroup_item != NULL && !DoneMatchingIndexKeys(classes));
 
-       } while (clausegroups != NIL && !DoneMatchingIndexKeys(classes));
-
-       Assert(clausegroups == NIL);    /* else more groups than indexkeys... */
+       Assert(clausegroup_item == NULL);       /* else more groups than indexkeys... */
 
        return FastListValue(&resultquals);
 }
index ac6838d26e01fa604bed2305999b982f66bb2f11..e854fe03b77dddaf00b0f7a1e5860627ba24b8e3 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/optimizer/path/joinpath.c,v 1.86 2004/04/06 18:46:03 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/optimizer/path/joinpath.c,v 1.87 2004/05/26 04:41:22 neilc Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -145,7 +145,7 @@ sort_inner_and_outer(Query *root,
        Path       *outer_path;
        Path       *inner_path;
        List       *all_pathkeys;
-       List       *i;
+       ListCell   *l;
 
        /*
         * If we are doing a right or full join, we must use *all* the
@@ -224,9 +224,9 @@ sort_inner_and_outer(Query *root,
                                                                                                  mergeclause_list,
                                                                                                  outerrel);
 
-       foreach(i, all_pathkeys)
+       foreach(l, all_pathkeys)
        {
-               List       *front_pathkey = lfirst(i);
+               List       *front_pathkey = (List *) lfirst(l);
                List       *cur_pathkeys;
                List       *cur_mergeclauses;
                List       *outerkeys;
@@ -234,7 +234,7 @@ sort_inner_and_outer(Query *root,
                List       *merge_pathkeys;
 
                /* Make a pathkey list with this guy first. */
-               if (i != all_pathkeys)
+               if (l != list_head(all_pathkeys))
                        cur_pathkeys = lcons(front_pathkey,
                                                                 lremove(front_pathkey,
                                                                                 listCopy(all_pathkeys)));
@@ -338,7 +338,7 @@ match_unsorted_outer(Query *root,
        Path       *inner_cheapest_total = innerrel->cheapest_total_path;
        Path       *matpath = NULL;
        Path       *bestinnerjoin = NULL;
-       List       *i;
+       ListCell   *l;
 
        /*
         * Nestloop only supports inner, left, and IN joins.  Also, if we are
@@ -402,9 +402,9 @@ match_unsorted_outer(Query *root,
                                                                                         outerrel->relids, jointype);
        }
 
-       foreach(i, outerrel->pathlist)
+       foreach(l, outerrel->pathlist)
        {
-               Path       *outerpath = (Path *) lfirst(i);
+               Path       *outerpath = (Path *) lfirst(l);
                List       *merge_pathkeys;
                List       *mergeclauses;
                List       *innersortkeys;
@@ -676,7 +676,7 @@ hash_inner_and_outer(Query *root,
 {
        bool            isouterjoin;
        List       *hashclauses;
-       List       *i;
+       ListCell   *l;
 
        /*
         * Hashjoin only supports inner, left, and IN joins.
@@ -704,9 +704,9 @@ hash_inner_and_outer(Query *root,
         * are usable with this pair of sub-relations.
         */
        hashclauses = NIL;
-       foreach(i, restrictlist)
+       foreach(l, restrictlist)
        {
-               RestrictInfo *restrictinfo = (RestrictInfo *) lfirst(i);
+               RestrictInfo *restrictinfo = (RestrictInfo *) lfirst(l);
 
                if (!restrictinfo->can_join ||
                        restrictinfo->hashjoinoperator == InvalidOid)
@@ -803,11 +803,11 @@ select_mergejoin_clauses(RelOptInfo *joinrel,
 {
        List       *result_list = NIL;
        bool            isouterjoin = IS_OUTER_JOIN(jointype);
-       List       *i;
+       ListCell   *l;
 
-       foreach(i, restrictlist)
+       foreach(l, restrictlist)
        {
-               RestrictInfo *restrictinfo = (RestrictInfo *) lfirst(i);
+               RestrictInfo *restrictinfo = (RestrictInfo *) lfirst(l);
 
                /*
                 * If processing an outer join, only use its own join clauses in
index 07caab48ac682e3498b9960661d01c6041127b97..6debd825c11e392e32bfa59626910451954ac641 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/optimizer/path/joinrels.c,v 1.67 2004/03/08 17:20:17 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/optimizer/path/joinrels.c,v 1.68 2004/05/26 04:41:22 neilc Exp $
  *
  *-------------------------------------------------------------------------
  */
 
 static List *make_rels_by_clause_joins(Query *root,
                                                  RelOptInfo *old_rel,
-                                                 List *other_rels);
+                                                 ListCell *other_rels);
 static List *make_rels_by_clauseless_joins(Query *root,
                                                          RelOptInfo *old_rel,
-                                                         List *other_rels);
+                                                         ListCell *other_rels);
 static bool is_inside_IN(Query *root, RelOptInfo *rel);
 
 
@@ -43,8 +43,8 @@ make_rels_by_joins(Query *root, int level, List **joinrels)
 {
        List       *result_rels = NIL;
        List       *new_rels;
-       List       *nr;
-       List       *r;
+       ListCell   *nr;
+       ListCell   *r;
        int                     k;
 
        /*
@@ -64,13 +64,13 @@ make_rels_by_joins(Query *root, int level, List **joinrels)
        foreach(r, joinrels[level - 1])
        {
                RelOptInfo *old_rel = (RelOptInfo *) lfirst(r);
-               List       *other_rels;
+               ListCell   *other_rels;
 
                if (level == 2)
                        other_rels = lnext(r);          /* only consider remaining initial
                                                                                 * rels */
                else
-                       other_rels = joinrels[1];       /* consider all initial rels */
+                       other_rels = list_head(joinrels[1]);    /* consider all initial rels */
 
                if (old_rel->joininfo != NIL)
                {
@@ -149,8 +149,8 @@ make_rels_by_joins(Query *root, int level, List **joinrels)
                foreach(r, joinrels[k])
                {
                        RelOptInfo *old_rel = (RelOptInfo *) lfirst(r);
-                       List       *other_rels;
-                       List       *r2;
+                       ListCell   *other_rels;
+                       ListCell   *r2;
 
                        if (old_rel->joininfo == NIL)
                                continue;               /* we ignore clauseless joins here */
@@ -158,15 +158,15 @@ make_rels_by_joins(Query *root, int level, List **joinrels)
                        if (k == other_level)
                                other_rels = lnext(r);  /* only consider remaining rels */
                        else
-                               other_rels = joinrels[other_level];
+                               other_rels = list_head(joinrels[other_level]);
 
-                       foreach(r2, other_rels)
+                       for_each_cell(r2, other_rels)
                        {
                                RelOptInfo *new_rel = (RelOptInfo *) lfirst(r2);
 
                                if (!bms_overlap(old_rel->relids, new_rel->relids))
                                {
-                                       List       *i;
+                                       ListCell   *i;
 
                                        /*
                                         * OK, we can build a rel of the right level from this
@@ -217,14 +217,14 @@ make_rels_by_joins(Query *root, int level, List **joinrels)
                foreach(r, joinrels[level - 1])
                {
                        RelOptInfo *old_rel = (RelOptInfo *) lfirst(r);
-                       List       *other_rels;
+                       ListCell   *other_rels;
 
                        if (level == 2)
                                other_rels = lnext(r);  /* only consider remaining initial
                                                                                 * rels */
                        else
-                               other_rels = joinrels[1];               /* consider all initial
-                                                                                                * rels */
+                               other_rels = list_head(joinrels[1]); /* consider all initial
+                                                                                                         * rels */
 
                        new_rels = make_rels_by_clauseless_joins(root,
                                                                                                         old_rel,
@@ -271,7 +271,8 @@ make_rels_by_joins(Query *root, int level, List **joinrels)
  *       The join rel nodes are returned in a list.
  *
  * 'old_rel' is the relation entry for the relation to be joined
- * 'other_rels': other rels to be considered for joining
+ * 'other_rels': the first cell in a linked list containing the other
+ * rels to be considered for joining
  *
  * Currently, this is only used with initial rels in other_rels, but it
  * will work for joining to joinrels too, if the caller ensures there is no
@@ -282,10 +283,10 @@ make_rels_by_joins(Query *root, int level, List **joinrels)
 static List *
 make_rels_by_clause_joins(Query *root,
                                                  RelOptInfo *old_rel,
-                                                 List *other_rels)
+                                                 ListCell *other_rels)
 {
        List       *result = NIL;
-       List       *i,
+       ListCell   *i,
                           *j;
 
        foreach(i, old_rel->joininfo)
@@ -293,7 +294,7 @@ make_rels_by_clause_joins(Query *root,
                JoinInfo   *joininfo = (JoinInfo *) lfirst(i);
                Relids          unjoined_relids = joininfo->unjoined_relids;
 
-               foreach(j, other_rels)
+               for_each_cell(j, other_rels)
                {
                        RelOptInfo *other_rel = (RelOptInfo *) lfirst(j);
 
@@ -324,7 +325,8 @@ make_rels_by_clause_joins(Query *root,
  *       The join rel nodes are returned in a list.
  *
  * 'old_rel' is the relation entry for the relation to be joined
- * 'other_rels': other rels to be considered for joining
+ * 'other_rels': the first cell of a linked list containing the
+ * other rels to be considered for joining
  *
  * Currently, this is only used with initial rels in other_rels, but it would
  * work for joining to joinrels too.
@@ -332,12 +334,12 @@ make_rels_by_clause_joins(Query *root,
 static List *
 make_rels_by_clauseless_joins(Query *root,
                                                          RelOptInfo *old_rel,
-                                                         List *other_rels)
+                                                         ListCell *other_rels)
 {
        List       *result = NIL;
-       List       *i;
+       ListCell   *i;
 
-       foreach(i, other_rels)
+       for_each_cell(i, other_rels)
        {
                RelOptInfo *other_rel = (RelOptInfo *) lfirst(i);
 
@@ -370,11 +372,11 @@ make_rels_by_clauseless_joins(Query *root,
 static bool
 is_inside_IN(Query *root, RelOptInfo *rel)
 {
-       List       *i;
+       ListCell   *l;
 
-       foreach(i, root->in_info_list)
+       foreach(l, root->in_info_list)
        {
-               InClauseInfo *ininfo = (InClauseInfo *) lfirst(i);
+               InClauseInfo *ininfo = (InClauseInfo *) lfirst(l);
 
                if (bms_is_subset(rel->relids, ininfo->righthand))
                        return true;
@@ -476,7 +478,7 @@ make_join_rel(Query *root, RelOptInfo *rel1, RelOptInfo *rel2,
         */
        if (jointype == JOIN_INNER)
        {
-               List       *l;
+               ListCell   *l;
 
                foreach(l, root->in_info_list)
                {
index 9722b69965dfb8e85119a3f254df10920b5fe84c..cc160e7a46e3ceb9344dc672a6d1dfcc449d6d35 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/optimizer/path/orindxpath.c,v 1.57 2004/01/05 23:39:54 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/optimizer/path/orindxpath.c,v 1.58 2004/05/26 04:41:22 neilc Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -100,7 +100,7 @@ create_or_index_quals(Query *root, RelOptInfo *rel)
        RestrictInfo *or_rinfo;
        Selectivity or_selec,
                                orig_selec;
-       List       *i;
+       ListCell   *i;
 
        /*
         * We use the best_or_subclause_indexes() machinery to locate the
@@ -111,7 +111,7 @@ create_or_index_quals(Query *root, RelOptInfo *rel)
        foreach(i, rel->joininfo)
        {
                JoinInfo   *joininfo = (JoinInfo *) lfirst(i);
-               List       *j;
+               ListCell   *j;
 
                foreach(j, joininfo->jinfo_restrictinfo)
                {
@@ -150,7 +150,7 @@ create_or_index_quals(Query *root, RelOptInfo *rel)
        newrinfos = make_restrictinfo_from_indexclauses(bestpath->indexclauses,
                                                                                                        true, true);
        Assert(length(newrinfos) == 1);
-       or_rinfo = (RestrictInfo *) lfirst(newrinfos);
+       or_rinfo = (RestrictInfo *) linitial(newrinfos);
        rel->baserestrictinfo = nconc(rel->baserestrictinfo, newrinfos);
 
        /*
@@ -190,15 +190,15 @@ create_or_index_quals(Query *root, RelOptInfo *rel)
 void
 create_or_index_paths(Query *root, RelOptInfo *rel)
 {
-       List       *i;
+       ListCell   *l;
 
        /*
         * Check each restriction clause to see if it is an OR clause, and if so,
         * try to make a path using it.
         */
-       foreach(i, rel->baserestrictinfo)
+       foreach(l, rel->baserestrictinfo)
        {
-               RestrictInfo *rinfo = (RestrictInfo *) lfirst(i);
+               RestrictInfo *rinfo = (RestrictInfo *) lfirst(l);
 
                if (restriction_is_or_clause(rinfo))
                {
@@ -248,7 +248,7 @@ best_or_subclause_indexes(Query *root,
        FastList        quals;
        Cost            path_startup_cost;
        Cost            path_total_cost;
-       List       *slist;
+       ListCell   *slist;
        IndexPath  *pathnode;
 
        FastListInit(&infos);
@@ -283,7 +283,7 @@ best_or_subclause_indexes(Query *root,
                 *
                 * Total cost is sum of the per-scan costs.
                 */
-               if (slist == subclauses)        /* first scan? */
+               if (slist == list_head(subclauses))     /* first scan? */
                        path_startup_cost = best_startup_cost;
                path_total_cost += best_total_cost;
        }
@@ -351,7 +351,7 @@ best_or_subclause_index(Query *root,
                                                Cost *retTotalCost)             /* return value */
 {
        bool            found = false;
-       List       *ilist;
+       ListCell   *ilist;
 
        foreach(ilist, rel->indexlist)
        {
index 65eb5cb8a6502e24f60207a78e304407bef30a53..af232bd0c985d353fa8247948cc88a4d31f51341 100644 (file)
@@ -11,7 +11,7 @@
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/optimizer/path/pathkeys.c,v 1.56 2004/04/07 17:42:28 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/optimizer/path/pathkeys.c,v 1.57 2004/05/26 04:41:22 neilc Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -95,8 +95,8 @@ add_equijoined_keys(Query *root, RestrictInfo *restrictinfo)
        PathKeyItem *item2 = makePathKeyItem(get_rightop(clause),
                                                                                 restrictinfo->right_sortop,
                                                                                 false);
-       List       *newset,
-                          *cursetlink;
+       List       *newset;
+       ListCell   *cursetlink;
 
        /* We might see a clause X=X; don't make a single-element list from it */
        if (equal(item1, item2))
@@ -122,10 +122,10 @@ add_equijoined_keys(Query *root, RestrictInfo *restrictinfo)
        newset = NIL;
 
        /* cannot use foreach here because of possible lremove */
-       cursetlink = root->equi_key_list;
+       cursetlink = list_head(root->equi_key_list);
        while (cursetlink)
        {
-               List       *curset = lfirst(cursetlink);
+               List       *curset = (List *) lfirst(cursetlink);
                bool            item1here = member(item1, curset);
                bool            item2here = member(item2, curset);
 
@@ -199,15 +199,15 @@ add_equijoined_keys(Query *root, RestrictInfo *restrictinfo)
 void
 generate_implied_equalities(Query *root)
 {
-       List       *cursetlink;
+       ListCell   *cursetlink;
 
        foreach(cursetlink, root->equi_key_list)
        {
-               List       *curset = lfirst(cursetlink);
+               List       *curset = (List *) lfirst(cursetlink);
                int                     nitems = length(curset);
                Relids     *relids;
                bool            have_consts;
-               List       *ptr1;
+               ListCell   *ptr1;
                int                     i1;
 
                /*
@@ -245,10 +245,10 @@ generate_implied_equalities(Query *root)
                {
                        PathKeyItem *item1 = (PathKeyItem *) lfirst(ptr1);
                        bool            i1_is_variable = !bms_is_empty(relids[i1]);
-                       List       *ptr2;
+                       ListCell   *ptr2;
                        int                     i2 = i1 + 1;
 
-                       foreach(ptr2, lnext(ptr1))
+                       for_each_cell(ptr2, lnext(ptr1))
                        {
                                PathKeyItem *item2 = (PathKeyItem *) lfirst(ptr2);
                                bool            i2_is_variable = !bms_is_empty(relids[i2]);
@@ -294,14 +294,14 @@ generate_implied_equalities(Query *root)
 bool
 exprs_known_equal(Query *root, Node *item1, Node *item2)
 {
-       List       *cursetlink;
+       ListCell   *cursetlink;
 
        foreach(cursetlink, root->equi_key_list)
        {
-               List       *curset = lfirst(cursetlink);
+               List       *curset = (List *) lfirst(cursetlink);
                bool            item1member = false;
                bool            item2member = false;
-               List       *ptr;
+               ListCell   *ptr;
 
                foreach(ptr, curset)
                {
@@ -334,12 +334,12 @@ exprs_known_equal(Query *root, Node *item1, Node *item2)
 static List *
 make_canonical_pathkey(Query *root, PathKeyItem *item)
 {
-       List       *cursetlink;
        List       *newset;
+       ListCell   *cursetlink;
 
        foreach(cursetlink, root->equi_key_list)
        {
-               List       *curset = lfirst(cursetlink);
+               List       *curset = (List *) lfirst(cursetlink);
 
                if (member(item, curset))
                        return curset;
@@ -360,11 +360,11 @@ List *
 canonicalize_pathkeys(Query *root, List *pathkeys)
 {
        List       *new_pathkeys = NIL;
-       List       *i;
+       ListCell   *l;
 
-       foreach(i, pathkeys)
+       foreach(l, pathkeys)
        {
-               List       *pathkey = (List *) lfirst(i);
+               List       *pathkey = (List *) lfirst(l);
                PathKeyItem *item;
                List       *cpathkey;
 
@@ -374,7 +374,7 @@ canonicalize_pathkeys(Query *root, List *pathkeys)
                 * set by definition.
                 */
                Assert(pathkey != NIL);
-               item = (PathKeyItem *) lfirst(pathkey);
+               item = (PathKeyItem *) linitial(pathkey);
                cpathkey = make_canonical_pathkey(root, item);
 
                /*
@@ -402,11 +402,11 @@ canonicalize_pathkeys(Query *root, List *pathkeys)
 static int
 count_canonical_peers(Query *root, PathKeyItem *item)
 {
-       List       *cursetlink;
+       ListCell   *cursetlink;
 
        foreach(cursetlink, root->equi_key_list)
        {
-               List       *curset = lfirst(cursetlink);
+               List       *curset = (List *) lfirst(cursetlink);
 
                if (member(item, curset))
                        return length(curset) - 1;
@@ -430,15 +430,13 @@ count_canonical_peers(Query *root, PathKeyItem *item)
 PathKeysComparison
 compare_pathkeys(List *keys1, List *keys2)
 {
-       List       *key1,
+       ListCell   *key1,
                           *key2;
 
-       for (key1 = keys1, key2 = keys2;
-                key1 != NIL && key2 != NIL;
-                key1 = lnext(key1), key2 = lnext(key2))
+       forboth(key1, keys1, key2, keys2)
        {
-               List       *subkey1 = lfirst(key1);
-               List       *subkey2 = lfirst(key2);
+               List       *subkey1 = (List *) lfirst(key1);
+               List       *subkey2 = (List *) lfirst(key2);
 
                /*
                 * XXX would like to check that we've been given canonicalized
@@ -465,9 +463,9 @@ compare_pathkeys(List *keys1, List *keys2)
         * the other list are not NIL --- no pathkey list should ever have a
         * NIL sublist.)
         */
-       if (key1 == NIL && key2 == NIL)
+       if (key1 == NULL && key2 == NULL)
                return PATHKEYS_EQUAL;
-       if (key1 != NIL)
+       if (key1 != NULL)
                return PATHKEYS_BETTER1;        /* key1 is longer */
        return PATHKEYS_BETTER2;        /* key2 is longer */
 }
@@ -493,15 +491,13 @@ compare_pathkeys(List *keys1, List *keys2)
 PathKeysComparison
 compare_noncanonical_pathkeys(List *keys1, List *keys2)
 {
-       List       *key1,
+       ListCell   *key1,
                           *key2;
 
-       for (key1 = keys1, key2 = keys2;
-                key1 != NIL && key2 != NIL;
-                key1 = lnext(key1), key2 = lnext(key2))
+       forboth(key1, keys1, key2, keys2)
        {
-               List       *subkey1 = lfirst(key1);
-               List       *subkey2 = lfirst(key2);
+               List       *subkey1 = (List *) lfirst(key1);
+               List       *subkey2 = (List *) lfirst(key2);
 
                Assert(length(subkey1) == 1);
                Assert(length(subkey2) == 1);
@@ -515,9 +511,9 @@ compare_noncanonical_pathkeys(List *keys1, List *keys2)
         * the other list are not NIL --- no pathkey list should ever have a
         * NIL sublist.)
         */
-       if (key1 == NIL && key2 == NIL)
+       if (key1 == NULL && key2 == NULL)
                return PATHKEYS_EQUAL;
-       if (key1 != NIL)
+       if (key1 != NULL)
                return PATHKEYS_BETTER1;        /* key1 is longer */
        return PATHKEYS_BETTER2;        /* key2 is longer */
 }
@@ -573,11 +569,11 @@ get_cheapest_path_for_pathkeys(List *paths, List *pathkeys,
                                                           CostSelector cost_criterion)
 {
        Path       *matched_path = NULL;
-       List       *i;
+       ListCell   *l;
 
-       foreach(i, paths)
+       foreach(l, paths)
        {
-               Path       *path = (Path *) lfirst(i);
+               Path       *path = (Path *) lfirst(l);
 
                /*
                 * Since cost comparison is a lot cheaper than pathkey comparison,
@@ -612,11 +608,11 @@ get_cheapest_fractional_path_for_pathkeys(List *paths,
                                                                                  double fraction)
 {
        Path       *matched_path = NULL;
-       List       *i;
+       ListCell   *l;
 
-       foreach(i, paths)
+       foreach(l, paths)
        {
-               Path       *path = (Path *) lfirst(i);
+               Path       *path = (Path *) lfirst(l);
 
                /*
                 * Since cost comparison is a lot cheaper than pathkey comparison,
@@ -658,7 +654,7 @@ build_index_pathkeys(Query *root,
        List       *retval = NIL;
        int                *indexkeys = index->indexkeys;
        Oid                *ordering = index->ordering;
-       List       *indexprs = index->indexprs;
+       ListCell   *indexprs_item = list_head(index->indexprs);
 
        while (*ordering != InvalidOid)
        {
@@ -683,10 +679,10 @@ build_index_pathkeys(Query *root,
                else
                {
                        /* expression --- assume we need not copy it */
-                       if (indexprs == NIL)
+                       if (indexprs_item == NULL)
                                elog(ERROR, "wrong number of index expressions");
-                       indexkey = (Node *) lfirst(indexprs);
-                       indexprs = lnext(indexprs);
+                       indexkey = (Node *) lfirst(indexprs_item);
+                       indexprs_item = lnext(indexprs_item);
                }
 
                /* OK, make a sublist for this sort key */
@@ -719,7 +715,7 @@ build_index_pathkeys(Query *root,
 static Var *
 find_indexkey_var(Query *root, RelOptInfo *rel, AttrNumber varattno)
 {
-       List       *temp;
+       ListCell   *temp;
        Index           relid;
        Oid                     reloid,
                                vartypeid;
@@ -758,12 +754,12 @@ build_subquery_pathkeys(Query *root, RelOptInfo *rel, Query *subquery)
        int                     retvallen = 0;
        int                     outer_query_keys = length(root->query_pathkeys);
        List       *sub_tlist = rel->subplan->targetlist;
-       List       *l;
+       ListCell   *i;
 
-       foreach(l, subquery->query_pathkeys)
+       foreach(i, subquery->query_pathkeys)
        {
-               List       *sub_pathkey = (List *) lfirst(l);
-               List       *j;
+               List       *sub_pathkey = (List *) lfirst(i);
+               ListCell   *j;
                PathKeyItem *best_item = NULL;
                int                     best_score = 0;
                List       *cpathkey;
@@ -788,7 +784,7 @@ build_subquery_pathkeys(Query *root, RelOptInfo *rel, Query *subquery)
                {
                        PathKeyItem *sub_item = (PathKeyItem *) lfirst(j);
                        Node       *sub_key = sub_item->key;
-                       List       *k;
+                       ListCell   *k;
 
                        foreach(k, sub_tlist)
                        {
@@ -908,11 +904,11 @@ make_pathkeys_for_sortclauses(List *sortclauses,
                                                          List *tlist)
 {
        List       *pathkeys = NIL;
-       List       *i;
+       ListCell   *l;
 
-       foreach(i, sortclauses)
+       foreach(l, sortclauses)
        {
-               SortClause *sortcl = (SortClause *) lfirst(i);
+               SortClause *sortcl = (SortClause *) lfirst(l);
                Node       *sortkey;
                PathKeyItem *pathkey;
 
@@ -1000,21 +996,21 @@ find_mergeclauses_for_pathkeys(Query *root,
                                                           List *restrictinfos)
 {
        List       *mergeclauses = NIL;
-       List       *i;
+       ListCell   *i;
 
        /* make sure we have pathkeys cached in the clauses */
        foreach(i, restrictinfos)
        {
-               RestrictInfo *restrictinfo = lfirst(i);
+               RestrictInfo *restrictinfo = (RestrictInfo *) lfirst(i);
 
                cache_mergeclause_pathkeys(root, restrictinfo);
        }
 
        foreach(i, pathkeys)
        {
-               List       *pathkey = lfirst(i);
+               List       *pathkey = (List *) lfirst(i);
                List       *matched_restrictinfos = NIL;
-               List       *j;
+               ListCell   *j;
 
                /*
                 * We can match a pathkey against either left or right side of any
@@ -1037,7 +1033,7 @@ find_mergeclauses_for_pathkeys(Query *root,
                 */
                foreach(j, restrictinfos)
                {
-                       RestrictInfo *restrictinfo = lfirst(j);
+                       RestrictInfo *restrictinfo = (RestrictInfo *) lfirst(j);
 
                        /*
                         * We can compare canonical pathkey sublists by simple pointer
@@ -1093,11 +1089,11 @@ make_pathkeys_for_mergeclauses(Query *root,
                                                           RelOptInfo *rel)
 {
        List       *pathkeys = NIL;
-       List       *i;
+       ListCell   *l;
 
-       foreach(i, mergeclauses)
+       foreach(l, mergeclauses)
        {
-               RestrictInfo *restrictinfo = (RestrictInfo *) lfirst(i);
+               RestrictInfo *restrictinfo = (RestrictInfo *) lfirst(l);
                List       *pathkey;
 
                cache_mergeclause_pathkeys(root, restrictinfo);
@@ -1160,18 +1156,18 @@ int
 pathkeys_useful_for_merging(Query *root, RelOptInfo *rel, List *pathkeys)
 {
        int                     useful = 0;
-       List       *i;
+       ListCell   *i;
 
        foreach(i, pathkeys)
        {
-               List       *pathkey = lfirst(i);
+               List       *pathkey = (List *) lfirst(i);
                bool            matched = false;
-               List       *j;
+               ListCell   *j;
 
                foreach(j, rel->joininfo)
                {
                        JoinInfo   *joininfo = (JoinInfo *) lfirst(j);
-                       List       *k;
+                       ListCell   *k;
 
                        foreach(k, joininfo->jinfo_restrictinfo)
                        {
index 1baccc1b3878d109380bae002e2029bb515e86db..dcb6566db04f222220eaa8831c96e9f132297795 100644 (file)
@@ -9,7 +9,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/optimizer/path/tidpath.c,v 1.18 2003/11/29 19:51:50 pgsql Exp $
+ *       $PostgreSQL: pgsql/src/backend/optimizer/path/tidpath.c,v 1.19 2004/05/26 04:41:22 neilc Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -33,7 +33,7 @@ static List *TidqualFromExpr(int varno, Expr *expr);
 static bool
 isEvaluable(int varno, Node *node)
 {
-       List       *lst;
+       ListCell   *l;
        FuncExpr   *expr;
 
        if (IsA(node, Const))
@@ -51,9 +51,9 @@ isEvaluable(int varno, Node *node)
        if (!is_funcclause(node))
                return false;
        expr = (FuncExpr *) node;
-       foreach(lst, expr->args)
+       foreach(l, expr->args)
        {
-               if (!isEvaluable(varno, lfirst(lst)))
+               if (!isEvaluable(varno, lfirst(l)))
                        return false;
        }
 
@@ -81,7 +81,7 @@ TidequalClause(int varno, OpExpr *node)
                return rnode;
        if (length(node->args) != 2)
                return rnode;
-       arg1 = lfirst(node->args);
+       arg1 = linitial(node->args);
        arg2 = lsecond(node->args);
 
        arg = NULL;
@@ -156,8 +156,8 @@ static List *
 TidqualFromExpr(int varno, Expr *expr)
 {
        List       *rlst = NIL,
-                          *lst,
                           *frtn;
+       ListCell   *l;
        Node       *node = (Node *) expr,
                           *rnode;
 
@@ -169,9 +169,9 @@ TidqualFromExpr(int varno, Expr *expr)
        }
        else if (and_clause(node))
        {
-               foreach(lst, ((BoolExpr *) expr)->args)
+               foreach(l, ((BoolExpr *) expr)->args)
                {
-                       node = lfirst(lst);
+                       node = (Node *) lfirst(l);
                        rlst = TidqualFromExpr(varno, (Expr *) node);
                        if (rlst)
                                break;
@@ -179,9 +179,9 @@ TidqualFromExpr(int varno, Expr *expr)
        }
        else if (or_clause(node))
        {
-               foreach(lst, ((BoolExpr *) expr)->args)
+               foreach(l, ((BoolExpr *) expr)->args)
                {
-                       node = lfirst(lst);
+                       node = (Node *) lfirst(l);
                        frtn = TidqualFromExpr(varno, (Expr *) node);
                        if (frtn)
                                rlst = nconc(rlst, frtn);
@@ -200,8 +200,8 @@ TidqualFromExpr(int varno, Expr *expr)
 static List *
 TidqualFromRestrictinfo(Relids relids, List *restrictinfo)
 {
-       List       *lst,
-                          *rlst = NIL;
+       ListCell   *l;
+       List       *rlst = NIL;
        int                     varno;
        Node       *node;
        Expr       *expr;
@@ -209,9 +209,9 @@ TidqualFromRestrictinfo(Relids relids, List *restrictinfo)
        if (bms_membership(relids) != BMS_SINGLETON)
                return NIL;
        varno = bms_singleton_member(relids);
-       foreach(lst, restrictinfo)
+       foreach(l, restrictinfo)
        {
-               node = lfirst(lst);
+               node = (Node *) lfirst(l);
                if (!IsA(node, RestrictInfo))
                        continue;
                expr = ((RestrictInfo *) node)->clause;
index 1b4c9d478097b538b353384f919c92f4381283d2..efa7dd771225d6584ae7777df578e183a7379004 100644 (file)
@@ -10,7 +10,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/optimizer/plan/createplan.c,v 1.169 2004/04/25 18:23:56 neilc Exp $
+ *       $PostgreSQL: pgsql/src/backend/optimizer/plan/createplan.c,v 1.170 2004/05/26 04:41:24 neilc Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -263,7 +263,7 @@ build_relation_tlist(RelOptInfo *rel)
 {
        FastList        tlist;
        int                     resdomno = 1;
-       List       *v;
+       ListCell   *v;
 
        FastListInit(&tlist);
        foreach(v, FastListValue(&rel->reltargetlist))
@@ -415,7 +415,7 @@ create_append_plan(Query *root, AppendPath *best_path)
        Append     *plan;
        List       *tlist = build_relation_tlist(best_path->path.parent);
        List       *subplans = NIL;
-       List       *subpaths;
+       ListCell   *subpaths;
 
        foreach(subpaths, best_path->subpaths)
        {
@@ -505,7 +505,7 @@ create_unique_plan(Query *root, UniquePath *best_path)
        List       *newtlist;
        int                     nextresno;
        bool            newitems;
-       List       *l;
+       ListCell   *l;
 
        subplan = create_plan(root, best_path->subpath);
 
@@ -544,7 +544,7 @@ create_unique_plan(Query *root, UniquePath *best_path)
                        break;
                }
        }
-       if (l == NIL)                           /* fell out of loop? */
+       if (l == NULL)                          /* fell out of loop? */
                elog(ERROR, "could not find UniquePath in in_info_list");
 
        /* set up to record positions of unique columns */
@@ -702,7 +702,7 @@ create_indexscan_plan(Query *root,
        List       *indxsubtype;
        List       *indxlossy;
        FastList        indexids;
-       List       *i;
+       ListCell   *l;
        IndexScan  *scan_plan;
 
        /* it should be a base rel... */
@@ -727,7 +727,7 @@ create_indexscan_plan(Query *root,
                 */
                Assert(length(best_path->indexclauses) == 1);
                scan_clauses = set_ptrUnion(scan_clauses,
-                                                                       (List *) lfirst(best_path->indexclauses));
+                                                                       (List *) linitial(best_path->indexclauses));
        }
 
        /* Reduce RestrictInfo list to bare expressions */
@@ -738,9 +738,9 @@ create_indexscan_plan(Query *root,
 
        /* Build list of index OIDs */
        FastListInit(&indexids);
-       foreach(i, best_path->indexinfo)
+       foreach(l, best_path->indexinfo)
        {
-               IndexOptInfo *index = (IndexOptInfo *) lfirst(i);
+               IndexOptInfo *index = (IndexOptInfo *) lfirst(l);
 
                FastAppendo(&indexids, index->indexoid);
        }
@@ -750,9 +750,9 @@ create_indexscan_plan(Query *root,
         * executor as indxqualorig
         */
        stripped_indxquals = NIL;
-       foreach(i, indxquals)
+       foreach(l, indxquals)
        {
-               List   *andlist = (List *) lfirst(i);
+               List   *andlist = (List *) lfirst(l);
 
                stripped_indxquals = lappend(stripped_indxquals,
                                                                         get_actual_clauses(andlist));
@@ -785,7 +785,7 @@ create_indexscan_plan(Query *root,
                 * behavior.
                 */
                Assert(stripped_indxquals != NIL);
-               qpqual = set_difference(scan_clauses, lfirst(stripped_indxquals));
+               qpqual = set_difference(scan_clauses, linitial(stripped_indxquals));
        }
 
        /*
@@ -955,7 +955,7 @@ create_nestloop_plan(Query *root,
                        joinrestrictclauses =
                                select_nonredundant_join_clauses(root,
                                                                                                 joinrestrictclauses,
-                                                                                                lfirst(indexclauses),
+                                                                                                linitial(indexclauses),
                                                                                                 best_path->jointype);
                }
        }
@@ -1182,17 +1182,17 @@ fix_indxqual_references(List *indexquals, IndexPath *index_path,
 {
        Relids          baserelids = index_path->path.parent->relids;
        int                     baserelid = index_path->path.parent->relid;
-       List       *ixinfo = index_path->indexinfo;
-       List       *i;
+       List       *index_info = index_path->indexinfo;
+       ListCell   *iq, *ii;
 
        *fixed_indexquals = NIL;
        *indxstrategy = NIL;
        *indxsubtype = NIL;
        *indxlossy = NIL;
-       foreach(i, indexquals)
+       forboth(iq, indexquals, ii, index_info)
        {
-               List       *indexqual = lfirst(i);
-               IndexOptInfo *index = (IndexOptInfo *) lfirst(ixinfo);
+               List       *indexqual = (List *) lfirst(iq);
+               IndexOptInfo *index = (IndexOptInfo *) lfirst(ii);
                List       *fixed_qual;
                List       *strategy;
                List       *subtype;
@@ -1204,8 +1204,6 @@ fix_indxqual_references(List *indexquals, IndexPath *index_path,
                *indxstrategy = lappend(*indxstrategy, strategy);
                *indxsubtype = lappend(*indxsubtype, subtype);
                *indxlossy = lappend(*indxlossy, lossy);
-
-               ixinfo = lnext(ixinfo);
        }
 }
 
@@ -1232,15 +1230,15 @@ fix_indxqual_sublist(List *indexqual,
                                         List **subtype,
                                         List **lossy)
 {
-       List       *i;
+       ListCell   *l;
 
        *fixed_quals = NIL;
        *strategy = NIL;
        *subtype = NIL;
        *lossy = NIL;
-       foreach(i, indexqual)
+       foreach(l, indexqual)
        {
-               RestrictInfo *rinfo = (RestrictInfo *) lfirst(i);
+               RestrictInfo *rinfo = (RestrictInfo *) lfirst(l);
                OpExpr     *clause;
                OpExpr     *newclause;
                Oid                     opclass;
@@ -1250,8 +1248,7 @@ fix_indxqual_sublist(List *indexqual,
 
                Assert(IsA(rinfo, RestrictInfo));
                clause = (OpExpr *) rinfo->clause;
-               if (!IsA(clause, OpExpr) ||
-                       length(clause->args) != 2)
+               if (!IsA(clause, OpExpr) || length(clause->args) != 2)
                        elog(ERROR, "indexqual clause is not binary opclause");
 
                /*
@@ -1275,7 +1272,7 @@ fix_indxqual_sublist(List *indexqual,
                 * Now, determine which index attribute this is, change the
                 * indexkey operand as needed, and get the index opclass.
                 */
-               lfirst(newclause->args) = fix_indxqual_operand(lfirst(newclause->args),
+               linitial(newclause->args) = fix_indxqual_operand(linitial(newclause->args),
                                                                                                           baserelid,
                                                                                                           index,
                                                                                                           &opclass);
@@ -1309,7 +1306,7 @@ fix_indxqual_operand(Node *node, int baserelid, IndexOptInfo *index,
         */
        Var                *result;
        int                     pos;
-       List       *indexprs;
+       ListCell   *indexpr_item;
 
        /*
         * Remove any binary-compatible relabeling of the indexkey
@@ -1340,29 +1337,29 @@ fix_indxqual_operand(Node *node, int baserelid, IndexOptInfo *index,
        }
 
        /* Try to match against index expressions */
-       indexprs = index->indexprs;
+       indexpr_item = list_head(index->indexprs);
        for (pos = 0; pos < index->ncolumns; pos++)
        {
                if (index->indexkeys[pos] == 0)
                {
                        Node       *indexkey;
 
-                       if (indexprs == NIL)
+                       if (indexpr_item == NULL)
                                elog(ERROR, "too few entries in indexprs list");
-                       indexkey = (Node *) lfirst(indexprs);
+                       indexkey = (Node *) lfirst(indexpr_item);
                        if (indexkey && IsA(indexkey, RelabelType))
                                indexkey = (Node *) ((RelabelType *) indexkey)->arg;
                        if (equal(node, indexkey))
                        {
                                /* Found a match */
                                result = makeVar(baserelid, pos + 1,
-                                                                exprType(lfirst(indexprs)), -1,
+                                                                exprType(lfirst(indexpr_item)), -1,
                                                                 0);
                                /* return the correct opclass, too */
                                *opclass = index->classlist[pos];
                                return (Node *) result;
                        }
-                       indexprs = lnext(indexprs);
+                       indexpr_item = lnext(indexpr_item);
                }
        }
 
@@ -1383,11 +1380,11 @@ static List *
 get_switched_clauses(List *clauses, Relids outerrelids)
 {
        List       *t_list = NIL;
-       List       *i;
+       ListCell   *l;
 
-       foreach(i, clauses)
+       foreach(l, clauses)
        {
-               RestrictInfo *restrictinfo = (RestrictInfo *) lfirst(i);
+               RestrictInfo *restrictinfo = (RestrictInfo *) lfirst(l);
                OpExpr     *clause = (OpExpr *) restrictinfo->clause;
 
                Assert(is_opclause(clause));
@@ -1432,7 +1429,7 @@ order_qual_clauses(Query *root, List *clauses)
 {
        FastList        nosubplans;
        FastList        withsubplans;
-       List       *l;
+       ListCell   *l;
 
        /* No need to work hard if the query is subselect-free */
        if (!root->hasSubLinks)
@@ -1442,7 +1439,7 @@ order_qual_clauses(Query *root, List *clauses)
        FastListInit(&withsubplans);
        foreach(l, clauses)
        {
-               Node       *clause = lfirst(l);
+               Node       *clause = (Node *) lfirst(l);
 
                if (contain_subplans(clause))
                        FastAppend(&withsubplans, clause);
@@ -1632,7 +1629,7 @@ make_append(List *appendplans, bool isTarget, List *tlist)
 {
        Append     *node = makeNode(Append);
        Plan       *plan = &node->plan;
-       List       *subnode;
+       ListCell   *subnode;
 
        /*
         * Compute cost as sum of subplan costs.  We charge nothing extra for
@@ -1647,7 +1644,7 @@ make_append(List *appendplans, bool isTarget, List *tlist)
        {
                Plan       *subplan = (Plan *) lfirst(subnode);
 
-               if (subnode == appendplans)             /* first node? */
+               if (subnode == list_head(appendplans))          /* first node? */
                        plan->startup_cost = subplan->startup_cost;
                plan->total_cost += subplan->total_cost;
                plan->plan_rows += subplan->plan_rows;
@@ -1837,7 +1834,7 @@ static Sort *
 make_sort_from_pathkeys(Query *root, Plan *lefttree, List *pathkeys)
 {
        List       *tlist = lefttree->targetlist;
-       List       *i;
+       ListCell   *i;
        int                     numsortkeys;
        AttrNumber *sortColIdx;
        Oid                *sortOperators;
@@ -1854,7 +1851,7 @@ make_sort_from_pathkeys(Query *root, Plan *lefttree, List *pathkeys)
                List       *keysublist = (List *) lfirst(i);
                PathKeyItem *pathkey = NULL;
                Resdom     *resdom = NULL;
-               List       *j;
+               ListCell   *j;
 
                /*
                 * We can sort by any one of the sort key items listed in this
@@ -1870,7 +1867,7 @@ make_sort_from_pathkeys(Query *root, Plan *lefttree, List *pathkeys)
                 */
                foreach(j, keysublist)
                {
-                       pathkey = lfirst(j);
+                       pathkey = (PathKeyItem *) lfirst(j);
                        Assert(IsA(pathkey, PathKeyItem));
                        resdom = tlist_member(pathkey->key, tlist);
                        if (resdom)
@@ -1881,10 +1878,10 @@ make_sort_from_pathkeys(Query *root, Plan *lefttree, List *pathkeys)
                        /* No matching Var; look for a computable expression */
                        foreach(j, keysublist)
                        {
-                               List   *exprvars;
-                               List   *k;
+                               List            *exprvars;
+                               ListCell        *k;
 
-                               pathkey = lfirst(j);
+                               pathkey = (PathKeyItem *) lfirst(j);
                                exprvars = pull_var_clause(pathkey->key, false);
                                foreach(k, exprvars)
                                {
@@ -1948,7 +1945,7 @@ Sort *
 make_sort_from_sortclauses(Query *root, List *sortcls, Plan *lefttree)
 {
        List       *sub_tlist = lefttree->targetlist;
-       List       *i;
+       ListCell   *l;
        int                     numsortkeys;
        AttrNumber *sortColIdx;
        Oid                *sortOperators;
@@ -1960,9 +1957,9 @@ make_sort_from_sortclauses(Query *root, List *sortcls, Plan *lefttree)
 
        numsortkeys = 0;
 
-       foreach(i, sortcls)
+       foreach(l, sortcls)
        {
-               SortClause *sortcl = (SortClause *) lfirst(i);
+               SortClause *sortcl = (SortClause *) lfirst(l);
                TargetEntry *tle = get_sortgroupclause_tle(sortcl, sub_tlist);
 
                /*
@@ -2001,7 +1998,7 @@ make_sort_from_groupcols(Query *root,
 {
        List       *sub_tlist = lefttree->targetlist;
        int                     grpno = 0;
-       List       *i;
+       ListCell   *l;
        int                     numsortkeys;
        AttrNumber *sortColIdx;
        Oid                *sortOperators;
@@ -2013,9 +2010,9 @@ make_sort_from_groupcols(Query *root,
 
        numsortkeys = 0;
 
-       foreach(i, groupcls)
+       foreach(l, groupcls)
        {
-               GroupClause *grpcl = (GroupClause *) lfirst(i);
+               GroupClause *grpcl = (GroupClause *) lfirst(l);
                TargetEntry *tle = get_tle_by_resno(sub_tlist, grpColIdx[grpno]);
 
                /*
@@ -2213,7 +2210,7 @@ make_unique(Plan *lefttree, List *distinctList)
        int                     numCols = length(distinctList);
        int                     keyno = 0;
        AttrNumber *uniqColIdx;
-       List       *slitem;
+       ListCell   *slitem;
 
        copy_plan_costsize(plan, lefttree);
 
@@ -2270,7 +2267,7 @@ make_setop(SetOpCmd cmd, Plan *lefttree,
        int                     numCols = length(distinctList);
        int                     keyno = 0;
        AttrNumber *dupColIdx;
-       List       *slitem;
+       ListCell   *slitem;
 
        copy_plan_costsize(plan, lefttree);
 
index 46fde263456e935f871f8af7de89dc3251e0dbbc..f8a4bfaaac48504f1e0e7e9f6418840c9ab0fc53 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/optimizer/plan/initsplan.c,v 1.98 2004/02/27 21:42:00 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/optimizer/plan/initsplan.c,v 1.99 2004/05/26 04:41:24 neilc Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -81,7 +81,7 @@ add_base_rels_to_query(Query *root, Node *jtnode)
        else if (IsA(jtnode, FromExpr))
        {
                FromExpr   *f = (FromExpr *) jtnode;
-               List       *l;
+               ListCell   *l;
 
                foreach(l, f->fromlist)
                        add_base_rels_to_query(root, lfirst(l));
@@ -135,7 +135,7 @@ build_base_rel_tlists(Query *root, List *final_tlist)
 static void
 add_vars_to_targetlist(Query *root, List *vars, Relids where_needed)
 {
-       List       *temp;
+       ListCell   *temp;
 
        Assert(!bms_is_empty(where_needed));
 
@@ -205,8 +205,7 @@ distribute_quals_to_rels(Query *root, Node *jtnode)
        else if (IsA(jtnode, FromExpr))
        {
                FromExpr   *f = (FromExpr *) jtnode;
-               List       *l;
-               List       *qual;
+               ListCell   *l;
 
                /*
                 * First, recurse to handle child joins.
@@ -222,8 +221,8 @@ distribute_quals_to_rels(Query *root, Node *jtnode)
                 * Now process the top-level quals.  These are always marked as
                 * "pushed down", since they clearly didn't come from a JOIN expr.
                 */
-               foreach(qual, (List *) f->quals)
-                       distribute_qual_to_rels(root, (Node *) lfirst(qual),
+               foreach(l, (List *) f->quals)
+                       distribute_qual_to_rels(root, (Node *) lfirst(l),
                                                                        true, false, NULL, result);
        }
        else if (IsA(jtnode, JoinExpr))
@@ -233,7 +232,7 @@ distribute_quals_to_rels(Query *root, Node *jtnode)
                                        rightids,
                                        nonnullable_rels,
                                        nullable_rels;
-               List       *qual;
+               ListCell   *qual;
 
                /*
                 * Order of operations here is subtle and critical.  First we
@@ -636,7 +635,7 @@ process_implied_equality(Query *root,
        BMS_Membership membership;
        RelOptInfo *rel1;
        List       *restrictlist;
-       List       *itm;
+       ListCell   *itm;
        Oid                     ltype,
                                rtype;
        Operator        eq_operator;
@@ -803,7 +802,7 @@ qual_is_redundant(Query *root,
        Node       *newleft;
        Node       *newright;
        List       *oldquals;
-       List       *olditem;
+       ListCell   *olditem;
        List       *equalexprs;
        bool            someadded;
 
@@ -860,7 +859,7 @@ qual_is_redundant(Query *root,
        {
                someadded = false;
                /* cannot use foreach here because of possible lremove */
-               olditem = oldquals;
+               olditem = list_head(oldquals);
                while (olditem)
                {
                        RestrictInfo *oldrinfo = (RestrictInfo *) lfirst(olditem);
index e094620d620afde730c6f054c17794cbf4211dd6..7b5d44c732bcb079b757dd27fe21ceff4da4cd6c 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/optimizer/plan/planner.c,v 1.169 2004/05/11 02:21:37 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/optimizer/plan/planner.c,v 1.170 2004/05/26 04:41:24 neilc Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -174,6 +174,7 @@ subquery_planner(Query *parse, double tuple_fraction)
        Plan       *plan;
        List       *newHaving;
        List       *lst;
+       ListCell   *l;
 
        /* Set up for a new level of subquery */
        PlannerQueryLevel++;
@@ -206,9 +207,9 @@ subquery_planner(Query *parse, double tuple_fraction)
         */
        parse->hasJoinRTEs = false;
        hasOuterJoins = false;
-       foreach(lst, parse->rtable)
+       foreach(l, parse->rtable)
        {
-               RangeTblEntry *rte = (RangeTblEntry *) lfirst(lst);
+               RangeTblEntry *rte = (RangeTblEntry *) lfirst(l);
 
                if (rte->rtekind == RTE_JOIN)
                {
@@ -244,9 +245,9 @@ subquery_planner(Query *parse, double tuple_fraction)
                                                          EXPRKIND_ININFO);
 
        /* Also need to preprocess expressions for function RTEs */
-       foreach(lst, parse->rtable)
+       foreach(l, parse->rtable)
        {
-               RangeTblEntry *rte = (RangeTblEntry *) lfirst(lst);
+               RangeTblEntry *rte = (RangeTblEntry *) lfirst(l);
 
                if (rte->rtekind == RTE_FUNCTION)
                        rte->funcexpr = preprocess_expression(parse, rte->funcexpr,
@@ -271,9 +272,9 @@ subquery_planner(Query *parse, double tuple_fraction)
         * declared as Node *.
         */
        newHaving = NIL;
-       foreach(lst, (List *) parse->havingQual)
+       foreach(l, (List *) parse->havingQual)
        {
-               Node       *havingclause = (Node *) lfirst(lst);
+               Node       *havingclause = (Node *) lfirst(l);
 
                if (contain_agg_clause(havingclause))
                        newHaving = lappend(newHaving, havingclause);
@@ -337,9 +338,9 @@ subquery_planner(Query *parse, double tuple_fraction)
                 */
                plan->initPlan = PlannerInitPlan;
 
-               foreach(lst, plan->initPlan)
+               foreach(l, plan->initPlan)
                {
-                       SubPlan    *initplan = (SubPlan *) lfirst(lst);
+                       SubPlan    *initplan = (SubPlan *) lfirst(l);
 
                        plan->extParam = bms_add_members(plan->extParam,
                                                                                         initplan->plan->extParam);
@@ -445,7 +446,7 @@ preprocess_qual_conditions(Query *parse, Node *jtnode)
        else if (IsA(jtnode, FromExpr))
        {
                FromExpr   *f = (FromExpr *) jtnode;
-               List       *l;
+               ListCell   *l;
 
                foreach(l, f->fromlist)
                        preprocess_qual_conditions(parse, lfirst(l));
@@ -495,7 +496,7 @@ inheritance_planner(Query *parse, List *inheritlist)
        int                     mainrtlength = length(parse->rtable);
        List       *subplans = NIL;
        List       *tlist = NIL;
-       List       *l;
+       ListCell   *l;
 
        foreach(l, inheritlist)
        {
@@ -524,10 +525,9 @@ inheritance_planner(Query *parse, List *inheritlist)
                subrtlength = length(subquery->rtable);
                if (subrtlength > mainrtlength)
                {
-                       List       *subrt = subquery->rtable;
+                       List       *subrt;
 
-                       while (mainrtlength-- > 0)      /* wish we had nthcdr() */
-                               subrt = lnext(subrt);
+                       subrt = list_copy_tail(subquery->rtable, mainrtlength);
                        parse->rtable = nconc(parse->rtable, subrt);
                        mainrtlength = subrtlength;
                }
@@ -650,7 +650,7 @@ grouping_planner(Query *parse, double tuple_fraction)
                 */
                if (parse->rowMarks)
                {
-                       List       *l;
+                       ListCell   *l;
 
                        /*
                         * We've got trouble if the FOR UPDATE appears inside
@@ -1328,7 +1328,7 @@ grouping_planner(Query *parse, double tuple_fraction)
 static bool
 hash_safe_grouping(Query *parse)
 {
-       List       *gl;
+       ListCell   *gl;
 
        foreach(gl, parse->groupClause)
        {
@@ -1435,17 +1435,17 @@ make_subplanTargetList(Query *parse,
        {
                int                     keyno = 0;
                AttrNumber *grpColIdx;
-               List       *gl;
+               ListCell   *gl;
 
                grpColIdx = (AttrNumber *) palloc(sizeof(AttrNumber) * numCols);
                *groupColIdx = grpColIdx;
 
                foreach(gl, parse->groupClause)
                {
-                       GroupClause *grpcl = (GroupClause *) lfirst(gl);
-                       Node       *groupexpr = get_sortgroupclause_expr(grpcl, tlist);
-                       TargetEntry *te = NULL;
-                       List       *sl;
+                       GroupClause             *grpcl = (GroupClause *) lfirst(gl);
+                       Node                    *groupexpr = get_sortgroupclause_expr(grpcl, tlist);
+                       TargetEntry             *te = NULL;
+                       ListCell                *sl;
 
                        /* Find or make a matching sub_tlist entry */
                        foreach(sl, sub_tlist)
@@ -1489,7 +1489,7 @@ locate_grouping_columns(Query *parse,
                                                AttrNumber *groupColIdx)
 {
        int                     keyno = 0;
-       List       *gl;
+       ListCell   *gl;
 
        /*
         * No work unless grouping.
@@ -1503,10 +1503,10 @@ locate_grouping_columns(Query *parse,
 
        foreach(gl, parse->groupClause)
        {
-               GroupClause *grpcl = (GroupClause *) lfirst(gl);
-               Node       *groupexpr = get_sortgroupclause_expr(grpcl, tlist);
-               TargetEntry *te = NULL;
-               List       *sl;
+               GroupClause             *grpcl = (GroupClause *) lfirst(gl);
+               Node                    *groupexpr = get_sortgroupclause_expr(grpcl, tlist);
+               TargetEntry             *te = NULL;
+               ListCell                *sl;
 
                foreach(sl, sub_tlist)
                {
@@ -1534,7 +1534,8 @@ locate_grouping_columns(Query *parse,
 static List *
 postprocess_setop_tlist(List *new_tlist, List *orig_tlist)
 {
-       List       *l;
+       ListCell   *l;
+       ListCell   *orig_tlist_item = list_head(orig_tlist);
 
        foreach(l, new_tlist)
        {
@@ -1545,16 +1546,16 @@ postprocess_setop_tlist(List *new_tlist, List *orig_tlist)
                if (new_tle->resdom->resjunk)
                        continue;
 
-               Assert(orig_tlist != NIL);
-               orig_tle = (TargetEntry *) lfirst(orig_tlist);
-               orig_tlist = lnext(orig_tlist);
+               Assert(orig_tlist_item != NULL);
+               orig_tle = (TargetEntry *) lfirst(orig_tlist_item);
+               orig_tlist_item = lnext(orig_tlist_item);
                if (orig_tle->resdom->resjunk)  /* should not happen */
                        elog(ERROR, "resjunk output columns are not implemented");
                Assert(new_tle->resdom->resno == orig_tle->resdom->resno);
                Assert(new_tle->resdom->restype == orig_tle->resdom->restype);
                new_tle->resdom->ressortgroupref = orig_tle->resdom->ressortgroupref;
        }
-       if (orig_tlist != NIL)
+       if (orig_tlist_item != NULL)
                elog(ERROR, "resjunk output columns are not implemented");
        return new_tlist;
 }
index 84b2aa82805e26120b0f1c036f6bdce8c4aeb76c..b8fe70e9350d05e3db47ef51c3182135fe79f93a 100644 (file)
@@ -9,7 +9,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/optimizer/plan/setrefs.c,v 1.101 2004/05/11 13:15:15 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/optimizer/plan/setrefs.c,v 1.102 2004/05/26 04:41:24 neilc Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -84,7 +84,7 @@ static void set_sa_opfuncid(ScalarArrayOpExpr *opexpr);
 void
 set_plan_references(Plan *plan, List *rtable)
 {
-       List       *pl;
+       ListCell *l;
 
        if (plan == NULL)
                return;
@@ -213,15 +213,14 @@ set_plan_references(Plan *plan, List *rtable)
                        fix_expr_references(plan, ((Result *) plan)->resconstantqual);
                        break;
                case T_Append:
-
                        /*
                         * Append, like Sort et al, doesn't actually evaluate its
-                        * targetlist or quals, and we haven't bothered to give it its
-                        * own tlist copy.      So, don't fix targetlist/qual. But do
-                        * recurse into child plans.
+                        * targetlist or quals, and we haven't bothered to give it
+                        * its own tlist copy. So, don't fix targetlist/qual. But
+                        * do recurse into child plans.
                         */
-                       foreach(pl, ((Append *) plan)->appendplans)
-                               set_plan_references((Plan *) lfirst(pl), rtable);
+                       foreach(l, ((Append *) plan)->appendplans)
+                               set_plan_references((Plan *) lfirst(l), rtable);
                        break;
                default:
                        elog(ERROR, "unrecognized node type: %d",
@@ -242,9 +241,9 @@ set_plan_references(Plan *plan, List *rtable)
        set_plan_references(plan->lefttree, rtable);
        set_plan_references(plan->righttree, rtable);
 
-       foreach(pl, plan->initPlan)
+       foreach(l, plan->initPlan)
        {
-               SubPlan    *sp = (SubPlan *) lfirst(pl);
+               SubPlan    *sp = (SubPlan *) lfirst(l);
 
                Assert(IsA(sp, SubPlan));
                set_plan_references(sp->plan, sp->rtable);
@@ -440,8 +439,8 @@ set_uppernode_references(Plan *plan, Index subvarno)
 {
        Plan       *subplan = plan->lefttree;
        List       *subplan_targetlist,
-                          *output_targetlist,
-                          *l;
+                          *output_targetlist;
+       ListCell   *l;
        bool            tlist_has_non_vars;
 
        if (subplan != NULL)
@@ -483,7 +482,7 @@ set_uppernode_references(Plan *plan, Index subvarno)
 static bool
 targetlist_has_non_vars(List *tlist)
 {
-       List       *l;
+       ListCell   *l;
 
        foreach(l, tlist)
        {
index af33da1184e8d74d45ca3434262ea8d42cceee75..9245da803e2cb2b875aeb1ad0542449be42e2eb3 100644 (file)
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/optimizer/plan/subselect.c,v 1.89 2004/05/11 13:15:15 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/optimizer/plan/subselect.c,v 1.90 2004/05/26 04:41:24 neilc Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -101,7 +101,7 @@ static Param *
 replace_outer_var(Var *var)
 {
        Param      *retval;
-       List       *ppl;
+       ListCell   *ppl;
        PlannerParamItem *pitem;
        Index           abslevel;
        int                     i;
@@ -250,7 +250,6 @@ make_subplan(SubLink *slink, List *lefthand, bool isTopQual)
        Plan       *plan;
        Bitmapset  *tmpset;
        int                     paramid;
-       List       *lst;
        Node       *result;
 
        /*
@@ -348,7 +347,7 @@ make_subplan(SubLink *slink, List *lefthand, bool isTopQual)
        }
        else if (node->parParam == NIL && slink->subLinkType == EXPR_SUBLINK)
        {
-               TargetEntry *te = lfirst(plan->targetlist);
+               TargetEntry *te = linitial(plan->targetlist);
                Param      *prm;
 
                Assert(!te->resdom->resjunk);
@@ -359,7 +358,7 @@ make_subplan(SubLink *slink, List *lefthand, bool isTopQual)
        }
        else if (node->parParam == NIL && slink->subLinkType == ARRAY_SUBLINK)
        {
-               TargetEntry *te = lfirst(plan->targetlist);
+               TargetEntry *te = linitial(plan->targetlist);
                Oid                     arraytype;
                Param      *prm;
 
@@ -395,11 +394,12 @@ make_subplan(SubLink *slink, List *lefthand, bool isTopQual)
                        result = (Node *) (node->useOr ? make_orclause(exprs) :
                                                           make_andclause(exprs));
                else
-                       result = (Node *) lfirst(exprs);
+                       result = (Node *) linitial(exprs);
        }
        else
        {
                List       *args;
+               ListCell   *l;
 
                /*
                 * We can't convert subplans of ALL_SUBLINK or ANY_SUBLINK types
@@ -471,9 +471,9 @@ make_subplan(SubLink *slink, List *lefthand, bool isTopQual)
                 * Make node->args from parParam.
                 */
                args = NIL;
-               foreach(lst, node->parParam)
+               foreach(l, node->parParam)
                {
-                       PlannerParamItem *pitem = nth(lfirsti(lst), PlannerParamList);
+                       PlannerParamItem *pitem = nth(lfirsti(l), PlannerParamList);
 
                        /*
                         * The Var or Aggref has already been adjusted to have the
@@ -509,15 +509,17 @@ convert_sublink_opers(List *lefthand, List *operOids,
                                          List **righthandIds)
 {
        List       *result = NIL;
-       List       *lst;
+       ListCell   *l, *lefthand_item, *tlist_item;
 
        *righthandIds = NIL;
+       lefthand_item = list_head(lefthand);
+       tlist_item = list_head(targetlist);
 
-       foreach(lst, operOids)
+       foreach(l, operOids)
        {
-               Oid                     opid = lfirsto(lst);
-               Node       *leftop = lfirst(lefthand);
-               TargetEntry *te = lfirst(targetlist);
+               Oid                     opid = lfirsto(l);
+               Node       *leftop = (Node *) lfirst(lefthand_item);
+               TargetEntry *te = (TargetEntry *) lfirst(tlist_item);
                Node       *rightop;
                Operator        tup;
 
@@ -574,8 +576,8 @@ convert_sublink_opers(List *lefthand, List *operOids,
 
                ReleaseSysCache(tup);
 
-               lefthand = lnext(lefthand);
-               targetlist = lnext(targetlist);
+               lefthand_item = lnext(lefthand_item);
+               tlist_item = lnext(tlist_item);
        }
 
        return result;
@@ -591,7 +593,7 @@ static bool
 subplan_is_hashable(SubLink *slink, SubPlan *node)
 {
        double          subquery_size;
-       List       *opids;
+       ListCell   *l;
 
        /*
         * The sublink type must be "= ANY" --- that is, an IN operator. (We
@@ -602,7 +604,7 @@ subplan_is_hashable(SubLink *slink, SubPlan *node)
        if (slink->subLinkType != ANY_SUBLINK)
                return false;
        if (length(slink->operName) != 1 ||
-               strcmp(strVal(lfirst(slink->operName)), "=") != 0)
+               strcmp(strVal(linitial(slink->operName)), "=") != 0)
                return false;
 
        /*
@@ -636,9 +638,9 @@ subplan_is_hashable(SubLink *slink, SubPlan *node)
         * different sets of operators with the hash table, but there is no
         * obvious usefulness to that at present.)
         */
-       foreach(opids, slink->operOids)
+       foreach(l, slink->operOids)
        {
-               Oid                     opid = lfirsto(opids);
+               Oid                     opid = lfirsto(l);
                HeapTuple       tup;
                Form_pg_operator optup;
 
@@ -690,7 +692,7 @@ convert_IN_to_join(Query *parse, SubLink *sublink)
        if (sublink->subLinkType != ANY_SUBLINK)
                return NULL;
        if (length(sublink->operName) != 1 ||
-               strcmp(strVal(lfirst(sublink->operName)), "=") != 0)
+               strcmp(strVal(linitial(sublink->operName)), "=") != 0)
                return NULL;
 
        /*
@@ -859,8 +861,8 @@ process_sublinks_mutator(Node *node, bool *isTopQual)
         */
        if (and_clause(node))
        {
-               List   *newargs = NIL;
-               List   *l;
+               List            *newargs = NIL;
+               ListCell        *l;
 
                /* Still at qual top-level */
                locTopQual = *isTopQual;
@@ -884,8 +886,8 @@ process_sublinks_mutator(Node *node, bool *isTopQual)
 
        if (or_clause(node))
        {
-               List   *newargs = NIL;
-               List   *l;
+               List            *newargs = NIL;
+               ListCell        *l;
 
                foreach(l, ((BoolExpr *) node)->args)
                {
@@ -918,7 +920,7 @@ SS_finalize_plan(Plan *plan, List *rtable)
        Bitmapset  *outer_params = NULL;
        Bitmapset  *valid_params = NULL;
        int                     paramid;
-       List       *lst;
+       ListCell   *l;
 
        /*
         * First, scan the param list to discover the sets of params that are
@@ -926,9 +928,9 @@ SS_finalize_plan(Plan *plan, List *rtable)
         * this once to save time in the per-plan recursion steps.
         */
        paramid = 0;
-       foreach(lst, PlannerParamList)
+       foreach(l, PlannerParamList)
        {
-               PlannerParamItem *pitem = (PlannerParamItem *) lfirst(lst);
+               PlannerParamItem *pitem = (PlannerParamItem *) lfirst(l);
 
                if (pitem->abslevel < PlannerQueryLevel)
                {
@@ -966,7 +968,6 @@ finalize_plan(Plan *plan, List *rtable,
                          Bitmapset *outer_params, Bitmapset *valid_params)
 {
        finalize_primnode_context context;
-       List       *lst;
 
        if (plan == NULL)
                return NULL;
@@ -1033,14 +1034,18 @@ finalize_plan(Plan *plan, List *rtable,
                        break;
 
                case T_Append:
-                       foreach(lst, ((Append *) plan)->appendplans)
                        {
-                               context.paramids =
-                                       bms_add_members(context.paramids,
-                                                                       finalize_plan((Plan *) lfirst(lst),
-                                                                                                 rtable,
-                                                                                                 outer_params,
-                                                                                                 valid_params));
+                               ListCell *l;
+
+                               foreach(l, ((Append *) plan)->appendplans)
+                               {
+                                       context.paramids =
+                                               bms_add_members(context.paramids,
+                                                                               finalize_plan((Plan *) lfirst(l),
+                                                                                                         rtable,
+                                                                                                         outer_params,
+                                                                                                         valid_params));
+                               }
                        }
                        break;
 
index 0ddf1ccd67f2b8dbd1188b5e5d44fd7e0ce66d96..f916d54602d9b9aff14f8df78e006b415d18cc51 100644 (file)
@@ -16,7 +16,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/optimizer/prep/prepjointree.c,v 1.17 2004/05/10 22:44:45 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/optimizer/prep/prepjointree.c,v 1.18 2004/05/26 04:41:26 neilc Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -97,11 +97,11 @@ pull_up_IN_clauses(Query *parse, Node *node)
        if (and_clause(node))
        {
                List       *newclauses = NIL;
-               List       *oldclauses;
+               ListCell   *l;
 
-               foreach(oldclauses, ((BoolExpr *) node)->args)
+               foreach(l, ((BoolExpr *) node)->args)
                {
-                       Node       *oldclause = lfirst(oldclauses);
+                       Node       *oldclause = (Node *) lfirst(l);
 
                        newclauses = lappend(newclauses,
                                                                 pull_up_IN_clauses(parse,
@@ -162,7 +162,7 @@ pull_up_subqueries(Query *parse, Node *jtnode, bool below_outer_join)
                {
                        int                     rtoffset;
                        List       *subtlist;
-                       List       *rt;
+                       ListCell   *rt;
 
                        /*
                         * Need a modifiable copy of the subquery to hack on.  Even if
@@ -314,7 +314,7 @@ pull_up_subqueries(Query *parse, Node *jtnode, bool below_outer_join)
        else if (IsA(jtnode, FromExpr))
        {
                FromExpr   *f = (FromExpr *) jtnode;
-               List       *l;
+               ListCell   *l;
 
                foreach(l, f->fromlist)
                        lfirst(l) = pull_up_subqueries(parse, lfirst(l),
@@ -447,7 +447,7 @@ is_simple_subquery(Query *subquery)
 static bool
 has_nullable_targetlist(Query *subquery)
 {
-       List       *l;
+       ListCell   *l;
 
        foreach(l, subquery->targetList)
        {
@@ -488,7 +488,7 @@ resolvenew_in_jointree(Node *jtnode, int varno,
        else if (IsA(jtnode, FromExpr))
        {
                FromExpr   *f = (FromExpr *) jtnode;
-               List       *l;
+               ListCell   *l;
 
                foreach(l, f->fromlist)
                        resolvenew_in_jointree(lfirst(l), varno, rte, subtlist);
@@ -588,7 +588,7 @@ reduce_outer_joins_pass1(Node *jtnode)
        else if (IsA(jtnode, FromExpr))
        {
                FromExpr   *f = (FromExpr *) jtnode;
-               List       *l;
+               ListCell   *l;
 
                foreach(l, f->fromlist)
                {
@@ -653,8 +653,8 @@ reduce_outer_joins_pass2(Node *jtnode,
        else if (IsA(jtnode, FromExpr))
        {
                FromExpr   *f = (FromExpr *) jtnode;
-               List       *l;
-               List       *s;
+               ListCell   *l;
+               ListCell   *s;
                Relids          pass_nonnullable;
 
                /* Scan quals to see if we can add any nonnullability constraints */
@@ -662,15 +662,14 @@ reduce_outer_joins_pass2(Node *jtnode,
                pass_nonnullable = bms_add_members(pass_nonnullable,
                                                                                   nonnullable_rels);
                /* And recurse --- but only into interesting subtrees */
-               s = state->sub_states;
-               foreach(l, f->fromlist)
+               Assert(length(f->fromlist) == length(state->sub_states));
+               forboth(l, f->fromlist, s, state->sub_states)
                {
                        reduce_outer_joins_state *sub_state = lfirst(s);
 
                        if (sub_state->contains_outer)
                                reduce_outer_joins_pass2(lfirst(l), sub_state, parse,
                                                                                 pass_nonnullable);
-                       s = lnext(s);
                }
                bms_free(pass_nonnullable);
        }
@@ -679,7 +678,7 @@ reduce_outer_joins_pass2(Node *jtnode,
                JoinExpr   *j = (JoinExpr *) jtnode;
                int                     rtindex = j->rtindex;
                JoinType        jointype = j->jointype;
-               reduce_outer_joins_state *left_state = lfirst(state->sub_states);
+               reduce_outer_joins_state *left_state = linitial(state->sub_states);
                reduce_outer_joins_state *right_state = lsecond(state->sub_states);
 
                /* Can we simplify this join? */
@@ -798,7 +797,7 @@ find_nonnullable_rels(Node *node, bool top_level)
        }
        else if (IsA(node, List))
        {
-               List       *l;
+               ListCell   *l;
 
                foreach(l, (List *) node)
                {
@@ -898,7 +897,7 @@ simplify_jointree(Query *parse, Node *jtnode)
        {
                FromExpr   *f = (FromExpr *) jtnode;
                List       *newlist = NIL;
-               List       *l;
+               ListCell   *l;
 
                foreach(l, f->fromlist)
                {
@@ -918,7 +917,16 @@ simplify_jointree(Query *parse, Node *jtnode)
                                 */
                                FromExpr   *subf = (FromExpr *) child;
                                int                     childlen = length(subf->fromlist);
-                               int                     myothers = length(newlist) + length(lnext(l));
+                               int                     myothers;
+                               ListCell   *l2;
+
+                               /*
+                                * XXX: This is a quick hack, not sure of the proper
+                                * fix.
+                                */
+                               myothers = length(newlist);
+                               for_each_cell(l2, lnext(l))
+                                       myothers++;
 
                                if (childlen <= 1 ||
                                        (childlen + myothers) <= from_collapse_limit)
@@ -1022,7 +1030,7 @@ simplify_jointree(Query *parse, Node *jtnode)
 static void
 fix_in_clause_relids(List *in_info_list, int varno, Relids subrelids)
 {
-       List       *l;
+       ListCell   *l;
 
        foreach(l, in_info_list)
        {
@@ -1060,7 +1068,7 @@ get_relids_in_jointree(Node *jtnode)
        else if (IsA(jtnode, FromExpr))
        {
                FromExpr   *f = (FromExpr *) jtnode;
-               List       *l;
+               ListCell   *l;
 
                foreach(l, f->fromlist)
                {
@@ -1119,7 +1127,7 @@ find_jointree_node_for_rel(Node *jtnode, int relid)
        else if (IsA(jtnode, FromExpr))
        {
                FromExpr   *f = (FromExpr *) jtnode;
-               List       *l;
+               ListCell   *l;
 
                foreach(l, f->fromlist)
                {
index ac107aade61ad77a2e89137085d875e2441333af..1cfafe5452b1b847e2ee5baea9d10a93bea49143 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/optimizer/prep/prepqual.c,v 1.41 2003/12/30 21:49:19 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/optimizer/prep/prepqual.c,v 1.42 2004/05/26 04:41:26 neilc Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -144,7 +144,7 @@ flatten_andors_mutator(Node *node, void *context)
 static void
 flatten_andors_and_walker(FastList *out_list, List *andlist)
 {
-       List       *arg;
+       ListCell   *arg;
 
        foreach(arg, andlist)
        {
@@ -160,7 +160,7 @@ flatten_andors_and_walker(FastList *out_list, List *andlist)
 static void
 flatten_andors_or_walker(FastList *out_list, List *orlist)
 {
-       List       *arg;
+       ListCell   *arg;
 
        foreach(arg, orlist)
        {
@@ -193,7 +193,7 @@ pull_ands(List *andlist)
 static void
 pull_ands_walker(FastList *out_list, List *andlist)
 {
-       List       *arg;
+       ListCell   *arg;
 
        foreach(arg, andlist)
        {
@@ -226,7 +226,7 @@ pull_ors(List *orlist)
 static void
 pull_ors_walker(FastList *out_list, List *orlist)
 {
-       List       *arg;
+       ListCell   *arg;
 
        foreach(arg, orlist)
        {
@@ -258,7 +258,7 @@ find_nots(Expr *qual)
        if (and_clause((Node *) qual))
        {
                FastList        t_list;
-               List       *temp;
+               ListCell   *temp;
 
                FastListInit(&t_list);
                foreach(temp, ((BoolExpr *) qual)->args)
@@ -268,7 +268,7 @@ find_nots(Expr *qual)
        else if (or_clause((Node *) qual))
        {
                FastList        t_list;
-               List       *temp;
+               ListCell   *temp;
 
                FastListInit(&t_list);
                foreach(temp, ((BoolExpr *) qual)->args)
@@ -324,7 +324,7 @@ push_nots(Expr *qual)
                 *--------------------
                 */
                FastList        t_list;
-               List       *temp;
+               ListCell   *temp;
 
                FastListInit(&t_list);
                foreach(temp, ((BoolExpr *) qual)->args)
@@ -334,7 +334,7 @@ push_nots(Expr *qual)
        else if (or_clause((Node *) qual))
        {
                FastList        t_list;
-               List       *temp;
+               ListCell   *temp;
 
                FastListInit(&t_list);
                foreach(temp, ((BoolExpr *) qual)->args)
@@ -398,7 +398,7 @@ find_duplicate_ors(Expr *qual)
        if (or_clause((Node *) qual))
        {
                List       *orlist = NIL;
-               List       *temp;
+               ListCell   *temp;
 
                /* Recurse */
                foreach(temp, ((BoolExpr *) qual)->args)
@@ -412,7 +412,7 @@ find_duplicate_ors(Expr *qual)
        else if (and_clause((Node *) qual))
        {
                List       *andlist = NIL;
-               List       *temp;
+               ListCell   *temp;
 
                /* Recurse */
                foreach(temp, ((BoolExpr *) qual)->args)
@@ -441,13 +441,12 @@ process_duplicate_ors(List *orlist)
        int                     num_subclauses = 0;
        List       *winners;
        List       *neworlist;
-       List       *temp;
-       List       *temp2;
+       ListCell   *temp;
 
        if (orlist == NIL)
                return NULL;                    /* probably can't happen */
-       if (lnext(orlist) == NIL)
-               return lfirst(orlist);  /* single-expression OR (can this happen?) */
+       if (length(orlist) == 1)        /* single-expression OR (can this happen?) */
+               return linitial(orlist);
 
        /*
         * Choose the shortest AND clause as the reference list --- obviously,
@@ -457,7 +456,7 @@ process_duplicate_ors(List *orlist)
         */
        foreach(temp, orlist)
        {
-               Expr       *clause = lfirst(temp);
+               Expr       *clause = (Expr *) lfirst(temp);
 
                if (and_clause((Node *) clause))
                {
@@ -489,12 +488,13 @@ process_duplicate_ors(List *orlist)
        winners = NIL;
        foreach(temp, reference)
        {
-               Expr       *refclause = lfirst(temp);
+               Expr       *refclause = (Expr *) lfirst(temp);
                bool            win = true;
+               ListCell   *temp2;
 
                foreach(temp2, orlist)
                {
-                       Expr       *clause = lfirst(temp2);
+                       Expr       *clause = (Expr *) lfirst(temp2);
 
                        if (and_clause((Node *) clause))
                        {
@@ -537,7 +537,7 @@ process_duplicate_ors(List *orlist)
        neworlist = NIL;
        foreach(temp, orlist)
        {
-               Expr       *clause = lfirst(temp);
+               Expr       *clause = (Expr *) lfirst(temp);
 
                if (and_clause((Node *) clause))
                {
@@ -546,8 +546,8 @@ process_duplicate_ors(List *orlist)
                        subclauses = set_difference(subclauses, winners);
                        if (subclauses != NIL)
                        {
-                               if (lnext(subclauses) == NIL)
-                                       neworlist = lappend(neworlist, lfirst(subclauses));
+                               if (length(subclauses) == 1)
+                                       neworlist = lappend(neworlist, linitial(subclauses));
                                else
                                        neworlist = lappend(neworlist, make_andclause(subclauses));
                        }
@@ -577,8 +577,8 @@ process_duplicate_ors(List *orlist)
         */
        if (neworlist != NIL)
        {
-               if (lnext(neworlist) == NIL)
-                       winners = lappend(winners, lfirst(neworlist));
+               if (length(neworlist) == 1)
+                       winners = lappend(winners, linitial(neworlist));
                else
                        winners = lappend(winners, make_orclause(pull_ors(neworlist)));
        }
@@ -587,8 +587,8 @@ process_duplicate_ors(List *orlist)
         * And return the constructed AND clause, again being wary of a single
         * element and AND/OR flatness.
         */
-       if (lnext(winners) == NIL)
-               return (Expr *) lfirst(winners);
+       if (length(winners) == 1)
+               return (Expr *) linitial(winners);
        else
                return make_andclause(pull_ands(winners));
 }
index 86a14cacd8080344b9082d6da38989ceb69cbf39..89df7bca35a2fc9be493359752a07f4dc3cbd58b 100644 (file)
@@ -15,7 +15,7 @@
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/optimizer/prep/preptlist.c,v 1.66 2003/11/29 19:51:51 pgsql Exp $
+ *       $PostgreSQL: pgsql/src/backend/optimizer/prep/preptlist.c,v 1.67 2004/05/26 04:41:26 neilc Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -122,10 +122,13 @@ expand_targetlist(List *tlist, int command_type,
                                  Index result_relation, List *range_table)
 {
        List       *new_tlist = NIL;
+       ListCell   *tlist_item;
        Relation        rel;
        int                     attrno,
                                numattrs;
 
+       tlist_item = list_head(tlist);
+
        /*
         * The rewriter should have already ensured that the TLEs are in
         * correct order; but we have to insert TLEs for any missing
@@ -143,15 +146,15 @@ expand_targetlist(List *tlist, int command_type,
                Form_pg_attribute att_tup = rel->rd_att->attrs[attrno - 1];
                TargetEntry *new_tle = NULL;
 
-               if (tlist != NIL)
+               if (tlist_item != NULL)
                {
-                       TargetEntry *old_tle = (TargetEntry *) lfirst(tlist);
+                       TargetEntry *old_tle = (TargetEntry *) lfirst(tlist_item);
                        Resdom     *resdom = old_tle->resdom;
 
                        if (!resdom->resjunk && resdom->resno == attrno)
                        {
                                new_tle = old_tle;
-                               tlist = lnext(tlist);
+                               tlist_item = lnext(tlist_item);
                        }
                }
 
@@ -259,9 +262,9 @@ expand_targetlist(List *tlist, int command_type,
         * an UPDATE in a table with dropped columns, or an inheritance child
         * table with extra columns.)
         */
-       while (tlist)
+       while (tlist_item)
        {
-               TargetEntry *old_tle = (TargetEntry *) lfirst(tlist);
+               TargetEntry *old_tle = (TargetEntry *) lfirst(tlist_item);
                Resdom     *resdom = old_tle->resdom;
 
                if (!resdom->resjunk)
@@ -275,7 +278,7 @@ expand_targetlist(List *tlist, int command_type,
                }
                new_tlist = lappend(new_tlist, old_tle);
                attrno++;
-               tlist = lnext(tlist);
+               tlist_item = lnext(tlist_item);
        }
 
        heap_close(rel, AccessShareLock);
index 25dfc2611e8ab9466ba31a2b750fd2d3c4f7d3b2..41809bd69e0636d766f57a6b5998a4543b149f48 100644 (file)
@@ -14,7 +14,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/optimizer/prep/prepunion.c,v 1.110 2004/05/11 22:43:55 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/optimizer/prep/prepunion.c,v 1.111 2004/05/26 04:41:26 neilc Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -420,15 +420,19 @@ generate_setop_tlist(List *colTypes, int flag,
 {
        List       *tlist = NIL;
        int                     resno = 1;
-       List       *i;
+       ListCell   *i,
+                          *j,
+                          *k;
        Resdom     *resdom;
        Node       *expr;
 
+       j = list_head(input_tlist);
+       k = list_head(refnames_tlist);
        foreach(i, colTypes)
        {
                Oid                     colType = lfirsto(i);
-               TargetEntry *inputtle = (TargetEntry *) lfirst(input_tlist);
-               TargetEntry *reftle = (TargetEntry *) lfirst(refnames_tlist);
+               TargetEntry *inputtle = (TargetEntry *) lfirst(j);
+               TargetEntry *reftle = (TargetEntry *) lfirst(k);
                int32           colTypmod;
 
                Assert(inputtle->resdom->resno == resno);
@@ -476,8 +480,8 @@ generate_setop_tlist(List *colTypes, int flag,
                                                        pstrdup(reftle->resdom->resname),
                                                        false);
                tlist = lappend(tlist, makeTargetEntry(resdom, (Expr *) expr));
-               input_tlist = lnext(input_tlist);
-               refnames_tlist = lnext(refnames_tlist);
+               j = lnext(j);
+               k = lnext(k);
        }
 
        if (flag >= 0)
@@ -518,11 +522,12 @@ generate_append_tlist(List *colTypes, bool flag,
 {
        List       *tlist = NIL;
        int                     resno = 1;
-       List       *curColType;
+       ListCell   *curColType;
+       ListCell   *ref_tl_item;
        int                     colindex;
        Resdom     *resdom;
        Node       *expr;
-       List       *planl;
+       ListCell   *planl;
        int32      *colTypmods;
 
        /*
@@ -536,9 +541,9 @@ generate_append_tlist(List *colTypes, bool flag,
        foreach(planl, input_plans)
        {
                Plan       *subplan = (Plan *) lfirst(planl);
-               List       *subtlist;
+               ListCell   *subtlist;
 
-               curColType = colTypes;
+               curColType = list_head(colTypes);
                colindex = 0;
                foreach(subtlist, subplan->targetlist)
                {
@@ -546,11 +551,11 @@ generate_append_tlist(List *colTypes, bool flag,
 
                        if (subtle->resdom->resjunk)
                                continue;
-                       Assert(curColType != NIL);
-                       if (subtle->resdom->restype == lfirsto(curColType))
+                       Assert(curColType != NULL);
+                       if (subtle->resdom->restype == lfirst_oid(curColType))
                        {
                                /* If first subplan, copy the typmod; else compare */
-                               if (planl == input_plans)
+                               if (planl == list_head(input_plans))
                                        colTypmods[colindex] = subtle->resdom->restypmod;
                                else if (subtle->resdom->restypmod != colTypmods[colindex])
                                        colTypmods[colindex] = -1;
@@ -563,18 +568,18 @@ generate_append_tlist(List *colTypes, bool flag,
                        curColType = lnext(curColType);
                        colindex++;
                }
-               Assert(curColType == NIL);
+               Assert(curColType == NULL);
        }
 
        /*
         * Now we can build the tlist for the Append.
         */
        colindex = 0;
-       foreach(curColType, colTypes)
+       forboth(curColType, colTypes, ref_tl_item, refnames_tlist)
        {
                Oid                     colType = lfirsto(curColType);
                int32           colTypmod = colTypmods[colindex++];
-               TargetEntry *reftle = (TargetEntry *) lfirst(refnames_tlist);
+               TargetEntry *reftle = (TargetEntry *) lfirst(ref_tl_item);
 
                Assert(reftle->resdom->resno == resno);
                Assert(!reftle->resdom->resjunk);
@@ -589,7 +594,6 @@ generate_append_tlist(List *colTypes, bool flag,
                                                        pstrdup(reftle->resdom->resname),
                                                        false);
                tlist = lappend(tlist, makeTargetEntry(resdom, (Expr *) expr));
-               refnames_tlist = lnext(refnames_tlist);
        }
 
        if (flag)
@@ -623,11 +627,12 @@ generate_append_tlist(List *colTypes, bool flag,
 static bool
 tlist_same_datatypes(List *tlist, List *colTypes, bool junkOK)
 {
-       List       *i;
+       ListCell   *l;
+       ListCell   *curColType = list_head(colTypes);
 
-       foreach(i, tlist)
+       foreach(l, tlist)
        {
-               TargetEntry *tle = (TargetEntry *) lfirst(i);
+               TargetEntry *tle = (TargetEntry *) lfirst(l);
 
                if (tle->resdom->resjunk)
                {
@@ -636,14 +641,14 @@ tlist_same_datatypes(List *tlist, List *colTypes, bool junkOK)
                }
                else
                {
-                       if (colTypes == NIL)
+                       if (curColType == NULL)
                                return false;
-                       if (tle->resdom->restype != lfirsto(colTypes))
+                       if (tle->resdom->restype != lfirst_oid(curColType))
                                return false;
-                       colTypes = lnext(colTypes);
+                       curColType = lnext(curColType);
                }
        }
-       if (colTypes != NIL)
+       if (curColType != NULL)
                return false;
        return true;
 }
@@ -667,10 +672,10 @@ find_all_inheritors(Oid parentrel)
         */
        while (unexamined_relids != NIL)
        {
-               Oid                     currentrel = lfirsto(unexamined_relids);
+               Oid                     currentrel = linitial_oid(unexamined_relids);
                List       *currentchildren;
 
-               unexamined_relids = lnext(unexamined_relids);
+               unexamined_relids = list_delete_first(unexamined_relids);
                examined_relids = lappendo(examined_relids, currentrel);
                currentchildren = find_inheritance_children(currentrel);
 
@@ -719,7 +724,7 @@ expand_inherited_rtentry(Query *parse, Index rti, bool dup_parent)
        Oid                     parentOID;
        List       *inhOIDs;
        List       *inhRTIs;
-       List       *l;
+       ListCell   *l;
 
        /* Does RT entry allow inheritance? */
        if (!rte->inh)
@@ -739,7 +744,7 @@ expand_inherited_rtentry(Query *parse, Index rti, bool dup_parent)
         * case.  This could happen despite above has_subclass() check, if
         * table once had a child but no longer does.
         */
-       if (lnext(inhOIDs) == NIL)
+       if (length(inhOIDs) < 2)
                return NIL;
        /* OK, it's an inheritance set; expand it */
        if (dup_parent)
@@ -1020,7 +1025,7 @@ static List *
 adjust_inherited_tlist(List *tlist, Oid old_relid, Oid new_relid)
 {
        bool            changed_it = false;
-       List       *tl;
+       ListCell   *tl;
        List       *new_tlist;
        bool            more;
        int                     attrno;
index 4dabbf50dac8a2b2a7d1d9e7c28776412381a074..0727bfb6f2c0f10fbe0007bdc4f9298a69ebe0eb 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/optimizer/util/clauses.c,v 1.170 2004/05/10 22:44:45 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/optimizer/util/clauses.c,v 1.171 2004/05/26 04:41:27 neilc Exp $
  *
  * HISTORY
  *       AUTHOR                        DATE                    MAJOR EVENT
@@ -114,7 +114,7 @@ get_leftop(Expr *clause)
        OpExpr     *expr = (OpExpr *) clause;
 
        if (expr->args != NIL)
-               return lfirst(expr->args);
+               return linitial(expr->args);
        else
                return NULL;
 }
@@ -130,8 +130,8 @@ get_rightop(Expr *clause)
 {
        OpExpr     *expr = (OpExpr *) clause;
 
-       if (expr->args != NIL && lnext(expr->args) != NIL)
-               return lfirst(lnext(expr->args));
+       if (list_length(expr->args) >= 2)
+               return lsecond(expr->args);
        else
                return NULL;
 }
@@ -176,7 +176,7 @@ make_notclause(Expr *notclause)
 Expr *
 get_notclausearg(Expr *notclause)
 {
-       return lfirst(((BoolExpr *) notclause)->args);
+       return linitial(((BoolExpr *) notclause)->args);
 }
 
 /*****************************************************************************
@@ -278,8 +278,8 @@ make_ands_explicit(List *andclauses)
 {
        if (andclauses == NIL)
                return (Expr *) makeBoolConst(true, false);
-       else if (lnext(andclauses) == NIL)
-               return (Expr *) lfirst(andclauses);
+       else if (length(andclauses) == 1)
+               return (Expr *) linitial(andclauses);
        else
                return make_andclause(andclauses);
 }
@@ -595,7 +595,7 @@ contain_mutable_functions_walker(Node *node, void *context)
        if (IsA(node, SubLink))
        {
                SubLink    *sublink = (SubLink *) node;
-               List       *opid;
+               ListCell   *opid;
 
                foreach(opid, sublink->operOids)
                {
@@ -678,7 +678,7 @@ contain_volatile_functions_walker(Node *node, void *context)
        if (IsA(node, SubLink))
        {
                SubLink    *sublink = (SubLink *) node;
-               List       *opid;
+               ListCell   *opid;
 
                foreach(opid, sublink->operOids)
                {
@@ -848,7 +848,7 @@ pull_constant_clauses(List *quals, List **constantQual)
 {
        FastList        constqual,
                                restqual;
-       List       *q;
+       ListCell   *q;
 
        FastListInit(&constqual);
        FastListInit(&restqual);
@@ -882,7 +882,7 @@ pull_constant_clauses(List *quals, List **constantQual)
 bool
 has_distinct_on_clause(Query *query)
 {
-       List       *targetList;
+       ListCell   *l;
 
        /* Is there a DISTINCT clause at all? */
        if (query->distinctClause == NIL)
@@ -901,9 +901,9 @@ has_distinct_on_clause(Query *query)
         * This code assumes that the DISTINCT list is valid, ie, all its entries
         * match some entry of the tlist.
         */
-       foreach(targetList, query->targetList)
+       foreach(l, query->targetList)
        {
-               TargetEntry *tle = (TargetEntry *) lfirst(targetList);
+               TargetEntry *tle = (TargetEntry *) lfirst(l);
 
                if (tle->resdom->ressortgroupref == 0)
                {
@@ -998,8 +998,8 @@ CommuteClause(OpExpr *clause)
        clause->opfuncid = InvalidOid;
        /* opresulttype and opretset are assumed not to change */
 
-       temp = lfirst(clause->args);
-       lfirst(clause->args) = lsecond(clause->args);
+       temp = linitial(clause->args);
+       linitial(clause->args) = lsecond(clause->args);
        lsecond(clause->args) = temp;
 }
 
@@ -1162,7 +1162,7 @@ eval_const_expressions_mutator(Node *node, List *active_fns)
        {
                DistinctExpr *expr = (DistinctExpr *) node;
                List       *args;
-               List       *arg;
+               ListCell   *arg;
                bool            has_null_input = false;
                bool            all_null_input = true;
                bool            has_nonconst_input = false;
@@ -1281,8 +1281,8 @@ eval_const_expressions_mutator(Node *node, List *active_fns)
                                        if (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 (length(newargs) == 1)
+                                               return (Node *) linitial(newargs);
                                        /* Else we still need an OR node */
                                        return (Node *) make_orclause(newargs);
                                }
@@ -1302,16 +1302,16 @@ eval_const_expressions_mutator(Node *node, List *active_fns)
                                        if (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 (length(newargs) == 1)
+                                               return (Node *) linitial(newargs);
                                        /* Else we still need an AND node */
                                        return (Node *) make_andclause(newargs);
                                }
                        case NOT_EXPR:
                                Assert(length(args) == 1);
-                               if (IsA(lfirst(args), Const))
+                               if (IsA(linitial(args), Const))
                                {
-                                       Const *const_input = (Const *) lfirst(args);
+                                       Const *const_input = (Const *) linitial(args);
 
                                        /* NOT NULL => NULL */
                                        if (const_input->constisnull)
@@ -1320,13 +1320,13 @@ eval_const_expressions_mutator(Node *node, List *active_fns)
                                        return makeBoolConst(!DatumGetBool(const_input->constvalue),
                                                                                 false);
                                }
-                               else if (not_clause((Node *) lfirst(args)))
+                               else if (not_clause((Node *) linitial(args)))
                                {
                                        /* Cancel NOT/NOT */
-                                       return (Node *) get_notclausearg((Expr *) lfirst(args));
+                                       return (Node *) get_notclausearg((Expr *) linitial(args));
                                }
                                /* Else we still need a NOT node */
-                               return (Node *) make_notclause((Expr *) lfirst(args));
+                               return (Node *) make_notclause((Expr *) linitial(args));
                        default:
                                elog(ERROR, "unrecognized boolop: %d",
                                         (int) expr->boolop);
@@ -1414,7 +1414,7 @@ eval_const_expressions_mutator(Node *node, List *active_fns)
                FastList        newargs;
                Node       *defresult;
                Const      *const_input;
-               List       *arg;
+               ListCell   *arg;
 
                /* Simplify the test expression, if any */
                newarg = eval_const_expressions_mutator((Node *) caseexpr->arg,
@@ -1480,7 +1480,7 @@ eval_const_expressions_mutator(Node *node, List *active_fns)
                ArrayExpr  *newarray;
                bool            all_const = true;
                FastList        newelems;
-               List       *element;
+               ListCell   *element;
 
                FastListInit(&newelems);
                foreach(element, arrayexpr->elements)
@@ -1511,7 +1511,7 @@ eval_const_expressions_mutator(Node *node, List *active_fns)
                CoalesceExpr *coalesceexpr = (CoalesceExpr *) node;
                CoalesceExpr *newcoalesce;
                FastList        newargs;
-               List       *arg;
+               ListCell   *arg;
 
                FastListInit(&newargs);
                foreach(arg, coalesceexpr->args)
@@ -1614,7 +1614,7 @@ static List *
 simplify_or_arguments(List *args, bool *haveNull, bool *forceTrue)
 {
        List       *newargs = NIL;
-       List       *larg;
+       ListCell   *larg;
 
        foreach(larg, args)
        {
@@ -1675,7 +1675,7 @@ static List *
 simplify_and_arguments(List *args, bool *haveNull, bool *forceFalse)
 {
        List       *newargs = NIL;
-       List       *larg;
+       ListCell   *larg;
 
        foreach(larg, args)
        {
@@ -1774,7 +1774,7 @@ evaluate_function(Oid funcid, Oid result_type, List *args,
        Form_pg_proc funcform = (Form_pg_proc) GETSTRUCT(func_tuple);
        bool            has_nonconst_input = false;
        bool            has_null_input = false;
-       List       *arg;
+       ListCell   *arg;
        FuncExpr   *newexpr;
 
        /*
@@ -1870,7 +1870,7 @@ inline_function(Oid funcid, Oid result_type, List *args,
        Query      *querytree;
        Node       *newexpr;
        int                *usecounts;
-       List       *arg;
+       ListCell   *arg;
        int                     i;
 
        /*
@@ -1946,13 +1946,13 @@ inline_function(Oid funcid, Oid result_type, List *args,
        if (length(raw_parsetree_list) != 1)
                goto fail;
 
-       querytree_list = parse_analyze(lfirst(raw_parsetree_list),
+       querytree_list = parse_analyze(linitial(raw_parsetree_list),
                                                                   argtypes, funcform->pronargs);
 
        if (length(querytree_list) != 1)
                goto fail;
 
-       querytree = (Query *) lfirst(querytree_list);
+       querytree = (Query *) linitial(querytree_list);
 
        /*
         * The single command must be a simple "SELECT expression".
@@ -1976,7 +1976,7 @@ inline_function(Oid funcid, Oid result_type, List *args,
                length(querytree->targetList) != 1)
                goto fail;
 
-       newexpr = (Node *) ((TargetEntry *) lfirst(querytree->targetList))->expr;
+       newexpr = (Node *) ((TargetEntry *) linitial(querytree->targetList))->expr;
 
        /*
         * If the function has any arguments declared as polymorphic types,
@@ -2330,7 +2330,7 @@ expression_tree_walker(Node *node,
                                           bool (*walker) (),
                                           void *context)
 {
-       List       *temp;
+       ListCell   *temp;
 
        /*
         * The walker has already visited the current node, and so we need
@@ -2576,7 +2576,7 @@ query_tree_walker(Query *query,
                                  void *context,
                                  int flags)
 {
-       List       *rt;
+       ListCell   *rt;
 
        Assert(query != NULL && IsA(query, Query));
 
@@ -2972,7 +2972,7 @@ expression_tree_mutator(Node *node,
                                 * elements!
                                 */
                                FastList        resultlist;
-                               List       *temp;
+                               ListCell   *temp;
 
                                FastListInit(&resultlist);
                                foreach(temp, (List *) node)
@@ -3064,7 +3064,7 @@ query_tree_mutator(Query *query,
                                   int flags)
 {
        FastList        newrt;
-       List       *rt;
+       ListCell   *rt;
 
        Assert(query != NULL && IsA(query, Query));
 
index 9c207ac96efd69596d40f012073f026b5fedbcd5..7c082754c305ae49885308435e2a7dfcdbd5fc7d 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/optimizer/util/joininfo.c,v 1.37 2003/11/29 19:51:51 pgsql Exp $
+ *       $PostgreSQL: pgsql/src/backend/optimizer/util/joininfo.c,v 1.38 2004/05/26 04:41:27 neilc Exp $
  *
  *-------------------------------------------------------------------------
  */
 JoinInfo *
 find_joininfo_node(RelOptInfo *this_rel, Relids join_relids)
 {
-       List       *i;
+       ListCell   *l;
 
-       foreach(i, this_rel->joininfo)
+       foreach(l, this_rel->joininfo)
        {
-               JoinInfo   *joininfo = (JoinInfo *) lfirst(i);
+               JoinInfo   *joininfo = (JoinInfo *) lfirst(l);
 
                if (bms_equal(join_relids, joininfo->unjoined_relids))
                        return joininfo;
index 619013a18d584a73e62782e08afe6b41c9258d75..3bad7a4f6010a72484924d3d86cb208585d28192 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/optimizer/util/pathnode.c,v 1.104 2004/04/25 18:23:56 neilc Exp $
+ *       $PostgreSQL: pgsql/src/backend/optimizer/util/pathnode.c,v 1.105 2004/05/26 04:41:27 neilc Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -200,7 +200,7 @@ void
 set_cheapest(RelOptInfo *parent_rel)
 {
        List       *pathlist = parent_rel->pathlist;
-       List       *p;
+       ListCell   *p;
        Path       *cheapest_startup_path;
        Path       *cheapest_total_path;
 
@@ -209,9 +209,9 @@ set_cheapest(RelOptInfo *parent_rel)
        if (pathlist == NIL)
                elog(ERROR, "could not devise a query plan for the given query");
 
-       cheapest_startup_path = cheapest_total_path = (Path *) lfirst(pathlist);
+       cheapest_startup_path = cheapest_total_path = (Path *) linitial(pathlist);
 
-       foreach(p, lnext(pathlist))
+       for_each_cell(p, lnext(list_head(pathlist)))
        {
                Path       *path = (Path *) lfirst(p);
                int                     cmp;
@@ -269,17 +269,17 @@ add_path(RelOptInfo *parent_rel, Path *new_path)
 {
        bool            accept_new = true;              /* unless we find a superior old
                                                                                 * path */
-       List       *insert_after = NIL;         /* where to insert new item */
-       List       *p1_prev = NIL;
-       List       *p1;
+       ListCell   *insert_after = NULL;        /* where to insert new item */
+       ListCell   *p1_prev = NULL;
+       ListCell   *p1;
 
        /*
         * Loop to check proposed new path against old paths.  Note it is
         * possible for more than one old path to be tossed out because
         * new_path dominates it.
         */
-       p1 = parent_rel->pathlist;      /* cannot use foreach here */
-       while (p1 != NIL)
+       p1 = list_head(parent_rel->pathlist);   /* cannot use foreach here */
+       while (p1 != NULL)
        {
                Path       *old_path = (Path *) lfirst(p1);
                bool            remove_old = false; /* unless new proves superior */
@@ -346,15 +346,14 @@ add_path(RelOptInfo *parent_rel, Path *new_path)
                 */
                if (remove_old)
                {
-                       List       *p1_next = lnext(p1);
-
+                       parent_rel->pathlist = list_delete_cell(parent_rel->pathlist,
+                                                                                                       p1, p1_prev);
+                       /* Delete the data pointed-to by the deleted cell */
+                       pfree(old_path);
                        if (p1_prev)
-                               lnext(p1_prev) = p1_next;
+                               p1 = lnext(p1_prev);
                        else
-                               parent_rel->pathlist = p1_next;
-                       pfree(old_path);
-                       pfree(p1);                      /* this is why we can't use foreach */
-                       p1 = p1_next;
+                               p1 = list_head(parent_rel->pathlist);
                }
                else
                {
@@ -378,7 +377,7 @@ add_path(RelOptInfo *parent_rel, Path *new_path)
        {
                /* Accept the new path: insert it at proper place in pathlist */
                if (insert_after)
-                       lnext(insert_after) = lcons(new_path, lnext(insert_after));
+                       lappend_cell(parent_rel->pathlist, insert_after, new_path);
                else
                        parent_rel->pathlist = lcons(new_path, parent_rel->pathlist);
        }
@@ -508,7 +507,7 @@ AppendPath *
 create_append_path(RelOptInfo *rel, List *subpaths)
 {
        AppendPath *pathnode = makeNode(AppendPath);
-       List       *l;
+       ListCell   *l;
 
        pathnode->path.pathtype = T_Append;
        pathnode->path.parent = rel;
@@ -522,7 +521,7 @@ create_append_path(RelOptInfo *rel, List *subpaths)
        {
                Path       *subpath = (Path *) lfirst(l);
 
-               if (l == subpaths)              /* first node? */
+               if (l == list_head(subpaths))           /* first node? */
                        pathnode->path.startup_cost = subpath->startup_cost;
                pathnode->path.total_cost += subpath->total_cost;
        }
@@ -608,7 +607,7 @@ create_unique_path(Query *root, RelOptInfo *rel, Path *subpath)
        Path            agg_path;               /* dummy for result of cost_agg */
        MemoryContext oldcontext;
        List       *sub_targetlist;
-       List       *l;
+       ListCell   *l;
        int                     numCols;
 
        /* Caller made a mistake if subpath isn't cheapest_total */
@@ -783,7 +782,7 @@ is_distinct_query(Query *query)
         */
        if (query->groupClause)
        {
-               List   *gl;
+               ListCell   *gl;
 
                foreach(gl, query->groupClause)
                {
@@ -818,7 +817,7 @@ is_distinct_query(Query *query)
 static bool
 hash_safe_tlist(List *tlist)
 {
-       List       *tl;
+       ListCell   *tl;
 
        foreach(tl, tlist)
        {
index 37067dd4d42528408eba94e62a44391bb5b774b6..55b9a12d8cf7005e875cd5551b8d0d9af0cdca72 100644 (file)
@@ -9,7 +9,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/optimizer/util/plancat.c,v 1.91 2004/01/04 00:07:32 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/optimizer/util/plancat.c,v 1.92 2004/05/26 04:41:27 neilc Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -75,14 +75,14 @@ get_relation_info(Oid relationObjectId, RelOptInfo *rel)
 
        if (hasindex)
        {
-               List       *indexoidlist,
-                                  *indexoidscan;
+               List       *indexoidlist;
+               ListCell   *l;
 
                indexoidlist = RelationGetIndexList(relation);
 
-               foreach(indexoidscan, indexoidlist)
+               foreach(l, indexoidlist)
                {
-                       Oid                     indexoid = lfirsto(indexoidscan);
+                       Oid                     indexoid = lfirsto(l);
                        Relation        indexRelation;
                        Form_pg_index index;
                        IndexOptInfo *info;
@@ -384,7 +384,7 @@ has_subclass(Oid relationId)
 bool
 has_unique_index(RelOptInfo *rel, AttrNumber attno)
 {
-       List       *ilist;
+       ListCell   *ilist;
 
        foreach(ilist, rel->indexlist)
        {
index d6853ca819d08ea35f4bb58dd23e8214d422711e..8969b2d61850f7906d08e9b044927dbb9ef3bcf2 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/optimizer/util/relnode.c,v 1.56 2004/04/25 18:23:56 neilc Exp $
+ *       $PostgreSQL: pgsql/src/backend/optimizer/util/relnode.c,v 1.57 2004/05/26 04:41:27 neilc Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -47,21 +47,21 @@ static void subbuild_joinrel_joinlist(RelOptInfo *joinrel,
 void
 build_base_rel(Query *root, int relid)
 {
-       List       *rels;
+       ListCell   *l;
        RelOptInfo *rel;
 
        /* Rel should not exist already */
-       foreach(rels, root->base_rel_list)
+       foreach(l, root->base_rel_list)
        {
-               rel = (RelOptInfo *) lfirst(rels);
+               rel = (RelOptInfo *) lfirst(l);
                if (relid == rel->relid)
                        elog(ERROR, "rel already exists");
        }
 
        /* It should not exist as an "other" rel, either */
-       foreach(rels, root->other_rel_list)
+       foreach(l, root->other_rel_list)
        {
-               rel = (RelOptInfo *) lfirst(rels);
+               rel = (RelOptInfo *) lfirst(l);
                if (relid == rel->relid)
                        elog(ERROR, "rel already exists as \"other\" rel");
        }
@@ -82,21 +82,21 @@ build_base_rel(Query *root, int relid)
 RelOptInfo *
 build_other_rel(Query *root, int relid)
 {
-       List       *rels;
+       ListCell   *l;
        RelOptInfo *rel;
 
        /* Already made? */
-       foreach(rels, root->other_rel_list)
+       foreach(l, root->other_rel_list)
        {
-               rel = (RelOptInfo *) lfirst(rels);
+               rel = (RelOptInfo *) lfirst(l);
                if (relid == rel->relid)
                        return rel;
        }
 
        /* It should not exist as a base rel */
-       foreach(rels, root->base_rel_list)
+       foreach(l, root->base_rel_list)
        {
-               rel = (RelOptInfo *) lfirst(rels);
+               rel = (RelOptInfo *) lfirst(l);
                if (relid == rel->relid)
                        elog(ERROR, "rel already exists as base rel");
        }
@@ -187,19 +187,19 @@ make_base_rel(Query *root, int relid)
 RelOptInfo *
 find_base_rel(Query *root, int relid)
 {
-       List       *rels;
+       ListCell   *l;
        RelOptInfo *rel;
 
-       foreach(rels, root->base_rel_list)
+       foreach(l, root->base_rel_list)
        {
-               rel = (RelOptInfo *) lfirst(rels);
+               rel = (RelOptInfo *) lfirst(l);
                if (relid == rel->relid)
                        return rel;
        }
 
-       foreach(rels, root->other_rel_list)
+       foreach(l, root->other_rel_list)
        {
-               rel = (RelOptInfo *) lfirst(rels);
+               rel = (RelOptInfo *) lfirst(l);
                if (relid == rel->relid)
                        return rel;
        }
@@ -217,11 +217,11 @@ find_base_rel(Query *root, int relid)
 RelOptInfo *
 find_join_rel(Query *root, Relids relids)
 {
-       List       *joinrels;
+       ListCell   *l;
 
-       foreach(joinrels, root->join_rel_list)
+       foreach(l, root->join_rel_list)
        {
-               RelOptInfo *rel = (RelOptInfo *) lfirst(joinrels);
+               RelOptInfo *rel = (RelOptInfo *) lfirst(l);
 
                if (bms_equal(rel->relids, relids))
                        return rel;
@@ -363,8 +363,7 @@ static void
 build_joinrel_tlist(Query *root, RelOptInfo *joinrel)
 {
        Relids          relids = joinrel->relids;
-       List       *rels;
-       List       *vars;
+       ListCell   *rels;
 
        FastListInit(&joinrel->reltargetlist);
        joinrel->width = 0;
@@ -372,6 +371,7 @@ build_joinrel_tlist(Query *root, RelOptInfo *joinrel)
        foreach(rels, root->base_rel_list)
        {
                RelOptInfo *baserel = (RelOptInfo *) lfirst(rels);
+               ListCell   *vars;
 
                if (!bms_is_member(baserel->relid, relids))
                        continue;
@@ -481,7 +481,7 @@ subbuild_joinrel_restrictlist(RelOptInfo *joinrel,
                                                          List *joininfo_list)
 {
        List       *restrictlist = NIL;
-       List       *xjoininfo;
+       ListCell   *xjoininfo;
 
        foreach(xjoininfo, joininfo_list)
        {
@@ -515,7 +515,7 @@ static void
 subbuild_joinrel_joinlist(RelOptInfo *joinrel,
                                                  List *joininfo_list)
 {
-       List       *xjoininfo;
+       ListCell   *xjoininfo;
 
        foreach(xjoininfo, joininfo_list)
        {
index ddf965fdf2bde3569932dbf91b88dc8ef3e5bdf7..1cb446e44fa8ab7bdfcb001ae1b774760872b927 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/optimizer/util/restrictinfo.c,v 1.26 2004/02/27 21:48:04 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/optimizer/util/restrictinfo.c,v 1.27 2004/05/26 04:41:27 neilc Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -93,14 +93,14 @@ make_restrictinfo_from_indexclauses(List *indexclauses,
 {
        List       *withris = NIL;
        List       *withoutris = NIL;
-       List       *orlist;
+       ListCell   *orlist;
 
        /* Empty list probably can't happen, but here's what to do */
        if (indexclauses == NIL)
                return NIL;
        /* If single indexscan, just return the ANDed clauses */
-       if (lnext(indexclauses) == NIL)
-               return (List *) lfirst(indexclauses);
+       if (length(indexclauses) == 1)
+               return (List *) linitial(indexclauses);
        /* Else we need an OR RestrictInfo structure */
        foreach(orlist, indexclauses)
        {
@@ -206,7 +206,7 @@ make_sub_restrictinfos(Expr *clause, bool is_pushed_down,
        if (or_clause((Node *) clause))
        {
                List       *orlist = NIL;
-               List       *temp;
+               ListCell   *temp;
 
                foreach(temp, ((BoolExpr *) clause)->args)
                        orlist = lappend(orlist,
@@ -218,7 +218,7 @@ make_sub_restrictinfos(Expr *clause, bool is_pushed_down,
        else if (and_clause((Node *) clause))
        {
                List       *andlist = NIL;
-               List       *temp;
+               ListCell   *temp;
 
                foreach(temp, ((BoolExpr *) clause)->args)
                        andlist = lappend(andlist,
@@ -257,7 +257,7 @@ List *
 get_actual_clauses(List *restrictinfo_list)
 {
        List       *result = NIL;
-       List       *temp;
+       ListCell   *temp;
 
        foreach(temp, restrictinfo_list)
        {
@@ -280,7 +280,7 @@ void
 get_actual_join_clauses(List *restrictinfo_list,
                                                List **joinquals, List **otherquals)
 {
-       List       *temp;
+       ListCell   *temp;
 
        *joinquals = NIL;
        *otherquals = NIL;
@@ -317,7 +317,7 @@ remove_redundant_join_clauses(Query *root, List *restrictinfo_list,
                                                          JoinType jointype)
 {
        List       *result = NIL;
-       List       *item;
+       ListCell   *item;
        QualCost        cost;
 
        /*
@@ -380,7 +380,7 @@ select_nonredundant_join_clauses(Query *root,
                                                                 JoinType jointype)
 {
        List       *result = NIL;
-       List       *item;
+       ListCell   *item;
 
        foreach(item, restrictinfo_list)
        {
@@ -431,7 +431,7 @@ join_clause_is_redundant(Query *root,
                                                 List *reference_list,
                                                 JoinType jointype)
 {
-       List       *refitem;
+       ListCell   *refitem;
 
        /* always consider exact duplicates redundant */
        foreach(refitem, reference_list)
index 2c891c49644c72498400dc833997623ca23d8b18..cd8ced1307f798b5353a4c704c09cab86f12f86f 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/optimizer/util/tlist.c,v 1.62 2004/01/07 18:56:26 neilc Exp $
+ *       $PostgreSQL: pgsql/src/backend/optimizer/util/tlist.c,v 1.63 2004/05/26 04:41:27 neilc Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -31,7 +31,7 @@
 TargetEntry *
 tlistentry_member(Node *node, List *targetlist)
 {
-       List       *temp;
+       ListCell   *temp;
 
        foreach(temp, targetlist)
        {
@@ -138,11 +138,11 @@ List *
 add_to_flat_tlist(List *tlist, List *vars)
 {
        int                     next_resdomno = length(tlist) + 1;
-       List       *v;
+       ListCell   *v;
 
        foreach(v, vars)
        {
-               Var                *var = lfirst(v);
+               Var                *var = (Var *) lfirst(v);
 
                if (!tlistentry_member((Node *) var, tlist))
                {
@@ -173,7 +173,7 @@ get_sortgroupclause_tle(SortClause *sortClause,
                                                List *targetList)
 {
        Index           refnumber = sortClause->tleSortGroupRef;
-       List       *l;
+       ListCell   *l;
 
        foreach(l, targetList)
        {
@@ -212,7 +212,7 @@ List *
 get_sortgrouplist_exprs(List *sortClauses, List *targetList)
 {
        List       *result = NIL;
-       List       *l;
+       ListCell   *l;
 
        foreach(l, sortClauses)
        {
index 47b1fdbf70efc3c023370edb3fd201042b73f347..ecdc93ab7f516c030c39521b1d27999575defcef 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/optimizer/util/var.c,v 1.56 2004/05/10 22:44:45 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/optimizer/util/var.c,v 1.57 2004/05/26 04:41:27 neilc Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -513,9 +513,9 @@ flatten_join_alias_vars_mutator(Node *node,
                if (var->varattno == InvalidAttrNumber)
                {
                        /* Must expand whole-row reference */
-                       RowExpr *rowexpr;
-                       List    *fields = NIL;
-                       List    *l;
+                       RowExpr         *rowexpr;
+                       List            *fields = NIL;
+                       ListCell        *l;
 
                        foreach(l, rte->joinaliasvars)
                        {
index 2b1eddbcf09716e70af213abc2d11284e4267397..9da8937dc7bde08fd9f11d82a596f960d786e199 100644 (file)
@@ -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;
index b9becf91dbb908f52d0cfc966a217d2a1c8dc7a5..654341ddfe816f3fe773b79b4d9ab99f448cc31d 100644 (file)
@@ -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)
        {
index 6f85595610d5c546987d0cd1d792ef79df502195..e9c73ee946aaafa15e3a89e26860a2b477825939 100644 (file)
@@ -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;
index 2c6e99428997906ac90522481034d39d65d58ee4..610c4fa2960796efb8cbf0c118beea1180eaa30a 100644 (file)
@@ -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;
index c7a8c3c83bbd27413a33755eebe0feff19a7daff..ba3210946abf9f23b04bdca243b34cdadc98b213 100644 (file)
@@ -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
index d4a8cdcc8b64999933be2a1bb078a861927bdf75..9efebdfdb483f822275bf37b3eda4cf0c149b164 100644 (file)
@@ -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;
index 64da3bb8425d752c9ac8164a39a4f4c86b9c94b1..2b48ef488d7712d58f9050c3357e01a10e31ab18 100644 (file)
@@ -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);
index 00b4c8e513eaa1282e767da0efc1fd78325dba65..c46c27481a549533478a02049626492841c74b2c 100644 (file)
@@ -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 */
index de4bf093ee950589320113bd8bd226b7c65af991..d7d50e187e3090f9e06700a45fc1b625c4774535 100644 (file)
@@ -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)
        {
index fbee22b37d3b2ef67b9c7bc5d11561580998a401..9eaf9eb53a952ef9da65eeda82bac269cdbfe160 100644 (file)
@@ -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)
        {
index e6e8b00cda492a5601c8d0ef1865d3c70484db92..473d52399e3b136001ac4d663e16682bc39725e3 100644 (file)
@@ -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 ||
index 1cd340f978a02007881acbe3a0f20e14059d7462..685eebc577fba814dacf94531da37e28039bdc0c 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/rewrite/rewriteDefine.c,v 1.94 2004/05/18 22:49:51 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/rewrite/rewriteDefine.c,v 1.95 2004/05/26 04:41:33 neilc Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -167,7 +167,7 @@ InsertRule(char *rulname,
        if (event_qual != NULL)
        {
                /* Find query containing OLD/NEW rtable entries */
-               Query      *qry = (Query *) lfirst(action);
+               Query      *qry = (Query *) linitial(action);
 
                qry = getInsertSelectQuery(qry, NULL);
                recordDependencyOnExpr(&myself, event_qual, qry->rtable,
@@ -193,7 +193,7 @@ DefineQueryRewrite(RuleStmt *stmt)
        Oid                     ruleId;
        int                     event_attno;
        Oid                     event_attype;
-       List       *l;
+       ListCell   *l;
        Query      *query;
        AclResult       aclresult;
        bool            RelisBecomingView = false;
@@ -245,7 +245,7 @@ DefineQueryRewrite(RuleStmt *stmt)
         */
        if (event_type == CMD_SELECT)
        {
-               List       *tllist;
+               ListCell           *tllist;
                int                     i;
 
                /*
@@ -268,7 +268,7 @@ DefineQueryRewrite(RuleStmt *stmt)
                /*
                 * ... the one action must be a SELECT, ...
                 */
-               query = (Query *) lfirst(action);
+               query = (Query *) linitial(action);
                if (!is_instead || query->commandType != CMD_SELECT)
                        ereport(ERROR,
                                        (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
@@ -509,7 +509,7 @@ DefineQueryRewrite(RuleStmt *stmt)
 static void
 setRuleCheckAsUser_Query(Query *qry, AclId userid)
 {
-       List       *l;
+       ListCell   *l;
 
        /* Set all the RTEs in this query node */
        foreach(l, qry->rtable)
index 3b898b973d8ec9eb52f5c7faded630ee84af7495..9ac665449ce2647d3e95b6aa376512df4103babb 100644 (file)
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/rewrite/rewriteHandler.c,v 1.135 2004/05/10 22:44:46 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/rewrite/rewriteHandler.c,v 1.136 2004/05/26 04:41:33 neilc Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -238,13 +238,13 @@ static List *
 adjustJoinTreeList(Query *parsetree, bool removert, int rt_index)
 {
        List       *newjointree = copyObject(parsetree->jointree->fromlist);
-       List       *jjt;
+       ListCell   *l;
 
        if (removert)
        {
-               foreach(jjt, newjointree)
+               foreach(l, newjointree)
                {
-                       RangeTblRef *rtr = lfirst(jjt);
+                       RangeTblRef *rtr = lfirst(l);
 
                        if (IsA(rtr, RangeTblRef) &&
                                rtr->rtindex == rt_index)
@@ -295,7 +295,7 @@ rewriteTargetList(Query *parsetree, Relation target_relation)
        List       *new_tlist = NIL;
        int                     attrno,
                                numattrs;
-       List       *temp;
+       ListCell   *temp;
 
        /*
         * Scan the tuple description in the relation's relcache entry to make
@@ -627,7 +627,7 @@ ApplyRetrieveRule(Query *parsetree,
         * Make a modifiable copy of the view query, and recursively expand
         * any view references inside it.
         */
-       rule_action = copyObject(lfirst(rule->actions));
+       rule_action = copyObject(linitial(rule->actions));
 
        rule_action = fireRIRrules(rule_action, activeRIRs);
 
@@ -687,7 +687,7 @@ static void
 markQueryForUpdate(Query *qry, bool skipOldNew)
 {
        Index           rti = 0;
-       List       *l;
+       ListCell   *l;
 
        foreach(l, qry->rtable)
        {
@@ -865,7 +865,7 @@ fireRIRrules(Query *parsetree, List *activeRIRs)
                if (locks != NIL)
                {
                        List       *newActiveRIRs;
-                       List       *l;
+                       ListCell   *l;
 
                        if (oidMember(RelationGetRelid(rel), activeRIRs))
                                ereport(ERROR,
@@ -995,15 +995,15 @@ fireRules(Query *parsetree,
                  Query **qual_product)
 {
        List       *results = NIL;
-       List       *i;
+       ListCell   *l;
 
-       foreach(i, locks)
+       foreach(l, locks)
        {
-               RewriteRule *rule_lock = (RewriteRule *) lfirst(i);
+               RewriteRule *rule_lock = (RewriteRule *) lfirst(l);
                Node       *event_qual = rule_lock->qual;
                List       *actions = rule_lock->actions;
                QuerySource qsrc;
-               List       *r;
+               ListCell   *r;
 
                /* Determine correct QuerySource value for actions */
                if (rule_lock->isInstead)
@@ -1143,8 +1143,8 @@ RewriteQuery(Query *parsetree, List *rewrite_events)
                         */
                        if (product_queries != NIL)
                        {
-                               List       *n;
-                               rewrite_event *rev;
+                               ListCell           *n;
+                               rewrite_event  *rev;
 
                                foreach(n, rewrite_events)
                                {
@@ -1225,7 +1225,7 @@ QueryRewrite(Query *parsetree)
 {
        List       *querylist;
        List       *results = NIL;
-       List       *l;
+       ListCell   *l;
        CmdType         origCmdType;
        bool            foundOriginalQuery;
        Query      *lastInstead;
index 45b60715966e8e9931dc121fc407d4c20a38da55..4079230c0b128aceeb141cbd9e022bfee99223a1 100644 (file)
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/rewrite/rewriteManip.c,v 1.82 2004/05/10 22:44:46 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/rewrite/rewriteManip.c,v 1.83 2004/05/26 04:41:33 neilc Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -216,7 +216,6 @@ OffsetVarNodes(Node *node, int offset, int sublevels_up)
        if (node && IsA(node, Query))
        {
                Query      *qry = (Query *) node;
-               List       *l;
 
                /*
                 * If we are starting at a Query, and sublevels_up is zero, then
@@ -227,6 +226,8 @@ OffsetVarNodes(Node *node, int offset, int sublevels_up)
                 */
                if (sublevels_up == 0)
                {
+                       ListCell   *l;
+
                        if (qry->resultRelation)
                                qry->resultRelation += offset;
                        foreach(l, qry->rowMarks)
@@ -356,7 +357,6 @@ ChangeVarNodes(Node *node, int rt_index, int new_index, int sublevels_up)
        if (node && IsA(node, Query))
        {
                Query      *qry = (Query *) node;
-               List       *l;
 
                /*
                 * If we are starting at a Query, and sublevels_up is zero, then
@@ -367,6 +367,8 @@ ChangeVarNodes(Node *node, int rt_index, int new_index, int sublevels_up)
                 */
                if (sublevels_up == 0)
                {
+                       ListCell   *l;
+
                        if (qry->resultRelation == rt_index)
                                qry->resultRelation = new_index;
                        foreach(l, qry->rowMarks)
@@ -678,7 +680,7 @@ getInsertSelectQuery(Query *parsetree, Query ***subquery_ptr)
        Assert(parsetree->jointree && IsA(parsetree->jointree, FromExpr));
        if (length(parsetree->jointree->fromlist) != 1)
                elog(ERROR, "expected to find SELECT subquery");
-       rtr = (RangeTblRef *) lfirst(parsetree->jointree->fromlist);
+       rtr = (RangeTblRef *) linitial(parsetree->jointree->fromlist);
        Assert(IsA(rtr, RangeTblRef));
        selectrte = rt_fetch(rtr->rtindex, parsetree->rtable);
        selectquery = selectrte->subquery;
index 604dd9819eba0d12d6ade21e107af1417f9f220d..7a4390538b66c1bb80d877a7cae02837c3965dab 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/tcop/postgres.c,v 1.414 2004/05/23 03:50:45 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/tcop/postgres.c,v 1.415 2004/05/26 04:41:35 neilc Exp $
  *
  * NOTES
  *       this is the "main" module of the postgres backend and
@@ -428,7 +428,7 @@ pg_parse_and_rewrite(const char *query_string,      /* string to execute */
 {
        List       *raw_parsetree_list;
        List       *querytree_list;
-       List       *list_item;
+       ListCell   *list_item;
 
        /*
         * (1) parse the request string into a list of raw parse trees.
@@ -443,7 +443,7 @@ pg_parse_and_rewrite(const char *query_string,      /* string to execute */
        {
                Node       *parsetree = (Node *) lfirst(list_item);
 
-               querytree_list = nconc(querytree_list,
+               querytree_list = list_concat(querytree_list,
                                                           pg_analyze_and_rewrite(parsetree,
                                                                                                          paramTypes,
                                                                                                          numParams));
@@ -468,8 +468,8 @@ pg_parse_and_rewrite(const char *query_string,      /* string to execute */
 List *
 pg_parse_query(const char *query_string)
 {
-       List       *raw_parsetree_list,
-                          *parsetree_item;
+       List       *raw_parsetree_list;
+       ListCell   *parsetree_item;
 
        if (log_statement == LOGSTMT_ALL)
                ereport(LOG,
@@ -571,7 +571,7 @@ List *
 pg_rewrite_queries(List *querytree_list)
 {
        List       *new_list = NIL;
-       List       *list_item;
+       ListCell   *list_item;
 
        if (log_parser_stats)
                ResetUsage();
@@ -598,7 +598,7 @@ pg_rewrite_queries(List *querytree_list)
                        /* rewrite regular queries */
                        List       *rewritten = QueryRewrite(querytree);
 
-                       new_list = nconc(new_list, rewritten);
+                       new_list = list_concat(new_list, rewritten);
                }
        }
 
@@ -691,7 +691,7 @@ List *
 pg_plan_queries(List *querytrees, bool needSnapshot)
 {
        List       *plan_list = NIL;
-       List       *query_list;
+       ListCell   *query_list;
 
        foreach(query_list, querytrees)
        {
@@ -730,8 +730,8 @@ exec_simple_query(const char *query_string)
 {
        CommandDest dest = whereToSendOutput;
        MemoryContext oldcontext;
-       List       *parsetree_list,
-                          *parsetree_item;
+       List       *parsetree_list;
+       ListCell   *parsetree_item;
        struct timeval start_t,
                                stop_t;
        bool            save_log_duration = log_duration;
@@ -946,7 +946,7 @@ exec_simple_query(const char *query_string)
                         */
                        finish_xact_command();
                }
-               else if (lnext(parsetree_item) == NIL)
+               else if (lnext(parsetree_item) == NULL)
                {
                        /*
                         * If this is the last parsetree of the query string, close
@@ -1129,14 +1129,14 @@ exec_parse_message(const char *query_string,    /* string to execute */
         * is mainly to keep the protocol simple --- otherwise we'd need to
         * worry about multiple result tupdescs and things like that.
         */
-       if (length(parsetree_list) > 1)
+       if (list_length(parsetree_list) > 1)
                ereport(ERROR,
                                (errcode(ERRCODE_SYNTAX_ERROR),
                                 errmsg("cannot insert multiple commands into a prepared statement")));
 
        if (parsetree_list != NIL)
        {
-               Node       *parsetree = (Node *) lfirst(parsetree_list);
+               Node       *parsetree = (Node *) linitial(parsetree_list);
                int                     i;
 
                /*
@@ -1198,7 +1198,7 @@ exec_parse_message(const char *query_string,      /* string to execute */
                                                (errcode(ERRCODE_INDETERMINATE_DATATYPE),
                                  errmsg("could not determine data type of parameter $%d",
                                                 i + 1)));
-                       param_list = lappendo(param_list, ptype);
+                       param_list = lappend_oid(param_list, ptype);
                }
 
                if (log_parser_stats)
@@ -1342,11 +1342,11 @@ exec_bind_message(StringInfo input_message)
                                   errmsg("unnamed prepared statement does not exist")));
        }
 
-       if (numParams != length(pstmt->argtype_list))
+       if (numParams != list_length(pstmt->argtype_list))
                ereport(ERROR,
                                (errcode(ERRCODE_PROTOCOL_VIOLATION),
                                 errmsg("bind message supplies %d parameters, but prepared statement \"%s\" requires %d",
-                                       numParams, stmt_name, length(pstmt->argtype_list))));
+                                       numParams, stmt_name, list_length(pstmt->argtype_list))));
 
        /*
         * Create the portal.  Allow silent replacement of an existing portal
@@ -1374,7 +1374,7 @@ exec_bind_message(StringInfo input_message)
        if (numParams > 0)
        {
                bool            isaborted = IsAbortedTransactionBlockState();
-               List       *l;
+               ListCell   *l;
                MemoryContext oldContext;
 
                oldContext = MemoryContextSwitchTo(PortalGetHeapMemory(portal));
@@ -1385,7 +1385,7 @@ exec_bind_message(StringInfo input_message)
                i = 0;
                foreach(l, pstmt->argtype_list)
                {
-                       Oid                     ptype = lfirsto(l);
+                       Oid                     ptype = lfirst_oid(l);
                        int32           plength;
                        bool            isNull;
 
@@ -1587,9 +1587,9 @@ exec_execute_message(const char *portal_name, long max_rows)
        BeginCommand(portal->commandTag, dest);
 
        /* Check for transaction-control commands */
-       if (length(portal->parseTrees) == 1)
+       if (list_length(portal->parseTrees) == 1)
        {
-               Query      *query = (Query *) lfirst(portal->parseTrees);
+               Query      *query = (Query *) linitial(portal->parseTrees);
 
                if (query->commandType == CMD_UTILITY &&
                        query->utilityStmt != NULL &&
@@ -1690,7 +1690,7 @@ exec_describe_statement_message(const char *stmt_name)
 {
        PreparedStatement *pstmt;
        TupleDesc       tupdesc;
-       List       *l;
+       ListCell   *l;
        StringInfoData buf;
 
        /* Find prepared statement */
@@ -1713,11 +1713,11 @@ exec_describe_statement_message(const char *stmt_name)
         * First describe the parameters...
         */
        pq_beginmessage(&buf, 't'); /* parameter description message type */
-       pq_sendint(&buf, length(pstmt->argtype_list), 2);
+       pq_sendint(&buf, list_length(pstmt->argtype_list), 2);
 
        foreach(l, pstmt->argtype_list)
        {
-               Oid                     ptype = lfirsto(l);
+               Oid                     ptype = lfirst_oid(l);
 
                pq_sendint(&buf, (int) ptype, 4);
        }
@@ -1732,7 +1732,7 @@ exec_describe_statement_message(const char *stmt_name)
                List       *targetlist;
 
                if (ChoosePortalStrategy(pstmt->query_list) == PORTAL_ONE_SELECT)
-                       targetlist = ((Query *) lfirst(pstmt->query_list))->targetList;
+                       targetlist = ((Query *) linitial(pstmt->query_list))->targetList;
                else
                        targetlist = NIL;
                SendRowDescriptionMessage(tupdesc, targetlist, NULL);
@@ -1766,7 +1766,7 @@ exec_describe_portal_message(const char *portal_name)
                List       *targetlist;
 
                if (portal->strategy == PORTAL_ONE_SELECT)
-                       targetlist = ((Query *) lfirst(portal->parseTrees))->targetList;
+                       targetlist = ((Query *) linitial(portal->parseTrees))->targetList;
                else
                        targetlist = NIL;
                SendRowDescriptionMessage(portal->tupDesc, targetlist,
@@ -2524,17 +2524,19 @@ PostgresMain(int argc, char *argv[], const char *username)
         */
        if (MyProcPort != NULL)
        {
-               List       *gucopts = MyProcPort->guc_options;
+               ListCell   *gucopts = list_head(MyProcPort->guc_options);
 
                while (gucopts)
                {
-                       char       *name,
-                                          *value;
+                       char *name;
+                       char *value;
 
                        name = lfirst(gucopts);
                        gucopts = lnext(gucopts);
+
                        value = lfirst(gucopts);
                        gucopts = lnext(gucopts);
+
                        SetConfigOption(name, value, PGC_BACKEND, PGC_S_CLIENT);
                }
 
index c213182ad1f34891e29afcd33655bf8fd180988b..2608588234cc88bdf686c3f35bcdb03096341243 100644 (file)
@@ -8,10 +8,11 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/tcop/pquery.c,v 1.77 2004/03/21 22:29:11 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/tcop/pquery.c,v 1.78 2004/05/26 04:41:35 neilc Exp $
  *
  *-------------------------------------------------------------------------
  */
+
 #include "postgres.h"
 
 #include "executor/executor.h"
@@ -200,9 +201,9 @@ ChoosePortalStrategy(List *parseTrees)
 
        strategy = PORTAL_MULTI_QUERY;          /* default assumption */
 
-       if (length(parseTrees) == 1)
+       if (list_length(parseTrees) == 1)
        {
-               Query      *query = (Query *) lfirst(parseTrees);
+               Query      *query = (Query *) linitial(parseTrees);
 
                if (query->commandType == CMD_SELECT &&
                        query->canSetTag &&
@@ -267,8 +268,8 @@ PortalStart(Portal portal, ParamListInfo params)
                         * Create QueryDesc in portal's context; for the moment, set
                         * the destination to None.
                         */
-                       queryDesc = CreateQueryDesc((Query *) lfirst(portal->parseTrees),
-                                                                         (Plan *) lfirst(portal->planTrees),
+                       queryDesc = CreateQueryDesc((Query *) linitial(portal->parseTrees),
+                                                                               (Plan *) linitial(portal->planTrees),
                                                                                None_Receiver,
                                                                                params,
                                                                                false);
@@ -304,7 +305,7 @@ PortalStart(Portal portal, ParamListInfo params)
                         * will take care of it.
                         */
                        portal->tupDesc =
-                               UtilityTupleDescriptor(((Query *) lfirst(portal->parseTrees))->utilityStmt);
+                               UtilityTupleDescriptor(((Query *) linitial(portal->parseTrees))->utilityStmt);
 
                        /*
                         * Reset cursor position data to "start of query"
@@ -473,7 +474,7 @@ PortalRun(Portal portal, long count,
 
                                PortalCreateHoldStore(portal);
                                treceiver = CreateDestReceiver(Tuplestore, portal);
-                               PortalRunUtility(portal, lfirst(portal->parseTrees),
+                               PortalRunUtility(portal, linitial(portal->parseTrees),
                                                                 treceiver, NULL);
                                (*treceiver->rDestroy) (treceiver);
                                portal->portalUtilReady = true;
@@ -800,8 +801,8 @@ PortalRunMulti(Portal portal,
                           DestReceiver *dest, DestReceiver *altdest,
                           char *completionTag)
 {
-       List       *plantree_list = portal->planTrees;
-       List       *querylist_item;
+       ListCell   *planlist_item = list_head(portal->planTrees);
+       ListCell   *querylist_item;
 
        /*
         * If the destination is RemoteExecute, change to None.  The reason is
@@ -825,9 +826,9 @@ PortalRunMulti(Portal portal,
        foreach(querylist_item, portal->parseTrees)
        {
                Query      *query = (Query *) lfirst(querylist_item);
-               Plan       *plan = (Plan *) lfirst(plantree_list);
+               Plan       *plan = (Plan *) lfirst(planlist_item);
 
-               plantree_list = lnext(plantree_list);
+               planlist_item = lnext(planlist_item);
 
                /*
                 * If we got a cancel signal in prior command, quit
@@ -885,7 +886,7 @@ PortalRunMulti(Portal portal,
                 * Increment command counter between queries, but not after the
                 * last one.
                 */
-               if (plantree_list != NIL)
+               if (planlist_item != NULL)
                        CommandCounterIncrement();
 
                /*
index bcf071ea8a0635bbd5a11aa3328a6d8d4846e9af..fd9427c203d4f415978eb32f848625afe2452239 100644 (file)
@@ -10,7 +10,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/tcop/utility.c,v 1.215 2004/05/07 19:12:26 neilc Exp $
+ *       $PostgreSQL: pgsql/src/backend/tcop/utility.c,v 1.216 2004/05/26 04:41:35 neilc Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -331,7 +331,7 @@ ProcessUtility(Node *parsetree,
 
                                                        if (stmt->options)
                                                        {
-                                                               List       *head;
+                                                               ListCell   *head;
 
                                                                foreach(head, stmt->options)
                                                                {
@@ -339,10 +339,10 @@ ProcessUtility(Node *parsetree,
 
                                                                        if (strcmp(item->defname, "transaction_isolation") == 0)
                                                                                SetPGVariable("transaction_isolation",
-                                                                                       makeList1(item->arg), false);
+                                                                                       list_make1(item->arg), false);
                                                                        else if (strcmp(item->defname, "transaction_read_only") == 0)
                                                                                SetPGVariable("transaction_read_only",
-                                                                                       makeList1(item->arg), false);
+                                                                                       list_make1(item->arg), false);
                                                                }
                                                        }
                                                }
@@ -405,7 +405,7 @@ ProcessUtility(Node *parsetree,
                case T_DropStmt:
                        {
                                DropStmt   *stmt = (DropStmt *) parsetree;
-                               List       *arg;
+                               ListCell   *arg;
 
                                foreach(arg, stmt->objects)
                                {
@@ -743,7 +743,7 @@ ProcessUtility(Node *parsetree,
                                 */
                                if (strcmp(n->name, "TRANSACTION") == 0)
                                {
-                                       List       *head;
+                                       ListCell   *head;
 
                                        foreach(head, n->args)
                                        {
@@ -751,15 +751,15 @@ ProcessUtility(Node *parsetree,
 
                                                if (strcmp(item->defname, "transaction_isolation") == 0)
                                                        SetPGVariable("transaction_isolation",
-                                                                         makeList1(item->arg), n->is_local);
+                                                                         list_make1(item->arg), n->is_local);
                                                else if (strcmp(item->defname, "transaction_read_only") == 0)
                                                        SetPGVariable("transaction_read_only",
-                                                                         makeList1(item->arg), n->is_local);
+                                                                         list_make1(item->arg), n->is_local);
                                        }
                                }
                                else if (strcmp(n->name, "SESSION CHARACTERISTICS") == 0)
                                {
-                                       List       *head;
+                                       ListCell   *head;
 
                                        foreach(head, n->args)
                                        {
@@ -767,10 +767,10 @@ ProcessUtility(Node *parsetree,
 
                                                if (strcmp(item->defname, "transaction_isolation") == 0)
                                                        SetPGVariable("default_transaction_isolation",
-                                                                         makeList1(item->arg), n->is_local);
+                                                                         list_make1(item->arg), n->is_local);
                                                else if (strcmp(item->defname, "transaction_read_only") == 0)
                                                        SetPGVariable("default_transaction_read_only",
-                                                                         makeList1(item->arg), n->is_local);
+                                                                         list_make1(item->arg), n->is_local);
                                        }
                                }
                                else
index 0bd8658b9f32132d6d1be0f669848bd0cf20d633..bb34667c4d3c972d51e6c7adb736a7cbec7f2ec1 100644 (file)
@@ -14,7 +14,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/utils/adt/name.c,v 1.50 2003/11/29 19:51:59 pgsql Exp $
+ *       $PostgreSQL: pgsql/src/backend/utils/adt/name.c,v 1.51 2004/05/26 04:41:37 neilc Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -342,7 +342,8 @@ current_schema(PG_FUNCTION_ARGS)
 
        if (search_path == NIL)
                PG_RETURN_NULL();
-       nspname = get_namespace_name(lfirsto(search_path));
+       nspname = get_namespace_name(linitial_oid(search_path));
+       list_free(search_path);
        if (!nspname)
                PG_RETURN_NULL();               /* recently-deleted namespace? */
        PG_RETURN_DATUM(DirectFunctionCall1(namein, CStringGetDatum(nspname)));
@@ -352,25 +353,27 @@ Datum
 current_schemas(PG_FUNCTION_ARGS)
 {
        List       *search_path = fetch_search_path(PG_GETARG_BOOL(0));
+       ListCell   *l;
        Datum      *names;
        int                     i;
        ArrayType  *array;
 
        /* +1 here is just to avoid palloc(0) error */
+
        names = (Datum *) palloc((length(search_path) + 1) * sizeof(Datum));
        i = 0;
-       while (search_path)
+       foreach(l, search_path)
        {
                char       *nspname;
 
-               nspname = get_namespace_name(lfirsto(search_path));
+               nspname = get_namespace_name(lfirst_oid(l));
                if (nspname)                    /* watch out for deleted namespace */
                {
                        names[i] = DirectFunctionCall1(namein, CStringGetDatum(nspname));
                        i++;
                }
-               search_path = lnext(search_path);
        }
+       list_free(search_path);
 
        array = construct_array(names, i,
                                                        NAMEOID,
index fe2e7aa6cf86095f9d113c3c692a07ed216466de..9c688401ece6d3a92359cd939f37099fe18a655c 100644 (file)
@@ -13,7 +13,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/utils/adt/regproc.c,v 1.87 2004/05/07 00:24:58 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/utils/adt/regproc.c,v 1.88 2004/05/26 04:41:37 neilc Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -1099,7 +1099,7 @@ stringToQualifiedNameList(const char *string, const char *caller)
        char       *rawname;
        List       *result = NIL;
        List       *namelist;
-       List       *l;
+       ListCell   *l;
 
        /* We need a modifiable copy of the input string. */
        rawname = pstrdup(string);
index 47384fbb89fd1286601d0c1f67f5a44ecf3952a0..9e3a06cd822329517ec6b8a63918c0191d788977 100644 (file)
@@ -17,7 +17,7 @@
  *
  * Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group
  *
- * $PostgreSQL: pgsql/src/backend/utils/adt/ri_triggers.c,v 1.67 2004/02/03 17:34:03 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/utils/adt/ri_triggers.c,v 1.68 2004/05/26 04:41:38 neilc Exp $
  *
  * ----------
  */
@@ -2571,8 +2571,8 @@ RI_Initial_Check(FkConstraint *fkconstraint, Relation rel, Relation pkrel)
        char            attname[MAX_QUOTED_NAME_LEN];
        char            fkattname[MAX_QUOTED_NAME_LEN];
        const char *sep;
-       List            *list;
-       List            *list2;
+       ListCell        *l;
+       ListCell        *l2;
        int                     old_work_mem;
        char            workmembuf[32];
        int                     spi_result;
@@ -2605,9 +2605,9 @@ RI_Initial_Check(FkConstraint *fkconstraint, Relation rel, Relation pkrel)
 
        sprintf(querystr, "SELECT ");
        sep="";
-       foreach(list, fkconstraint->fk_attrs)
+       foreach(l, fkconstraint->fk_attrs)
        {
-               quoteOneName(attname, strVal(lfirst(list)));
+               quoteOneName(attname, strVal(lfirst(l)));
                snprintf(querystr + strlen(querystr), sizeof(querystr) - strlen(querystr),
                                 "%sfk.%s", sep, attname);
                sep = ", ";
@@ -2620,12 +2620,10 @@ RI_Initial_Check(FkConstraint *fkconstraint, Relation rel, Relation pkrel)
                         relname, pkrelname);
 
        sep="";
-       for (list=fkconstraint->pk_attrs, list2=fkconstraint->fk_attrs; 
-                list != NIL && list2 != NIL; 
-                list=lnext(list), list2=lnext(list2))
+       forboth(l, fkconstraint->pk_attrs, l2, fkconstraint->fk_attrs)
        {
-               quoteOneName(attname, strVal(lfirst(list)));
-               quoteOneName(fkattname, strVal(lfirst(list2)));
+               quoteOneName(attname, strVal(lfirst(l)));
+               quoteOneName(fkattname, strVal(lfirst(l2)));
                snprintf(querystr + strlen(querystr), sizeof(querystr) - strlen(querystr),
                                 "%spk.%s=fk.%s",
                                 sep, attname, fkattname);
@@ -2635,14 +2633,14 @@ RI_Initial_Check(FkConstraint *fkconstraint, Relation rel, Relation pkrel)
         * It's sufficient to test any one pk attribute for null to detect a
         * join failure.
         */
-       quoteOneName(attname, strVal(lfirst(fkconstraint->pk_attrs)));
+       quoteOneName(attname, strVal(linitial(fkconstraint->pk_attrs)));
        snprintf(querystr + strlen(querystr), sizeof(querystr) - strlen(querystr),
                         ") WHERE pk.%s IS NULL AND (", attname);
 
        sep="";
-       foreach(list, fkconstraint->fk_attrs)
+       foreach(l, fkconstraint->fk_attrs)
        {
-               quoteOneName(attname, strVal(lfirst(list)));
+               quoteOneName(attname, strVal(lfirst(l)));
                snprintf(querystr + strlen(querystr), sizeof(querystr) - strlen(querystr),
                                 "%sfk.%s IS NOT NULL",
                                 sep, attname);
index 95e457c261fb2ae25db0b91e2e4865c58584b611..213dc61202ba768731b7cee7de45087f2de1d0bb 100644 (file)
@@ -3,7 +3,7 @@
  *                             back to source text
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/utils/adt/ruleutils.c,v 1.166 2004/05/10 22:44:46 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/utils/adt/ruleutils.c,v 1.167 2004/05/26 04:41:38 neilc Exp $
  *
  *       This software is copyrighted by Jan Wieck - Hamburg.
  *
@@ -627,6 +627,7 @@ pg_get_indexdef_worker(Oid indexrelid, int colno, int prettyFlags)
        Form_pg_class idxrelrec;
        Form_pg_am      amrec;
        List       *indexprs;
+       ListCell   *indexpr_item;
        List       *context;
        Oid                     indrelid;
        int                     keyno;
@@ -691,6 +692,8 @@ pg_get_indexdef_worker(Oid indexrelid, int colno, int prettyFlags)
        else
                indexprs = NIL;
 
+       indexpr_item = list_head(indexprs);
+
        context = deparse_context_for(get_rel_name(indrelid), indrelid);
 
        /*
@@ -733,10 +736,10 @@ pg_get_indexdef_worker(Oid indexrelid, int colno, int prettyFlags)
                        /* expressional index */
                        Node       *indexkey;
 
-                       if (indexprs == NIL)
+                       if (indexpr_item == NULL)
                                elog(ERROR, "too few entries in indexprs list");
-                       indexkey = (Node *) lfirst(indexprs);
-                       indexprs = lnext(indexprs);
+                       indexkey = (Node *) lfirst(indexpr_item);
+                       indexpr_item = lnext(indexpr_item);
                        /* Deparse */
                        str = deparse_expression_pretty(indexkey, context, false, false,
                                                                                        prettyFlags, 0);
@@ -1358,7 +1361,7 @@ deparse_context_for_subplan(const char *name, List *tlist,
        List       *attrs = NIL;
        int                     nattrs = 0;
        int                     rtablelength = length(rtable);
-       List       *tl;
+       ListCell   *tl;
        char            buf[32];
 
        foreach(tl, tlist)
@@ -1526,7 +1529,7 @@ make_ruledef(StringInfo buf, HeapTuple ruletup, TupleDesc rulettc,
                 * (which can only be references to OLD and NEW).  Use the rtable
                 * of the first query in the action list for this purpose.
                 */
-               query = (Query *) lfirst(actions);
+               query = (Query *) linitial(actions);
 
                /*
                 * If the action is INSERT...SELECT, OLD/NEW have been pushed down
@@ -1556,7 +1559,7 @@ make_ruledef(StringInfo buf, HeapTuple ruletup, TupleDesc rulettc,
        /* Finally the rules actions */
        if (length(actions) > 1)
        {
-               List       *action;
+               ListCell   *action;
                Query      *query;
 
                appendStringInfo(buf, "(");
@@ -1579,7 +1582,7 @@ make_ruledef(StringInfo buf, HeapTuple ruletup, TupleDesc rulettc,
        {
                Query      *query;
 
-               query = (Query *) lfirst(actions);
+               query = (Query *) linitial(actions);
                get_query_def(query, buf, NIL, NULL, prettyFlags, 0);
                appendStringInfo(buf, ";");
        }
@@ -1636,7 +1639,7 @@ make_viewdef(StringInfo buf, HeapTuple ruletup, TupleDesc rulettc,
                return;
        }
 
-       query = (Query *) lfirst(actions);
+       query = (Query *) linitial(actions);
 
        if (ev_type != '1' || ev_attr >= 0 || !is_instead ||
                strcmp(ev_qual, "<>") != 0 || query->commandType != CMD_SELECT)
@@ -1670,7 +1673,7 @@ get_query_def(Query *query, StringInfo buf, List *parentnamespace,
        deparse_namespace dpns;
 
        context.buf = buf;
-       context.namespaces = lcons(&dpns, parentnamespace);
+       context.namespaces = lcons(&dpns, list_copy(parentnamespace));
        context.varprefix = (parentnamespace != NIL ||
                                                 length(query->rtable) != 1);
        context.prettyFlags = prettyFlags;
@@ -1725,7 +1728,7 @@ get_select_query_def(Query *query, deparse_context *context,
        StringInfo      buf = context->buf;
        bool            force_colno;
        char       *sep;
-       List       *l;
+       ListCell   *l;
 
        /*
         * If the Query node has a setOperations tree, then it's the top level
@@ -1802,7 +1805,7 @@ get_basic_select_query(Query *query, deparse_context *context,
 {
        StringInfo      buf = context->buf;
        char       *sep;
-       List       *l;
+       ListCell   *l;
        int                     colno;
 
        /*
@@ -2057,7 +2060,7 @@ get_insert_query_def(Query *query, deparse_context *context)
        RangeTblEntry *select_rte = NULL;
        RangeTblEntry *rte;
        char       *sep;
-       List       *l;
+       ListCell   *l;
 
        /*
         * If it's an INSERT ... SELECT there will be a single subquery RTE
@@ -2136,10 +2139,10 @@ get_insert_query_def(Query *query, deparse_context *context)
 static void
 get_update_query_def(Query *query, deparse_context *context)
 {
-       StringInfo      buf = context->buf;
-       char       *sep;
-       RangeTblEntry *rte;
-       List       *l;
+       StringInfo               buf = context->buf;
+       char                    *sep;
+       RangeTblEntry   *rte;
+       ListCell                *l;
 
        /*
         * Start the query with UPDATE relname SET
@@ -2271,17 +2274,17 @@ static void
 get_names_for_var(Var *var, deparse_context *context,
                                  char **schemaname, char **refname, char **attname)
 {
-       List       *nslist = context->namespaces;
+       ListCell   *nslist_item = list_head(context->namespaces);
        int                     sup = var->varlevelsup;
        deparse_namespace *dpns;
        RangeTblEntry *rte;
 
        /* Find appropriate nesting depth */
-       while (sup-- > 0 && nslist != NIL)
-               nslist = lnext(nslist);
-       if (nslist == NIL)
+       while (sup-- > 0 && nslist_item != NULL)
+               nslist_item = lnext(nslist_item);
+       if (nslist_item == NULL)
                elog(ERROR, "bogus varlevelsup: %d", var->varlevelsup);
-       dpns = (deparse_namespace *) lfirst(nslist);
+       dpns = (deparse_namespace *) lfirst(nslist_item);
 
        /* Find the relevant RTE */
        if (var->varno >= 1 && var->varno <= length(dpns->rtable))
@@ -2342,13 +2345,13 @@ get_names_for_var(Var *var, deparse_context *context,
 static RangeTblEntry *
 find_rte_by_refname(const char *refname, deparse_context *context)
 {
-       RangeTblEntry *result = NULL;
-       List       *nslist;
+       RangeTblEntry  *result = NULL;
+       ListCell           *nslist;
 
        foreach(nslist, context->namespaces)
        {
                deparse_namespace *dpns = (deparse_namespace *) lfirst(nslist);
-               List       *rtlist;
+               ListCell           *rtlist;
 
                foreach(rtlist, dpns->rtable)
                {
@@ -2396,7 +2399,7 @@ get_simple_binary_op_name(OpExpr *expr)
        if (length(args) == 2)
        {
                /* binary operator */
-               Node       *arg1 = (Node *) lfirst(args);
+               Node       *arg1 = (Node *) linitial(args);
                Node       *arg2 = (Node *) lsecond(args);
                const char *op;
 
@@ -2501,7 +2504,7 @@ isSimpleNode(Node *node, Node *parentNode, int prettyFlags)
                                         * Operators are same priority --- can skip parens
                                         * only if we have (a - b) - c, not a - (b - c).
                                         */
-                                       if (node == (Node *) lfirst(((OpExpr *) parentNode)->args))
+                                       if (node == (Node *) linitial(((OpExpr *) parentNode)->args))
                                                return true;
 
                                        return false;
@@ -2759,8 +2762,8 @@ get_rule_expr(Node *node, deparse_context *context,
                                ArrayRef   *aref = (ArrayRef *) node;
                                bool            savevarprefix = context->varprefix;
                                bool            need_parens;
-                               List       *lowlist;
-                               List       *uplist;
+                               ListCell   *lowlist_item;
+                               ListCell   *uplist_item;
 
                                /*
                                 * If we are doing UPDATE array[n] = expr, we need to
@@ -2783,18 +2786,19 @@ get_rule_expr(Node *node, deparse_context *context,
                                if (need_parens)
                                        appendStringInfoChar(buf, ')');
                                context->varprefix = savevarprefix;
-                               lowlist = aref->reflowerindexpr;
-                               foreach(uplist, aref->refupperindexpr)
+                               lowlist_item = list_head(aref->reflowerindexpr);
+                               foreach(uplist_item, aref->refupperindexpr)
                                {
                                        appendStringInfo(buf, "[");
-                                       if (lowlist)
+                                       if (lowlist_item)
                                        {
-                                               get_rule_expr((Node *) lfirst(lowlist), context,
+                                               get_rule_expr((Node *) lfirst(lowlist_item), context,
                                                                          false);
                                                appendStringInfo(buf, ":");
-                                               lowlist = lnext(lowlist);
+                                               lowlist_item = lnext(lowlist_item);
                                        }
-                                       get_rule_expr((Node *) lfirst(uplist), context, false);
+                                       get_rule_expr((Node *) lfirst(uplist_item),
+                                                                 context, false);
                                        appendStringInfo(buf, "]");
                                }
                                if (aref->refassgnexpr)
@@ -2818,7 +2822,7 @@ get_rule_expr(Node *node, deparse_context *context,
                        {
                                DistinctExpr *expr = (DistinctExpr *) node;
                                List       *args = expr->args;
-                               Node       *arg1 = (Node *) lfirst(args);
+                               Node       *arg1 = (Node *) linitial(args);
                                Node       *arg2 = (Node *) lsecond(args);
 
                                if (!PRETTY_PAREN(context))
@@ -2835,7 +2839,7 @@ get_rule_expr(Node *node, deparse_context *context,
                        {
                                ScalarArrayOpExpr *expr = (ScalarArrayOpExpr *) node;
                                List       *args = expr->args;
-                               Node       *arg1 = (Node *) lfirst(args);
+                               Node       *arg1 = (Node *) linitial(args);
                                Node       *arg2 = (Node *) lsecond(args);
 
                                if (!PRETTY_PAREN(context))
@@ -2856,20 +2860,22 @@ get_rule_expr(Node *node, deparse_context *context,
                case T_BoolExpr:
                        {
                                BoolExpr   *expr = (BoolExpr *) node;
-                               List       *args = expr->args;
+                               Node       *first_arg = linitial(expr->args);
+                               ListCell   *arg = lnext(list_head(expr->args));
 
                                switch (expr->boolop)
                                {
                                        case AND_EXPR:
                                                if (!PRETTY_PAREN(context))
                                                        appendStringInfoChar(buf, '(');
-                                               get_rule_expr_paren((Node *) lfirst(args), context,
+                                               get_rule_expr_paren(first_arg, context,
                                                                                        false, node);
-                                               while ((args = lnext(args)) != NIL)
+                                               while (arg)
                                                {
                                                        appendStringInfo(buf, " AND ");
-                                                       get_rule_expr_paren((Node *) lfirst(args), context,
+                                                       get_rule_expr_paren((Node *) lfirst(arg), context,
                                                                                                false, node);
+                                                       arg = lnext(arg);
                                                }
                                                if (!PRETTY_PAREN(context))
                                                        appendStringInfoChar(buf, ')');
@@ -2878,13 +2884,14 @@ get_rule_expr(Node *node, deparse_context *context,
                                        case OR_EXPR:
                                                if (!PRETTY_PAREN(context))
                                                        appendStringInfoChar(buf, '(');
-                                               get_rule_expr_paren((Node *) lfirst(args), context,
+                                               get_rule_expr_paren(first_arg, context,
                                                                                        false, node);
-                                               while ((args = lnext(args)) != NIL)
+                                               while (arg)
                                                {
                                                        appendStringInfo(buf, " OR ");
-                                                       get_rule_expr_paren((Node *) lfirst(args), context,
+                                                       get_rule_expr_paren((Node *) lfirst(arg), context,
                                                                                                false, node);
+                                                       arg = lnext(arg);
                                                }
                                                if (!PRETTY_PAREN(context))
                                                        appendStringInfoChar(buf, ')');
@@ -2894,7 +2901,7 @@ get_rule_expr(Node *node, deparse_context *context,
                                                if (!PRETTY_PAREN(context))
                                                        appendStringInfoChar(buf, '(');
                                                appendStringInfo(buf, "NOT ");
-                                               get_rule_expr_paren((Node *) lfirst(args), context,
+                                               get_rule_expr_paren(first_arg, context,
                                                                                        false, node);
                                                if (!PRETTY_PAREN(context))
                                                        appendStringInfoChar(buf, ')');
@@ -2989,7 +2996,7 @@ get_rule_expr(Node *node, deparse_context *context,
                case T_CaseExpr:
                        {
                                CaseExpr   *caseexpr = (CaseExpr *) node;
-                               List       *temp;
+                               ListCell   *temp;
 
                                appendContextKeyword(context, "CASE",
                                                                         0, PRETTYINDENT_VAR, 0);
@@ -3035,7 +3042,7 @@ get_rule_expr(Node *node, deparse_context *context,
                case T_ArrayExpr:
                        {
                                ArrayExpr  *arrayexpr = (ArrayExpr *) node;
-                               List       *element;
+                               ListCell   *element;
                                char       *sep;
 
                                appendStringInfo(buf, "ARRAY[");
@@ -3055,7 +3062,7 @@ get_rule_expr(Node *node, deparse_context *context,
                case T_RowExpr:
                        {
                                RowExpr    *rowexpr = (RowExpr *) node;
-                               List       *arg;
+                               ListCell   *arg;
                                char       *sep;
 
                                /*
@@ -3082,7 +3089,7 @@ get_rule_expr(Node *node, deparse_context *context,
                case T_CoalesceExpr:
                        {
                                CoalesceExpr *coalesceexpr = (CoalesceExpr *) node;
-                               List       *arg;
+                               ListCell   *arg;
                                char       *sep;
 
                                appendStringInfo(buf, "COALESCE(");
@@ -3102,7 +3109,7 @@ get_rule_expr(Node *node, deparse_context *context,
                case T_NullIfExpr:
                        {
                                NullIfExpr *nullifexpr = (NullIfExpr *) node;
-                               List       *arg;
+                               ListCell   *arg;
                                char       *sep;
 
                                appendStringInfo(buf, "NULLIF(");
@@ -3239,7 +3246,7 @@ get_oper_expr(OpExpr *expr, deparse_context *context)
        if (length(args) == 2)
        {
                /* binary operator */
-               Node       *arg1 = (Node *) lfirst(args);
+               Node       *arg1 = (Node *) linitial(args);
                Node       *arg2 = (Node *) lsecond(args);
 
                get_rule_expr_paren(arg1, context, true, (Node *) expr);
@@ -3252,7 +3259,7 @@ get_oper_expr(OpExpr *expr, deparse_context *context)
        else
        {
                /* unary operator --- but which side? */
-               Node       *arg = (Node *) lfirst(args);
+               Node       *arg = (Node *) linitial(args);
                HeapTuple       tp;
                Form_pg_operator optup;
 
@@ -3298,7 +3305,7 @@ get_func_expr(FuncExpr *expr, deparse_context *context,
        Oid                     funcoid = expr->funcid;
        Oid                     argtypes[FUNC_MAX_ARGS];
        int                     nargs;
-       List       *l;
+       ListCell   *l;
        char       *sep;
 
        /*
@@ -3308,7 +3315,7 @@ get_func_expr(FuncExpr *expr, deparse_context *context,
         */
        if (expr->funcformat == COERCE_IMPLICIT_CAST && !showimplicit)
        {
-               get_rule_expr_paren((Node *) lfirst(expr->args), context,
+               get_rule_expr_paren((Node *) linitial(expr->args), context,
                                                        showimplicit, (Node *) expr);
                return;
        }
@@ -3320,7 +3327,7 @@ get_func_expr(FuncExpr *expr, deparse_context *context,
        if (expr->funcformat == COERCE_EXPLICIT_CAST ||
                expr->funcformat == COERCE_IMPLICIT_CAST)
        {
-               Node       *arg = lfirst(expr->args);
+               Node       *arg = linitial(expr->args);
                Oid                     rettype = expr->funcresulttype;
                int32           coercedTypmod;
 
@@ -3424,7 +3431,7 @@ strip_type_coercion(Node *expr, Oid resultType)
                if (exprIsLengthCoercion(expr, NULL))
                        return expr;
 
-               return (Node *) lfirst(func->args);
+               return (Node *) linitial(func->args);
        }
 
        return expr;
@@ -3580,7 +3587,7 @@ get_sublink_expr(SubLink *sublink, deparse_context *context)
 {
        StringInfo      buf = context->buf;
        Query      *query = (Query *) (sublink->subselect);
-       List       *l;
+       ListCell   *l;
        char       *sep;
        bool            need_paren;
 
@@ -3625,7 +3632,7 @@ get_sublink_expr(SubLink *sublink, deparse_context *context)
 
                case ANY_SUBLINK:
                        if (length(sublink->operName) == 1 &&
-                               strcmp(strVal(lfirst(sublink->operName)), "=") == 0)
+                               strcmp(strVal(linitial(sublink->operName)), "=") == 0)
                        {
                                /* Represent = ANY as IN */
                                appendStringInfo(buf, "IN ");
@@ -3680,7 +3687,7 @@ get_from_clause(Query *query, deparse_context *context)
 {
        StringInfo      buf = context->buf;
        bool            first = true;
-       List       *l;
+       ListCell   *l;
 
        /*
         * We use the query's jointree as a guide to what to print.  However,
@@ -3763,12 +3770,12 @@ get_from_clause_item(Node *jtnode, Query *query, deparse_context *context)
                        gavealias = true;
                        if (rte->alias->colnames != NIL && coldeflist == NIL)
                        {
-                               List       *col;
+                               ListCell   *col;
 
                                appendStringInfoChar(buf, '(');
                                foreach(col, rte->alias->colnames)
                                {
-                                       if (col != rte->alias->colnames)
+                                       if (col != list_head(rte->alias->colnames))
                                                appendStringInfo(buf, ", ");
                                        appendStringInfoString(buf,
                                                                                   quote_identifier(strVal(lfirst(col))));
@@ -3897,12 +3904,12 @@ get_from_clause_item(Node *jtnode, Query *query, deparse_context *context)
                {
                        if (j->using)
                        {
-                               List       *col;
+                               ListCell   *col;
 
                                appendStringInfo(buf, " USING (");
                                foreach(col, j->using)
                                {
-                                       if (col != j->using)
+                                       if (col != list_head(j->using))
                                                appendStringInfo(buf, ", ");
                                        appendStringInfoString(buf,
                                                                quote_identifier(strVal(lfirst(col))));
@@ -3929,12 +3936,12 @@ get_from_clause_item(Node *jtnode, Query *query, deparse_context *context)
                                                         quote_identifier(j->alias->aliasname));
                        if (j->alias->colnames != NIL)
                        {
-                               List       *col;
+                               ListCell   *col;
 
                                appendStringInfoChar(buf, '(');
                                foreach(col, j->alias->colnames)
                                {
-                                       if (col != j->alias->colnames)
+                                       if (col != list_head(j->alias->colnames))
                                                appendStringInfo(buf, ", ");
                                        appendStringInfoString(buf,
                                                                  quote_identifier(strVal(lfirst(col))));
@@ -3958,7 +3965,7 @@ static void
 get_from_clause_coldeflist(List *coldeflist, deparse_context *context)
 {
        StringInfo      buf = context->buf;
-       List       *col;
+       ListCell   *col;
        int                     i = 0;
 
        appendStringInfoChar(buf, '(');
@@ -4337,20 +4344,21 @@ generate_operator_name(Oid operid, Oid arg1, Oid arg2)
 static void
 print_operator_name(StringInfo buf, List *opname)
 {
-       int                     nnames = length(opname);
+       ListCell        *op = list_head(opname);
+       int                      nnames = length(opname);
 
        if (nnames == 1)
-               appendStringInfoString(buf, strVal(lfirst(opname)));
+               appendStringInfoString(buf, strVal(lfirst(op)));
        else
        {
                appendStringInfo(buf, "OPERATOR(");
                while (nnames-- > 1)
                {
                        appendStringInfo(buf, "%s.",
-                                                        quote_identifier(strVal(lfirst(opname))));
-                       opname = lnext(opname);
+                                                        quote_identifier(strVal(lfirst(op))));
+                       op = lnext(op);
                }
-               appendStringInfo(buf, "%s)", strVal(lfirst(opname)));
+               appendStringInfo(buf, "%s)", strVal(lfirst(op)));
        }
 }
 
index ded7260c784d1c2356dd60802a4489f52d93cff5..cd9a6444d41d90272e82f545e8b3091c8f6e7065 100644 (file)
@@ -15,7 +15,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/utils/adt/selfuncs.c,v 1.158 2004/02/27 21:44:34 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/utils/adt/selfuncs.c,v 1.159 2004/05/26 04:41:39 neilc Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -1936,7 +1936,7 @@ estimate_num_groups(Query *root, List *groupExprs, double input_rows)
        List       *allvars = NIL;
        List       *varinfos = NIL;
        double          numdistinct;
-       List       *l;
+       ListCell   *l;
        typedef struct
        {                                                       /* varinfos is a List of these */
                Var                *var;
@@ -1987,14 +1987,14 @@ estimate_num_groups(Query *root, List *groupExprs, double input_rows)
                VariableStatData vardata;
                double          ndistinct;
                bool            keep = true;
-               List       *l2;
+               ListCell   *l2;
 
                examine_variable(root, (Node *) var, 0, &vardata);
                ndistinct = get_variable_numdistinct(&vardata);
                ReleaseVariableStats(vardata);
 
                /* cannot use foreach here because of possible lremove */
-               l2 = varinfos;
+               l2 = list_head(varinfos);
                while (l2)
                {
                        MyVarInfo  *varinfo = (MyVarInfo *) lfirst(l2);
@@ -2043,7 +2043,7 @@ estimate_num_groups(Query *root, List *groupExprs, double input_rows)
 
        do
        {
-               MyVarInfo  *varinfo1 = (MyVarInfo *) lfirst(varinfos);
+               MyVarInfo  *varinfo1 = (MyVarInfo *) linitial(varinfos);
                RelOptInfo *rel = find_base_rel(root, varinfo1->var->varno);
                double          reldistinct = varinfo1->ndistinct;
                List       *newvarinfos = NIL;
@@ -2052,7 +2052,7 @@ estimate_num_groups(Query *root, List *groupExprs, double input_rows)
                 * Get the largest numdistinct estimate of the Vars for this rel.
                 * Also, construct new varinfos list of remaining Vars.
                 */
-               foreach(l, lnext(varinfos))
+               for_each_cell(l, lnext(list_head(varinfos)))
                {
                        MyVarInfo  *varinfo2 = (MyVarInfo *) lfirst(l);
 
@@ -2844,7 +2844,7 @@ get_restriction_variable(Query *root, List *args, int varRelid,
        if (length(args) != 2)
                return false;
 
-       left = (Node *) lfirst(args);
+       left = (Node *) linitial(args);
        right = (Node *) lsecond(args);
 
        /*
@@ -2895,7 +2895,7 @@ get_join_variables(Query *root, List *args,
        if (length(args) != 2)
                elog(ERROR, "join operator should take two arguments");
 
-       left = (Node *) lfirst(args);
+       left = (Node *) linitial(args);
        right = (Node *) lsecond(args);
 
        examine_variable(root, left, 0, vardata1);
@@ -3033,16 +3033,16 @@ examine_variable(Query *root, Node *node, int varRelid,
                 * different index opclasses; if so, we need to pick one that
                 * matches the operator we are estimating for.  FIXME later.
                 */
-               List       *ilist;
+               ListCell   *ilist;
 
                foreach(ilist, onerel->indexlist)
                {
                        IndexOptInfo *index = (IndexOptInfo *) lfirst(ilist);
-                       List       *indexprs;
+                       ListCell   *indexpr_item;
                        int                     pos;
 
-                       indexprs = index->indexprs;
-                       if (indexprs == NIL)
+                       indexpr_item = list_head(index->indexprs);
+                       if (indexpr_item == NULL)
                                continue;               /* no expressions here... */
 
                        /*
@@ -3058,9 +3058,9 @@ examine_variable(Query *root, Node *node, int varRelid,
                                {
                                        Node       *indexkey;
 
-                                       if (indexprs == NIL)
+                                       if (indexpr_item == NULL)
                                                elog(ERROR, "too few entries in indexprs list");
-                                       indexkey = (Node *) lfirst(indexprs);
+                                       indexkey = (Node *) lfirst(indexpr_item);
                                        if (indexkey && IsA(indexkey, RelabelType))
                                                indexkey = (Node *) ((RelabelType *) indexkey)->arg;
                                        if (equal(node, indexkey))
@@ -3081,7 +3081,7 @@ examine_variable(Query *root, Node *node, int varRelid,
                                                if (vardata->statsTuple)
                                                        break;
                                        }
-                                       indexprs = lnext(indexprs);
+                                       indexpr_item = lnext(indexpr_item);
                                }
                        }
                        if (vardata->statsTuple)
index 8433bc98c4df79dc97ee47a8c89f4347a72419bd..f8f207d72abda1a97ad5dfad15e8e57fcee3b471 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/utils/adt/tid.c,v 1.43 2004/05/07 00:24:58 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/utils/adt/tid.c,v 1.44 2004/05/26 04:41:39 neilc Exp $
  *
  * NOTES
  *       input routine largely stolen from boxin().
@@ -241,7 +241,7 @@ currtid_for_view(Relation viewrel, ItemPointer tid)
 
                        if (length(rewrite->actions) != 1)
                                elog(ERROR, "only one select rule is allowed in views");
-                       query = (Query *) lfirst(rewrite->actions);
+                       query = (Query *) linitial(rewrite->actions);
                        tle = get_tle_by_resno(query->targetList, tididx+1);
                        if (tle && tle->expr && IsA(tle->expr, Var))
                        {
index f329486321d96c8af9fe9b9e28a5196e65cb7f36..410faad692598c1ac7a85badbcc7155fad44d0fd 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/utils/adt/varlena.c,v 1.112 2004/02/21 00:34:53 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/utils/adt/varlena.c,v 1.113 2004/05/26 04:41:39 neilc Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -1623,7 +1623,7 @@ textToQualifiedNameList(text *textval, const char *caller)
        char       *rawname;
        List       *result = NIL;
        List       *namelist;
-       List       *l;
+       ListCell   *l;
 
        /* Convert to C string (handles possible detoasting). */
        /* Note we rely on being able to modify rawname below. */
index 5732e5ab4244267d363a3d509eb899a697f339ae..5e91a7283ecc0ae100a1f1da7d4124e5e463557d 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/utils/cache/catcache.c,v 1.111 2003/11/29 19:52:00 pgsql Exp $
+ *       $PostgreSQL: pgsql/src/backend/utils/cache/catcache.c,v 1.112 2004/05/26 04:41:40 neilc Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -1317,6 +1317,7 @@ SearchCatCacheList(CatCache *cache,
        CatCList   *cl;
        CatCTup    *ct;
        List       *ctlist;
+       ListCell   *ctlist_item;
        int                     nmembers;
        Relation        relation;
        SysScanDesc scandesc;
@@ -1510,15 +1511,16 @@ SearchCatCacheList(CatCache *cache,
        cl->hash_value = lHashValue;
        cl->n_members = nmembers;
        /* The list is backwards because we built it with lcons */
+       ctlist_item = list_head(ctlist);
        for (i = nmembers; --i >= 0;)
        {
-               cl->members[i] = ct = (CatCTup *) lfirst(ctlist);
+               cl->members[i] = ct = (CatCTup *) lfirst(ctlist_item);
                Assert(ct->c_list == NULL);
                ct->c_list = cl;
                /* mark list dead if any members already dead */
                if (ct->dead)
                        cl->dead = true;
-               ctlist = lnext(ctlist);
+               ctlist_item = lnext(ctlist_item);
        }
 
        DLAddHead(&cache->cc_lists, &cl->cache_elem);
index 0e4a31745fda0096218b549cd1e006c7bed8d3c5..4d8190a7b0faad1bcba88e547046b91eac5be3ea 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/utils/cache/relcache.c,v 1.202 2004/05/08 19:09:25 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/utils/cache/relcache.c,v 1.203 2004/05/26 04:41:40 neilc Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -1872,7 +1872,7 @@ RelationCacheInvalidate(void)
        Relation        relation;
        List       *rebuildFirstList = NIL;
        List       *rebuildList = NIL;
-       List       *l;
+       ListCell   *l;
 
        /* Phase 1 */
        hash_seq_init(&status, RelationIdCache);
@@ -2577,23 +2577,24 @@ RelationGetIndexList(Relation relation)
 static List *
 insert_ordered_oid(List *list, Oid datum)
 {
-       List       *l;
+       ListCell *prev;
 
        /* Does the datum belong at the front? */
-       if (list == NIL || datum < lfirsto(list))
-               return lconso(datum, list);
+       if (list == NIL || datum < linitial_oid(list))
+               return lcons_oid(datum, list);
        /* No, so find the entry it belongs after */
-       l = list;
+       prev = list_head(list);
        for (;;)
        {
-               List       *n = lnext(l);
+               ListCell *curr = lnext(prev);
 
-               if (n == NIL || datum < lfirsto(n))
-                       break;                          /* it belongs before n */
-               l = n;
+               if (curr == NULL || datum < lfirst_oid(curr))
+                       break;          /* it belongs after 'prev', before 'curr' */
+
+               prev = curr;
        }
-       /* Insert datum into list after item l */
-       lnext(l) = lconso(datum, lnext(l));
+       /* Insert datum into list after 'prev' */
+       lappend_cell_oid(list, prev, datum);
        return list;
 }
 
index 7a8e67c83c8f82944b421130b2b5db0209833239..b3ef61c2d723ccf68eee0153b65f23caf95c84f1 100644 (file)
@@ -36,7 +36,7 @@
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/utils/cache/typcache.c,v 1.5 2004/04/01 21:28:45 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/utils/cache/typcache.c,v 1.6 2004/05/26 04:41:40 neilc Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -432,7 +432,7 @@ assign_record_type_typmod(TupleDesc tupDesc)
        Oid                     hashkey[REC_HASH_KEYS];
        bool            found;
        int                     i;
-       List       *l;
+       ListCell   *l;
        int32           newtypmod;
        MemoryContext oldcxt;
 
index 75cc07a518d163ac3936677542c4ca6e12f00e47..6507891d66d932892d78a01b8e7443aad77ed2e8 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/utils/init/miscinit.c,v 1.124 2004/04/19 17:42:58 momjian Exp $
+ *       $PostgreSQL: pgsql/src/backend/utils/init/miscinit.c,v 1.125 2004/05/26 04:41:43 neilc Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -883,7 +883,7 @@ process_preload_libraries(char *preload_libraries_string)
 {
        char       *rawstring;
        List       *elemlist;
-       List       *l;
+       ListCell   *l;
 
        if (preload_libraries_string == NULL)
                return;
index 8a51e8aa0491ce565b2f45a47f9baeb7aceecbb7..1cfc3e0346b5b1b16d2783cef89432eff8132148 100644 (file)
@@ -10,7 +10,7 @@
  * Written by Peter Eisentraut <peter_e@gmx.net>.
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/utils/misc/guc.c,v 1.206 2004/05/21 05:08:03 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/utils/misc/guc.c,v 1.207 2004/05/26 04:41:43 neilc Exp $
  *
  *--------------------------------------------------------------------
  */
@@ -3290,7 +3290,7 @@ flatten_set_variable_args(const char *name, List *args)
        struct config_generic *record;
        int                     flags;
        StringInfoData buf;
-       List       *l;
+       ListCell   *l;
 
        /*
         * Fast path if just DEFAULT.  We do not check the variable name in
@@ -3310,7 +3310,7 @@ flatten_set_variable_args(const char *name, List *args)
 
        /* Complain if list input and non-list variable */
        if ((flags & GUC_LIST_INPUT) == 0 &&
-               lnext(args) != NIL)
+               list_length(args) != 1)
                ereport(ERROR,
                                (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
                                 errmsg("SET %s takes only one argument", name)));
@@ -3322,7 +3322,7 @@ flatten_set_variable_args(const char *name, List *args)
                A_Const    *arg = (A_Const *) lfirst(l);
                char       *val;
 
-               if (l != args)
+               if (l != list_head(args))
                        appendStringInfo(&buf, ", ");
 
                if (!IsA(arg, A_Const))
@@ -4430,7 +4430,7 @@ assign_log_destination(const char *value, bool doit, GucSource source)
 {
        char *rawstring;
        List *elemlist;
-       List *l;
+       ListCell *l;
        unsigned int  newlogdest = 0;
  
        /* Need a modifiable copy of string */
index 20c1b08f5c5c60b05e8cb17e56832f2a0eec3be1..6c37048229ab68b5479d3f58b8a46548f68a58e3 100644 (file)
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/nodes/nodes.h,v 1.154 2004/05/10 22:44:49 tgl Exp $
+ * $PostgreSQL: pgsql/src/include/nodes/nodes.h,v 1.155 2004/05/26 04:41:45 neilc Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -192,6 +192,8 @@ typedef enum NodeTag
         * TAGS FOR LIST NODES (pg_list.h)
         */
        T_List,
+       T_IntList,
+       T_OidList,
 
        /*
         * TAGS FOR PARSE TREE NODES (parsenodes.h)
index 31566a29c9f0a83757d341011c5f0205b61ee38e..31c90de88c92e1abeca5af0dc1c6d02912b47ce2 100644 (file)
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/nodes/pg_list.h,v 1.43 2004/01/07 18:43:36 neilc Exp $
+ * $PostgreSQL: pgsql/src/include/nodes/pg_list.h,v 1.44 2004/05/26 04:41:45 neilc Exp $
  *
  *-------------------------------------------------------------------------
  */
 
 #include "nodes/nodes.h"
 
-/* ----------------------------------------------------------------
- *                                             node definitions
- * ----------------------------------------------------------------
+/*
+ * As a temporary measure, enable the compatibility API unless the
+ * include site specifically disabled it. Once the rest of the source
+ * tree has been converted to the new API, this will be removed.
  */
+#ifndef DISABLE_LIST_COMPAT
+#define ENABLE_LIST_COMPAT
+#endif
 
-/*----------------------
- *             List node
+/*
+ * This package implements singly-linked homogeneous lists. It is
+ * important to have constant-time length, append, and prepend
+ * operations. To achieve this, we deal with two distinct data
+ * structures:
+ *
+ *             1. A set of "list cells": each cell contains a data field and
+ *                a link to the next cell in the list or NULL.
+ *             2. A single structure containing metadata about the list: the
+ *                type of the list, pointers to the head and tail cells, and
+ *                the length of the list.
  *
  * We support three types of lists:
- *     lists of pointers (in practice always pointers to Nodes, but declare as
- *             "void *" to minimize casting annoyances)
- *     lists of integers
- *     lists of Oids
  *
- * (At this writing, ints and Oids are the same size, but they may not always
- * be so; try to be careful to maintain the distinction.)
- *----------------------
+ *     T_List: lists of pointers
+ *      (in practice usually pointers to Nodes, but not always;
+ *      declared as "void *" to minimize casting annoyances)
+ *     T_IntList: lists of integers
+ *     T_OidList: lists of Oids
+ *
+ * (At the moment, ints and Oids are the same size, but they may not
+ * always be so; try to be careful to maintain the distinction.)
  */
-typedef struct List
+
+#define LIST_CELL_TYPE ListCell
+
+typedef struct ListCell ListCell;
+typedef struct List List;
+
+struct List
+{
+       NodeTag          type;  /* T_List, T_IntList, or T_OidList */
+       int                      length;
+       ListCell *head;
+       ListCell *tail;
+};
+
+struct ListCell
 {
-       NodeTag         type;
        union
        {
-               void       *ptr_value;
-               int                     int_value;
-               Oid                     oid_value;
-       }                       elem;
-       struct List *next;
-} List;
+               void    *ptr_value;
+               int              int_value;
+               Oid              oid_value;
+       } data;
+       ListCell *next;
+};
 
-#define    NIL                 ((List *) NULL)
+/*
+ * The *only* valid representation of an empty list is NIL; in other
+ * words, a non-NIL list is guaranteed to have length >= 1 and
+ * head/tail != NULL
+ */
+#define NIL                                            ((List *) NULL)
 
-/* ----------------
- *             accessor macros
- *
- * The general naming convention is that the base name xyz() is for the
- * pointer version, xyzi() is for integers, xyzo() is for Oids.  We don't
- * bother with multiple names if the same routine can handle all cases.
- * ----------------
+/*
+ * These routines are used frequently. However, we can't implement
+ * them as macros, since we want to avoid double-evaluation of macro
+ * arguments. Therefore, we implement them using GCC inline functions,
+ * and as regular functions with non-GCC compilers.
+ */
+#ifdef __GNUC__
+
+static __inline__ ListCell *
+list_head(List *l)
+{
+       return l ? l->head : NULL;
+}
+
+static __inline__ ListCell *
+list_tail(List *l)
+{
+       return l ? l->tail : NULL;
+}
+
+static __inline__ int
+list_length(List *l)
+{
+       return l ? l->length : 0;
+}
+
+#else
+
+extern ListCell *list_head(List *l);
+extern ListCell *list_tail(List *l);
+extern int list_length(List *l);
+
+#endif /* __GNUC__ */
+
+/*
+ * NB: There is an unfortunate legacy from a previous incarnation of
+ * the List API: the macro lfirst() was used to mean "the data in this
+ * cons cell". To avoid changing every usage of lfirst(), that meaning
+ * has been kept. As a result, lfirst() takes a ListCell and returns
+ * the data it contains; to get the data in the _first_ cell of a
+ * List, use linitial(). Worse, lsecond() is more closely related to
+ * linitial() than lfirst(): given a List, lsecond() returns the data
+ * in the second cons cell.
  */
 
-#define lfirst(l)                                                              ((l)->elem.ptr_value)
-#define lfirsti(l)                                                             ((l)->elem.int_value)
-#define lfirsto(l)                                                             ((l)->elem.oid_value)
+#define lnext(lc)                              ((lc)->next)
+#define lfirst(lc)                             ((lc)->data.ptr_value)
+#define lfirst_int(lc)                 ((lc)->data.int_value)
+#define lfirst_oid(lc)                 ((lc)->data.oid_value)
 
-#define lnext(l)                                                               ((l)->next)
+#define linitial(l)                            lfirst(list_head(l))
+#define linitial_int(l)                        lfirst_int(list_head(l))
+#define linitial_oid(l)                        lfirst_oid(list_head(l))
 
-#define lsecond(l)                                                             lfirst(lnext(l))
+#define lsecond(l)                             lfirst(lnext(list_head(l)))
+#define lsecond_int(l)                 lfirst_int(lnext(list_head(l)))
+#define lsecond_oid(l)                 lfirst_oid(lnext(list_head(l)))
 
-#define lthird(l)                                                              lfirst(lnext(lnext(l)))
+#define lthird(l)                              lfirst(lnext(lnext(list_head(l))))
+#define lthird_int(l)                  lfirst_int(lnext(lnext(list_head(l))))
+#define lthird_oid(l)                  lfirst_oid(lnext(lnext(list_head(l))))
 
-#define lfourth(l)                                                             lfirst(lnext(lnext(lnext(l))))
+#define lfourth(l)                             lfirst(lnext(lnext(lnext(list_head(l)))))
+#define lfourth_int(l)                 lfirst_int(lnext(lnext(lnext(list_head(l)))))
+#define lfourth_oid(l)                 lfirst_oid(lnext(lnext(lnext(list_head(l)))))
+
+/*
+ * Convenience macros for building fixed-length lists
+ */
+#define list_make1(x1)                         lcons(x1, NIL)
+#define list_make2(x1,x2)                      lcons(x1, list_make1(x2))
+#define list_make3(x1,x2,x3)           lcons(x1, list_make2(x2, x3))
+#define list_make4(x1,x2,x3,x4)                lcons(x1, list_make3(x2, x3, x4))
+
+#define list_make1_int(x1)                     lcons_int(x1, NIL)
+#define list_make2_int(x1,x2)          lcons_int(x1, list_make1_int(x2))
+#define list_make3_int(x1,x2,x3)       lcons_int(x1, list_make2_int(x2, x3))
+#define list_make4_int(x1,x2,x3,x4)    lcons_int(x1, list_make3_int(x2, x3, x4))
+
+#define list_make1_oid(x1)                     lcons_oid(x1, NIL)
+#define list_make2_oid(x1,x2)          lcons_oid(x1, list_make1_oid(x2))
+#define list_make3_oid(x1,x2,x3)       lcons_oid(x1, list_make2_oid(x2, x3))
+#define list_make4_oid(x1,x2,x3,x4)    lcons_oid(x1, list_make3_oid(x2, x3, x4))
 
 /*
  * foreach -
  *       a convenience macro which loops through the list
  */
-#define foreach(_elt_,_list_)  \
-       for (_elt_ = (_list_); _elt_ != NIL; _elt_ = lnext(_elt_))
+#define foreach(cell, l)       \
+       for ((cell) = list_head(l); (cell) != NULL; (cell) = lnext(cell))
 
 /*
- * Convenience macros for building fixed-length lists
+ * for_each_cell -
+ *       a convenience macro which loops through a list starting from a
+ *       specified cell
  */
-#define makeList1(x1)                          lcons(x1, NIL)
-#define makeList2(x1,x2)                       lcons(x1, makeList1(x2))
-#define makeList3(x1,x2,x3)                    lcons(x1, makeList2(x2,x3))
-#define makeList4(x1,x2,x3,x4)         lcons(x1, makeList3(x2,x3,x4))
+#define for_each_cell(cell, l) \
+       for ((cell) = (l); (cell) != NULL; (cell) = lnext(cell))
 
-#define makeListi1(x1)                         lconsi(x1, NIL)
-#define makeListi2(x1,x2)                      lconsi(x1, makeListi1(x2))
+/*
+ * forboth -
+ *    a convenience macro for advancing through two linked lists
+ *    simultaneously. This macro loops through both lists at the same
+ *    time, stopping when either list runs out of elements. Depending
+ *    on the requirements of the call site, it may also be wise to
+ *    ensure that the lengths of the two lists are equal.
+ */
+#define forboth(cell1, list1, cell2, list2)                                                    \
+       for ((cell1) = list_head(list1), (cell2) = list_head(list2);    \
+                (cell1) != NULL && (cell2) != NULL;                                            \
+                (cell1) = lnext(cell1), (cell2) = lnext(cell2))
 
-#define makeListo1(x1)                         lconso(x1, NIL)
-#define makeListo2(x1,x2)                      lconso(x1, makeListo1(x2))
+extern List *lappend(List *list, void *datum);
+extern List *lappend_int(List *list, int datum);
+extern List *lappend_oid(List *list, Oid datum);
+
+extern ListCell *lappend_cell(List *list, ListCell *prev, void *datum);
+extern ListCell *lappend_cell_int(List *list, ListCell *prev, int datum);
+extern ListCell *lappend_cell_oid(List *list, ListCell *prev, Oid datum);
+
+extern List *lcons(void *datum, List *list);
+extern List *lcons_int(int datum, List *list);
+extern List *lcons_oid(Oid datum, List *list);
+
+extern List *list_concat(List *list1, List *list2);
+extern List *list_truncate(List *list, int new_size);
+
+extern void *list_nth(List *list, int n);
+extern int list_nth_int(List *list, int n);
+extern Oid list_nth_oid(List *list, int n);
+
+extern bool list_member(List *list, void *datum);
+extern bool list_member_ptr(List *list, void *datum);
+extern bool list_member_int(List *list, int datum);
+extern bool list_member_oid(List *list, Oid datum);
+
+extern List *list_delete(List *list, void *datum);
+extern List *list_delete_ptr(List *list, void *datum);
+extern List *list_delete_int(List *list, int datum);
+extern List *list_delete_oid(List *list, Oid datum);
+extern List *list_delete_first(List *list);
+extern List *list_delete_cell(List *list, ListCell *cell, ListCell *prev);
+
+extern List *list_union(List *list1, List *list2);
+extern List *list_union_ptr(List *list1, List *list2);
+extern List *list_union_int(List *list1, List *list2);
+extern List *list_union_oid(List *list1, List *list2);
+
+extern List *list_difference(List *list1, List *list2);
+extern List *list_difference_ptr(List *list1, List *list2);
+extern List *list_difference_int(List *list1, List *list2);
+extern List *list_difference_oid(List *list1, List *list2);
+
+extern void list_free(List *list);
+extern void list_free_deep(List *list);
+
+extern List *list_copy(List *list);
+extern List *list_copy_tail(List *list, int nskip);
 
 /*
- * FastList is an optimization for building large lists.  The conventional
- * way to build a list is repeated lappend() operations, but that is O(N^2)
- * in the number of list items, which gets tedious for large lists.
- *
- * Note: there are some hacks in gram.y that rely on the head pointer (the
- * value-as-list) being the first field.
+ * To ease migration to the new list API, a set of compatibility
+ * macros are provided that reduce the impact of the list API changes
+ * as far as possible. Until client code has been rewritten to use the
+ * new list API, the ENABLE_LIST_COMPAT symbol can be defined before
+ * including pg_list.h
+ */
+#ifdef ENABLE_LIST_COMPAT
+
+#define lfirsti(lc)                                    lfirst_int(lc)
+#define lfirsto(lc)                                    lfirst_oid(lc)
+
+#define llast(l)                                       lfirst(list_tail(l))
+
+#define makeList1(x1)                          list_make1(x1)
+#define makeList2(x1, x2)                      list_make2(x1, x2)
+#define makeList3(x1, x2, x3)          list_make3(x1, x2, x3)
+#define makeList4(x1, x2, x3, x4)      list_make4(x1, x2, x3, x4)
+
+#define makeListi1(x1)                         list_make1_int(x1)
+#define makeListi2(x1, x2)                     list_make2_int(x1, x2)
+
+#define makeListo1(x1)                         list_make1_oid(x1)
+#define makeListo2(x1, x2)                     list_make2_oid(x1, x2)
+
+#define lconsi(datum, list)                    lcons_int(datum, list)
+#define lconso(datum, list)                    lcons_oid(datum, list)
+
+#define lappendi(list, datum)          lappend_int(list, datum)
+#define lappendo(list, datum)          lappend_oid(list, datum)
+
+#define nconc(l1, l2)                          list_concat(l1, l2)
+
+#define nth(n, list)                           list_nth(list, n)
+
+#define member(datum, list)                    list_member(list, datum)
+#define ptrMember(datum, list)         list_member_ptr(list, datum)
+#define intMember(datum, list)         list_member_int(list, datum)
+#define oidMember(datum, list)         list_member_oid(list, datum)
+
+/*
+ * Note that the old lremove() determined equality via pointer
+ * comparison, whereas the new list_delete() uses equal(); in order to
+ * keep the same behavior, we therefore need to map lremove() calls to
+ * list_delete_ptr() rather than list_delete()
+ */
+#define lremove(elem, list)                    list_delete_ptr(list, elem)
+#define LispRemove(elem, list)         list_delete(list, elem)
+#define lremovei(elem, list)           list_delete_int(list, elem)
+#define lremoveo(elem, list)           list_delete_oid(list, elem)
+
+#define ltruncate(n, list)                     list_truncate(list, n)
+
+#define set_union(l1, l2)                      list_union(l1, l2)
+#define set_uniono(l1, l2)                     list_union_oid(l1, l2)
+#define set_ptrUnion(l1, l2)           list_union_ptr(l1, l2)
+
+#define set_difference(l1, l2)         list_difference(l1, l2)
+#define set_differenceo(l1, l2)                list_difference_oid(l1, l2)
+#define set_ptrDifference(l1, l2)      list_difference_ptr(l1, l2)
+
+#define equali(l1, l2)                         equal(l1, l2)
+#define equalo(l1, l2)                         equal(l1, l2)
+
+#define freeList(list)                         list_free(list)
+
+#define listCopy(list)                         list_copy(list)
+
+extern int length(List *list);
+
+#endif
+
+/*
+ * Temporary hack: we define the FastList type whether the
+ * compatibility API is enabled or not, since this allows files that
+ * don't use the compatibility API to include headers that reference
+ * the FastList type without an error.
  */
 typedef struct FastList
 {
-       List       *head;
-       List       *tail;
+       List            *list;
 } FastList;
 
-#define FastListInit(fl)       ( (fl)->head = (fl)->tail = NIL )
-#define FastListFromList(fl, l)  \
-       ( (fl)->head = (l), (fl)->tail = llastnode((fl)->head) )
-#define FastListValue(fl)      ( (fl)->head )
+#ifdef ENABLE_LIST_COMPAT
 
-#define makeFastList1(fl, x1)  \
-       ( (fl)->head = (fl)->tail = makeList1(x1) )
-
-extern List *lcons(void *datum, List *list);
-extern List *lconsi(int datum, List *list);
-extern List *lconso(Oid datum, List *list);
-extern List *lappend(List *list, void *datum);
-extern List *lappendi(List *list, int datum);
-extern List *lappendo(List *list, Oid datum);
-extern List *nconc(List *list1, List *list2);
+extern void FastListInit(FastList *fl);
+extern void FastListFromList(FastList *fl, List *list);
+extern List *FastListValue(FastList *fl);
+extern void makeFastList1(FastList *fl, void *elem);
 extern void FastAppend(FastList *fl, void *datum);
 extern void FastAppendi(FastList *fl, int datum);
 extern void FastAppendo(FastList *fl, Oid datum);
 extern void FastConc(FastList *fl, List *cells);
-extern void FastConcFast(FastList *fl, FastList *fl2);
-extern void *nth(int n, List *l);
-extern int     length(List *list);
-extern void *llast(List *list);
-extern List *llastnode(List *list);
-extern bool member(void *datum, List *list);
-extern bool ptrMember(void *datum, List *list);
-extern bool intMember(int datum, List *list);
-extern bool oidMember(Oid datum, List *list);
-extern List *lremove(void *elem, List *list);
-extern List *LispRemove(void *elem, List *list);
-extern List *lremovei(int elem, List *list);
-extern List *ltruncate(int n, List *list);
-
-extern List *set_union(List *list1, List *list2);
-extern List *set_uniono(List *list1, List *list2);
-extern List *set_ptrUnion(List *list1, List *list2);
-extern List *set_difference(List *list1, List *list2);
-extern List *set_differenceo(List *list1, List *list2);
-extern List *set_ptrDifference(List *list1, List *list2);
-
-extern bool equali(List *list1, List *list2);
-extern bool equalo(List *list1, List *list2);
-
-extern void freeList(List *list);
-
-/* in copyfuncs.c */
-extern List *listCopy(List *list);
+extern void FastConcFast(FastList *fl1, FastList *fl2);
+
+#endif
 
 #endif   /* PG_LIST_H */
index 74427f23adbf37876af1d1d3df3c28e5cb159478..9b488c397ac7c625e9583de2b110de73b04e023a 100644 (file)
@@ -8,7 +8,7 @@
  * Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/parser/parsetree.h,v 1.23 2003/11/29 22:41:09 pgsql Exp $
+ * $PostgreSQL: pgsql/src/include/parser/parsetree.h,v 1.24 2004/05/26 04:41:46 neilc Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -16,7 +16,7 @@
 #define PARSETREE_H
 
 #include "nodes/parsenodes.h"
-#include "nodes/pg_list.h"             /* for nth(), etc */
+#include "nodes/pg_list.h"             /* for list_nth(), etc */
 
 
 /* ----------------
@@ -30,7 +30,7 @@
  * NB: this will crash and burn if handed an out-of-range RT index
  */
 #define rt_fetch(rangetable_index, rangetable) \
-       ((RangeTblEntry *) nth((rangetable_index)-1, rangetable))
+       ((RangeTblEntry *) list_nth(rangetable, (rangetable_index)-1))
 
 /*
  *             getrelid
index 3a90b4648518aa2b25d43297869d0000964a92ac..b9bb7f65ab4db2be29686ee939d17df4d5f27c04 100644 (file)
@@ -3,7 +3,7 @@
  *                       procedural language
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/pl/plpgsql/src/pl_exec.c,v 1.100 2004/05/10 22:44:49 tgl Exp $
+ *       $PostgreSQL: pgsql/src/pl/plpgsql/src/pl_exec.c,v 1.101 2004/05/26 04:41:48 neilc Exp $
  *
  *       This software is copyrighted by Jan Wieck - Hamburg.
  *
@@ -3799,7 +3799,7 @@ exec_simple_check_node(Node *node)
                case T_List:
                        {
                                List       *expr = (List *) node;
-                               List       *l;
+                               ListCell   *l;
 
                                foreach(l, expr)
                                {
@@ -3838,7 +3838,7 @@ exec_simple_check_plan(PLpgSQL_expr * expr)
        if (length(spi_plan->ptlist) != 1)
                return;
 
-       plan = (Plan *) lfirst(spi_plan->ptlist);
+       plan = (Plan *) linitial(spi_plan->ptlist);
 
        /*
         * 2. It must be a RESULT plan --> no scan's required
@@ -3865,7 +3865,7 @@ exec_simple_check_plan(PLpgSQL_expr * expr)
        if (length(plan->targetlist) != 1)
                return;
 
-       tle = (TargetEntry *) lfirst(plan->targetlist);
+       tle = (TargetEntry *) linitial(plan->targetlist);
 
        /*
         * 5. Check that all the nodes in the expression are non-scary.
index d9382aff83bd73ca423edd2f756075dce333f8fd..d30d3cd7c20bbc8a7d803836f50f3a6f2154ccbd 100644 (file)
@@ -31,7 +31,7 @@
  *       ENHANCEMENTS, OR MODIFICATIONS.
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/pl/tcl/pltcl.c,v 1.83 2004/04/01 21:28:46 tgl Exp $
+ *       $PostgreSQL: pgsql/src/pl/tcl/pltcl.c,v 1.84 2004/05/26 04:41:50 neilc Exp $
  *
  **********************************************************************/
 
@@ -1847,7 +1847,7 @@ pltcl_SPI_prepare(ClientData cdata, Tcl_Interp *interp,
        {
                char               *argcopy;
                List               *names = NIL;
-               List               *lp;
+               ListCell           *l;
                TypeName           *typename;
 
                /************************************************************
@@ -1858,8 +1858,8 @@ pltcl_SPI_prepare(ClientData cdata, Tcl_Interp *interp,
                argcopy  = pstrdup(args[i]);
                SplitIdentifierString(argcopy, '.', &names);
                typename = makeNode(TypeName);
-               foreach (lp, names)
-                       typename->names = lappend(typename->names, makeString(lfirst(lp)));
+               foreach (l, names)
+                       typename->names = lappend(typename->names, makeString(lfirst(l)));
 
                typeTup = typenameType(typename);
                qdesc->argtypes[i] = HeapTupleGetOid(typeTup);