Make use of new list primitives list_append_unique and list_concat_unique
authorTom Lane <tgl@sss.pgh.pa.us>
Thu, 28 Jul 2005 22:27:02 +0000 (22:27 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Thu, 28 Jul 2005 22:27:02 +0000 (22:27 +0000)
where applicable.

src/backend/optimizer/path/joinrels.c
src/backend/optimizer/path/pathkeys.c
src/backend/optimizer/prep/prepunion.c
src/backend/optimizer/util/relnode.c
src/backend/parser/analyze.c
src/backend/rewrite/rewriteHandler.c
src/backend/utils/adt/acl.c
src/backend/utils/init/flatfiles.c

index f51e492eca12bede6f1b124a37cb739adf131fd1..f4f2d779b0a3587c749ec4e1bfeb6ca1352233a4 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/optimizer/path/joinrels.c,v 1.74 2005/06/09 04:18:59 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/optimizer/path/joinrels.c,v 1.75 2005/07/28 22:27:00 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -44,7 +44,6 @@ make_rels_by_joins(PlannerInfo *root, int level, List **joinrels)
 {
        List       *result_rels = NIL;
        List       *new_rels;
-       ListCell   *nr;
        ListCell   *r;
        int                     k;
 
@@ -121,13 +120,7 @@ make_rels_by_joins(PlannerInfo *root, int level, List **joinrels)
                 * for subsequent passes, do not enter the same RelOptInfo into
                 * our output list multiple times.
                 */
-               foreach(nr, new_rels)
-               {
-                       RelOptInfo *jrel = (RelOptInfo *) lfirst(nr);
-
-                       if (!list_member_ptr(result_rels, jrel))
-                               result_rels = lcons(jrel, result_rels);
-               }
+               result_rels = list_concat_unique_ptr(result_rels, new_rels);
        }
 
        /*
@@ -182,8 +175,9 @@ make_rels_by_joins(PlannerInfo *root, int level, List **joinrels)
                                                jrel = make_join_rel(root, old_rel, new_rel,
                                                                                         JOIN_INNER);
                                                /* Avoid making duplicate entries ... */
-                                               if (jrel && !list_member_ptr(result_rels, jrel))
-                                                       result_rels = lcons(jrel, result_rels);
+                                               if (jrel)
+                                                       result_rels = list_append_unique_ptr(result_rels,
+                                                                                                                                jrel);
                                        }
                                }
                        }
@@ -224,13 +218,7 @@ make_rels_by_joins(PlannerInfo *root, int level, List **joinrels)
                                                                                                         old_rel,
                                                                                                         other_rels);
 
-                       foreach(nr, new_rels)
-                       {
-                               RelOptInfo *jrel = (RelOptInfo *) lfirst(nr);
-
-                               if (!list_member_ptr(result_rels, jrel))
-                                       result_rels = lcons(jrel, result_rels);
-                       }
+                       result_rels = list_concat_unique_ptr(result_rels, new_rels);
                }
 
                /*----------
index 26ccfd9297edc313e024f5b9594091b16719e8ee..3e4bcffe2e85ab6062ae4856de5e001ad0fa04ad 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.70 2005/07/03 18:26:32 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/optimizer/path/pathkeys.c,v 1.71 2005/07/28 22:27:00 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -163,7 +163,7 @@ add_equijoined_keys(PlannerInfo *root, RestrictInfo *restrictinfo)
                                newset = list_make2(item1, item2);
 
                        /* Found a set to merge into our new set */
-                       newset = list_union(newset, curset);
+                       newset = list_concat_unique(newset, curset);
 
                        /*
                         * Remove old set from equi_key_list.
@@ -714,8 +714,7 @@ canonicalize_pathkeys(PlannerInfo *root, List *pathkeys)
                 * canonicalized the keys, so that equivalent-key knowledge is
                 * used when deciding if an item is redundant.
                 */
-               if (!list_member_ptr(new_pathkeys, cpathkey))
-                       new_pathkeys = lappend(new_pathkeys, cpathkey);
+               new_pathkeys = list_append_unique_ptr(new_pathkeys, cpathkey);
        }
        return new_pathkeys;
 }
@@ -1024,8 +1023,7 @@ build_index_pathkeys(PlannerInfo *root,
                 * Eliminate redundant ordering info; could happen if query is
                 * such that index keys are equijoined...
                 */
-               if (!list_member_ptr(retval, cpathkey))
-                       retval = lappend(retval, cpathkey);
+               retval = list_append_unique_ptr(retval, cpathkey);
 
                indexkeys++;
                ordering++;
@@ -1467,8 +1465,7 @@ make_pathkeys_for_mergeclauses(PlannerInfo *root,
                 * pathkey, a simple ptrMember test is sufficient to detect
                 * redundant keys.
                 */
-               if (!list_member_ptr(pathkeys, pathkey))
-                       pathkeys = lappend(pathkeys, pathkey);
+               pathkeys = list_append_unique_ptr(pathkeys, pathkey);
        }
 
        return pathkeys;
index 1fedd9791cada261d3ef12a433f75ba29ffed60b..0521956235e329236d4bb26e532547872022dfb9 100644 (file)
@@ -14,7 +14,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/optimizer/prep/prepunion.c,v 1.124 2005/06/10 02:21:05 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/optimizer/prep/prepunion.c,v 1.125 2005/07/28 22:27:00 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -706,21 +706,24 @@ tlist_same_datatypes(List *tlist, List *colTypes, bool junkOK)
 List *
 find_all_inheritors(Oid parentrel)
 {
-       List       *examined_relids = NIL;
-       List       *unexamined_relids = list_make1_oid(parentrel);
+       List       *rels_list;
+       ListCell   *l;
 
-       /*
-        * While the queue of unexamined relids is nonempty, remove the first
-        * element, mark it examined, and find its direct descendants. NB:
-        * cannot use foreach(), since we modify the queue inside loop.
+       /* 
+        * We build a list starting with the given rel and adding all direct and
+        * indirect children.  We can use a single list as both the record of
+        * already-found rels and the agenda of rels yet to be scanned for more
+        * children.  This is a bit tricky but works because the foreach() macro
+        * doesn't fetch the next list element until the bottom of the loop.
         */
-       while (unexamined_relids != NIL)
+       rels_list = list_make1_oid(parentrel);
+
+       foreach(l, rels_list)
        {
-               Oid                     currentrel = linitial_oid(unexamined_relids);
+               Oid                     currentrel = lfirst_oid(l);
                List       *currentchildren;
 
-               unexamined_relids = list_delete_first(unexamined_relids);
-               examined_relids = lappend_oid(examined_relids, currentrel);
+               /* Get the direct children of this rel */
                currentchildren = find_inheritance_children(currentrel);
 
                /*
@@ -730,11 +733,10 @@ find_all_inheritors(Oid parentrel)
                 * into an infinite loop, though theoretically there can't be any
                 * cycles in the inheritance graph anyway.)
                 */
-               currentchildren = list_difference_oid(currentchildren, examined_relids);
-               unexamined_relids = list_union_oid(unexamined_relids, currentchildren);
+               rels_list = list_concat_unique_oid(rels_list, currentchildren);
        }
 
-       return examined_relids;
+       return rels_list;
 }
 
 /*
index d66796d5cce0c8012642015f2b8c6fdb5f850cab..e595749c2912ee852e8ab0a763a636ca0a08e9a8 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/optimizer/util/relnode.c,v 1.70 2005/06/09 04:19:00 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/optimizer/util/relnode.c,v 1.71 2005/07/28 22:27:00 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -619,8 +619,8 @@ subbuild_joinrel_joinlist(RelOptInfo *joinrel,
                         * in, no great harm is done --- they'll be detected by
                         * redundant-clause testing when they reach a restriction list.)
                         */
-                       if (!list_member_ptr(joinrel->joininfo, rinfo))
-                               joinrel->joininfo = lappend(joinrel->joininfo, rinfo);
+                       joinrel->joininfo = list_append_unique_ptr(joinrel->joininfo,
+                                                                                                          rinfo);
                }
        }
 }
index 1c8fe6cf773012e6f202455fff154afbeeded896..a9211cfe93151dc5c05d7b42ba65a59ab424ec27 100644 (file)
@@ -6,7 +6,7 @@
  * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- *     $PostgreSQL: pgsql/src/backend/parser/analyze.c,v 1.322 2005/06/05 00:38:09 tgl Exp $
+ *     $PostgreSQL: pgsql/src/backend/parser/analyze.c,v 1.323 2005/07/28 22:27:00 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -2789,8 +2789,8 @@ transformLocking(Query *qry, List *lockedRels, bool forUpdate)
                        switch (rte->rtekind)
                        {
                                case RTE_RELATION:
-                                       if (!list_member_int(rowMarks, i))      /* avoid duplicates */
-                                               rowMarks = lappend_int(rowMarks, i);
+                                       /* use list_append_unique to avoid duplicates */
+                                       rowMarks = list_append_unique_int(rowMarks, i);
                                        rte->requiredPerms |= ACL_SELECT_FOR_UPDATE;
                                        break;
                                case RTE_SUBQUERY:
@@ -2826,8 +2826,8 @@ transformLocking(Query *qry, List *lockedRels, bool forUpdate)
                                        switch (rte->rtekind)
                                        {
                                                case RTE_RELATION:
-                                                       if (!list_member_int(rowMarks, i))      /* avoid duplicates */
-                                                               rowMarks = lappend_int(rowMarks, i);
+                                                       /* use list_append_unique to avoid duplicates */
+                                                       rowMarks = list_append_unique_int(rowMarks, i);
                                                        rte->requiredPerms |= ACL_SELECT_FOR_UPDATE;
                                                        break;
                                                case RTE_SUBQUERY:
index 3677fd2ebac17312c101e6822ed7cd6a100e3941..428bf7ba44f8d3bdeefa7c4e4b2f94c82c69238a 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.155 2005/06/28 05:08:59 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/rewrite/rewriteHandler.c,v 1.156 2005/07/28 22:27:02 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -1001,8 +1001,7 @@ markQueryForLocking(Query *qry, bool forUpdate, bool skipOldNew)
 
                if (rte->rtekind == RTE_RELATION)
                {
-                       if (!list_member_int(qry->rowMarks, rti))
-                               qry->rowMarks = lappend_int(qry->rowMarks, rti);
+                       qry->rowMarks = list_append_unique_int(qry->rowMarks, rti);
                        rte->requiredPerms |= ACL_SELECT_FOR_UPDATE;
                }
                else if (rte->rtekind == RTE_SUBQUERY)
index 48a24db182635d3b8ef1f7803eae55203172796c..d51162e7eed2a005042a8e37970e301d2df2c6f8 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/utils/adt/acl.c,v 1.122 2005/07/26 16:38:27 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/utils/adt/acl.c,v 1.123 2005/07/28 22:27:02 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -2843,8 +2843,7 @@ has_privs_of_role(Oid member, Oid role)
                         * graph, we must test for having already seen this role.
                         * It is legal for instance to have both A->B and A->C->B.
                         */
-                       if (!list_member_oid(roles_list, otherid))
-                               roles_list = lappend_oid(roles_list, otherid);
+                       roles_list = list_append_unique_oid(roles_list, otherid);
                }
                ReleaseSysCacheList(memlist);
        }
@@ -2931,8 +2930,7 @@ is_member_of_role(Oid member, Oid role)
                         * graph, we must test for having already seen this role.
                         * It is legal for instance to have both A->B and A->C->B.
                         */
-                       if (!list_member_oid(roles_list, otherid))
-                               roles_list = lappend_oid(roles_list, otherid);
+                       roles_list = list_append_unique_oid(roles_list, otherid);
                }
                ReleaseSysCacheList(memlist);
        }
@@ -3024,8 +3022,7 @@ is_admin_of_role(Oid member, Oid role)
                                break;
                        }
 
-                       if (!list_member_oid(roles_list, otherid))
-                               roles_list = lappend_oid(roles_list, otherid);
+                       roles_list = list_append_unique_oid(roles_list, otherid);
                }
                ReleaseSysCacheList(memlist);
                if (result)
index e4b7154b93b283bad3206a741a04f674c303d67f..7087a9887d413a9b76751926eca9e10d7e1e4532 100644 (file)
@@ -23,7 +23,7 @@
  * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/backend/utils/init/flatfiles.c,v 1.12 2005/07/04 04:51:50 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/utils/init/flatfiles.c,v 1.13 2005/07/28 22:27:02 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -571,12 +571,8 @@ write_auth_file(Relation rel_authid, Relation rel_authmem)
                                 * Now add all the new roles to roles_list.
                                 */
                                for (i = first_found; i <= last_found; i++)
-                               {
-                                       Oid     rolid = authmem_info[i].roleid;
-
-                                       if (!list_member_oid(roles_list, rolid))
-                                               roles_list = lappend_oid(roles_list, rolid);
-                               }
+                                       roles_list = list_append_unique_oid(roles_list,
+                                                                                                               authmem_info[i].roleid);
                        }
 
                        /*