From b2a525960713a30b83ac6d994b971281ab1c1937 Mon Sep 17 00:00:00 2001 From: Andrew Kane Date: Wed, 24 Apr 2024 09:56:09 -0700 Subject: [PATCH] Switched to strtoint for sparsevec input --- src/sparsevec.c | 16 +++++++++++----- test/expected/sparsevec_input.out | 18 +++++++++++++++++- test/sql/sparsevec_input.sql | 4 ++++ 3 files changed, 32 insertions(+), 6 deletions(-) diff --git a/src/sparsevec.c b/src/sparsevec.c index 556e7dc..3dd1380 100644 --- a/src/sparsevec.c +++ b/src/sparsevec.c @@ -3,6 +3,7 @@ #include #include +#include "common/string.h" #include "fmgr.h" #include "halfutils.h" #include "halfvec.h" @@ -243,7 +244,7 @@ sparsevec_in(PG_FUNCTION_ARGS) { for (;;) { - long index; + int index; float value; /* TODO Better error */ @@ -263,17 +264,17 @@ sparsevec_in(PG_FUNCTION_ARGS) /* Use similar logic as int2vectorin */ errno = 0; - index = strtol(pt, &stringEnd, 10); + index = strtoint(pt, &stringEnd, 10); if (stringEnd == pt) ereport(ERROR, (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION), errmsg("invalid input syntax for type sparsevec: \"%s\"", lit))); - if (errno == ERANGE || index < 1 || index > INT_MAX) + if (errno == ERANGE) ereport(ERROR, (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE), - errmsg("index \"%ld\" is out of range for type sparsevec", index))); + errmsg("index \"%s\" is out of range for type sparsevec", pnstrdup(pt, stringEnd - pt)))); pt = stringEnd; @@ -352,13 +353,18 @@ sparsevec_in(PG_FUNCTION_ARGS) /* Use similar logic as int2vectorin */ errno = 0; - dim = strtol(pt, &stringEnd, 10); + dim = strtoint(pt, &stringEnd, 10); if (stringEnd == pt) ereport(ERROR, (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION), errmsg("invalid input syntax for type sparsevec: \"%s\"", lit))); + if (errno == ERANGE) + ereport(ERROR, + (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE), + errmsg("dimensions \"%s\" is out of range for type sparsevec", pnstrdup(pt, stringEnd - pt)))); + pt = stringEnd; /* Only whitespace is allowed after the closing brace */ diff --git a/test/expected/sparsevec_input.out b/test/expected/sparsevec_input.out index a918fe9..09a7889 100644 --- a/test/expected/sparsevec_input.out +++ b/test/expected/sparsevec_input.out @@ -191,8 +191,24 @@ SELECT '{}/1000001'::sparsevec; ERROR: sparsevec cannot have more than 1000000 dimensions LINE 1: SELECT '{}/1000001'::sparsevec; ^ +SELECT '{}/2147483648'::sparsevec; +ERROR: dimensions "2147483648" is out of range for type sparsevec +LINE 1: SELECT '{}/2147483648'::sparsevec; + ^ +SELECT '{}/-2147483649'::sparsevec; +ERROR: dimensions "-2147483649" is out of range for type sparsevec +LINE 1: SELECT '{}/-2147483649'::sparsevec; + ^ +SELECT '{}/9223372036854775808'::sparsevec; +ERROR: dimensions "9223372036854775808" is out of range for type sparsevec +LINE 1: SELECT '{}/9223372036854775808'::sparsevec; + ^ +SELECT '{}/-9223372036854775809'::sparsevec; +ERROR: dimensions "-9223372036854775809" is out of range for type sparsevec +LINE 1: SELECT '{}/-9223372036854775809'::sparsevec; + ^ SELECT '{0:1}/1'::sparsevec; -ERROR: index "0" is out of range for type sparsevec +ERROR: index must be greater than zero LINE 1: SELECT '{0:1}/1'::sparsevec; ^ SELECT '{2:1}/1'::sparsevec; diff --git a/test/sql/sparsevec_input.sql b/test/sql/sparsevec_input.sql index cbf793e..dcbf38d 100644 --- a/test/sql/sparsevec_input.sql +++ b/test/sql/sparsevec_input.sql @@ -39,6 +39,10 @@ SELECT '{1:1,2:1,1:1}/2'::sparsevec; SELECT '{}/5'::sparsevec; SELECT '{}/-1'::sparsevec; SELECT '{}/1000001'::sparsevec; +SELECT '{}/2147483648'::sparsevec; +SELECT '{}/-2147483649'::sparsevec; +SELECT '{}/9223372036854775808'::sparsevec; +SELECT '{}/-9223372036854775809'::sparsevec; SELECT '{0:1}/1'::sparsevec; SELECT '{2:1}/1'::sparsevec;