From 878b8d64c8927c55c3ca28ff7d93283ebb99456a Mon Sep 17 00:00:00 2001 From: "Thomas G. Lockhart" Date: Wed, 11 Feb 1998 04:09:54 +0000 Subject: [PATCH] Define ROW and STATEMENT as parser tokens. 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 | 311 ++++++++++++++++++++-------------- src/backend/parser/keywords.c | 5 +- 2 files changed, 191 insertions(+), 125 deletions(-) diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y index fdf0a4419a..2ff49dd12f 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 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 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 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 func_return +%type set_opt + +%type TriggerForOpt, TriggerForType + %type union_clause, select_list %type join_list %type @@ -206,15 +212,16 @@ Oid param_type(int t); /* used in parse_expr.c */ %type ParamNo %type Typename, opt_type, Array, Generic, Character, Datetime, Numeric -%type generic, character, datetime +%type generic, numeric, character, datetime %type opt_charset, opt_collate %type opt_float, opt_numeric, opt_decimal %type opt_varying, opt_timezone %type Iconst %type Sconst -%type Id, var_value, zone_value +%type UserId, var_value, zone_value %type ColId, ColLabel +%type TypeId %type TableConstraint %type 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 6567b015c0..a7c2c88e55 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}, -- 2.40.0