optimizer cleanup
authorBruce Momjian <bruce@momjian.us>
Fri, 19 Feb 1999 05:18:06 +0000 (05:18 +0000)
committerBruce Momjian <bruce@momjian.us>
Fri, 19 Feb 1999 05:18:06 +0000 (05:18 +0000)
src/backend/optimizer/README
src/backend/optimizer/path/joinpath.c
src/backend/optimizer/path/pathkey.c
src/include/optimizer/paths.h

index 2b6ff52c5ff0141bad2b00a634a9fee6c4e7a980..b25d7fb5f1aa9dd1620dab19a45b49c58687913f 100644 (file)
@@ -7,7 +7,9 @@ The optimizer generates optimial query plans by doing several steps:
 it.  Find each way of accessing the relation, called a Path, including
 sequential and index scans, and add it to RelOptInfo.pathlist.  Also
 create RelOptInfo.joininfo that lists all the joins that involve this
-relation.
+relation.  For example, the WHERE clause "tab1.col1 = tab2.col1"
+generates a JoinInfo for tab1 listing tab2 as an unjoined relation, and
+tab2's joininfo shows tab1 as an unjoined relation.
 
 2) Join each RelOptInfo to other RelOptInfo as specified in
 RelOptInfo.joininfo.  At this point each RelOptInfo is a single
index 4846dfba50f203687f9c19dde79e175e6b82b332..6a1bad07b70f9ec5d36d818c4bf85cc65aa6cb9f 100644 (file)
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/backend/optimizer/path/joinpath.c,v 1.29 1999/02/18 19:58:52 momjian Exp $
+ *   $Header: /cvsroot/pgsql/src/backend/optimizer/path/joinpath.c,v 1.30 1999/02/19 05:18:04 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -79,8 +79,8 @@ update_rels_pathlist_for_joins(Query *root, List *joinrels)
        List       *pathlist = NIL;
 
        /* flatten out relids later in this function */
-       innerrelids = lsecond(joinrel->relids);
        outerrelids = lfirst(joinrel->relids);
+       innerrelids = lsecond(joinrel->relids);
 
        /*
         * base relation id is an integer and join relation relid is a
@@ -123,7 +123,7 @@ update_rels_pathlist_for_joins(Query *root, List *joinrels)
                                              outerrel,
                                              innerrel,
                                              outerrel->pathlist,
-                                        (Path *) innerrel->cheapestpath,
+                                             innerrel->cheapestpath,
                                              bestinnerjoin,
                                              mergeinfo_list));
 
@@ -176,7 +176,6 @@ best_innerjoin(List *join_paths, Relids outer_relids)
            && ((cheapest == NULL ||
                 path_is_cheaper((Path *) lfirst(join_path), cheapest))))
        {
-
            cheapest = (Path *) lfirst(join_path);
        }
    }
@@ -293,7 +292,7 @@ match_unsorted_outer(RelOptInfo *joinrel,
        List       *clauses = NIL;
        List       *matchedJoinKeys = NIL;
        List       *matchedJoinClauses = NIL;
-       MergeInfo  *xmergeinfo = (MergeInfo *) NULL;
+       MergeInfo  *xmergeinfo = NULL;
 
        outerpath = (Path *) lfirst(i);
 
@@ -309,9 +308,8 @@ match_unsorted_outer(RelOptInfo *joinrel,
        if (clauses)
        {
            List       *jmkeys = xmergeinfo->jmethod.jmkeys;
-           List       *clauses = xmergeinfo->jmethod.clauses;
 
-           matchedJoinKeys = match_pathkeys_joinkeys(outerpath->pathkeys,
+           matchedJoinKeys = order_joinkeys_by_pathkeys(outerpath->pathkeys,
                                                        jmkeys,
                                                        clauses,
                                                        OUTER,
@@ -339,19 +337,18 @@ match_unsorted_outer(RelOptInfo *joinrel,
        {
            bool        path_is_cheaper_than_sort;
            List       *varkeys = NIL;
-           Path       *mergeinnerpath = match_paths_joinkeys(matchedJoinKeys,
-                                outerpath_ordering,
-                                innerrel->pathlist,
-                                INNER);
+           Path       *mergeinnerpath = get_cheapest_path_for_joinkeys(
+                                                        matchedJoinKeys,
+                                                        outerpath_ordering,
+                                                        innerrel->pathlist,
+                                                        INNER);
 
            /* Should we use the mergeinner, or sort the cheapest inner? */
            path_is_cheaper_than_sort = (bool) (mergeinnerpath &&
-                       (mergeinnerpath->path_cost <
-                        (cheapest_inner->path_cost +
-                         cost_sort(matchedJoinKeys,
-                                   innerrel->size,
-                                   innerrel->width,
-                                   false))));
+               (mergeinnerpath->path_cost <
+                (cheapest_inner->path_cost +
+                 cost_sort(matchedJoinKeys, innerrel->size,
+                           innerrel->width, false))));
            if (!path_is_cheaper_than_sort)
            {
                varkeys = extract_path_keys(matchedJoinKeys,
@@ -451,11 +448,10 @@ match_unsorted_inner(RelOptInfo *joinrel,
        if (clauses)
        {
            List       *jmkeys = xmergeinfo->jmethod.jmkeys;
-           List       *cls = xmergeinfo->jmethod.clauses;
 
-           matchedJoinKeys = match_pathkeys_joinkeys(innerpath->pathkeys,
+           matchedJoinKeys = order_joinkeys_by_pathkeys(innerpath->pathkeys,
                                        jmkeys,
-                                       cls,
+                                       clauses,
                                        INNER,
                                        &matchedJoinClauses);
        }
index 92b27a774b22ad7fa455eaa33290d0a3d2eb9864..7d098db8850e6a80458cd78bdf0c8e715e8f2d1c 100644 (file)
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/backend/optimizer/path/Attic/pathkey.c,v 1.2 1999/02/19 02:05:15 momjian Exp $
+ *   $Header: /cvsroot/pgsql/src/backend/optimizer/path/Attic/pathkey.c,v 1.3 1999/02/19 05:18:05 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -28,7 +28,7 @@
 
 static int match_pathkey_joinkeys(List *pathkey, List *joinkeys,
                        int outer_or_inner);
-static bool every_func(List *joinkeys, List *pathkey,
+static bool joinkeys_pathkeys_match(List *joinkeys, List *pathkey,
                        int outer_or_inner);
 static List *new_join_pathkey(List *subkeys, List *considered_subkeys,
                        List *join_rel_tlist, List *joinclauses);
@@ -40,7 +40,7 @@ static List *new_matching_subkeys(Var *subkey, List *considered_subkeys,
  ****************************************************************************/
 
 /*
- * match_pathkeys_joinkeys
+ * order_joinkeys_by_pathkeys
  *   Attempts to match the keys of a path against the keys of join clauses.
  *   This is done by looking for a matching join key in 'joinkeys' for
  *   every path key in the list 'path.keys'. If there is a matching join key
@@ -69,7 +69,7 @@ static List *new_matching_subkeys(Var *subkey, List *considered_subkeys,
  * in matchedJoinClausesPtr.  - ay 11/94
  */
 List *
-match_pathkeys_joinkeys(List *pathkeys,
+order_joinkeys_by_pathkeys(List *pathkeys,
                        List *joinkeys,
                        List *joinclauses,
                        int outer_or_inner,
@@ -92,21 +92,18 @@ match_pathkeys_joinkeys(List *pathkeys,
            List       *xjoinkey = nth(matched_joinkey_index, joinkeys);
            List       *joinclause = nth(matched_joinkey_index, joinclauses);
 
-           matched_joinkeys = lcons(xjoinkey, matched_joinkeys);
-           matched_joinclauses = lcons(joinclause, matched_joinclauses);
-
-           joinkeys = LispRemove(xjoinkey, joinkeys);
+           matched_joinkeys = lappend(matched_joinkeys, xjoinkey);
+           matched_joinclauses = lappend(matched_joinclauses, joinclause);
        }
        else
+       {
+           *matchedJoinClausesPtr = NIL;
            return NIL;
-
+       }
    }
-   if (matched_joinkeys == NULL ||
-       length(matched_joinkeys) != length(pathkeys))
-       return NIL;
 
-   *matchedJoinClausesPtr = nreverse(matched_joinclauses);
-   return nreverse(matched_joinkeys);
+   *matchedJoinClausesPtr = matched_joinclauses;
+   return matched_joinkeys;
 }
 
 
@@ -144,7 +141,7 @@ match_pathkey_joinkeys(List *pathkey,
 
 
 /*
- * match_paths_joinkeys
+ * get_cheapest_path_for_joinkeys
  *   Attempts to find a path in 'paths' whose keys match a set of join
  *   keys 'joinkeys'.  To match,
  *   1. the path node ordering must equal 'ordering'.
@@ -165,31 +162,27 @@ match_pathkey_joinkeys(List *pathkey,
  * Find the cheapest path that matches the join keys
  */
 Path *
-match_paths_joinkeys(List *joinkeys,
-                    PathOrder *ordering,
-                    List *paths,
-                    int outer_or_inner)
+get_cheapest_path_for_joinkeys(List *joinkeys,
+                                PathOrder *ordering,
+                                List *paths,
+                                int outer_or_inner)
 {
    Path       *matched_path = NULL;
-   bool        key_match = false;
    List       *i = NIL;
 
    foreach(i, paths)
    {
        Path       *path = (Path *) lfirst(i);
-       int         better_sort;
+       int         better_sort, better_key;
        
-       key_match = every_func(joinkeys, path->pathkeys, outer_or_inner);
-
-       if (pathorder_match(ordering, path->pathorder, &better_sort) &&
-           better_sort == 0 &&
-           length(joinkeys) == length(path->pathkeys) && key_match)
+       if (joinkeys_pathkeys_match(joinkeys, path->pathkeys, outer_or_inner) &&
+           length(joinkeys) == length(path->pathkeys) &&
+           pathorder_match(ordering, path->pathorder, &better_sort) &&
+           better_sort == 0)
        {
            if (matched_path)
-           {
                if (path->path_cost < matched_path->path_cost)
                    matched_path = path;
-           }
            else
                matched_path = path;
        }
@@ -253,10 +246,10 @@ extract_path_keys(List *joinkeys,
 
 
 /*
- * every_func
+ * joinkeys_pathkeys_match
  */
 static bool
-every_func(List *joinkeys, List *pathkey, int outer_or_inner)
+joinkeys_pathkeys_match(List *joinkeys, List *pathkey, int outer_or_inner)
 {
    JoinKey    *xjoinkey;
    Var        *temp;
index 413d536807c95281ca4cba74a8f6630b5ed7b6a8..f504fc790299409e3a6c39d4d1ee3be1ac5fddad 100644 (file)
@@ -7,7 +7,7 @@
  *
  * Copyright (c) 1994, Regents of the University of California
  *
- * $Id: paths.h,v 1.23 1999/02/19 02:05:20 momjian Exp $
+ * $Id: paths.h,v 1.24 1999/02/19 05:18:06 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -54,13 +54,13 @@ extern List *group_clauses_by_hashop(List *restrictinfo_list,
  * joinutils.h
  *   generic join method key/clause routines
  */
-extern List *match_pathkeys_joinkeys(List *pathkeys,
+extern List *order_joinkeys_by_pathkeys(List *pathkeys,
                     List *joinkeys, List *joinclauses, int outer_or_inner,
                        List **matchedJoinClausesPtr);
 extern List *extract_path_keys(List *joinkeys, List *tlist,
                  int outer_or_inner);
-extern Path *match_paths_joinkeys(List *joinkeys, PathOrder *ordering,
-                    List *paths, int outer_or_inner);
+extern Path *get_cheapest_path_for_joinkeys(List *joinkeys,
+                   PathOrder *ordering, List *paths, int outer_or_inner);
 extern List *new_join_pathkeys(List *outer_pathkeys,
                  List *join_rel_tlist, List *joinclauses);