diff --git a/src/backend/utils/adt/numeric.c b/src/backend/utils/adt/numeric.c index ddc44d5179..e871b94bb8 100644 --- a/src/backend/utils/adt/numeric.c +++ b/src/backend/utils/adt/numeric.c @@ -3139,6 +3139,7 @@ float8_numeric(PG_FUNCTION_ARGS) Numeric res; NumericVar result; char buf[DBL_DIG + 100]; + char *cp; if (isnan(val)) PG_RETURN_NUMERIC(make_result(&const_nan)); @@ -3148,7 +3149,14 @@ float8_numeric(PG_FUNCTION_ARGS) init_var(&result); /* Assume we need not worry about leading/trailing spaces */ - (void) set_var_from_str(buf, buf, &result); + cp = set_var_from_str(buf, buf, &result); + + /* We have to check if val is invalid actually. */ + if (*cp) + ereport(ERROR, + (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION), + errmsg("invalid input syntax for type %s: \"%s\"", + "numeric", buf))); res = make_result(&result); @@ -3205,6 +3213,7 @@ float4_numeric(PG_FUNCTION_ARGS) Numeric res; NumericVar result; char buf[FLT_DIG + 100]; + char *cp; if (isnan(val)) PG_RETURN_NUMERIC(make_result(&const_nan)); @@ -3214,7 +3223,14 @@ float4_numeric(PG_FUNCTION_ARGS) init_var(&result); /* Assume we need not worry about leading/trailing spaces */ - (void) set_var_from_str(buf, buf, &result); + cp = set_var_from_str(buf, buf, &result); + + /* We have to check if val is invalid actually. */ + if (*cp) + ereport(ERROR, + (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION), + errmsg("invalid input syntax for type %s: \"%s\"", + "numeric", buf))); res = make_result(&result);