*** pgsql/src/backend/utils/adt/datetime.c 2008/01/02 22:05:36 1.118.2.8 --- pgsql/src/backend/utils/adt/datetime.c 2008/06/09 19:34:40 1.118.2.9 *************** *** 8,14 **** * * * IDENTIFICATION ! * $Header: /projects/cvsroot/pgsql/src/backend/utils/adt/datetime.c,v 1.118.2.8 2008/01/02 22:05:36 tgl Exp $ * *------------------------------------------------------------------------- */ --- 8,14 ---- * * * IDENTIFICATION ! * $Header: /projects/cvsroot/pgsql/src/backend/utils/adt/datetime.c,v 1.118.2.9 2008/06/09 19:34:40 tgl Exp $ * *------------------------------------------------------------------------- */ *************** static datetkn *deltacache[MAXDATEFIELDS *** 580,585 **** --- 580,602 ---- /* + * 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, *** 978,984 **** return DTERR_BAD_FORMAT; errno = 0; ! val = strtol(field[i], &cp, 10); if (errno == ERANGE) return DTERR_FIELD_OVERFLOW; --- 995,1001 ---- return DTERR_BAD_FORMAT; errno = 0; ! val = strtoi(field[i], &cp, 10); if (errno == ERANGE) return DTERR_FIELD_OVERFLOW; *************** DecodeDateTime(char **field, int *ftype, *** 1126,1132 **** int val; errno = 0; ! val = strtol(field[i], &cp, 10); if (errno == ERANGE) return DTERR_FIELD_OVERFLOW; --- 1143,1149 ---- int val; errno = 0; ! val = strtoi(field[i], &cp, 10); if (errno == ERANGE) return DTERR_FIELD_OVERFLOW; *************** DecodeTimeOnly(char **field, int *ftype, *** 1870,1876 **** } errno = 0; ! val = strtol(field[i], &cp, 10); if (errno == ERANGE) return DTERR_FIELD_OVERFLOW; --- 1887,1893 ---- } errno = 0; ! val = strtoi(field[i], &cp, 10); if (errno == ERANGE) return DTERR_FIELD_OVERFLOW; *************** DecodeTime(char *str, int fmask, int *tm *** 2415,2428 **** *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') --- 2432,2445 ---- *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 *** 2436,2442 **** { str = cp + 1; errno = 0; ! tm->tm_sec = strtol(str, &cp, 10); if (errno == ERANGE) return DTERR_FIELD_OVERFLOW; if (*cp == '\0') --- 2453,2459 ---- { 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 *** 2493,2499 **** *tmask = 0; errno = 0; ! val = strtol(str, &cp, 10); if (errno == ERANGE) return DTERR_FIELD_OVERFLOW; if (cp == str) --- 2510,2516 ---- *tmask = 0; errno = 0; ! val = strtoi(str, &cp, 10); if (errno == ERANGE) return DTERR_FIELD_OVERFLOW; if (cp == str) *************** DecodeTimezone(char *str, int *tzp) *** 2784,2790 **** return DTERR_BAD_FORMAT; errno = 0; ! hr = strtol((str + 1), &cp, 10); if (errno == ERANGE) return DTERR_TZDISP_OVERFLOW; --- 2801,2807 ---- return DTERR_BAD_FORMAT; errno = 0; ! hr = strtoi((str + 1), &cp, 10); if (errno == ERANGE) return DTERR_TZDISP_OVERFLOW; *************** DecodeTimezone(char *str, int *tzp) *** 2792,2798 **** if (*cp == ':') { errno = 0; ! min = strtol((cp + 1), &cp, 10); if (errno == ERANGE) return DTERR_TZDISP_OVERFLOW; } --- 2809,2815 ---- if (*cp == ':') { errno = 0; ! min = strtoi((cp + 1), &cp, 10); if (errno == ERANGE) return DTERR_TZDISP_OVERFLOW; } *************** DecodeInterval(char **field, int *ftype, *** 3041,3047 **** case DTK_DATE: case DTK_NUMBER: errno = 0; ! val = strtol(field[i], &cp, 10); if (errno == ERANGE) return DTERR_FIELD_OVERFLOW; --- 3058,3064 ---- case DTK_DATE: case DTK_NUMBER: errno = 0; ! val = strtoi(field[i], &cp, 10); if (errno == ERANGE) return DTERR_FIELD_OVERFLOW;