Improved error messages for sparsevec input

This commit is contained in:
Andrew Kane
2024-04-24 11:12:28 -07:00
parent 053ce2ddae
commit c3448a25e2
2 changed files with 18 additions and 20 deletions

View File

@@ -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;

View File

@@ -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;