mirror of
https://github.com/pgvector/pgvector.git
synced 2026-07-15 00:56:54 +08:00
Improved error messages for sparsevec input
This commit is contained in:
@@ -197,7 +197,7 @@ sparsevec_in(PG_FUNCTION_ARGS)
|
|||||||
{
|
{
|
||||||
char *lit = PG_GETARG_CSTRING(0);
|
char *lit = PG_GETARG_CSTRING(0);
|
||||||
int32 typmod = PG_GETARG_INT32(2);
|
int32 typmod = PG_GETARG_INT32(2);
|
||||||
int dim;
|
long dim;
|
||||||
char *pt = lit;
|
char *pt = lit;
|
||||||
char *stringEnd;
|
char *stringEnd;
|
||||||
SparseVector *result;
|
SparseVector *result;
|
||||||
@@ -244,7 +244,7 @@ sparsevec_in(PG_FUNCTION_ARGS)
|
|||||||
{
|
{
|
||||||
for (;;)
|
for (;;)
|
||||||
{
|
{
|
||||||
int index;
|
long index;
|
||||||
float value;
|
float value;
|
||||||
|
|
||||||
/* TODO Better error */
|
/* TODO Better error */
|
||||||
@@ -263,18 +263,17 @@ sparsevec_in(PG_FUNCTION_ARGS)
|
|||||||
errmsg("invalid input syntax for type sparsevec: \"%s\"", lit)));
|
errmsg("invalid input syntax for type sparsevec: \"%s\"", lit)));
|
||||||
|
|
||||||
/* Use similar logic as int2vectorin */
|
/* Use similar logic as int2vectorin */
|
||||||
errno = 0;
|
index = strtol(pt, &stringEnd, 10);
|
||||||
index = strtoint(pt, &stringEnd, 10);
|
|
||||||
|
|
||||||
if (stringEnd == pt)
|
if (stringEnd == pt)
|
||||||
ereport(ERROR,
|
ereport(ERROR,
|
||||||
(errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
|
(errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
|
||||||
errmsg("invalid input syntax for type sparsevec: \"%s\"", lit)));
|
errmsg("invalid input syntax for type sparsevec: \"%s\"", lit)));
|
||||||
|
|
||||||
if (errno == ERANGE)
|
if (index > INT_MAX)
|
||||||
ereport(ERROR,
|
index = INT_MAX;
|
||||||
(errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
|
else if (index < INT_MIN)
|
||||||
errmsg("index \"%s\" is out of range for type sparsevec", pnstrdup(pt, stringEnd - pt))));
|
index = INT_MIN;
|
||||||
|
|
||||||
pt = stringEnd;
|
pt = stringEnd;
|
||||||
|
|
||||||
@@ -352,18 +351,17 @@ sparsevec_in(PG_FUNCTION_ARGS)
|
|||||||
pt++;
|
pt++;
|
||||||
|
|
||||||
/* Use similar logic as int2vectorin */
|
/* Use similar logic as int2vectorin */
|
||||||
errno = 0;
|
dim = strtol(pt, &stringEnd, 10);
|
||||||
dim = strtoint(pt, &stringEnd, 10);
|
|
||||||
|
|
||||||
if (stringEnd == pt)
|
if (stringEnd == pt)
|
||||||
ereport(ERROR,
|
ereport(ERROR,
|
||||||
(errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
|
(errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
|
||||||
errmsg("invalid input syntax for type sparsevec: \"%s\"", lit)));
|
errmsg("invalid input syntax for type sparsevec: \"%s\"", lit)));
|
||||||
|
|
||||||
if (errno == ERANGE)
|
if (dim > INT_MAX)
|
||||||
ereport(ERROR,
|
dim = INT_MAX;
|
||||||
(errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
|
else if (dim < INT_MIN)
|
||||||
errmsg("dimensions \"%s\" is out of range for type sparsevec", pnstrdup(pt, stringEnd - pt))));
|
dim = INT_MIN;
|
||||||
|
|
||||||
pt = stringEnd;
|
pt = stringEnd;
|
||||||
|
|
||||||
|
|||||||
@@ -192,19 +192,19 @@ ERROR: sparsevec cannot have more than 1000000 dimensions
|
|||||||
LINE 1: SELECT '{}/1000001'::sparsevec;
|
LINE 1: SELECT '{}/1000001'::sparsevec;
|
||||||
^
|
^
|
||||||
SELECT '{}/2147483648'::sparsevec;
|
SELECT '{}/2147483648'::sparsevec;
|
||||||
ERROR: dimensions "2147483648" is out of range for type sparsevec
|
ERROR: sparsevec cannot have more than 1000000 dimensions
|
||||||
LINE 1: SELECT '{}/2147483648'::sparsevec;
|
LINE 1: SELECT '{}/2147483648'::sparsevec;
|
||||||
^
|
^
|
||||||
SELECT '{}/-2147483649'::sparsevec;
|
SELECT '{}/-2147483649'::sparsevec;
|
||||||
ERROR: dimensions "-2147483649" is out of range for type sparsevec
|
ERROR: sparsevec must have at least 1 dimension
|
||||||
LINE 1: SELECT '{}/-2147483649'::sparsevec;
|
LINE 1: SELECT '{}/-2147483649'::sparsevec;
|
||||||
^
|
^
|
||||||
SELECT '{}/9223372036854775808'::sparsevec;
|
SELECT '{}/9223372036854775808'::sparsevec;
|
||||||
ERROR: dimensions "9223372036854775808" is out of range for type sparsevec
|
ERROR: sparsevec cannot have more than 1000000 dimensions
|
||||||
LINE 1: SELECT '{}/9223372036854775808'::sparsevec;
|
LINE 1: SELECT '{}/9223372036854775808'::sparsevec;
|
||||||
^
|
^
|
||||||
SELECT '{}/-9223372036854775809'::sparsevec;
|
SELECT '{}/-9223372036854775809'::sparsevec;
|
||||||
ERROR: dimensions "-9223372036854775809" is out of range for type sparsevec
|
ERROR: sparsevec must have at least 1 dimension
|
||||||
LINE 1: SELECT '{}/-9223372036854775809'::sparsevec;
|
LINE 1: SELECT '{}/-9223372036854775809'::sparsevec;
|
||||||
^
|
^
|
||||||
SELECT '{2147483647:1}/1'::sparsevec;
|
SELECT '{2147483647:1}/1'::sparsevec;
|
||||||
@@ -212,7 +212,7 @@ ERROR: index must be less than or equal to dimensions
|
|||||||
LINE 1: SELECT '{2147483647:1}/1'::sparsevec;
|
LINE 1: SELECT '{2147483647:1}/1'::sparsevec;
|
||||||
^
|
^
|
||||||
SELECT '{2147483648:1}/1'::sparsevec;
|
SELECT '{2147483648:1}/1'::sparsevec;
|
||||||
ERROR: index "2147483648" is out of range for type sparsevec
|
ERROR: index must be less than or equal to dimensions
|
||||||
LINE 1: SELECT '{2147483648:1}/1'::sparsevec;
|
LINE 1: SELECT '{2147483648:1}/1'::sparsevec;
|
||||||
^
|
^
|
||||||
SELECT '{-2147483648:1}/1'::sparsevec;
|
SELECT '{-2147483648:1}/1'::sparsevec;
|
||||||
@@ -220,7 +220,7 @@ ERROR: index must be greater than zero
|
|||||||
LINE 1: SELECT '{-2147483648:1}/1'::sparsevec;
|
LINE 1: SELECT '{-2147483648:1}/1'::sparsevec;
|
||||||
^
|
^
|
||||||
SELECT '{-2147483649:1}/1'::sparsevec;
|
SELECT '{-2147483649:1}/1'::sparsevec;
|
||||||
ERROR: index "-2147483649" is out of range for type sparsevec
|
ERROR: index must be greater than zero
|
||||||
LINE 1: SELECT '{-2147483649:1}/1'::sparsevec;
|
LINE 1: SELECT '{-2147483649:1}/1'::sparsevec;
|
||||||
^
|
^
|
||||||
SELECT '{0:1}/1'::sparsevec;
|
SELECT '{0:1}/1'::sparsevec;
|
||||||
|
|||||||
Reference in New Issue
Block a user