From 0657181167467ec5cfb5a28aacf47ca02f5f4588 Mon Sep 17 00:00:00 2001 From: Alexander Korotkov Date: Sat, 11 Jul 2020 03:20:46 +0300 Subject: [PATCH] Improve error reporting for jsonpath .double() method 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 | 4 ++-- src/test/regress/expected/jsonb_jsonpath.out | 8 +++++--- src/test/regress/sql/jsonb_jsonpath.sql | 1 + 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/backend/utils/adt/jsonpath_exec.c b/src/backend/utils/adt/jsonpath_exec.c index 135025cf57..25ec3dcd80 100644 --- a/src/backend/utils/adt/jsonpath_exec.c +++ b/src/backend/utils/adt/jsonpath_exec.c @@ -1055,7 +1055,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; } @@ -1076,7 +1076,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; diff --git a/src/test/regress/expected/jsonb_jsonpath.out b/src/test/regress/expected/jsonb_jsonpath.out index 83a050d3e2..f8a5deb2b9 100644 --- a/src/test/regress/expected/jsonb_jsonpath.out +++ b/src/test/regress/expected/jsonb_jsonpath.out @@ -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 ------------------ diff --git a/src/test/regress/sql/jsonb_jsonpath.sql b/src/test/regress/sql/jsonb_jsonpath.sql index 731b4d444c..a50abed95d 100644 --- a/src/test/regress/sql/jsonb_jsonpath.sql +++ b/src/test/regress/sql/jsonb_jsonpath.sql @@ -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()');