Commit 8e984038 authored by Thomas G. Lockhart's avatar Thomas G. Lockhart

Change comparisons of tm->tm_isdst from "nonzero" to "greater than zero".

 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.
parent 9a342d20
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * 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) ...@@ -2229,21 +2229,27 @@ EncodeTimeSpan(struct tm * tm, double fsec, int style, char *str)
sprintf(cp, "%d year%s", sprintf(cp, "%d year%s",
tm->tm_year, ((tm->tm_year != 1) ? "s" : "")); tm->tm_year, ((tm->tm_year != 1) ? "s" : ""));
cp += strlen(cp); cp += strlen(cp);
is_before = (tm->tm_year < 0);
is_nonzero = TRUE; is_nonzero = TRUE;
} }
if (tm->tm_mon != 0) 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" : "")); tm->tm_mon, ((tm->tm_mon != 1) ? "s" : ""));
cp += strlen(cp); cp += strlen(cp);
is_before = (tm->tm_mon < 0);
is_nonzero = TRUE; is_nonzero = TRUE;
} }
if (tm->tm_mday != 0) 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); cp += strlen(cp);
is_before = (tm->tm_mday < 0);
is_nonzero = TRUE; is_nonzero = TRUE;
} }
{ {
...@@ -2251,7 +2257,7 @@ EncodeTimeSpan(struct tm * tm, double fsec, int style, char *str) ...@@ -2251,7 +2257,7 @@ EncodeTimeSpan(struct tm * tm, double fsec, int style, char *str)
|| (tm->tm_sec < 0) || (fsec < 0)); || (tm->tm_sec < 0) || (fsec < 0));
sprintf(cp, "%s%s%02d:%02d", (is_nonzero ? " " : ""), sprintf(cp, "%s%s%02d:%02d", (is_nonzero ? " " : ""),
(minus ? "-" : "+"), (minus ? "-" : (is_nonzero ? "+" : "")),
abs(tm->tm_hour), abs(tm->tm_min)); abs(tm->tm_hour), abs(tm->tm_min));
cp += strlen(cp); cp += strlen(cp);
/* Mark as "non-zero" since the fields are now filled in */ /* 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) ...@@ -2283,59 +2289,59 @@ EncodeTimeSpan(struct tm * tm, double fsec, int style, char *str)
if (tm->tm_year != 0) if (tm->tm_year != 0)
{ {
is_before = (tm->tm_year < 0); int year = ((tm->tm_year < 0) ? -(tm->tm_year) : tm->tm_year);
if (is_before)
tm->tm_year = -tm->tm_year; sprintf(cp, "%d year%s", year,
sprintf(cp, "%d year%s", ((year != 1) ? "s" : ""));
tm->tm_year, ((tm->tm_year != 1) ? "s" : ""));
cp += strlen(cp); cp += strlen(cp);
is_before = (tm->tm_year < 0);
is_nonzero = TRUE; is_nonzero = TRUE;
} }
if (tm->tm_mon != 0) 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) if (! is_nonzero)
is_before = (tm->tm_mon < 0); 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; is_nonzero = TRUE;
} }
if (tm->tm_mday != 0) 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) if (! is_nonzero)
is_before = (tm->tm_mday < 0); 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; is_nonzero = TRUE;
} }
if (tm->tm_hour != 0) 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) if (! is_nonzero)
is_before = (tm->tm_hour < 0); 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; is_nonzero = TRUE;
} }
if (tm->tm_min != 0) 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) if (! is_nonzero)
is_before = (tm->tm_min < 0); 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; is_nonzero = TRUE;
} }
...@@ -2343,25 +2349,24 @@ EncodeTimeSpan(struct tm * tm, double fsec, int style, char *str) ...@@ -2343,25 +2349,24 @@ EncodeTimeSpan(struct tm * tm, double fsec, int style, char *str)
if (fsec != 0) if (fsec != 0)
{ {
fsec += tm->tm_sec; fsec += tm->tm_sec;
sprintf(cp, "%s%.2f secs", (is_nonzero ? " " : ""),
((is_before && (fsec > 0)) ? -(fsec) : fsec));
cp += strlen(cp);
if (! is_nonzero) if (! is_nonzero)
is_before = (fsec < 0); is_before = (fsec < 0);
if (is_before)
fsec = -fsec;
sprintf(cp, "%s%.2f secs", (is_nonzero ? " " : ""), fsec);
cp += strlen(cp);
is_nonzero = TRUE; is_nonzero = TRUE;
/* otherwise, integer seconds only? */ /* otherwise, integer seconds only? */
} }
else if (tm->tm_sec != 0) 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) if (! is_nonzero)
is_before = (tm->tm_sec < 0); 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; is_nonzero = TRUE;
} }
break; break;
...@@ -2374,7 +2379,7 @@ EncodeTimeSpan(struct tm * tm, double fsec, int style, char *str) ...@@ -2374,7 +2379,7 @@ EncodeTimeSpan(struct tm * tm, double fsec, int style, char *str)
cp += strlen(cp); cp += strlen(cp);
} }
if (is_before) if (is_before && (style == USE_POSTGRES_DATES))
{ {
strcat(cp, " ago"); strcat(cp, " ago");
cp += strlen(cp); cp += strlen(cp);
......
/* ----------------------------------------------------------------------- /* -----------------------------------------------------------------------
* formatting.c * 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 * Portions Copyright (c) 1999-2000, PostgreSQL, Inc
...@@ -382,7 +382,7 @@ typedef struct { ...@@ -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",\ 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_sec, tm->tm_year,\
tm->tm_min, tm->tm_wday, tm->tm_hour, tm->tm_yday,\ 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 #endif
#define ZERO_tm( _X ) \ #define ZERO_tm( _X ) \
...@@ -2933,9 +2933,9 @@ to_timestamp(PG_FUNCTION_ARGS) ...@@ -2933,9 +2933,9 @@ to_timestamp(PG_FUNCTION_ARGS)
# elif defined(HAVE_INT_TIMEZONE) # elif defined(HAVE_INT_TIMEZONE)
# ifdef __CYGWIN__ # ifdef __CYGWIN__
tz = (tm->tm_isdst ? (_timezone - 3600) : _timezone); tz = ((tm->tm_isdst > 0) ? (_timezone - 3600) : _timezone);
# else # else
tz = (tm->tm_isdst ? (timezone - 3600) : timezone); tz = ((tm->tm_isdst > 0) ? (timezone - 3600) : timezone);
# endif # endif
# endif # endif
......
...@@ -9,7 +9,7 @@ ...@@ -9,7 +9,7 @@
* *
* *
* IDENTIFICATION * 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 * NOTES
* *
...@@ -162,9 +162,9 @@ GetCurrentAbsoluteTime(void) ...@@ -162,9 +162,9 @@ GetCurrentAbsoluteTime(void)
CDayLight = tm->tm_isdst; CDayLight = tm->tm_isdst;
CTimeZone = CTimeZone =
# ifdef __CYGWIN__ # ifdef __CYGWIN__
(tm->tm_isdst ? (_timezone - 3600) : _timezone); ((tm->tm_isdst > 0) ? (_timezone - 3600) : _timezone);
# else # else
(tm->tm_isdst ? (timezone - 3600) : timezone); ((tm->tm_isdst > 0) ? (timezone - 3600) : timezone);
# endif # endif
strcpy(CTZName, tzname[tm->tm_isdst]); strcpy(CTZName, tzname[tm->tm_isdst]);
#else /* neither HAVE_TM_ZONE nor HAVE_INT_TIMEZONE */ #else /* neither HAVE_TM_ZONE nor HAVE_INT_TIMEZONE */
...@@ -245,9 +245,9 @@ abstime2tm(AbsoluteTime _time, int *tzp, struct tm * tm, char *tzn) ...@@ -245,9 +245,9 @@ abstime2tm(AbsoluteTime _time, int *tzp, struct tm * tm, char *tzn)
# elif defined(HAVE_INT_TIMEZONE) # elif defined(HAVE_INT_TIMEZONE)
if (tzp != NULL) if (tzp != NULL)
# ifdef __CYGWIN__ # ifdef __CYGWIN__
*tzp = (tm->tm_isdst ? (_timezone - 3600) : _timezone); *tzp = ((tm->tm_isdst > 0) ? (_timezone - 3600) : _timezone);
# else # else
*tzp = (tm->tm_isdst ? (timezone - 3600) : timezone); *tzp = ((tm->tm_isdst > 0) ? (timezone - 3600) : timezone);
# endif # endif
if (tzn != NULL) if (tzn != NULL)
{ {
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * 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) ...@@ -341,9 +341,9 @@ timestamp2tm(Timestamp dt, int *tzp, struct tm * tm, double *fsec, char **tzn)
*tzn = (char *) tm->tm_zone; *tzn = (char *) tm->tm_zone;
# elif defined(HAVE_INT_TIMEZONE) # elif defined(HAVE_INT_TIMEZONE)
# ifdef __CYGWIN__ # ifdef __CYGWIN__
*tzp = (tm->tm_isdst ? (_timezone - 3600) : _timezone); *tzp = ((tm->tm_isdst > 0) ? (_timezone - 3600) : _timezone);
# else # else
*tzp = (tm->tm_isdst ? (timezone - 3600) : timezone); *tzp = ((tm->tm_isdst > 0) ? (timezone - 3600) : timezone);
# endif # endif
if (tzn != NULL) if (tzn != NULL)
*tzn = tzname[(tm->tm_isdst > 0)]; *tzn = tzname[(tm->tm_isdst > 0)];
...@@ -1086,9 +1086,9 @@ timestamp_pl_span(PG_FUNCTION_ARGS) ...@@ -1086,9 +1086,9 @@ timestamp_pl_span(PG_FUNCTION_ARGS)
# elif defined(HAVE_INT_TIMEZONE) # elif defined(HAVE_INT_TIMEZONE)
# ifdef __CYGWIN__ # ifdef __CYGWIN__
tz = (tm->tm_isdst ? (_timezone - 3600) : _timezone); tz = ((tm->tm_isdst > 0) ? (_timezone - 3600) : _timezone);
# else # else
tz = (tm->tm_isdst ? (timezone - 3600) : timezone); tz = ((tm->tm_isdst > 0) ? (timezone - 3600) : timezone);
# endif # endif
# endif # endif
...@@ -1735,9 +1735,9 @@ timestamp_trunc(PG_FUNCTION_ARGS) ...@@ -1735,9 +1735,9 @@ timestamp_trunc(PG_FUNCTION_ARGS)
# elif defined(HAVE_INT_TIMEZONE) # elif defined(HAVE_INT_TIMEZONE)
# ifdef __CYGWIN__ # ifdef __CYGWIN__
tz = (tm->tm_isdst ? (_timezone - 3600) : _timezone); tz = ((tm->tm_isdst > 0) ? (_timezone - 3600) : _timezone);
# else # else
tz = (tm->tm_isdst ? (timezone - 3600) : timezone); tz = ((tm->tm_isdst > 0) ? (timezone - 3600) : timezone);
# endif # endif
# endif # endif
......
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