@@ -105,7 +105,8 @@ static int lengthCompareJsonbPair(const void *a, const void *b, void *arg);
105
105
static void uniqueifyJsonbObject (JsonbValue * object , bool unique_keys ,
106
106
bool skip_nulls );
107
107
static JsonbValue * pushSingleScalarJsonbValue (JsonbParseState * * pstate ,
108
- const JsonbValue * jbval );
108
+ const JsonbValue * jbval ,
109
+ bool unpackBinary );
109
110
static void jsonbInitContainer (JsonContainerData * jc , JsonbContainer * jbc , int len );
110
111
111
112
JsonValue *
@@ -166,7 +167,7 @@ JsonValueFlatten(const JsonValue *val, JsonValueEncoder encoder,
166
167
if (IsAJsonbScalar (val ))
167
168
{
168
169
JsonbParseState * pstate = NULL ;
169
- val = pushSingleScalarJsonbValue (& pstate , val );
170
+ val = pushSingleScalarJsonbValue (& pstate , val , true );
170
171
}
171
172
else
172
173
{
@@ -706,8 +707,8 @@ JsonbParseStateSetSkipNulls(JsonbParseState *state, bool skip_nulls)
706
707
* are unpacked before being added to the result.
707
708
*/
708
709
JsonbValue *
709
- pushJsonbValue (JsonbParseState * * pstate , JsonbIteratorToken seq ,
710
- const JsonbValue * jbval )
710
+ pushJsonbValueExt (JsonbParseState * * pstate , JsonbIteratorToken seq ,
711
+ const JsonbValue * jbval , bool unpackBinary )
711
712
{
712
713
JsonIterator * it ;
713
714
JsonbValue * res = NULL ;
@@ -721,25 +722,29 @@ pushJsonbValue(JsonbParseState **pstate, JsonbIteratorToken seq,
721
722
for (i = 0 ; i < jbval -> val .object .nPairs ; i ++ )
722
723
{
723
724
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 );
725
726
}
726
727
727
728
return pushJsonbValue (pstate , WJB_END_OBJECT , NULL );
728
729
}
729
730
730
731
if (jbval && (seq == WJB_ELEM || seq == WJB_VALUE ) && jbval -> type == jbvArray )
731
732
{
733
+ if (jbval -> val .array .rawScalar )
734
+ return pushJsonbValue (pstate , seq , & jbval -> val .array .elems [0 ]);
735
+
732
736
pushJsonbValue (pstate , WJB_BEGIN_ARRAY , NULL );
737
+
733
738
for (i = 0 ; i < jbval -> val .array .nElems ; i ++ )
734
739
{
735
- pushJsonbValue (pstate , WJB_ELEM , & jbval -> val .array .elems [i ]);
740
+ pushJsonbValueExt (pstate , WJB_ELEM , & jbval -> val .array .elems [i ], unpackBinary );
736
741
}
737
742
738
743
return pushJsonbValue (pstate , WJB_END_ARRAY , NULL );
739
744
}
740
745
741
746
if (!jbval || (seq != WJB_ELEM && seq != WJB_VALUE ) ||
742
- jbval -> type != jbvBinary )
747
+ jbval -> type != jbvBinary || ! unpackBinary )
743
748
{
744
749
/* drop through */
745
750
return pushJsonbValueScalar (pstate , seq , jbval );
@@ -827,7 +832,7 @@ pushJsonbValueScalar(JsonbParseState **pstate, JsonbIteratorToken seq,
827
832
appendValue (* pstate , scalarVal );
828
833
break ;
829
834
case WJB_ELEM :
830
- Assert (IsAJsonbScalar (scalarVal ));
835
+ /* Assert(IsAJsonbScalar(scalarVal)); */
831
836
appendElement (* pstate , scalarVal );
832
837
break ;
833
838
case WJB_END_OBJECT :
@@ -868,7 +873,8 @@ pushJsonbValueScalar(JsonbParseState **pstate, JsonbIteratorToken seq,
868
873
}
869
874
870
875
static JsonbValue *
871
- pushSingleScalarJsonbValue (JsonbParseState * * pstate , const JsonbValue * jbval )
876
+ pushSingleScalarJsonbValue (JsonbParseState * * pstate , const JsonbValue * jbval ,
877
+ bool unpackBinary )
872
878
{
873
879
/* single root scalar */
874
880
JsonbValue va ;
@@ -878,20 +884,21 @@ pushSingleScalarJsonbValue(JsonbParseState **pstate, const JsonbValue *jbval)
878
884
va .val .array .nElems = 1 ;
879
885
880
886
pushJsonbValue (pstate , WJB_BEGIN_ARRAY , & va );
881
- pushJsonbValue (pstate , WJB_ELEM , jbval );
887
+ pushJsonbValueExt (pstate , WJB_ELEM , jbval , unpackBinary );
882
888
return pushJsonbValue (pstate , WJB_END_ARRAY , NULL );
883
889
}
884
890
885
891
static JsonbValue *
886
892
pushNestedScalarJsonbValue (JsonbParseState * * pstate , const JsonbValue * jbval ,
887
- bool isKey )
893
+ bool isKey , bool unpackBinary )
888
894
{
889
895
switch ((* pstate )-> contVal .type )
890
896
{
891
897
case jbvArray :
892
- return pushJsonbValue (pstate , WJB_ELEM , jbval );
898
+ return pushJsonbValueExt (pstate , WJB_ELEM , jbval , unpackBinary );
893
899
case jbvObject :
894
- return pushJsonbValue (pstate , isKey ? WJB_KEY : WJB_VALUE , jbval );
900
+ return pushJsonbValueExt (pstate , isKey ? WJB_KEY : WJB_VALUE , jbval ,
901
+ unpackBinary );
895
902
default :
896
903
elog (ERROR , "unexpected parent of nested structure" );
897
904
return NULL ;
@@ -900,11 +907,11 @@ pushNestedScalarJsonbValue(JsonbParseState **pstate, const JsonbValue *jbval,
900
907
901
908
JsonbValue *
902
909
pushScalarJsonbValue (JsonbParseState * * pstate , const JsonbValue * jbval ,
903
- bool isKey )
910
+ bool isKey , bool unpackBinary )
904
911
{
905
912
return * pstate == NULL
906
- ? pushSingleScalarJsonbValue (pstate , jbval )
907
- : pushNestedScalarJsonbValue (pstate , jbval , isKey );
913
+ ? pushSingleScalarJsonbValue (pstate , jbval , unpackBinary )
914
+ : pushNestedScalarJsonbValue (pstate , jbval , isKey , unpackBinary );
908
915
909
916
}
910
917
@@ -2232,5 +2239,5 @@ jsonbContainerOps =
2232
2239
jsonbFindValueInArray ,
2233
2240
jsonbGetArrayElement ,
2234
2241
NULL ,
2235
- JsonbToCString ,
2242
+ JsonbToCStringRaw ,
2236
2243
};
0 commit comments