From 96b30fd25de96121c703bc35c840b195c1acbc71 Mon Sep 17 00:00:00 2001 From: Andrew Kane Date: Sat, 13 Apr 2024 15:50:40 -0700 Subject: [PATCH] Improved error message and tests for sparsevec_in --- src/sparsevec.c | 2 +- test/expected/sparsevec_input.out | 57 ++++++++++++++++++++++++++++++- test/sql/sparsevec_input.sql | 14 ++++++-- 3 files changed, 69 insertions(+), 4 deletions(-) diff --git a/src/sparsevec.c b/src/sparsevec.c index a6912d6..ff4138a 100644 --- a/src/sparsevec.c +++ b/src/sparsevec.c @@ -284,7 +284,7 @@ sparsevec_in(PG_FUNCTION_ARGS) if (errno == ERANGE && (value == 0 || isinf(value))) ereport(ERROR, (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE), - errmsg("\"%s\" is out of range for type sparsevec", pt))); + errmsg("\"%s\" is out of range for type sparsevec", pnstrdup(pt, stringEnd - pt)))); /* Do not store zero values */ if (value != 0) diff --git a/test/expected/sparsevec_input.out b/test/expected/sparsevec_input.out index 730ec21..6e158ea 100644 --- a/test/expected/sparsevec_input.out +++ b/test/expected/sparsevec_input.out @@ -16,6 +16,62 @@ SELECT ' { } / 5'::sparsevec; {}/5 (1 row) +SELECT '{1:1.23456}/1'::sparsevec; + sparsevec +--------------- + {1:1.23456}/1 +(1 row) + +SELECT '{1:hello,2:1}/2'::sparsevec; +ERROR: invalid input syntax for type sparsevec: "{1:hello,2:1}/2" +LINE 1: SELECT '{1:hello,2:1}/2'::sparsevec; + ^ +SELECT '{1:NaN,2:1}/2'::sparsevec; +ERROR: NaN not allowed in sparsevec +LINE 1: SELECT '{1:NaN,2:1}/2'::sparsevec; + ^ +SELECT '{1:Infinity,2:1}/2'::sparsevec; +ERROR: infinite value not allowed in sparsevec +LINE 1: SELECT '{1:Infinity,2:1}/2'::sparsevec; + ^ +SELECT '{1:-Infinity,2:1}/2'::sparsevec; +ERROR: infinite value not allowed in sparsevec +LINE 1: SELECT '{1:-Infinity,2:1}/2'::sparsevec; + ^ +SELECT '{1:1.5e38,2:-1.5e38}/2'::sparsevec; + sparsevec +-------------------------- + {1:1.5e+38,2:-1.5e+38}/2 +(1 row) + +SELECT '{1:1.5e+38,2:-1.5e+38}/2'::sparsevec; + sparsevec +-------------------------- + {1:1.5e+38,2:-1.5e+38}/2 +(1 row) + +SELECT '{1:1.5e-38,2:-1.5e-38}/2'::sparsevec; + sparsevec +-------------------------- + {1:1.5e-38,2:-1.5e-38}/2 +(1 row) + +SELECT '{1:4e38,2:1}/2'::sparsevec; +ERROR: "4e38" is out of range for type sparsevec +LINE 1: SELECT '{1:4e38,2:1}/2'::sparsevec; + ^ +SELECT '{1:-4e38,2:1}/2'::sparsevec; +ERROR: "-4e38" is out of range for type sparsevec +LINE 1: SELECT '{1:-4e38,2:1}/2'::sparsevec; + ^ +SELECT '{1:1e-46,2:1}/2'::sparsevec; +ERROR: "1e-46" is out of range for type sparsevec +LINE 1: SELECT '{1:1e-46,2:1}/2'::sparsevec; + ^ +SELECT '{1:-1e-46,2:1}/2'::sparsevec; +ERROR: "-1e-46" is out of range for type sparsevec +LINE 1: SELECT '{1:-1e-46,2:1}/2'::sparsevec; + ^ SELECT ''::sparsevec; ERROR: invalid input syntax for type sparsevec: "" LINE 1: SELECT ''::sparsevec; @@ -43,7 +99,6 @@ ERROR: invalid input syntax for type sparsevec: "{}/1a" LINE 1: SELECT '{}/1a'::sparsevec; ^ DETAIL: Junk after closing. --- TODO fix SELECT '{,}/1'::sparsevec; ERROR: invalid input syntax for type sparsevec: "{,}/1" LINE 1: SELECT '{,}/1'::sparsevec; diff --git a/test/sql/sparsevec_input.sql b/test/sql/sparsevec_input.sql index 0d01711..61e2bab 100644 --- a/test/sql/sparsevec_input.sql +++ b/test/sql/sparsevec_input.sql @@ -1,14 +1,24 @@ SELECT '{1:1.5,3:3.5}/5'::sparsevec; SELECT ' { 1 : 1.5 , 3 : 3.5 } / 5 '::sparsevec; SELECT ' { } / 5'::sparsevec; - +SELECT '{1:1.23456}/1'::sparsevec; +SELECT '{1:hello,2:1}/2'::sparsevec; +SELECT '{1:NaN,2:1}/2'::sparsevec; +SELECT '{1:Infinity,2:1}/2'::sparsevec; +SELECT '{1:-Infinity,2:1}/2'::sparsevec; +SELECT '{1:1.5e38,2:-1.5e38}/2'::sparsevec; +SELECT '{1:1.5e+38,2:-1.5e+38}/2'::sparsevec; +SELECT '{1:1.5e-38,2:-1.5e-38}/2'::sparsevec; +SELECT '{1:4e38,2:1}/2'::sparsevec; +SELECT '{1:-4e38,2:1}/2'::sparsevec; +SELECT '{1:1e-46,2:1}/2'::sparsevec; +SELECT '{1:-1e-46,2:1}/2'::sparsevec; SELECT ''::sparsevec; SELECT '{'::sparsevec; SELECT '{ '::sparsevec; SELECT '{}'::sparsevec; SELECT '{}/'::sparsevec; SELECT '{}/1a'::sparsevec; --- TODO fix SELECT '{,}/1'::sparsevec; SELECT '{1,}/1'::sparsevec; SELECT '{:1}/1'::sparsevec;