diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y
new file mode 100644
index c98c27a..0de9584
*** a/src/backend/parser/gram.y
--- b/src/backend/parser/gram.y
*************** zone_value:
*** 1552,1578 ****
  					t->typmods = $3;
  					$$ = makeStringConstCast($2, @2, t);
  				}
! 			| ConstInterval '(' Iconst ')' Sconst opt_interval
  				{
  					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));
  					$$ = makeStringConstCast($5, @5, t);
  				}
  			| NumericOnly							{ $$ = makeAConst($1, @1); }
--- 1552,1562 ----
  					t->typmods = $3;
  					$$ = makeStringConstCast($2, @2, t);
  				}
! 			| ConstInterval '(' Iconst ')' Sconst
  				{
  					TypeName *t = $1;
! 					t->typmods = list_make2(makeIntConst(INTERVAL_FULL_RANGE, -1),
! 											makeIntConst($3, @3));
  					$$ = makeStringConstCast($5, @5, t);
  				}
  			| NumericOnly							{ $$ = makeAConst($1, @1); }
*************** SimpleTypename:
*** 10582,10602 ****
  					$$ = $1;
  					$$->typmods = $2;
  				}
! 			| ConstInterval '(' Iconst ')' opt_interval
  				{
  					$$ = $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));
  				}
  		;
  
--- 10566,10576 ----
  					$$ = $1;
  					$$->typmods = $2;
  				}
! 			| ConstInterval '(' Iconst ')'
  				{
  					$$ = $1;
! 					$$->typmods = list_make2(makeIntConst(INTERVAL_FULL_RANGE, -1),
! 											 makeIntConst($3, @3));
  				}
  		;
  
*************** AexprConst: Iconst
*** 12923,12943 ****
  					t->typmods = $3;
  					$$ = makeStringConstCast($2, @2, t);
  				}
! 			| ConstInterval '(' Iconst ')' Sconst opt_interval
  				{
  					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));
  					$$ = makeStringConstCast($5, @5, t);
  				}
  			| TRUE_P
--- 12897,12907 ----
  					t->typmods = $3;
  					$$ = makeStringConstCast($2, @2, t);
  				}
! 			| ConstInterval '(' Iconst ')' Sconst
  				{
  					TypeName *t = $1;
! 					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
new file mode 100644
index cf20506..c873a99
*** a/src/test/regress/expected/interval.out
--- b/src/test/regress/expected/interval.out
*************** SELECT interval '12:34.5678' minute to s
*** 616,631 ****
   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   
  --------------
--- 616,621 ----
diff --git a/src/test/regress/sql/interval.sql b/src/test/regress/sql/interval.sql
new file mode 100644
index 2318917..789c3de
*** a/src/test/regress/sql/interval.sql
--- b/src/test/regress/sql/interval.sql
*************** SELECT interval '123 2:03 -2:04'; -- not
*** 183,190 ****
  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);
--- 183,188 ----
