]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
pathkeys.c cleanup.
authorBruce Momjian <bruce@momjian.us>
Sun, 21 Feb 1999 01:55:03 +0000 (01:55 +0000)
committerBruce Momjian <bruce@momjian.us>
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,