diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2017-02-09 15:49:57 -0500 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2017-02-09 15:49:57 -0500 |
commit | fc96a5fbc69918ad23f5c5afbe8134aa53d397ef (patch) | |
tree | 79db57cbd046b1810dc39d1a203647938b108423 | |
parent | 404756fe89f62735f6075abb594b54be9c262b27 (diff) | |
download | postgresql-fc96a5fbc69918ad23f5c5afbe8134aa53d397ef.tar.gz postgresql-fc96a5fbc69918ad23f5c5afbe8134aa53d397ef.zip |
Blind try to fix portability issue in commit 8f93bd851 et al.
The S/390 members of the buildfarm are showing failures indicating
that they're having trouble with the rint() calls I added yesterday.
There's no good reason for that, and I wonder if it is a compiler bug
similar to the one we worked around in d9476b838. Try to fix it using
the same method as before, namely to store the result of rint() back
into a "double" variable rather than immediately converting to int64.
(This isn't entirely waving a dead chicken, since on machines with
wider-than-double float registers, the extra store forces a width
conversion. I don't know if S/390 is like that, but it seems worth
trying.)
In passing, merge duplicate ereport() calls in float8_timestamptz().
Per buildfarm.
-rw-r--r-- | src/backend/utils/adt/timestamp.c | 14 |
1 files changed, 6 insertions, 8 deletions
diff --git a/src/backend/utils/adt/timestamp.c b/src/backend/utils/adt/timestamp.c index d8832af9f3e..5818f072321 100644 --- a/src/backend/utils/adt/timestamp.c +++ b/src/backend/utils/adt/timestamp.c @@ -764,12 +764,8 @@ float8_timestamptz(PG_FUNCTION_ARGS) { /* Out of range? */ if (seconds < - (float8) SECS_PER_DAY * (DATETIME_MIN_JULIAN - UNIX_EPOCH_JDATE)) - ereport(ERROR, - (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE), - errmsg("timestamp out of range: \"%g\"", seconds))); - - if (seconds >= + (float8) SECS_PER_DAY * (DATETIME_MIN_JULIAN - UNIX_EPOCH_JDATE) + || seconds >= (float8) SECS_PER_DAY * (TIMESTAMP_END_JULIAN - UNIX_EPOCH_JDATE)) ereport(ERROR, (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE), @@ -779,7 +775,8 @@ float8_timestamptz(PG_FUNCTION_ARGS) seconds -= ((POSTGRES_EPOCH_JDATE - UNIX_EPOCH_JDATE) * SECS_PER_DAY); #ifdef HAVE_INT64_TIMESTAMP - result = rint(seconds * USECS_PER_SEC); + seconds = rint(seconds * USECS_PER_SEC); + result = (int64) seconds; #else result = seconds; #endif @@ -1615,9 +1612,10 @@ make_interval(PG_FUNCTION_ARGS) result->day = weeks * 7 + days; #ifdef HAVE_INT64_TIMESTAMP + secs = rint(secs * USECS_PER_SEC); result->time = hours * ((int64) SECS_PER_HOUR * USECS_PER_SEC) + mins * ((int64) SECS_PER_MINUTE * USECS_PER_SEC) + - (int64) rint(secs * USECS_PER_SEC); + (int64) secs; #else result->time = hours * (double) SECS_PER_HOUR + mins * (double) SECS_PER_MINUTE + |