mirror of
https://github.com/postgres/postgres.git
synced 2025-11-03 09:13:20 +03:00
Improve handling of date_trunc() units for infinite input values
Previously, if an infinite value was passed to date_trunc(), then the same infinite value would always be returned regardless of the field unit given by the caller. This commit updates the function so that an error is returned when an invalid unit is passed to date_trunc() with an infinite value. This matches the behavior of date_trunc() with a finite value and date_part() with an infinite value, making the handling of interval, timestamp and timestamptz more consistent across the board for these two functions. Some tests are added to cover all these new failure cases, with an unsupported unit and infinite values for the three data types. There were no test cases in core that checked all these patterns up to now. Author: Joseph Koshakow Discussion: https://postgr.es/m/CAAvxfHc4084dGzEJR0_pBZkDuqbPGc5wn7gK_M0XR_kRiCdUJQ@mail.gmail.com
This commit is contained in:
@@ -776,6 +776,14 @@ SELECT i AS interval, date_trunc('hour', i)
|
||||
FROM INFINITE_INTERVAL_TBL
|
||||
WHERE NOT isfinite(i);
|
||||
|
||||
SELECT i AS interval, date_trunc('week', i)
|
||||
FROM INFINITE_INTERVAL_TBL
|
||||
WHERE NOT isfinite(i);
|
||||
|
||||
SELECT i AS interval, date_trunc('ago', i)
|
||||
FROM INFINITE_INTERVAL_TBL
|
||||
WHERE NOT isfinite(i);
|
||||
|
||||
SELECT i AS interval, justify_days(i), justify_hours(i), justify_interval(i)
|
||||
FROM INFINITE_INTERVAL_TBL
|
||||
WHERE NOT isfinite(i);
|
||||
|
||||
@@ -176,6 +176,8 @@ SELECT d1 - timestamp without time zone '1997-01-02' AS diff
|
||||
|
||||
SELECT date_trunc( 'week', timestamp '2004-02-29 15:44:17.71393' ) AS week_trunc;
|
||||
|
||||
SELECT date_trunc( 'ago', timestamp 'infinity' ) AS invalid_trunc;
|
||||
|
||||
-- verify date_bin behaves the same as date_trunc for relevant intervals
|
||||
|
||||
-- case 1: AD dates, origin < input
|
||||
|
||||
@@ -200,10 +200,14 @@ SELECT d1 - timestamp with time zone '1997-01-02' AS diff
|
||||
FROM TIMESTAMPTZ_TBL WHERE d1 BETWEEN '1902-01-01' AND '2038-01-01';
|
||||
|
||||
SELECT date_trunc( 'week', timestamp with time zone '2004-02-29 15:44:17.71393' ) AS week_trunc;
|
||||
SELECT date_trunc( 'ago', timestamp with time zone 'infinity' ) AS invalid_trunc;
|
||||
|
||||
SELECT date_trunc('day', timestamp with time zone '2001-02-16 20:38:40+00', 'Australia/Sydney') as sydney_trunc; -- zone name
|
||||
SELECT date_trunc('day', timestamp with time zone '2001-02-16 20:38:40+00', 'GMT') as gmt_trunc; -- fixed-offset abbreviation
|
||||
SELECT date_trunc('day', timestamp with time zone '2001-02-16 20:38:40+00', 'VET') as vet_trunc; -- variable-offset abbreviation
|
||||
SELECT date_trunc('ago', timestamp with time zone 'infinity', 'GMT') AS invalid_zone_trunc;
|
||||
|
||||
|
||||
|
||||
-- verify date_bin behaves the same as date_trunc for relevant intervals
|
||||
SELECT
|
||||
|
||||
Reference in New Issue
Block a user