diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y
index 7908b44711265e8f83b5732a5f0000726a378366..56a56627e7fce455caaf860c31e20e3f084c6e54 100644
--- a/src/backend/parser/gram.y
+++ b/src/backend/parser/gram.y
@@ -11,7 +11,7 @@
  *
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/parser/gram.y,v 2.613 2008/04/29 14:59:16 alvherre Exp $
+ *	  $PostgreSQL: pgsql/src/backend/parser/gram.y,v 2.614 2008/04/29 20:44:49 tgl Exp $
  *
  * HISTORY
  *	  AUTHOR			DATE			MAJOR EVENT
@@ -95,6 +95,8 @@ static Node *makeStringConst(char *str);
 static Node *makeStringConstCast(char *str, TypeName *typename);
 static Node *makeIntConst(int val);
 static Node *makeFloatConst(char *str);
+static Node *makeBitStringConst(char *str);
+static Node *makeNullAConst(void);
 static Node *makeAConst(Value *v);
 static Node *makeBoolAConst(bool state);
 static FuncCall *makeOverlaps(List *largs, List *rargs, int location);
@@ -6395,9 +6397,7 @@ select_limit_value:
 			| ALL
 				{
 					/* LIMIT ALL is represented as a NULL constant */
-					A_Const *n = makeNode(A_Const);
-					n->val.type = T_Null;
-					$$ = (Node *)n;
+					$$ = makeNullAConst();
 				}
 		;
 
@@ -7409,11 +7409,9 @@ a_expr:		c_expr									{ $$ = $1; }
 
 			| a_expr SIMILAR TO a_expr				%prec SIMILAR
 				{
-					A_Const *c = makeNode(A_Const);
 					FuncCall *n = makeNode(FuncCall);
-					c->val.type = T_Null;
 					n->funcname = SystemFuncName("similar_escape");
-					n->args = list_make2($4, (Node *) c);
+					n->args = list_make2($4, makeNullAConst());
 					n->agg_star = FALSE;
 					n->agg_distinct = FALSE;
 					n->location = @2;
@@ -7431,11 +7429,9 @@ a_expr:		c_expr									{ $$ = $1; }
 				}
 			| a_expr NOT SIMILAR TO a_expr			%prec SIMILAR
 				{
-					A_Const *c = makeNode(A_Const);
 					FuncCall *n = makeNode(FuncCall);
-					c->val.type = T_Null;
 					n->funcname = SystemFuncName("similar_escape");
-					n->args = list_make2($5, (Node *) c);
+					n->args = list_make2($5, makeNullAConst());
 					n->agg_star = FALSE;
 					n->agg_distinct = FALSE;
 					n->location = @5;
@@ -8251,11 +8247,7 @@ func_expr:	func_name '(' ')'
 xml_root_version: VERSION_P a_expr
 				{ $$ = $2; }
 			| VERSION_P NO VALUE_P
-				{
-					A_Const *val = makeNode(A_Const);
-					val->val.type = T_Null;
-					$$ = (Node *) val;
-				}
+				{ $$ = makeNullAConst(); }
 		;
 
 opt_xml_root_standalone: ',' STANDALONE_P YES_P
@@ -8409,10 +8401,7 @@ array_expr_list: array_expr							{ $$ = list_make1($1); }
 extract_list:
 			extract_arg FROM a_expr
 				{
-					A_Const *n = makeNode(A_Const);
-					n->val.type = T_String;
-					n->val.val.str = $1;
-					$$ = list_make2((Node *) n, $3);
+					$$ = list_make2(makeStringConst($1), $3);
 				}
 			| /*EMPTY*/								{ $$ = NIL; }
 		;
@@ -8496,10 +8485,7 @@ substr_list:
 					 * which it is likely to do if the second argument
 					 * is unknown or doesn't have an implicit cast to int4.
 					 */
-					A_Const *n = makeNode(A_Const);
-					n->val.type = T_Integer;
-					n->val.val.ival = 1;
-					$$ = list_make3($1, (Node *) n,
+					$$ = list_make3($1, makeIntConst(1),
 									makeTypeCast($2, SystemTypeName("int4")));
 				}
 			| expr_list
@@ -8811,31 +8797,19 @@ func_name:	type_function_name
  */
 AexprConst: Iconst
 				{
-					A_Const *n = makeNode(A_Const);
-					n->val.type = T_Integer;
-					n->val.val.ival = $1;
-					$$ = (Node *)n;
+					$$ = makeIntConst($1);
 				}
 			| FCONST
 				{
-					A_Const *n = makeNode(A_Const);
-					n->val.type = T_Float;
-					n->val.val.str = $1;
-					$$ = (Node *)n;
+					$$ = makeFloatConst($1);
 				}
 			| Sconst
 				{
-					A_Const *n = makeNode(A_Const);
-					n->val.type = T_String;
-					n->val.val.str = $1;
-					$$ = (Node *)n;
+					$$ = makeStringConst($1);
 				}
 			| BCONST
 				{
-					A_Const *n = makeNode(A_Const);
-					n->val.type = T_BitString;
-					n->val.val.str = $1;
-					$$ = (Node *)n;
+					$$ = makeBitStringConst($1);
 				}
 			| XCONST
 				{
@@ -8844,10 +8818,7 @@ AexprConst: Iconst
 					 * a <general literal> shall not be a
 					 * <bit string literal> or a <hex string literal>.
 					 */
-					A_Const *n = makeNode(A_Const);
-					n->val.type = T_BitString;
-					n->val.val.str = $1;
-					$$ = (Node *)n;
+					$$ = makeBitStringConst($1);
 				}
 			| func_name Sconst
 				{
@@ -8893,9 +8864,7 @@ AexprConst: Iconst
 				}
 			| NULL_P
 				{
-					A_Const *n = makeNode(A_Const);
-					n->val.type = T_Null;
-					$$ = (Node *)n;
+					$$ = makeNullAConst();
 				}
 		;
 
@@ -9482,7 +9451,28 @@ makeFloatConst(char *str)
 	n->val.type = T_Float;
 	n->val.val.str = str;
 
-	return makeTypeCast((Node *)n, SystemTypeName("float8"));
+	return (Node *)n;
+}
+
+static Node *
+makeBitStringConst(char *str)
+{
+	A_Const *n = makeNode(A_Const);
+
+	n->val.type = T_BitString;
+	n->val.val.str = str;
+
+	return (Node *)n;
+}
+
+static Node *
+makeNullAConst(void)
+{
+	A_Const *n = makeNode(A_Const);
+
+	n->val.type = T_Null;
+
+	return (Node *)n;
 }
 
 static Node *
diff --git a/src/backend/parser/parse_type.c b/src/backend/parser/parse_type.c
index 9e3e0f2e75b208656dd716a84b8b8ce4d25f48a4..78e210167dcb67225c05db504c93ebd2f6c90bf2 100644
--- a/src/backend/parser/parse_type.c
+++ b/src/backend/parser/parse_type.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/parser/parse_type.c,v 1.96 2008/04/29 14:59:17 alvherre Exp $
+ *	  $PostgreSQL: pgsql/src/backend/parser/parse_type.c,v 1.97 2008/04/29 20:44:49 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -294,28 +294,11 @@ typenameTypeMod(ParseState *pstate, const TypeName *typename, Type typ)
 				cstr = (char *) palloc(32);
 				snprintf(cstr, 32, "%ld", (long) ac->val.val.ival);
 			}
-			else
+			else if (IsA(&ac->val, Float) ||
+					 IsA(&ac->val, String))
+			{
 				/* we can just use the str field directly. */
 				cstr = ac->val.val.str;
-		}
-		else if (IsA(tm, TypeCast))
-		{
-			/*
-			 * The grammar hands back some integers with ::int4 attached, so
-			 * allow a cast decoration if it's an Integer value, but not
-			 * otherwise.
-			 */
-			TypeCast *tc = (TypeCast *) tm;
-
-			if (IsA(tc->arg, A_Const))
-			{
-				A_Const	   *ac = (A_Const *) tc->arg;
-
-				if (IsA(&ac->val, Integer))
-				{
-					cstr = (char *) palloc(32);
-					snprintf(cstr, 32, "%ld", (long) ac->val.val.ival);
-				}
 			}
 		}
 		else if (IsA(tm, ColumnRef))
diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c
index df3186b77cffff37b7fd69d536fe14820b8aa7c0..f1f6c9decae2ce4a13d8162fc201a7218b42c502 100644
--- a/src/backend/utils/misc/guc.c
+++ b/src/backend/utils/misc/guc.c
@@ -10,7 +10,7 @@
  * Written by Peter Eisentraut <peter_e@gmx.net>.
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/utils/misc/guc.c,v 1.448 2008/04/29 14:59:17 alvherre Exp $
+ *	  $PostgreSQL: pgsql/src/backend/utils/misc/guc.c,v 1.449 2008/04/29 20:44:49 tgl Exp $
  *
  *--------------------------------------------------------------------
  */
@@ -5209,7 +5209,8 @@ flatten_set_variable_args(const char *name, List *args)
 
 	/*
 	 * Each list member may be a plain A_Const node, or an A_Const within a
-	 * TypeCast, as produced by makeFloatConst() et al in gram.y.
+	 * TypeCast; the latter case is supported only for ConstInterval
+	 * arguments (for SET TIME ZONE).
 	 */
 	foreach(l, args)
 	{
@@ -5231,8 +5232,8 @@ flatten_set_variable_args(const char *name, List *args)
 
 		if (!IsA(arg, A_Const))
 			elog(ERROR, "unrecognized node type: %d", (int) nodeTag(arg));
-
 		con = (A_Const *) arg;
+
 		switch (nodeTag(&con->val))
 		{
 			case T_Integer:
@@ -5243,10 +5244,6 @@ flatten_set_variable_args(const char *name, List *args)
 				appendStringInfoString(&buf, strVal(&con->val));
 				break;
 			case T_String:
-				/*
-				 * Plain string literal or identifier.	For quote mode,
-				 * quote it if it's not a vanilla identifier.
-				 */
 				val = strVal(&con->val);
 				if (typename != NULL)
 				{
@@ -5273,12 +5270,13 @@ flatten_set_variable_args(const char *name, List *args)
 						DatumGetCString(DirectFunctionCall1(interval_out,
 															interval));
 					appendStringInfo(&buf, "INTERVAL '%s'", intervalout);
-
-					/* don't leave this set */
-					typename = NULL;
 				}
 				else
 				{
+					/*
+					 * Plain string literal or identifier.	For quote mode,
+					 * quote it if it's not a vanilla identifier.
+					 */
 					if (flags & GUC_LIST_QUOTE)
 						appendStringInfoString(&buf, quote_identifier(val));
 					else
diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h
index fe1410531a6142cd14f7a03769a52976f11d0084..61c3df539139769a6c1ed7949aae85a8fb8f0418 100644
--- a/src/include/nodes/parsenodes.h
+++ b/src/include/nodes/parsenodes.h
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1996-2008, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/nodes/parsenodes.h,v 1.363 2008/04/29 14:59:17 alvherre Exp $
+ * $PostgreSQL: pgsql/src/include/nodes/parsenodes.h,v 1.364 2008/04/29 20:44:49 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -228,12 +228,12 @@ typedef struct A_Expr
 } A_Expr;
 
 /*
- * A_Const - a constant expression
+ * A_Const - a literal constant
  */
 typedef struct A_Const
 {
 	NodeTag		type;
-	Value		val;			/* the value (with the tag) */
+	Value		val;			/* value (includes type info, see value.h) */
 } A_Const;
 
 /*