diff options
author | Tom Lane | 2019-12-12 17:30:43 +0000 |
---|---|---|
committer | Tom Lane | 2019-12-12 17:30:43 +0000 |
commit | 1a3efa1eb67ab752231a6fff2743a77ae55808d5 (patch) | |
tree | d5fc67c0ee0cf0fdb80148f4a8ab36e68362e290 /src | |
parent | 26ae3aa80e337261203ba4442452bed261ff9888 (diff) |
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')
-rw-r--r-- | src/backend/utils/adt/timestamp.c | 7 | ||||
-rw-r--r-- | src/test/regress/expected/timestamp.out | 2 | ||||
-rw-r--r-- | src/test/regress/expected/timestamptz.out | 2 |
3 files changed, 9 insertions, 2 deletions
diff --git a/src/backend/utils/adt/timestamp.c b/src/backend/utils/adt/timestamp.c index edeaee4cb1..945b8f85dd 100644 --- a/src/backend/utils/adt/timestamp.c +++ b/src/backend/utils/adt/timestamp.c @@ -4373,6 +4373,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) @@ -4647,6 +4648,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: @@ -4843,6 +4847,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: diff --git a/src/test/regress/expected/timestamp.out b/src/test/regress/expected/timestamp.out index 29af49ad89..39a4d49280 100644 --- a/src/test/regress/expected/timestamp.out +++ b/src/test/regress/expected/timestamp.out @@ -809,7 +809,7 @@ SELECT d1 as "timestamp", Fri Feb 14 17:32:01 1997 | 1997 | 7 | 5 | 5 | 45 Sat Feb 15 17:32:01 1997 | 1997 | 7 | 6 | 6 | 46 Sun Feb 16 17:32:01 1997 | 1997 | 7 | 7 | 0 | 47 - Tue Feb 16 17:32:01 0097 BC | -96 | 7 | 2 | 2 | 47 + Tue Feb 16 17:32:01 0097 BC | -97 | 7 | 2 | 2 | 47 Sat Feb 16 17:32:01 0097 | 97 | 7 | 6 | 6 | 47 Thu Feb 16 17:32:01 0597 | 597 | 7 | 4 | 4 | 47 Tue Feb 16 17:32:01 1097 | 1097 | 7 | 2 | 2 | 47 diff --git a/src/test/regress/expected/timestamptz.out b/src/test/regress/expected/timestamptz.out index 72b2cdd6b7..bb89910a45 100644 --- a/src/test/regress/expected/timestamptz.out +++ b/src/test/regress/expected/timestamptz.out @@ -918,7 +918,7 @@ SELECT d1 as timestamptz, Fri Feb 14 17:32:01 1997 PST | 1997 | 7 | 5 | 5 | 45 Sat Feb 15 17:32:01 1997 PST | 1997 | 7 | 6 | 6 | 46 Sun Feb 16 17:32:01 1997 PST | 1997 | 7 | 7 | 0 | 47 - Tue Feb 16 17:32:01 0097 PST BC | -96 | 7 | 2 | 2 | 47 + Tue Feb 16 17:32:01 0097 PST BC | -97 | 7 | 2 | 2 | 47 Sat Feb 16 17:32:01 0097 PST | 97 | 7 | 6 | 6 | 47 Thu Feb 16 17:32:01 0597 PST | 597 | 7 | 4 | 4 | 47 Tue Feb 16 17:32:01 1097 PST | 1097 | 7 | 2 | 2 | 47 |