Work around buggy strtod on (some versions of?) IRIX. Combination of
authorTom Lane <tgl@sss.pgh.pa.us>
Thu, 5 Oct 2006 01:40:45 +0000 (01:40 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Thu, 5 Oct 2006 01:40:45 +0000 (01:40 +0000)
proposed patches from John Jorgensen and Steve Singer.

src/backend/utils/adt/float.c
src/include/port/irix.h

index c4fbe89455ca82d9baa58fa0e6f0dd29cc844e72..161e02ba27303ddf8f52c87bbe76a650b1c01f68 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/utils/adt/float.c,v 1.129 2006/10/04 00:29:58 momjian Exp $
+ *       $PostgreSQL: pgsql/src/backend/utils/adt/float.c,v 1.130 2006/10/05 01:40:45 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -328,6 +328,32 @@ float4in(PG_FUNCTION_ARGS)
        }
 #endif   /* HAVE_BUGGY_SOLARIS_STRTOD */
 
+#ifdef HAVE_BUGGY_IRIX_STRTOD
+       /*
+        * In some IRIX versions, strtod() recognizes only "inf", so if the
+        * input is "infinity" we have to skip over "inity".  Also, it may
+        * return positive infinity for "-inf".
+        */
+       if (isinf(val))
+       {
+               if (pg_strncasecmp(num, "Infinity", 8) == 0)
+               {
+                       val = get_float4_infinity();
+                       endptr = num + 8;
+               }
+               else if (pg_strncasecmp(num, "-Infinity", 9) == 0)
+               {
+                       val = -get_float4_infinity();
+                       endptr = num + 9;
+               }
+               else if (pg_strncasecmp(num, "-inf", 4) == 0)
+               {
+                       val = -get_float4_infinity();
+                       endptr = num + 4;
+               }
+       }
+#endif /* HAVE_BUGGY_IRIX_STRTOD */
+
        /* skip trailing whitespace */
        while (*endptr != '\0' && isspace((unsigned char) *endptr))
                endptr++;
@@ -495,6 +521,32 @@ float8in(PG_FUNCTION_ARGS)
        }
 #endif   /* HAVE_BUGGY_SOLARIS_STRTOD */
 
+#ifdef HAVE_BUGGY_IRIX_STRTOD
+       /*
+        * In some IRIX versions, strtod() recognizes only "inf", so if the
+        * input is "infinity" we have to skip over "inity".  Also, it may
+        * return positive infinity for "-inf".
+        */
+       if (isinf(val))
+       {
+               if (pg_strncasecmp(num, "Infinity", 8) == 0)
+               {
+                       val = get_float8_infinity();
+                       endptr = num + 8;
+               }
+               else if (pg_strncasecmp(num, "-Infinity", 9) == 0)
+               {
+                       val = -get_float8_infinity();
+                       endptr = num + 9;
+               }
+               else if (pg_strncasecmp(num, "-inf", 4) == 0)
+               {
+                       val = -get_float8_infinity();
+                       endptr = num + 4;
+               }
+       }
+#endif /* HAVE_BUGGY_IRIX_STRTOD */
+
        /* skip trailing whitespace */
        while (*endptr != '\0' && isspace((unsigned char) *endptr))
                endptr++;
index 9f1a4123455ed8a019020c7f33042e9dba83f55c..e3e279ad1c6649e25996e0168d29d7ff8e62b855 100644 (file)
@@ -1 +1,7 @@
-/* $PostgreSQL: pgsql/src/include/port/irix.h,v 1.3 2006/03/11 04:38:38 momjian Exp $ */
+/* $PostgreSQL: pgsql/src/include/port/irix.h,v 1.4 2006/10/05 01:40:45 tgl Exp $ */
+
+/*
+ * IRIX 6.5.26f and 6.5.22f (at least) have a strtod() that accepts
+ * "infinity", but leaves endptr pointing to "inity".
+ */
+#define HAVE_BUGGY_IRIX_STRTOD