@@ -101,7 +101,8 @@ static void appendElement(JsonbParseState *pstate, const JsonbValue *scalarVal);
101101static int lengthCompareJsonbPair (const void * a , const void * b , void * arg );
102102static void uniqueifyJsonbObject (JsonbValue * object );
103103static JsonbValue * pushSingleScalarJsonbValue (JsonbParseState * * pstate ,
104- const JsonbValue * jbval );
104+ const JsonbValue * jbval ,
105+ bool unpackBinary );
105106static void jsonbInitContainer (JsonContainerData * jc , JsonbContainer * jbc , int len );
106107
107108JsonValue *
@@ -162,7 +163,7 @@ JsonValueFlatten(const JsonValue *val, JsonValueEncoder encoder,
162163 if (IsAJsonbScalar (val ))
163164 {
164165 JsonbParseState * pstate = NULL ;
165- val = pushSingleScalarJsonbValue (& pstate , val );
166+ val = pushSingleScalarJsonbValue (& pstate , val , true );
166167 }
167168 else
168169 {
@@ -694,8 +695,8 @@ JsonbParseStateClone(JsonbParseState *state)
694695 * are unpacked before being added to the result.
695696 */
696697JsonbValue *
697- pushJsonbValue (JsonbParseState * * pstate , JsonbIteratorToken seq ,
698- const JsonbValue * jbval )
698+ pushJsonbValueExt (JsonbParseState * * pstate , JsonbIteratorToken seq ,
699+ const JsonbValue * jbval , bool unpackBinary )
699700{
700701 JsonIterator * it ;
701702 JsonbValue * res = NULL ;
@@ -709,25 +710,29 @@ pushJsonbValue(JsonbParseState **pstate, JsonbIteratorToken seq,
709710 for (i = 0 ; i < jbval -> val .object .nPairs ; i ++ )
710711 {
711712 pushJsonbValue (pstate , WJB_KEY , & jbval -> val .object .pairs [i ].key );
712- pushJsonbValue (pstate , WJB_VALUE , & jbval -> val .object .pairs [i ].value );
713+ pushJsonbValueExt (pstate , WJB_VALUE , & jbval -> val .object .pairs [i ].value , unpackBinary );
713714 }
714715
715716 return pushJsonbValue (pstate , WJB_END_OBJECT , NULL );
716717 }
717718
718719 if (jbval && (seq == WJB_ELEM || seq == WJB_VALUE ) && jbval -> type == jbvArray )
719720 {
721+ if (jbval -> val .array .rawScalar )
722+ return pushJsonbValue (pstate , seq , & jbval -> val .array .elems [0 ]);
723+
720724 pushJsonbValue (pstate , WJB_BEGIN_ARRAY , NULL );
725+
721726 for (i = 0 ; i < jbval -> val .array .nElems ; i ++ )
722727 {
723- pushJsonbValue (pstate , WJB_ELEM , & jbval -> val .array .elems [i ]);
728+ pushJsonbValueExt (pstate , WJB_ELEM , & jbval -> val .array .elems [i ], unpackBinary );
724729 }
725730
726731 return pushJsonbValue (pstate , WJB_END_ARRAY , NULL );
727732 }
728733
729734 if (!jbval || (seq != WJB_ELEM && seq != WJB_VALUE ) ||
730- jbval -> type != jbvBinary )
735+ jbval -> type != jbvBinary || ! unpackBinary )
731736 {
732737 /* drop through */
733738 return pushJsonbValueScalar (pstate , seq , jbval );
@@ -815,7 +820,7 @@ pushJsonbValueScalar(JsonbParseState **pstate, JsonbIteratorToken seq,
815820 appendValue (* pstate , scalarVal );
816821 break ;
817822 case WJB_ELEM :
818- Assert (IsAJsonbScalar (scalarVal ));
823+ /* Assert(IsAJsonbScalar(scalarVal)); */
819824 appendElement (* pstate , scalarVal );
820825 break ;
821826 case WJB_END_OBJECT :
@@ -854,7 +859,8 @@ pushJsonbValueScalar(JsonbParseState **pstate, JsonbIteratorToken seq,
854859}
855860
856861static JsonbValue *
857- pushSingleScalarJsonbValue (JsonbParseState * * pstate , const JsonbValue * jbval )
862+ pushSingleScalarJsonbValue (JsonbParseState * * pstate , const JsonbValue * jbval ,
863+ bool unpackBinary )
858864{
859865 /* single root scalar */
860866 JsonbValue va ;
@@ -864,20 +870,21 @@ pushSingleScalarJsonbValue(JsonbParseState **pstate, const JsonbValue *jbval)
864870 va .val .array .nElems = 1 ;
865871
866872 pushJsonbValue (pstate , WJB_BEGIN_ARRAY , & va );
867- pushJsonbValue (pstate , WJB_ELEM , jbval );
873+ pushJsonbValueExt (pstate , WJB_ELEM , jbval , unpackBinary );
868874 return pushJsonbValue (pstate , WJB_END_ARRAY , NULL );
869875}
870876
871877static JsonbValue *
872878pushNestedScalarJsonbValue (JsonbParseState * * pstate , const JsonbValue * jbval ,
873- bool isKey )
879+ bool isKey , bool unpackBinary )
874880{
875881 switch ((* pstate )-> contVal .type )
876882 {
877883 case jbvArray :
878- return pushJsonbValue (pstate , WJB_ELEM , jbval );
884+ return pushJsonbValueExt (pstate , WJB_ELEM , jbval , unpackBinary );
879885 case jbvObject :
880- return pushJsonbValue (pstate , isKey ? WJB_KEY : WJB_VALUE , jbval );
886+ return pushJsonbValueExt (pstate , isKey ? WJB_KEY : WJB_VALUE , jbval ,
887+ unpackBinary );
881888 default :
882889 elog (ERROR , "unexpected parent of nested structure" );
883890 return NULL ;
@@ -886,11 +893,11 @@ pushNestedScalarJsonbValue(JsonbParseState **pstate, const JsonbValue *jbval,
886893
887894JsonbValue *
888895pushScalarJsonbValue (JsonbParseState * * pstate , const JsonbValue * jbval ,
889- bool isKey )
896+ bool isKey , bool unpackBinary )
890897{
891898 return * pstate == NULL
892- ? pushSingleScalarJsonbValue (pstate , jbval )
893- : pushNestedScalarJsonbValue (pstate , jbval , isKey );
899+ ? pushSingleScalarJsonbValue (pstate , jbval , unpackBinary )
900+ : pushNestedScalarJsonbValue (pstate , jbval , isKey , unpackBinary );
894901
895902}
896903
@@ -2198,5 +2205,5 @@ jsonbContainerOps =
21982205 jsonbFindValueInArray ,
21992206 jsonbGetArrayElement ,
22002207 NULL ,
2201- JsonbToCString ,
2208+ JsonbToCStringRaw ,
22022209};
0 commit comments