diff --git a/src/backend/optimizer/prep/prepunion.c b/src/backend/optimizer/prep/prepunion.c
index e821f20a9635f35975115190c0904f2146eed26c..e1c620956a447c88e94e76d00d3c255e9361ad1c 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.21 1998/03/30 19:04:41 momjian Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/optimizer/prep/prepunion.c,v 1.22 1998/03/31 04:43:49 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -64,12 +64,13 @@ plan_union_queries(Query *parse)
 {
 	List	   *union_plans = NIL,
 			   *ulist,
-			   *unionall_queries,
+			   *union_all_queries,
 			   *union_rts,
-			   *last_union = NIL;
+			   *last_union = NIL,
+			   *hold_sortClause = parse->sortClause;
 	bool		union_all_found = false,
 				union_found = false,
-				last_unionall_flag = false;
+				last_union_all_flag = false;
 
 	/*------------------------------------------------------------------
 	 *
@@ -120,17 +121,25 @@ plan_union_queries(Query *parse)
 			union_found = true;
 			last_union = ulist;
 		}
-		last_unionall_flag = union_query->unionall;
+		last_union_all_flag = union_query->unionall;
 	}
 
 	/* Is this a simple one */
 	if (!union_all_found ||
 		!union_found ||
 	/* A trailing UNION negates the affect of earlier UNION ALLs */
-		!last_unionall_flag)
+		!last_union_all_flag)
 	{
 		List	   *hold_unionClause = parse->unionClause;
 
+		/* we will do this later, so don't do it now */
+		if (!union_all_found ||
+			!last_union_all_flag)
+		{
+			parse->sortClause = NIL;
+			parse->uniqueFlag = NULL;
+		}
+
 		parse->unionClause = NIL;		/* prevent recursion */
 		union_plans = lcons(union_planner(parse), NIL);
 		union_rts = lcons(parse->rtable, NIL);
@@ -154,7 +163,7 @@ plan_union_queries(Query *parse)
 		 */
 
 		/* save off everthing past the last UNION */
-		unionall_queries = lnext(last_union);
+		union_all_queries = lnext(last_union);
 
 		/* clip off the list to remove the trailing UNION ALLs */
 		lnext(last_union) = NIL;
@@ -167,21 +176,21 @@ plan_union_queries(Query *parse)
 		union_rts = lcons(parse->rtable, NIL);
 
 		/* Append the remainging UNION ALLs */
-		foreach(ulist, unionall_queries)
+		foreach(ulist, union_all_queries)
 		{
-			Query	   *unionall_query = lfirst(ulist);
+			Query	   *union_all_query = lfirst(ulist);
 
-			union_plans = lappend(union_plans, union_planner(unionall_query));
-			union_rts = lappend(union_rts, unionall_query->rtable);
+			union_plans = lappend(union_plans, union_planner(union_all_query));
+			union_rts = lappend(union_rts, union_all_query->rtable);
 		}
 	}
 
 	/* We have already split UNION and UNION ALL and we made it consistent */
-	if (!last_unionall_flag)
+	if (!last_union_all_flag)
 	{
 		parse->uniqueFlag = "*";
 		parse->sortClause = transformSortClause(NULL, NIL,
-												parse->sortClause,
+												hold_sortClause,
 												parse->targetList, "*");
 	}
 	else
@@ -195,7 +204,7 @@ plan_union_queries(Query *parse)
 						union_rts,
 						0,
 						NULL,
-						((Plan *) lfirst(union_plans))->targetlist));
+						parse->targetList));
 }
 
 
diff --git a/src/backend/parser/parse_clause.c b/src/backend/parser/parse_clause.c
index 9bd664c4ee37fd0bd910ae55ed73f8d00b5767f9..30be8335351c217dbe1b3e8272c72ec493f98697 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.14 1998/03/18 15:47:51 momjian Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/parser/parse_clause.c,v 1.15 1998/03/31 04:43:53 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -313,7 +313,13 @@ transformSortClause(ParseState *pstate,
 				{
 					SortClause *sortcl = lfirst(s);
 
-					if (sortcl->resdom == tlelt->resdom)
+					/*
+					 *	We use equal() here because we are called for UNION
+					 *	from the optimizer, and at that point, the sort clause
+					 *	resdom pointers don't match the target list resdom
+					 *	pointers
+					 */
+					if (equal(sortcl->resdom, tlelt->resdom))
 						break;
 					s = lnext(s);
 				}
diff --git a/src/man/alter_table.l b/src/man/alter_table.l
index 67f50de8942b2a44e08fa760665a470c144caefc..81929ff5b3054f341ea5e0d046c5f78dd4179c77 100644
--- a/src/man/alter_table.l
+++ b/src/man/alter_table.l
@@ -1,25 +1,33 @@
 .\" This is -*-nroff-*-
 .\" XXX standard disclaimer belongs here....
-.\" $Header: /cvsroot/pgsql/src/man/Attic/alter_table.l,v 1.4 1998/01/11 22:17:04 momjian Exp $
+.\" $Header: /cvsroot/pgsql/src/man/Attic/alter_table.l,v 1.5 1998/03/31 04:44:19 momjian Exp $
 .TH "ALTER TABLE" SQL 09/25/97 PostgreSQL
 .SH NAME
-alter table - add attributes to a class
+alter table - add attributes to a class, or rename an attribute or class
 .SH SYNOPSIS
 .nf
 \fBalter table\fR classname [ * ]
 	\fBadd\fR [ \fBcolumn\fR ] attname type
-.fi
-.nf
 \fBalter table\fR classname [ * ]
 	\fBadd\fR \fB(\fR attname type \fB)\fR
 	
+\fBalter table\fR classname1
+	\fBrename to\fR classname2
+
+\fBalter table\fR classname1 [\fB*\fR]
+	\fBrename [column]\fR attname1 \fBto\fR attname2
 .fi
+        
 .SH DESCRIPTION
 The
 .BR "alter table"
-command
-causes a new attribute to be added to an existing class,
-.IR classname .
+command causes a new attribute to be added to an existing class,
+.IR classname ,
+or the name of a class or attribute to change
+without changing any of the data contained in the affected class.
+Thus, the class or attribute will remain of the same type and size
+after this command is executed.
+.PP
 The new attributes and their types are specified
 in the same style and with the the same restrictions as in
 .IR "create table" (l).
@@ -33,7 +41,9 @@ attribute will not be added to any of the subclasses.)  This should
 be done when adding an attribute to a superclass.  If it is not,
 queries on the inheritance hierarchy such as
 .nf
-select * from super* s
+
+	select * from super* s
+	
 .fi
 will not work because the subclasses will be missing an attribute
 found in the superclass.
@@ -45,6 +55,24 @@ desired, a subsequent
 .IR update (l)
 query should be run.
 .PP
+In order to rename an attribute in each class in an entire inheritance
+hierarchy, use the 
+.IR classname
+of the superclass and append a \*(lq*\*(rq.  (By default, the attribute
+will not be renamed in any of the subclasses.)  This should
+.BR always
+be done when changing an attribute name in a superclass.  If it is
+not, queries on the inheritance hierarchy such as
+.nf
+select * from super* s
+.fi
+will not work because the subclasses will be (in effect) missing an
+attribute found in the superclass.
+.PP
+You must own the class being modified in order to rename it or part of
+its schema.  Renaming any part of the schema of a system catalog is
+not permitted.
+.PP
 You must own the class in order to change its schema.
 .SH EXAMPLE
 .nf
@@ -52,14 +80,25 @@ You must own the class in order to change its schema.
 -- add the date of hire to the emp class
 -- 
 alter table emp add column hiredate abstime
-.fi
-.nf
 --
 -- add a health-care number to all persons
 -- (including employees, students, ...)
 --
 alter table person * add column health_care_id int4
+--
+-- change the emp class to personnel
+--
+alter table emp rename to personnel
+--
+-- change the sports attribute to hobbies
+--
+alter table emp rename column sports to hobbies
+--
+-- make a change to an inherited attribute
+--
+alter table person * rename column last_name to family_name
 .fi
 .SH "SEE ALSO"
 create table (l),
 update (l).
+
diff --git a/src/man/rename.l b/src/man/rename.l
deleted file mode 100644
index d756fa2399c430051620a5a319fd24cae495174d..0000000000000000000000000000000000000000
--- a/src/man/rename.l
+++ /dev/null
@@ -1,63 +0,0 @@
-.\" This is -*-nroff-*-
-.\" XXX standard disclaimer belongs here....
-.\" $Header: /cvsroot/pgsql/src/man/Attic/rename.l,v 1.3 1998/01/11 22:17:55 momjian Exp $
-.TH RENAME SQL 02/08/94 PostgreSQL PostgreSQL
-.SH NAME
-rename - rename a class or an attribute in a class
-.SH SYNOPSIS
-.nf
-\fBalter table\fR classname1
-        \fBrename to\fR classname2
-\fBalter table\fR classname1 [\fB*\fR]
-        \fBrename [column]\fR attname1 \fBto\fR attname2
-.fi
-.SH DESCRIPTION
-The
-.BR rename
-command
-causes the name of a class or attribute to change without changing any
-of the data contained in the affected class.  Thus, the class or
-attribute will remain of the same type and size after this command is
-executed.
-.PP
-In order to rename an attribute in each class in an entire inheritance
-hierarchy, use the 
-.IR classname
-of the superclass and append a \*(lq*\*(rq.  (By default, the attribute
-will not be renamed in any of the subclasses.)  This should
-.BR always
-be done when changing an attribute name in a superclass.  If it is
-not, queries on the inheritance hierarchy such as
-.nf
-select * from super* s
-.fi
-will not work because the subclasses will be (in effect) missing an
-attribute found in the superclass.
-.PP
-You must own the class being modified in order to rename it or part of
-its schema.  Renaming any part of the schema of a system catalog is
-not permitted.
-.SH EXAMPLE
-.nf
---
--- change the emp class to personnel
---
-alter table emp rename to personnel
-.fi
-.nf
---
--- change the sports attribute to hobbies
---
-alter table emp rename column sports to hobbies
-.fi
-.nf
---
--- make a change to an inherited attribute
---
-alter table person * rename column last_name to family_name
-.fi
-.SH BUGS
-Execution of historical queries using classes and attributes whose
-names have changed will produce incorrect results in many situations.
-.PP
-Renaming of types, operators, rules, etc., should also be supported.
diff --git a/src/test/regress/sql/name.sql b/src/test/regress/sql/name.sql
new file mode 100644
index 0000000000000000000000000000000000000000..11235caaa3d181b7be2a96ec8e2e89902d064d4e
--- /dev/null
+++ b/src/test/regress/sql/name.sql
@@ -0,0 +1,54 @@
+--**************** testing built-in type name **************
+--
+-- all inputs are silently truncated at NAMEDATALEN (32) characters
+--
+
+-- fixed-length by reference
+SELECT 'name string'::name = 'name string'::name AS "True";
+
+SELECT 'name string'::name = 'name string '::name AS "False";
+
+--
+--
+--
+
+CREATE TABLE NAME_TBL(f1 name);
+
+INSERT INTO NAME_TBL(f1) VALUES ('ABCDEFGHIJKLMNOP');
+
+INSERT INTO NAME_TBL(f1) VALUES ('abcdefghijklmnop');
+
+INSERT INTO NAME_TBL(f1) VALUES ('asdfghjkl;');
+
+INSERT INTO NAME_TBL(f1) VALUES ('343f%2a');
+
+INSERT INTO NAME_TBL(f1) VALUES ('d34aaasdf');
+
+INSERT INTO NAME_TBL(f1) VALUES ('');
+
+INSERT INTO NAME_TBL(f1) VALUES ('1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ');
+
+
+SELECT '' AS seven, NAME_TBL.*;
+
+SELECT '' AS six, c.f1 FROM NAME_TBL c WHERE c.f1 <> 'ABCDEFGHIJKLMNOP';
+
+SELECT '' AS one, c.f1 FROM NAME_TBL c WHERE c.f1 = 'ABCDEFGHIJKLMNOP';
+
+SELECT '' AS three, c.f1 FROM NAME_TBL c WHERE c.f1 < 'ABCDEFGHIJKLMNOP';
+
+SELECT '' AS four, c.f1 FROM NAME_TBL c WHERE c.f1 <= 'ABCDEFGHIJKLMNOP';
+
+SELECT '' AS three, c.f1 FROM NAME_TBL c WHERE c.f1 > 'ABCDEFGHIJKLMNOP';
+
+SELECT '' AS four, c.f1 FROM NAME_TBL c WHERE c.f1 >= 'ABCDEFGHIJKLMNOP';
+
+SELECT '' AS seven, c.f1 FROM NAME_TBL c WHERE c.f1 ~ '.*';
+
+SELECT '' AS zero, c.f1 FROM NAME_TBL c WHERE c.f1 !~ '.*';
+
+SELECT '' AS three, c.f1 FROM NAME_TBL c WHERE c.f1 ~ '[0-9]';
+
+SELECT '' AS two, c.f1 FROM NAME_TBL c WHERE c.f1 ~ '.*asdf.*';
+
+DROP TABLE NAME_TBL;