mirror of
https://github.com/pgvector/pgvector.git
synced 2026-06-06 14:01:31 +08:00
Switched to strtoint for sparsevec input
This commit is contained in:
@@ -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 */
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user