aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2017-02-09 15:49:57 -0500
committerTom Lane <tgl@sss.pgh.pa.us>2017-02-09 15:49:57 -0500
commitfc96a5fbc69918ad23f5c5afbe8134aa53d397ef (patch)
tree79db57cbd046b1810dc39d1a203647938b108423
parent404756fe89f62735f6075abb594b54be9c262b27 (diff)
downloadpostgresql-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.c14
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 +