From a97683bc6cbe1b27ac516f6ebbfcfde09d85baa4 Mon Sep 17 00:00:00 2001 From: "Thomas G. Lockhart" Date: Sat, 13 Feb 1999 04:25:01 +0000 Subject: [PATCH] Change #if FALSE to #if NOT_USED to avoid port problems. Fix problem with date_part() for timespan (had an offset of one) when given decade, century, and millenium as arguments. Reported by Ricardo J.C.Coelho. --- src/backend/utils/adt/dt.c | 55 +++++++++++++++++++++----------------- 1 file changed, 31 insertions(+), 24 deletions(-) diff --git a/src/backend/utils/adt/dt.c b/src/backend/utils/adt/dt.c index de650a0b90..8d89c14f8c 100644 --- a/src/backend/utils/adt/dt.c +++ b/src/backend/utils/adt/dt.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/utils/adt/Attic/dt.c,v 1.62 1999/01/20 16:29:39 thomas Exp $ + * $Header: /cvsroot/pgsql/src/backend/utils/adt/Attic/dt.c,v 1.63 1999/02/13 04:25:01 thomas Exp $ * *------------------------------------------------------------------------- */ @@ -249,7 +249,7 @@ timespan_in(char *str) case DTK_DELTA: if (tm2timespan(tm, fsec, span) != 0) { -#if FALSE +#if NOT_USED TIMESPAN_INVALID(span); #endif elog(ERROR, "Bad timespan external representation '%s'", str); @@ -1412,7 +1412,7 @@ datetime_trunc(text *units, DateTime *datetime) if (DATETIME_NOT_FINITE(*datetime)) { -#if FALSE +#if NOT_USED /* should return null but Postgres doesn't like that currently. - tgl 97/06/12 */ elog(ERROR, "Datetime is not finite", NULL); #endif @@ -1494,7 +1494,7 @@ datetime_trunc(text *units, DateTime *datetime) if (tm2datetime(tm, fsec, &tz, result) != 0) elog(ERROR, "Unable to truncate datetime to '%s'", lowunits); -#if FALSE +#if NOT_USED } else if ((type == RESERV) && (val == DTK_EPOCH)) { @@ -1552,7 +1552,7 @@ timespan_trunc(text *units, TimeSpan *timespan) if (TIMESPAN_IS_INVALID(*timespan)) { -#if FALSE +#if NOT_USED elog(ERROR, "Timespan is not finite", NULL); #endif result = NULL; @@ -1610,7 +1610,7 @@ timespan_trunc(text *units, TimeSpan *timespan) result = NULL; } -#if FALSE +#if NOT_USED } else if ((type == RESERV) && (val == DTK_EPOCH)) { @@ -1678,7 +1678,7 @@ datetime_part(text *units, DateTime *datetime) if (DATETIME_NOT_FINITE(*datetime)) { -#if FALSE +#if NOT_USED /* should return null but Postgres doesn't like that currently. - tgl 97/06/12 */ elog(ERROR, "Datetime is not finite", NULL); #endif @@ -1843,7 +1843,7 @@ timespan_part(text *units, TimeSpan *timespan) if (TIMESPAN_IS_INVALID(*timespan)) { -#if FALSE +#if NOT_USED elog(ERROR, "Timespan is not finite", NULL); #endif *result = 0; @@ -1893,15 +1893,15 @@ timespan_part(text *units, TimeSpan *timespan) break; case DTK_DECADE: - *result = (tm->tm_year / 10) + 1; + *result = (tm->tm_year / 10); break; case DTK_CENTURY: - *result = (tm->tm_year / 100) + 1; + *result = (tm->tm_year / 100); break; case DTK_MILLENIUM: - *result = (tm->tm_year / 1000) + 1; + *result = (tm->tm_year / 1000); break; default: @@ -2454,7 +2454,7 @@ datetime2tm(DateTime dt, int *tzp, struct tm * tm, double *fsec, char **tzn) tm->tm_mday = tx->tm_mday; tm->tm_hour = tx->tm_hour; tm->tm_min = tx->tm_min; -#if FALSE +#if NOT_USED /* XXX HACK * Argh! My Linux box puts in a 1 second offset for dates less than 1970 * but only if the seconds field was non-zero. So, don't copy the seconds @@ -2814,6 +2814,7 @@ DecodeDateTime(char **field, int *ftype, int nf, int flen, val; int mer = HR24; + int haveTextMonth = FALSE; int is2digits = FALSE; int bc = FALSE; @@ -2955,14 +2956,23 @@ DecodeDateTime(char **field, int *ftype, int nf, #ifdef DATEDEBUG printf("DecodeDateTime- month field %s value is %d\n", field[i], val); #endif + /* already have a (numeric) month? then see if we can substitute... */ + if ((fmask & DTK_M(MONTH)) && (! haveTextMonth) + && (!(fmask & DTK_M(DAY))) + && ((tm->tm_mon >= 1) && (tm->tm_mon <= 31))) + { + tm->tm_mday = tm->tm_mon; + tmask = DTK_M(DAY); +#ifdef DATEDEBUG + printf("DecodeNumber- misidentified month previously; assign as day %d\n", tm->tm_mday); +#endif + } + haveTextMonth = TRUE; tm->tm_mon = val; break; - /* - * daylight savings time modifier (solves "MET - * DST" syntax) - */ case DTZMOD: + /* daylight savings time modifier (solves "MET DST" syntax) */ tmask |= DTK_M(DTZ); tm->tm_isdst = 1; if (tzp == NULL) @@ -3466,17 +3476,14 @@ DecodeNumber(int flen, char *str, int fmask, *tmask = DTK_M(YEAR); /* already have a year? then see if we can substitute... */ - if (fmask & DTK_M(YEAR)) + if ((fmask & DTK_M(YEAR)) && (!(fmask & DTK_M(DAY))) + && ((tm->tm_year >= 1) && (tm->tm_year <= 31))) { - if ((!(fmask & DTK_M(DAY))) - && ((tm->tm_year >= 1) && (tm->tm_year <= 31))) - { + tm->tm_mday = tm->tm_year; + *tmask = DTK_M(DAY); #ifdef DATEDEBUG - printf("DecodeNumber- misidentified year previously; swap with day %d\n", tm->tm_mday); + printf("DecodeNumber- misidentified year previously; assign as day %d\n", tm->tm_mday); #endif - tm->tm_mday = tm->tm_year; - *tmask = DTK_M(DAY); - } } tm->tm_year = val;