diff --git a/src/backend/utils/adt/jsonb_util.c b/src/backend/utils/adt/jsonb_util.c index 7969f6f584..53a0bb48b9 100644 --- a/src/backend/utils/adt/jsonb_util.c +++ b/src/backend/utils/adt/jsonb_util.c @@ -1728,14 +1728,6 @@ convertJsonbScalar(StringInfo buffer, JEntry *jentry, JsonbValue *scalarVal) break; case jbvNumeric: - /* replace numeric NaN with string "NaN" */ - if (numeric_is_nan(scalarVal->val.numeric)) - { - appendToBuffer(buffer, "NaN", 3); - *jentry = 3; - break; - } - numlen = VARSIZE_ANY(scalarVal->val.numeric); padlen = padBufferToInt(buffer); diff --git a/src/backend/utils/adt/jsonpath_exec.c b/src/backend/utils/adt/jsonpath_exec.c index d8f3632021..a557ed1ce1 100644 --- a/src/backend/utils/adt/jsonpath_exec.c +++ b/src/backend/utils/adt/jsonpath_exec.c @@ -975,15 +975,16 @@ executeItemOptUnwrapTarget(JsonPathExecContext *cxt, JsonPathItem *jsp, { char *tmp = DatumGetCString(DirectFunctionCall1(numeric_out, NumericGetDatum(jb->val.numeric))); + double val; bool have_error = false; - (void) float8in_internal_opt_error(tmp, - NULL, - "double precision", - tmp, - &have_error); + val = float8in_internal_opt_error(tmp, + NULL, + "double precision", + tmp, + &have_error); - if (have_error) + if (have_error || isinf(val) || isnan(val)) RETURN_ERROR(ereport(ERROR, (errcode(ERRCODE_NON_NUMERIC_SQL_JSON_ITEM), errmsg("numeric argument of jsonpath item method .%s() is out of range for type double precision", @@ -1004,7 +1005,7 @@ executeItemOptUnwrapTarget(JsonPathExecContext *cxt, JsonPathItem *jsp, tmp, &have_error); - if (have_error || isinf(val)) + if (have_error || isinf(val) || isnan(val)) RETURN_ERROR(ereport(ERROR, (errcode(ERRCODE_NON_NUMERIC_SQL_JSON_ITEM), errmsg("string argument of jsonpath item method .%s() is not a valid representation of a double precision number", diff --git a/src/test/regress/expected/jsonb_jsonpath.out b/src/test/regress/expected/jsonb_jsonpath.out index 0c084a6c6c..fb0fed11ac 100644 --- a/src/test/regress/expected/jsonb_jsonpath.out +++ b/src/test/regress/expected/jsonb_jsonpath.out @@ -1500,17 +1500,9 @@ ERROR: string argument of jsonpath item method .double() is not a valid represe 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 ------------------- - "NaN" -(1 row) - +ERROR: string argument of jsonpath item method .double() is not a valid representation of a double precision number select jsonb_path_query('"NaN"', '$.double()'); - jsonb_path_query ------------------- - "NaN" -(1 row) - +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: string argument of jsonpath item method .double() is not a valid representation of a double precision number select jsonb_path_query('"-inf"', '$.double()');