Commit 2dabd2cd authored by Thomas G. Lockhart's avatar Thomas G. Lockhart

Allow full type names in CREATE FUNCTION arguments and return type.

Move CREATE FUNCTION/WITH clause to end of statement to get around
 shift/reduce conflicts with type names containing "WITH".
Add lots of tokens as allowed ColId's and/or ColLabel's,
 so this should be a complete set for the v7.0 release.
parent 2c8223f1
...@@ -11,7 +11,7 @@ ...@@ -11,7 +11,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 2.163 2000/03/24 23:34:19 tgl Exp $ * $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 2.164 2000/03/27 17:12:06 thomas Exp $
* *
* HISTORY * HISTORY
* AUTHOR DATE MAJOR EVENT * AUTHOR DATE MAJOR EVENT
...@@ -180,8 +180,7 @@ static void doNegateFloat(Value *v); ...@@ -180,8 +180,7 @@ static void doNegateFloat(Value *v);
def_list, opt_indirection, group_clause, TriggerFuncArgs, def_list, opt_indirection, group_clause, TriggerFuncArgs,
opt_select_limit opt_select_limit
%type <node> func_return %type <typnam> func_arg, func_return
%type <boolean> set_opt
%type <boolean> TriggerForOpt, TriggerForType, OptTemp %type <boolean> TriggerForOpt, TriggerForType, OptTemp
...@@ -250,7 +249,7 @@ static void doNegateFloat(Value *v); ...@@ -250,7 +249,7 @@ static void doNegateFloat(Value *v);
%type <typnam> Typename, opt_type, SimpleTypename, %type <typnam> Typename, opt_type, SimpleTypename,
Generic, Numeric, Character, Datetime, Bit Generic, Numeric, Character, Datetime, Bit
%type <str> generic, numeric, character, datetime, bit %type <str> generic, character, datetime, bit
%type <str> extract_arg %type <str> extract_arg
%type <str> opt_charset, opt_collate %type <str> opt_charset, opt_collate
%type <str> opt_float %type <str> opt_float
...@@ -261,7 +260,6 @@ static void doNegateFloat(Value *v); ...@@ -261,7 +260,6 @@ static void doNegateFloat(Value *v);
%type <str> Sconst, comment_text %type <str> Sconst, comment_text
%type <str> UserId, var_value, zone_value %type <str> UserId, var_value, zone_value
%type <str> ColId, ColLabel %type <str> ColId, ColLabel
%type <str> TypeId
%type <node> TableConstraint %type <node> TableConstraint
%type <list> ColQualList %type <list> ColQualList
...@@ -311,7 +309,7 @@ static void doNegateFloat(Value *v); ...@@ -311,7 +309,7 @@ static void doNegateFloat(Value *v);
PARTIAL, POSITION, PRECISION, PRIMARY, PRIOR, PRIVILEGES, PROCEDURE, PUBLIC, PARTIAL, POSITION, PRECISION, PRIMARY, PRIOR, PRIVILEGES, PROCEDURE, PUBLIC,
READ, REFERENCES, RELATIVE, REVOKE, RIGHT, ROLLBACK, READ, REFERENCES, RELATIVE, REVOKE, RIGHT, ROLLBACK,
SCROLL, SECOND_P, SELECT, SESSION_USER, SET, SUBSTRING, SCROLL, SECOND_P, SELECT, SESSION_USER, SET, SUBSTRING,
TABLE, TEMP, TEMPORARY, THEN, TIME, TIMESTAMP, TIMEZONE_HOUR, TABLE, TEMPORARY, THEN, TIME, TIMESTAMP, TIMEZONE_HOUR,
TIMEZONE_MINUTE, TO, TRAILING, TRANSACTION, TRIM, TRUE_P, TIMEZONE_MINUTE, TO, TRAILING, TRANSACTION, TRIM, TRUE_P,
UNION, UNIQUE, UPDATE, USER, USING, UNION, UNIQUE, UPDATE, USER, USING,
VALUES, VARCHAR, VARYING, VIEW, VALUES, VARCHAR, VARYING, VIEW,
...@@ -346,7 +344,7 @@ static void doNegateFloat(Value *v); ...@@ -346,7 +344,7 @@ static void doNegateFloat(Value *v);
OFFSET, OIDS, OPERATOR, PASSWORD, PROCEDURAL, OFFSET, OIDS, OPERATOR, PASSWORD, PROCEDURAL,
REINDEX, RENAME, RESET, RETURNS, ROW, RULE, REINDEX, RENAME, RESET, RETURNS, ROW, RULE,
SEQUENCE, SERIAL, SETOF, SHARE, SHOW, START, STATEMENT, STDIN, STDOUT, SYSID, SEQUENCE, SERIAL, SETOF, SHARE, SHOW, START, STATEMENT, STDIN, STDOUT, SYSID,
TRUNCATE, TRUSTED, TEMP, TRUNCATE, TRUSTED,
UNLISTEN, UNTIL, VACUUM, VALID, VERBOSE, VERSION UNLISTEN, UNTIL, VACUUM, VALID, VERBOSE, VERSION
/* Special keywords, not in the query language - see the "lex" file */ /* Special keywords, not in the query language - see the "lex" file */
...@@ -1491,8 +1489,8 @@ CreatePLangStmt: CREATE PLangTrusted PROCEDURAL LANGUAGE Sconst ...@@ -1491,8 +1489,8 @@ CreatePLangStmt: CREATE PLangTrusted PROCEDURAL LANGUAGE Sconst
} }
; ;
PLangTrusted: TRUSTED { $$ = TRUE; } PLangTrusted: TRUSTED { $$ = TRUE; }
| { $$ = FALSE; } | /*EMPTY*/ { $$ = FALSE; }
DropPLangStmt: DROP PROCEDURAL LANGUAGE Sconst DropPLangStmt: DROP PROCEDURAL LANGUAGE Sconst
{ {
...@@ -2282,28 +2280,29 @@ RecipeStmt: EXECUTE RECIPE recipe_name ...@@ -2282,28 +2280,29 @@ RecipeStmt: EXECUTE RECIPE recipe_name
* *
* QUERY: * QUERY:
* define function <fname> * define function <fname>
* (language = <lang>, returntype = <typename> * [(<type-1> { , <type-n>})]
* [, arch_pct = <percentage | pre-defined>] * returns <type-r>
* as <filename or code in language as appropriate>
* language <lang> [with
* [ arch_pct = <percentage | pre-defined>]
* [, disk_pct = <percentage | pre-defined>] * [, disk_pct = <percentage | pre-defined>]
* [, byte_pct = <percentage | pre-defined>] * [, byte_pct = <percentage | pre-defined>]
* [, perbyte_cpu = <int | pre-defined>] * [, perbyte_cpu = <int | pre-defined>]
* [, percall_cpu = <int | pre-defined>] * [, percall_cpu = <int | pre-defined>]
* [, iscachable]) * [, iscachable] ]
* [arg is (<type-1> { , <type-n>})]
* as <filename or code in language as appropriate>
* *
*****************************************************************************/ *****************************************************************************/
ProcedureStmt: CREATE FUNCTION func_name func_args ProcedureStmt: CREATE FUNCTION func_name func_args
RETURNS func_return opt_with AS func_as LANGUAGE Sconst RETURNS func_return AS func_as LANGUAGE Sconst opt_with
{ {
ProcedureStmt *n = makeNode(ProcedureStmt); ProcedureStmt *n = makeNode(ProcedureStmt);
n->funcname = $3; n->funcname = $3;
n->defArgs = $4; n->defArgs = $4;
n->returnType = $6; n->returnType = (Node *)$6;
n->withClause = $7; n->withClause = $11;
n->as = $9; n->as = $8;
n->language = $11; n->language = $10;
$$ = (Node *)n; $$ = (Node *)n;
}; };
...@@ -2315,32 +2314,50 @@ func_args: '(' func_args_list ')' { $$ = $2; } ...@@ -2315,32 +2314,50 @@ func_args: '(' func_args_list ')' { $$ = $2; }
| '(' ')' { $$ = NIL; } | '(' ')' { $$ = NIL; }
; ;
func_args_list: TypeId func_args_list: func_arg
{ $$ = lcons(makeString($1),NIL); } { $$ = lcons(makeString($1->name),NIL); }
| func_args_list ',' TypeId | func_args_list ',' func_arg
{ $$ = lappend($1,makeString($3)); } { $$ = lappend($1,makeString($3->name)); }
;
/* Would be nice to use the full Typename production for these fields,
* but that one sometimes dives into the catalogs looking for valid types.
* Arguments like "opaque" are valid when defining functions,
* so that won't work here. The only thing we give up is array notation,
* which isn't meaningful in this context anyway.
* - thomas 2000-03-25
*/
func_arg: SimpleTypename
{
/* We can catch over-specified arguments here if we want to,
* but for now better to silently swallow typmod, etc.
* - thomas 2000-03-22
*/
$$ = $1;
}
; ;
func_as: Sconst func_as: Sconst
{ $$ = lcons(makeString($1),NIL); } { $$ = lcons(makeString($1),NIL); }
| Sconst ',' Sconst | Sconst ',' Sconst
{ $$ = lappend(lcons(makeString($1),NIL), makeString($3)); } { $$ = lappend(lcons(makeString($1),NIL), makeString($3)); }
; ;
func_return: set_opt TypeId func_return: SimpleTypename
{ {
TypeName *n = makeNode(TypeName); /* We can catch over-specified arguments here if we want to,
n->name = $2; * but for now better to silently swallow typmod, etc.
n->setof = $1; * - thomas 2000-03-22
n->arrayBounds = NULL; */
n->typmod = -1; $$ = $1;
$$ = (Node *)n; }
| SETOF SimpleTypename
{
$$ = $2;
$$->setof = TRUE;
} }
; ;
set_opt: SETOF { $$ = TRUE; }
| /*EMPTY*/ { $$ = FALSE; }
;
/***************************************************************************** /*****************************************************************************
* *
...@@ -3743,7 +3760,7 @@ Typename: SimpleTypename opt_array_bounds ...@@ -3743,7 +3760,7 @@ Typename: SimpleTypename opt_array_bounds
/* Is this the name of a complex type? If so, implement /* Is this the name of a complex type? If so, implement
* it as a set. * it as a set.
*/ */
if (!strcmp(saved_relname, $$->name)) if (strcmp(saved_relname, $$->name) == 0)
/* This attr is the same type as the relation /* This attr is the same type as the relation
* being defined. The classic example: create * being defined. The classic example: create
* emp(name=text,mgr=emp) * emp(name=text,mgr=emp)
...@@ -3820,18 +3837,6 @@ Numeric: FLOAT opt_float ...@@ -3820,18 +3837,6 @@ Numeric: FLOAT opt_float
} }
; ;
numeric: FLOAT
{ $$ = xlateSqlType("float8"); }
| DOUBLE PRECISION
{ $$ = xlateSqlType("float8"); }
| DECIMAL
{ $$ = xlateSqlType("decimal"); }
| DEC
{ $$ = xlateSqlType("decimal"); }
| NUMERIC
{ $$ = xlateSqlType("numeric"); }
;
opt_float: '(' Iconst ')' opt_float: '(' Iconst ')'
{ {
if ($2 < 1) if ($2 < 1)
...@@ -5224,21 +5229,6 @@ Iconst: ICONST { $$ = $1; }; ...@@ -5224,21 +5229,6 @@ Iconst: ICONST { $$ = $1; };
Sconst: SCONST { $$ = $1; }; Sconst: SCONST { $$ = $1; };
UserId: IDENT { $$ = $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
*/
TypeId: ColId
{ $$ = xlateSqlType($1); }
| numeric
{ $$ = xlateSqlType($1); }
| bit
{ $$ = xlateSqlType($1); }
| character
{ $$ = xlateSqlType($1); }
;
/* Column identifier /* Column identifier
* Include date/time keywords as SQL92 extension. * Include date/time keywords as SQL92 extension.
* Include TYPE as a SQL92 unreserved keyword. - thomas 1997-10-05 * Include TYPE as a SQL92 unreserved keyword. - thomas 1997-10-05
...@@ -5252,35 +5242,54 @@ ColId: IDENT { $$ = $1; } ...@@ -5252,35 +5242,54 @@ ColId: IDENT { $$ = $1; }
| ABSOLUTE { $$ = "absolute"; } | ABSOLUTE { $$ = "absolute"; }
| ACCESS { $$ = "access"; } | ACCESS { $$ = "access"; }
| ACTION { $$ = "action"; } | ACTION { $$ = "action"; }
| ADD { $$ = "add"; }
| AFTER { $$ = "after"; } | AFTER { $$ = "after"; }
| AGGREGATE { $$ = "aggregate"; } | AGGREGATE { $$ = "aggregate"; }
| ALTER { $$ = "alter"; }
| BACKWARD { $$ = "backward"; } | BACKWARD { $$ = "backward"; }
| BEFORE { $$ = "before"; } | BEFORE { $$ = "before"; }
| BEGIN_TRANS { $$ = "begin"; }
| BETWEEN { $$ = "between"; }
| BY { $$ = "by"; }
| CACHE { $$ = "cache"; } | CACHE { $$ = "cache"; }
| CASCADE { $$ = "cascade"; }
| CLOSE { $$ = "close"; }
| COMMENT { $$ = "comment"; } | COMMENT { $$ = "comment"; }
| COMMIT { $$ = "commit"; }
| COMMITTED { $$ = "committed"; } | COMMITTED { $$ = "committed"; }
| CONSTRAINTS { $$ = "constraints"; } | CONSTRAINTS { $$ = "constraints"; }
| CREATE { $$ = "create"; }
| CREATEDB { $$ = "createdb"; } | CREATEDB { $$ = "createdb"; }
| CREATEUSER { $$ = "createuser"; } | CREATEUSER { $$ = "createuser"; }
| CURSOR { $$ = "cursor"; }
| CYCLE { $$ = "cycle"; } | CYCLE { $$ = "cycle"; }
| DATABASE { $$ = "database"; } | DATABASE { $$ = "database"; }
| DECLARE { $$ = "declare"; }
| DEFERRED { $$ = "deferred"; } | DEFERRED { $$ = "deferred"; }
| DELETE { $$ = "delete"; }
| DELIMITERS { $$ = "delimiters"; } | DELIMITERS { $$ = "delimiters"; }
| DOUBLE { $$ = "double"; } | DOUBLE { $$ = "double"; }
| DROP { $$ = "drop"; }
| EACH { $$ = "each"; } | EACH { $$ = "each"; }
| ENCODING { $$ = "encoding"; } | ENCODING { $$ = "encoding"; }
| EXCLUSIVE { $$ = "exclusive"; } | EXCLUSIVE { $$ = "exclusive"; }
| EXECUTE { $$ = "execute"; }
| FETCH { $$ = "fetch"; }
| FORCE { $$ = "force"; } | FORCE { $$ = "force"; }
| FORWARD { $$ = "forward"; } | FORWARD { $$ = "forward"; }
| FUNCTION { $$ = "function"; } | FUNCTION { $$ = "function"; }
| GRANT { $$ = "grant"; }
| HANDLER { $$ = "handler"; } | HANDLER { $$ = "handler"; }
| IMMEDIATE { $$ = "immediate"; } | IMMEDIATE { $$ = "immediate"; }
| IN { $$ = "in"; }
| INCREMENT { $$ = "increment"; } | INCREMENT { $$ = "increment"; }
| INDEX { $$ = "index"; } | INDEX { $$ = "index"; }
| INHERITS { $$ = "inherits"; } | INHERITS { $$ = "inherits"; }
| INSENSITIVE { $$ = "insensitive"; } | INSENSITIVE { $$ = "insensitive"; }
| INSERT { $$ = "insert"; }
| INSTEAD { $$ = "instead"; } | INSTEAD { $$ = "instead"; }
| INTERVAL { $$ = "interval"; } | INTERVAL { $$ = "interval"; }
| IS { $$ = "is"; }
| ISNULL { $$ = "isnull"; } | ISNULL { $$ = "isnull"; }
| ISOLATION { $$ = "isolation"; } | ISOLATION { $$ = "isolation"; }
| KEY { $$ = "key"; } | KEY { $$ = "key"; }
...@@ -5292,10 +5301,14 @@ ColId: IDENT { $$ = $1; } ...@@ -5292,10 +5301,14 @@ ColId: IDENT { $$ = $1; }
| MAXVALUE { $$ = "maxvalue"; } | MAXVALUE { $$ = "maxvalue"; }
| MINVALUE { $$ = "minvalue"; } | MINVALUE { $$ = "minvalue"; }
| MODE { $$ = "mode"; } | MODE { $$ = "mode"; }
| NAMES { $$ = "names"; }
| NATIONAL { $$ = "national"; }
| NEXT { $$ = "next"; } | NEXT { $$ = "next"; }
| NO { $$ = "no"; }
| NOCREATEDB { $$ = "nocreatedb"; } | NOCREATEDB { $$ = "nocreatedb"; }
| NOCREATEUSER { $$ = "nocreateuser"; } | NOCREATEUSER { $$ = "nocreateuser"; }
| NOTHING { $$ = "nothing"; } | NOTHING { $$ = "nothing"; }
| NOTIFY { $$ = "notify"; }
| NOTNULL { $$ = "notnull"; } | NOTNULL { $$ = "notnull"; }
| OF { $$ = "of"; } | OF { $$ = "of"; }
| OIDS { $$ = "oids"; } | OIDS { $$ = "oids"; }
...@@ -5303,22 +5316,27 @@ ColId: IDENT { $$ = $1; } ...@@ -5303,22 +5316,27 @@ ColId: IDENT { $$ = $1; }
| OPERATOR { $$ = "operator"; } | OPERATOR { $$ = "operator"; }
| OPTION { $$ = "option"; } | OPTION { $$ = "option"; }
| OVERLAPS { $$ = "overlaps"; } | OVERLAPS { $$ = "overlaps"; }
| PARTIAL { $$ = "partial"; }
| PASSWORD { $$ = "password"; } | PASSWORD { $$ = "password"; }
| PENDANT { $$ = "pendant"; } | PENDANT { $$ = "pendant"; }
| PRIOR { $$ = "prior"; } | PRIOR { $$ = "prior"; }
| PRIVILEGES { $$ = "privileges"; } | PRIVILEGES { $$ = "privileges"; }
| PROCEDURAL { $$ = "procedural"; } | PROCEDURAL { $$ = "procedural"; }
| READ { $$ = "read"; } | READ { $$ = "read"; }
| REINDEX { $$ = "reindex"; }
| RELATIVE { $$ = "relative"; } | RELATIVE { $$ = "relative"; }
| RENAME { $$ = "rename"; } | RENAME { $$ = "rename"; }
| RESTRICT { $$ = "restrict"; } | RESTRICT { $$ = "restrict"; }
| RETURNS { $$ = "returns"; } | RETURNS { $$ = "returns"; }
| REVOKE { $$ = "revoke"; }
| ROLLBACK { $$ = "rollback"; }
| ROW { $$ = "row"; } | ROW { $$ = "row"; }
| RULE { $$ = "rule"; } | RULE { $$ = "rule"; }
| SCROLL { $$ = "scroll"; } | SCROLL { $$ = "scroll"; }
| SEQUENCE { $$ = "sequence"; } | SEQUENCE { $$ = "sequence"; }
| SERIAL { $$ = "serial"; } | SERIAL { $$ = "serial"; }
| SERIALIZABLE { $$ = "serializable"; } | SERIALIZABLE { $$ = "serializable"; }
| SET { $$ = "set"; }
| SHARE { $$ = "share"; } | SHARE { $$ = "share"; }
| START { $$ = "start"; } | START { $$ = "start"; }
| STATEMENT { $$ = "statement"; } | STATEMENT { $$ = "statement"; }
...@@ -5335,8 +5353,16 @@ ColId: IDENT { $$ = $1; } ...@@ -5335,8 +5353,16 @@ ColId: IDENT { $$ = $1; }
| TRUNCATE { $$ = "truncate"; } | TRUNCATE { $$ = "truncate"; }
| TRUSTED { $$ = "trusted"; } | TRUSTED { $$ = "trusted"; }
| TYPE_P { $$ = "type"; } | TYPE_P { $$ = "type"; }
| UNLISTEN { $$ = "unlisten"; }
| UNTIL { $$ = "until"; }
| UPDATE { $$ = "update"; }
| VALID { $$ = "valid"; } | VALID { $$ = "valid"; }
| VALUES { $$ = "values"; }
| VARYING { $$ = "varying"; }
| VERSION { $$ = "version"; } | VERSION { $$ = "version"; }
| VIEW { $$ = "view"; }
| WITH { $$ = "with"; }
| WORK { $$ = "work"; }
| ZONE { $$ = "zone"; } | ZONE { $$ = "zone"; }
; ;
...@@ -5352,55 +5378,107 @@ ColId: IDENT { $$ = $1; } ...@@ -5352,55 +5378,107 @@ ColId: IDENT { $$ = $1; }
*/ */
ColLabel: ColId { $$ = $1; } ColLabel: ColId { $$ = $1; }
| ABORT_TRANS { $$ = "abort"; } | ABORT_TRANS { $$ = "abort"; }
| ALL { $$ = "all"; }
| ANALYZE { $$ = "analyze"; } | ANALYZE { $$ = "analyze"; }
| ANY { $$ = "any"; }
| ASC { $$ = "asc"; }
| BINARY { $$ = "binary"; } | BINARY { $$ = "binary"; }
| BIT { $$ = "bit"; } | BIT { $$ = "bit"; }
| BOTH { $$ = "both"; }
| CASE { $$ = "case"; } | CASE { $$ = "case"; }
| CAST { $$ = "cast"; }
| CHAR { $$ = "char"; }
| CHARACTER { $$ = "character"; } | CHARACTER { $$ = "character"; }
| CHECK { $$ = "check"; }
| CLUSTER { $$ = "cluster"; } | CLUSTER { $$ = "cluster"; }
| COALESCE { $$ = "coalesce"; } | COALESCE { $$ = "coalesce"; }
| COLLATE { $$ = "collate"; }
| COLUMN { $$ = "column"; }
| CONSTRAINT { $$ = "constraint"; } | CONSTRAINT { $$ = "constraint"; }
| COPY { $$ = "copy"; } | COPY { $$ = "copy"; }
| CROSS { $$ = "cross"; }
| CURRENT { $$ = "current"; } | CURRENT { $$ = "current"; }
| CURRENT_DATE { $$ = "current_date"; }
| CURRENT_TIME { $$ = "current_time"; }
| CURRENT_TIMESTAMP { $$ = "current_timestamp"; }
| CURRENT_USER { $$ = "current_user"; } | CURRENT_USER { $$ = "current_user"; }
| DEC { $$ = "dec"; } | DEC { $$ = "dec"; }
| DECIMAL { $$ = "decimal"; } | DECIMAL { $$ = "decimal"; }
| DEFAULT { $$ = "default"; }
| DEFERRABLE { $$ = "deferrable"; } | DEFERRABLE { $$ = "deferrable"; }
| DESC { $$ = "desc"; }
| DISTINCT { $$ = "distinct"; }
| DO { $$ = "do"; } | DO { $$ = "do"; }
| ELSE { $$ = "else"; } | ELSE { $$ = "else"; }
| END_TRANS { $$ = "end"; } | END_TRANS { $$ = "end"; }
| EXCEPT { $$ = "except"; }
| EXISTS { $$ = "exists"; }
| EXPLAIN { $$ = "explain"; } | EXPLAIN { $$ = "explain"; }
| EXTEND { $$ = "extend"; } | EXTEND { $$ = "extend"; }
| EXTRACT { $$ = "extract"; }
| FALSE_P { $$ = "false"; } | FALSE_P { $$ = "false"; }
| FLOAT { $$ = "float"; } | FLOAT { $$ = "float"; }
| FOR { $$ = "for"; }
| FOREIGN { $$ = "foreign"; } | FOREIGN { $$ = "foreign"; }
| FROM { $$ = "from"; }
| FULL { $$ = "full"; }
| GLOBAL { $$ = "global"; } | GLOBAL { $$ = "global"; }
| GROUP { $$ = "group"; } | GROUP { $$ = "group"; }
| HAVING { $$ = "having"; }
| INITIALLY { $$ = "initially"; } | INITIALLY { $$ = "initially"; }
| INNER_P { $$ = "inner"; }
| INTERSECT { $$ = "intersect"; }
| INTO { $$ = "into"; }
| JOIN { $$ = "join"; }
| LEADING { $$ = "leading"; }
| LEFT { $$ = "left"; }
| LIKE { $$ = "like"; }
| LISTEN { $$ = "listen"; } | LISTEN { $$ = "listen"; }
| LOAD { $$ = "load"; } | LOAD { $$ = "load"; }
| LOCAL { $$ = "local"; } | LOCAL { $$ = "local"; }
| LOCK_P { $$ = "lock"; } | LOCK_P { $$ = "lock"; }
| MOVE { $$ = "move"; } | MOVE { $$ = "move"; }
| NATURAL { $$ = "natural"; }
| NCHAR { $$ = "nchar"; }
| NEW { $$ = "new"; } | NEW { $$ = "new"; }
| NONE { $$ = "none"; } | NONE { $$ = "none"; }
| NOT { $$ = "not"; }
| NULLIF { $$ = "nullif"; } | NULLIF { $$ = "nullif"; }
| NULL_P { $$ = "null_p"; }
| NUMERIC { $$ = "numeric"; } | NUMERIC { $$ = "numeric"; }
| OFFSET { $$ = "offset"; }
| ON { $$ = "on"; }
| OR { $$ = "or"; }
| ORDER { $$ = "order"; } | ORDER { $$ = "order"; }
| OUTER_P { $$ = "outer"; }
| POSITION { $$ = "position"; } | POSITION { $$ = "position"; }
| PRECISION { $$ = "precision"; } | PRECISION { $$ = "precision"; }
| PRIMARY { $$ = "primary"; }
| PROCEDURE { $$ = "procedure"; }
| PUBLIC { $$ = "public"; }
| REFERENCES { $$ = "references"; }
| RESET { $$ = "reset"; } | RESET { $$ = "reset"; }
| RIGHT { $$ = "right"; }
| SELECT { $$ = "select"; }
| SESSION_USER { $$ = "session_user"; } | SESSION_USER { $$ = "session_user"; }
| SETOF { $$ = "setof"; } | SETOF { $$ = "setof"; }
| SHOW { $$ = "show"; } | SHOW { $$ = "show"; }
| SUBSTRING { $$ = "substring"; }
| TABLE { $$ = "table"; } | TABLE { $$ = "table"; }
| THEN { $$ = "then"; } | THEN { $$ = "then"; }
| TO { $$ = "to"; }
| TRANSACTION { $$ = "transaction"; } | TRANSACTION { $$ = "transaction"; }
| TRIM { $$ = "trim"; }
| TRUE_P { $$ = "true"; } | TRUE_P { $$ = "true"; }
| UNION { $$ = "union"; }
| UNIQUE { $$ = "unique"; }
| USER { $$ = "user"; } | USER { $$ = "user"; }
| USING { $$ = "using"; }
| VACUUM { $$ = "vacuum"; } | VACUUM { $$ = "vacuum"; }
| VARCHAR { $$ = "varchar"; }
| VERBOSE { $$ = "verbose"; } | VERBOSE { $$ = "verbose"; }
| WHEN { $$ = "when"; } | WHEN { $$ = "when"; }
| WHERE { $$ = "where"; }
; ;
SpecialRuleRelation: CURRENT SpecialRuleRelation: CURRENT
...@@ -5539,16 +5617,16 @@ mapTargetColumns(List *src, List *dst) ...@@ -5539,16 +5617,16 @@ mapTargetColumns(List *src, List *dst)
* *
* Converting "datetime" to "timestamp" and "timespan" to "interval" * Converting "datetime" to "timestamp" and "timespan" to "interval"
* is a temporary expedient for pre-7.0 to 7.0 compatibility; * is a temporary expedient for pre-7.0 to 7.0 compatibility;
* these should go away someday. * these should go away for v7.1.
*/ */
static char * static char *
xlateSqlFunc(char *name) xlateSqlFunc(char *name)
{ {
if (!strcmp(name,"character_length")) if (strcmp(name,"character_length") == 0)
return "char_length"; return "char_length";
else if (!strcmp(name,"datetime")) else if (strcmp(name,"datetime") == 0)
return "timestamp"; return "timestamp";
else if (!strcmp(name,"timespan")) else if (strcmp(name,"timespan") == 0)
return "interval"; return "interval";
else else
return name; return name;
...@@ -5560,25 +5638,28 @@ xlateSqlFunc(char *name) ...@@ -5560,25 +5638,28 @@ xlateSqlFunc(char *name)
* NB: do NOT put "char" -> "bpchar" here, because that renders it impossible * NB: do NOT put "char" -> "bpchar" here, because that renders it impossible
* to refer to our single-byte char type, even with quotes. (Without quotes, * to refer to our single-byte char type, even with quotes. (Without quotes,
* CHAR is a keyword, and the code above produces "bpchar" for it.) * CHAR is a keyword, and the code above produces "bpchar" for it.)
*
* Convert "datetime" and "timespan" to allow a transition to SQL92 type names.
* Remove this translation for v7.1 - thomas 2000-03-25
*/ */
static char * static char *
xlateSqlType(char *name) xlateSqlType(char *name)
{ {
if (!strcmp(name,"int") if ((strcmp(name,"int") == 0)
|| !strcmp(name,"integer")) || (strcmp(name,"integer") == 0))
return "int4"; return "int4";
else if (!strcmp(name, "smallint")) else if (strcmp(name, "smallint") == 0)
return "int2"; return "int2";
else if (!strcmp(name, "real") else if ((strcmp(name, "real") == 0)
|| !strcmp(name, "float")) || (strcmp(name, "float") == 0))
return "float8"; return "float8";
else if (!strcmp(name, "decimal")) else if (strcmp(name, "decimal") == 0)
return "numeric"; return "numeric";
else if (!strcmp(name, "datetime")) else if (strcmp(name, "datetime") == 0)
return "timestamp"; return "timestamp";
else if (!strcmp(name, "timespan")) else if (strcmp(name, "timespan") == 0)
return "interval"; return "interval";
else if (!strcmp(name, "boolean")) else if (strcmp(name, "boolean") == 0)
return "bool"; return "bool";
else else
return name; return name;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment