diff --git a/src/backend/optimizer/prep/prepunion.c b/src/backend/optimizer/prep/prepunion.c
index 5cb89aac867f600aae446a67acc04f54fe2c9a65..e942173a74548b6bba658244c4158e2b89bd960d 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.16 1997/12/29 01:12:48 momjian Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/optimizer/prep/prepunion.c,v 1.17 1997/12/29 04:31:23 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -177,14 +177,12 @@ plan_union_queries(Query *parse)
 	{
 		parse->uniqueFlag = "*";
 		parse->sortClause = transformSortClause(NULL, NIL,
-			((Plan *) lfirst(union_plans))->targetlist, "*");
+			parse->sortClause,
+			parse->targetList, "*");
 	}
 	else
-	{
 		/* needed so we don't take the flag from the first query */
 		parse->uniqueFlag = NULL;
-		parse->sortClause = NIL;
-	}
 
 	parse->havingQual = NULL;
 	parse->qry_numAgg = 0;
diff --git a/src/backend/parser/analyze.c b/src/backend/parser/analyze.c
index 0d1d3dcb248dc7168aa85ffed8739879b8e8c713..5837fa8fb701ec9bd1dbf5256f37dfcb783bc3c4 100644
--- a/src/backend/parser/analyze.c
+++ b/src/backend/parser/analyze.c
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/parser/analyze.c,v 1.58 1997/12/29 01:12:55 momjian Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/parser/analyze.c,v 1.59 1997/12/29 04:31:28 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -828,6 +828,7 @@ transformSelectStmt(ParseState *pstate, RetrieveStmt *stmt)
 	/* fix order clause */
 	qry->sortClause = transformSortClause(pstate,
 										  stmt->sortClause,
+										  NIL,
 										  qry->targetList,
 										  qry->uniqueFlag);
 
@@ -842,9 +843,6 @@ transformSelectStmt(ParseState *pstate, RetrieveStmt *stmt)
 	qry->unionall = stmt->unionall;	/* in child, so unionClause may be false */
 	qry->unionClause = transformUnionClause(stmt->unionClause, qry->targetList);
 
-	if (qry->unionClause && stmt->sortClause)
-		elog(WARN, "You can not use ORDER BY with UNION", NULL);
-
 	return (Query *) qry;
 }
 
@@ -918,6 +916,7 @@ transformCursorStmt(ParseState *pstate, CursorStmt *stmt)
 	/* fix order clause */
 	qry->sortClause = transformSortClause(pstate,
 										  stmt->sortClause,
+										  NIL,
 										  qry->targetList,
 										  qry->uniqueFlag);
 	/* fix group by clause */
diff --git a/src/backend/parser/parse_clause.c b/src/backend/parser/parse_clause.c
index 8028329b437455550ba125977a70d250d538e179..204f45bb59f2502cc1db8d1519a6a21f7a2ee9de 100644
--- a/src/backend/parser/parse_clause.c
+++ b/src/backend/parser/parse_clause.c
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/parser/parse_clause.c,v 1.5 1997/12/29 02:09:54 momjian Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/parser/parse_clause.c,v 1.6 1997/12/29 04:31:31 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -249,10 +249,11 @@ transformGroupClause(ParseState *pstate, List *grouplist, List *targetlist)
  */
 List *
 transformSortClause(ParseState *pstate,
-					List *orderlist, List *targetlist,
+					List *orderlist,
+					List *sortlist,
+					List *targetlist,
 					char *uniqueFlag)
 {
-	List	   *sortlist = NIL;
 	List	   *s = NIL;
 
 	while (orderlist != NIL)
@@ -262,6 +263,8 @@ transformSortClause(ParseState *pstate,
 		TargetEntry *restarget;
 		Resdom	   *resdom;
 
+		sortlist = NIL;	/* we create it on the fly here */
+		
 		restarget = find_targetlist_entry(pstate, sortby, targetlist);
 		if (restarget == NULL)
 			elog(WARN, "The field being ordered by must appear in the target list");
diff --git a/src/include/parser/parse_clause.h b/src/include/parser/parse_clause.h
index d402faeb11af9ca14d20322ed51befe1303a15ad..4c04a41cb3be940ed1c5c5ba9f1e96a85d7bc519 100644
--- a/src/include/parser/parse_clause.h
+++ b/src/include/parser/parse_clause.h
@@ -6,7 +6,7 @@
  *
  * Copyright (c) 1994, Regents of the University of California
  *
- * $Id: parse_clause.h,v 1.4 1997/12/29 01:13:28 momjian Exp $
+ * $Id: parse_clause.h,v 1.5 1997/12/29 04:31:50 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -24,8 +24,8 @@ extern Node *transformWhereClause(ParseState *pstate, Node *a_expr);
 extern List *transformGroupClause(ParseState *pstate, List *grouplist,
 			List *targetlist);
 extern List *transformSortClause(ParseState *pstate,
-					List *orderlist, List *targetlist,
-					char *uniqueFlag);
+					List *orderlist, List *sortClause,
+					List *targetlist, char *uniqueFlag);
 extern List *transformUnionClause(List *unionClause, List *targetlist);
 
 #endif							/* PARSE_CLAUSE_H */