diff --git a/src/vector.c b/src/vector.c index 5f3cbbb..ad56ffe 100644 --- a/src/vector.c +++ b/src/vector.c @@ -197,6 +197,8 @@ vector_in(PG_FUNCTION_ARGS) while (pt != NULL && *stringEnd != ']') { + float val; + if (dim == VECTOR_MAX_DIM) ereport(ERROR, (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED), @@ -212,15 +214,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 && (val == 0 || 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/input.out b/test/expected/input.out index 25388f8..f2f0d0c 100644 --- a/test/expected/input.out +++ b/test/expected/input.out @@ -63,9 +63,21 @@ 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: "-4e38" is out of range for type vector +LINE 1: SELECT '[-4e38,1]'::vector; + ^ +SELECT '[1e-46,1]'::vector; +ERROR: "1e-46" is out of range for type vector +LINE 1: SELECT '[1e-46,1]'::vector; + ^ +SELECT '[-1e-46,1]'::vector; +ERROR: "-1e-46" is out of range for type vector +LINE 1: SELECT '[-1e-46,1]'::vector; + ^ SELECT '[1,2,3'::vector; ERROR: malformed vector literal: "[1,2,3" LINE 1: SELECT '[1,2,3'::vector; diff --git a/test/sql/input.sql b/test/sql/input.sql index 8a7a708..d1d70da 100644 --- a/test/sql/input.sql +++ b/test/sql/input.sql @@ -11,6 +11,9 @@ SELECT '[1.5e38,-1.5e38]'::vector; SELECT '[1.5e+38,-1.5e+38]'::vector; SELECT '[1.5e-38,-1.5e-38]'::vector; SELECT '[4e38,1]'::vector; +SELECT '[-4e38,1]'::vector; +SELECT '[1e-46,1]'::vector; +SELECT '[-1e-46,1]'::vector; SELECT '[1,2,3'::vector; SELECT '[1,2,3]9'::vector; SELECT '1,2,3'::vector;