From 414894c18282a61e64ca21da113ae5dd9eee0a8f Mon Sep 17 00:00:00 2001 From: Matthew Kim <38759997+friendlymatthew@users.noreply.github.com> Date: Wed, 24 Jul 2024 17:21:31 -0400 Subject: [PATCH 4/4] Handle negative years overflow in make_date Negative years are converted to their absolute values in make_date. Converting the min-most 32-bit signed integer will trigger an overflow. This commit handles such overflow. --- src/backend/utils/adt/date.c | 2 +- src/test/regress/expected/date.out | 2 ++ src/test/regress/sql/date.sql | 1 + 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/backend/utils/adt/date.c b/src/backend/utils/adt/date.c index 9c854e0e5c..25a0cbb125 100644 --- a/src/backend/utils/adt/date.c +++ b/src/backend/utils/adt/date.c @@ -257,7 +257,7 @@ make_date(PG_FUNCTION_ARGS) if (tm.tm_year < 0) { bc = true; - tm.tm_year = -tm.tm_year; + pg_mul_s32_overflow(tm.tm_year, -1, &tm.tm_year); } dterr = ValidateDate(DTK_DATE_M, false, false, bc, &tm); diff --git a/src/test/regress/expected/date.out b/src/test/regress/expected/date.out index f5949f3d17..c8f76c205d 100644 --- a/src/test/regress/expected/date.out +++ b/src/test/regress/expected/date.out @@ -1532,3 +1532,5 @@ 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 +SELECT make_date(-2147483648, 1, 1); +ERROR: date field value out of range: -2147483648-01-01 diff --git a/src/test/regress/sql/date.sql b/src/test/regress/sql/date.sql index 1c58ff6966..9a4e5832b9 100644 --- a/src/test/regress/sql/date.sql +++ b/src/test/regress/sql/date.sql @@ -373,3 +373,4 @@ 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); +SELECT make_date(-2147483648, 1, 1); -- 2.39.3 (Apple Git-146)