diff --git a/src/backend/nodes/copyfuncs.c b/src/backend/nodes/copyfuncs.c
index 5d848df5ab46cc20f77043aa0e4df4b272cdec45..1e2373c25f1859d10c8d91cd5d3411eea5b2fb29 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.16 1997/11/25 21:59:40 momjian Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/nodes/copyfuncs.c,v 1.17 1997/12/18 03:03:31 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -516,7 +516,7 @@ _copyAgg(Agg *from)
 	CopyTempFields((Temp *) from, (Temp *) newnode);
 
 	newnode->numAgg = from->numAgg;
-	newnode->aggs = malloc(sizeof(Aggreg *));
+    newnode->aggs = palloc(sizeof(Aggreg *));
 	for (i = 0; i < from->numAgg; i++)
 	{
 		newnode->aggs[i] = copyObject(from->aggs[i]);
@@ -1519,7 +1519,7 @@ static Query *
 _copyQuery(Query *from)
 {
 	Query	   *newnode = makeNode(Query);
-
+	
 	newnode->commandType = from->commandType;
 	newnode->resultRelation = from->resultRelation;
 	/* probably should dup this string instead of just pointing */
@@ -1555,6 +1555,11 @@ _copyQuery(Query *from)
 	Node_Copy(from, newnode, targetList);
 	Node_Copy(from, newnode, qual);
 
+	Node_Copy(from, newnode, groupClause);
+	Node_Copy(from, newnode, havingQual); /* currently ignored */
+
+	Node_Copy(from, newnode, Aggreg);
+
 	return newnode;
 }
 
diff --git a/src/backend/optimizer/plan/createplan.c b/src/backend/optimizer/plan/createplan.c
index 00898ded097b31272f2b8ef6362b12f3ee6aba51..2be872f9302694abcf022f502264b65bd89e5f5d 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.16 1997/11/25 21:59:56 momjian Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/optimizer/plan/createplan.c,v 1.17 1997/12/18 03:03:35 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -943,7 +943,7 @@ make_seqscan(List *qptlist,
 	SeqScan    *node = makeNode(SeqScan);
 	Plan	   *plan = &node->plan;
 
-	plan->cost = 0.0;
+    plan->cost = (lefttree ? lefttree->cost : 0);
 	plan->state = (EState *) NULL;
 	plan->targetlist = qptlist;
 	plan->qual = qpqual;
@@ -989,7 +989,8 @@ make_nestloop(List *qptlist,
 	NestLoop   *node = makeNode(NestLoop);
 	Plan	   *plan = &node->join;
 
-	plan->cost = 0.0;
+    plan->cost = (lefttree ? lefttree->cost : 0) +
+		 (righttree ? righttree->cost : 0);
 	plan->state = (EState *) NULL;
 	plan->targetlist = qptlist;
 	plan->qual = qpqual;
@@ -1010,6 +1011,8 @@ make_hashjoin(List *tlist,
 	HashJoin   *node = makeNode(HashJoin);
 	Plan	   *plan = &node->join;
 
+    plan->cost = (lefttree ? lefttree->cost : 0) +
+		 (righttree ? righttree->cost : 0);
 	plan->cost = 0.0;
 	plan->state = (EState *) NULL;
 	plan->targetlist = tlist;
@@ -1031,6 +1034,7 @@ make_hash(List *tlist, Var *hashkey, Plan *lefttree)
 	Hash	   *node = makeNode(Hash);
 	Plan	   *plan = &node->plan;
 
+    plan->cost = (lefttree ? lefttree->cost : 0);
 	plan->cost = 0.0;
 	plan->state = (EState *) NULL;
 	plan->targetlist = tlist;
@@ -1058,7 +1062,8 @@ make_mergesort(List *tlist,
 	MergeJoin  *node = makeNode(MergeJoin);
 	Plan	   *plan = &node->join;
 
-	plan->cost = 0.0;
+    plan->cost = (lefttree ? lefttree->cost : 0) +
+		 (righttree ? righttree->cost : 0);
 	plan->state = (EState *) NULL;
 	plan->targetlist = tlist;
 	plan->qual = qpqual;
@@ -1078,7 +1083,7 @@ make_sort(List *tlist, Oid tempid, Plan *lefttree, int keycount)
 	Sort	   *node = makeNode(Sort);
 	Plan	   *plan = &node->plan;
 
-	plan->cost = 0.0;
+    plan->cost = (lefttree ? lefttree->cost : 0);
 	plan->state = (EState *) NULL;
 	plan->targetlist = tlist;
 	plan->qual = NIL;
@@ -1099,7 +1104,7 @@ make_material(List *tlist,
 	Material   *node = makeNode(Material);
 	Plan	   *plan = &node->plan;
 
-	plan->cost = 0.0;
+    plan->cost = (lefttree ? lefttree->cost : 0);
 	plan->state = (EState *) NULL;
 	plan->targetlist = tlist;
 	plan->qual = NIL;
@@ -1137,7 +1142,7 @@ make_group(List *tlist,
 {
 	Group	   *node = makeNode(Group);
 
-	node->plan.cost = 0.0;
+    node->plan.cost = (lefttree ? lefttree->plan.cost : 0);
 	node->plan.state = (EState *) NULL;
 	node->plan.qual = NULL;
 	node->plan.targetlist = tlist;
@@ -1164,7 +1169,7 @@ make_unique(List *tlist, Plan *lefttree, char *uniqueAttr)
 	Unique	   *node = makeNode(Unique);
 	Plan	   *plan = &node->plan;
 
-	plan->cost = 0.0;
+    plan->cost = (lefttree ? lefttree->cost : 0);
 	plan->state = (EState *) NULL;
 	plan->targetlist = tlist;
 	plan->qual = NIL;
diff --git a/src/backend/optimizer/plan/planmain.c b/src/backend/optimizer/plan/planmain.c
index fe499341010ddcb49e96414eedb2391bacd1f725..a841b64063a63c75a064c7177c7327f05dff50ee 100644
--- a/src/backend/optimizer/plan/planmain.c
+++ b/src/backend/optimizer/plan/planmain.c
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/optimizer/plan/planmain.c,v 1.8 1997/09/25 12:21:15 vadim Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/optimizer/plan/planmain.c,v 1.9 1997/12/18 03:03:38 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -362,7 +362,7 @@ make_result(List *tlist,
 	Plan	   *plan = &node->plan;
 
 	tlist = generate_fjoin(tlist);
-	plan->cost = 0.0;
+    plan->cost = (subplan ? subplan->cost : 0);
 	plan->state = (EState *) NULL;
 	plan->targetlist = tlist;
 	plan->lefttree = subplan;
diff --git a/src/backend/optimizer/prep/prepunion.c b/src/backend/optimizer/prep/prepunion.c
index 00dd4079780f2c72a330e664ae1ff5c3c35d65e5..e5346c388d78dc2ec041b41ffb9fa60da9814cff 100644
--- a/src/backend/optimizer/prep/prepunion.c
+++ b/src/backend/optimizer/prep/prepunion.c
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/optimizer/prep/prepunion.c,v 1.9 1997/11/25 22:00:10 momjian Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/optimizer/prep/prepunion.c,v 1.10 1997/12/18 03:03:41 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -241,6 +241,9 @@ plan_union_query(List *relids,
 /*		new_root->uniqueFlag = false; */
 		new_root->uniqueFlag = NULL;
 		new_root->sortClause = NULL;
+		new_root->groupClause = NULL;
+		new_root->qry_numAgg = 0;
+		new_root->qry_aggs = NULL;
 		fix_parsetree_attnums(rt_index,
 							  rt_entry->relid,
 							  relid,