aboutsummaryrefslogtreecommitdiff
path: root/src/backend/utils/adt/float.c
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2006-10-05 01:40:45 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2006-10-05 01:40:45 +0000
commitb2c04d5e6bced78947cec4e83905ea3e64476b85 (patch)
treeedde5e06d5d99b42f4f33fb060d662c7ff2bf7da /src/backend/utils/adt/float.c
parent9e6c3582dda50fe1aa639203358864ca6cb2914b (diff)
downloadpostgresql-b2c04d5e6bced78947cec4e83905ea3e64476b85.tar.gz
postgresql-b2c04d5e6bced78947cec4e83905ea3e64476b85.zip
Work around buggy strtod on (some versions of?) IRIX. Combination of
proposed patches from John Jorgensen and Steve Singer.
Diffstat (limited to 'src/backend/utils/adt/float.c')
-rw-r--r--src/backend/utils/adt/float.c54
1 files changed, 53 insertions, 1 deletions
diff --git a/src/backend/utils/adt/float.c b/src/backend/utils/adt/float.c
index c4fbe89455c..161e02ba273 100644
--- a/src/backend/utils/adt/float.c
+++ b/src/backend/utils/adt/float.c
@@ -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++;