postgres.git / summary / log / commit / refs

commit    ea4b8bd6188ecb17ba37d93f57b8b020a964e66c
Author:   Tom Lane <tgl@sss.pgh.pa.us>
Date:     Wed Mar 23 15:00:39 2016 +0000
First released in: 9.6.0, 9.5.2

    Code review for error reports in jsonb_set().
    
    User-facing (even tested by regression tests) error conditions were thrown
    with elog(), hence had wrong SQLSTATE and were untranslatable.  And the
    error message texts weren't up to project style, either.


src/backend/utils/adt/jsonfuncs.c | 24 ++++++++++++++---------- src/test/regress/expected/jsonb.out | 12 ++++++------ 2 files changed, 20 insertions(+), 16 deletions(-) diff --git a/src/backend/utils/adt/jsonfuncs.c b/src/backend/utils/adt/jsonfuncs.c index cc6dadf7932..97e0e8e0596 100644 --- a/src/backend/utils/adt/jsonfuncs.c +++ b/src/backend/utils/adt/jsonfuncs.c @@ -3722,12 +3722,15 @@ setPath(JsonbIterator **it, Datum *path_elems, { JsonbValue v; JsonbIteratorToken r; - JsonbValue *res = NULL; + JsonbValue *res; check_stack_depth(); if (path_nulls[level]) - elog(ERROR, "path element at the position %d is NULL", level + 1); + ereport(ERROR, + (errcode(ERRCODE_NULL_VALUE_NOT_ALLOWED), + errmsg("path element at position %d is null", + level + 1))); r = JsonbIteratorNext(it, &v, false); @@ -3740,7 +3743,6 @@ setPath(JsonbIterator **it, Datum *path_elems, r = JsonbIteratorNext(it, &v, false); Assert(r == WJB_END_ARRAY); res = pushJsonbValue(st, r, NULL); - break; case WJB_BEGIN_OBJECT: (void) pushJsonbValue(st, r, NULL); @@ -3749,14 +3751,15 @@ setPath(JsonbIterator **it, Datum *path_elems, r = JsonbIteratorNext(it, &v, true); Assert(r == WJB_END_OBJECT); res = pushJsonbValue(st, r, NULL); - break; case WJB_ELEM: case WJB_VALUE: res = pushJsonbValue(st, r, &v); break; default: - elog(ERROR, "impossible state"); + elog(ERROR, "unrecognized iterator result: %d", (int) r); + res = NULL; /* keep compiler quiet */ + break; } return res; @@ -3867,7 +3870,6 @@ setPathArray(JsonbIterator **it, Datum *path_elems, bool *path_nulls, JsonbValue v; int idx, i; - char *badp; bool done = false; /* pick correct index */ @@ -3875,14 +3877,17 @@ setPathArray(JsonbIterator **it, Datum *path_elems, bool *path_nulls, { char *c = TextDatumGetCString(path_elems[level]); long lindex; + char *badp; errno = 0; lindex = strtol(c, &badp, 10); if (errno != 0 || badp == c || *badp != '\0' || lindex > INT_MAX || lindex < INT_MIN) - elog(ERROR, "path element at the position %d is not an integer", level + 1); - else - idx = lindex; + ereport(ERROR, + (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION), + errmsg("path element at position %d is not an integer: \"%s\"", + level + 1, c))); + idx = lindex; } else idx = nelems; @@ -3957,7 +3962,6 @@ setPathArray(JsonbIterator **it, Datum *path_elems, bool *path_nulls, { addJsonbToParseState(st, newval); } - } } } diff --git a/src/test/regress/expected/jsonb.out b/src/test/regress/expected/jsonb.out index 416918dd9fb..497b0d93ef0 100644 --- a/src/test/regress/expected/jsonb.out +++ b/src/test/regress/expected/jsonb.out @@ -3114,7 +3114,7 @@ select jsonb_set('{"n":null, "a":1, "b":[1,2], "c":{"1":2}, "d":{"1":[2,3]}}'::j (1 row) select jsonb_set('{"n":null, "a":1, "b":[1,2], "c":{"1":2}, "d":{"1":[2,3]}}'::jsonb, '{d,NULL,0}', '[1,2,3]'); -ERROR: path element at the position 2 is NULL +ERROR: path element at position 2 is null select jsonb_set('{"n":null, "a":1, "b":[1,2], "c":{"1":2}, "d":{"1":[2,3]}}'::jsonb, '{n}', '{"1": 2}'); jsonb_set ------------------------------------------------------------------------- @@ -3134,7 +3134,7 @@ select jsonb_set('{"n":null, "a":1, "b":[1,2], "c":{"1":2}, "d":{"1":[2,3]}}'::j (1 row) select jsonb_set('{"n":null, "a":1, "b":[1,2], "c":{"1":2}, "d":{"1":[2,3]}}'::jsonb, '{d,NULL,0}', '{"1": 2}'); -ERROR: path element at the position 2 is NULL +ERROR: path element at position 2 is null select jsonb_set('{"n":null, "a":1, "b":[1,2], "c":{"1":2}, "d":{"1":[2,3]}}'::jsonb, '{b,-1}', '"test"'); jsonb_set -------------------------------------------------------------------------- @@ -3178,7 +3178,7 @@ select '{"n":null, "a":1, "b":[1,2], "c":{"1":2}, "d":{"1":[2,3]}}'::jsonb #- '{ (1 row) select '{"n":null, "a":1, "b":[1,2], "c":{"1":2}, "d":{"1":[2,3]}}'::jsonb #- '{b,-1e}'; -- invalid array subscript -ERROR: path element at the position 2 is not an integer +ERROR: path element at position 2 is not an integer: "-1e" select '{"n":null, "a":1, "b":[1,2], "c":{"1":2}, "d":{"1":[2,3]}}'::jsonb #- '{d,1,0}'; ?column? ------------------------------------------------------------------ @@ -3307,8 +3307,8 @@ select jsonb_set('[]','{-99}','{"foo":123}'); (1 row) select jsonb_set('{"a": [1, 2, 3]}', '{a, non_integer}', '"new_value"'); -ERROR: path element at the position 2 is not an integer +ERROR: path element at position 2 is not an integer: "non_integer" select jsonb_set('{"a": {"b": [1, 2, 3]}}', '{a, b, non_integer}', '"new_value"'); -ERROR: path element at the position 3 is not an integer +ERROR: path element at position 3 is not an integer: "non_integer" select jsonb_set('{"a": {"b": [1, 2, 3]}}', '{a, b, NULL}', '"new_value"'); -ERROR: path element at the position 3 is NULL +ERROR: path element at position 3 is null [parent: 384dfbde1933]