Add support for FLOAT(p) SQL/92 data type.

Allow ALTER TABLE ADD ( column ) syntax.
This commit is contained in:
Thomas G. Lockhart 1997-09-20 16:11:44 +00:00
parent 007e4d9a07
commit 3bb89a27ee
2 changed files with 62 additions and 34 deletions

View File

@ -10,7 +10,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 1.47 1997/09/18 03:46:18 thomas Exp $ * $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 1.48 1997/09/20 16:11:42 thomas Exp $
* *
* HISTORY * HISTORY
* AUTHOR DATE MAJOR EVENT * AUTHOR DATE MAJOR EVENT
@ -207,27 +207,31 @@ static char *FlattenStringList(List *list);
/* Keywords */ /* Keywords */
%token ABORT_TRANS, ACL, ADD, AFTER, AGGREGATE, ALL, ALTER, ANALYZE, %token ABORT_TRANS, ACL, ADD, AFTER, AGGREGATE, ALL, ALTER, ANALYZE,
AND, APPEND, ARCHIVE, ARCH_STORE, AS, ASC, AND, APPEND, ARCHIVE, ARCH_STORE, AS, ASC,
BACKWARD, BEFORE, BEGIN_TRANS, BETWEEN, BINARY, BOTH, BY, BACKWARD, BEFORE, BEGIN_TRANS, BETWEEN, BINARY, BY,
CAST, CHANGE, CHECK, CLOSE, CLUSTER, COLUMN, CAST, CHANGE, CHECK, CLOSE, CLUSTER, COLUMN,
COMMIT, CONSTRAINT, COPY, CREATE, CROSS, CURRENT, CURSOR, COMMIT, CONSTRAINT, COPY, CREATE, CROSS, CURRENT, CURSOR,
DATABASE, DAYINTERVAL, DECLARE, DEFAULT, DELETE, DELIMITERS, DESC, DATABASE, DECLARE, DEFAULT, DELETE, DELIMITERS, DESC,
DISTINCT, DO, DROP, END_TRANS, EXISTS, EXTEND, DISTINCT, DO, DROP, END_TRANS, EXISTS, EXTEND,
FETCH, FOR, FORWARD, FROM, FULL, FUNCTION, GRANT, GROUP, HAVING, HEAVY, HOURINTERVAL, FETCH, FOR, FORWARD, FROM, FULL, FUNCTION, GRANT, GROUP, HAVING, HEAVY,
IN, INDEX, INHERITS, INNERJOIN, INSERT, INTERVAL, INSTEAD, INTO, IS, ISNULL, IN, INDEX, INHERITS, INNERJOIN, INSERT, INSTEAD, INTO, IS, ISNULL,
JOIN, LANGUAGE, LEADING, LEFT, LIGHT, LISTEN, LOAD, LOCAL, MERGE, MINUTEINTERVAL, MONTHINTERVAL, MOVE, JOIN, LANGUAGE, LEFT, LIGHT, LISTEN, LOAD, LOCAL, MERGE, MOVE,
NATURAL, NEW, NONE, NOT, NOTHING, NOTIFY, NOTNULL, NATURAL, NEW, NONE, NOT, NOTHING, NOTIFY, NOTNULL,
OIDS, ON, OPERATOR, OPTION, OR, ORDER, OUTERJOIN, OIDS, ON, OPERATOR, OPTION, OR, ORDER, OUTERJOIN,
PNULL, PRIVILEGES, PROCEDURE, PUBLIC, PURGE, P_TYPE, PNULL, PRIVILEGES, PROCEDURE, PUBLIC, PURGE, P_TYPE,
RENAME, REPLACE, RESET, RETRIEVE, RETURNS, REVOKE, RIGHT, ROLLBACK, RULE, RENAME, REPLACE, RESET, RETRIEVE, RETURNS, REVOKE, RIGHT, ROLLBACK, RULE,
SECONDINTERVAL, SELECT, SET, SETOF, SHOW, STDIN, STDOUT, STORE, SELECT, SET, SETOF, SHOW, STDIN, STDOUT, STORE,
TABLE, TIME, TO, TRAILING, TRANSACTION, TRIGGER, TABLE, TO, TRANSACTION, TRIGGER,
UNION, UNIQUE, UPDATE, USING, VACUUM, VALUES, UNION, UNIQUE, UPDATE, USING, VACUUM, VALUES,
VERBOSE, VERSION, VIEW, WHERE, WITH, WORK, YEARINTERVAL, ZONE VERBOSE, VERSION, VIEW, WHERE, WITH, WORK
%token EXECUTE, RECIPE, EXPLAIN, LIKE, SEQUENCE %token EXECUTE, RECIPE, EXPLAIN, LIKE, SEQUENCE
/* SQL-92 support */ /* SQL-92 support */
%token INTERVAL, TIME, ZONE
%token DAYINTERVAL, HOURINTERVAL, MINUTEINTERVAL, MONTHINTERVAL,
SECONDINTERVAL, YEARINTERVAL
%token BOTH, LEADING, TRAILING,
%token EXTRACT, POSITION, SUBSTRING, TRIM %token EXTRACT, POSITION, SUBSTRING, TRIM
%token DOUBLE, PRECISION %token DOUBLE, PRECISION, FLOAT
%token CHARACTER, VARYING %token CHARACTER, VARYING
/* Special keywords, not in the query language - see the "lex" file */ /* Special keywords, not in the query language - see the "lex" file */
@ -391,6 +395,17 @@ alter_clause: ADD opt_column columnDef
{ {
$$ = $3; $$ = $3;
} }
| ADD '(' tableElementList ')'
{
ColumnDef *lp = lfirst($3);
if (length($3) != 1)
elog(WARN,"ALTER TABLE/ADD() allows one column only",NULL);
#ifdef PARSEDEBUG
printf( "list has %d elements\n", length($3));
#endif
$$ = lp;
}
| DROP opt_column Id | DROP opt_column Id
{ elog(WARN,"ALTER TABLE/DROP COLUMN not yet implemented",NULL); } { elog(WARN,"ALTER TABLE/DROP COLUMN not yet implemented",NULL); }
| ALTER opt_column Id SET opt_default | ALTER opt_column Id SET opt_default
@ -2299,10 +2314,21 @@ nest_array_bounds: '[' ']' nest_array_bounds
{ $$ = NIL; } { $$ = NIL; }
; ;
/*
* typname handles types without trailing parens for size specification.
* Typename uses either typname or explicit txname(size).
* So, must handle float in both places. - thomas 1997-09-20
*/
typname: txname typname: txname
{ {
char *tname = xlateSqlType($1); char *tname;
$$ = makeNode(TypeName); $$ = makeNode(TypeName);
if (!strcasecmp($1, "float"))
tname = xlateSqlType("float8");
else
tname = xlateSqlType($1);
$$->name = tname; $$->name = tname;
/* Is this the name of a complex type? If so, implement /* Is this the name of a complex type? If so, implement
@ -2336,6 +2362,7 @@ txname: Id { $$ = $1; }
| INTERVAL interval_opts { $$ = xlateSqlType("interval"); } | INTERVAL interval_opts { $$ = xlateSqlType("interval"); }
| CHARACTER char_type { $$ = $2; } | CHARACTER char_type { $$ = $2; }
| DOUBLE PRECISION { $$ = xlateSqlType("float8"); } | DOUBLE PRECISION { $$ = xlateSqlType("float8"); }
| FLOAT { $$ = xlateSqlType("float"); }
; ;
char_type: VARYING { $$ = xlateSqlType("varchar"); } char_type: VARYING { $$ = xlateSqlType("varchar"); }
@ -2362,34 +2389,34 @@ Typename: typname opt_array_bounds
$$ = $1; $$ = $1;
$$->arrayBounds = $2; $$->arrayBounds = $2;
if (!strcasecmp($1->name, "varchar")) if (!strcasecmp($1->name, "varchar"))
{
$$->typlen = 4 + 1; $$->typlen = 4 + 1;
} }
}
| txname '(' Iconst ')' | txname '(' Iconst ')'
{ {
/* /*
* This block gets hit when the parser is passed a query * The following implements CHAR() and VARCHAR().
* which contains only spaces (e.g. from psql type " \g").
* Let's check explicitly for a zero-length argument
* here, and do nothing if so. This seems to fix the problem.
* - thomas 1997-07-13
*/
if (strlen($1) > 0)
{
/*
* The following implements char() and varchar().
* We do it here instead of the 'typname:' production * We do it here instead of the 'typname:' production
* because we don't want to allow arrays of varchar(). * because we don't want to allow arrays of VARCHAR().
* I haven't thought about whether that will work or not. * I haven't thought about whether that will work or not.
* - ay 6/95 * - ay 6/95
* Also implements FLOAT() - thomas 1997-09-18
*/ */
$$ = makeNode(TypeName); $$ = makeNode(TypeName);
if (!strcasecmp($1, "float")) {
if ($3 < 1)
elog(WARN,"precision for '%s' type must be at least 1",$1);
else if ($3 <= 7)
$$->name = xlateSqlType("float4");
else if ($3 < 14)
$$->name = xlateSqlType("float8");
else
elog(WARN,"precision for '%s' type must be less than 14",$1);
} else {
if (!strcasecmp($1, "char")) if (!strcasecmp($1, "char"))
$$->name = "bpchar"; /* strdup("bpchar"); */ $$->name = xlateSqlType("bpchar");
else if (!strcasecmp($1, "varchar")) else if (!strcasecmp($1, "varchar"))
$$->name = "varchar"; /* strdup("varchar"); */ $$->name = xlateSqlType("varchar");
else else
yyerror("parse error"); yyerror("parse error");
if ($3 < 1) if ($3 < 1)
@ -2408,7 +2435,6 @@ Typename: typname opt_array_bounds
* truncate where necessary * truncate where necessary
*/ */
$$->typlen = 4 + $3; $$->typlen = 4 + $3;
} }
} }
; ;
@ -3069,6 +3095,8 @@ static Node *makeA_Expr(int oper, char *opname, Node *lexpr, Node *rexpr)
/* xlateSqlType() /* xlateSqlType()
* Convert alternate type names to internal Postgres types. * Convert alternate type names to internal Postgres types.
* Do not convert "float", since that is handled elsewhere
* for FLOAT(p) syntax.
*/ */
static char * static char *
xlateSqlType(char *name) xlateSqlType(char *name)
@ -3078,8 +3106,7 @@ xlateSqlType(char *name)
return "int4"; /* strdup("int4") -- strdup leaks memory here */ return "int4"; /* strdup("int4") -- strdup leaks memory here */
else if (!strcasecmp(name, "smallint")) else if (!strcasecmp(name, "smallint"))
return "int2"; return "int2";
else if (!strcasecmp(name, "float") || else if (!strcasecmp(name, "real"))
!strcasecmp(name, "real"))
return "float8"; return "float8";
else if (!strcasecmp(name, "interval")) else if (!strcasecmp(name, "interval"))
return "timespan"; return "timespan";

View File

@ -7,7 +7,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/parser/keywords.c,v 1.17 1997/09/13 03:13:37 thomas Exp $ * $Header: /cvsroot/pgsql/src/backend/parser/keywords.c,v 1.18 1997/09/20 16:11:44 thomas Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
@ -85,6 +85,7 @@ static ScanKeyword ScanKeywords[] = {
{"extend", EXTEND}, {"extend", EXTEND},
{"extract", EXTRACT}, {"extract", EXTRACT},
{"fetch", FETCH}, {"fetch", FETCH},
{"float", FLOAT},
{"for", FOR}, {"for", FOR},
{"forward", FORWARD}, {"forward", FORWARD},
{"from", FROM}, {"from", FROM},