aboutsummaryrefslogtreecommitdiff
path: root/src/backend/utils/adt/float.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/utils/adt/float.c')
-rw-r--r--src/backend/utils/adt/float.c121
1 files changed, 75 insertions, 46 deletions
diff --git a/src/backend/utils/adt/float.c b/src/backend/utils/adt/float.c
index f9c4894794f..2707c83fd62 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.97 2004/03/04 21:47:18 neilc Exp $
+ * $PostgreSQL: pgsql/src/backend/utils/adt/float.c,v 1.98 2004/03/11 02:11:13 neilc Exp $
*
*-------------------------------------------------------------------------
*/
@@ -185,14 +185,37 @@ float4in(PG_FUNCTION_ARGS)
errno = 0;
val = strtod(num, &endptr);
- if (*endptr != '\0')
+
+ if (errno == ERANGE)
+ ereport(ERROR,
+ (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+ errmsg("\"%s\" is out of range for type real", num)));
+
+ if (num == endptr)
{
/*
- * XXX we should accept "Infinity" and "-Infinity" too, but what
- * are the correct values to assign? HUGE_VAL will provoke an
- * error from CheckFloat4Val.
+ * We didn't find anything that looks like a float in the input
+ *
+ * In releases prior to 7.5, we accepted an empty string as
+ * valid input (yielding a float8 of 0). In 7.5, we accept
+ * empty strings, but emit a warning noting that the feature
+ * is deprecated. In 7.6+, the warning should be replaced by
+ * an error.
+ *
+ * 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)
+ if (*num == '\0')
+ {
+ ereport(WARNING,
+ (errcode(ERRCODE_WARNING_DEPRECATED_FEATURE),
+ errmsg("deprecated input syntax for type real: \"\""),
+ errdetail("This input will be rejected in "
+ "a future release of PostgreSQL.")));
+ Assert(val == 0.0);
+ }
+ else if (strcasecmp(num, "NaN") == 0)
val = NAN;
else
ereport(ERROR,
@@ -200,26 +223,17 @@ float4in(PG_FUNCTION_ARGS)
errmsg("invalid input syntax for type real: \"%s\"",
num)));
}
- else
- {
- if (errno == ERANGE)
- ereport(ERROR,
- (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
- errmsg("\"%s\" is out of range for type real", num)));
- }
- /*
- * In releases prior to 7.5, we accepted an empty string as valid
- * input (yielding a float4 of 0). In 7.5, we accept empty
- * strings, but emit a warning noting that the feature is
- * deprecated. In 7.6+, the warning should be replaced by an error.
- */
- if (num == endptr)
- ereport(WARNING,
- (errcode(ERRCODE_WARNING_DEPRECATED_FEATURE),
- errmsg("deprecated input syntax for type real: \"\""),
- errdetail("This input will be rejected in "
- "a future release of PostgreSQL.")));
+ /* skip trailing whitespace */
+ while (*endptr != '\0' && isspace(*endptr))
+ endptr++;
+
+ /* if there is any junk left at the end of the string, bail out */
+ if (*endptr != '\0')
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("invalid input syntax for type real: \"%s\"",
+ num)));
/*
* if we get here, we have a legal double, still need to check to see
@@ -300,9 +314,33 @@ float8in(PG_FUNCTION_ARGS)
errno = 0;
val = strtod(num, &endptr);
- if (*endptr != '\0')
+
+ if (errno == ERANGE)
+ ereport(ERROR,
+ (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+ errmsg("\"%s\" is out of range for type double precision", num)));
+
+ if (num == endptr)
{
- if (strcasecmp(num, "NaN") == 0)
+ /*
+ * We didn't find anything that looks like a float in the input
+ *
+ * In releases prior to 7.5, we accepted an empty string as
+ * valid input (yielding a float8 of 0). In 7.5, we accept
+ * empty strings, but emit a warning noting that the feature
+ * is deprecated. In 7.6+, the warning should be replaced by
+ * an error.
+ */
+ if (*num == '\0')
+ {
+ ereport(WARNING,
+ (errcode(ERRCODE_WARNING_DEPRECATED_FEATURE),
+ errmsg("deprecated input syntax for type double precision: \"\""),
+ errdetail("This input will be rejected in "
+ "a future release of PostgreSQL.")));
+ Assert(val == 0.0);
+ }
+ else if (strcasecmp(num, "NaN") == 0)
val = NAN;
else if (strcasecmp(num, "Infinity") == 0)
val = HUGE_VAL;
@@ -314,26 +352,17 @@ float8in(PG_FUNCTION_ARGS)
errmsg("invalid input syntax for type double precision: \"%s\"",
num)));
}
- else
- {
- if (errno == ERANGE)
- ereport(ERROR,
- (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
- errmsg("\"%s\" is out of range for type double precision", num)));
- }
- /*
- * In releases prior to 7.5, we accepted an empty string as valid
- * input (yielding a float8 of 0). In 7.5, we accept empty
- * strings, but emit a warning noting that the feature is
- * deprecated. In 7.6+, the warning should be replaced by an error.
- */
- if (num == endptr)
- ereport(WARNING,
- (errcode(ERRCODE_WARNING_DEPRECATED_FEATURE),
- errmsg("deprecated input syntax for type double precision: \"\""),
- errdetail("This input will be rejected in "
- "a future release of PostgreSQL.")));
+ /* skip trailing whitespace */
+ while (*endptr != '\0' && isspace(*endptr))
+ endptr++;
+
+ /* if there is any junk left at the end of the string, bail out */
+ if (*endptr != '\0')
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+ errmsg("invalid input syntax for type double precision: \"%s\"",
+ num)));
CheckFloat8Val(val);