|
11 | 11 | *
|
12 | 12 | *
|
13 | 13 | * IDENTIFICATION
|
14 |
| - * $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 2.412 2003/04/29 03:21:29 tgl Exp $ |
| 14 | + * $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 2.413 2003/05/04 00:03:55 tgl Exp $ |
15 | 15 | *
|
16 | 16 | * HISTORY
|
17 | 17 | * AUTHOR DATE MAJOR EVENT
|
@@ -964,10 +964,17 @@ zone_value:
|
964 | 964 | | ConstInterval '(' Iconst ')' Sconst opt_interval
|
965 | 965 | {
|
966 | 966 | A_Const *n = (A_Const *) makeStringConst($5, $1);
|
967 |
| - if (($3 < 0) || ($3 > MAX_INTERVAL_PRECISION)) |
| 967 | + if ($3 < 0) |
968 | 968 | elog(ERROR,
|
969 |
| - "INTERVAL(%d) precision must be between %d and %d", |
970 |
| - $3, 0, MAX_INTERVAL_PRECISION); |
| 969 | + "INTERVAL(%d) precision must not be negative", |
| 970 | + $3); |
| 971 | + if ($3 > MAX_INTERVAL_PRECISION) |
| 972 | + { |
| 973 | + elog(NOTICE, |
| 974 | + "INTERVAL(%d) precision reduced to maximum allowed, %d", |
| 975 | + $3, MAX_INTERVAL_PRECISION); |
| 976 | + $3 = MAX_INTERVAL_PRECISION; |
| 977 | + } |
971 | 978 |
|
972 | 979 | if (($6 != INTERVAL_FULL_RANGE)
|
973 | 980 | && (($6 & ~(INTERVAL_MASK(HOUR) | INTERVAL_MASK(MINUTE))) != 0))
|
@@ -1414,23 +1421,16 @@ CreateStmt: CREATE OptTemp TABLE qualified_name '(' OptTableElementList ')'
|
1414 | 1421 | /*
|
1415 | 1422 | * Redundancy here is needed to avoid shift/reduce conflicts,
|
1416 | 1423 | * since TEMP is not a reserved word. See also OptTempTableName.
|
| 1424 | + * |
| 1425 | + * NOTE: we accept both GLOBAL and LOCAL options; since we have no modules |
| 1426 | + * the LOCAL keyword is really meaningless. |
1417 | 1427 | */
|
1418 | 1428 | OptTemp: TEMPORARY { $$ = TRUE; }
|
1419 | 1429 | | TEMP { $$ = TRUE; }
|
1420 | 1430 | | LOCAL TEMPORARY { $$ = TRUE; }
|
1421 | 1431 | | LOCAL TEMP { $$ = TRUE; }
|
1422 |
| - | GLOBAL TEMPORARY |
1423 |
| - { |
1424 |
| - elog(ERROR, |
1425 |
| - "GLOBAL TEMPORARY TABLE is not currently supported"); |
1426 |
| - $$ = TRUE; |
1427 |
| - } |
1428 |
| - | GLOBAL TEMP |
1429 |
| - { |
1430 |
| - elog(ERROR, |
1431 |
| - "GLOBAL TEMPORARY TABLE is not currently supported"); |
1432 |
| - $$ = TRUE; |
1433 |
| - } |
| 1432 | + | GLOBAL TEMPORARY { $$ = TRUE; } |
| 1433 | + | GLOBAL TEMP { $$ = TRUE; } |
1434 | 1434 | | /*EMPTY*/ { $$ = FALSE; }
|
1435 | 1435 | ;
|
1436 | 1436 |
|
@@ -1466,8 +1466,8 @@ columnDef: ColId Typename ColQualList opt_collate
|
1466 | 1466 |
|
1467 | 1467 | if ($4 != NULL)
|
1468 | 1468 | elog(NOTICE,
|
1469 |
| - "CREATE TABLE / COLLATE %s not yet implemented; " |
1470 |
| - "clause ignored", $4); |
| 1469 | + "CREATE TABLE / COLLATE %s not yet implemented; " |
| 1470 | + "clause ignored", $4); |
1471 | 1471 |
|
1472 | 1472 | $$ = (Node *)n;
|
1473 | 1473 | }
|
@@ -3240,7 +3240,7 @@ RemoveOperStmt:
|
3240 | 3240 | oper_argtypes:
|
3241 | 3241 | Typename
|
3242 | 3242 | {
|
3243 |
| - elog(ERROR,"parser: argument type missing (use NONE for unary operators)"); |
| 3243 | + elog(ERROR, "parser: argument type missing (use NONE for unary operators)"); |
3244 | 3244 | }
|
3245 | 3245 | | Typename ',' Typename
|
3246 | 3246 | { $$ = makeList2($1, $3); }
|
@@ -3768,7 +3768,7 @@ CreateDomainStmt:
|
3768 | 3768 |
|
3769 | 3769 | if ($7 != NULL)
|
3770 | 3770 | elog(NOTICE,"CREATE DOMAIN / COLLATE %s not yet "
|
3771 |
| - "implemented; clause ignored", $7); |
| 3771 | + "implemented; clause ignored", $7); |
3772 | 3772 | $$ = (Node *)n;
|
3773 | 3773 | }
|
3774 | 3774 | ;
|
@@ -4426,15 +4426,11 @@ OptTempTableName:
|
4426 | 4426 | }
|
4427 | 4427 | | GLOBAL TEMPORARY opt_table qualified_name
|
4428 | 4428 | {
|
4429 |
| - elog(ERROR, |
4430 |
| - "GLOBAL TEMPORARY TABLE is not currently supported"); |
4431 | 4429 | $$ = $4;
|
4432 | 4430 | $$->istemp = true;
|
4433 | 4431 | }
|
4434 | 4432 | | GLOBAL TEMP opt_table qualified_name
|
4435 | 4433 | {
|
4436 |
| - elog(ERROR, |
4437 |
| - "GLOBAL TEMPORARY TABLE is not currently supported"); |
4438 | 4434 | $$ = $4;
|
4439 | 4435 | $$->istemp = true;
|
4440 | 4436 | }
|
@@ -5031,10 +5027,17 @@ SimpleTypename:
|
5031 | 5027 | | ConstInterval '(' Iconst ')' opt_interval
|
5032 | 5028 | {
|
5033 | 5029 | $$ = $1;
|
5034 |
| - if (($3 < 0) || ($3 > MAX_INTERVAL_PRECISION)) |
| 5030 | + if ($3 < 0) |
5035 | 5031 | elog(ERROR,
|
5036 |
| - "INTERVAL(%d) precision must be between %d and %d", |
5037 |
| - $3, 0, MAX_INTERVAL_PRECISION); |
| 5032 | + "INTERVAL(%d) precision must not be negative", |
| 5033 | + $3); |
| 5034 | + if ($3 > MAX_INTERVAL_PRECISION) |
| 5035 | + { |
| 5036 | + elog(NOTICE, |
| 5037 | + "INTERVAL(%d) precision reduced to maximum allowed, %d", |
| 5038 | + $3, MAX_INTERVAL_PRECISION); |
| 5039 | + $3 = MAX_INTERVAL_PRECISION; |
| 5040 | + } |
5038 | 5041 | $$->typmod = INTERVAL_TYPMOD($3, $5);
|
5039 | 5042 | }
|
5040 | 5043 | | type_name attrs
|
@@ -5390,11 +5393,18 @@ ConstDatetime:
|
5390 | 5393 | * - thomas 2001-09-06
|
5391 | 5394 | */
|
5392 | 5395 | $$->timezone = $5;
|
5393 |
| - if (($3 < 0) || ($3 > MAX_TIMESTAMP_PRECISION)) |
| 5396 | + if ($3 < 0) |
5394 | 5397 | elog(ERROR,
|
5395 |
| - "TIMESTAMP(%d)%s precision must be between %d and %d", |
5396 |
| - $3, ($5 ? " WITH TIME ZONE": ""), 0, |
| 5398 | + "TIMESTAMP(%d)%s precision must not be negative", |
| 5399 | + $3, ($5 ? " WITH TIME ZONE": "")); |
| 5400 | + if ($3 > MAX_TIMESTAMP_PRECISION) |
| 5401 | + { |
| 5402 | + elog(NOTICE, |
| 5403 | + "TIMESTAMP(%d)%s precision reduced to maximum allowed, %d", |
| 5404 | + $3, ($5 ? " WITH TIME ZONE": ""), |
5397 | 5405 | MAX_TIMESTAMP_PRECISION);
|
| 5406 | + $3 = MAX_TIMESTAMP_PRECISION; |
| 5407 | + } |
5398 | 5408 | $$->typmod = $3;
|
5399 | 5409 | }
|
5400 | 5410 | | TIMESTAMP opt_timezone
|
@@ -5422,11 +5432,18 @@ ConstDatetime:
|
5422 | 5432 | $$ = SystemTypeName("timetz");
|
5423 | 5433 | else
|
5424 | 5434 | $$ = SystemTypeName("time");
|
5425 |
| - if (($3 < 0) || ($3 > MAX_TIME_PRECISION)) |
| 5435 | + if ($3 < 0) |
5426 | 5436 | elog(ERROR,
|
5427 |
| - "TIME(%d)%s precision must be between %d and %d", |
5428 |
| - $3, ($5 ? " WITH TIME ZONE": ""), 0, |
| 5437 | + "TIME(%d)%s precision must not be negative", |
| 5438 | + $3, ($5 ? " WITH TIME ZONE": "")); |
| 5439 | + if ($3 > MAX_TIME_PRECISION) |
| 5440 | + { |
| 5441 | + elog(NOTICE, |
| 5442 | + "TIME(%d)%s precision reduced to maximum allowed, %d", |
| 5443 | + $3, ($5 ? " WITH TIME ZONE": ""), |
5429 | 5444 | MAX_TIME_PRECISION);
|
| 5445 | + $3 = MAX_TIME_PRECISION; |
| 5446 | + } |
5430 | 5447 | $$->typmod = $3;
|
5431 | 5448 | }
|
5432 | 5449 | | TIME opt_timezone
|
@@ -6218,10 +6235,17 @@ c_expr: columnref { $$ = (Node *) $1; }
|
6218 | 6235 | s->val.val.str = "now";
|
6219 | 6236 | s->typename = SystemTypeName("text");
|
6220 | 6237 | d = SystemTypeName("timetz");
|
6221 |
| - if (($3 < 0) || ($3 > MAX_TIME_PRECISION)) |
| 6238 | + if ($3 < 0) |
6222 | 6239 | elog(ERROR,
|
6223 |
| - "CURRENT_TIME(%d) precision must be between %d and %d", |
6224 |
| - $3, 0, MAX_TIME_PRECISION); |
| 6240 | + "CURRENT_TIME(%d) precision must not be negative", |
| 6241 | + $3); |
| 6242 | + if ($3 > MAX_TIME_PRECISION) |
| 6243 | + { |
| 6244 | + elog(NOTICE, |
| 6245 | + "CURRENT_TIME(%d) precision reduced to maximum allowed, %d", |
| 6246 | + $3, MAX_TIME_PRECISION); |
| 6247 | + $3 = MAX_TIME_PRECISION; |
| 6248 | + } |
6225 | 6249 | d->typmod = $3;
|
6226 | 6250 |
|
6227 | 6251 | $$ = (Node *)makeTypeCast((Node *)s, d);
|
@@ -6263,11 +6287,17 @@ c_expr: columnref { $$ = (Node *) $1; }
|
6263 | 6287 | s->typename = SystemTypeName("text");
|
6264 | 6288 |
|
6265 | 6289 | d = SystemTypeName("timestamptz");
|
6266 |
| - if (($3 < 0) || ($3 > MAX_TIMESTAMP_PRECISION)) |
| 6290 | + if ($3 < 0) |
6267 | 6291 | elog(ERROR,
|
6268 |
| - "CURRENT_TIMESTAMP(%d) precision " |
6269 |
| - "must be between %d and %d", |
6270 |
| - $3, 0, MAX_TIMESTAMP_PRECISION); |
| 6292 | + "CURRENT_TIMESTAMP(%d) precision must not be negative", |
| 6293 | + $3); |
| 6294 | + if ($3 > MAX_TIMESTAMP_PRECISION) |
| 6295 | + { |
| 6296 | + elog(NOTICE, |
| 6297 | + "CURRENT_TIMESTAMP(%d) precision reduced to maximum allowed, %d", |
| 6298 | + $3, MAX_TIMESTAMP_PRECISION); |
| 6299 | + $3 = MAX_TIMESTAMP_PRECISION; |
| 6300 | + } |
6271 | 6301 | d->typmod = $3;
|
6272 | 6302 |
|
6273 | 6303 | $$ = (Node *)makeTypeCast((Node *)s, d);
|
@@ -6308,10 +6338,17 @@ c_expr: columnref { $$ = (Node *) $1; }
|
6308 | 6338 | s->val.val.str = "now";
|
6309 | 6339 | s->typename = SystemTypeName("text");
|
6310 | 6340 | d = SystemTypeName("time");
|
6311 |
| - if (($3 < 0) || ($3 > MAX_TIME_PRECISION)) |
| 6341 | + if ($3 < 0) |
6312 | 6342 | elog(ERROR,
|
6313 |
| - "LOCALTIME(%d) precision must be between %d and %d", |
6314 |
| - $3, 0, MAX_TIME_PRECISION); |
| 6343 | + "LOCALTIME(%d) precision must not be negative", |
| 6344 | + $3); |
| 6345 | + if ($3 > MAX_TIME_PRECISION) |
| 6346 | + { |
| 6347 | + elog(NOTICE, |
| 6348 | + "LOCALTIME(%d) precision reduced to maximum allowed, %d", |
| 6349 | + $3, MAX_TIME_PRECISION); |
| 6350 | + $3 = MAX_TIME_PRECISION; |
| 6351 | + } |
6315 | 6352 | d->typmod = $3;
|
6316 | 6353 |
|
6317 | 6354 | $$ = (Node *)makeTypeCast((Node *)s, d);
|
@@ -6353,11 +6390,17 @@ c_expr: columnref { $$ = (Node *) $1; }
|
6353 | 6390 | s->typename = SystemTypeName("text");
|
6354 | 6391 |
|
6355 | 6392 | d = SystemTypeName("timestamp");
|
6356 |
| - if (($3 < 0) || ($3 > MAX_TIMESTAMP_PRECISION)) |
| 6393 | + if ($3 < 0) |
6357 | 6394 | elog(ERROR,
|
6358 |
| - "LOCALTIMESTAMP(%d) precision must be " |
6359 |
| - "between %d and %d", |
6360 |
| - $3, 0, MAX_TIMESTAMP_PRECISION); |
| 6395 | + "LOCALTIMESTAMP(%d) precision must not be negative", |
| 6396 | + $3); |
| 6397 | + if ($3 > MAX_TIMESTAMP_PRECISION) |
| 6398 | + { |
| 6399 | + elog(NOTICE, |
| 6400 | + "LOCALTIMESTAMP(%d) precision reduced to maximum allowed, %d", |
| 6401 | + $3, MAX_TIMESTAMP_PRECISION); |
| 6402 | + $3 = MAX_TIMESTAMP_PRECISION; |
| 6403 | + } |
6361 | 6404 | d->typmod = $3;
|
6362 | 6405 |
|
6363 | 6406 | $$ = (Node *)makeTypeCast((Node *)s, d);
|
@@ -6934,8 +6977,8 @@ qualified_name:
|
6934 | 6977 | break;
|
6935 | 6978 | default:
|
6936 | 6979 | elog(ERROR,
|
6937 |
| - "Improper qualified name " |
6938 |
| - "(too many dotted names): %s", |
| 6980 | + "Improper qualified name " |
| 6981 | + "(too many dotted names): %s", |
6939 | 6982 | NameListToString($1));
|
6940 | 6983 | break;
|
6941 | 6984 | }
|
@@ -7038,10 +7081,17 @@ AexprConst: Iconst
|
7038 | 7081 | n->val.type = T_String;
|
7039 | 7082 | n->val.val.str = $5;
|
7040 | 7083 | /* precision specified, and fields may be... */
|
7041 |
| - if (($3 < 0) || ($3 > MAX_INTERVAL_PRECISION)) |
| 7084 | + if ($3 < 0) |
7042 | 7085 | elog(ERROR,
|
7043 |
| - "INTERVAL(%d) precision must be between %d and %d", |
7044 |
| - $3, 0, MAX_INTERVAL_PRECISION); |
| 7086 | + "INTERVAL(%d) precision must not be negative", |
| 7087 | + $3); |
| 7088 | + if ($3 > MAX_INTERVAL_PRECISION) |
| 7089 | + { |
| 7090 | + elog(NOTICE, |
| 7091 | + "INTERVAL(%d) precision reduced to maximum allowed, %d", |
| 7092 | + $3, MAX_INTERVAL_PRECISION); |
| 7093 | + $3 = MAX_INTERVAL_PRECISION; |
| 7094 | + } |
7045 | 7095 | n->typename->typmod = INTERVAL_TYPMOD($3, $6);
|
7046 | 7096 | $$ = (Node *)n;
|
7047 | 7097 | }
|
|
0 commit comments