From: Tom Lane <tgl@sss.pgh.pa.us>
To: Alvaro Herrera <alvherre@alvh.no-ip.org>
Cc: david.perez.ingeniero@gmail.com
Cc: pgsql-bugs@lists.postgresql.org
Subject: Re: BUG #18470: Time literal accepted in Postgres 15 and below, not accepted in Postgres 16
Date: Fri, 17 May 2024 17:52:48 -0400
Message-ID: <2599239.1715982768@sss.pgh.pa.us> (raw)
In-Reply-To: <2473625.1715968911@sss.pgh.pa.us>
References: <202405171346.virffgus6cjg@alvherre.pgsql>
<2393945.1715956655@sss.pgh.pa.us>
<2473625.1715968911@sss.pgh.pa.us>
I wrote:
> So at this point, yeah that's a bug we should fix.
> I'll look into it later if nobody beats me to it.
It is failing because it sees an "unhandled prefix type",
that is ptype still nonzero after the parsing loop
in DecodeTimeOnly. We need to reset ptype, as is done
in the comparable case in DecodeDateTime.
regards, tom lane
Attachments:fix-bug-18470.patch (text/x-diff, 5.7K) downloaddiff --git a/src/backend/utils/adt/datetime.c b/src/backend/utils/adt/datetime.cindex 1b86fff2fb..7abdc62f41 100644--- a/src/backend/utils/adt/datetime.c+++ b/src/backend/utils/adt/datetime.c@@ -1970,6 +1970,17 @@ DecodeTimeOnly(char **field, int *ftype, int nf,
break;
case DTK_TIME:
++ /*+ * This might be an ISO time following a "t" field.+ */+ if (ptype != 0)+ {+ if (ptype != DTK_TIME)+ return DTERR_BAD_FORMAT;+ ptype = 0;+ }+
dterr = DecodeTime(field[i], (fmask | DTK_DATE_M),
INTERVAL_FULL_RANGE,
&tmask, tm, fsec);
diff --git a/src/test/regress/expected/horology.out b/src/test/regress/expected/horology.outindex 195fe72644..241713cc51 100644--- a/src/test/regress/expected/horology.out+++ b/src/test/regress/expected/horology.out@@ -274,6 +274,161 @@ SELECT time with time zone 'J2452271 T040506.789 America/Los_Angeles';
04:05:06.789-08
(1 row)
+-- Check time formats required by ISO 8601+SELECT time without time zone '040506.07';+ time +-------------+ 04:05:06.07+(1 row)++SELECT time without time zone '04:05:06.07';+ time +-------------+ 04:05:06.07+(1 row)++SELECT time without time zone '040506';+ time +----------+ 04:05:06+(1 row)++SELECT time without time zone '04:05:06';+ time +----------+ 04:05:06+(1 row)++SELECT time without time zone '0405';+ time +----------+ 04:05:00+(1 row)++SELECT time without time zone '04:05';+ time +----------+ 04:05:00+(1 row)++SELECT time without time zone 'T040506.07';+ time +-------------+ 04:05:06.07+(1 row)++SELECT time without time zone 'T04:05:06.07';+ time +-------------+ 04:05:06.07+(1 row)++SELECT time without time zone 'T040506';+ time +----------+ 04:05:06+(1 row)++SELECT time without time zone 'T04:05:06';+ time +----------+ 04:05:06+(1 row)++SELECT time without time zone 'T0405';+ time +----------+ 04:05:00+(1 row)++SELECT time without time zone 'T04:05';+ time +----------+ 04:05:00+(1 row)++-- 8601 says "Thh" is allowed, but we intentionally reject it as too vague+SELECT time without time zone 'T04';+ERROR: invalid input syntax for type time: "T04"+LINE 1: SELECT time without time zone 'T04';+ ^+SELECT time with time zone '040506.07+08';+ timetz +----------------+ 04:05:06.07+08+(1 row)++SELECT time with time zone '04:05:06.07+08';+ timetz +----------------+ 04:05:06.07+08+(1 row)++SELECT time with time zone '040506+08';+ timetz +-------------+ 04:05:06+08+(1 row)++SELECT time with time zone '04:05:06+08';+ timetz +-------------+ 04:05:06+08+(1 row)++SELECT time with time zone '0405+08';+ timetz +-------------+ 04:05:00+08+(1 row)++SELECT time with time zone '04:05+08';+ timetz +-------------+ 04:05:00+08+(1 row)++SELECT time with time zone 'T040506.07+08';+ timetz +----------------+ 04:05:06.07+08+(1 row)++SELECT time with time zone 'T04:05:06.07+08';+ timetz +----------------+ 04:05:06.07+08+(1 row)++SELECT time with time zone 'T040506+08';+ timetz +-------------+ 04:05:06+08+(1 row)++SELECT time with time zone 'T04:05:06+08';+ timetz +-------------+ 04:05:06+08+(1 row)++SELECT time with time zone 'T0405+08';+ timetz +-------------+ 04:05:00+08+(1 row)++SELECT time with time zone 'T04:05+08';+ timetz +-------------+ 04:05:00+08+(1 row)++-- 8601 says "Thh" is allowed, but we intentionally reject it as too vague+SELECT time with time zone 'T04+08';+ERROR: invalid input syntax for type time with time zone: "T04+08"+LINE 1: SELECT time with time zone 'T04+08';+ ^
SET DateStyle = 'Postgres, MDY';
-- Check Julian dates BC
SELECT date 'J1520447' AS "Confucius' Birthday";
diff --git a/src/test/regress/sql/horology.sql b/src/test/regress/sql/horology.sqlindex 2aa4a49b3f..e5cf12ff63 100644--- a/src/test/regress/sql/horology.sql+++ b/src/test/regress/sql/horology.sql@@ -59,6 +59,35 @@ SELECT time with time zone 'T040506.789 -08';
SELECT time with time zone 'T040506.789 America/Los_Angeles';
SELECT time with time zone '2001-12-27 T040506.789 America/Los_Angeles';
SELECT time with time zone 'J2452271 T040506.789 America/Los_Angeles';
+-- Check time formats required by ISO 8601+SELECT time without time zone '040506.07';+SELECT time without time zone '04:05:06.07';+SELECT time without time zone '040506';+SELECT time without time zone '04:05:06';+SELECT time without time zone '0405';+SELECT time without time zone '04:05';+SELECT time without time zone 'T040506.07';+SELECT time without time zone 'T04:05:06.07';+SELECT time without time zone 'T040506';+SELECT time without time zone 'T04:05:06';+SELECT time without time zone 'T0405';+SELECT time without time zone 'T04:05';+-- 8601 says "Thh" is allowed, but we intentionally reject it as too vague+SELECT time without time zone 'T04';+SELECT time with time zone '040506.07+08';+SELECT time with time zone '04:05:06.07+08';+SELECT time with time zone '040506+08';+SELECT time with time zone '04:05:06+08';+SELECT time with time zone '0405+08';+SELECT time with time zone '04:05+08';+SELECT time with time zone 'T040506.07+08';+SELECT time with time zone 'T04:05:06.07+08';+SELECT time with time zone 'T040506+08';+SELECT time with time zone 'T04:05:06+08';+SELECT time with time zone 'T0405+08';+SELECT time with time zone 'T04:05+08';+-- 8601 says "Thh" is allowed, but we intentionally reject it as too vague+SELECT time with time zone 'T04+08';
SET DateStyle = 'Postgres, MDY';
-- Check Julian dates BC
SELECT date 'J1520447' AS "Confucius' Birthday";
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Reply to all the recipients using the --to and --cc options:
reply via email
To: pgsql-bugs@postgresql.org
Cc: tgl@sss.pgh.pa.us, alvherre@alvh.no-ip.org, david.perez.ingeniero@gmail.com, pgsql-bugs@lists.postgresql.org
Subject: Re: BUG #18470: Time literal accepted in Postgres 15 and below, not accepted in Postgres 16
In-Reply-To: <2599239.1715982768@sss.pgh.pa.us>
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
This inbox is served by DDX for PostgreSQL; see mirroring instructions
for how to clone and mirror all data and code used for this inbox