pathkeys.c cleanup.

This commit is contained in:
Bruce Momjian 1999-02-21 01:55:03 +00:00
parent 9d197856dd
commit 23c30246d7
4 changed files with 48 additions and 68 deletions

View 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)

View 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);
}

View 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
****************************************************************************/

View 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,