*** pgsql/src/backend/utils/adt/datetime.c 2008/02/25 23:21:29 1.137.4.5 --- pgsql/src/backend/utils/adt/datetime.c 2008/06/09 19:34:31 1.137.4.6 *************** *** 8,14 **** * * * IDENTIFICATION ! * $PostgreSQL: pgsql/src/backend/utils/adt/datetime.c,v 1.137.4.4 2008/01/02 22:05:28 tgl Exp $ * *------------------------------------------------------------------------- */ --- 8,14 ---- * * * IDENTIFICATION ! * $PostgreSQL: pgsql/src/backend/utils/adt/datetime.c,v 1.137.4.5 2008/02/25 23:21:29 tgl Exp $ * *------------------------------------------------------------------------- */ *************** static datetkn *deltacache[MAXDATEFIELDS *** 586,591 **** --- 586,608 ---- /* + * strtoi --- just like strtol, but returns int not long + */ + static int + strtoi(const char *nptr, char **endptr, int base) + { + long val; + + val = strtol(nptr, endptr, base); + #ifdef HAVE_LONG_INT_64 + if (val != (long) ((int32) val)) + errno = ERANGE; + #endif + return (int) val; + } + + + /* * Calendar time to Julian date conversions. * Julian date is commonly used in astronomical applications, * since it is numerically accurate and computationally simple. *************** DecodeDateTime(char **field, int *ftype, *** 985,991 **** return DTERR_BAD_FORMAT; errno = 0; ! val = strtol(field[i], &cp, 10); if (errno == ERANGE) return DTERR_FIELD_OVERFLOW; --- 1002,1008 ---- return DTERR_BAD_FORMAT; errno = 0; ! val = strtoi(field[i], &cp, 10); if (errno == ERANGE) return DTERR_FIELD_OVERFLOW; *************** DecodeDateTime(char **field, int *ftype, *** 1134,1140 **** int val; errno = 0; ! val = strtol(field[i], &cp, 10); if (errno == ERANGE) return DTERR_FIELD_OVERFLOW; --- 1151,1157 ---- int val; errno = 0; ! val = strtoi(field[i], &cp, 10); if (errno == ERANGE) return DTERR_FIELD_OVERFLOW; *************** DecodeTimeOnly(char **field, int *ftype, *** 1849,1855 **** } errno = 0; ! val = strtol(field[i], &cp, 10); if (errno == ERANGE) return DTERR_FIELD_OVERFLOW; --- 1866,1872 ---- } errno = 0; ! val = strtoi(field[i], &cp, 10); if (errno == ERANGE) return DTERR_FIELD_OVERFLOW; *************** DecodeTime(char *str, int fmask, int *tm *** 2426,2439 **** *tmask = DTK_TIME_M; errno = 0; ! tm->tm_hour = strtol(str, &cp, 10); if (errno == ERANGE) return DTERR_FIELD_OVERFLOW; if (*cp != ':') return DTERR_BAD_FORMAT; str = cp + 1; errno = 0; ! tm->tm_min = strtol(str, &cp, 10); if (errno == ERANGE) return DTERR_FIELD_OVERFLOW; if (*cp == '\0') --- 2443,2456 ---- *tmask = DTK_TIME_M; errno = 0; ! tm->tm_hour = strtoi(str, &cp, 10); if (errno == ERANGE) return DTERR_FIELD_OVERFLOW; if (*cp != ':') return DTERR_BAD_FORMAT; str = cp + 1; errno = 0; ! tm->tm_min = strtoi(str, &cp, 10); if (errno == ERANGE) return DTERR_FIELD_OVERFLOW; if (*cp == '\0') *************** DecodeTime(char *str, int fmask, int *tm *** 2447,2453 **** { str = cp + 1; errno = 0; ! tm->tm_sec = strtol(str, &cp, 10); if (errno == ERANGE) return DTERR_FIELD_OVERFLOW; if (*cp == '\0') --- 2464,2470 ---- { str = cp + 1; errno = 0; ! tm->tm_sec = strtoi(str, &cp, 10); if (errno == ERANGE) return DTERR_FIELD_OVERFLOW; if (*cp == '\0') *************** DecodeNumber(int flen, char *str, bool h *** 2504,2510 **** *tmask = 0; errno = 0; ! val = strtol(str, &cp, 10); if (errno == ERANGE) return DTERR_FIELD_OVERFLOW; if (cp == str) --- 2521,2527 ---- *tmask = 0; errno = 0; ! val = strtoi(str, &cp, 10); if (errno == ERANGE) return DTERR_FIELD_OVERFLOW; if (cp == str) *************** DecodeTimezone(char *str, int *tzp) *** 2796,2802 **** return DTERR_BAD_FORMAT; errno = 0; ! hr = strtol((str + 1), &cp, 10); if (errno == ERANGE) return DTERR_TZDISP_OVERFLOW; --- 2813,2819 ---- return DTERR_BAD_FORMAT; errno = 0; ! hr = strtoi((str + 1), &cp, 10); if (errno == ERANGE) return DTERR_TZDISP_OVERFLOW; *************** DecodeTimezone(char *str, int *tzp) *** 2804,2810 **** if (*cp == ':') { errno = 0; ! min = strtol((cp + 1), &cp, 10); if (errno == ERANGE) return DTERR_TZDISP_OVERFLOW; } --- 2821,2827 ---- if (*cp == ':') { errno = 0; ! min = strtoi((cp + 1), &cp, 10); if (errno == ERANGE) return DTERR_TZDISP_OVERFLOW; } *************** DecodeInterval(char **field, int *ftype, *** 3051,3057 **** case DTK_DATE: case DTK_NUMBER: errno = 0; ! val = strtol(field[i], &cp, 10); if (errno == ERANGE) return DTERR_FIELD_OVERFLOW; --- 3068,3074 ---- case DTK_DATE: case DTK_NUMBER: errno = 0; ! val = strtoi(field[i], &cp, 10); if (errno == ERANGE) return DTERR_FIELD_OVERFLOW;