Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit bcc704b

Browse files
committed
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
1 parent 27b6237 commit bcc704b

File tree

3 files changed

+133
-15
lines changed

3 files changed

+133
-15
lines changed

src/backend/utils/adt/datetime.c

+25-15
Original file line numberDiff line numberDiff line change
@@ -1431,8 +1431,17 @@ DecodeDateTime(char **field, int *ftype, int nf,
14311431
*tzp = 0;
14321432
break;
14331433

1434-
default:
1434+
case DTK_EPOCH:
1435+
case DTK_LATE:
1436+
case DTK_EARLY:
1437+
tmask = (DTK_DATE_M | DTK_TIME_M | DTK_M(TZ));
14351438
*dtype = val;
1439+
/* caller ignores tm for these dtype codes */
1440+
break;
1441+
1442+
default:
1443+
elog(ERROR, "unrecognized RESERV datetime token: %d",
1444+
val);
14361445
}
14371446

14381447
break;
@@ -1567,22 +1576,23 @@ DecodeDateTime(char **field, int *ftype, int nf,
15671576
fmask |= tmask;
15681577
} /* end loop over fields */
15691578

1570-
/* do final checking/adjustment of Y/M/D fields */
1571-
dterr = ValidateDate(fmask, isjulian, is2digits, bc, tm);
1572-
if (dterr)
1573-
return dterr;
1574-
1575-
/* handle AM/PM */
1576-
if (mer != HR24 && tm->tm_hour > HOURS_PER_DAY / 2)
1577-
return DTERR_FIELD_OVERFLOW;
1578-
if (mer == AM && tm->tm_hour == HOURS_PER_DAY / 2)
1579-
tm->tm_hour = 0;
1580-
else if (mer == PM && tm->tm_hour != HOURS_PER_DAY / 2)
1581-
tm->tm_hour += HOURS_PER_DAY / 2;
1582-
1583-
/* do additional checking for full date specs... */
1579+
/* do additional checking for normal date specs (but not "infinity" etc) */
15841580
if (*dtype == DTK_DATE)
15851581
{
1582+
/* do final checking/adjustment of Y/M/D fields */
1583+
dterr = ValidateDate(fmask, isjulian, is2digits, bc, tm);
1584+
if (dterr)
1585+
return dterr;
1586+
1587+
/* handle AM/PM */
1588+
if (mer != HR24 && tm->tm_hour > HOURS_PER_DAY / 2)
1589+
return DTERR_FIELD_OVERFLOW;
1590+
if (mer == AM && tm->tm_hour == HOURS_PER_DAY / 2)
1591+
tm->tm_hour = 0;
1592+
else if (mer == PM && tm->tm_hour != HOURS_PER_DAY / 2)
1593+
tm->tm_hour += HOURS_PER_DAY / 2;
1594+
1595+
/* check for incomplete input */
15861596
if ((fmask & DTK_DATE_M) != DTK_DATE_M)
15871597
{
15881598
if ((fmask & DTK_TIME_M) == DTK_TIME_M)

src/test/regress/expected/horology.out

+85
Original file line numberDiff line numberDiff line change
@@ -283,6 +283,91 @@ SELECT date 'J0' AS "Julian Epoch";
283283
11-24-4714 BC
284284
(1 row)
285285

286+
-- conflicting fields should throw errors
287+
SELECT date '1995-08-06 epoch';
288+
ERROR: invalid input syntax for type date: "1995-08-06 epoch"
289+
LINE 1: SELECT date '1995-08-06 epoch';
290+
^
291+
SELECT date '1995-08-06 infinity';
292+
ERROR: invalid input syntax for type date: "1995-08-06 infinity"
293+
LINE 1: SELECT date '1995-08-06 infinity';
294+
^
295+
SELECT date '1995-08-06 -infinity';
296+
ERROR: invalid input syntax for type date: "1995-08-06 -infinity"
297+
LINE 1: SELECT date '1995-08-06 -infinity';
298+
^
299+
SELECT date 'today infinity';
300+
ERROR: invalid input syntax for type date: "today infinity"
301+
LINE 1: SELECT date 'today infinity';
302+
^
303+
SELECT date '-infinity infinity';
304+
ERROR: invalid input syntax for type date: "-infinity infinity"
305+
LINE 1: SELECT date '-infinity infinity';
306+
^
307+
SELECT timestamp '1995-08-06 epoch';
308+
ERROR: invalid input syntax for type timestamp: "1995-08-06 epoch"
309+
LINE 1: SELECT timestamp '1995-08-06 epoch';
310+
^
311+
SELECT timestamp '1995-08-06 infinity';
312+
ERROR: invalid input syntax for type timestamp: "1995-08-06 infinity"
313+
LINE 1: SELECT timestamp '1995-08-06 infinity';
314+
^
315+
SELECT timestamp '1995-08-06 -infinity';
316+
ERROR: invalid input syntax for type timestamp: "1995-08-06 -infinity"
317+
LINE 1: SELECT timestamp '1995-08-06 -infinity';
318+
^
319+
SELECT timestamp 'epoch 01:01:01';
320+
ERROR: invalid input syntax for type timestamp: "epoch 01:01:01"
321+
LINE 1: SELECT timestamp 'epoch 01:01:01';
322+
^
323+
SELECT timestamp 'infinity 01:01:01';
324+
ERROR: invalid input syntax for type timestamp: "infinity 01:01:01"
325+
LINE 1: SELECT timestamp 'infinity 01:01:01';
326+
^
327+
SELECT timestamp '-infinity 01:01:01';
328+
ERROR: invalid input syntax for type timestamp: "-infinity 01:01:01"
329+
LINE 1: SELECT timestamp '-infinity 01:01:01';
330+
^
331+
SELECT timestamp 'now epoch';
332+
ERROR: invalid input syntax for type timestamp: "now epoch"
333+
LINE 1: SELECT timestamp 'now epoch';
334+
^
335+
SELECT timestamp '-infinity infinity';
336+
ERROR: invalid input syntax for type timestamp: "-infinity infinity"
337+
LINE 1: SELECT timestamp '-infinity infinity';
338+
^
339+
SELECT timestamptz '1995-08-06 epoch';
340+
ERROR: invalid input syntax for type timestamp with time zone: "1995-08-06 epoch"
341+
LINE 1: SELECT timestamptz '1995-08-06 epoch';
342+
^
343+
SELECT timestamptz '1995-08-06 infinity';
344+
ERROR: invalid input syntax for type timestamp with time zone: "1995-08-06 infinity"
345+
LINE 1: SELECT timestamptz '1995-08-06 infinity';
346+
^
347+
SELECT timestamptz '1995-08-06 -infinity';
348+
ERROR: invalid input syntax for type timestamp with time zone: "1995-08-06 -infinity"
349+
LINE 1: SELECT timestamptz '1995-08-06 -infinity';
350+
^
351+
SELECT timestamptz 'epoch 01:01:01';
352+
ERROR: invalid input syntax for type timestamp with time zone: "epoch 01:01:01"
353+
LINE 1: SELECT timestamptz 'epoch 01:01:01';
354+
^
355+
SELECT timestamptz 'infinity 01:01:01';
356+
ERROR: invalid input syntax for type timestamp with time zone: "infinity 01:01:01"
357+
LINE 1: SELECT timestamptz 'infinity 01:01:01';
358+
^
359+
SELECT timestamptz '-infinity 01:01:01';
360+
ERROR: invalid input syntax for type timestamp with time zone: "-infinity 01:01:01"
361+
LINE 1: SELECT timestamptz '-infinity 01:01:01';
362+
^
363+
SELECT timestamptz 'now epoch';
364+
ERROR: invalid input syntax for type timestamp with time zone: "now epoch"
365+
LINE 1: SELECT timestamptz 'now epoch';
366+
^
367+
SELECT timestamptz '-infinity infinity';
368+
ERROR: invalid input syntax for type timestamp with time zone: "-infinity infinity"
369+
LINE 1: SELECT timestamptz '-infinity infinity';
370+
^
286371
--
287372
-- date, time arithmetic
288373
--

src/test/regress/sql/horology.sql

+23
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,29 @@ SET DateStyle = 'Postgres, MDY';
6262
SELECT date 'J1520447' AS "Confucius' Birthday";
6363
SELECT date 'J0' AS "Julian Epoch";
6464

65+
-- conflicting fields should throw errors
66+
SELECT date '1995-08-06 epoch';
67+
SELECT date '1995-08-06 infinity';
68+
SELECT date '1995-08-06 -infinity';
69+
SELECT date 'today infinity';
70+
SELECT date '-infinity infinity';
71+
SELECT timestamp '1995-08-06 epoch';
72+
SELECT timestamp '1995-08-06 infinity';
73+
SELECT timestamp '1995-08-06 -infinity';
74+
SELECT timestamp 'epoch 01:01:01';
75+
SELECT timestamp 'infinity 01:01:01';
76+
SELECT timestamp '-infinity 01:01:01';
77+
SELECT timestamp 'now epoch';
78+
SELECT timestamp '-infinity infinity';
79+
SELECT timestamptz '1995-08-06 epoch';
80+
SELECT timestamptz '1995-08-06 infinity';
81+
SELECT timestamptz '1995-08-06 -infinity';
82+
SELECT timestamptz 'epoch 01:01:01';
83+
SELECT timestamptz 'infinity 01:01:01';
84+
SELECT timestamptz '-infinity 01:01:01';
85+
SELECT timestamptz 'now epoch';
86+
SELECT timestamptz '-infinity infinity';
87+
6588
--
6689
-- date, time arithmetic
6790
--

0 commit comments

Comments
 (0)