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 {