Hi all, Attached is a patch to fix another parsing error for date-time types that allow extraneous fields with certain reserved keywords. For example both `date '1995-08-06 epoch'` and `date 'today epoch'` were considered valid dates that both resolve to 1970-01-01.
- Joe Koshakow
From fb4c161afff08b926eea12d8689a148e99cbdb5c Mon Sep 17 00:00:00 2001 From: Joseph Koshakow <kosh...@gmail.com> Date: Sun, 11 Dec 2022 16:08:43 -0500 Subject: [PATCH] Handle extraneous fields in date-time input DecodeDateTime sometimest allowed extraneous fields to be included with reserved keywords. For example `date '1995-08-06 epoch'` would be parsed successfully, but the date was ignored. This commit fixes the issue so an error is returned instead. --- src/backend/utils/adt/datetime.c | 3 +++ src/test/regress/expected/date.out | 17 +++++++++++++++++ src/test/regress/expected/timestamp.out | 17 +++++++++++++++++ src/test/regress/sql/date.sql | 6 ++++++ src/test/regress/sql/timestamp.sql | 6 ++++++ 5 files changed, 49 insertions(+) diff --git a/src/backend/utils/adt/datetime.c b/src/backend/utils/adt/datetime.c index b5b117a8ca..1e141a06f4 100644 --- a/src/backend/utils/adt/datetime.c +++ b/src/backend/utils/adt/datetime.c @@ -1431,6 +1431,9 @@ DecodeDateTime(char **field, int *ftype, int nf, break; default: + /* only allowed if we haven't already parsed some fields */ + if (fmask) + return DTERR_BAD_FORMAT; *dtype = val; } diff --git a/src/test/regress/expected/date.out b/src/test/regress/expected/date.out index f8f83e40e9..50a4a52d8c 100644 --- a/src/test/regress/expected/date.out +++ b/src/test/regress/expected/date.out @@ -1526,3 +1526,20 @@ select make_time(10, 55, 100.1); ERROR: time field value out of range: 10:55:100.1 select make_time(24, 0, 2.1); ERROR: time field value out of range: 24:00:2.1 +-- test errors with reserved keywords +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 'now infinity'; +ERROR: invalid input syntax for type date: "now infinity" +LINE 1: SELECT date 'now infinity'; + ^ diff --git a/src/test/regress/expected/timestamp.out b/src/test/regress/expected/timestamp.out index be66274738..f68ecd19ea 100644 --- a/src/test/regress/expected/timestamp.out +++ b/src/test/regress/expected/timestamp.out @@ -2110,3 +2110,20 @@ select * from generate_series('2020-01-01 00:00'::timestamp, '2020-01-02 03:00'::timestamp, '0 hour'::interval); ERROR: step size cannot equal zero +-- test errors with reserved keywords +SELECT timestamp '1995-08-06 01:01:01 epoch'; +ERROR: invalid input syntax for type timestamp: "1995-08-06 01:01:01 epoch" +LINE 1: SELECT timestamp '1995-08-06 01:01:01 epoch'; + ^ +SELECT timestamp '1995-08-06 01:01:01 infinity'; +ERROR: invalid input syntax for type timestamp: "1995-08-06 01:01:01 infinity" +LINE 1: SELECT timestamp '1995-08-06 01:01:01 infinity'; + ^ +SELECT timestamp '1995-08-06 01:01:01 -infinity'; +ERROR: invalid input syntax for type timestamp: "1995-08-06 01:01:01 -infinity" +LINE 1: SELECT timestamp '1995-08-06 01:01:01 -infinity'; + ^ +SELECT timestamp 'today epoch'; +ERROR: invalid input syntax for type timestamp: "today epoch" +LINE 1: SELECT timestamp 'today epoch'; + ^ diff --git a/src/test/regress/sql/date.sql b/src/test/regress/sql/date.sql index 9fd15be5f9..82da992e3a 100644 --- a/src/test/regress/sql/date.sql +++ b/src/test/regress/sql/date.sql @@ -371,3 +371,9 @@ select make_date(2013, 13, 1); select make_date(2013, 11, -1); select make_time(10, 55, 100.1); select make_time(24, 0, 2.1); + +-- test errors with reserved keywords +SELECT date '1995-08-06 epoch'; +SELECT date '1995-08-06 infinity'; +SELECT date '1995-08-06 -infinity'; +SELECT date 'now infinity'; diff --git a/src/test/regress/sql/timestamp.sql b/src/test/regress/sql/timestamp.sql index e1175b12ce..f7e3fe1270 100644 --- a/src/test/regress/sql/timestamp.sql +++ b/src/test/regress/sql/timestamp.sql @@ -391,3 +391,9 @@ select generate_series('2022-01-01 00:00'::timestamp, select * from generate_series('2020-01-01 00:00'::timestamp, '2020-01-02 03:00'::timestamp, '0 hour'::interval); + +-- test errors with reserved keywords +SELECT timestamp '1995-08-06 01:01:01 epoch'; +SELECT timestamp '1995-08-06 01:01:01 infinity'; +SELECT timestamp '1995-08-06 01:01:01 -infinity'; +SELECT timestamp 'today epoch'; -- 2.34.1