Commit 47386fed authored by Tom Lane's avatar Tom Lane

Use floor() not rint() when reducing precision of fractional seconds in

timestamp_trunc, timestamptz_trunc, and interval_trunc().  This change
only affects the float-datetime case; the integer-datetime case already
behaved like truncation instead of rounding.  Per gripe from Mario Splivalo.

This is a pre-existing issue but I'm choosing not to backpatch, because
it's such a corner case and there have not been prior complaints.  The
issue is largely moot anyway given the trend towards integer datetimes.
parent 44886bd8
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/utils/adt/timestamp.c,v 1.201 2009/06/11 14:49:04 momjian Exp $ * $PostgreSQL: pgsql/src/backend/utils/adt/timestamp.c,v 1.202 2009/07/06 20:29:23 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -3338,13 +3338,13 @@ timestamp_trunc(PG_FUNCTION_ARGS) ...@@ -3338,13 +3338,13 @@ timestamp_trunc(PG_FUNCTION_ARGS)
#ifdef HAVE_INT64_TIMESTAMP #ifdef HAVE_INT64_TIMESTAMP
fsec = (fsec / 1000) * 1000; fsec = (fsec / 1000) * 1000;
#else #else
fsec = rint(fsec * 1000) / 1000; fsec = floor(fsec * 1000) / 1000;
#endif #endif
break; break;
case DTK_MICROSEC: case DTK_MICROSEC:
#ifndef HAVE_INT64_TIMESTAMP #ifndef HAVE_INT64_TIMESTAMP
fsec = rint(fsec * 1000000) / 1000000; fsec = floor(fsec * 1000000) / 1000000;
#endif #endif
break; break;
...@@ -3494,12 +3494,12 @@ timestamptz_trunc(PG_FUNCTION_ARGS) ...@@ -3494,12 +3494,12 @@ timestamptz_trunc(PG_FUNCTION_ARGS)
#ifdef HAVE_INT64_TIMESTAMP #ifdef HAVE_INT64_TIMESTAMP
fsec = (fsec / 1000) * 1000; fsec = (fsec / 1000) * 1000;
#else #else
fsec = rint(fsec * 1000) / 1000; fsec = floor(fsec * 1000) / 1000;
#endif #endif
break; break;
case DTK_MICROSEC: case DTK_MICROSEC:
#ifndef HAVE_INT64_TIMESTAMP #ifndef HAVE_INT64_TIMESTAMP
fsec = rint(fsec * 1000000) / 1000000; fsec = floor(fsec * 1000000) / 1000000;
#endif #endif
break; break;
...@@ -3591,12 +3591,12 @@ interval_trunc(PG_FUNCTION_ARGS) ...@@ -3591,12 +3591,12 @@ interval_trunc(PG_FUNCTION_ARGS)
#ifdef HAVE_INT64_TIMESTAMP #ifdef HAVE_INT64_TIMESTAMP
fsec = (fsec / 1000) * 1000; fsec = (fsec / 1000) * 1000;
#else #else
fsec = rint(fsec * 1000) / 1000; fsec = floor(fsec * 1000) / 1000;
#endif #endif
break; break;
case DTK_MICROSEC: case DTK_MICROSEC:
#ifndef HAVE_INT64_TIMESTAMP #ifndef HAVE_INT64_TIMESTAMP
fsec = rint(fsec * 1000000) / 1000000; fsec = floor(fsec * 1000000) / 1000000;
#endif #endif
break; break;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment