Improve error reporting for jsonpath .double() method
authorAlexander Korotkov
Sat, 11 Jul 2020 00:20:46 +0000 (03:20 +0300)
committerAlexander Korotkov
Sat, 11 Jul 2020 00:21:53 +0000 (03:21 +0300)
When jsonpath .double() method detects that numeric or string can't be
converted to double precision, it throws an error.  This commit makes these
errors explicitly express the reason of failure.

Discussion: https://postgr.es/m/CAPpHfdtqJtiSXkP7tOXez18NxhLUH_-75bL8%3DOce4Ki%2Bbv7V6Q%40mail.gmail.com
Author: Alexander Korotkov
Reviewed-by: Tom Lane
Backpatch-through: 12

src/backend/utils/adt/jsonpath_exec.c
src/test/regress/expected/jsonb_jsonpath.out
src/test/regress/sql/jsonb_jsonpath.sql

index fbb8392fe96104630b301532457c689177412c2d..d8f3632021efa0c03308633ced237e653231e677 100644 (file)
@@ -986,7 +986,7 @@ executeItemOptUnwrapTarget(JsonPathExecContext *cxt, JsonPathItem *jsp,
                    if (have_error)
                        RETURN_ERROR(ereport(ERROR,
                                             (errcode(ERRCODE_NON_NUMERIC_SQL_JSON_ITEM),
-                                             errmsg("jsonpath item method .%s() can only be applied to a numeric value",
+                                             errmsg("numeric argument of jsonpath item method .%s() is out of range for type double precision",
                                                     jspOperationName(jsp->type)))));
                    res = jperOk;
                }
@@ -1007,7 +1007,7 @@ executeItemOptUnwrapTarget(JsonPathExecContext *cxt, JsonPathItem *jsp,
                    if (have_error || isinf(val))
                        RETURN_ERROR(ereport(ERROR,
                                             (errcode(ERRCODE_NON_NUMERIC_SQL_JSON_ITEM),
-                                             errmsg("jsonpath item method .%s() can only be applied to a numeric value",
+                                             errmsg("string argument of jsonpath item method .%s() is not a valid representation of a double precision number",
                                                     jspOperationName(jsp->type)))));
 
                    jb = &jbv;
index d9618f2d8879902b1e588860f934d0b5a786ba6e..0c084a6c6c52c718780aaa049b7d5f4d5c83f06a 100644 (file)
@@ -1496,7 +1496,9 @@ select jsonb_path_query('"1.23"', '$.double()');
 (1 row)
 
 select jsonb_path_query('"1.23aaa"', '$.double()');
-ERROR:  jsonpath item method .double() can only be applied to a numeric value
+ERROR:  string argument of jsonpath item method .double() is not a valid representation of a double precision number
+select jsonb_path_query('1e1000', '$.double()');
+ERROR:  numeric argument of jsonpath item method .double() is out of range for type double precision
 select jsonb_path_query('"nan"', '$.double()');
  jsonb_path_query 
 ------------------
@@ -1510,9 +1512,9 @@ select jsonb_path_query('"NaN"', '$.double()');
 (1 row)
 
 select jsonb_path_query('"inf"', '$.double()');
-ERROR:  jsonpath item method .double() can only be applied to a numeric value
+ERROR:  string argument of jsonpath item method .double() is not a valid representation of a double precision number
 select jsonb_path_query('"-inf"', '$.double()');
-ERROR:  jsonpath item method .double() can only be applied to a numeric value
+ERROR:  string argument of jsonpath item method .double() is not a valid representation of a double precision number
 select jsonb_path_query('"inf"', '$.double()', silent => true);
  jsonb_path_query 
 ------------------
index ae8549d55364d6480d060b46a8410f319811e1cf..7a65c6caeba757d449b7e1c28c2ce626faeb22a3 100644 (file)
@@ -312,6 +312,7 @@ select jsonb_path_query('{}', '$.double()', silent => true);
 select jsonb_path_query('1.23', '$.double()');
 select jsonb_path_query('"1.23"', '$.double()');
 select jsonb_path_query('"1.23aaa"', '$.double()');
+select jsonb_path_query('1e1000', '$.double()');
 select jsonb_path_query('"nan"', '$.double()');
 select jsonb_path_query('"NaN"', '$.double()');
 select jsonb_path_query('"inf"', '$.double()');