mirror of
https://github.com/postgres/postgres.git
synced 2025-05-02 11:44:50 +03:00
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.
This commit is contained in:
parent
5f95521b3a
commit
1548c78188
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user