Accept "+infinity" in date and timestamp[tz] input.
authorTom Lane <tgl@sss.pgh.pa.us>
Sun, 1 Jan 2023 19:16:07 +0000 (14:16 -0500)
committerTom Lane <tgl@sss.pgh.pa.us>
Sun, 1 Jan 2023 19:16:07 +0000 (14:16 -0500)
The float and numeric types accept this variant spelling of
"infinity", so it seems like the datetime types should too.

Vik Fearing, some cosmetic mods by me

Discussion: https://postgr.es/m/d0bef637-2dbd-0a5d-e539-48243b6f6c5e@postgresfriends.org

src/backend/utils/adt/datetime.c
src/test/regress/expected/date.out
src/test/regress/expected/timestamp.out
src/test/regress/expected/timestamptz.out
src/test/regress/sql/date.sql
src/test/regress/sql/timestamp.sql
src/test/regress/sql/timestamptz.sql

index 8afda0e5d22498cdde6af7eb378824d99581c010..e0f538239f2988402eae8d5a3b3601bc0ad71f10 100644 (file)
@@ -105,6 +105,7 @@ const char *const days[] = {"Sunday", "Monday", "Tuesday", "Wednesday",
  */
 static const datetkn datetktbl[] = {
    /* token, type, value */
+   {"+infinity", RESERV, DTK_LATE},    /* same as "infinity" */
    {EARLY, RESERV, DTK_EARLY}, /* "-infinity" reserved for "early time" */
    {DA_D, ADBC, AD},           /* "ad" for years > 0 */
    {"allballs", RESERV, DTK_ZULU}, /* 00:00:00 */
index f8f83e40e9574234e90277bdd04ade102124ec94..c0dec448e1c577a4abcb4d993ea1bd6fc9feb239 100644 (file)
@@ -1373,6 +1373,12 @@ select isfinite('infinity'::date), isfinite('-infinity'::date), isfinite('today'
  f        | f        | t
 (1 row)
 
+select 'infinity'::date = '+infinity'::date as t;
+ t 
+---
+ t
+(1 row)
+
 --
 -- oscillating fields from non-finite date:
 --
index be66274738e4c352ed9e8b7bccf9af399f8e9a70..edc6912e7abefe3229b3e7644b9caf983f58216f 100644 (file)
@@ -76,6 +76,12 @@ TRUNCATE TIMESTAMP_TBL;
 INSERT INTO TIMESTAMP_TBL VALUES ('-infinity');
 INSERT INTO TIMESTAMP_TBL VALUES ('infinity');
 INSERT INTO TIMESTAMP_TBL VALUES ('epoch');
+SELECT timestamp 'infinity' = timestamp '+infinity' AS t;
+ t 
+---
+ t
+(1 row)
+
 -- Postgres v6.0 standard output format
 INSERT INTO TIMESTAMP_TBL VALUES ('Mon Feb 10 17:32:01 1997 PST');
 -- Variations on Postgres v6.1 standard output format
index fb06acbccc48778f7ae39480f1d5ebb3e1d00a14..00379fd0fd315eb9cf3c4a5b3608b49a0608740d 100644 (file)
@@ -87,6 +87,12 @@ TRUNCATE TIMESTAMPTZ_TBL;
 INSERT INTO TIMESTAMPTZ_TBL VALUES ('-infinity');
 INSERT INTO TIMESTAMPTZ_TBL VALUES ('infinity');
 INSERT INTO TIMESTAMPTZ_TBL VALUES ('epoch');
+SELECT timestamptz 'infinity' = timestamptz '+infinity' AS t;
+ t 
+---
+ t
+(1 row)
+
 -- Postgres v6.0 standard output format
 INSERT INTO TIMESTAMPTZ_TBL VALUES ('Mon Feb 10 17:32:01 1997 PST');
 -- Variations on Postgres v6.1 standard output format
index 9fd15be5f9851f73f2b47f274ca2cb19c53ce991..89982dd2f86aa6179f96a414071311fd1e1a6952 100644 (file)
@@ -329,6 +329,8 @@ select 'infinity'::date, '-infinity'::date;
 select 'infinity'::date > 'today'::date as t;
 select '-infinity'::date < 'today'::date as t;
 select isfinite('infinity'::date), isfinite('-infinity'::date), isfinite('today'::date);
+select 'infinity'::date = '+infinity'::date as t;
+
 --
 -- oscillating fields from non-finite date:
 --
index e1175b12ce2edd10ac54e64c26db0801fe102cbe..1d580f77f15fe3ca794fe66487967b61dc14f2cf 100644 (file)
@@ -49,6 +49,8 @@ INSERT INTO TIMESTAMP_TBL VALUES ('-infinity');
 INSERT INTO TIMESTAMP_TBL VALUES ('infinity');
 INSERT INTO TIMESTAMP_TBL VALUES ('epoch');
 
+SELECT timestamp 'infinity' = timestamp '+infinity' AS t;
+
 -- Postgres v6.0 standard output format
 INSERT INTO TIMESTAMP_TBL VALUES ('Mon Feb 10 17:32:01 1997 PST');
 
index 27263b3e0bb60f5824cc70b741532e496743845c..4905dd083177fd7695c2f50c888ea12781176431 100644 (file)
@@ -50,6 +50,8 @@ INSERT INTO TIMESTAMPTZ_TBL VALUES ('-infinity');
 INSERT INTO TIMESTAMPTZ_TBL VALUES ('infinity');
 INSERT INTO TIMESTAMPTZ_TBL VALUES ('epoch');
 
+SELECT timestamptz 'infinity' = timestamptz '+infinity' AS t;
+
 -- Postgres v6.0 standard output format
 INSERT INTO TIMESTAMPTZ_TBL VALUES ('Mon Feb 10 17:32:01 1997 PST');