diff --git a/src/backend/optimizer/prep/prepunion.c b/src/backend/optimizer/prep/prepunion.c
index b703bf2b86e095c81dcc95435f32e7f16334ca3e..25dfc2611e8ab9466ba31a2b750fd2d3c4f7d3b2 100644
--- a/src/backend/optimizer/prep/prepunion.c
+++ b/src/backend/optimizer/prep/prepunion.c
@@ -14,7 +14,7 @@
  *
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/optimizer/prep/prepunion.c,v 1.109 2004/04/07 18:17:25 tgl Exp $
+ *	  $PostgreSQL: pgsql/src/backend/optimizer/prep/prepunion.c,v 1.110 2004/05/11 22:43:55 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -264,8 +264,11 @@ generate_union_plan(SetOperationStmt *op, Query *parse,
 		List	   *sortList;
 
 		sortList = addAllTargetsToSortList(NULL, NIL, tlist, false);
-		plan = (Plan *) make_sort_from_sortclauses(parse, sortList, plan);
-		plan = (Plan *) make_unique(plan, sortList);
+		if (sortList)
+		{
+			plan = (Plan *) make_sort_from_sortclauses(parse, sortList, plan);
+			plan = (Plan *) make_unique(plan, sortList);
+		}
 		*sortClauses = sortList;
 	}
 	else
@@ -324,6 +327,13 @@ generate_nonunion_plan(SetOperationStmt *op, Query *parse,
 	 * correct output.
 	 */
 	sortList = addAllTargetsToSortList(NULL, NIL, tlist, false);
+
+	if (sortList == NIL)		/* nothing to sort on? */
+	{
+		*sortClauses = NIL;
+		return plan;
+	}
+
 	plan = (Plan *) make_sort_from_sortclauses(parse, sortList, plan);
 	switch (op->op)
 	{
@@ -519,9 +529,9 @@ generate_append_tlist(List *colTypes, bool flag,
 	 * First extract typmods to use.
 	 *
 	 * If the inputs all agree on type and typmod of a particular column, use
-	 * that typmod; else use -1.
+	 * that typmod; else use -1.  (+1 here in case of zero columns.)
 	 */
-	colTypmods = (int32 *) palloc(length(colTypes) * sizeof(int32));
+	colTypmods = (int32 *) palloc(length(colTypes) * sizeof(int32) + 1);
 
 	foreach(planl, input_plans)
 	{