diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y index fdf0a4419a5179e37a73205ab1b1a6955400f9a8..2ff49dd12f3d91954108b4740f34503898bed389 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.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) diff --git a/src/backend/parser/keywords.c b/src/backend/parser/keywords.c index 6567b015c092bb22c878e31c715f78acd6d6185e..a7c2c88e55539917c1545b79c2e5ec06bedb8b10 100644 --- a/src/backend/parser/keywords.c +++ b/src/backend/parser/keywords.c @@ -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},