diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2019-12-12 12:30:44 -0500 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2019-12-12 12:30:44 -0500 |
commit | 332584da9cfdbe91a651427a9fc3ed76dffaa529 (patch) | |
tree | 0ccc19ca00b7813c04be0b61bb29a49d8af9d0ab /src/backend/utils/adt | |
parent | 7d233810a3a3b20460639253f5e38d4186cd350d (diff) | |
download | postgresql-332584da9cfdbe91a651427a9fc3ed76dffaa529.tar.gz postgresql-332584da9cfdbe91a651427a9fc3ed76dffaa529.zip |
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
Diffstat (limited to 'src/backend/utils/adt')
-rw-r--r-- | src/backend/utils/adt/timestamp.c | 7 |
1 files changed, 7 insertions, 0 deletions
diff --git a/src/backend/utils/adt/timestamp.c b/src/backend/utils/adt/timestamp.c index eb954847267..4b8d52ef7ba 100644 --- a/src/backend/utils/adt/timestamp.c +++ b/src/backend/utils/adt/timestamp.c @@ -4265,6 +4265,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) @@ -4539,6 +4540,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: @@ -4735,6 +4739,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: |