diff --git a/src/backend/utils/adt/timestamp.c b/src/backend/utils/adt/timestamp.c index 8fbb310..590ce3a 100644 --- a/src/backend/utils/adt/timestamp.c +++ b/src/backend/utils/adt/timestamp.c @@ -4327,9 +4327,14 @@ timestamp_part(PG_FUNCTION_ARGS) struct pg_tm tt, *tm = &tt; - if (TIMESTAMP_NOT_FINITE(timestamp)) + if (TIMESTAMP_IS_NOBEGIN(timestamp)) { - result = 0; + result = -get_float8_infinity(); + PG_RETURN_FLOAT8(result); + } + else if (TIMESTAMP_IS_NOEND(timestamp)) + { + result = get_float8_infinity(); PG_RETURN_FLOAT8(result); } @@ -4538,9 +4543,14 @@ timestamptz_part(PG_FUNCTION_ARGS) struct pg_tm tt, *tm = &tt; - if (TIMESTAMP_NOT_FINITE(timestamp)) + if (TIMESTAMP_IS_NOBEGIN(timestamp)) { - result = 0; + result = -get_float8_infinity(); + PG_RETURN_FLOAT8(result); + } + else if (TIMESTAMP_IS_NOEND(timestamp)) + { + result = get_float8_infinity(); PG_RETURN_FLOAT8(result); } diff --git a/src/test/regress/expected/date.out b/src/test/regress/expected/date.out index 8923f60..88ac4b5 100644 --- a/src/test/regress/expected/date.out +++ b/src/test/regress/expected/date.out @@ -900,6 +900,27 @@ SELECT date 'tomorrow' - date 'yesterday' AS "Two days"; -- -- test extract! -- +-- epoch +-- +SELECT EXTRACT(EPOCH FROM DATE '1970-01-01'); -- 0 + date_part +----------- + 0 +(1 row) + +SELECT EXTRACT(EPOCH FROM DATE 'infinity'); -- Infinity + date_part +----------- + Infinity +(1 row) + +SELECT EXTRACT(EPOCH FROM DATE '-infinity'); -- -Infinity + date_part +----------- + -Infinity +(1 row) + +-- -- century -- SELECT EXTRACT(CENTURY FROM DATE '0101-12-31 BC'); -- -2 @@ -962,6 +983,18 @@ SELECT EXTRACT(CENTURY FROM CURRENT_DATE)>=21 AS True; -- true t (1 row) +SELECT EXTRACT(CENTURY FROM DATE 'infinity'); -- Infinity + date_part +----------- + Infinity +(1 row) + +SELECT EXTRACT(CENTURY FROM DATE '-infinity'); -- -Infinity + date_part +----------- + -Infinity +(1 row) + -- -- millennium -- @@ -1008,6 +1041,18 @@ SELECT EXTRACT(MILLENNIUM FROM CURRENT_DATE); -- 3 3 (1 row) +SELECT EXTRACT(MILLENNIUM FROM DATE 'infinity'); -- Infinity + date_part +----------- + Infinity +(1 row) + +SELECT EXTRACT(MILLENNIUM FROM DATE '-infinity'); -- -Infinity + date_part +----------- + -Infinity +(1 row) + -- -- decade -- @@ -1053,6 +1098,18 @@ SELECT EXTRACT(DECADE FROM DATE '0012-12-31 BC'); -- -2 -2 (1 row) +SELECT EXTRACT(DECADE FROM DATE 'infinity'); -- Infinity + date_part +----------- + Infinity +(1 row) + +SELECT EXTRACT(DECADE FROM DATE '-infinity'); -- -Infinity + date_part +----------- + -Infinity +(1 row) + -- -- some other types: -- @@ -1069,6 +1126,37 @@ SELECT EXTRACT(CENTURY FROM TIMESTAMP '1970-03-20 04:30:00.00000'); -- 20 20 (1 row) +SELECT EXTRACT(CENTURY FROM TIMESTAMP 'infinity'); -- Infinity + date_part +----------- + Infinity +(1 row) + +SELECT EXTRACT(CENTURY FROM TIMESTAMP '-infinity'); -- -Infinity + date_part +----------- + -Infinity +(1 row) + +-- on a timestamptz. +SELECT EXTRACT(EPOCH FROM TIMESTAMPTZ '1970-01-01+00'); -- 0 + date_part +----------- + 0 +(1 row) + +SELECT EXTRACT(EPOCH FROM TIMESTAMPTZ 'infinity'); -- Infinity + date_part +----------- + Infinity +(1 row) + +SELECT EXTRACT(EPOCH FROM TIMESTAMPTZ '-infinity'); -- -Infinity + date_part +----------- + -Infinity +(1 row) + -- on an interval SELECT EXTRACT(CENTURY FROM INTERVAL '100 y'); -- 1 date_part diff --git a/src/test/regress/sql/date.sql b/src/test/regress/sql/date.sql index a62e92a..d465f8d 100644 --- a/src/test/regress/sql/date.sql +++ b/src/test/regress/sql/date.sql @@ -212,6 +212,12 @@ SELECT date 'tomorrow' - date 'yesterday' AS "Two days"; -- -- test extract! -- +-- epoch +-- +SELECT EXTRACT(EPOCH FROM DATE '1970-01-01'); -- 0 +SELECT EXTRACT(EPOCH FROM DATE 'infinity'); -- Infinity +SELECT EXTRACT(EPOCH FROM DATE '-infinity'); -- -Infinity +-- -- century -- SELECT EXTRACT(CENTURY FROM DATE '0101-12-31 BC'); -- -2 @@ -224,6 +230,8 @@ SELECT EXTRACT(CENTURY FROM DATE '1901-01-01'); -- 20 SELECT EXTRACT(CENTURY FROM DATE '2000-12-31'); -- 20 SELECT EXTRACT(CENTURY FROM DATE '2001-01-01'); -- 21 SELECT EXTRACT(CENTURY FROM CURRENT_DATE)>=21 AS True; -- true +SELECT EXTRACT(CENTURY FROM DATE 'infinity'); -- Infinity +SELECT EXTRACT(CENTURY FROM DATE '-infinity'); -- -Infinity -- -- millennium -- @@ -235,6 +243,8 @@ SELECT EXTRACT(MILLENNIUM FROM DATE '2000-12-31'); -- 2 SELECT EXTRACT(MILLENNIUM FROM DATE '2001-01-01'); -- 3 -- next test to be fixed on the turn of the next millennium;-) SELECT EXTRACT(MILLENNIUM FROM CURRENT_DATE); -- 3 +SELECT EXTRACT(MILLENNIUM FROM DATE 'infinity'); -- Infinity +SELECT EXTRACT(MILLENNIUM FROM DATE '-infinity'); -- -Infinity -- -- decade -- @@ -245,12 +255,20 @@ SELECT EXTRACT(DECADE FROM DATE '0001-01-01 BC'); -- 0 SELECT EXTRACT(DECADE FROM DATE '0002-12-31 BC'); -- -1 SELECT EXTRACT(DECADE FROM DATE '0011-01-01 BC'); -- -1 SELECT EXTRACT(DECADE FROM DATE '0012-12-31 BC'); -- -2 +SELECT EXTRACT(DECADE FROM DATE 'infinity'); -- Infinity +SELECT EXTRACT(DECADE FROM DATE '-infinity'); -- -Infinity -- -- some other types: -- -- on a timestamp. SELECT EXTRACT(CENTURY FROM NOW())>=21 AS True; -- true SELECT EXTRACT(CENTURY FROM TIMESTAMP '1970-03-20 04:30:00.00000'); -- 20 +SELECT EXTRACT(CENTURY FROM TIMESTAMP 'infinity'); -- Infinity +SELECT EXTRACT(CENTURY FROM TIMESTAMP '-infinity'); -- -Infinity +-- on a timestamptz. +SELECT EXTRACT(EPOCH FROM TIMESTAMPTZ '1970-01-01+00'); -- 0 +SELECT EXTRACT(EPOCH FROM TIMESTAMPTZ 'infinity'); -- Infinity +SELECT EXTRACT(EPOCH FROM TIMESTAMPTZ '-infinity'); -- -Infinity -- on an interval SELECT EXTRACT(CENTURY FROM INTERVAL '100 y'); -- 1 SELECT EXTRACT(CENTURY FROM INTERVAL '99 y'); -- 0