aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/backend/nodes/print.c22
-rw-r--r--src/backend/optimizer/path/pathkeys.c48
-rw-r--r--src/backend/optimizer/util/pathnode.c4
-rw-r--r--src/include/nodes/relation.h5
4 files changed, 55 insertions, 24 deletions
diff --git a/src/backend/nodes/print.c b/src/backend/nodes/print.c
index f26d5100e34..e8837dc7570 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.22 1999/02/13 23:16:00 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/backend/nodes/print.c,v 1.23 1999/02/20 19:02:40 momjian Exp $
*
* HISTORY
* AUTHOR DATE MAJOR EVENT
@@ -213,20 +213,28 @@ print_expr(Node *expr, List *rtable)
/*
* print_pathkeys -
- * temporary here. where is keys list of lists
+ * pathkeys list of list of Var's
*/
void
print_pathkeys(List *pathkeys, List *rtable)
{
- List *k;
+ List *i, *k;
printf("(");
- foreach(k, pathkeys)
+ foreach(i, pathkeys)
{
- Node *var = lfirst((List *) lfirst(k));
+ List pathkey = lfirst(i));
- print_expr(var, rtable);
- if (lnext(k))
+ printf("(");
+ foreach(k, pathkey)
+ {
+ Node *var = lfirst(k);
+ print_expr(var, rtable);
+ if (lnext(k))
+ printf(", ");
+ }
+ printf(") ");
+ if (lnext(i))
printf(", ");
}
printf(")\n");
diff --git a/src/backend/optimizer/path/pathkeys.c b/src/backend/optimizer/path/pathkeys.c
index f1ea6cbae68..836b924ae13 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.4 1999/02/20 18:01:01 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/backend/optimizer/path/pathkeys.c,v 1.5 1999/02/20 19:02:41 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@@ -54,7 +54,19 @@ static List *new_matching_subkeys(Var *subkey, List *considered_subkeys,
* { {tab1.col1, tab2.col1} }. This allows future joins to use either Var
* as a pre-sorted key to prevent Mergejoins from having to re-sort the Path.
* They are equal, so they are both primary sort keys. This is why pathkeys
- * is a List of Lists. -- bjm
+ * is a List of Lists.
+ *
+ * For multi-key sorts, if the outer is sorted by a multi-key index, the
+ * multi-key index remains after the join. If the inner has a multi-key
+ * sort, only the primary key of the inner is added to the result.
+ * Mergejoins only join on the primary key. Currently, non-primary keys
+ * in the pathkeys List are of limited value.
+ *
+ * HashJoin has similar functionality. NestJoin does not perform sorting,
+ * and allows non-equajoins, so it does not allow useful pathkeys.
+ *
+ * -- bjm
+ *
*/
/****************************************************************************
@@ -92,10 +104,10 @@ static List *new_matching_subkeys(Var *subkey, List *considered_subkeys,
*/
List *
order_joinkeys_by_pathkeys(List *pathkeys,
- List *joinkeys,
- List *joinclauses,
- int outer_or_inner,
- List **matchedJoinClausesPtr)
+ List *joinkeys,
+ List *joinclauses,
+ int outer_or_inner,
+ List **matchedJoinClausesPtr)
{
List *matched_joinkeys = NIL;
List *matched_joinclauses = NIL;
@@ -103,6 +115,10 @@ order_joinkeys_by_pathkeys(List *pathkeys,
List *i = NIL;
int matched_joinkey_index = -1;
+ /*
+ * Reorder the joinkeys by picking out one that matches each pathkey,
+ * and create a new joinkey/joinclause list in pathkey order
+ */
foreach(i, pathkeys)
{
pathkey = lfirst(i);
@@ -118,10 +134,18 @@ order_joinkeys_by_pathkeys(List *pathkeys,
matched_joinclauses = lappend(matched_joinclauses, joinclause);
}
else
- {
+ /* A pathkey could not be matched. */
+ break;
+ }
+
+ /*
+ * Did we fail to match all the joinkeys?
+ * Extra pathkeys are no problem.
+ */
+ if (length(joinkeys) != length(matched_joinkeys))
+ {
*matchedJoinClausesPtr = NIL;
return NIL;
- }
}
*matchedJoinClausesPtr = matched_joinclauses;
@@ -133,6 +157,8 @@ order_joinkeys_by_pathkeys(List *pathkeys,
* match_pathkey_joinkeys
* Returns the 0-based index into 'joinkeys' of the first joinkey whose
* outer or inner subkey matches any subkey of 'pathkey'.
+ *
+ * All these keys are equivalent, so any of them can match. See above.
*/
static int
match_pathkey_joinkeys(List *pathkey,
@@ -141,8 +167,7 @@ match_pathkey_joinkeys(List *pathkey,
{
Var *path_subkey;
int pos;
- List *i = NIL;
- List *x = NIL;
+ List *i, *x;
JoinKey *jk;
foreach(i, pathkey)
@@ -152,8 +177,7 @@ match_pathkey_joinkeys(List *pathkey,
foreach(x, joinkeys)
{
jk = (JoinKey *) lfirst(x);
- if (var_equal(path_subkey,
- extract_join_key(jk, outer_or_inner)))
+ if (var_equal(path_subkey, extract_join_key(jk, outer_or_inner)))
return pos;
pos++;
}
diff --git a/src/backend/optimizer/util/pathnode.c b/src/backend/optimizer/util/pathnode.c
index d94e124193e..7011f053c0a 100644
--- a/src/backend/optimizer/util/pathnode.c
+++ b/src/backend/optimizer/util/pathnode.c
@@ -7,7 +7,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/optimizer/util/pathnode.c,v 1.38 1999/02/20 18:01:02 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/backend/optimizer/util/pathnode.c,v 1.39 1999/02/20 19:02:42 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@@ -205,7 +205,7 @@ better_path(Path *new_path, List *unique_paths, bool *is_new)
{
/*
* Replace pathkeys that match exactly, {{1,2}}, {{1,2}}
- * Replace pathkeys {{1,2}}with {{1,2,3}}} if the latter is not
+ * Replace pathkeys {{1,2}} with {{1,2,3}}} if the latter is not
* more expensive and replace unordered path with ordered
* path if it is not more expensive. Favor sorted keys
* over unsorted keys in the same way.
diff --git a/src/include/nodes/relation.h b/src/include/nodes/relation.h
index f9818339b0c..bf2e59d30cb 100644
--- a/src/include/nodes/relation.h
+++ b/src/include/nodes/relation.h
@@ -6,7 +6,7 @@
*
* Copyright (c) 1994, Regents of the University of California
*
- * $Id: relation.h,v 1.27 1999/02/20 16:28:20 momjian Exp $
+ * $Id: relation.h,v 1.28 1999/02/20 19:02:43 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@@ -142,8 +142,7 @@ typedef struct Path
PathOrder *pathorder;
- List *pathkeys; /*
- * This is a List of List of Var nodes.
+ List *pathkeys; /* This is a List of List of Var nodes.
* See the top of optimizer/path/pathkeys.c
* for more information.
*/