OSDN Git Service

The pg_atoi() function uses strtol() to convert the string to numbers. Some
authorBruce Momjian <bruce@momjian.us>
Sat, 12 Sep 1998 16:04:35 +0000 (16:04 +0000)
committerBruce Momjian <bruce@momjian.us>
Sat, 12 Sep 1998 16:04:35 +0000 (16:04 +0000)
implementations of strtol() treat empty strings ("") as invalid arguments
while others convert this (erroneously, IHMO) to zero (0).  Assuming that the
expected behaviour of pg_atoi() is to return 0 if it is passed an empty
string, I am supplying the following patch to explictly check for an empty
string in pg_atoi() and return 0 if the string is empty.  The patch will also
trap a NULL character pointer being passed to pg_atoi() and will use elog() to
print out an error message if the input char pointer is NULL.

Billy G. Allie

src/backend/utils/adt/numutils.c

index b30b2fe..2dd6e5d 100644 (file)
@@ -10,7 +10,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/utils/adt/numutils.c,v 1.26 1998/09/01 04:32:43 momjian Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/utils/adt/numutils.c,v 1.27 1998/09/12 16:04:35 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -55,8 +55,19 @@ pg_atoi(char *s, int size, int c)
 
        Assert(s);
 
-       errno = 0;
-       l = strtol(s, &badp, 10);
+       errno = 0;
+
+       /*
+        * Some versions of strtol treat the empty string as an error.  This
+        * code will explicitly return 0 for an empty string.
+        */
+
+       if (s == (char *)NULL)
+               elog(ERROR, "pg_atoi: NULL pointer!");
+       else if (*s == 0)
+               l = (long)0;
+       else
+               l = strtol(s, &badp, 10);
        if (errno)                                      /* strtol must set ERANGE */
                elog(ERROR, "pg_atoi: error reading \"%s\": %m", s);
        if (badp && *badp && (*badp != c))