aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorBruce Momjian <bruce@momjian.us>1999-02-21 01:55:03 +0000
committerBruce Momjian <bruce@momjian.us>1999-02-21 01:55:03 +0000
commit23c30246d7777fdee2dfc346baff0ba0720a5e24 (patch)
tree9b62587c8cc572f6e6d79b09a2a0281d28a9eae9 /src
parent9d197856dd5eda5cf85b15e564ae09ef8fef0e9e (diff)
downloadpostgresql-23c30246d7777fdee2dfc346baff0ba0720a5e24.tar.gz
postgresql-23c30246d7777fdee2dfc346baff0ba0720a5e24.zip
pathkeys.c cleanup.
Diffstat (limited to 'src')
-rw-r--r--src/backend/nodes/print.c4
-rw-r--r--src/backend/optimizer/path/joinpath.c16
-rw-r--r--src/backend/optimizer/path/pathkeys.c89
-rw-r--r--src/include/optimizer/paths.h7
4 files changed, 48 insertions, 68 deletions
diff --git a/src/backend/nodes/print.c b/src/backend/nodes/print.c
index e8837dc7570..5e9ca1d5903 100644
--- a/src/backend/nodes/print.c
+++ b/src/backend/nodes/print.c
@@ -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)
diff --git a/src/backend/optimizer/path/joinpath.c b/src/backend/optimizer/path/joinpath.c
index 6a1bad07b70..95907f40729 100644
--- a/src/backend/optimizer/path/joinpath.c
+++ b/src/backend/optimizer/path/joinpath.c
@@ -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);
}
diff --git a/src/backend/optimizer/path/pathkeys.c b/src/backend/optimizer/path/pathkeys.c
index 836b924ae13..522f303d27d 100644
--- a/src/backend/optimizer/path/pathkeys.c
+++ b/src/backend/optimizer/path/pathkeys.c
@@ -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
****************************************************************************/
diff --git a/src/include/optimizer/paths.h b/src/include/optimizer/paths.h
index f504fc79029..fb9ef20b288 100644
--- a/src/include/optimizer/paths.h
+++ b/src/include/optimizer/paths.h
@@ -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,