From 54547bd87f49326d67051254c363e6597d16ffda Mon Sep 17 00:00:00 2001
From: Andrew Dunstan <andrew@dunslane.net>
Date: Tue, 26 May 2015 11:16:52 -0400
Subject: [PATCH] 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.
---
 src/backend/utils/adt/jsonb_util.c | 14 +++++++++-----
 1 file 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);
-- 
GitLab