8
8
*
9
9
*
10
10
* 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 $
12
12
*
13
13
*-------------------------------------------------------------------------
14
14
*/
@@ -255,6 +255,23 @@ static const datetkn *datecache[MAXDATEFIELDS] = {NULL};
255
255
static const datetkn * deltacache [MAXDATEFIELDS ] = {NULL };
256
256
257
257
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
+
258
275
/*
259
276
* Calendar time to Julian date conversions.
260
277
* Julian date is commonly used in astronomical applications,
@@ -708,7 +725,7 @@ DecodeDateTime(char **field, int *ftype, int nf,
708
725
return DTERR_BAD_FORMAT ;
709
726
710
727
errno = 0 ;
711
- val = strtol (field [i ], & cp , 10 );
728
+ val = strtoi (field [i ], & cp , 10 );
712
729
if (errno == ERANGE )
713
730
return DTERR_FIELD_OVERFLOW ;
714
731
@@ -856,7 +873,7 @@ DecodeDateTime(char **field, int *ftype, int nf,
856
873
int val ;
857
874
858
875
errno = 0 ;
859
- val = strtol (field [i ], & cp , 10 );
876
+ val = strtoi (field [i ], & cp , 10 );
860
877
if (errno == ERANGE )
861
878
return DTERR_FIELD_OVERFLOW ;
862
879
@@ -1591,7 +1608,7 @@ DecodeTimeOnly(char **field, int *ftype, int nf,
1591
1608
}
1592
1609
1593
1610
errno = 0 ;
1594
- val = strtol (field [i ], & cp , 10 );
1611
+ val = strtoi (field [i ], & cp , 10 );
1595
1612
if (errno == ERANGE )
1596
1613
return DTERR_FIELD_OVERFLOW ;
1597
1614
@@ -2214,14 +2231,14 @@ DecodeTime(char *str, int fmask, int *tmask, struct pg_tm * tm, fsec_t *fsec)
2214
2231
* tmask = DTK_TIME_M ;
2215
2232
2216
2233
errno = 0 ;
2217
- tm -> tm_hour = strtol (str , & cp , 10 );
2234
+ tm -> tm_hour = strtoi (str , & cp , 10 );
2218
2235
if (errno == ERANGE )
2219
2236
return DTERR_FIELD_OVERFLOW ;
2220
2237
if (* cp != ':' )
2221
2238
return DTERR_BAD_FORMAT ;
2222
2239
str = cp + 1 ;
2223
2240
errno = 0 ;
2224
- tm -> tm_min = strtol (str , & cp , 10 );
2241
+ tm -> tm_min = strtoi (str , & cp , 10 );
2225
2242
if (errno == ERANGE )
2226
2243
return DTERR_FIELD_OVERFLOW ;
2227
2244
if (* cp == '\0' )
@@ -2235,7 +2252,7 @@ DecodeTime(char *str, int fmask, int *tmask, struct pg_tm * tm, fsec_t *fsec)
2235
2252
{
2236
2253
str = cp + 1 ;
2237
2254
errno = 0 ;
2238
- tm -> tm_sec = strtol (str , & cp , 10 );
2255
+ tm -> tm_sec = strtoi (str , & cp , 10 );
2239
2256
if (errno == ERANGE )
2240
2257
return DTERR_FIELD_OVERFLOW ;
2241
2258
if (* cp == '\0' )
@@ -2289,7 +2306,7 @@ DecodeNumber(int flen, char *str, bool haveTextMonth, int fmask,
2289
2306
* tmask = 0 ;
2290
2307
2291
2308
errno = 0 ;
2292
- val = strtol (str , & cp , 10 );
2309
+ val = strtoi (str , & cp , 10 );
2293
2310
if (errno == ERANGE )
2294
2311
return DTERR_FIELD_OVERFLOW ;
2295
2312
if (cp == str )
@@ -2580,21 +2597,21 @@ DecodeTimezone(char *str, int *tzp)
2580
2597
return DTERR_BAD_FORMAT ;
2581
2598
2582
2599
errno = 0 ;
2583
- hr = strtol (str + 1 , & cp , 10 );
2600
+ hr = strtoi (str + 1 , & cp , 10 );
2584
2601
if (errno == ERANGE )
2585
2602
return DTERR_TZDISP_OVERFLOW ;
2586
2603
2587
2604
/* explicit delimiter? */
2588
2605
if (* cp == ':' )
2589
2606
{
2590
2607
errno = 0 ;
2591
- min = strtol (cp + 1 , & cp , 10 );
2608
+ min = strtoi (cp + 1 , & cp , 10 );
2592
2609
if (errno == ERANGE )
2593
2610
return DTERR_TZDISP_OVERFLOW ;
2594
2611
if (* cp == ':' )
2595
2612
{
2596
2613
errno = 0 ;
2597
- sec = strtol (cp + 1 , & cp , 10 );
2614
+ sec = strtoi (cp + 1 , & cp , 10 );
2598
2615
if (errno == ERANGE )
2599
2616
return DTERR_TZDISP_OVERFLOW ;
2600
2617
}
@@ -2784,7 +2801,7 @@ DecodeInterval(char **field, int *ftype, int nf, int *dtype, struct pg_tm * tm,
2784
2801
case DTK_DATE :
2785
2802
case DTK_NUMBER :
2786
2803
errno = 0 ;
2787
- val = strtol (field [i ], & cp , 10 );
2804
+ val = strtoi (field [i ], & cp , 10 );
2788
2805
if (errno == ERANGE )
2789
2806
return DTERR_FIELD_OVERFLOW ;
2790
2807
0 commit comments