1
0
mirror of https://github.com/postgres/postgres.git synced 2025-06-25 01:02:05 +03:00

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
This commit is contained in:
Bruce Momjian
2014-10-18 10:31:00 -04:00
parent 97d554871c
commit 417f92484d
3 changed files with 9 additions and 57 deletions

View File

@ -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