diff --git a/src/halfvec.c b/src/halfvec.c index d5fbf53..95c2067 100644 --- a/src/halfvec.c +++ b/src/halfvec.c @@ -435,6 +435,8 @@ halfvec_in(PG_FUNCTION_ARGS) while (pt != NULL && *stringEnd != ']') { + float val; + if (dim == HALFVEC_MAX_DIM) ereport(ERROR, (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED), @@ -450,15 +452,24 @@ halfvec_in(PG_FUNCTION_ARGS) errmsg("invalid input syntax for type halfvec: \"%s\"", lit))); /* Use strtof like float4in to avoid a double-rounding problem */ - x[dim] = Float4ToHalf(strtof(pt, &stringEnd)); - CheckElement(x[dim]); - dim++; + errno = 0; + val = strtof(pt, &stringEnd); if (stringEnd == pt) ereport(ERROR, (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION), errmsg("invalid input syntax for type halfvec: \"%s\"", lit))); + x[dim] = Float4ToHalfUnchecked(val); + + if ((errno == ERANGE && isinf(val)) || (HalfIsInf(x[dim]) && !isinf(val)) || (HalfIsZero(x[dim]) && val != 0)) + ereport(ERROR, + (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE), + errmsg("\"%s\" is out of range for type halfvec", pt))); + + CheckElement(x[dim]); + dim++; + while (halfvec_isspace(*stringEnd)) stringEnd++; diff --git a/test/expected/halfvec_input.out b/test/expected/halfvec_input.out index 169bd6c..76eab16 100644 --- a/test/expected/halfvec_input.out +++ b/test/expected/halfvec_input.out @@ -51,15 +51,15 @@ SELECT '[65519,-65519]'::halfvec; (1 row) SELECT '[65520,-65520]'::halfvec; -ERROR: value out of range: overflow +ERROR: "65520" is out of range for type halfvec LINE 1: SELECT '[65520,-65520]'::halfvec; ^ SELECT '[1e-8,-1e-8]'::halfvec; -ERROR: value out of range: underflow +ERROR: "1e-8" is out of range for type halfvec LINE 1: SELECT '[1e-8,-1e-8]'::halfvec; ^ SELECT '[4e38,1]'::halfvec; -ERROR: infinite value not allowed in halfvec +ERROR: "4e38" is out of range for type halfvec LINE 1: SELECT '[4e38,1]'::halfvec; ^ SELECT '[1,2,3'::halfvec;