pathkeys.c cleanup.
authorBruce Momjian
Sun, 21 Feb 1999 01:55:03 +0000 (01:55 +0000)
committerBruce Momjian
Sun, 21 Feb 1999 01:55:03 +0000 (01:55 +0000)
src/backend/nodes/print.c
src/backend/optimizer/path/joinpath.c
src/backend/optimizer/path/pathkeys.c
src/include/optimizer/paths.h

index e8837dc7570b1180834fe481dcc4b58ee630ac02..5e9ca1d59034089b395cf55ad57fa208c7669094 100644 (file)
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/backend/nodes/print.c,v 1.23 1999/02/20 19:02:40 momjian Exp $
+ *   $Header: /cvsroot/pgsql/src/backend/nodes/print.c,v 1.24 1999/02/21 01:55:01 momjian Exp $
  *
  * HISTORY
  *   AUTHOR            DATE            MAJOR EVENT
@@ -223,7 +223,7 @@ print_pathkeys(List *pathkeys, List *rtable)
    printf("(");
    foreach(i, pathkeys)
    {
-       List pathkey = lfirst(i));
+       List pathkey = lfirst(i);
 
        printf("(");
        foreach(k, pathkey)
index 6a1bad07b70f9ec5d36d818c4bf85cc65aa6cb9f..95907f40729bc97f584d97e3989277ca1f667bf1 100644 (file)
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/backend/optimizer/path/joinpath.c,v 1.30 1999/02/19 05:18:04 momjian Exp $
+ *   $Header: /cvsroot/pgsql/src/backend/optimizer/path/joinpath.c,v 1.31 1999/02/21 01:55:02 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -309,11 +309,12 @@ match_unsorted_outer(RelOptInfo *joinrel,
        {
            List       *jmkeys = xmergeinfo->jmethod.jmkeys;
 
-           matchedJoinKeys = order_joinkeys_by_pathkeys(outerpath->pathkeys,
-                                                       jmkeys,
-                                                       clauses,
-                                                       OUTER,
-                                                       &matchedJoinClauses);
+           order_joinkeys_by_pathkeys(outerpath->pathkeys,
+                                       jmkeys,
+                                       clauses,
+                                       OUTER,
+                                       &matchedJoinKeys,
+                                       &matchedJoinClauses);
            merge_pathkeys = new_join_pathkeys(outerpath->pathkeys,
                                              joinrel->targetlist, clauses);
        }
@@ -449,10 +450,11 @@ match_unsorted_inner(RelOptInfo *joinrel,
        {
            List       *jmkeys = xmergeinfo->jmethod.jmkeys;
 
-           matchedJoinKeys = order_joinkeys_by_pathkeys(innerpath->pathkeys,
+           order_joinkeys_by_pathkeys(innerpath->pathkeys,
                                        jmkeys,
                                        clauses,
                                        INNER,
+                                       &matchedJoinKeys,
                                        &matchedJoinClauses);
        }
 
index 836b924ae1389ad3b735d3cadb7c4005b44bfe49..522f303d27d65a8ee768673e016456c4730bb905 100644 (file)
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/backend/optimizer/path/pathkeys.c,v 1.5 1999/02/20 19:02:41 momjian Exp $
+ *   $Header: /cvsroot/pgsql/src/backend/optimizer/path/pathkeys.c,v 1.6 1999/02/21 01:55:02 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -27,8 +27,6 @@
 
 static int match_pathkey_joinkeys(List *pathkey, List *joinkeys,
                        int outer_or_inner);
-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);
 static List *new_matching_subkeys(Var *subkey, List *considered_subkeys,
@@ -94,19 +92,20 @@ static List *new_matching_subkeys(Var *subkey, List *considered_subkeys,
  * Returns the join keys and corresponding join clauses in a list if all
  * of the path keys were matched:
  *     (
- *      ( (outerkey0 innerkey0) ... (outerkeyN innerkeyN) )
+ *      ( (outerkey0 innerkey0) ... (outerkeyN or innerkeyN) )
  *      ( clause0 ... clauseN )
  *     )
  * and nil otherwise.
  *
  * Returns a list of matched join keys and a list of matched join clauses
- * in matchedJoinClausesPtr.  - ay 11/94
+ * in pointers if valid order can be found.
  */
-List *
+bool
 order_joinkeys_by_pathkeys(List *pathkeys,
                            List *joinkeys,
                            List *joinclauses,
                            int outer_or_inner,
+                           List **matchedJoinKeysPtr,
                            List **matchedJoinClausesPtr)
 {
    List       *matched_joinkeys = NIL;
@@ -114,7 +113,7 @@ order_joinkeys_by_pathkeys(List *pathkeys,
    List       *pathkey = NIL;
    List       *i = NIL;
    int         matched_joinkey_index = -1;
-
+   int         matched_keys = 0;
    /*
     *  Reorder the joinkeys by picking out one that matches each pathkey,
     *  and create a new joinkey/joinclause list in pathkey order
@@ -127,11 +126,19 @@ order_joinkeys_by_pathkeys(List *pathkeys,
 
        if (matched_joinkey_index != -1)
        {
-           List       *xjoinkey = nth(matched_joinkey_index, joinkeys);
-           List       *joinclause = nth(matched_joinkey_index, joinclauses);
-
-           matched_joinkeys = lappend(matched_joinkeys, xjoinkey);
-           matched_joinclauses = lappend(matched_joinclauses, joinclause);
+           matched_keys++;
+           if (matchedJoinKeysPtr)
+           {
+               JoinKey    *joinkey = nth(matched_joinkey_index, joinkeys);
+               matched_joinkeys = lappend(matched_joinkeys, joinkey);
+           }
+           
+           if (matchedJoinClausesPtr && joinclauses)
+           {
+               Expr       *joinclause = nth(matched_joinkey_index,
+                                            joinclauses);
+               matched_joinclauses = lappend(matched_joinclauses, joinclause);
+           }
        }
        else
            /*  A pathkey could not be matched. */
@@ -142,14 +149,20 @@ order_joinkeys_by_pathkeys(List *pathkeys,
     *  Did we fail to match all the joinkeys?
     *  Extra pathkeys are no problem.
     */
-   if (length(joinkeys) != length(matched_joinkeys))
+   if (matched_keys != length(joinkeys))
    {
-           *matchedJoinClausesPtr = NIL;
-           return NIL;
+           if (matchedJoinKeysPtr)
+               *matchedJoinKeysPtr = NIL;
+           if (matchedJoinClausesPtr)
+               *matchedJoinClausesPtr = NIL;
+           return false;
    }
 
-   *matchedJoinClausesPtr = matched_joinclauses;
-   return matched_joinkeys;
+   if (matchedJoinKeysPtr)
+       *matchedJoinKeysPtr = matched_joinkeys;
+   if (matchedJoinClausesPtr)
+       *matchedJoinClausesPtr = matched_joinclauses;
+   return true;
 }
 
 
@@ -221,8 +234,8 @@ get_cheapest_path_for_joinkeys(List *joinkeys,
        Path       *path = (Path *) lfirst(i);
        int         better_sort, better_key;
        
-       if (joinkeys_pathkeys_match(joinkeys, path->pathkeys, outer_or_inner) &&
-           length(joinkeys) == length(path->pathkeys) &&
+       if (order_joinkeys_by_pathkeys(path->pathkeys, joinkeys, NIL,
+                                      outer_or_inner, NULL, NULL) &&
            pathorder_match(ordering, path->pathorder, &better_sort) &&
            better_sort == 0)
        {
@@ -246,7 +259,7 @@ get_cheapest_path_for_joinkeys(List *joinkeys,
  * 'joinkeys' is a list of join key pairs
  * 'tlist' is a relation target list
  * 'outer_or_inner' is a flag that selects the desired subkey of a join key
- *     in 'joinkeys'
+ * in 'joinkeys'
  *
  * Returns a list of pathkeys: ((tlvar1)(tlvar2)...(tlvarN)).
  * It is a list of lists because of multi-key indexes.
@@ -291,42 +304,6 @@ extract_path_keys(List *joinkeys,
 }
 
 
-/*
- * joinkeys_pathkeys_match
- */
-static bool
-joinkeys_pathkeys_match(List *joinkeys, List *pathkey, int outer_or_inner)
-{
-   JoinKey    *xjoinkey;
-   Var        *temp;
-   Var        *tempkey = NULL;
-   bool        found = false;
-   List       *i = NIL;
-   List       *j = NIL;
-
-   foreach(i, joinkeys)
-   {
-       xjoinkey = (JoinKey *) lfirst(i);
-       found = false;
-       foreach(j, pathkey)
-       {
-           temp = (Var *) lfirst((List *) lfirst(j));
-           if (temp == NULL)
-               continue;
-           tempkey = extract_join_key(xjoinkey, outer_or_inner);
-           if (var_equal(tempkey, temp))
-           {
-               found = true;
-               break;
-           }
-       }
-       if (found == false)
-           return false;
-   }
-   return found;
-}
-
-
 /****************************************************************************
  *     NEW PATHKEY FORMATION
  ****************************************************************************/
index f504fc790299409e3a6c39d4d1ee3be1ac5fddad..fb9ef20b288af60cb7048336b4c1eb8f1574b67c 100644 (file)
@@ -7,7 +7,7 @@
  *
  * Copyright (c) 1994, Regents of the University of California
  *
- * $Id: paths.h,v 1.24 1999/02/19 05:18:06 momjian Exp $
+ * $Id: paths.h,v 1.25 1999/02/21 01:55:03 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -54,9 +54,10 @@ extern List *group_clauses_by_hashop(List *restrictinfo_list,
  * joinutils.h
  *   generic join method key/clause routines
  */
-extern List *order_joinkeys_by_pathkeys(List *pathkeys,
+extern bool order_joinkeys_by_pathkeys(List *pathkeys,
                     List *joinkeys, List *joinclauses, int outer_or_inner,
-                       List **matchedJoinClausesPtr);
+                    List **matchedJoinKeysPtr,
+                    List **matchedJoinClausesPtr);
 extern List *extract_path_keys(List *joinkeys, List *tlist,
                  int outer_or_inner);
 extern Path *get_cheapest_path_for_joinkeys(List *joinkeys,