diff --git a/src/vector.c b/src/vector.c index c3871ea..1f5ec89 100644 --- a/src/vector.c +++ b/src/vector.c @@ -200,6 +200,8 @@ vector_in(PG_FUNCTION_ARGS) while (pt != NULL && *stringEnd != ']') { + float val; + if (dim == VECTOR_MAX_DIM) ereport(ERROR, (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED), @@ -215,15 +217,23 @@ vector_in(PG_FUNCTION_ARGS) errmsg("invalid input syntax for type vector: \"%s\"", lit))); /* Use strtof like float4in to avoid a double-rounding problem */ - x[dim] = 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 vector: \"%s\"", lit))); + /* Check for range error like float4in */ + if (errno == ERANGE && isinf(val)) + ereport(ERROR, + (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE), + errmsg("\"%s\" is out of range for type vector", pt))); + + CheckElement(val); + x[dim++] = val; + while (vector_isspace(*stringEnd)) stringEnd++; diff --git a/test/expected/vector_input.out b/test/expected/vector_input.out index 6a6bc77..920012d 100644 --- a/test/expected/vector_input.out +++ b/test/expected/vector_input.out @@ -63,11 +63,11 @@ SELECT '[1.5e-38,-1.5e-38]'::vector; (1 row) SELECT '[4e38,1]'::vector; -ERROR: infinite value not allowed in vector +ERROR: "4e38" is out of range for type vector LINE 1: SELECT '[4e38,1]'::vector; ^ SELECT '[-4e38,1]'::vector; -ERROR: infinite value not allowed in vector +ERROR: "-4e38" is out of range for type vector LINE 1: SELECT '[-4e38,1]'::vector; ^ SELECT '[1e-46,1]'::vector;