@@ -105,7 +105,8 @@ static int lengthCompareJsonbPair(const void *a, const void *b, void *arg);
105105static void uniqueifyJsonbObject (JsonbValue * object , bool unique_keys ,
106106 bool skip_nulls );
107107static JsonbValue * pushSingleScalarJsonbValue (JsonbParseState * * pstate ,
108- const JsonbValue * jbval );
108+ const JsonbValue * jbval ,
109+ bool unpackBinary );
109110static void jsonbInitContainer (JsonContainerData * jc , JsonbContainer * jbc , int len );
110111
111112JsonValue *
@@ -166,7 +167,7 @@ JsonValueFlatten(const JsonValue *val, JsonValueEncoder encoder,
166167 if (IsAJsonbScalar (val ))
167168 {
168169 JsonbParseState * pstate = NULL ;
169- val = pushSingleScalarJsonbValue (& pstate , val );
170+ val = pushSingleScalarJsonbValue (& pstate , val , true );
170171 }
171172 else
172173 {
@@ -706,8 +707,8 @@ JsonbParseStateSetSkipNulls(JsonbParseState *state, bool skip_nulls)
706707 * are unpacked before being added to the result.
707708 */
708709JsonbValue *
709- pushJsonbValue (JsonbParseState * * pstate , JsonbIteratorToken seq ,
710- const JsonbValue * jbval )
710+ pushJsonbValueExt (JsonbParseState * * pstate , JsonbIteratorToken seq ,
711+ const JsonbValue * jbval , bool unpackBinary )
711712{
712713 JsonIterator * it ;
713714 JsonbValue * res = NULL ;
@@ -721,25 +722,29 @@ pushJsonbValue(JsonbParseState **pstate, JsonbIteratorToken seq,
721722 for (i = 0 ; i < jbval -> val .object .nPairs ; i ++ )
722723 {
723724 pushJsonbValue (pstate , WJB_KEY , & jbval -> val .object .pairs [i ].key );
724- pushJsonbValue (pstate , WJB_VALUE , & jbval -> val .object .pairs [i ].value );
725+ pushJsonbValueExt (pstate , WJB_VALUE , & jbval -> val .object .pairs [i ].value , unpackBinary );
725726 }
726727
727728 return pushJsonbValue (pstate , WJB_END_OBJECT , NULL );
728729 }
729730
730731 if (jbval && (seq == WJB_ELEM || seq == WJB_VALUE ) && jbval -> type == jbvArray )
731732 {
733+ if (jbval -> val .array .rawScalar )
734+ return pushJsonbValue (pstate , seq , & jbval -> val .array .elems [0 ]);
735+
732736 pushJsonbValue (pstate , WJB_BEGIN_ARRAY , NULL );
737+
733738 for (i = 0 ; i < jbval -> val .array .nElems ; i ++ )
734739 {
735- pushJsonbValue (pstate , WJB_ELEM , & jbval -> val .array .elems [i ]);
740+ pushJsonbValueExt (pstate , WJB_ELEM , & jbval -> val .array .elems [i ], unpackBinary );
736741 }
737742
738743 return pushJsonbValue (pstate , WJB_END_ARRAY , NULL );
739744 }
740745
741746 if (!jbval || (seq != WJB_ELEM && seq != WJB_VALUE ) ||
742- jbval -> type != jbvBinary )
747+ jbval -> type != jbvBinary || ! unpackBinary )
743748 {
744749 /* drop through */
745750 return pushJsonbValueScalar (pstate , seq , jbval );
@@ -827,7 +832,7 @@ pushJsonbValueScalar(JsonbParseState **pstate, JsonbIteratorToken seq,
827832 appendValue (* pstate , scalarVal );
828833 break ;
829834 case WJB_ELEM :
830- Assert (IsAJsonbScalar (scalarVal ));
835+ /* Assert(IsAJsonbScalar(scalarVal)); */
831836 appendElement (* pstate , scalarVal );
832837 break ;
833838 case WJB_END_OBJECT :
@@ -868,7 +873,8 @@ pushJsonbValueScalar(JsonbParseState **pstate, JsonbIteratorToken seq,
868873}
869874
870875static JsonbValue *
871- pushSingleScalarJsonbValue (JsonbParseState * * pstate , const JsonbValue * jbval )
876+ pushSingleScalarJsonbValue (JsonbParseState * * pstate , const JsonbValue * jbval ,
877+ bool unpackBinary )
872878{
873879 /* single root scalar */
874880 JsonbValue va ;
@@ -878,20 +884,21 @@ pushSingleScalarJsonbValue(JsonbParseState **pstate, const JsonbValue *jbval)
878884 va .val .array .nElems = 1 ;
879885
880886 pushJsonbValue (pstate , WJB_BEGIN_ARRAY , & va );
881- pushJsonbValue (pstate , WJB_ELEM , jbval );
887+ pushJsonbValueExt (pstate , WJB_ELEM , jbval , unpackBinary );
882888 return pushJsonbValue (pstate , WJB_END_ARRAY , NULL );
883889}
884890
885891static JsonbValue *
886892pushNestedScalarJsonbValue (JsonbParseState * * pstate , const JsonbValue * jbval ,
887- bool isKey )
893+ bool isKey , bool unpackBinary )
888894{
889895 switch ((* pstate )-> contVal .type )
890896 {
891897 case jbvArray :
892- return pushJsonbValue (pstate , WJB_ELEM , jbval );
898+ return pushJsonbValueExt (pstate , WJB_ELEM , jbval , unpackBinary );
893899 case jbvObject :
894- return pushJsonbValue (pstate , isKey ? WJB_KEY : WJB_VALUE , jbval );
900+ return pushJsonbValueExt (pstate , isKey ? WJB_KEY : WJB_VALUE , jbval ,
901+ unpackBinary );
895902 default :
896903 elog (ERROR , "unexpected parent of nested structure" );
897904 return NULL ;
@@ -900,11 +907,11 @@ pushNestedScalarJsonbValue(JsonbParseState **pstate, const JsonbValue *jbval,
900907
901908JsonbValue *
902909pushScalarJsonbValue (JsonbParseState * * pstate , const JsonbValue * jbval ,
903- bool isKey )
910+ bool isKey , bool unpackBinary )
904911{
905912 return * pstate == NULL
906- ? pushSingleScalarJsonbValue (pstate , jbval )
907- : pushNestedScalarJsonbValue (pstate , jbval , isKey );
913+ ? pushSingleScalarJsonbValue (pstate , jbval , unpackBinary )
914+ : pushNestedScalarJsonbValue (pstate , jbval , isKey , unpackBinary );
908915
909916}
910917
@@ -2232,5 +2239,5 @@ jsonbContainerOps =
22322239 jsonbFindValueInArray ,
22332240 jsonbGetArrayElement ,
22342241 NULL ,
2235- JsonbToCString ,
2242+ JsonbToCStringRaw ,
22362243};
0 commit comments