OSDN Git Service

Fix mis-display of negative fractional seconds in interval values for
authorTom Lane <tgl@sss.pgh.pa.us>
Wed, 20 Apr 2005 17:14:50 +0000 (17:14 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Wed, 20 Apr 2005 17:14:50 +0000 (17:14 +0000)
--enable-integer-datetimes case.  Per report from Oliver Siegmar.

src/backend/utils/adt/datetime.c

index 0ac92c3..ee24725 100644 (file)
@@ -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;