From 6e2ac8d66d58ccdda4dcccc52f8b6b7911db0ad2 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Thu, 12 Dec 2019 12:30:44 -0500 Subject: Fix EXTRACT(ISOYEAR FROM timestamp) for years BC. The test cases added by commit 26ae3aa80 exposed an old oversight in timestamp[tz]_part: they didn't correct the result of date2isoyear() for BC years, so that we produced an off-by-one answer for such years. Fix that, and back-patch to all supported branches. Discussion: https://postgr.es/m/SG2PR06MB37762CAE45DB0F6CA7001EA9B6550@SG2PR06MB3776.apcprd06.prod.outlook.com --- src/backend/utils/adt/timestamp.c | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'src/backend/utils/adt/timestamp.c') diff --git a/src/backend/utils/adt/timestamp.c b/src/backend/utils/adt/timestamp.c index 27211efc052..e83065ec757 100644 --- a/src/backend/utils/adt/timestamp.c +++ b/src/backend/utils/adt/timestamp.c @@ -4492,6 +4492,7 @@ date2isoweek(int year, int mon, int mday) /* date2isoyear() * * Returns ISO 8601 year number. + * Note: zero or negative results follow the year-zero-exists convention. */ int date2isoyear(int year, int mon, int mday) @@ -4783,6 +4784,9 @@ timestamp_part(PG_FUNCTION_ARGS) case DTK_ISOYEAR: result = date2isoyear(tm->tm_year, tm->tm_mon, tm->tm_mday); + /* Adjust BC years */ + if (result <= 0) + result -= 1; break; case DTK_DOW: @@ -5000,6 +5004,9 @@ timestamptz_part(PG_FUNCTION_ARGS) case DTK_ISOYEAR: result = date2isoyear(tm->tm_year, tm->tm_mon, tm->tm_mday); + /* Adjust BC years */ + if (result <= 0) + result -= 1; break; case DTK_DOW: -- cgit v1.2.3