*** pgsql/src/backend/utils/adt/datetime.c 2008/02/25 23:21:22 1.160.2.5 --- pgsql/src/backend/utils/adt/datetime.c 2008/06/09 19:34:24 1.160.2.6 *************** *** 8,14 **** * * * IDENTIFICATION ! * $PostgreSQL: pgsql/src/backend/utils/adt/datetime.c,v 1.160.2.4 2008/01/02 22:05:21 tgl Exp $ * *------------------------------------------------------------------------- */ --- 8,14 ---- * * * IDENTIFICATION ! * $PostgreSQL: pgsql/src/backend/utils/adt/datetime.c,v 1.160.2.5 2008/02/25 23:21:22 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, *** 1017,1023 **** return DTERR_BAD_FORMAT; errno = 0; ! val = strtol(field[i], &cp, 10); if (errno == ERANGE) return DTERR_FIELD_OVERFLOW; --- 1034,1040 ---- return DTERR_BAD_FORMAT; errno = 0; ! val = strtoi(field[i], &cp, 10); if (errno == ERANGE) return DTERR_FIELD_OVERFLOW; *************** DecodeDateTime(char **field, int *ftype, *** 1166,1172 **** int val; errno = 0; ! val = strtol(field[i], &cp, 10); if (errno == ERANGE) return DTERR_FIELD_OVERFLOW; --- 1183,1189 ---- int val; errno = 0; ! val = strtoi(field[i], &cp, 10); if (errno == ERANGE) return DTERR_FIELD_OVERFLOW; *************** DecodeTimeOnly(char **field, int *ftype, *** 1885,1891 **** } errno = 0; ! val = strtol(field[i], &cp, 10); if (errno == ERANGE) return DTERR_FIELD_OVERFLOW; --- 1902,1908 ---- } errno = 0; ! val = strtoi(field[i], &cp, 10); if (errno == ERANGE) return DTERR_FIELD_OVERFLOW; *************** DecodeTime(char *str, int fmask, int *tm *** 2462,2475 **** *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') --- 2479,2492 ---- *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 *** 2483,2489 **** { str = cp + 1; errno = 0; ! tm->tm_sec = strtol(str, &cp, 10); if (errno == ERANGE) return DTERR_FIELD_OVERFLOW; if (*cp == '\0') --- 2500,2506 ---- { 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 *** 2537,2543 **** *tmask = 0; errno = 0; ! val = strtol(str, &cp, 10); if (errno == ERANGE) return DTERR_FIELD_OVERFLOW; if (cp == str) --- 2554,2560 ---- *tmask = 0; errno = 0; ! val = strtoi(str, &cp, 10); if (errno == ERANGE) return DTERR_FIELD_OVERFLOW; if (cp == str) *************** DecodeTimezone(char *str, int *tzp) *** 2827,2833 **** return DTERR_BAD_FORMAT; errno = 0; ! hr = strtol(str + 1, &cp, 10); if (errno == ERANGE) return DTERR_TZDISP_OVERFLOW; --- 2844,2850 ---- return DTERR_BAD_FORMAT; errno = 0; ! hr = strtoi(str + 1, &cp, 10); if (errno == ERANGE) return DTERR_TZDISP_OVERFLOW; *************** DecodeTimezone(char *str, int *tzp) *** 2835,2841 **** if (*cp == ':') { errno = 0; ! min = strtol(cp + 1, &cp, 10); if (errno == ERANGE) return DTERR_TZDISP_OVERFLOW; } --- 2852,2858 ---- if (*cp == ':') { errno = 0; ! min = strtoi(cp + 1, &cp, 10); if (errno == ERANGE) return DTERR_TZDISP_OVERFLOW; } *************** DecodeInterval(char **field, int *ftype, *** 3082,3088 **** case DTK_DATE: case DTK_NUMBER: errno = 0; ! val = strtol(field[i], &cp, 10); if (errno == ERANGE) return DTERR_FIELD_OVERFLOW; --- 3099,3105 ---- case DTK_DATE: case DTK_NUMBER: errno = 0; ! val = strtoi(field[i], &cp, 10); if (errno == ERANGE) return DTERR_FIELD_OVERFLOW;