diff options
author | Andrew Dunstan <andrew@dunslane.net> | 2015-05-26 11:16:52 -0400 |
---|---|---|
committer | Andrew Dunstan <andrew@dunslane.net> | 2015-05-26 11:16:52 -0400 |
commit | 54547bd87f49326d67051254c363e6597d16ffda (patch) | |
tree | f2a1e947fabbb446780e45835a074ec25789038f /src/backend/utils/adt/jsonb_util.c | |
parent | 79f2b5d583e2e2a7ccd13e31d0e20a900c8f2f61 (diff) | |
download | postgresql-54547bd87f49326d67051254c363e6597d16ffda.tar.gz postgresql-54547bd87f49326d67051254c363e6597d16ffda.zip |
Add all structured objects passed to pushJsonbValue piecewise.
Commit 9b74f32cdbff8b9be47fc69164eae552050509ff did this for objects of
type jbvBinary, but in trying further to simplify some of the new jsonb
code I discovered that objects of type jbvObject or jbvArray passed as
WJB_ELEM or WJB_VALUE also caused problems. These too are now added
component by component.
Backpatch to 9.4.
Diffstat (limited to 'src/backend/utils/adt/jsonb_util.c')
-rw-r--r-- | src/backend/utils/adt/jsonb_util.c | 14 |
1 files changed, 9 insertions, 5 deletions
diff --git a/src/backend/utils/adt/jsonb_util.c b/src/backend/utils/adt/jsonb_util.c index 4d733159d06..38e1db29e5a 100644 --- a/src/backend/utils/adt/jsonb_util.c +++ b/src/backend/utils/adt/jsonb_util.c @@ -509,8 +509,8 @@ fillJsonbValue(JsonbContainer *container, int index, * "raw scalar" pseudo array to append it - the actual scalar should be passed * next and it will be added as the only member of the array. * - * Values of type jvbBinary, which are rolled up arrays and objects, - * are unpacked before being added to the result. + * All non-scalar types (jvbBinary, jbvArray and jbvObject) passed as + * elements or values are unpacked before being added to the result. */ JsonbValue * pushJsonbValue(JsonbParseState **pstate, JsonbIteratorToken seq, @@ -522,14 +522,18 @@ pushJsonbValue(JsonbParseState **pstate, JsonbIteratorToken seq, JsonbIteratorToken tok; if (!jbval || (seq != WJB_ELEM && seq != WJB_VALUE) || - jbval->type != jbvBinary) + IsAJsonbScalar(jbval)) { /* drop through */ return pushJsonbValueScalar(pstate, seq, jbval); } - /* unpack the binary and add each piece to the pstate */ - it = JsonbIteratorInit(jbval->val.binary.data); + /* unpack the data and add each piece to the pstate */ + if (jbval->type == jbvBinary) + it = JsonbIteratorInit(jbval->val.binary.data); + else + it = JsonbIteratorInit(jbval); + while ((tok = JsonbIteratorNext(&it, &v, false)) != WJB_DONE) res = pushJsonbValueScalar(pstate, tok, tok < WJB_BEGIN_ARRAY ? &v : NULL); |