From 23c30246d7777fdee2dfc346baff0ba0720a5e24 Mon Sep 17 00:00:00 2001 From: Bruce Momjian Date: Sun, 21 Feb 1999 01:55:03 +0000 Subject: [PATCH] pathkeys.c cleanup. --- src/backend/nodes/print.c | 4 +- src/backend/optimizer/path/joinpath.c | 16 ++--- src/backend/optimizer/path/pathkeys.c | 89 ++++++++++----------------- src/include/optimizer/paths.h | 7 ++- 4 files changed, 48 insertions(+), 68 deletions(-) diff --git a/src/backend/nodes/print.c b/src/backend/nodes/print.c index e8837dc757..5e9ca1d590 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 6a1bad07b7..95907f4072 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 836b924ae1..522f303d27 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 f504fc7902..fb9ef20b28 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, -- GitLab