diff --git a/src/backend/utils/adt/float.c b/src/backend/utils/adt/float.c index 42239cced021066975358312035c975e93205a9d..da8ed2e29d423d26a0271932fb54dc45620ba5d2 100644 --- a/src/backend/utils/adt/float.c +++ b/src/backend/utils/adt/float.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/utils/adt/float.c,v 1.72 2001/06/02 17:12:12 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/utils/adt/float.c,v 1.73 2001/06/02 20:18:30 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -199,8 +199,15 @@ float4in(PG_FUNCTION_ARGS) val = strtod(num, &endptr); if (*endptr != '\0') { - /* Shouldn't we accept "NaN" or "Infinity" for float4? */ - elog(ERROR, "Bad float4 input format '%s'", num); + /* + * XXX we should accept "Infinity" and "-Infinity" too, but what + * are the correct values to assign? HUGE_VAL will provoke an + * error from CheckFloat4Val. + */ + if (strcasecmp(num, "NaN") == 0) + val = NAN; + else + elog(ERROR, "Bad float4 input format '%s'", num); } else { @@ -226,11 +233,15 @@ float4out(PG_FUNCTION_ARGS) { float4 num = PG_GETARG_FLOAT4(0); char *ascii = (char *) palloc(MAXFLOATWIDTH + 1); + int infflag; if (isnan(num)) PG_RETURN_CSTRING(strcpy(ascii, "NaN")); - if (isinf(num)) + infflag = isinf(num); + if (infflag > 0) PG_RETURN_CSTRING(strcpy(ascii, "Infinity")); + if (infflag < 0) + PG_RETURN_CSTRING(strcpy(ascii, "-Infinity")); sprintf(ascii, "%.*g", FLT_DIG, num); PG_RETURN_CSTRING(ascii); @@ -258,6 +269,8 @@ float8in(PG_FUNCTION_ARGS) val = NAN; else if (strcasecmp(num, "Infinity") == 0) val = HUGE_VAL; + else if (strcasecmp(num, "-Infinity") == 0) + val = -HUGE_VAL; else elog(ERROR, "Bad float8 input format '%s'", num); } @@ -282,11 +295,15 @@ float8out(PG_FUNCTION_ARGS) { float8 num = PG_GETARG_FLOAT8(0); char *ascii = (char *) palloc(MAXDOUBLEWIDTH + 1); + int infflag; if (isnan(num)) PG_RETURN_CSTRING(strcpy(ascii, "NaN")); - if (isinf(num)) + infflag = isinf(num); + if (infflag > 0) PG_RETURN_CSTRING(strcpy(ascii, "Infinity")); + if (infflag < 0) + PG_RETURN_CSTRING(strcpy(ascii, "-Infinity")); sprintf(ascii, "%.*g", DBL_DIG, num); PG_RETURN_CSTRING(ascii);