pgvector.git / summary / log / commit / refs
commit b2a525960713a30b83ac6d994b971281ab1c1937
Author: Andrew Kane <andrew@ankane.org>
Date: Wed Apr 24 16:56:09 2024 +0000
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 556e7dc5..3dd13805 100644
--- a/src/sparsevec.c
+++ b/src/sparsevec.c
@@ -3,6 +3,7 @@
#include <limits.h>
#include <math.h>
+#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 a918fe9d..09a7889b 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 cbf793ec..dcbf38dd 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;
[parent: c198fd58ee2d]