mirror of
https://git.postgresql.org/git/postgresql.git
synced 2025-02-23 19:39:53 +08:00
Reject combining "epoch" and "infinity" with other datetime fields.
Datetime input formerly accepted combinations such as '1995-08-06 infinity', but this seems like a clear error. Reject any combination of regular y/m/d/h/m/s fields with these special tokens. Joseph Koshakow, reviewed by Keisuke Kuroda and myself Discussion: https://postgr.es/m/CAAvxfHdm8wwXwG_FFRaJ1nTHiMWb7YXS2YKCzCt8Q0a2ZoMcHg@mail.gmail.com
This commit is contained in:
parent
27b62377b4
commit
bcc704b524
@ -1431,8 +1431,17 @@ DecodeDateTime(char **field, int *ftype, int nf,
|
|||||||
*tzp = 0;
|
*tzp = 0;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
case DTK_EPOCH:
|
||||||
|
case DTK_LATE:
|
||||||
|
case DTK_EARLY:
|
||||||
|
tmask = (DTK_DATE_M | DTK_TIME_M | DTK_M(TZ));
|
||||||
*dtype = val;
|
*dtype = val;
|
||||||
|
/* caller ignores tm for these dtype codes */
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
elog(ERROR, "unrecognized RESERV datetime token: %d",
|
||||||
|
val);
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
@ -1567,6 +1576,9 @@ DecodeDateTime(char **field, int *ftype, int nf,
|
|||||||
fmask |= tmask;
|
fmask |= tmask;
|
||||||
} /* end loop over fields */
|
} /* end loop over fields */
|
||||||
|
|
||||||
|
/* do additional checking for normal date specs (but not "infinity" etc) */
|
||||||
|
if (*dtype == DTK_DATE)
|
||||||
|
{
|
||||||
/* do final checking/adjustment of Y/M/D fields */
|
/* do final checking/adjustment of Y/M/D fields */
|
||||||
dterr = ValidateDate(fmask, isjulian, is2digits, bc, tm);
|
dterr = ValidateDate(fmask, isjulian, is2digits, bc, tm);
|
||||||
if (dterr)
|
if (dterr)
|
||||||
@ -1580,9 +1592,7 @@ DecodeDateTime(char **field, int *ftype, int nf,
|
|||||||
else if (mer == PM && tm->tm_hour != HOURS_PER_DAY / 2)
|
else if (mer == PM && tm->tm_hour != HOURS_PER_DAY / 2)
|
||||||
tm->tm_hour += HOURS_PER_DAY / 2;
|
tm->tm_hour += HOURS_PER_DAY / 2;
|
||||||
|
|
||||||
/* do additional checking for full date specs... */
|
/* check for incomplete input */
|
||||||
if (*dtype == DTK_DATE)
|
|
||||||
{
|
|
||||||
if ((fmask & DTK_DATE_M) != DTK_DATE_M)
|
if ((fmask & DTK_DATE_M) != DTK_DATE_M)
|
||||||
{
|
{
|
||||||
if ((fmask & DTK_TIME_M) == DTK_TIME_M)
|
if ((fmask & DTK_TIME_M) == DTK_TIME_M)
|
||||||
|
@ -283,6 +283,91 @@ SELECT date 'J0' AS "Julian Epoch";
|
|||||||
11-24-4714 BC
|
11-24-4714 BC
|
||||||
(1 row)
|
(1 row)
|
||||||
|
|
||||||
|
-- conflicting fields should throw errors
|
||||||
|
SELECT date '1995-08-06 epoch';
|
||||||
|
ERROR: invalid input syntax for type date: "1995-08-06 epoch"
|
||||||
|
LINE 1: SELECT date '1995-08-06 epoch';
|
||||||
|
^
|
||||||
|
SELECT date '1995-08-06 infinity';
|
||||||
|
ERROR: invalid input syntax for type date: "1995-08-06 infinity"
|
||||||
|
LINE 1: SELECT date '1995-08-06 infinity';
|
||||||
|
^
|
||||||
|
SELECT date '1995-08-06 -infinity';
|
||||||
|
ERROR: invalid input syntax for type date: "1995-08-06 -infinity"
|
||||||
|
LINE 1: SELECT date '1995-08-06 -infinity';
|
||||||
|
^
|
||||||
|
SELECT date 'today infinity';
|
||||||
|
ERROR: invalid input syntax for type date: "today infinity"
|
||||||
|
LINE 1: SELECT date 'today infinity';
|
||||||
|
^
|
||||||
|
SELECT date '-infinity infinity';
|
||||||
|
ERROR: invalid input syntax for type date: "-infinity infinity"
|
||||||
|
LINE 1: SELECT date '-infinity infinity';
|
||||||
|
^
|
||||||
|
SELECT timestamp '1995-08-06 epoch';
|
||||||
|
ERROR: invalid input syntax for type timestamp: "1995-08-06 epoch"
|
||||||
|
LINE 1: SELECT timestamp '1995-08-06 epoch';
|
||||||
|
^
|
||||||
|
SELECT timestamp '1995-08-06 infinity';
|
||||||
|
ERROR: invalid input syntax for type timestamp: "1995-08-06 infinity"
|
||||||
|
LINE 1: SELECT timestamp '1995-08-06 infinity';
|
||||||
|
^
|
||||||
|
SELECT timestamp '1995-08-06 -infinity';
|
||||||
|
ERROR: invalid input syntax for type timestamp: "1995-08-06 -infinity"
|
||||||
|
LINE 1: SELECT timestamp '1995-08-06 -infinity';
|
||||||
|
^
|
||||||
|
SELECT timestamp 'epoch 01:01:01';
|
||||||
|
ERROR: invalid input syntax for type timestamp: "epoch 01:01:01"
|
||||||
|
LINE 1: SELECT timestamp 'epoch 01:01:01';
|
||||||
|
^
|
||||||
|
SELECT timestamp 'infinity 01:01:01';
|
||||||
|
ERROR: invalid input syntax for type timestamp: "infinity 01:01:01"
|
||||||
|
LINE 1: SELECT timestamp 'infinity 01:01:01';
|
||||||
|
^
|
||||||
|
SELECT timestamp '-infinity 01:01:01';
|
||||||
|
ERROR: invalid input syntax for type timestamp: "-infinity 01:01:01"
|
||||||
|
LINE 1: SELECT timestamp '-infinity 01:01:01';
|
||||||
|
^
|
||||||
|
SELECT timestamp 'now epoch';
|
||||||
|
ERROR: invalid input syntax for type timestamp: "now epoch"
|
||||||
|
LINE 1: SELECT timestamp 'now epoch';
|
||||||
|
^
|
||||||
|
SELECT timestamp '-infinity infinity';
|
||||||
|
ERROR: invalid input syntax for type timestamp: "-infinity infinity"
|
||||||
|
LINE 1: SELECT timestamp '-infinity infinity';
|
||||||
|
^
|
||||||
|
SELECT timestamptz '1995-08-06 epoch';
|
||||||
|
ERROR: invalid input syntax for type timestamp with time zone: "1995-08-06 epoch"
|
||||||
|
LINE 1: SELECT timestamptz '1995-08-06 epoch';
|
||||||
|
^
|
||||||
|
SELECT timestamptz '1995-08-06 infinity';
|
||||||
|
ERROR: invalid input syntax for type timestamp with time zone: "1995-08-06 infinity"
|
||||||
|
LINE 1: SELECT timestamptz '1995-08-06 infinity';
|
||||||
|
^
|
||||||
|
SELECT timestamptz '1995-08-06 -infinity';
|
||||||
|
ERROR: invalid input syntax for type timestamp with time zone: "1995-08-06 -infinity"
|
||||||
|
LINE 1: SELECT timestamptz '1995-08-06 -infinity';
|
||||||
|
^
|
||||||
|
SELECT timestamptz 'epoch 01:01:01';
|
||||||
|
ERROR: invalid input syntax for type timestamp with time zone: "epoch 01:01:01"
|
||||||
|
LINE 1: SELECT timestamptz 'epoch 01:01:01';
|
||||||
|
^
|
||||||
|
SELECT timestamptz 'infinity 01:01:01';
|
||||||
|
ERROR: invalid input syntax for type timestamp with time zone: "infinity 01:01:01"
|
||||||
|
LINE 1: SELECT timestamptz 'infinity 01:01:01';
|
||||||
|
^
|
||||||
|
SELECT timestamptz '-infinity 01:01:01';
|
||||||
|
ERROR: invalid input syntax for type timestamp with time zone: "-infinity 01:01:01"
|
||||||
|
LINE 1: SELECT timestamptz '-infinity 01:01:01';
|
||||||
|
^
|
||||||
|
SELECT timestamptz 'now epoch';
|
||||||
|
ERROR: invalid input syntax for type timestamp with time zone: "now epoch"
|
||||||
|
LINE 1: SELECT timestamptz 'now epoch';
|
||||||
|
^
|
||||||
|
SELECT timestamptz '-infinity infinity';
|
||||||
|
ERROR: invalid input syntax for type timestamp with time zone: "-infinity infinity"
|
||||||
|
LINE 1: SELECT timestamptz '-infinity infinity';
|
||||||
|
^
|
||||||
--
|
--
|
||||||
-- date, time arithmetic
|
-- date, time arithmetic
|
||||||
--
|
--
|
||||||
|
@ -62,6 +62,29 @@ SET DateStyle = 'Postgres, MDY';
|
|||||||
SELECT date 'J1520447' AS "Confucius' Birthday";
|
SELECT date 'J1520447' AS "Confucius' Birthday";
|
||||||
SELECT date 'J0' AS "Julian Epoch";
|
SELECT date 'J0' AS "Julian Epoch";
|
||||||
|
|
||||||
|
-- conflicting fields should throw errors
|
||||||
|
SELECT date '1995-08-06 epoch';
|
||||||
|
SELECT date '1995-08-06 infinity';
|
||||||
|
SELECT date '1995-08-06 -infinity';
|
||||||
|
SELECT date 'today infinity';
|
||||||
|
SELECT date '-infinity infinity';
|
||||||
|
SELECT timestamp '1995-08-06 epoch';
|
||||||
|
SELECT timestamp '1995-08-06 infinity';
|
||||||
|
SELECT timestamp '1995-08-06 -infinity';
|
||||||
|
SELECT timestamp 'epoch 01:01:01';
|
||||||
|
SELECT timestamp 'infinity 01:01:01';
|
||||||
|
SELECT timestamp '-infinity 01:01:01';
|
||||||
|
SELECT timestamp 'now epoch';
|
||||||
|
SELECT timestamp '-infinity infinity';
|
||||||
|
SELECT timestamptz '1995-08-06 epoch';
|
||||||
|
SELECT timestamptz '1995-08-06 infinity';
|
||||||
|
SELECT timestamptz '1995-08-06 -infinity';
|
||||||
|
SELECT timestamptz 'epoch 01:01:01';
|
||||||
|
SELECT timestamptz 'infinity 01:01:01';
|
||||||
|
SELECT timestamptz '-infinity 01:01:01';
|
||||||
|
SELECT timestamptz 'now epoch';
|
||||||
|
SELECT timestamptz '-infinity infinity';
|
||||||
|
|
||||||
--
|
--
|
||||||
-- date, time arithmetic
|
-- date, time arithmetic
|
||||||
--
|
--
|
||||||
|
Loading…
Reference in New Issue
Block a user