From a8ac7d8713b2b60883ff86c8cc44b706fc361bae Mon Sep 17 00:00:00 2001
From: Tom Lane <tgl@sss.pgh.pa.us>
Date: Wed, 20 Apr 2005 17:14:50 +0000
Subject: [PATCH] Fix mis-display of negative fractional seconds in interval
 values for --enable-integer-datetimes case.  Per report from Oliver Siegmar.

---
 src/backend/utils/adt/datetime.c | 23 +++++++++++++++--------
 1 file changed, 15 insertions(+), 8 deletions(-)

diff --git a/src/backend/utils/adt/datetime.c b/src/backend/utils/adt/datetime.c
index 0ac92c304b0..ee24725bc86 100644
--- a/src/backend/utils/adt/datetime.c
+++ b/src/backend/utils/adt/datetime.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/utils/adt/datetime.c,v 1.138 2005/04/19 03:13:59 momjian Exp $
+ *	  $PostgreSQL: pgsql/src/backend/utils/adt/datetime.c,v 1.139 2005/04/20 17:14:50 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -3884,17 +3884,25 @@ EncodeInterval(struct pg_tm * tm, fsec_t fsec, int style, char *str)
 			/* fractional seconds? */
 			if (fsec != 0)
 			{
+				fsec_t		sec;
+
 #ifdef HAVE_INT64_TIMESTAMP
+				sec = fsec;
 				if (is_before || ((!is_nonzero) && (tm->tm_sec < 0)))
+				{
 					tm->tm_sec = -tm->tm_sec;
+					sec = -sec;
+					is_before = TRUE;
+				}
+				else if ((!is_nonzero) && (tm->tm_sec == 0) && (fsec < 0))
+				{
+					sec = -sec;
+					is_before = TRUE;
+				}
 				sprintf(cp, "%s%d.%02d secs", (is_nonzero ? " " : ""),
-						tm->tm_sec, (((int) fsec) / 10000));
+						tm->tm_sec, (((int) sec) / 10000));
 				cp += strlen(cp);
-				if (!is_nonzero)
-					is_before = (fsec < 0);
 #else
-				fsec_t		sec;
-
 				fsec += tm->tm_sec;
 				sec = fsec;
 				if (is_before || ((!is_nonzero) && (fsec < 0)))
@@ -3906,9 +3914,8 @@ EncodeInterval(struct pg_tm * tm, fsec_t fsec, int style, char *str)
 					is_before = (fsec < 0);
 #endif
 				is_nonzero = TRUE;
-
-				/* otherwise, integer seconds only? */
 			}
+			/* otherwise, integer seconds only? */
 			else if (tm->tm_sec != 0)
 			{
 				int			sec = tm->tm_sec;
-- 
GitLab