diff --git a/src/backend/utils/adt/dt.c b/src/backend/utils/adt/dt.c index 46c7317c529608a38d6a4f47996f4071bb4045e6..7b90e1ca6d69f7d907fcdfdb41dcb32572e5be1c 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.16 1997/04/22 17:36:44 scrappy Exp $ + * $Header: /cvsroot/pgsql/src/backend/utils/adt/Attic/dt.c,v 1.17 1997/04/25 18:40:13 scrappy Exp $ * *------------------------------------------------------------------------- */ @@ -120,6 +120,7 @@ char * datetime_out(DateTime *dt) { char *result; + int tz; struct tm tt, *tm = &tt; double fsec; char buf[MAXDATELEN+1]; @@ -130,8 +131,8 @@ datetime_out(DateTime *dt) if (DATETIME_IS_RESERVED(*dt)) { EncodeSpecialDateTime(*dt, buf); - } else if (datetime2tm( *dt, &CTimeZone, tm, &fsec) == 0) { - EncodeDateTime(tm, fsec, DateStyle, buf); + } else if (datetime2tm( *dt, &tz, tm, &fsec) == 0) { + EncodeDateTime(tm, fsec, &tz, DateStyle, buf); } else { EncodeSpecialDateTime(DT_INVALID, buf); @@ -840,6 +841,7 @@ datetime_part(text *units, DateTime *datetime) float64 result; DateTime dt; + int tz; int type, val; int i; char *up, *lp, lowunits[MAXDATELEN+1]; @@ -874,10 +876,10 @@ printf( "datetime_part- units %s type=%d value=%d\n", lowunits, type, val); dt = (DATETIME_IS_RELATIVE(*datetime)? SetDateTime(*datetime): *datetime); - if (datetime2tm( dt, &CTimeZone, tm, &fsec) == 0) { + if (datetime2tm( dt, &tz, tm, &fsec) == 0) { switch (val) { case DTK_TZ: - *result = CTimeZone; + *result = tz; break; case DTK_MICROSEC: @@ -929,7 +931,7 @@ printf( "datetime_part- units %s type=%d value=%d\n", lowunits, type, val); break; default: - elog(WARN,"Datetime units %s not yet supported",units); + elog(WARN,"Datetime units %s not supported",units); *result = 0; }; @@ -1401,21 +1403,9 @@ datetime2tm( DateTime dt, int *tzp, struct tm *tm, double *fsec) { double date, time, sec; time_t utime; - - if (tzp != NULL) { - /* XXX HACK to get time behavior compatible with Postgres v6.0 - tgl 97/04/07 */ - if ((tm->tm_year > 1902) && (tm->tm_year < 2038)) { - utime = ((date2j(2000,1,1)-date2j(1970,1,1))*86400+dt); - localtime((time_t *) &utime); -#ifdef DATEDEBUG -printf( "datetime2tm- use system time zone = %ld (CTimeZone = %d)\n", (long int) utime, CTimeZone); +#ifdef USE_POSIX_TIME + struct tm *tx; #endif - dt = dt2local( dt, timezone); - - } else { - dt = dt2local( dt, *tzp); - }; - }; time = (modf( dt/86400, &date)*86400); date += date2j(2000,1,1); @@ -1428,8 +1418,7 @@ printf( "datetime2tm- use system time zone = %ld (CTimeZone = %d)\n", (long int) if (date < 0) return -1; #ifdef DATEDEBUG -printf( "datetime2tm- date is %f (%f %f)\n", - ((tzp != NULL)? dt2local(dt, -(*tzp)): dt), date, time); +printf( "datetime2tm- date is %f (%f %f)\n", dt, date, time); #endif j2date((int) date, &tm->tm_year, &tm->tm_mon, &tm->tm_mday); @@ -1437,7 +1426,7 @@ printf( "datetime2tm- date is %f (%f %f)\n", #ifdef DATEDEBUG printf( "datetime2tm- date is %d.%02d.%02d\n", tm->tm_year, tm->tm_mon, tm->tm_mday); -printf( "datetime2tm- time is %02d:%02d:%2.2f\n", tm->tm_hour, tm->tm_min, sec); +printf( "datetime2tm- time is %02d:%02d:%02.0f\n", tm->tm_hour, tm->tm_min, sec); #endif *fsec = modf(JROUND(sec),&sec); @@ -1447,11 +1436,62 @@ printf( "datetime2tm- time is %02d:%02d:%2.2f\n", tm->tm_hour, tm->tm_min, sec); printf( "datetime2tm- time is %02d:%02d:%02d %.7f\n", tm->tm_hour, tm->tm_min, tm->tm_sec, *fsec); #endif - tm->tm_isdst = -1; + if (tzp != NULL) { + /* XXX HACK to get time behavior compatible with Postgres v6.0 - tgl 97/04/07 */ + if ((tm->tm_year >= 1902) && (tm->tm_year < 2038)) { + utime = (dt + (date2j(2000,1,1)-date2j(1970,1,1))*86400); +#ifdef USE_POSIX_TIME + tx = localtime(&utime); +#ifdef DATEDEBUG +printf( "datetime2tm- (localtime) %d.%02d.%02d %02d:%02d:%02.0f %s %s dst=%d\n", + tx->tm_year, tx->tm_mon, tx->tm_mday, tx->tm_hour, tx->tm_min, sec, + tzname[0], tzname[1], tx->tm_isdst); +#endif + tm->tm_year = tx->tm_year + 1900; + tm->tm_mon = tx->tm_mon + 1; + tm->tm_mday = tx->tm_mday; + tm->tm_hour = tx->tm_hour; + tm->tm_min = tx->tm_min; + tm->tm_sec = tx->tm_sec; + tm->tm_isdst = tx->tm_isdst; +#ifdef HAVE_INT_TIMEZONE + *tzp = (tm->tm_isdst? (timezone - 3600): timezone); +#else /* !HAVE_INT_TIMEZONE */ + *tzp = (tm->tm_isdst? (tm->tm_gmtoff - 3600): tm->tm_gmtoff); /* tm_gmtoff is Sun/DEC-ism */ +#endif +#else /* !USE_POSIX_TIME */ + *tzp = CTimeZone; /* V7 conventions; don't know timezone? */ +#endif + } else { + *tzp = 0; + tm->tm_isdst = 0; +#ifdef USE_POSIX_TIME +#ifdef HAVE_INT_TIMEZONE + tzname[0] = "GMT"; +#else /* !HAVE_INT_TIMEZONE */ + tm->tm_zone = "GMT"; +#endif +#else /* !USE_POSIX_TIME */ + strcpy( CTZName, "GMT"); +#endif + }; + + dt = dt2local( dt, *tzp); + + } else { + tm->tm_isdst = 0; + }; + +#ifdef DATEDEBUG +printf( "datetime2tm- date is %d.%02d.%02d\n", tm->tm_year, tm->tm_mon, tm->tm_mday); +printf( "datetime2tm- time is %02d:%02d:%02d %.7f\n", tm->tm_hour, tm->tm_min, tm->tm_sec, *fsec); +#endif #ifdef DATEDEBUG +#ifdef HAVE_INT_TIMEZONE printf( "datetime2tm- timezone is %s; offset is %d (%d); daylight is %d\n", - CTZName, ((tzp != NULL)? *tzp: 0), CTimeZone, CDayLight); + tzname[tm->tm_isdst != 0], ((tzp != NULL)? *tzp: 0), CTimeZone, CDayLight); +#endif #endif return 0; @@ -1824,9 +1864,13 @@ printf( "DecodeDateTime- month field %s value is %d\n", field[i], val); break; case DTZ: - tm->tm_isdst = 0; - /* FALLTHROUGH! */ + tm->tm_isdst = 1; + if (tzp == NULL) return -1; + *tzp = val * 60; + break; + case TZ: + tm->tm_isdst = 0; if (tzp == NULL) return -1; *tzp = val * 60; break; @@ -1883,15 +1927,29 @@ printf( " %02d:%02d:%02d\n", tm->tm_hour, tm->tm_min, tm->tm_sec); /* timezone not specified? then find local timezone if possible */ /* XXX HACK to get correct behavior relative to Postgres v6.0 - tgl 97/04/07 */ if ((*dtype == DTK_DATE) && ((fmask & DTK_DATE_M) == DTK_DATE_M) - && (tzp != NULL) && (! (fmask & DTK_M(TZ))) - && (tm->tm_year > 1902) && (tm->tm_year < 2038)) { - tm->tm_year -= 1900; - tm->tm_mon -= 1; - mktime(tm); - tm->tm_year += 1900; - tm->tm_mon += 1; + && (tzp != NULL) && (! (fmask & DTK_M(TZ)))) { + + if ((tm->tm_year >= 1902) && (tm->tm_year < 2038)) { +#ifdef USE_POSIX_TIME + tm->tm_year -= 1900; + tm->tm_mon -= 1; + tm->tm_isdst = -1; + mktime(tm); + tm->tm_year += 1900; + tm->tm_mon += 1; - *tzp = timezone; +#ifdef HAVE_INT_TIMEZONE + *tzp = ((tm->tm_isdst > 0)? (timezone - 3600): timezone); +#else /* !HAVE_INT_TIMEZONE */ + *tzp = tm->tm_gmtoff; +#endif +#else /* !USE_POSIX_TIME */ + *tzp = CTimeZone; +#endif + } else { + tm->tm_isdst = 0; + *tzp = 0; + }; }; return 0; @@ -1960,7 +2018,7 @@ printf( "DecodeTimeOnly- RESERV field %s value is %d\n", field[i], val); tm->tm_hour = 0; tm->tm_min = 0; tm->tm_sec = 0; - tm->tm_isdst = -1; + tm->tm_isdst = 0; break; default: @@ -2695,7 +2753,7 @@ printf( "EncodeSpecialDateTime- unrecognized date\n"); /* EncodeDateTime() * Encode date and time interpreted as local time. */ -int EncodeDateTime(struct tm *tm, double fsec, int style, char *str) +int EncodeDateTime(struct tm *tm, double fsec, int *tzp, int style, char *str) { char mabbrev[4], dabbrev[4]; int day, hour, min; @@ -2706,11 +2764,36 @@ int EncodeDateTime(struct tm *tm, double fsec, int style, char *str) sec = (tm->tm_sec + fsec); +#if FALSE tm->tm_isdst = -1; +#endif #ifdef DATEDEBUG +#ifdef USE_POSIX_TIME +#ifdef HAVE_INT_TIMEZONE +printf( "EncodeDateTime- timezone is %s (%s); offset is %d (%d); daylight is %d (%d)\n", + tzname[0], CTZName, *tzp, CTimeZone, tm->tm_isdst, CDayLight); +#else printf( "EncodeDateTime- timezone is %s (%s); offset is %ld (%d); daylight is %d (%d)\n", - tzname[0], CTZName, (long int) timezone, CTimeZone, daylight, CDayLight); + tm->tm_zone, CTZName, (- tm->tm_gmtoff), CTimeZone, tm->tm_isdst, CDayLight); +#endif +#else +printf( "EncodeDateTime- timezone is %s; offset is %d; daylight is %d\n", + CTZName, CTimeZone, CDayLight); +#endif +#endif + +#ifdef USE_POSIX_TIME + /* XXX HACK to get time behavior compatible with Postgres v6.0 - tgl 97/04/07 */ + if ((tm->tm_year >= 1902) && (tm->tm_year < 2038)) { + tm->tm_year -= 1900; + tm->tm_mon -= 1; + mktime(tm); + tm->tm_year += 1900; + tm->tm_mon += 1; + } else { + tm->tm_isdst = -1; + }; #endif day = date2j( tm->tm_year, tm->tm_mon, tm->tm_mday); @@ -2730,21 +2813,20 @@ printf( "EncodeDateTime- day is %d\n", day); /* compatible with ISO date formats */ if (style == USE_ISO_DATES) { if (tm->tm_year > 0) { -#if FALSE - sprintf( str, "%04d-%02d-%02d %02d:%02d:%05.2f %s", - tm->tm_year, tm->tm_mon, tm->tm_mday, tm->tm_hour, tm->tm_min, sec, CTZName); -#endif sprintf( str, "%04d-%02d-%02d %02d:%02d:", tm->tm_year, tm->tm_mon, tm->tm_mday, tm->tm_hour, tm->tm_min); sprintf( (str+17), ((fsec != 0)? "%05.2f": "%02.0f"), sec); - hour = -(CTimeZone / 3600); - min = ((abs(CTimeZone) / 60) % 60); - sprintf( (str+strlen(str)), ((min != 0)? "%+03d:%02d": "%+03d"), hour, min); -#if FALSE - sprintf( str, "%04d-%02d-%02d %02d:%02d:%05.2f%+03d:%02d", - tm->tm_year, tm->tm_mon, tm->tm_mday, tm->tm_hour, tm->tm_min, sec, - hour, min); -#endif + + if (tm->tm_isdst >= 0) { + if (tzp != NULL) { + hour = -(*tzp / 3600); + min = ((abs(*tzp) / 60) % 60); + } else { + hour = 0; + min = 0; + }; + sprintf( (str+strlen(str)), ((min != 0)? "%+03d:%02d": "%+03d"), hour, min); + }; } else { if (tm->tm_hour || tm->tm_min) { @@ -2764,8 +2846,20 @@ printf( "EncodeDateTime- day is %d\n", day); sprintf( str, "%02d/%02d", tm->tm_mon, tm->tm_mday); }; if (tm->tm_year > 0) { - sprintf( (str+5), "/%04d %02d:%02d:%05.2f %s", - tm->tm_year, tm->tm_hour, tm->tm_min, sec, CTZName); + sprintf( (str+5), "/%04d %02d:%02d:%05.2f", + tm->tm_year, tm->tm_hour, tm->tm_min, sec); + + if (tm->tm_isdst >= 0) { +#ifdef USE_POSIX_TIME +#ifdef HAVE_INT_TIMEZONE + sprintf( (str+22), " %s", tzname[(tm->tm_isdst > 0)]); +#else /* !HAVE_INT_TIMEZONE */ + sprintf( (str+22), " %s", tm->tm_zone); +#endif +#else /* !USE_POSIX_TIME */ + sprintf( (str+22), " %s", CTZName); +#endif + }; } else { sprintf( (str+5), "/%04d %02d:%02d %s", @@ -2781,12 +2875,20 @@ printf( "EncodeDateTime- day is %d\n", day); sprintf( (str+4), "%3s %02d", mabbrev, tm->tm_mday); }; if (tm->tm_year > 0) { -#if FALSE - sprintf( (str+10), " %02d:%02d:%05.2f %04d %s", - tm->tm_hour, tm->tm_min, sec, tm->tm_year, CTZName); + sprintf( (str+10), " %02d:%02d:%05.2f %04d", + tm->tm_hour, tm->tm_min, sec, tm->tm_year); + + if (tm->tm_isdst >= 0) { +#ifdef USE_POSIX_TIME +#ifdef HAVE_INT_TIMEZONE + sprintf( (str+27), " %s", tzname[(tm->tm_isdst > 0)]); +#else + sprintf( (str+27), " %s", tm->tm_zone); #endif - sprintf( (str+10), " %02d:%02d:%05.2f %04d %s", - tm->tm_hour, tm->tm_min, sec, tm->tm_year, (daylight? tzname[1]: tzname[0])); +#else + sprintf( (str+27), " %s", CTZName); +#endif + }; } else { sprintf( (str+10), " %02d:%02d %04d %s", @@ -2798,7 +2900,7 @@ printf( "EncodeDateTime- day is %d\n", day); printf( "EncodeDateTime- date result is %s\n", str); #endif -#ifdef DATEDEBUG +#if defined(DATEDEBUG) && FALSE if (tm->tm_year >= 1000) tm->tm_year -= 1900; tm->tm_mon -= 1; strftime( buf, sizeof(buf), "%y.%m.%d %H:%M:%S %Z", tm); diff --git a/src/backend/utils/adt/geo_ops.c b/src/backend/utils/adt/geo_ops.c index 4dacd09f1c6c5bd5104caa97522142c5fdfd22ce..1be8577a2d65521e8e22cbd6f0009759286da861 100644 --- a/src/backend/utils/adt/geo_ops.c +++ b/src/backend/utils/adt/geo_ops.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/utils/adt/geo_ops.c,v 1.3 1997/04/22 17:31:32 scrappy Exp $ + * $Header: /cvsroot/pgsql/src/backend/utils/adt/geo_ops.c,v 1.4 1997/04/25 18:40:25 scrappy Exp $ * *------------------------------------------------------------------------- */ @@ -2675,7 +2675,7 @@ poly_path(POLYGON *poly) * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/utils/adt/geo_ops.c,v 1.3 1997/04/22 17:31:32 scrappy Exp $ + * $Header: /cvsroot/pgsql/src/backend/utils/adt/geo_ops.c,v 1.4 1997/04/25 18:40:25 scrappy Exp $ * *------------------------------------------------------------------------- */ @@ -3075,18 +3075,35 @@ double *circle_radius(CIRCLE *circle) } -/* circle_distance - returns the distance between the - * center points of two circlees. +/* circle_distance - returns the distance between + * two circles. */ double *circle_distance(CIRCLE *circle1, CIRCLE *circle2) { double *result; result = PALLOCTYPE(double); - *result = point_dt(&circle1->center,&circle2->center); + *result = (point_dt(&circle1->center,&circle2->center) + - (circle1->radius + circle2->radius)); + if (*result < 0) *result = 0; return(result); -} +} /* circle_distance() */ + + +/* dist_pc - returns the distance between + * a point and a circle. + */ +double *dist_pc(Point *point, CIRCLE *circle) +{ + double *result; + + result = PALLOCTYPE(double); + *result = (point_dt(point,&circle->center) - circle->radius); + if (*result < 0) *result = 0; + + return(result); +} /* dist_pc() */ /* circle_center - returns the center point of the circle. diff --git a/src/backend/utils/adt/nabstime.c b/src/backend/utils/adt/nabstime.c index b227528ed3363f91731475548bd0ff019bc141cd..881206fc59fb070ac6eeb989457ead6f08467cc5 100644 --- a/src/backend/utils/adt/nabstime.c +++ b/src/backend/utils/adt/nabstime.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/utils/adt/nabstime.c,v 1.24 1997/04/22 17:36:57 scrappy Exp $ + * $Header: /cvsroot/pgsql/src/backend/utils/adt/nabstime.c,v 1.25 1997/04/25 18:40:33 scrappy Exp $ * *------------------------------------------------------------------------- */ @@ -41,39 +41,43 @@ * * Returns the number of seconds since epoch (January 1 1970 GMT) */ - AbsoluteTime GetCurrentAbsoluteTime(void) { time_t now; #ifdef USE_POSIX_TIME + struct tm *tm; + now = time(NULL); #else /* ! USE_POSIX_TIME */ - struct timeb tbnow; /* the old V7-ism */ + struct timeb tb; /* the old V7-ism */ - (void) ftime(&tbnow); - now = tbnow.time; + (void) ftime(&tb); + now = tb.time; #endif if (! HasCTZSet) { #ifdef USE_POSIX_TIME #if defined(HAVE_TZSET) && defined(HAVE_INT_TIMEZONE) - tzset(); - CTimeZone = timezone; - CDayLight = daylight; - strcpy( CTZName, tzname[0]); -#else /* !HAVE_TZSET */ - struct tm *tmnow = localtime(&now); + tm = localtime(&now); - CTimeZone = - tmnow->tm_gmtoff; /* tm_gmtoff is Sun/DEC-ism */ - CDayLight = (tmnow->tm_isdst > 0); - /* XXX is there a better way to get local timezone string in V7? - tgl 97/03/18 */ - strftime( CTZName, MAXTZLEN, "%Z", localtime(&now)); + CDayLight = tm->tm_isdst; + CTimeZone = (tm->tm_isdst? (timezone - 3600): timezone); + strcpy( CTZName, tzname[tm->tm_isdst]); +#else /* !HAVE_TZSET */ + tm = localtime(&now); + + CTimeZone = - tm->tm_gmtoff; /* tm_gmtoff is Sun/DEC-ism */ + CDayLight = (tm->tm_isdst > 0); + /* XXX is there a better way to get local timezone string w/o tzname? - tgl 97/03/18 */ + strftime( CTZName, MAXTZLEN, "%Z", tm); + /* XXX FreeBSD man pages indicate that this should work - tgl 97/04/23 */ + strcpy(CTZName, tm->tm_zone); #endif #else /* ! USE_POSIX_TIME */ - CTimeZone = tbnow.timezone * 60; - CDayLight = (tbnow.dstflag != 0); + CTimeZone = tb.timezone * 60; + CDayLight = (tb.dstflag != 0); /* XXX does this work to get the local timezone string in V7? - tgl 97/03/18 */ strftime( CTZName, MAXTZLEN, "%Z", localtime(&now)); #endif @@ -91,7 +95,9 @@ printf( "GetCurrentAbsoluteTime- timezone is %s -> %d seconds from UTC\n", void GetCurrentTime(struct tm *tm) { - abstime2tm( GetCurrentTransactionStartTime(), &CTimeZone, tm); + int tz; + + abstime2tm( GetCurrentTransactionStartTime(), &tz, tm); return; } /* GetCurrentTime() */ @@ -157,12 +163,14 @@ tm2abstime( struct tm *tm, int tz) (day == MIN_DAYNUM && sec > 0)) return(INVALID_ABSTIME); +#if FALSE /* daylight correction */ if (tm->tm_isdst < 0) { /* unknown; find out */ tm->tm_isdst = (CDayLight > 0); }; if (tm->tm_isdst > 0) sec -= 60*60; +#endif /* check for reserved values (e.g. "current" on edge of usual range */ if (!AbsoluteTimeIsReal(sec)) @@ -511,10 +519,10 @@ datetime_abstime(DateTime *datetime) } else { if (DATETIME_IS_RELATIVE(*datetime)) { - datetime2tm( SetDateTime(*datetime), &CTimeZone, tm, &fsec); + datetime2tm( SetDateTime(*datetime), NULL, tm, &fsec); result = tm2abstime( tm, 0); - } else if (datetime2tm( *datetime, &CTimeZone, tm, &fsec) == 0) { + } else if (datetime2tm( *datetime, NULL, tm, &fsec) == 0) { result = tm2abstime( tm, 0); } else { diff --git a/src/backend/utils/adt/varlena.c b/src/backend/utils/adt/varlena.c index e5749cce0d05f901a0899f2dbabad6b53f2b6f45..80ac9937fffaa2df67c405df822a67558c2ff1f3 100644 --- a/src/backend/utils/adt/varlena.c +++ b/src/backend/utils/adt/varlena.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/utils/adt/varlena.c,v 1.14 1997/04/21 04:31:53 vadim Exp $ + * $Header: /cvsroot/pgsql/src/backend/utils/adt/varlena.c,v 1.15 1997/04/25 18:40:39 scrappy Exp $ * *------------------------------------------------------------------------- */ @@ -288,19 +288,23 @@ textne(struct varlena *arg1, struct varlena *arg2) /* text_lt() * Comparison function for text strings. * Includes locale support, but must copy strings to temporary memory - * to allow null-termination for inputs to strcoll(). + * to allow null-termination for inputs to strcoll(). + * XXX HACK code for textlen() indicates that there can be embedded nulls + * but it appears that most routines (incl. this one) assume not! - tgl 97/04/07 */ bool text_lt(struct varlena *arg1, struct varlena *arg2) { + bool result; + +#ifdef USE_LOCALE + int cval; +#endif int len; #ifdef UNSIGNED_CHAR_TEXT unsigned #endif char *a1p, *a2p; -#ifdef USE_LOCALE - int cval; -#endif if (arg1 == NULL || arg2 == NULL) return((bool) FALSE); @@ -308,9 +312,11 @@ text_lt(struct varlena *arg1, struct varlena *arg2) len = (((VARSIZE(arg1) <= VARSIZE(arg2))? VARSIZE(arg1): VARSIZE(arg2))-VARHDRSZ); #ifdef USE_LOCALE - - a1p = palloc (len+1); - a2p = palloc (len+1); + if (!PointerIsValid(a1p = PALLOC(len+1)) + || !PointerIsValid(a2p = PALLOC(len+1))) { + elog(WARN,"Unable to allocate memory for text comparison",NULL); + return(FALSE); + }; memcpy(a1p, VARDATA(arg1), len); *(a1p+len) = '\0'; @@ -318,15 +324,11 @@ text_lt(struct varlena *arg1, struct varlena *arg2) *(a2p+len) = '\0'; cval = strcoll(a1p,a2p); - - pfree (a1p); - pfree (a2p); - - return((bool) ( (cval < 0) || - ( (cval == 0) && (VARSIZE(arg1) < VARSIZE(arg2)) ) ) ); + result = ((cval < 0) || ((cval == 0) && (VARSIZE(arg1) < VARSIZE(arg2)))); + PFREE(a1p); + PFREE(a2p); #else - a1p = (unsigned char *)VARDATA(arg1); a2p = (unsigned char *)VARDATA(arg2); @@ -335,28 +337,33 @@ text_lt(struct varlena *arg1, struct varlena *arg2) a2p++; len--; }; - return((bool) (len? (*a1p < *a2p): (VARSIZE(arg1) < VARSIZE(arg2)))); + result = (len? (*a1p < *a2p): (VARSIZE(arg1) < VARSIZE(arg2))); #endif + return(result); } /* text_lt() */ /* text_le() * Comparison function for text strings. * Includes locale support, but must copy strings to temporary memory - * to allow null-termination for inputs to strcoll(). + * to allow null-termination for inputs to strcoll(). + * XXX HACK code for textlen() indicates that there can be embedded nulls + * but it appears that most routines (incl. this one) assume not! - tgl 97/04/07 */ bool text_le(struct varlena *arg1, struct varlena *arg2) { + bool result; + +#ifdef USE_LOCALE + int cval; +#endif int len; #ifdef UNSIGNED_CHAR_TEXT unsigned #endif char *a1p, *a2p; -#ifdef USE_LOCALE - int cval; -#endif if (arg1 == NULL || arg2 == NULL) return((bool) 0); @@ -364,9 +371,11 @@ text_le(struct varlena *arg1, struct varlena *arg2) len = (((VARSIZE(arg1) <= VARSIZE(arg2))? VARSIZE(arg1): VARSIZE(arg2))-VARHDRSZ); #ifdef USE_LOCALE - - a1p = palloc (len+1); - a2p = palloc (len+1); + if (!PointerIsValid(a1p = PALLOC(len+1)) + || !PointerIsValid(a2p = PALLOC(len+1))) { + elog(WARN,"Unable to allocate memory for text comparison",NULL); + return(FALSE); + }; memcpy(a1p, VARDATA(arg1), len); *(a1p+len) = '\0'; @@ -374,15 +383,11 @@ text_le(struct varlena *arg1, struct varlena *arg2) *(a2p+len) = '\0'; cval = strcoll(a1p,a2p); - - pfree (a1p); - pfree (a2p); - - return ((bool) ( (cval < 0) || - ( (cval == 0) && (VARSIZE(arg1) <= VARSIZE(arg2)) ) ) ); + result = ((cval < 0) || ((cval == 0) && (VARSIZE(arg1) <= VARSIZE(arg2)))); + PFREE(a1p); + PFREE(a2p); #else - a1p = (unsigned char *)VARDATA(arg1); a2p = (unsigned char *)VARDATA(arg2); @@ -392,10 +397,10 @@ text_le(struct varlena *arg1, struct varlena *arg2) len--; }; - return((bool) (len? (*a1p <= *a2p): (VARSIZE(arg1) <= VARSIZE(arg2)))); - + result = (len? (*a1p <= *a2p): (VARSIZE(arg1) <= VARSIZE(arg2))); #endif + return(result); } /* text_le() */ bool diff --git a/src/include/utils/dt.h b/src/include/utils/dt.h index 9005f5c51fc63f7b9a61e42b2fac0b11531ea425..01fff066f406fcd54b1ebd75ea601b5672e55416 100644 --- a/src/include/utils/dt.h +++ b/src/include/utils/dt.h @@ -8,7 +8,7 @@ * * Copyright (c) 1994, Regents of the University of California * - * $Id: dt.h,v 1.5 1997/04/02 18:32:20 scrappy Exp $ + * $Id: dt.h,v 1.6 1997/04/25 18:40:45 scrappy Exp $ * *------------------------------------------------------------------------- */ @@ -319,7 +319,7 @@ extern int DecodeDateDelta( char *field[], int ftype[], extern int DecodeUnits(int field, char *lowtoken, int *val); extern int EncodeSpecialDateTime(DateTime dt, char *str); -extern int EncodeDateTime(struct tm *tm, double fsec, int style, char *str); +extern int EncodeDateTime(struct tm *tm, double fsec, int *tzp, int style, char *str); extern int EncodeTimeSpan(struct tm *tm, double fsec, int style, char *str); extern datetkn *datebsearch(char *key, datetkn *base, unsigned int nel); diff --git a/src/include/utils/geo_decls.h b/src/include/utils/geo_decls.h index cdd9f6895a687381f5f89e680d0022ee8e2821e3..2d0aeee86fb0e77ea5d5da85f933c84d92dc46de 100644 --- a/src/include/utils/geo_decls.h +++ b/src/include/utils/geo_decls.h @@ -5,7 +5,7 @@ * * Copyright (c) 1994, Regents of the University of California * - * $Id: geo_decls.h,v 1.2 1997/04/22 17:32:41 scrappy Exp $ + * $Id: geo_decls.h,v 1.3 1997/04/25 18:40:50 scrappy Exp $ * * NOTE * These routines do *not* use the float types from adt/. @@ -321,6 +321,7 @@ extern double *circle_area(CIRCLE *circle); extern double *circle_diameter(CIRCLE *circle); extern double *circle_radius(CIRCLE *circle); extern double *circle_distance(CIRCLE *circle1, CIRCLE *circle2); +extern double *dist_pc(Point *point, CIRCLE *circle); extern Point *circle_center(CIRCLE *circle); extern CIRCLE *circle(Point *center, float8 *radius); extern CIRCLE *poly_circle(POLYGON *poly); diff --git a/src/update6_0-6_1.sh b/src/update6_0-6_1.sh deleted file mode 100644 index 44b3c9aa7b9c130a22ab0a86eb709035f24c1edd..0000000000000000000000000000000000000000 --- a/src/update6_0-6_1.sh +++ /dev/null @@ -1,56 +0,0 @@ -#!/bin/sh -# update -# Script to apply patches to existing databases -# to upgrade from Postgres v6.0 to v6.1. -echo "" -echo "This utility does a minimal upgrade for existing v6.0 databases." -echo "Note that several new features and functions in Postgres" -echo " will not be available unless the databases are reloaded" -echo " from a clean install of v6.1." -echo "" -echo "This update script is not necessary for new or reloaded databases," -echo " but will not damage them. You should update existing v6.1beta" -echo " databases created on or before 1997-04-04 (when the patches for" -echo " aggregate functions were applied to the v6.1beta source tree)." -echo "" -echo "Features present with this simple update include:" -echo " - aggregate operators sum() and avg() behave correctly with NULLs" -echo " - the point distance operator '<===>' returns float8 rather than int4" -echo " - some duplicate function OIDs are renumbered to eliminate conflicts" -echo "" -echo "Features unavailable with only this simple update include:" -echo " - new string handling functions a la Oracle/Ingres" -echo " - new date and time data types and expanded functionality" -echo " - some new function overloading to simplify function names" -echo "" -echo "Note that if v6.0 databases are not reloaded from a clean install of v6.1" -echo " or if this update is not applied to existing v6.0 databases:" -echo " - aggregate functions avg() and sum() may divide-by-zero for int4 data types" -# -srcdir=`pwd` -srcsql="update6_0-6_1.sql" -CMDSQL="psql" -SRCSQL="$srcdir/$srcsql" -# -if [ -z $SRCSQL ]; then - echo "unable to locate $SRCSQL" - exit 1 -fi -# -echo "" -echo "updating databases found in $PGDATA/base" -echo "" -# -cd $PGDATA/base -for d in * -do - echo "updating $d at `date` ..." - echo "try $CMDSQL $d < $SRCSQL" - $CMDSQL $d < $SRCSQL - echo "completed updating $d at `date`" -done -# -echo "" -echo "completed all updates at `date`" -echo "" -exit diff --git a/src/update6_0-6_1.sql b/src/update6_0-6_1.sql deleted file mode 100644 index e60e8d93cbe0735b988d9bab75586ada0af088f6..0000000000000000000000000000000000000000 --- a/src/update6_0-6_1.sql +++ /dev/null @@ -1,47 +0,0 @@ --- Aggregate functions --- Thomas Lockhart --- This fixes the behavior of built-in aggregate functions avg() and sum(). --- Code tested on postgres95 v1.0.9, postgres v6.0, and postgres v6.1b-970315. --- Original definitions return zero rather than null for empty set attributes. --- Postgres source code says that null behavior for aggregates is not correct, --- but does describe the correct behavior for pass-by-reference data types --- if it is given null initial values (from pg_aggregate). --- Note that pass-by-value data types (e.g. int4) require a simple source code --- change in backend/executor/nodeAgg.c to avoid divide-by-zero results. --- If this SQL update is applied without making the corresponding source code --- patch, then floating point types will work correctly but integer types will --- divide-by-zero. --- If the source code patch is applied but this SQL update is not, then there --- will be divide-by-zero results for floating point types. - --- For aggregate attributes, the correct behavior is as follows: --- count(*) should return a count of all tuples, null or otherwise --- count(col) should return a count of all non-null values, zero if none --- avg(col), sum(col), etc should ignore null fields and return null if there --- are no non-null inputs --- Ref: the original Date book - -update pg_aggregate set agginitval1=null - where aggname = 'avg' or aggname = 'sum'; - --- Geometric functions --- Thomas Lockhart --- This replaces the distance operator with one returning a floating point number. --- The original operator 'pointdist' returned an integer. --- There is no corresponding source code change required for this patch. - -update pg_operator set oprresult = 701, oprcode = 'point_distance'::regproc - where oprname = '<===>' and oprresult = 23; - --- Date functions --- Thomas Lockhart --- This fixes conflicting OIDs within the date and time declarations. - -update pg_proc set oid = 1138::oid where proname = 'date_larger'; -update pg_proc set oid = 1139::oid where proname = 'date_smaller'; -update pg_proc set oid = 1140::oid where proname = 'date_mi'; -update pg_proc set oid = 1141::oid where proname = 'date_pli'; -update pg_proc set oid = 1142::oid where proname = 'date_mii'; -update pg_proc set oid = 1143::oid where proname = 'timein'; -update pg_proc set oid = 1144::oid where proname = 'timeout'; -update pg_proc set oid = 1145::oid where proname = 'time_eq';