A few minor list-related cleanups:
authorNeil Conway <neilc@samurai.com>
Mon, 27 Sep 2004 04:12:03 +0000 (04:12 +0000)
committerNeil Conway <neilc@samurai.com>
Mon, 27 Sep 2004 04:12:03 +0000 (04:12 +0000)
(1) Replace while loop with the new forboth() construct in
parser/analyze.c

(2) Replace lcons() with lappend() in SearchCatCacheList(). Since these
now have the same performance, there is no reason to prefer lcons() in
this case, and using lappend() leads to cleaner code.

(3) Improve the name of the second parameter to for_each_cell()

src/backend/parser/analyze.c
src/backend/utils/cache/catcache.c
src/include/nodes/pg_list.h

index d05be5de5d367b75726ce761ce0e3a1c6afbf72c..c3b547dd5b7fe311048e08e6c42b017ca63d597c 100644 (file)
@@ -6,7 +6,7 @@
  * Portions Copyright (c) 1996-2004, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/backend/parser/analyze.c,v 1.311 2004/08/29 05:06:44 momjian Exp $
+ * $PostgreSQL: pgsql/src/backend/parser/analyze.c,v 1.312 2004/09/27 04:12:02 neilc Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -2273,25 +2273,21 @@ getSetColTypes(ParseState *pstate, Node *node)
 static void
 applyColumnNames(List *dst, List *src)
 {
-   ListCell   *dst_item = list_head(dst);
-   ListCell   *src_item = list_head(src);
+   ListCell   *dst_item;
+   ListCell   *src_item;
 
    if (list_length(src) > list_length(dst))
        ereport(ERROR,
                (errcode(ERRCODE_SYNTAX_ERROR),
             errmsg("CREATE TABLE AS specifies too many column names")));
 
-   while (src_item != NULL && dst_item != NULL)
+   forboth(dst_item, dst, src_item, 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_item = lnext(dst_item);
-       src_item = lnext(src_item);
    }
 }
 
index b66007c069379a414eba65d8f74a4c8dfe9ca262..0a11411e9a90137b9cb728c207cb7cd6939cc15e 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *   $PostgreSQL: pgsql/src/backend/utils/cache/catcache.c,v 1.116 2004/08/29 05:06:50 momjian Exp $
+ *   $PostgreSQL: pgsql/src/backend/utils/cache/catcache.c,v 1.117 2004/09/27 04:12:02 neilc Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -1501,7 +1501,7 @@ SearchCatCacheList(CatCache *cache,
         * worth fixing.
         */
        ct->refcount++;
-       ctlist = lcons(ct, ctlist);
+       ctlist = lappend(ctlist, ct);
        nmembers++;
    }
 
@@ -1522,16 +1522,17 @@ SearchCatCacheList(CatCache *cache,
 
    cl->cl_magic = CL_MAGIC;
    cl->my_cache = cache;
-   DLInitElem(&cl->cache_elem, (void *) cl);
+   DLInitElem(&cl->cache_elem, cl);
    cl->refcount = 0;           /* for the moment */
    cl->dead = false;
    cl->ordered = ordered;
    cl->nkeys = nkeys;
    cl->hash_value = lHashValue;
    cl->n_members = nmembers;
-   /* The list is backwards because we built it with lcons */
+
+   Assert(nmembers == list_length(ctlist));
    ctlist_item = list_head(ctlist);
-   for (i = nmembers; --i >= 0;)
+   for (i = 0; i < nmembers; i++)
    {
        cl->members[i] = ct = (CatCTup *) lfirst(ctlist_item);
        Assert(ct->c_list == NULL);
index c35e7c64ba1d338e5555506711051aee59275ffc..d8957b35223cf671233919d341d6e72fa33ac0fc 100644 (file)
@@ -30,7 +30,7 @@
  * Portions Copyright (c) 1996-2004, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/nodes/pg_list.h,v 1.49 2004/08/29 05:06:57 momjian Exp $
+ * $PostgreSQL: pgsql/src/include/nodes/pg_list.h,v 1.50 2004/09/27 04:12:03 neilc Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -167,8 +167,8 @@ extern int  list_length(List *l);
  *   a convenience macro which loops through a list starting from a
  *   specified cell
  */
-#define for_each_cell(cell, l) \
-   for ((cell) = (l); (cell) != NULL; (cell) = lnext(cell))
+#define for_each_cell(cell, initcell)  \
+   for ((cell) = (initcell); (cell) != NULL; (cell) = lnext(cell))
 
 /*
  * forboth -