diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y
index d146b6e4ce1a5d5da861cc0c5893ab5b9aa973b5..3d4bd3ea30c49543922b9209277185751117407f 100644
--- a/src/backend/parser/gram.y
+++ b/src/backend/parser/gram.y
@@ -10,7 +10,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 1.72 1997/11/25 22:05:29 momjian Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 1.73 1997/11/30 23:11:10 thomas Exp $
  *
  * HISTORY
  *	  AUTHOR			DATE			MAJOR EVENT
@@ -566,20 +566,25 @@ default_expr:  AexprConst
 		;
 
 opt_constraint:  NOT NULL_P						{ $$ = TRUE; }
+			| NOT NULL_P UNIQUE
+				{
+					elog(NOTICE,"UNIQUE clause ignored; not yet implemented",NULL);
+					$$ = TRUE;
+				}
 			| NOTNULL							{ $$ = TRUE; }
 			| UNIQUE
 				{
-					elog(WARN,"CREATE TABLE/UNIQUE not yet implemented",NULL);
+					elog(NOTICE,"UNIQUE clause ignored; not yet implemented",NULL);
 					$$ = FALSE;
 				}
 			| PRIMARY KEY
 				{
-					elog(WARN,"CREATE TABLE/PRIMARY KEY not yet implemented",NULL);
+					elog(NOTICE,"PRIMARY KEY clause ignored; not yet implemented",NULL);
 					$$ = FALSE;
 				}
 			| REFERENCES ColId opt_column_list key_match key_actions
 				{
-					elog(WARN,"CREATE TABLE/FOREIGN KEY not yet implemented",NULL);
+					elog(NOTICE,"FOREIGN KEY clause ignored; not yet implemented",NULL);
 					$$ = FALSE;
 				}
 			| /* EMPTY */						{ $$ = FALSE; }
@@ -728,9 +733,15 @@ ConstraintDef:	CHECK constraint_elem
 		| UNIQUE '(' columnList ')'
 				{	elog(WARN,"CREATE TABLE/UNIQUE not yet implemented",NULL); }
 		| PRIMARY KEY '(' columnList ')'
-				{	elog(WARN,"CREATE TABLE/PRIMARY KEY not yet implemented",NULL); }
+				{
+					ConstraintDef *constr = palloc (sizeof(ConstraintDef));
+					constr->type = CONSTR_PRIMARY;
+					constr->name = NULL;
+					constr->keys = $4;
+					$$ = constr;
+				}
 		| FOREIGN KEY '(' columnList ')' REFERENCES ColId opt_column_list key_match key_actions
-				{	elog(WARN,"CREATE TABLE/FOREIGN KEY not yet implemented",NULL); }
+				{	elog(NOTICE,"FOREIGN KEY clause ignored; not yet implemented",NULL); }
 		;
 
 constraint_elem:  AexprConst
@@ -2607,14 +2618,21 @@ a_expr:  attr opt_indirection
 				{	$$ = makeA_Expr(OP, ";", NULL, $2); }
 		| '|' a_expr
 				{	$$ = makeA_Expr(OP, "|", NULL, $2); }
-		| AexprConst TYPECAST Typename
+		| a_expr TYPECAST Typename
 				{
+					$$ = (Node *)$1;
 					/* AexprConst can be either A_Const or ParamNo */
-					if (nodeTag($1) == T_A_Const)
+					if (nodeTag($1) == T_A_Const) {
 						((A_Const *)$1)->typename = $3;
-					else
+					} else if (nodeTag($1) == T_Param) {
 						((ParamNo *)$1)->typename = $3;
-					$$ = (Node *)$1;
+					/* otherwise, try to transform to a function call */
+					} else {
+						FuncCall *n = makeNode(FuncCall);
+						n->funcname = $3->name;
+						n->args = lcons($1,NIL);
+						$$ = (Node *)n;
+					}
 				}
 		| CAST a_expr AS Typename
 				{
@@ -2950,14 +2968,21 @@ position_expr:  attr opt_indirection
 				{	$$ = makeA_Expr(OP, "*", $1, $3); }
 		| '|' position_expr
 				{	$$ = makeA_Expr(OP, "|", NULL, $2); }
-		| AexprConst TYPECAST Typename
+		| position_expr TYPECAST Typename
 				{
+					$$ = (Node *)$1;
 					/* AexprConst can be either A_Const or ParamNo */
-					if (nodeTag($1) == T_A_Const)
+					if (nodeTag($1) == T_A_Const) {
 						((A_Const *)$1)->typename = $3;
-					else
+					} else if (nodeTag($1) == T_Param) {
 						((ParamNo *)$1)->typename = $3;
-					$$ = (Node *)$1;
+					/* otherwise, try to transform to a function call */
+					} else {
+						FuncCall *n = makeNode(FuncCall);
+						n->funcname = $3->name;
+						n->args = lcons($1,NIL);
+						$$ = (Node *)n;
+					}
 				}
 		| CAST position_expr AS Typename
 				{