Define ROW and STATEMENT as parser tokens.
authorThomas G. Lockhart <lockhart@fourpalms.org>
Wed, 11 Feb 1998 04:09:54 +0000 (04:09 +0000)
committerThomas G. Lockhart <lockhart@fourpalms.org>
Wed, 11 Feb 1998 04:09:54 +0000 (04:09 +0000)
Use explicit tokens to decode CREATE TRIGGER clauses.
Allow ROW and STATEMENT as column identifiers.
Fix CAST syntax to require parens per SQL92 spec.
Define TypeId to allow correct translation of type names in CREATE FUNCTION
 and other statements. Need to do this without looking up defined type
 names because CREATE FUNCTION can specify undefined (new) types.
Define UserId to complete removal of "Id" generic entity.
Define xlateSqlFunc() to convert SQL92 CHARACTER_LENGTH() and CHAR_LENGTH()
 functions to calls to length().
Define func_name parser entity for contexts requiring a function name.
Have xlateSqlType() translate "float" to "float8".

src/backend/parser/gram.y
src/backend/parser/keywords.c

index fdf0a4419a5179e37a73205ab1b1a6955400f9a8..2ff49dd12f3d91954108b4740f34503898bed389 100644 (file)
@@ -10,7 +10,7 @@
  *
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 1.105 1998/02/10 04:01:44 momjian Exp $
+ *   $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 1.106 1998/02/11 04:09:52 thomas Exp $
  *
  * HISTORY
  *   AUTHOR            DATE            MAJOR EVENT
@@ -61,6 +61,7 @@ extern List *parsetree;
  */
 /*#define __YYSCLASS*/
 
+static char *xlateSqlFunc(char *);
 static char *xlateSqlType(char *);
 static Node *makeA_Expr(int oper, char *opname, Node *lexpr, Node *rexpr);
 static Node *makeRowExpr(char *opr, List *largs, List *rargs);
@@ -139,7 +140,7 @@ Oid param_type(int t); /* used in parse_expr.c */
 
 %type <str>        relation_name, copy_file_name, copy_delimiter, def_name,
        database_name, access_method_clause, access_method, attr_name,
-       class, index_name, name, file_name, recipe_name, aggr_argtype
+       class, index_name, name, func_name, file_name, recipe_name, aggr_argtype
 
 %type <str>        opt_id, opt_portal_name,
        all_Op, MathOp, opt_name, opt_unique,
@@ -151,7 +152,7 @@ Oid param_type(int t); /* used in parse_expr.c */
 %type <list>   stmtblock, stmtmulti,
        relation_name_list, OptTableElementList,
        OptInherit, definition,
-       opt_with, def_args, def_name_list, func_argtypes,
+       opt_with, func_args, func_args_list,
        oper_argtypes, OptStmtList, OptStmtBlock, OptStmtMulti,
        opt_column_list, columnList, opt_va_list, va_list,
        sort_clause, sortby_list, index_params, index_list, name_list,
@@ -159,6 +160,11 @@ Oid    param_type(int t); /* used in parse_expr.c */
        expr_list, attrs, res_target_list, res_target_list2,
        def_list, opt_indirection, group_clause, groupby_list, TriggerFuncArgs
 
+%type <node>   func_return
+%type <boolean>    set_opt
+
+%type <boolean>    TriggerForOpt, TriggerForType
+
 %type <list>   union_clause, select_list
 %type <list>   join_list
 %type <sortgroupby>
@@ -206,15 +212,16 @@ Oid   param_type(int t); /* used in parse_expr.c */
 %type <paramno> ParamNo
 
 %type <typnam> Typename, opt_type, Array, Generic, Character, Datetime, Numeric
-%type <str>        generic, character, datetime
+%type <str>        generic, numeric, character, datetime
 %type <str>        opt_charset, opt_collate
 %type <str>        opt_float, opt_numeric, opt_decimal
 %type <boolean>    opt_varying, opt_timezone
 
 %type <ival>   Iconst
 %type <str>        Sconst
-%type <str>        Id, var_value, zone_value
+%type <str>        UserId, var_value, zone_value
 %type <str>        ColId, ColLabel
+%type <str>        TypeId
 
 %type <node>   TableConstraint
 %type <list>   constraint_list, constraint_expr
@@ -271,13 +278,13 @@ Oid   param_type(int t); /* used in parse_expr.c */
 /* Keywords for Postgres support (not in SQL92 reserved words) */
 %token ABORT_TRANS, AFTER, AGGREGATE, ANALYZE,
        BACKWARD, BEFORE, BINARY, CLUSTER, COPY,
-       DATABASE, DELIMITERS, DO, EXPLAIN, EXTEND,
+       DATABASE, DELIMITERS, DO, EACH, EXPLAIN, EXTEND,
        FORWARD, FUNCTION, HANDLER,
        INDEX, INHERITS, INSTEAD, ISNULL,
        LANCOMPILER, LISTEN, LOAD, LOCK_P, LOCATION, MOVE,
        NEW, NONE, NOTHING, NOTNULL, OIDS, OPERATOR, PROCEDURAL,
-       RECIPE, RENAME, RESET, RETURNS, RULE,
-       SEQUENCE, SETOF, SHOW, STDIN, STDOUT, TRUSTED, 
+       RECIPE, RENAME, RESET, RETURNS, ROW, RULE,
+       SEQUENCE, SETOF, SHOW, STATEMENT, STDIN, STDOUT, TRUSTED, 
        VACUUM, VERBOSE, VERSION
 
 /* Keywords (obsolete; retain through next version for parser - thomas 1997-12-04) */
@@ -391,7 +398,7 @@ stmt :    AddAttrStmt
  *
  *****************************************************************************/
 
-CreateUserStmt:  CREATE USER Id user_passwd_clause user_createdb_clause
+CreateUserStmt:  CREATE USER UserId user_passwd_clause user_createdb_clause
            user_createuser_clause user_group_clause user_valid_clause
                {
                    CreateUserStmt *n = makeNode(CreateUserStmt);
@@ -412,7 +419,7 @@ CreateUserStmt:  CREATE USER Id user_passwd_clause user_createdb_clause
  *
  *****************************************************************************/
 
-AlterUserStmt:  ALTER USER Id user_passwd_clause user_createdb_clause
+AlterUserStmt:  ALTER USER UserId user_passwd_clause user_createdb_clause
            user_createuser_clause user_group_clause user_valid_clause
                {
                    AlterUserStmt *n = makeNode(AlterUserStmt);
@@ -433,7 +440,7 @@ AlterUserStmt:  ALTER USER Id user_passwd_clause user_createdb_clause
  *
  *****************************************************************************/
 
-DropUserStmt:  DROP USER Id
+DropUserStmt:  DROP USER UserId
                {
                    DropUserStmt *n = makeNode(DropUserStmt);
                    n->user = $3;
@@ -441,7 +448,7 @@ DropUserStmt:  DROP USER Id
                }
        ;
 
-user_passwd_clause:  WITH PASSWORD Id          { $$ = $3; }
+user_passwd_clause:  WITH PASSWORD UserId      { $$ = $3; }
            | /*EMPTY*/                         { $$ = NULL; }
        ;
 
@@ -475,11 +482,11 @@ user_createuser_clause:  CREATEUSER
            | /*EMPTY*/                         { $$ = NULL; }
        ;
 
-user_group_list:  user_group_list ',' Id
+user_group_list:  user_group_list ',' UserId
                {
                    $$ = lcons((void*)makeString($3), $1);
                }
-           | Id
+           | UserId
                {
                    $$ = lcons((void*)makeString($1), NIL);
                }
@@ -826,19 +833,19 @@ default_expr:  AexprConst
                    $3->name = fmtId($3->name);
                    $$ = nconc( lcons( makeString( "CAST"), $1), makeList( makeString("AS"), $3, -1));
                }
-           | CAST default_expr AS Typename
+           | CAST '(' default_expr AS Typename ')'
                {
-                   $4->name = fmtId($4->name);
-                   $$ = nconc( lcons( makeString( "CAST"), $2), makeList( makeString("AS"), $4, -1));
+                   $5->name = fmtId($5->name);
+                   $$ = nconc( lcons( makeString( "CAST"), $3), makeList( makeString("AS"), $5, -1));
                }
            | '(' default_expr ')'
                {   $$ = lappend( lcons( makeString( "("), $2), makeString( ")")); }
-           | name '(' ')'
+           | func_name '(' ')'
                {
                    $$ = makeList( makeString($1), makeString("("), -1);
                    $$ = lappend( $$, makeString(")"));
                }
-           | name '(' default_list ')'
+           | func_name '(' default_list ')'
                {
                    $$ = makeList( makeString($1), makeString("("), -1);
                    $$ = nconc( $$, $3);
@@ -967,19 +974,19 @@ constraint_expr:  AexprConst
                    $3->name = fmtId($3->name);
                    $$ = nconc( lcons( makeString( "CAST"), $1), makeList( makeString("AS"), $3, -1));
                }
-           | CAST constraint_expr AS Typename
+           | CAST '(' constraint_expr AS Typename ')'
                {
-                   $4->name = fmtId($4->name);
-                   $$ = nconc( lcons( makeString( "CAST"), $2), makeList( makeString("AS"), $4, -1));
+                   $5->name = fmtId($5->name);
+                   $$ = nconc( lcons( makeString( "CAST"), $3), makeList( makeString("AS"), $5, -1));
                }
            | '(' constraint_expr ')'
                {   $$ = lappend( lcons( makeString( "("), $2), makeString( ")")); }
-           | name '(' ')'
+           | func_name '(' ')'
                {
                    $$ = makeList( makeString($1), makeString("("), -1);
                    $$ = lappend( $$, makeString(")"));
                }
-           | name '(' constraint_list ')'
+           | func_name '(' constraint_list ')'
                {
                    $$ = makeList( makeString($1), makeString("("), -1);
                    $$ = nconc( $$, $3);
@@ -1169,71 +1176,72 @@ CreateTrigStmt:  CREATE TRIGGER name TriggerActionTime TriggerEvents ON
                }
        ;
 
-TriggerActionTime:     BEFORE  { $$ = TRUE; }
-               |       AFTER   { $$ = FALSE; }
+TriggerActionTime:  BEFORE                     { $$ = TRUE; }
+           | AFTER                             { $$ = FALSE; }
        ;
 
 TriggerEvents: TriggerOneEvent
-                   {
-                           char *e = palloc (4);
-                           e[0] = $1; e[1] = 0; $$ = e;
-                   }
-               | TriggerOneEvent OR TriggerOneEvent
-                   {
-                           char *e = palloc (4);
-                           e[0] = $1; e[1] = $3; e[2] = 0; $$ = e;
-                   }
-               | TriggerOneEvent OR TriggerOneEvent OR TriggerOneEvent
-                   {
-                           char *e = palloc (4);
-                           e[0] = $1; e[1] = $3; e[2] = $5; e[3] = 0;
-                           $$ = e;
-                   }
+               {
+                   char *e = palloc (4);
+                   e[0] = $1; e[1] = 0; $$ = e;
+               }
+           | TriggerOneEvent OR TriggerOneEvent
+               {
+                   char *e = palloc (4);
+                   e[0] = $1; e[1] = $3; e[2] = 0; $$ = e;
+               }
+           | TriggerOneEvent OR TriggerOneEvent OR TriggerOneEvent
+               {
+                   char *e = palloc (4);
+                   e[0] = $1; e[1] = $3; e[2] = $5; e[3] = 0;
+                   $$ = e;
+               }
        ;
 
-TriggerOneEvent:       INSERT  { $$ = 'i'; }
-               |       DELETE  { $$ = 'd'; }
-               |       UPDATE  { $$ = 'u'; }
+TriggerOneEvent:  INSERT                   { $$ = 'i'; }
+           | DELETE                        { $$ = 'd'; }
+           | UPDATE                        { $$ = 'u'; }
        ;
 
-TriggerForSpec:  FOR name name
+TriggerForSpec:  FOR TriggerForOpt TriggerForType
                {
-                       if ( strcmp ($2, "each") != 0 )
-                               elog(ERROR,"parser: syntax error near %s",$2);
-                       if ( strcmp ($3, "row") == 0 )
-                               $$ = TRUE;
-                       else if ( strcmp ($3, "statement") == 0 )
-                               $$ = FALSE;
-                       else
-                               elog(ERROR,"parser: syntax error near %s",$3);
+                   $$ = $3;
                }
        ;
 
+TriggerForOpt:  EACH                       { $$ = TRUE; }
+           | /*EMPTY*/                     { $$ = FALSE; }
+       ;
+
+TriggerForType:  ROW                       { $$ = TRUE; }
+           | STATEMENT                     { $$ = FALSE; }
+       ;
+
 TriggerFuncArgs:  TriggerFuncArg
                { $$ = lcons($1, NIL); }
-       | TriggerFuncArgs ',' TriggerFuncArg
+           | TriggerFuncArgs ',' TriggerFuncArg
                { $$ = lappend($1, $3); }
-       | /*EMPTY*/
+           | /*EMPTY*/
                { $$ = NIL; }
        ;
 
 TriggerFuncArg:  ICONST
-                   {
-                       char *s = (char *) palloc (256);
-                       sprintf (s, "%d", $1);
-                       $$ = s;
-                   }
-               | FCONST
-                   {
-                       char *s = (char *) palloc (256);
-                       sprintf (s, "%g", $1);
-                       $$ = s;
-                   }
-               | Sconst        {  $$ = $1; }
-               | IDENT         {  $$ = $1; }
+               {
+                   char *s = (char *) palloc (256);
+                   sprintf (s, "%d", $1);
+                   $$ = s;
+               }
+           | FCONST
+               {
+                   char *s = (char *) palloc (256);
+                   sprintf (s, "%g", $1);
+                   $$ = s;
+               }
+           | Sconst                        {  $$ = $1; }
+           | IDENT                         {  $$ = $1; }
        ;
 
-DropTrigStmt:  DROP TRIGGER name ON relation_name
+DropTrigStmt:  DROP TRIGGER name ON relation_name
                {
                    DropTrigStmt *n = makeNode(DropTrigStmt);
                    n->trigname = $3;
@@ -1317,7 +1325,6 @@ def_arg:  ColId                           {  $$ = (Node *)makeString($1); }
                    n->typmod = -1;
                    $$ = (Node *)n;
                }
-       | DOUBLE                        {  $$ = (Node *)makeString("double"); }
        ;
 
 
@@ -1527,7 +1534,7 @@ index_list:  index_list ',' index_elem            { $$ = lappend($1, $3); }
        | index_elem                            { $$ = lcons($1, NIL); }
        ;
 
-func_index:  name '(' name_list ')' opt_type opt_class
+func_index:  func_name '(' name_list ')' opt_type opt_class
                {
                    $$ = makeNode(IndexElem);
                    $$->name = $1;
@@ -1617,13 +1624,13 @@ RecipeStmt:  EXECUTE RECIPE recipe_name
  *
  *****************************************************************************/
 
-ProcedureStmt: CREATE FUNCTION def_name def_args
-            RETURNS def_arg opt_with AS Sconst LANGUAGE Sconst
+ProcedureStmt: CREATE FUNCTION func_name func_args
+            RETURNS func_return opt_with AS Sconst LANGUAGE Sconst
                {
                    ProcedureStmt *n = makeNode(ProcedureStmt);
                    n->funcname = $3;
                    n->defArgs = $4;
-                   n->returnType = (Node *)$6;
+                   n->returnType = $6;
                    n->withClause = $7;
                    n->as = $9;
                    n->language = $11;
@@ -1631,14 +1638,32 @@ ProcedureStmt:  CREATE FUNCTION def_name def_args
                };
 
 opt_with:  WITH definition                     { $$ = $2; }
-       | /*EMPTY*/                         { $$ = NIL; }
+       | /*EMPTY*/                             { $$ = NIL; }
        ;
 
-def_args:  '(' def_name_list ')'               { $$ = $2; }
+func_args:  '(' func_args_list ')'             { $$ = $2; }
        | '(' ')'                               { $$ = NIL; }
        ;
 
-def_name_list: name_list;
+func_args_list:  TypeId
+               {   $$ = lcons(makeString($1),NIL); }
+       | func_args_list ',' TypeId
+               {   $$ = lappend($1,makeString($3)); }
+       ;
+
+func_return:  set_opt TypeId
+               {
+                   TypeName *n = makeNode(TypeName);
+                   n->name = $2;
+                   n->setof = $1;
+                   n->arrayBounds = NULL;
+                   $$ = (Node *)n;
+               }
+       ;
+
+set_opt:  SETOF                                    { $$ = TRUE; }
+       | /*EMPTY*/                             { $$ = FALSE; }
+       ;
 
 /*****************************************************************************
  *
@@ -1672,6 +1697,7 @@ remove_type:  TYPE_P                          {  $$ = TYPE_P; }
        | VIEW                                  {  $$ = VIEW; }
        ;
 
+
 RemoveAggrStmt:  DROP AGGREGATE name aggr_argtype
                {
                        RemoveAggrStmt *n = makeNode(RemoveAggrStmt);
@@ -1685,18 +1711,16 @@ aggr_argtype:  name                             { $$ = $1; }
        | '*'                                   { $$ = NULL; }
        ;
 
-RemoveFuncStmt:  DROP FUNCTION name '(' func_argtypes ')'
+
+RemoveFuncStmt:  DROP FUNCTION func_name func_args
                {
                    RemoveFuncStmt *n = makeNode(RemoveFuncStmt);
                    n->funcname = $3;
-                   n->args = $5;
+                   n->args = $4;
                    $$ = (Node *)n;
                }
        ;
 
-func_argtypes: name_list                       { $$ = $1; }
-       | /*EMPTY*/                             { $$ = NIL; }
-       ;
 
 RemoveOperStmt:  DROP OPERATOR all_Op '(' oper_argtypes ')'
                {
@@ -2662,9 +2686,8 @@ Generic:  generic
                }
        ;
 
-generic:  Id                                   { $$ = $1; }
+generic:  IDENT                                    { $$ = $1; }
        | TYPE_P                                { $$ = xlateSqlType("type"); }
-       | DOUBLE PRECISION                      { $$ = xlateSqlType("float8"); }
        ;
 
 /* SQL92 numeric data types
@@ -2679,6 +2702,11 @@ Numeric:  FLOAT opt_float
                    $$->name = xlateSqlType($2);
                    $$->typmod = -1;
                }
+       | DOUBLE PRECISION
+               {
+                   $$ = makeNode(TypeName);
+                   $$->name = xlateSqlType("float");
+               }
        | DECIMAL opt_decimal
                {
                    $$ = makeNode(TypeName);
@@ -2693,6 +2721,16 @@ Numeric:  FLOAT opt_float
                }
        ;
 
+numeric:  FLOAT
+               {   $$ = xlateSqlType("float8"); }
+       | DOUBLE PRECISION
+               {   $$ = xlateSqlType("float8"); }
+       | DECIMAL
+               {   $$ = xlateSqlType("decimal"); }
+       | NUMERIC
+               {   $$ = xlateSqlType("numeric"); }
+       ;
+
 opt_float:  '(' Iconst ')'
                {
                    if ($2 < 1)
@@ -3273,19 +3311,19 @@ a_expr:  attr opt_indirection
                        $$ = (Node *)n;
                    }
                }
-       | CAST a_expr AS Typename
+       | CAST '(' a_expr AS Typename ')'
                {
-                   $$ = (Node *)$2;
+                   $$ = (Node *)$3;
                    /* AexprConst can be either A_Const or ParamNo */
-                   if (nodeTag($2) == T_A_Const) {
-                       ((A_Const *)$2)->typename = $4;
-                   } else if (nodeTag($2) == T_Param) {
-                       ((ParamNo *)$2)->typename = $4;
+                   if (nodeTag($3) == T_A_Const) {
+                       ((A_Const *)$3)->typename = $5;
+                   } else if (nodeTag($5) == T_Param) {
+                       ((ParamNo *)$3)->typename = $5;
                    /* otherwise, try to transform to a function call */
                    } else {
                        FuncCall *n = makeNode(FuncCall);
-                       n->funcname = $4->name;
-                       n->args = lcons($2,NIL);
+                       n->funcname = $5->name;
+                       n->args = lcons($3,NIL);
                        $$ = (Node *)n;
                    }
                }
@@ -3301,7 +3339,7 @@ a_expr:  attr opt_indirection
                {   $$ = makeA_Expr(OP, $1, NULL, $2); }
        | a_expr Op
                {   $$ = makeA_Expr(OP, $2, $1, NULL); }
-       | name '(' '*' ')'
+       | func_name '(' '*' ')'
                {
                    /* cheap hack for aggregate (eg. count) */
                    FuncCall *n = makeNode(FuncCall);
@@ -3313,14 +3351,14 @@ a_expr:  attr opt_indirection
                    n->args = lcons(star, NIL);
                    $$ = (Node *)n;
                }
-       | name '(' ')'
+       | func_name '(' ')'
                {
                    FuncCall *n = makeNode(FuncCall);
                    n->funcname = $1;
                    n->args = NIL;
                    $$ = (Node *)n;
                }
-       | name '(' expr_list ')'
+       | func_name '(' expr_list ')'
                {
                    FuncCall *n = makeNode(FuncCall);
                    n->funcname = $1;
@@ -3877,19 +3915,19 @@ b_expr:  attr opt_indirection
                        $$ = (Node *)n;
                    }
                }
-       | CAST b_expr AS Typename
+       | CAST '(' b_expr AS Typename ')'
                {
-                   $$ = (Node *)$2;
+                   $$ = (Node *)$3;
                    /* AexprConst can be either A_Const or ParamNo */
-                   if (nodeTag($2) == T_A_Const) {
-                       ((A_Const *)$2)->typename = $4;
-                   } else if (nodeTag($2) == T_Param) {
-                       ((ParamNo *)$2)->typename = $4;
+                   if (nodeTag($3) == T_A_Const) {
+                       ((A_Const *)$3)->typename = $5;
+                   } else if (nodeTag($3) == T_Param) {
+                       ((ParamNo *)$3)->typename = $5;
                    /* otherwise, try to transform to a function call */
                    } else {
                        FuncCall *n = makeNode(FuncCall);
-                       n->funcname = $4->name;
-                       n->args = lcons($2,NIL);
+                       n->funcname = $5->name;
+                       n->args = lcons($3,NIL);
                        $$ = (Node *)n;
                    }
                }
@@ -3901,14 +3939,14 @@ b_expr:  attr opt_indirection
                {   $$ = makeA_Expr(OP, $1, NULL, $2); }
        | b_expr Op
                {   $$ = makeA_Expr(OP, $2, $1, NULL); }
-       | name '(' ')'
+       | func_name '(' ')'
                {
                    FuncCall *n = makeNode(FuncCall);
                    n->funcname = $1;
                    n->args = NIL;
                    $$ = (Node *)n;
                }
-       | name '(' expr_list ')'
+       | func_name '(' expr_list ')'
                {
                    FuncCall *n = makeNode(FuncCall);
                    n->funcname = $1;
@@ -4134,19 +4172,19 @@ position_expr:  attr opt_indirection
                        $$ = (Node *)n;
                    }
                }
-       | CAST position_expr AS Typename
+       | CAST '(' position_expr AS Typename ')'
                {
-                   $$ = (Node *)$2;
+                   $$ = (Node *)$3;
                    /* AexprConst can be either A_Const or ParamNo */
-                   if (nodeTag($2) == T_A_Const) {
-                       ((A_Const *)$2)->typename = $4;
-                   } else if (nodeTag($2) == T_Param) {
-                       ((ParamNo *)$2)->typename = $4;
+                   if (nodeTag($3) == T_A_Const) {
+                       ((A_Const *)$3)->typename = $5;
+                   } else if (nodeTag($3) == T_Param) {
+                       ((ParamNo *)$3)->typename = $5;
                    /* otherwise, try to transform to a function call */
                    } else {
                        FuncCall *n = makeNode(FuncCall);
-                       n->funcname = $4->name;
-                       n->args = lcons($2,NIL);
+                       n->funcname = $5->name;
+                       n->args = lcons($3,NIL);
                        $$ = (Node *)n;
                    }
                }
@@ -4166,14 +4204,14 @@ position_expr:  attr opt_indirection
                    n->indirection = NULL;
                    $$ = (Node *)n;
                }
-       | name '(' ')'
+       | func_name '(' ')'
                {
                    FuncCall *n = makeNode(FuncCall);
                    n->funcname = $1;
                    n->args = NIL;
                    $$ = (Node *)n;
                }
-       | name '(' expr_list ')'
+       | func_name '(' expr_list ')'
                {
                    FuncCall *n = makeNode(FuncCall);
                    n->funcname = $1;
@@ -4448,9 +4486,9 @@ relation_name:    SpecialRuleRelation
        ;
 
 database_name:         ColId           { $$ = $1; };
-access_method:         Id              { $$ = $1; };
+access_method:         IDENT           { $$ = $1; };
 attr_name:             ColId           { $$ = $1; };
-class:                 Id              { $$ = $1; };
+class:                 IDENT           { $$ = $1; };
 index_name:                ColId           { $$ = $1; };
 
 /* Functions
@@ -4458,9 +4496,10 @@ index_name:              ColId           { $$ = $1; };
  * Include TYPE as a SQL92 unreserved keyword. - thomas 1997-10-05
  */
 name:                  ColId           { $$ = $1; };
+func_name:             ColId           { $$ = xlateSqlFunc($1); };
 
 file_name:             Sconst          { $$ = $1; };
-recipe_name:           Id              { $$ = $1; };
+recipe_name:           IDENT           { $$ = $1; };
 
 /* Constants
  * Include TRUE/FALSE for SQL3 support. - thomas 1997-10-24
@@ -4531,14 +4570,20 @@ NumConst:  Iconst                       { $$ = makeInteger($1); }
 
 Iconst:  ICONST                            { $$ = $1; };
 Sconst:  SCONST                            { $$ = $1; };
+UserId:  IDENT                         { $$ = $1; };
 
 /* Column and type identifier
  * Does not include explicit datetime types
  *  since these must be decoupled in Typename syntax.
  * Use ColId for most identifiers. - thomas 1997-10-21
  */
-Id:  IDENT                             { $$ = $1; };
-
+TypeId:  ColId
+           {   $$ = xlateSqlType($1); }
+       | numeric
+           {   $$ = xlateSqlType($1); }
+       | character
+           {   $$ = xlateSqlType($1); }
+       ;
 /* Column identifier
  * Include date/time keywords as SQL92 extension.
  * Include TYPE as a SQL92 unreserved keyword. - thomas 1997-10-05
@@ -4547,11 +4592,13 @@ Id:  IDENT                              { $$ = $1; };
  *  list due to shift/reduce conflicts in yacc. If so, move
  *  down to the ColLabel entity. - thomas 1997-11-06
  */
-ColId:  Id                             { $$ = $1; }
+ColId:  IDENT                          { $$ = $1; }
        | datetime                      { $$ = $1; }
        | ACTION                        { $$ = "action"; }
        | DATABASE                      { $$ = "database"; }
        | DELIMITERS                    { $$ = "delimiters"; }
+       | DOUBLE                        { $$ = "double"; }
+       | EACH                          { $$ = "each"; }
        | FUNCTION                      { $$ = "function"; }
        | INDEX                         { $$ = "index"; }
        | KEY                           { $$ = "key"; }
@@ -4562,6 +4609,8 @@ ColId:  Id                                { $$ = $1; }
        | OPTION                        { $$ = "option"; }
        | PRIVILEGES                    { $$ = "privileges"; }
        | RECIPE                        { $$ = "recipe"; }
+       | ROW                           { $$ = "row"; }
+       | STATEMENT                     { $$ = "statement"; }
        | TIME                          { $$ = "time"; }
        | TRIGGER                       { $$ = "trigger"; }
        | TYPE_P                        { $$ = "type"; }
@@ -4817,12 +4866,25 @@ static Node *makeIndexable(char *opname, Node *lexpr, Node *rexpr)
 } /* makeIndexable() */
 
 
-/* xlateSqlType()
+/* xlateSqlFunc()
  * Convert alternate type names to internal Postgres types.
  * Do not convert "float", since that is handled elsewhere
  *  for FLOAT(p) syntax.
  */
 static char *
+xlateSqlFunc(char *name)
+{
+   if (!strcasecmp(name,"character_length")
+    || !strcasecmp(name,"char_length"))
+       return "length";
+   else
+       return name;
+} /* xlateSqlFunc() */
+
+/* xlateSqlType()
+ * Convert alternate type names to internal Postgres types.
+ */
+static char *
 xlateSqlType(char *name)
 {
    if (!strcasecmp(name,"int")
@@ -4830,7 +4892,8 @@ xlateSqlType(char *name)
        return "int4";
    else if (!strcasecmp(name, "smallint"))
        return "int2";
-   else if (!strcasecmp(name, "real"))
+   else if (!strcasecmp(name, "real")
+    || !strcasecmp(name, "float"))
        return "float8";
    else if (!strcasecmp(name, "interval"))
        return "timespan";
@@ -4838,7 +4901,7 @@ xlateSqlType(char *name)
        return "bool";
    else
        return name;
-} /* xlateSqlName() */
+} /* xlateSqlType() */
 
 
 void parser_init(Oid *typev, int nargs)
index 6567b015c092bb22c878e31c715f78acd6d6185e..a7c2c88e55539917c1545b79c2e5ec06bedb8b10 100644 (file)
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/backend/parser/keywords.c,v 1.34 1998/02/04 06:11:48 thomas Exp $
+ *   $Header: /cvsroot/pgsql/src/backend/parser/keywords.c,v 1.35 1998/02/11 04:09:54 thomas Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -83,6 +83,7 @@ static ScanKeyword ScanKeywords[] = {
    {"do", DO},
    {"double", DOUBLE},
    {"drop", DROP},
+   {"each", EACH},
    {"end", END_TRANS},
    {"execute", EXECUTE},
    {"exists", EXISTS},
@@ -167,6 +168,7 @@ static ScanKeyword ScanKeywords[] = {
    {"revoke", REVOKE},
    {"right", RIGHT},
    {"rollback", ROLLBACK},
+   {"row", ROW},
    {"rule", RULE},
    {"second", SECOND_P},
    {"select", SELECT},
@@ -174,6 +176,7 @@ static ScanKeyword ScanKeywords[] = {
    {"set", SET},
    {"setof", SETOF},
    {"show", SHOW},
+   {"statement", STATEMENT},
    {"stdin", STDIN},
    {"stdout", STDOUT},
    {"substring", SUBSTRING},