diff --git a/src/backend/nodes/copyfuncs.c b/src/backend/nodes/copyfuncs.c
index 8a0ac031fb7bc12fe7643db93c4197ef5b145163..eee95588b39d41dd9df8fc49d3937da9e9560ba8 100644
--- a/src/backend/nodes/copyfuncs.c
+++ b/src/backend/nodes/copyfuncs.c
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/nodes/copyfuncs.c,v 1.65 1999/02/09 17:02:46 momjian Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/nodes/copyfuncs.c,v 1.66 1999/02/10 03:52:34 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -1114,7 +1114,7 @@ CopyPathFields(Path *from, Path *newnode)
 	else
 		Node_Copy(from, newnode, path_order->ord.merge);
 
-	Node_Copy(from, newnode, keys);
+	Node_Copy(from, newnode, pathkeys);
 
 	newnode->outerjoincost = from->outerjoincost;
 
diff --git a/src/backend/nodes/equalfuncs.c b/src/backend/nodes/equalfuncs.c
index bbb56fff04e7b705c463cab408a5e2a5fefe7c10..60e2594ecc3a388acc8522b0b3c213712cd1fb63 100644
--- a/src/backend/nodes/equalfuncs.c
+++ b/src/backend/nodes/equalfuncs.c
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/nodes/equalfuncs.c,v 1.27 1999/02/09 03:51:12 momjian Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/nodes/equalfuncs.c,v 1.28 1999/02/10 03:52:35 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -366,7 +366,7 @@ _equalPath(Path *a, Path *b)
 		if (!equal(a->path_order->ord.merge, b->path_order->ord.merge))
 			return false;
 	}
-	if (!equal(a->keys, b->keys))
+	if (!equal(a->pathkeys, b->pathkeys))
 		return false;
 
 	/*
diff --git a/src/backend/nodes/freefuncs.c b/src/backend/nodes/freefuncs.c
index a7d3bf6305b0d8ef84144fee82532eb2df397bc6..a7b453c03a100637bd2e6102ef17daaa44d7b163 100644
--- a/src/backend/nodes/freefuncs.c
+++ b/src/backend/nodes/freefuncs.c
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/nodes/Attic/freefuncs.c,v 1.4 1999/02/09 17:02:49 momjian Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/nodes/Attic/freefuncs.c,v 1.5 1999/02/10 03:52:35 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -767,7 +767,7 @@ FreePathFields(Path *node)
 	pfree(node->path_order);	/* is it an object, but we don't have
 								   separate free for it */
 
-	freeObject(node->keys);
+	freeObject(node->pathkeys);
 
 	freeList(node->joinid);
 	freeObject(node->loc_restrictinfo);
diff --git a/src/backend/nodes/outfuncs.c b/src/backend/nodes/outfuncs.c
index 854a2011cb3528e674cdb1684cc318f4808f6b6e..28b13a75b1cdcd4bb6e847aedb43b34dc76b12d6 100644
--- a/src/backend/nodes/outfuncs.c
+++ b/src/backend/nodes/outfuncs.c
@@ -5,7 +5,7 @@
  *
  * Copyright (c) 1994, Regents of the University of California
  *
- *  $Id: outfuncs.c,v 1.67 1999/02/09 17:02:49 momjian Exp $
+ *  $Id: outfuncs.c,v 1.68 1999/02/10 03:52:35 momjian Exp $
  *
  * NOTES
  *	  Every (plan) node in POSTGRES has an associated "out" routine which
@@ -959,10 +959,10 @@ _outPathOrder(StringInfo str, PathOrder *node)
 static void
 _outPath(StringInfo str, Path *node)
 {
-	appendStringInfo(str, " PATH :pathtype %d :cost %f :keys ",
+	appendStringInfo(str, " PATH :pathtype %d :cost %f :pathkeys ",
 			node->pathtype,
 			node->path_cost);
-	_outNode(str, node->keys);
+	_outNode(str, node->pathkeys);
 
 	appendStringInfo(str, " :path_order ");
 	_outNode(str, node->path_order);
@@ -975,10 +975,10 @@ static void
 _outIndexPath(StringInfo str, IndexPath *node)
 {
 	appendStringInfo(str, 
-			" INDEXPATH :pathtype %d :cost %f :keys ",
+			" INDEXPATH :pathtype %d :cost %f :pathkeys ",
 			node->path.pathtype,
 			node->path.path_cost);
-	_outNode(str, node->path.keys);
+	_outNode(str, node->path.pathkeys);
 
 	appendStringInfo(str, " :path_order ");
 	_outNode(str, node->path.path_order);
@@ -997,10 +997,10 @@ static void
 _outJoinPath(StringInfo str, JoinPath *node)
 {
 	appendStringInfo(str, 
-			" JOINPATH :pathtype %d :cost %f :keys ",
+			" JOINPATH :pathtype %d :cost %f :pathkeys ",
 			node->path.pathtype,
 			node->path.path_cost);
-	_outNode(str, node->path.keys);
+	_outNode(str, node->path.pathkeys);
 
 	appendStringInfo(str, " :path_order ");
 	_outNode(str, node->path.path_order);
@@ -1028,10 +1028,10 @@ static void
 _outMergePath(StringInfo str, MergePath *node)
 {
 	appendStringInfo(str, 
-			" MERGEPATH :pathtype %d :cost %f :keys ",
+			" MERGEPATH :pathtype %d :cost %f :pathkeys ",
 			node->jpath.path.pathtype,
 			node->jpath.path.path_cost);
-	_outNode(str, node->jpath.path.keys);
+	_outNode(str, node->jpath.path.pathkeys);
 
 	appendStringInfo(str, " :path_order ");
 	_outNode(str, node->jpath.path.path_order);
@@ -1068,10 +1068,10 @@ static void
 _outHashPath(StringInfo str, HashPath *node)
 {
 	appendStringInfo(str, 
-			" HASHPATH :pathtype %d :cost %f :keys ",
+			" HASHPATH :pathtype %d :cost %f :pathkeys ",
 			node->jpath.path.pathtype,
 			node->jpath.path.path_cost);
-	_outNode(str, node->jpath.path.keys);
+	_outNode(str, node->jpath.path.pathkeys);
 
 	appendStringInfo(str, " :path_order ");
 	_outNode(str, node->jpath.path.path_order);
diff --git a/src/backend/nodes/print.c b/src/backend/nodes/print.c
index 175b4a5fdf46b11e3b2a46d6683d99e51c1df7aa..f5e9eb41138048380ef94e5a5031b7aa2d497447 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.20 1999/02/09 17:02:49 momjian Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/nodes/print.c,v 1.21 1999/02/10 03:52:36 momjian Exp $
  *
  * HISTORY
  *	  AUTHOR			DATE			MAJOR EVENT
@@ -212,16 +212,16 @@ print_expr(Node *expr, List *rtable)
 }
 
 /*
- * print_keys -
- *	  temporary here. where is keys list of list??
+ * print_pathkeys -
+ *	  temporary here. where is keys list of lists
  */
 void
-print_keys(List *keys, List *rtable)
+print_pathkeys(List *pathkeys, List *rtable)
 {
 	List	   *k;
 
 	printf("(");
-	foreach(k, keys)
+	foreach(k, pathkeys)
 	{
 		Node	   *var = lfirst((List *) lfirst(k));
 
diff --git a/src/backend/nodes/readfuncs.c b/src/backend/nodes/readfuncs.c
index 02e7547ab1dbdf617ac19705b29dbf654faed01d..1a220c05d65e490bf56b44902b500fe2f2dd707a 100644
--- a/src/backend/nodes/readfuncs.c
+++ b/src/backend/nodes/readfuncs.c
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/nodes/readfuncs.c,v 1.52 1999/02/09 17:02:50 momjian Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/nodes/readfuncs.c,v 1.53 1999/02/10 03:52:36 momjian Exp $
  *
  * NOTES
  *	  Most of the read functions for plan nodes are tested. (In fact, they
@@ -1525,8 +1525,8 @@ _readPath()
 	token = lsptok(NULL, &length);		/* get :path_order */
 	local_node->path_order = nodeRead(true); /* now read it */
 
-	token = lsptok(NULL, &length);		/* get :keys */
-	local_node->keys = nodeRead(true);	/* now read it */
+	token = lsptok(NULL, &length);		/* get :pathkeys */
+	local_node->pathkeys = nodeRead(true);	/* now read it */
 
 	return local_node;
 }
@@ -1557,8 +1557,8 @@ _readIndexPath()
 	token = lsptok(NULL, &length);		/* get :path_order */
  	local_node->path.path_order = nodeRead(true);		/* now read it */
 
-	token = lsptok(NULL, &length);		/* get :keys */
-	local_node->path.keys = nodeRead(true);		/* now read it */
+	token = lsptok(NULL, &length);		/* get :pathkeys */
+	local_node->path.pathkeys = nodeRead(true);		/* now read it */
 
 	token = lsptok(NULL, &length);		/* get :indexid */
 	local_node->indexid = toIntList(nodeRead(true));
@@ -1596,8 +1596,8 @@ _readJoinPath()
 	token = lsptok(NULL, &length);		/* get :path_order */
 	local_node->path.path_order = nodeRead(true);		/* now read it */
 
-	token = lsptok(NULL, &length);		/* get :keys */
-	local_node->path.keys = nodeRead(true);		/* now read it */
+	token = lsptok(NULL, &length);		/* get :pathkeys */
+	local_node->path.pathkeys = nodeRead(true);		/* now read it */
 
 	token = lsptok(NULL, &length);		/* get :pathinfo */
 	local_node->pathinfo = nodeRead(true);		/* now read it */
@@ -1661,8 +1661,8 @@ _readMergePath()
 	token = lsptok(NULL, &length);		/* get :path_order */
 	local_node->jpath.path.path_order = nodeRead(true); /* now read it */
 
-	token = lsptok(NULL, &length);		/* get :keys */
-	local_node->jpath.path.keys = nodeRead(true);		/* now read it */
+	token = lsptok(NULL, &length);		/* get :pathkeys */
+	local_node->jpath.path.pathkeys = nodeRead(true);		/* now read it */
 
 	token = lsptok(NULL, &length);		/* get :pathinfo */
 	local_node->jpath.pathinfo = nodeRead(true);	/* now read it */
@@ -1735,8 +1735,8 @@ _readHashPath()
 	token = lsptok(NULL, &length);		/* get :path_order */
 	local_node->jpath.path.path_order = nodeRead(true); /* now read it */
 
-	token = lsptok(NULL, &length);		/* get :keys */
-	local_node->jpath.path.keys = nodeRead(true);		/* now read it */
+	token = lsptok(NULL, &length);		/* get :pathkeys */
+	local_node->jpath.path.pathkeys = nodeRead(true);		/* now read it */
 
 	token = lsptok(NULL, &length);		/* get :pathinfo */
 	local_node->jpath.pathinfo = nodeRead(true);	/* now read it */
diff --git a/src/backend/optimizer/geqo/geqo_misc.c b/src/backend/optimizer/geqo/geqo_misc.c
index 6a68fe1ddb224dba1d74f8da3c54b0e6b0066734..e05959b8e89d32c5bacf1620701bf71be7029f97 100644
--- a/src/backend/optimizer/geqo/geqo_misc.c
+++ b/src/backend/optimizer/geqo/geqo_misc.c
@@ -5,7 +5,7 @@
  *
  * Copyright (c) 1994, Regents of the University of California
  *
- * $Id: geqo_misc.c,v 1.12 1999/02/03 20:15:27 momjian Exp $
+ * $Id: geqo_misc.c,v 1.13 1999/02/10 03:52:37 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -240,8 +240,8 @@ geqo_print_path(Query *root, Path *path, int indent)
 			List	   *k,
 					   *l;
 
-			printf(" keys=");
-			foreach(k, path->keys)
+			printf(" pathkeys=");
+			foreach(k, path->pathkeys)
 			{
 				printf("(");
 				foreach(l, lfirst(k))
diff --git a/src/backend/optimizer/path/allpaths.c b/src/backend/optimizer/path/allpaths.c
index ee8b6be27d787bfa85e4a8b8bc6e9b3406449f4f..e681fd87464ace2b5656b9319bb38c6e8df2996f 100644
--- a/src/backend/optimizer/path/allpaths.c
+++ b/src/backend/optimizer/path/allpaths.c
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/optimizer/path/allpaths.c,v 1.25 1999/02/03 20:15:28 momjian Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/optimizer/path/allpaths.c,v 1.26 1999/02/10 03:52:38 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -383,8 +383,8 @@ print_path(Query *root, Path *path, int indent)
 			List	   *k,
 					   *l;
 
-			printf(" keys=");
-			foreach(k, path->keys)
+			printf(" pathkeys=");
+			foreach(k, path->pathkeys)
 			{
 				printf("(");
 				foreach(l, lfirst(k))
diff --git a/src/backend/optimizer/path/costsize.c b/src/backend/optimizer/path/costsize.c
index 684a20d4ea24b1a6d5305f94070e8d64a191cbd5..91c32fce5f331b4f669cc5f60772c46b97904b1d 100644
--- a/src/backend/optimizer/path/costsize.c
+++ b/src/backend/optimizer/path/costsize.c
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/optimizer/path/costsize.c,v 1.27 1999/02/09 17:02:52 momjian Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/optimizer/path/costsize.c,v 1.28 1999/02/10 03:52:39 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -164,7 +164,7 @@ cost_index(Oid indexid,
  *	  2. the cost of reading the sort result into memory (another seqscan)
  *		 unless 'noread' is set
  *
- * 'keys' is a list of sort keys
+ * 'pathkeys' is a list of sort keys
  * 'tuples' is the number of tuples in the relation
  * 'width' is the average tuple width in bytes
  * 'noread' is a flag indicating that the sort result can remain on disk
@@ -174,7 +174,7 @@ cost_index(Oid indexid,
  *
  */
 Cost
-cost_sort(List *keys, int tuples, int width, bool noread)
+cost_sort(List *pathkeys, int tuples, int width, bool noread)
 {
 	Cost		temp = 0;
 	int			npages = page_size(tuples, width);
@@ -183,7 +183,7 @@ cost_sort(List *keys, int tuples, int width, bool noread)
 
 	if (!_enable_sort_)
 		temp += _disable_cost_;
-	if (tuples == 0 || keys == NULL)
+	if (tuples == 0 || pathkeys == NULL)
 	{
 		Assert(temp >= 0);
 		return temp;
@@ -194,8 +194,8 @@ cost_sort(List *keys, int tuples, int width, bool noread)
 	 * could be base_log(pages, NBuffers), but we are only doing 2-way
 	 * merges
 	 */
-	temp += _cpu_page_wight_ *
-		numTuples * base_log((double) pages, (double) 2.0);
+	temp += _cpu_page_wight_ * numTuples *
+		base_log((double) pages, (double) 2.0);
 
 	if (!noread)
 		temp = temp + cost_seqscan(_NONAME_RELATION_ID_, npages, tuples);
diff --git a/src/backend/optimizer/path/hashutils.c b/src/backend/optimizer/path/hashutils.c
index 1eebfa9b75d5d5e46b2660d6098ef8bfedb9755b..4354f881a67c4cdfa1242e5441bc099646af7dbf 100644
--- a/src/backend/optimizer/path/hashutils.c
+++ b/src/backend/optimizer/path/hashutils.c
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/optimizer/path/Attic/hashutils.c,v 1.11 1999/02/04 03:19:08 momjian Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/optimizer/path/Attic/hashutils.c,v 1.12 1999/02/10 03:52:39 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -58,21 +58,21 @@ group_clauses_by_hashop(List *restrictinfo_list,
 			Expr	   *clause = restrictinfo->clause;
 			Var		   *leftop = get_leftop(clause);
 			Var		   *rightop = get_rightop(clause);
-			JoinKey    *keys = (JoinKey *) NULL;
+			JoinKey    *joinkey = (JoinKey *) NULL;
 
 			xhashinfo = match_hashop_hashinfo(hashjoinop, hashinfo_list);
 
 			if (inner_relid == leftop->varno)
 			{
-				keys = makeNode(JoinKey);
-				keys->outer = rightop;
-				keys->inner = leftop;
+				joinkey = makeNode(JoinKey);
+				joinkey->outer = rightop;
+				joinkey->inner = leftop;
 			}
 			else
 			{
-				keys = makeNode(JoinKey);
-				keys->outer = leftop;
-				keys->inner = rightop;
+				joinkey = makeNode(JoinKey);
+				joinkey->outer = leftop;
+				joinkey->inner = rightop;
 			}
 
 			if (xhashinfo == NULL)
@@ -90,7 +90,7 @@ group_clauses_by_hashop(List *restrictinfo_list,
 
 			xhashinfo->jmethod.clauses = lcons(clause, xhashinfo->jmethod.clauses);
 
-			xhashinfo->jmethod.jmkeys = lcons(keys, xhashinfo->jmethod.jmkeys);
+			xhashinfo->jmethod.jmkeys = lcons(joinkey, xhashinfo->jmethod.jmkeys);
 		}
 	}
 	return hashinfo_list;
diff --git a/src/backend/optimizer/path/indxpath.c b/src/backend/optimizer/path/indxpath.c
index 770614eec04d747303a794e176d944f89b7ee1f8..f8590f9473bd771c38ac3bf988e0eaded2a50870 100644
--- a/src/backend/optimizer/path/indxpath.c
+++ b/src/backend/optimizer/path/indxpath.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/optimizer/path/indxpath.c,v 1.40 1999/02/09 03:51:17 momjian Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/optimizer/path/indxpath.c,v 1.41 1999/02/10 03:52:39 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -144,7 +144,7 @@ find_index_paths(Query *root,
 		 * restriction clauses, then create pathnodes corresponding to
 		 * each group of usable clauses.
 		 */
-		scanclausegroups = group_clauses_by_indexkey(rel,
+ 		scanclausegroups = group_clauses_by_indexkey(rel,
 													 index,
 													 index->indexkeys,
 													 index->classlist,
@@ -1293,7 +1293,7 @@ index_innerjoin(Query *root, RelOptInfo * rel, List *clausegroup_list,
 		pathnode->path.path_order = makeNode(PathOrder);
 	    pathnode->path.path_order->ordtype = SORTOP_ORDER;
 	    pathnode->path.path_order->ord.sortop = index->ordering;
-	    pathnode->path.keys = NIL;	/* not sure about this, bjm 1998/09/21 */
+	    pathnode->path.pathkeys = NIL;
 
 		pathnode->indexid = index->relids;
 		pathnode->indexkeys = index->indexkeys;
diff --git a/src/backend/optimizer/path/joinpath.c b/src/backend/optimizer/path/joinpath.c
index 76b4fd81e8f515cf394484b410d63dab769197e7..c0086fe559efb31b832bee61447fc71f72b85c8b 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.16 1999/02/09 03:51:19 momjian Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/optimizer/path/joinpath.c,v 1.17 1999/02/10 03:52:40 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -341,19 +341,19 @@ match_unsorted_outer(RelOptInfo * joinrel,
 
 		if (clauses)
 		{
-			List	   *keys = xmergeinfo->jmethod.jmkeys;
+			List	   *jmkeys = xmergeinfo->jmethod.jmkeys;
 			List	   *clauses = xmergeinfo->jmethod.clauses;
 
-			matchedJoinKeys = match_pathkeys_joinkeys(outerpath->keys,
-										keys,
+			matchedJoinKeys = match_pathkeys_joinkeys(outerpath->pathkeys,
+										jmkeys,
 										clauses,
 										OUTER,
 										&matchedJoinClauses);
-			merge_pathkeys = new_join_pathkeys(outerpath->keys,
+			merge_pathkeys = new_join_pathkeys(outerpath->pathkeys,
 								  joinrel->targetlist, clauses);
 		}
 		else
-			merge_pathkeys = outerpath->keys;
+			merge_pathkeys = outerpath->pathkeys;
 
 		if (best_innerjoin &&
 			path_is_cheaper(best_innerjoin, cheapest_inner))
@@ -415,7 +415,7 @@ match_unsorted_outer(RelOptInfo * joinrel,
 											matchedJoinClauses,
 											NIL,
 											varkeys),
-					  paths);
+									  paths);
 		}
 		else
 			temp_node = paths;
@@ -484,11 +484,11 @@ match_unsorted_inner(RelOptInfo * joinrel,
 
 		if (clauses)
 		{
-			List	   *keys = xmergeinfo->jmethod.jmkeys;
+			List	   *jmkeys = xmergeinfo->jmethod.jmkeys;
 			List	   *cls = xmergeinfo->jmethod.clauses;
 
-			matchedJoinKeys = match_pathkeys_joinkeys(innerpath->keys,
-										keys,
+			matchedJoinKeys = match_pathkeys_joinkeys(innerpath->pathkeys,
+										jmkeys,
 										cls,
 										INNER,
 										&matchedJoinClauses);
diff --git a/src/backend/optimizer/path/joinutils.c b/src/backend/optimizer/path/joinutils.c
index 411ab2cbb5e5943b78971b4e6687daf8ced0186c..bdfa430814259245696c1c0a3d49135b10a813f8 100644
--- a/src/backend/optimizer/path/joinutils.c
+++ b/src/backend/optimizer/path/joinutils.c
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/optimizer/path/Attic/joinutils.c,v 1.13 1999/02/09 17:02:55 momjian Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/optimizer/path/Attic/joinutils.c,v 1.14 1999/02/10 03:52:40 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -44,7 +44,7 @@ static List *new_matching_subkeys(Var *subkey, List *considered_subkeys,
  * match-pathkeys-joinkeys--
  *	  Attempts to match the keys of a path against the keys of join clauses.
  *	  This is done by looking for a matching join key in 'joinkeys' for
- *	  every path key in the list 'pathkeys'. If there is a matching join key
+ *	  every path key in the list 'path.keys'. If there is a matching join key
  *	  (not necessarily unique) for every path key, then the list of
  *	  corresponding join keys and join clauses are returned in the order in
  *	  which the keys matched the path keys.
@@ -216,10 +216,10 @@ match_paths_joinkeys(List *joinkeys,
 	{
 		Path	   *path = (Path *) lfirst(i);
 
-		key_match = every_func(joinkeys, path->keys, which_subkey);
+		key_match = every_func(joinkeys, path->pathkeys, which_subkey);
 
 		if (equal_path_ordering(ordering, path->path_order) &&
-			length(joinkeys) == length(path->keys) &&
+			length(joinkeys) == length(path->pathkeys) &&
 			key_match)
 		{
 
@@ -249,7 +249,7 @@ match_paths_joinkeys(List *joinkeys,
  *		in 'joinkeys'
  *
  * Returns a list of pathkeys: ((tlvar1)(tlvar2)...(tlvarN)).
- * [I've no idea why they have to be list of lists. Should be fixed. -ay 12/94]
+ * It is a list of lists because of multi-key indexes.
  */
 List *
 extract_path_keys(List *joinkeys,
diff --git a/src/backend/optimizer/path/mergeutils.c b/src/backend/optimizer/path/mergeutils.c
index 70c230aef3aa2f08ca2d1cb3c633bd62b3c6d74d..00cc5e2399470a4c65df5eea28424838e181b287 100644
--- a/src/backend/optimizer/path/mergeutils.c
+++ b/src/backend/optimizer/path/mergeutils.c
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/optimizer/path/Attic/mergeutils.c,v 1.15 1999/02/09 03:51:20 momjian Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/optimizer/path/Attic/mergeutils.c,v 1.16 1999/02/10 03:52:41 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -57,7 +57,7 @@ group_clauses_by_order(List *restrictinfo_list,
 			Expr	   *clause = restrictinfo->clause;
 			Var		   *leftop = get_leftop(clause);
 			Var		   *rightop = get_rightop(clause);
-			JoinKey    *keys;
+			JoinKey    *jmkeys;
 
 			path_order = makeNode(PathOrder);
 			path_order->ordtype = MERGE_ORDER;
@@ -65,15 +65,15 @@ group_clauses_by_order(List *restrictinfo_list,
 			xmergeinfo = match_order_mergeinfo(path_order, mergeinfo_list);
 			if (inner_relid == leftop->varno)
 			{
-				keys = makeNode(JoinKey);
-				keys->outer = rightop;
-				keys->inner = leftop;
+				jmkeys = makeNode(JoinKey);
+				jmkeys->outer = rightop;
+				jmkeys->inner = leftop;
 			}
 			else
 			{
-				keys = makeNode(JoinKey);
-				keys->outer = leftop;
-				keys->inner = rightop;
+				jmkeys = makeNode(JoinKey);
+				jmkeys->outer = leftop;
+				jmkeys->inner = rightop;
 			}
 
 			if (xmergeinfo == NULL)
@@ -87,7 +87,7 @@ group_clauses_by_order(List *restrictinfo_list,
 
 			((JoinMethod *) xmergeinfo)->clauses = lcons(clause,
 					  ((JoinMethod *) xmergeinfo)->clauses);
-			((JoinMethod *) xmergeinfo)->jmkeys = lcons(keys,
+			((JoinMethod *) xmergeinfo)->jmkeys = lcons(jmkeys,
 					  ((JoinMethod *) xmergeinfo)->jmkeys);
 		}
 	}
diff --git a/src/backend/optimizer/path/orindxpath.c b/src/backend/optimizer/path/orindxpath.c
index 1414a3f82376322212dd51497a4a9792bdc21461..af5ca4407b4f1896a433b6d0a9b5c27354bb66a6 100644
--- a/src/backend/optimizer/path/orindxpath.c
+++ b/src/backend/optimizer/path/orindxpath.c
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/optimizer/path/orindxpath.c,v 1.16 1999/02/09 03:51:20 momjian Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/optimizer/path/orindxpath.c,v 1.17 1999/02/10 03:52:41 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -112,7 +112,7 @@ create_or_index_paths(Query *root,
 				 *	not in any order, so the sortop is NULL.
 				 */
 			    pathnode->path.path_order->ord.sortop = NULL;
-			    pathnode->path.keys = NIL;	/* not sure about this, bjm 1998/09/21 */
+			    pathnode->path.pathkeys = NIL;
 
 				pathnode->indexqual = lcons(clausenode, NIL);
 				pathnode->indexid = indexids;
diff --git a/src/backend/optimizer/plan/createplan.c b/src/backend/optimizer/plan/createplan.c
index 69b7ead092b2e22dff4ee7e60622d0ca91eb4117..fbad2306db79dbe19d644df5de50cfe59d99aab6 100644
--- a/src/backend/optimizer/plan/createplan.c
+++ b/src/backend/optimizer/plan/createplan.c
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/optimizer/plan/createplan.c,v 1.40 1999/02/09 17:02:55 momjian Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/optimizer/plan/createplan.c,v 1.41 1999/02/10 03:52:44 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -60,7 +60,7 @@ static HashJoin *create_hashjoin_node(HashPath *best_path, List *tlist,
 					 List *clauses, Plan *outer_node, List *outer_tlist,
 					 Plan *inner_node, List *inner_tlist);
 static Node *fix_indxqual_references(Node *clause, Path *index_path);
-static Noname *make_noname(List *tlist, List *keys, Oid *operators,
+static Noname *make_noname(List *tlist, List *pathkeys, Oid *operators,
 		  Plan *plan_node, int nonametype);
 static IndexScan *make_indexscan(List *qptlist, List *qpqual, Index scanrelid,
 			   List *indxid, List *indxqual, List *indxqualorig, Cost cost);
@@ -814,19 +814,19 @@ switch_outer(List *clauses)
 static List *
 set_noname_tlist_operators(List *tlist, List *pathkeys, Oid *operators)
 {
-	Node	   *keys = NULL;
+	Node	   *pathkey = NULL;
 	int			keyno = 1;
 	Resdom	   *resdom = (Resdom *) NULL;
 	List	   *i = NIL;
 
 	foreach(i, pathkeys)
 	{
-		keys = lfirst((List *) lfirst(i));
-		resdom = tlist_member((Var *) keys, tlist);
+		pathkey = lfirst((List *) lfirst(i));
+		resdom = tlist_member((Var *) pathkey, tlist);
 		if (resdom)
 		{
 			/*
-			 * Order the resdom keys and replace the operator OID for each
+			 * Order the resdom pathkey and replace the operator OID for each
 			 * key with the regproc OID.
 			 *
 			 * XXX Note that the optimizer only generates merge joins with 1
@@ -852,7 +852,7 @@ set_noname_tlist_operators(List *tlist, List *pathkeys, Oid *operators)
  *	  or (SEQSCAN(MATERIAL(plan-node)))
  *
  *	  'tlist' is the target list of the scan to be sorted or hashed
- *	  'keys' is the list of keys which the sort or hash will be done on
+ *	  'pathkeys' is the list of keys which the sort or hash will be done on
  *	  'operators' is the operators with which the sort or hash is to be done
  *		(a list of operator OIDs)
  *	  'plan-node' is the node which yields tuples for the sort
@@ -860,7 +860,7 @@ set_noname_tlist_operators(List *tlist, List *pathkeys, Oid *operators)
  */
 static Noname *
 make_noname(List *tlist,
-		  List *keys,
+		  List *pathkeys,
 		  Oid *operators,
 		  Plan *plan_node,
 		  int nonametype)
@@ -870,7 +870,7 @@ make_noname(List *tlist,
 
 	/* Create a new target list for the noname, with keys set. */
 	noname_tlist = set_noname_tlist_operators(new_unsorted_tlist(tlist),
-										  keys,
+										  pathkeys,
 										  operators);
 	switch (nonametype)
 	{
@@ -881,7 +881,7 @@ make_noname(List *tlist,
 										   (Plan *) make_sort(noname_tlist,
 													  _NONAME_RELATION_ID_,
 															  plan_node,
-														  length(keys)));
+														  length(pathkeys)));
 			break;
 
 		case NONAME_MATERIAL:
@@ -891,7 +891,7 @@ make_noname(List *tlist,
 									   (Plan *) make_material(noname_tlist,
 													  _NONAME_RELATION_ID_,
 															  plan_node,
-														  length(keys)));
+														  length(pathkeys)));
 			break;
 
 		default:
diff --git a/src/backend/optimizer/util/keys.c b/src/backend/optimizer/util/keys.c
index 12057bd2be0cb0d9e2559e384e7fbd31cc9fcd2b..3c5197daebc3772554382a71e6cbd39a57eeb709 100644
--- a/src/backend/optimizer/util/keys.c
+++ b/src/backend/optimizer/util/keys.c
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/optimizer/util/Attic/keys.c,v 1.12 1999/02/09 06:30:39 momjian Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/optimizer/util/Attic/keys.c,v 1.13 1999/02/10 03:52:47 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -207,8 +207,7 @@ collect_index_pathkeys(int *index_keys, List *tlist)
 							   tlist,
 							   equal_indexkey_var);
 		if (mvar)
-			retval = nconc(retval, lcons(lcons(mvar, NIL),
-										 NIL));
+			retval = lappend(retval, lcons(mvar, NIL));
 		index_keys++;
 	}
 	return retval;
diff --git a/src/backend/optimizer/util/pathnode.c b/src/backend/optimizer/util/pathnode.c
index 82dc20f5455baba4f6a3c0acf31e79e6960e7791..a645b35a0eba8bc689053ab4926132c9412879dd 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.21 1999/02/09 03:51:27 momjian Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/optimizer/util/pathnode.c,v 1.22 1999/02/10 03:52:47 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -165,15 +165,15 @@ better_path(Path *new_path, List *unique_paths, bool *noOther)
 		path = (Path *) lfirst(temp);
 
 #ifdef OPTDUP_DEBUG
-		if (!samekeys(path->keys, new_path->keys))
+		if (!samekeys(path->pathkeys, new_path->pathkeys))
 		{
 			printf("oldpath\n");
-			pprint(path->keys);
+			pprint(path->pathkeys);
 			printf("newpath\n");
-			pprint(new_path->keys);
-			if (path->keys && new_path->keys &&
-				length(lfirst(path->keys)) >= 2 &&
-				length(lfirst(path->keys)) < length(lfirst(new_path->keys)))
+			pprint(new_path->pathkeys);
+			if (path->pathkeys && new_path->pathkeys &&
+				length(lfirst(path->pathkeys)) >= 2 &&
+				length(lfirst(path->pathkeys)) < length(lfirst(new_path->pathkeys)))
 				sleep(0); /* set breakpoint here */
 		}
 		if (!equal_path_ordering(path->path_order,
@@ -186,7 +186,7 @@ better_path(Path *new_path, List *unique_paths, bool *noOther)
 		}
 #endif
 		
-		if (samekeys(path->keys, new_path->keys) &&
+		if (samekeys(path->pathkeys, new_path->pathkeys) &&
 			equal_path_ordering(path->path_order,
 								new_path->path_order))
 		{
@@ -232,7 +232,7 @@ create_seqscan_path(RelOptInfo * rel)
 	pathnode->path_order = makeNode(PathOrder);
 	pathnode->path_order->ordtype = SORTOP_ORDER;
 	pathnode->path_order->ord.sortop = NULL;
-	pathnode->keys = NIL;
+	pathnode->pathkeys = NIL;
 
 	/*
 	 * copy restrictinfo list into path for expensive function processing --
@@ -300,7 +300,7 @@ create_index_path(Query *root,
 	 */
 	if (pathnode->path.path_order->ord.sortop)
 	{
-		pathnode->path.keys = collect_index_pathkeys(index->indexkeys,
+		pathnode->path.pathkeys = collect_index_pathkeys(index->indexkeys,
 													 rel->targetlist);
 
 		/*
@@ -309,11 +309,11 @@ create_index_path(Query *root,
 		 * relevant to the scan are not applied to the scan path node, so
 		 * if no index keys were found, we can't order the path).
 		 */
-		if (pathnode->path.keys == NULL)
+		if (pathnode->path.pathkeys == NULL)
 			pathnode->path.path_order->ord.sortop = NULL;
 	}
 	else
-		pathnode->path.keys = NULL;
+		pathnode->path.pathkeys = NULL;
 
 	if (is_join_scan || restriction_clauses == NULL)
 	{
@@ -413,7 +413,7 @@ create_index_path(Query *root,
  * 'outer_rel' is the outer join relation
  * 'outer_path' is the outer join path.
  * 'inner_path' is the inner join path.
- * 'keys' are the keys of the path
+ * 'pathkeys' are the keys of the path
  *
  * Returns the resulting path node.
  *
@@ -423,7 +423,7 @@ create_nestloop_path(RelOptInfo * joinrel,
 					 RelOptInfo * outer_rel,
 					 Path *outer_path,
 					 Path *inner_path,
-					 List *keys)
+					 List *pathkeys)
 {
 	JoinPath   *pathnode = makeNode(JoinPath);
 
@@ -432,13 +432,13 @@ create_nestloop_path(RelOptInfo * joinrel,
 	pathnode->outerjoinpath = outer_path;
 	pathnode->innerjoinpath = inner_path;
 	pathnode->pathinfo = joinrel->restrictinfo;
-	pathnode->path.keys = keys;
+	pathnode->path.pathkeys = pathkeys;
 	pathnode->path.joinid = NIL;
 	pathnode->path.outerjoincost = (Cost) 0.0;
 	pathnode->path.loc_restrictinfo = NIL;
 	pathnode->path.path_order = makeNode(PathOrder);
 	
-	if (keys)
+	if (pathkeys)
 	{
 		pathnode->path.path_order->ordtype = outer_path->path_order->ordtype;
 		if (outer_path->path_order->ordtype == SORTOP_ORDER)
@@ -479,7 +479,7 @@ create_nestloop_path(RelOptInfo * joinrel,
  * 'innerwidth' is the number of bytes per tuple in the inner relation
  * 'outer_path' is the outer path
  * 'inner_path' is the inner path
- * 'keys' are the new keys of the join relation
+ * 'pathkeys' are the new keys of the join relation
  * 'order' is the sort order required for the merge
  * 'mergeclauses' are the applicable join/restriction clauses
  * 'outersortkeys' are the sort varkeys for the outer relation
@@ -494,7 +494,7 @@ create_mergejoin_path(RelOptInfo * joinrel,
 					  int innerwidth,
 					  Path *outer_path,
 					  Path *inner_path,
-					  List *keys,
+					  List *pathkeys,
 					  MergeOrder *order,
 					  List *mergeclauses,
 					  List *outersortkeys,
@@ -507,7 +507,7 @@ create_mergejoin_path(RelOptInfo * joinrel,
 	pathnode->jpath.outerjoinpath = outer_path;
 	pathnode->jpath.innerjoinpath = inner_path;
 	pathnode->jpath.pathinfo = joinrel->restrictinfo;
-	pathnode->jpath.path.keys = keys;
+	pathnode->jpath.path.pathkeys = pathkeys;
 	pathnode->jpath.path.path_order = makeNode(PathOrder);
 	pathnode->jpath.path.path_order->ordtype = MERGE_ORDER;
 	pathnode->jpath.path.path_order->ord.merge = order;
@@ -544,7 +544,7 @@ create_mergejoin_path(RelOptInfo * joinrel,
  * 'innerwidth' is the number of bytes per tuple in the inner relation
  * 'outer_path' is the outer path
  * 'inner_path' is the inner path
- * 'keys' are the new keys of the join relation
+ * 'pathkeys' are the new keys of the join relation
  * 'operator' is the hashjoin operator
  * 'hashclauses' are the applicable join/restriction clauses
  * 'outerkeys' are the sort varkeys for the outer relation
@@ -559,7 +559,7 @@ create_hashjoin_path(RelOptInfo * joinrel,
 					 int innerwidth,
 					 Path *outer_path,
 					 Path *inner_path,
-					 List *keys,
+					 List *pathkeys,
 					 Oid operator,
 					 List *hashclauses,
 					 List *outerkeys,
@@ -573,7 +573,7 @@ create_hashjoin_path(RelOptInfo * joinrel,
 	pathnode->jpath.innerjoinpath = inner_path;
 	pathnode->jpath.pathinfo = joinrel->restrictinfo;
 	pathnode->jpath.path.loc_restrictinfo = NIL;
-	pathnode->jpath.path.keys = keys;
+	pathnode->jpath.path.pathkeys = pathkeys;
 	pathnode->jpath.path.path_order = makeNode(PathOrder);
 	pathnode->jpath.path.path_order->ordtype = SORTOP_ORDER;
 	pathnode->jpath.path.path_order->ord.sortop = NULL;
diff --git a/src/include/nodes/print.h b/src/include/nodes/print.h
index 0df89e2e1576f00751b5b7e81543c16a16db7ce6..643d651170ff3cf6f17b98e1b1c126006780181a 100644
--- a/src/include/nodes/print.h
+++ b/src/include/nodes/print.h
@@ -6,7 +6,7 @@
  *
  * Copyright (c) 1994, Regents of the University of California
  *
- * $Id: print.h,v 1.8 1998/09/01 04:36:48 momjian Exp $
+ * $Id: print.h,v 1.9 1999/02/10 03:52:49 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -23,7 +23,7 @@ extern void print(void *obj);
 extern void pprint(void *obj);
 extern void print_rt(List *rtable);
 extern void print_expr(Node *expr, List *rtable);
-extern void print_keys(List *keys, List *rtable);
+extern void print_pathkeys(List *pathkeys, List *rtable);
 extern void print_tl(List *tlist, List *rtable);
 extern void print_slot(TupleTableSlot *slot);
 extern void print_plan_recursive(Plan *p, Query *parsetree,
diff --git a/src/include/nodes/relation.h b/src/include/nodes/relation.h
index 7df407f5671db99a55c57bebd6f5e885c444fd76..bdf0b932037dfebb6bc10ebdc18e6703010c4e7a 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.17 1999/02/09 03:51:42 momjian Exp $
+ * $Id: relation.h,v 1.18 1999/02/10 03:52:50 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -148,7 +148,10 @@ typedef struct Path
 
 	PathOrder	*path_order;
 
-	List	   *keys;		/* this is a List of List of keys */
+	List	    *pathkeys;	/* This is a List of List of Var nodes.
+							 * It is a List of Lists because of multi-key
+							 * indexes.
+							 */							   
 	Cost		outerjoincost;
 	Relid		joinid;
 	List	   *loc_restrictinfo;
diff --git a/src/include/optimizer/cost.h b/src/include/optimizer/cost.h
index 7d6035c6d4451ce2aeb9a4bb210b466580d83c5d..4a7c8e86f50f4563870b3a7ad488d4134a1891d5 100644
--- a/src/include/optimizer/cost.h
+++ b/src/include/optimizer/cost.h
@@ -6,7 +6,7 @@
  *
  * Copyright (c) 1994, Regents of the University of California
  *
- * $Id: cost.h,v 1.12 1999/02/03 20:15:52 momjian Exp $
+ * $Id: cost.h,v 1.13 1999/02/10 03:52:53 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -34,7 +34,7 @@ extern Cost cost_seqscan(int relid, int relpages, int reltuples);
 extern Cost cost_index(Oid indexid, int expected_indexpages, Cost selec,
 		   int relpages, int reltuples, int indexpages,
 		   int indextuples, bool is_injoin);
-extern Cost cost_sort(List *keys, int tuples, int width, bool noread);
+extern Cost cost_sort(List *pathkeys, int tuples, int width, bool noread);
 extern Cost cost_nestloop(Cost outercost, Cost innercost, int outertuples,
 			  int innertuples, int outerpages, bool is_indexjoin);
 extern Cost cost_mergejoin(Cost outercost, Cost innercost,
diff --git a/src/include/optimizer/pathnode.h b/src/include/optimizer/pathnode.h
index 4c8501de952b9a2e1ae5f307272b4f36bc4ac876..19eb5373be593f837ae5be46e5e8caf1207f9e01 100644
--- a/src/include/optimizer/pathnode.h
+++ b/src/include/optimizer/pathnode.h
@@ -6,7 +6,7 @@
  *
  * Copyright (c) 1994, Regents of the University of California
  *
- * $Id: pathnode.h,v 1.10 1998/09/01 04:37:13 momjian Exp $
+ * $Id: pathnode.h,v 1.11 1999/02/10 03:52:54 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -28,15 +28,15 @@ extern Path *create_seqscan_path(RelOptInfo * rel);
 extern IndexPath *create_index_path(Query *root, RelOptInfo * rel, RelOptInfo * index,
 				  List *restriction_clauses, bool is_join_scan);
 extern JoinPath *create_nestloop_path(RelOptInfo * joinrel, RelOptInfo * outer_rel,
-					 Path *outer_path, Path *inner_path, List *keys);
+					 Path *outer_path, Path *inner_path, List *pathkeys);
 extern MergePath *create_mergejoin_path(RelOptInfo * joinrel, int outersize,
 		 int innersize, int outerwidth, int innerwidth, Path *outer_path,
-					  Path *inner_path, List *keys, MergeOrder *order,
+					  Path *inner_path, List *pathkeys, MergeOrder *order,
 		   List *mergeclauses, List *outersortkeys, List *innersortkeys);
 
 extern HashPath *create_hashjoin_path(RelOptInfo * joinrel, int outersize,
 		 int innersize, int outerwidth, int innerwidth, Path *outer_path,
-		   Path *inner_path, List *keys, Oid operator, List *hashclauses,
+		   Path *inner_path, List *pathkeys, Oid operator, List *hashclauses,
 					 List *outerkeys, List *innerkeys);
 
 /*