aboutsummaryrefslogtreecommitdiff
path: root/src/backend/utils/adt/jsonfuncs.c
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2016-10-13 00:25:28 -0400
committerTom Lane <tgl@sss.pgh.pa.us>2016-10-13 00:25:48 -0400
commit9c4cc9e2c75e84a8267396be5cccbfe25b8f63f6 (patch)
tree267e982e1b0e833b465339644c94ce26b8244158 /src/backend/utils/adt/jsonfuncs.c
parentccbb852cd6101e93976111676a90f1e5d9268951 (diff)
downloadpostgresql-9c4cc9e2c75e84a8267396be5cccbfe25b8f63f6.tar.gz
postgresql-9c4cc9e2c75e84a8267396be5cccbfe25b8f63f6.zip
Fix broken jsonb_set() logic for replacing array elements.
Commit 0b62fd036 did a fairly sloppy job of refactoring setPath() to support jsonb_insert() along with jsonb_set(). In its defense, though, there was no regression test case exercising the case of replacing an existing element in a jsonb array. Per bug #14366 from Peng Sun. Back-patch to 9.6 where bug was introduced. Report: <20161012065349.1412.47858@wrigleys.postgresql.org>
Diffstat (limited to 'src/backend/utils/adt/jsonfuncs.c')
-rw-r--r--src/backend/utils/adt/jsonfuncs.c12
1 files changed, 6 insertions, 6 deletions
diff --git a/src/backend/utils/adt/jsonfuncs.c b/src/backend/utils/adt/jsonfuncs.c
index 996007d4837..059d570de7a 100644
--- a/src/backend/utils/adt/jsonfuncs.c
+++ b/src/backend/utils/adt/jsonfuncs.c
@@ -34,11 +34,11 @@
#include "utils/typcache.h"
/* Operations available for setPath */
-#define JB_PATH_NOOP 0x0000
#define JB_PATH_CREATE 0x0001
#define JB_PATH_DELETE 0x0002
-#define JB_PATH_INSERT_BEFORE 0x0004
-#define JB_PATH_INSERT_AFTER 0x0008
+#define JB_PATH_REPLACE 0x0004
+#define JB_PATH_INSERT_BEFORE 0x0008
+#define JB_PATH_INSERT_AFTER 0x0010
#define JB_PATH_CREATE_OR_INSERT \
(JB_PATH_INSERT_BEFORE | JB_PATH_INSERT_AFTER | JB_PATH_CREATE)
@@ -3545,7 +3545,7 @@ jsonb_set(PG_FUNCTION_ARGS)
it = JsonbIteratorInit(&in->root);
res = setPath(&it, path_elems, path_nulls, path_len, &st,
- 0, newval, create ? JB_PATH_CREATE : JB_PATH_NOOP);
+ 0, newval, create ? JB_PATH_CREATE : JB_PATH_REPLACE);
Assert(res != NULL);
@@ -4003,7 +4003,7 @@ setPathArray(JsonbIterator **it, Datum *path_elems, bool *path_nulls,
if (op_type & (JB_PATH_INSERT_AFTER | JB_PATH_INSERT_BEFORE))
(void) pushJsonbValue(st, r, &v);
- if (op_type & JB_PATH_INSERT_AFTER)
+ if (op_type & (JB_PATH_INSERT_AFTER | JB_PATH_REPLACE))
addJsonbToParseState(st, newval);
done = true;
@@ -4035,7 +4035,7 @@ setPathArray(JsonbIterator **it, Datum *path_elems, bool *path_nulls,
}
}
- if (op_type & JB_PATH_CREATE_OR_INSERT && !done &&
+ if ((op_type & JB_PATH_CREATE_OR_INSERT) && !done &&
level == path_len - 1 && i == nelems - 1)
{
addJsonbToParseState(st, newval);