diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2006-10-05 01:40:45 +0000 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2006-10-05 01:40:45 +0000 |
commit | b2c04d5e6bced78947cec4e83905ea3e64476b85 (patch) | |
tree | edde5e06d5d99b42f4f33fb060d662c7ff2bf7da /src/backend/utils/adt/float.c | |
parent | 9e6c3582dda50fe1aa639203358864ca6cb2914b (diff) | |
download | postgresql-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.c | 54 |
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++; |