Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commitbcc704b

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 withthese special tokens.Joseph Koshakow, reviewed by Keisuke Kuroda and myselfDiscussion:https://postgr.es/m/CAAvxfHdm8wwXwG_FFRaJ1nTHiMWb7YXS2YKCzCt8Q0a2ZoMcHg@mail.gmail.com
1 parent27b6237 commitbcc704b

File tree

3 files changed

+133
-15
lines changed

3 files changed

+133
-15
lines changed

‎src/backend/utils/adt/datetime.c

Lines changed: 25 additions & 15 deletions
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+
caseDTK_EPOCH:
1435+
caseDTK_LATE:
1436+
caseDTK_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-
returndterr;
1574-
1575-
/* handle AM/PM */
1576-
if (mer!=HR24&&tm->tm_hour>HOURS_PER_DAY /2)
1577-
returnDTERR_FIELD_OVERFLOW;
1578-
if (mer==AM&&tm->tm_hour==HOURS_PER_DAY /2)
1579-
tm->tm_hour=0;
1580-
elseif (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+
returndterr;
1586+
1587+
/* handle AM/PM */
1588+
if (mer!=HR24&&tm->tm_hour>HOURS_PER_DAY /2)
1589+
returnDTERR_FIELD_OVERFLOW;
1590+
if (mer==AM&&tm->tm_hour==HOURS_PER_DAY /2)
1591+
tm->tm_hour=0;
1592+
elseif (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

Lines changed: 85 additions & 0 deletions
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

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,29 @@ SET DateStyle = 'Postgres, MDY';
6262
SELECTdate'J1520447'AS"Confucius' Birthday";
6363
SELECTdate'J0'AS"Julian Epoch";
6464

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

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp