]> granicus.if.org Git - postgresql/commitdiff
Change comparisons of tm->tm_isdst from "nonzero" to "greater than zero".
authorThomas G. Lockhart <lockhart@fourpalms.org>
Wed, 17 Jan 2001 16:46:56 +0000 (16:46 +0000)
committerThomas G. Lockhart <lockhart@fourpalms.org>
Wed, 17 Jan 2001 16:46:56 +0000 (16:46 +0000)
 Not sure why some were this way, and others were already correct, but it
 seems to have been like this for several years.
This caused problems on a few damaged platforms like AIX and IRIX which do
 not support DST calculations for years before 1970.
Thanks to Andreas Zeugswetter <ZeugswetterA@wien.spardat.at> for finding
 the problem.

src/backend/utils/adt/datetime.c
src/backend/utils/adt/formatting.c
src/backend/utils/adt/nabstime.c
src/backend/utils/adt/timestamp.c

index 1426088e62b456da985b1c8aa4db6df38b9e1860..659cc584ba327fe70f501d6dbdde1ca36d81d4b8 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/utils/adt/datetime.c,v 1.57 2000/12/03 20:45:35 tgl Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/utils/adt/datetime.c,v 1.58 2001/01/17 16:46:56 thomas Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -2229,21 +2229,27 @@ EncodeTimeSpan(struct tm * tm, double fsec, int style, char *str)
                                sprintf(cp, "%d year%s",
                                                tm->tm_year, ((tm->tm_year != 1) ? "s" : ""));
                                cp += strlen(cp);
+                               is_before = (tm->tm_year < 0);
                                is_nonzero = TRUE;
                        }
 
                        if (tm->tm_mon != 0)
                        {
-                               sprintf(cp, "%s%d mon%s", (is_nonzero ? " " : ""),
+                               sprintf(cp, "%s%s%d mon%s", (is_nonzero ? " " : ""),
+                                               ((is_before && (tm->tm_mon > 0)) ? "+" : ""),
                                                tm->tm_mon, ((tm->tm_mon != 1) ? "s" : ""));
                                cp += strlen(cp);
+                               is_before = (tm->tm_mon < 0);
                                is_nonzero = TRUE;
                        }
 
                        if (tm->tm_mday != 0)
                        {
-                               sprintf(cp, "%s%d", (is_nonzero ? " " : ""), tm->tm_mday);
+                               sprintf(cp, "%s%s%d day%s", (is_nonzero ? " " : ""),
+                                               ((is_before && (tm->tm_mday > 0)) ? "+" : ""),
+                                               tm->tm_mday, ((tm->tm_mday != 1) ? "s" : ""));
                                cp += strlen(cp);
+                               is_before = (tm->tm_mday < 0);
                                is_nonzero = TRUE;
                        }
                        {
@@ -2251,7 +2257,7 @@ EncodeTimeSpan(struct tm * tm, double fsec, int style, char *str)
                                                         || (tm->tm_sec < 0) || (fsec < 0));
 
                                sprintf(cp, "%s%s%02d:%02d", (is_nonzero ? " " : ""),
-                                               (minus ? "-" : "+"),
+                                               (minus ? "-" : (is_nonzero ? "+" : "")),
                                                abs(tm->tm_hour), abs(tm->tm_min));
                                cp += strlen(cp);
                                /* Mark as "non-zero" since the fields are now filled in */
@@ -2283,59 +2289,59 @@ EncodeTimeSpan(struct tm * tm, double fsec, int style, char *str)
 
                        if (tm->tm_year != 0)
                        {
-                               is_before = (tm->tm_year < 0);
-                               if (is_before)
-                                       tm->tm_year = -tm->tm_year;
-                               sprintf(cp, "%d year%s",
-                                               tm->tm_year, ((tm->tm_year != 1) ? "s" : ""));
+                               int year = ((tm->tm_year < 0) ? -(tm->tm_year) : tm->tm_year);
+
+                               sprintf(cp, "%d year%s", year,
+                                               ((year != 1) ? "s" : ""));
                                cp += strlen(cp);
+                               is_before = (tm->tm_year < 0);
                                is_nonzero = TRUE;
                        }
 
                        if (tm->tm_mon != 0)
                        {
+                               int mon = ((is_before && (tm->tm_mon > 0)) ? -(tm->tm_mon) : tm->tm_mon);
+
+                               sprintf(cp, "%s%d mon%s", (is_nonzero ? " " : ""), mon,
+                                               ((mon != 1) ? "s" : ""));
+                               cp += strlen(cp);
                                if (! is_nonzero)
                                        is_before = (tm->tm_mon < 0);
-                               if (is_before)
-                                       tm->tm_mon = -tm->tm_mon;
-                               sprintf(cp, "%s%d mon%s", (is_nonzero ? " " : ""),
-                                               tm->tm_mon, ((tm->tm_mon != 1) ? "s" : ""));
-                               cp += strlen(cp);
                                is_nonzero = TRUE;
                        }
 
                        if (tm->tm_mday != 0)
                        {
+                               int day = ((is_before && (tm->tm_mday > 0)) ? -(tm->tm_mday) : tm->tm_mday);
+
+                               sprintf(cp, "%s%d day%s", (is_nonzero ? " " : ""), day,
+                                               ((day != 1) ? "s" : ""));
+                               cp += strlen(cp);
                                if (! is_nonzero)
                                        is_before = (tm->tm_mday < 0);
-                               if (is_before)
-                                       tm->tm_mday = -tm->tm_mday;
-                               sprintf(cp, "%s%d day%s", (is_nonzero ? " " : ""),
-                                tm->tm_mday, ((tm->tm_mday != 1) ? "s" : ""));
-                               cp += strlen(cp);
                                is_nonzero = TRUE;
                        }
                        if (tm->tm_hour != 0)
                        {
+                               int hour = ((is_before && (tm->tm_hour > 0)) ? -(tm->tm_hour) : tm->tm_hour);
+
+                               sprintf(cp, "%s%d hour%s", (is_nonzero ? " " : ""), hour,
+                                               ((hour != 1) ? "s" : ""));
+                               cp += strlen(cp);
                                if (! is_nonzero)
                                        is_before = (tm->tm_hour < 0);
-                               if (is_before)
-                                       tm->tm_hour = -tm->tm_hour;
-                               sprintf(cp, "%s%d hour%s", (is_nonzero ? " " : ""),
-                                tm->tm_hour, ((tm->tm_hour != 1) ? "s" : ""));
-                               cp += strlen(cp);
                                is_nonzero = TRUE;
                        }
 
                        if (tm->tm_min != 0)
                        {
+                               int min = ((is_before && (tm->tm_min > 0)) ? -(tm->tm_min) : tm->tm_min);
+
+                               sprintf(cp, "%s%d min%s", (is_nonzero ? " " : ""), min,
+                                               ((min != 1) ? "s" : ""));
+                               cp += strlen(cp);
                                if (! is_nonzero)
                                        is_before = (tm->tm_min < 0);
-                               if (is_before)
-                                       tm->tm_min = -tm->tm_min;
-                               sprintf(cp, "%s%d min%s", (is_nonzero ? " " : ""),
-                                  tm->tm_min, ((tm->tm_min != 1) ? "s" : ""));
-                               cp += strlen(cp);
                                is_nonzero = TRUE;
                        }
 
@@ -2343,25 +2349,24 @@ EncodeTimeSpan(struct tm * tm, double fsec, int style, char *str)
                        if (fsec != 0)
                        {
                                fsec += tm->tm_sec;
+                               sprintf(cp, "%s%.2f secs", (is_nonzero ? " " : ""),
+                                               ((is_before && (fsec > 0)) ? -(fsec) : fsec));
+                               cp += strlen(cp);
                                if (! is_nonzero)
                                        is_before = (fsec < 0);
-                               if (is_before)
-                                       fsec = -fsec;
-                               sprintf(cp, "%s%.2f secs", (is_nonzero ? " " : ""), fsec);
-                               cp += strlen(cp);
                                is_nonzero = TRUE;
 
                                /* otherwise, integer seconds only? */
                        }
                        else if (tm->tm_sec != 0)
                        {
+                               int sec = ((is_before && (tm->tm_sec > 0)) ? -(tm->tm_sec) : tm->tm_sec);
+
+                               sprintf(cp, "%s%d sec%s", (is_nonzero ? " " : ""), sec,
+                                               ((sec != 1) ? "s" : ""));
+                               cp += strlen(cp);
                                if (! is_nonzero)
                                        is_before = (tm->tm_sec < 0);
-                               if (is_before)
-                                       tm->tm_sec = -tm->tm_sec;
-                               sprintf(cp, "%s%d sec%s", (is_nonzero ? " " : ""),
-                                  tm->tm_sec, ((tm->tm_sec != 1) ? "s" : ""));
-                               cp += strlen(cp);
                                is_nonzero = TRUE;
                        }
                        break;
@@ -2374,7 +2379,7 @@ EncodeTimeSpan(struct tm * tm, double fsec, int style, char *str)
                cp += strlen(cp);
        }
 
-       if (is_before)
+       if (is_before && (style == USE_POSTGRES_DATES))
        {
                strcat(cp, " ago");
                cp += strlen(cp);
index 789b7b951309aa5a3ff0238c3514c207aed053c9..7996c47f58ff9fea00416cdd2b4f870dc67336d7 100644 (file)
@@ -1,7 +1,7 @@
 /* -----------------------------------------------------------------------
  * formatting.c
  *
- * $Header: /cvsroot/pgsql/src/backend/utils/adt/formatting.c,v 1.28 2000/12/23 04:05:31 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/utils/adt/formatting.c,v 1.29 2001/01/17 16:46:56 thomas Exp $
  *
  *
  *      Portions Copyright (c) 1999-2000, PostgreSQL, Inc
@@ -382,7 +382,7 @@ typedef struct {
                elog(DEBUG_elog_output, "TM:\nsec %d\nyear %d\nmin %d\nwday %d\nhour %d\nyday %d\nmday %d\nnisdst %d\nmon %d\n",\
                        tm->tm_sec, tm->tm_year,\
                        tm->tm_min, tm->tm_wday, tm->tm_hour, tm->tm_yday,\
-                       tm->tm_mday, tm->tm_isdst,tm->tm_mon)
+                       tm->tm_mday, tm->tm_isdst, tm->tm_mon)
 #endif
 
 #define ZERO_tm( _X ) \
@@ -2933,9 +2933,9 @@ to_timestamp(PG_FUNCTION_ARGS)
 # elif defined(HAVE_INT_TIMEZONE)
 
 #  ifdef __CYGWIN__
-               tz = (tm->tm_isdst ? (_timezone - 3600) : _timezone);
+               tz = ((tm->tm_isdst > 0) ? (_timezone - 3600) : _timezone);
 #  else
-               tz = (tm->tm_isdst ? (timezone - 3600) : timezone);
+               tz = ((tm->tm_isdst > 0) ? (timezone - 3600) : timezone);
 #  endif
 
 # endif
index e6ad6fc3e295da920bc604453ae4869cd6f04d5c..19c2068fe94a88ef4f118207fabf4df2bd594f87 100644 (file)
@@ -9,7 +9,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/utils/adt/nabstime.c,v 1.77 2000/12/09 20:40:57 tgl Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/utils/adt/nabstime.c,v 1.78 2001/01/17 16:46:56 thomas Exp $
  *
  * NOTES
  *
@@ -162,9 +162,9 @@ GetCurrentAbsoluteTime(void)
                CDayLight = tm->tm_isdst;
                CTimeZone =
 # ifdef __CYGWIN__
-                       (tm->tm_isdst ? (_timezone - 3600) : _timezone);
+                       ((tm->tm_isdst > 0) ? (_timezone - 3600) : _timezone);
 # else
-                       (tm->tm_isdst ? (timezone - 3600) : timezone);
+                       ((tm->tm_isdst > 0) ? (timezone - 3600) : timezone);
 # endif
                strcpy(CTZName, tzname[tm->tm_isdst]);
 #else /* neither HAVE_TM_ZONE nor HAVE_INT_TIMEZONE */
@@ -245,9 +245,9 @@ abstime2tm(AbsoluteTime _time, int *tzp, struct tm * tm, char *tzn)
 # elif defined(HAVE_INT_TIMEZONE)
        if (tzp != NULL)
 #  ifdef __CYGWIN__
-               *tzp = (tm->tm_isdst ? (_timezone - 3600) : _timezone);
+               *tzp = ((tm->tm_isdst > 0) ? (_timezone - 3600) : _timezone);
 #  else
-               *tzp = (tm->tm_isdst ? (timezone - 3600) : timezone);
+               *tzp = ((tm->tm_isdst > 0) ? (timezone - 3600) : timezone);
 #  endif
        if (tzn != NULL)
        {
index 436eeb5b4daa5be43f3e2ab1d6e731891445e32e..144aec0cbe741b9b15a65c46d012e0499aaa99aa 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/utils/adt/timestamp.c,v 1.41 2001/01/03 16:48:02 thomas Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/utils/adt/timestamp.c,v 1.42 2001/01/17 16:46:56 thomas Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -341,9 +341,9 @@ timestamp2tm(Timestamp dt, int *tzp, struct tm * tm, double *fsec, char **tzn)
                                *tzn = (char *) tm->tm_zone;
 # elif defined(HAVE_INT_TIMEZONE)
 #  ifdef __CYGWIN__
-                       *tzp = (tm->tm_isdst ? (_timezone - 3600) : _timezone);
+                       *tzp = ((tm->tm_isdst > 0) ? (_timezone - 3600) : _timezone);
 #  else
-                       *tzp = (tm->tm_isdst ? (timezone - 3600) : timezone);
+                       *tzp = ((tm->tm_isdst > 0) ? (timezone - 3600) : timezone);
 #  endif
                        if (tzn != NULL)
                                *tzn = tzname[(tm->tm_isdst > 0)];
@@ -1086,9 +1086,9 @@ timestamp_pl_span(PG_FUNCTION_ARGS)
 # elif defined(HAVE_INT_TIMEZONE)
 
 #  ifdef __CYGWIN__
-                                       tz = (tm->tm_isdst ? (_timezone - 3600) : _timezone);
+                                       tz = ((tm->tm_isdst > 0) ? (_timezone - 3600) : _timezone);
 #  else
-                                       tz = (tm->tm_isdst ? (timezone - 3600) : timezone);
+                                       tz = ((tm->tm_isdst > 0) ? (timezone - 3600) : timezone);
 #  endif
 
 # endif
@@ -1735,9 +1735,9 @@ timestamp_trunc(PG_FUNCTION_ARGS)
 # elif defined(HAVE_INT_TIMEZONE)
 
 #  ifdef __CYGWIN__
-                               tz = (tm->tm_isdst ? (_timezone - 3600) : _timezone);
+                               tz = ((tm->tm_isdst > 0) ? (_timezone - 3600) : _timezone);
 #  else
-                               tz = (tm->tm_isdst ? (timezone - 3600) : timezone);
+                               tz = ((tm->tm_isdst > 0) ? (timezone - 3600) : timezone);
 #  endif
 
 # endif