aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2016-03-23 11:00:39 -0400
committerTom Lane <tgl@sss.pgh.pa.us>2016-03-23 11:00:39 -0400
commit1548c781888be14d2f24d65fbd591198fabef3a0 (patch)
tree15cc9a3a4cc648f41a24426a2b806be47488d380 /src
parent5f95521b3a4ede720d8927383d79b11e37b6bc80 (diff)
downloadpostgresql-1548c781888be14d2f24d65fbd591198fabef3a0.tar.gz
postgresql-1548c781888be14d2f24d65fbd591198fabef3a0.zip
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.
Diffstat (limited to 'src')
-rw-r--r--src/backend/utils/adt/jsonfuncs.c24
-rw-r--r--src/test/regress/expected/jsonb.out12
2 files changed, 20 insertions, 16 deletions
diff --git a/src/backend/utils/adt/jsonfuncs.c b/src/backend/utils/adt/jsonfuncs.c
index 6cf2b783e6d..5ba680112d5 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