aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBruce Momjian <bruce@momjian.us>2014-10-18 10:31:00 -0400
committerBruce Momjian <bruce@momjian.us>2014-10-18 10:31:00 -0400
commit417f92484da8c9a124e7eece8dbfb71f688a0104 (patch)
treed424516b259096cdc9bdafb46af948d1b63e50df
parent97d554871c3d186db831b35c0eabe6d496e4f54b (diff)
downloadpostgresql-417f92484da8c9a124e7eece8dbfb71f688a0104.tar.gz
postgresql-417f92484da8c9a124e7eece8dbfb71f688a0104.zip
interval: tighten precision specification
interval precision can only be specified after the "interval" keyword if no units are specified. Previously we incorrectly checked the units to see if the precision was legal, causing confusion. Report by Alvaro Herrera
-rw-r--r--src/backend/parser/gram.y54
-rw-r--r--src/test/regress/expected/interval.out10
-rw-r--r--src/test/regress/sql/interval.sql2
3 files changed, 9 insertions, 57 deletions
diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y
index c98c27a16d9..0de9584e531 100644
--- a/src/backend/parser/gram.y
+++ b/src/backend/parser/gram.y
@@ -1552,27 +1552,11 @@ zone_value:
t->typmods = $3;
$$ = makeStringConstCast($2, @2, t);
}
- | ConstInterval '(' Iconst ')' Sconst opt_interval
+ | ConstInterval '(' Iconst ')' Sconst
{
TypeName *t = $1;
- if ($6 != NIL)
- {
- A_Const *n = (A_Const *) linitial($6);
- if ((n->val.val.ival & ~(INTERVAL_MASK(HOUR) | INTERVAL_MASK(MINUTE))) != 0)
- ereport(ERROR,
- (errcode(ERRCODE_SYNTAX_ERROR),
- errmsg("time zone interval must be HOUR or HOUR TO MINUTE"),
- parser_errposition(@6)));
- if (list_length($6) != 1)
- ereport(ERROR,
- (errcode(ERRCODE_SYNTAX_ERROR),
- errmsg("interval precision specified twice"),
- parser_errposition(@1)));
- t->typmods = lappend($6, makeIntConst($3, @3));
- }
- else
- t->typmods = list_make2(makeIntConst(INTERVAL_FULL_RANGE, -1),
- makeIntConst($3, @3));
+ t->typmods = list_make2(makeIntConst(INTERVAL_FULL_RANGE, -1),
+ makeIntConst($3, @3));
$$ = makeStringConstCast($5, @5, t);
}
| NumericOnly { $$ = makeAConst($1, @1); }
@@ -10582,21 +10566,11 @@ SimpleTypename:
$$ = $1;
$$->typmods = $2;
}
- | ConstInterval '(' Iconst ')' opt_interval
+ | ConstInterval '(' Iconst ')'
{
$$ = $1;
- if ($5 != NIL)
- {
- if (list_length($5) != 1)
- ereport(ERROR,
- (errcode(ERRCODE_SYNTAX_ERROR),
- errmsg("interval precision specified twice"),
- parser_errposition(@1)));
- $$->typmods = lappend($5, makeIntConst($3, @3));
- }
- else
- $$->typmods = list_make2(makeIntConst(INTERVAL_FULL_RANGE, -1),
- makeIntConst($3, @3));
+ $$->typmods = list_make2(makeIntConst(INTERVAL_FULL_RANGE, -1),
+ makeIntConst($3, @3));
}
;
@@ -12923,21 +12897,11 @@ AexprConst: Iconst
t->typmods = $3;
$$ = makeStringConstCast($2, @2, t);
}
- | ConstInterval '(' Iconst ')' Sconst opt_interval
+ | ConstInterval '(' Iconst ')' Sconst
{
TypeName *t = $1;
- if ($6 != NIL)
- {
- if (list_length($6) != 1)
- ereport(ERROR,
- (errcode(ERRCODE_SYNTAX_ERROR),
- errmsg("interval precision specified twice"),
- parser_errposition(@1)));
- t->typmods = lappend($6, makeIntConst($3, @3));
- }
- else
- t->typmods = list_make2(makeIntConst(INTERVAL_FULL_RANGE, -1),
- makeIntConst($3, @3));
+ t->typmods = list_make2(makeIntConst(INTERVAL_FULL_RANGE, -1),
+ makeIntConst($3, @3));
$$ = makeStringConstCast($5, @5, t);
}
| TRUE_P
diff --git a/src/test/regress/expected/interval.out b/src/test/regress/expected/interval.out
index cf20506bc1e..c873a99bd94 100644
--- a/src/test/regress/expected/interval.out
+++ b/src/test/regress/expected/interval.out
@@ -616,16 +616,6 @@ SELECT interval '12:34.5678' minute to second(2); -- per SQL spec
00:12:34.57
(1 row)
-SELECT interval(2) '12:34.5678' minute to second; -- historical PG
- interval
--------------
- 00:12:34.57
-(1 row)
-
-SELECT interval(2) '12:34.5678' minute to second(2); -- syntax error
-ERROR: interval precision specified twice
-LINE 1: SELECT interval(2) '12:34.5678' minute to second(2);
- ^
SELECT interval '1.234' second;
interval
--------------
diff --git a/src/test/regress/sql/interval.sql b/src/test/regress/sql/interval.sql
index 23189174701..789c3de4403 100644
--- a/src/test/regress/sql/interval.sql
+++ b/src/test/regress/sql/interval.sql
@@ -183,8 +183,6 @@ SELECT interval '123 2:03 -2:04'; -- not ok, redundant hh:mm fields
SELECT interval(0) '1 day 01:23:45.6789';
SELECT interval(2) '1 day 01:23:45.6789';
SELECT interval '12:34.5678' minute to second(2); -- per SQL spec
-SELECT interval(2) '12:34.5678' minute to second; -- historical PG
-SELECT interval(2) '12:34.5678' minute to second(2); -- syntax error
SELECT interval '1.234' second;
SELECT interval '1.234' second(2);
SELECT interval '1 2.345' day to second(2);