mirror of
https://github.com/postgres/postgres.git
synced 2025-12-12 02:37:31 +03:00
The following patches eliminate the overflows in the j2date() and date2j()
functions which limited the maximum date for a timestamp to AD 1465001.
The new limit is AD 5874897.
The files affected are:
doc/src/sgml/datatype.sgml:
Documentation change due to patch. Included is a notice about
the reduced range when using an eight-byte integer for timestamps.
src/backend/utils/adt/datetime.c:
Replacement functions for j2date() and date2j() functions.
src/include/utils/datetime.h:
Corrected a bug with the limit on the earliest possible date,
Nov 23,-4713 has a Julian day count of -1. The earliest possible
date should be Nov 24, -4713 with a day count of 0.
src/test/regress/expected/horology-no-DST-before-1970.out:
src/test/regress/expected/horology-solaris-1947.out:
src/test/regress/expected/horology.out:
Copies of expected output for regression testing.
Note: Only horology.out has been physically tested. I do not have access
to a Solaris box and I don't know how to provoke the "pre-1970" test.
src/test/regress/sql/horology.sql:
Added some test cases to check extended range.
John Cochran
This commit is contained in:
@@ -328,6 +328,30 @@ SELECT timestamp without time zone '1999-12-01' + interval '1 month - 1 second'
|
||||
Fri Dec 31 23:59:59 1999
|
||||
(1 row)
|
||||
|
||||
SELECT timestamp without time zone 'Nov 24, 4714 BC' + interval '1000000000 days' AS "Nov 27, 2733194";
|
||||
Nov 27, 2733194
|
||||
-----------------------------
|
||||
Sun Nov 27 00:00:00 2733194
|
||||
(1 row)
|
||||
|
||||
SELECT timestamp without time zone 'Nov 24, 4714 BC' + interval '2000000000 days' AS "Nov 30, 5471101";
|
||||
Nov 30, 5471101
|
||||
-----------------------------
|
||||
Sat Nov 30 00:00:00 5471101
|
||||
(1 row)
|
||||
|
||||
SELECT timestamp without time zone 'Nov 25, 4714 BC' + interval '2147483492 days' AS "Dec 31, 5874897";
|
||||
Dec 31, 5874897
|
||||
-----------------------------
|
||||
Tue Dec 31 00:00:00 5874897
|
||||
(1 row)
|
||||
|
||||
SELECT timestamp without time zone '12/31/5874897' - timestamp without time zone 'Nov 24, 4714 BC' AS "2147483493 Days";
|
||||
2147483493 Days
|
||||
-------------------
|
||||
@ 2147483493 days
|
||||
(1 row)
|
||||
|
||||
-- Shorthand values
|
||||
-- Not directly usable for regression testing since these are not constants.
|
||||
-- So, just try to test parser and hope for the best - thomas 97/04/26
|
||||
|
||||
@@ -328,6 +328,30 @@ SELECT timestamp without time zone '1999-12-01' + interval '1 month - 1 second'
|
||||
Fri Dec 31 23:59:59 1999
|
||||
(1 row)
|
||||
|
||||
SELECT timestamp without time zone 'Nov 24, 4714 BC' + interval '1000000000 days' AS "Nov 27, 2733194";
|
||||
Nov 27, 2733194
|
||||
-----------------------------
|
||||
Sun Nov 27 00:00:00 2733194
|
||||
(1 row)
|
||||
|
||||
SELECT timestamp without time zone 'Nov 24, 4714 BC' + interval '2000000000 days' AS "Nov 30, 5471101";
|
||||
Nov 30, 5471101
|
||||
-----------------------------
|
||||
Sat Nov 30 00:00:00 5471101
|
||||
(1 row)
|
||||
|
||||
SELECT timestamp without time zone 'Nov 25, 4714 BC' + interval '2147483492 days' AS "Dec 31, 5874897";
|
||||
Dec 31, 5874897
|
||||
-----------------------------
|
||||
Tue Dec 31 00:00:00 5874897
|
||||
(1 row)
|
||||
|
||||
SELECT timestamp without time zone '12/31/5874897' - timestamp without time zone 'Nov 24, 4714 BC' AS "2147483493 Days";
|
||||
2147483493 Days
|
||||
-------------------
|
||||
@ 2147483493 days
|
||||
(1 row)
|
||||
|
||||
-- Shorthand values
|
||||
-- Not directly usable for regression testing since these are not constants.
|
||||
-- So, just try to test parser and hope for the best - thomas 97/04/26
|
||||
|
||||
@@ -328,6 +328,30 @@ SELECT timestamp without time zone '1999-12-01' + interval '1 month - 1 second'
|
||||
Fri Dec 31 23:59:59 1999
|
||||
(1 row)
|
||||
|
||||
SELECT timestamp without time zone 'Nov 24, 4714 BC' + interval '1000000000 days' AS "Nov 27, 2733194";
|
||||
Nov 27, 2733194
|
||||
-----------------------------
|
||||
Sun Nov 27 00:00:00 2733194
|
||||
(1 row)
|
||||
|
||||
SELECT timestamp without time zone 'Nov 24, 4714 BC' + interval '2000000000 days' AS "Nov 30, 5471101";
|
||||
Nov 30, 5471101
|
||||
-----------------------------
|
||||
Sat Nov 30 00:00:00 5471101
|
||||
(1 row)
|
||||
|
||||
SELECT timestamp without time zone 'Nov 25, 4714 BC' + interval '2147483492 days' AS "Dec 31, 5874897";
|
||||
Dec 31, 5874897
|
||||
-----------------------------
|
||||
Tue Dec 31 00:00:00 5874897
|
||||
(1 row)
|
||||
|
||||
SELECT timestamp without time zone '12/31/5874897' - timestamp without time zone 'Nov 24, 4714 BC' AS "2147483493 Days";
|
||||
2147483493 Days
|
||||
-------------------
|
||||
@ 2147483493 days
|
||||
(1 row)
|
||||
|
||||
-- Shorthand values
|
||||
-- Not directly usable for regression testing since these are not constants.
|
||||
-- So, just try to test parser and hope for the best - thomas 97/04/26
|
||||
|
||||
@@ -76,6 +76,10 @@ SELECT timestamp without time zone '1996-03-01' - interval '1 second' AS "Feb 29
|
||||
SELECT timestamp without time zone '1999-03-01' - interval '1 second' AS "Feb 28";
|
||||
SELECT timestamp without time zone '2000-03-01' - interval '1 second' AS "Feb 29";
|
||||
SELECT timestamp without time zone '1999-12-01' + interval '1 month - 1 second' AS "Dec 31";
|
||||
SELECT timestamp without time zone 'Nov 24, 4714 BC' + interval '1000000000 days' AS "Nov 27, 2733194";
|
||||
SELECT timestamp without time zone 'Nov 24, 4714 BC' + interval '2000000000 days' AS "Nov 30, 5471101";
|
||||
SELECT timestamp without time zone 'Nov 25, 4714 BC' + interval '2147483492 days' AS "Dec 31, 5874897";
|
||||
SELECT timestamp without time zone '12/31/5874897' - timestamp without time zone 'Nov 24, 4714 BC' AS "2147483493 Days";
|
||||
|
||||
-- Shorthand values
|
||||
-- Not directly usable for regression testing since these are not constants.
|
||||
|
||||
Reference in New Issue
Block a user