88 *
99 *
1010 * IDENTIFICATION
11- * $PostgreSQL: pgsql/src/backend/utils/adt/datetime.c,v 1.189 2008/05/12 00:00:51 alvherre Exp $
11+ * $PostgreSQL: pgsql/src/backend/utils/adt/datetime.c,v 1.190 2008/06/09 19:34:02 tgl Exp $
1212 *
1313 *-------------------------------------------------------------------------
1414 */
@@ -255,6 +255,23 @@ static const datetkn *datecache[MAXDATEFIELDS] = {NULL};
255255static const datetkn * deltacache [MAXDATEFIELDS ]= {NULL };
256256
257257
258+ /*
259+ * strtoi --- just like strtol, but returns int not long
260+ */
261+ static int
262+ strtoi (const char * nptr ,char * * endptr ,int base )
263+ {
264+ long val ;
265+
266+ val = strtol (nptr ,endptr ,base );
267+ #ifdef HAVE_LONG_INT_64
268+ if (val != (long ) ((int32 )val ))
269+ errno = ERANGE ;
270+ #endif
271+ return (int )val ;
272+ }
273+
274+
258275/*
259276 * Calendar time to Julian date conversions.
260277 * Julian date is commonly used in astronomical applications,
@@ -708,7 +725,7 @@ DecodeDateTime(char **field, int *ftype, int nf,
708725return DTERR_BAD_FORMAT ;
709726
710727errno = 0 ;
711- val = strtol (field [i ],& cp ,10 );
728+ val = strtoi (field [i ],& cp ,10 );
712729if (errno == ERANGE )
713730return DTERR_FIELD_OVERFLOW ;
714731
@@ -856,7 +873,7 @@ DecodeDateTime(char **field, int *ftype, int nf,
856873int val ;
857874
858875errno = 0 ;
859- val = strtol (field [i ],& cp ,10 );
876+ val = strtoi (field [i ],& cp ,10 );
860877if (errno == ERANGE )
861878return DTERR_FIELD_OVERFLOW ;
862879
@@ -1591,7 +1608,7 @@ DecodeTimeOnly(char **field, int *ftype, int nf,
15911608}
15921609
15931610errno = 0 ;
1594- val = strtol (field [i ],& cp ,10 );
1611+ val = strtoi (field [i ],& cp ,10 );
15951612if (errno == ERANGE )
15961613return DTERR_FIELD_OVERFLOW ;
15971614
@@ -2214,14 +2231,14 @@ DecodeTime(char *str, int fmask, int *tmask, struct pg_tm * tm, fsec_t *fsec)
22142231* tmask = DTK_TIME_M ;
22152232
22162233errno = 0 ;
2217- tm -> tm_hour = strtol (str ,& cp ,10 );
2234+ tm -> tm_hour = strtoi (str ,& cp ,10 );
22182235if (errno == ERANGE )
22192236return DTERR_FIELD_OVERFLOW ;
22202237if (* cp != ':' )
22212238return DTERR_BAD_FORMAT ;
22222239str = cp + 1 ;
22232240errno = 0 ;
2224- tm -> tm_min = strtol (str ,& cp ,10 );
2241+ tm -> tm_min = strtoi (str ,& cp ,10 );
22252242if (errno == ERANGE )
22262243return DTERR_FIELD_OVERFLOW ;
22272244if (* cp == '\0' )
@@ -2235,7 +2252,7 @@ DecodeTime(char *str, int fmask, int *tmask, struct pg_tm * tm, fsec_t *fsec)
22352252{
22362253str = cp + 1 ;
22372254errno = 0 ;
2238- tm -> tm_sec = strtol (str ,& cp ,10 );
2255+ tm -> tm_sec = strtoi (str ,& cp ,10 );
22392256if (errno == ERANGE )
22402257return DTERR_FIELD_OVERFLOW ;
22412258if (* cp == '\0' )
@@ -2289,7 +2306,7 @@ DecodeNumber(int flen, char *str, bool haveTextMonth, int fmask,
22892306* tmask = 0 ;
22902307
22912308errno = 0 ;
2292- val = strtol (str ,& cp ,10 );
2309+ val = strtoi (str ,& cp ,10 );
22932310if (errno == ERANGE )
22942311return DTERR_FIELD_OVERFLOW ;
22952312if (cp == str )
@@ -2580,21 +2597,21 @@ DecodeTimezone(char *str, int *tzp)
25802597return DTERR_BAD_FORMAT ;
25812598
25822599errno = 0 ;
2583- hr = strtol (str + 1 ,& cp ,10 );
2600+ hr = strtoi (str + 1 ,& cp ,10 );
25842601if (errno == ERANGE )
25852602return DTERR_TZDISP_OVERFLOW ;
25862603
25872604/* explicit delimiter? */
25882605if (* cp == ':' )
25892606{
25902607errno = 0 ;
2591- min = strtol (cp + 1 ,& cp ,10 );
2608+ min = strtoi (cp + 1 ,& cp ,10 );
25922609if (errno == ERANGE )
25932610return DTERR_TZDISP_OVERFLOW ;
25942611if (* cp == ':' )
25952612{
25962613errno = 0 ;
2597- sec = strtol (cp + 1 ,& cp ,10 );
2614+ sec = strtoi (cp + 1 ,& cp ,10 );
25982615if (errno == ERANGE )
25992616return DTERR_TZDISP_OVERFLOW ;
26002617}
@@ -2784,7 +2801,7 @@ DecodeInterval(char **field, int *ftype, int nf, int *dtype, struct pg_tm * tm,
27842801case DTK_DATE :
27852802case DTK_NUMBER :
27862803errno = 0 ;
2787- val = strtol (field [i ],& cp ,10 );
2804+ val = strtoi (field [i ],& cp ,10 );
27882805if (errno == ERANGE )
27892806return DTERR_FIELD_OVERFLOW ;
27902807