From 060d299e4bfc8d9924b67ab6da4d350c8d6b4dd8 Mon Sep 17 00:00:00 2001 From: Andrew Kane Date: Wed, 3 Apr 2024 10:12:17 -0700 Subject: [PATCH] Improved error message for out of range elements --- src/vector.c | 16 +++++++++++++--- test/expected/vector_input.out | 4 ++-- 2 files changed, 15 insertions(+), 5 deletions(-) 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;