|
11 | 11 | * |
12 | 12 | * |
13 | 13 | * IDENTIFICATION |
14 | | - * $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 2.412 2003/04/2903: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 | * AUTHORDATEMAJOR EVENT |
@@ -964,10 +964,17 @@ zone_value: |
964 | 964 | |ConstInterval'('Iconst')'Sconstopt_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 | |LOCALTEMPORARY{$$ =TRUE; } |
1421 | 1431 | |LOCALTEMP{$$ =TRUE; } |
1422 | | -|GLOBALTEMPORARY |
1423 | | -{ |
1424 | | -elog(ERROR, |
1425 | | -"GLOBAL TEMPORARY TABLE is not currently supported"); |
1426 | | -$$ =TRUE; |
1427 | | -} |
1428 | | -|GLOBALTEMP |
1429 | | -{ |
1430 | | -elog(ERROR, |
1431 | | -"GLOBAL TEMPORARY TABLE is not currently supported"); |
1432 | | -$$ =TRUE; |
1433 | | -} |
| 1432 | +|GLOBALTEMPORARY{$$ =TRUE; } |
| 1433 | +|GLOBALTEMP{$$ =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 | } |
|