diff --git a/src/backend/nodes/print.c b/src/backend/nodes/print.c
index e8837dc7570b1180834fe481dcc4b58ee630ac02..5e9ca1d59034089b395cf55ad57fa208c7669094 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 6a1bad07b70f9ec5d36d818c4bf85cc65aa6cb9f..95907f40729bc97f584d97e3989277ca1f667bf1 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 836b924ae1389ad3b735d3cadb7c4005b44bfe49..522f303d27d65a8ee768673e016456c4730bb905 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 f504fc790299409e3a6c39d4d1ee3be1ac5fddad..fb9ef20b288af60cb7048336b4c1eb8f1574b67c 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,