10
10
*
11
11
*
12
12
* IDENTIFICATION
13
- * $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 1.47 1997/09/18 03:46:18 thomas Exp $
13
+ * $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 1.48 1997/09/20 16:11:42 thomas Exp $
14
14
*
15
15
* HISTORY
16
16
* AUTHOR DATE MAJOR EVENT
@@ -207,27 +207,31 @@ static char *FlattenStringList(List *list);
207
207
/* Keywords */
208
208
%token ABORT_TRANS, ACL, ADD, AFTER, AGGREGATE, ALL, ALTER, ANALYZE,
209
209
AND, APPEND, ARCHIVE, ARCH_STORE, AS, ASC,
210
- BACKWARD, BEFORE, BEGIN_TRANS, BETWEEN, BINARY, BOTH, BY,
210
+ BACKWARD, BEFORE, BEGIN_TRANS, BETWEEN, BINARY, BY,
211
211
CAST, CHANGE, CHECK, CLOSE, CLUSTER, COLUMN,
212
212
COMMIT, CONSTRAINT, COPY, CREATE, CROSS, CURRENT, CURSOR,
213
- DATABASE, DAYINTERVAL, DECLARE, DEFAULT, DELETE, DELIMITERS, DESC,
213
+ DATABASE, DECLARE, DEFAULT, DELETE, DELIMITERS, DESC,
214
214
DISTINCT, DO, DROP, END_TRANS, EXISTS, EXTEND,
215
- FETCH, FOR, FORWARD, FROM, FULL, FUNCTION, GRANT, GROUP, HAVING, HEAVY, HOURINTERVAL,
216
- IN, INDEX, INHERITS, INNERJOIN, INSERT, INTERVAL, INSTEAD, INTO, IS, ISNULL,
217
- JOIN, LANGUAGE, LEADING, LEFT, LIGHT, LISTEN, LOAD, LOCAL, MERGE, MINUTEINTERVAL, MONTHINTERVAL , MOVE,
215
+ FETCH, FOR, FORWARD, FROM, FULL, FUNCTION, GRANT, GROUP, HAVING, HEAVY,
216
+ IN, INDEX, INHERITS, INNERJOIN, INSERT, INSTEAD, INTO, IS, ISNULL,
217
+ JOIN, LANGUAGE, LEFT, LIGHT, LISTEN, LOAD, LOCAL, MERGE, MOVE,
218
218
NATURAL, NEW, NONE, NOT, NOTHING, NOTIFY, NOTNULL,
219
219
OIDS, ON, OPERATOR, OPTION, OR, ORDER, OUTERJOIN,
220
220
PNULL, PRIVILEGES, PROCEDURE, PUBLIC, PURGE, P_TYPE,
221
221
RENAME, REPLACE, RESET, RETRIEVE, RETURNS, REVOKE, RIGHT, ROLLBACK, RULE,
222
- SECONDINTERVAL, SELECT, SET, SETOF, SHOW, STDIN, STDOUT, STORE,
223
- TABLE, TIME, TO, TRAILING , TRANSACTION, TRIGGER,
222
+ SELECT, SET, SETOF, SHOW, STDIN, STDOUT, STORE,
223
+ TABLE, TO , TRANSACTION, TRIGGER,
224
224
UNION, UNIQUE, UPDATE, USING, VACUUM, VALUES,
225
- VERBOSE, VERSION, VIEW, WHERE, WITH, WORK, YEARINTERVAL, ZONE
225
+ VERBOSE, VERSION, VIEW, WHERE, WITH, WORK
226
226
%token EXECUTE, RECIPE, EXPLAIN, LIKE, SEQUENCE
227
227
228
228
/* SQL-92 support */
229
+ %token INTERVAL, TIME, ZONE
230
+ %token DAYINTERVAL, HOURINTERVAL, MINUTEINTERVAL, MONTHINTERVAL,
231
+ SECONDINTERVAL, YEARINTERVAL
232
+ %token BOTH, LEADING, TRAILING,
229
233
%token EXTRACT, POSITION, SUBSTRING, TRIM
230
- %token DOUBLE, PRECISION
234
+ %token DOUBLE, PRECISION, FLOAT
231
235
%token CHARACTER, VARYING
232
236
233
237
/* Special keywords, not in the query language - see the "lex" file */
@@ -391,6 +395,17 @@ alter_clause: ADD opt_column columnDef
391
395
{
392
396
$$ = $3;
393
397
}
398
+ | ADD '(' tableElementList ')'
399
+ {
400
+ ColumnDef *lp = lfirst($3);
401
+
402
+ if (length($3) != 1)
403
+ elog(WARN,"ALTER TABLE/ADD() allows one column only",NULL);
404
+ #ifdef PARSEDEBUG
405
+ printf( "list has %d elements\n", length($3));
406
+ #endif
407
+ $$ = lp;
408
+ }
394
409
| DROP opt_column Id
395
410
{ elog(WARN,"ALTER TABLE/DROP COLUMN not yet implemented",NULL); }
396
411
| ALTER opt_column Id SET opt_default
@@ -2299,10 +2314,21 @@ nest_array_bounds: '[' ']' nest_array_bounds
2299
2314
{ $$ = NIL; }
2300
2315
;
2301
2316
2317
+ /*
2318
+ * typname handles types without trailing parens for size specification.
2319
+ * Typename uses either typname or explicit txname(size).
2320
+ * So, must handle float in both places. - thomas 1997-09-20
2321
+ */
2322
+
2302
2323
typname: txname
2303
2324
{
2304
- char *tname = xlateSqlType($1) ;
2325
+ char *tname;
2305
2326
$$ = makeNode(TypeName);
2327
+
2328
+ if (!strcasecmp($1, "float"))
2329
+ tname = xlateSqlType("float8");
2330
+ else
2331
+ tname = xlateSqlType($1);
2306
2332
$$->name = tname;
2307
2333
2308
2334
/* Is this the name of a complex type? If so, implement
@@ -2336,6 +2362,7 @@ txname: Id { $$ = $1; }
2336
2362
| INTERVAL interval_opts { $$ = xlateSqlType("interval"); }
2337
2363
| CHARACTER char_type { $$ = $2; }
2338
2364
| DOUBLE PRECISION { $$ = xlateSqlType("float8"); }
2365
+ | FLOAT { $$ = xlateSqlType("float"); }
2339
2366
;
2340
2367
2341
2368
char_type: VARYING { $$ = xlateSqlType("varchar"); }
@@ -2362,34 +2389,34 @@ Typename: typname opt_array_bounds
2362
2389
$$ = $1;
2363
2390
$$->arrayBounds = $2;
2364
2391
if (!strcasecmp($1->name, "varchar"))
2365
- {
2366
2392
$$->typlen = 4 + 1;
2367
- }
2368
2393
}
2369
2394
| txname '(' Iconst ')'
2370
2395
{
2371
2396
/*
2372
- * This block gets hit when the parser is passed a query
2373
- * which contains only spaces (e.g. from psql type " \g").
2374
- * Let's check explicitly for a zero-length argument
2375
- * here, and do nothing if so. This seems to fix the problem.
2376
- * - thomas 1997-07-13
2397
+ * The following implements CHAR() and VARCHAR().
2398
+ * We do it here instead of the 'typname:' production
2399
+ * because we don't want to allow arrays of VARCHAR().
2400
+ * I haven't thought about whether that will work or not.
2401
+ * - ay 6/95
2402
+ * Also implements FLOAT() - thomas 1997-09-18
2377
2403
*/
2378
- if (strlen($1) > 0)
2379
- {
2404
+ $$ = makeNode(TypeName);
2405
+ if (!strcasecmp($1, "float")) {
2406
+ if ($3 < 1)
2407
+ elog(WARN,"precision for '%s' type must be at least 1",$1);
2408
+ else if ($3 <= 7)
2409
+ $$->name = xlateSqlType("float4");
2410
+ else if ($3 < 14)
2411
+ $$->name = xlateSqlType("float8");
2412
+ else
2413
+ elog(WARN,"precision for '%s' type must be less than 14",$1);
2380
2414
2381
- /*
2382
- * The following implements char() and varchar().
2383
- * We do it here instead of the 'typname:' production
2384
- * because we don't want to allow arrays of varchar().
2385
- * I haven't thought about whether that will work or not.
2386
- * - ay 6/95
2387
- */
2388
- $$ = makeNode(TypeName);
2415
+ } else {
2389
2416
if (!strcasecmp($1, "char"))
2390
- $$->name = "bpchar"; /* strdup ("bpchar"); */
2417
+ $$->name = xlateSqlType ("bpchar");
2391
2418
else if (!strcasecmp($1, "varchar"))
2392
- $$->name = "varchar"; /* strdup ("varchar"); */
2419
+ $$->name = xlateSqlType ("varchar");
2393
2420
else
2394
2421
yyerror("parse error");
2395
2422
if ($3 < 1)
@@ -2408,7 +2435,6 @@ Typename: typname opt_array_bounds
2408
2435
* truncate where necessary
2409
2436
*/
2410
2437
$$->typlen = 4 + $3;
2411
-
2412
2438
}
2413
2439
}
2414
2440
;
@@ -3069,6 +3095,8 @@ static Node *makeA_Expr(int oper, char *opname, Node *lexpr, Node *rexpr)
3069
3095
3070
3096
/* xlateSqlType()
3071
3097
* Convert alternate type names to internal Postgres types.
3098
+ * Do not convert "float", since that is handled elsewhere
3099
+ * for FLOAT(p) syntax.
3072
3100
*/
3073
3101
static char *
3074
3102
xlateSqlType(char *name)
@@ -3078,8 +3106,7 @@ xlateSqlType(char *name)
3078
3106
return "int4"; /* strdup("int4") -- strdup leaks memory here */
3079
3107
else if (!strcasecmp(name, "smallint"))
3080
3108
return "int2";
3081
- else if (!strcasecmp(name, "float") ||
3082
- !strcasecmp(name, "real"))
3109
+ else if (!strcasecmp(name, "real"))
3083
3110
return "float8";
3084
3111
else if (!strcasecmp(name, "interval"))
3085
3112
return "timespan";
0 commit comments