@@ -634,6 +634,8 @@ json_object_field_internal(Json *jb, text *key)
634634Datum
635635jsonb_object_field (PG_FUNCTION_ARGS )
636636{
637+ jsonbInitIterators ();
638+
637639 Jsonb * jb = PG_GETARG_JSONB_P (0 );
638640 JsonValue * res = json_object_field_internal (jb ,
639641 PG_GETARG_TEXT_PP (1 ));
@@ -644,11 +646,13 @@ jsonb_object_field(PG_FUNCTION_ARGS)
644646
645647 //if (res && res->type == jbvBinary)
646648 // JsonContainerFree(res->val.binary.data);
649+ jsonbFreeIterators ();
647650 PG_FREE_IF_COPY_JSONB (jb , 0 );
648651 PG_RETURN_DATUM (r );
649652 }
650653 else
651654 {
655+ jsonbFreeIterators ();
652656 PG_FREE_IF_COPY_JSONB (jb , 0 );
653657 PG_RETURN_NULL ();
654658 }
@@ -669,6 +673,8 @@ json_object_field(PG_FUNCTION_ARGS)
669673Datum
670674jsonb_object_field_text (PG_FUNCTION_ARGS )
671675{
676+ jsonbInitIterators ();
677+
672678 Jsonb * jb = PG_GETARG_JSONB_P (0 );
673679 JsonValue * res = json_object_field_internal (jb , PG_GETARG_TEXT_PP (1 ));
674680
@@ -678,11 +684,13 @@ jsonb_object_field_text(PG_FUNCTION_ARGS)
678684
679685 //if (res && res->type == jbvBinary)
680686 // JsonContainerFree(res->val.binary.data);
687+ jsonbFreeIterators ();
681688 PG_FREE_IF_COPY_JSONB (jb , 0 );
682689 PG_RETURN_TEXT_P (r );
683690 }
684691 else
685692 {
693+ jsonbFreeIterators ();
686694 PG_FREE_IF_COPY_JSONB (jb , 0 );
687695 PG_RETURN_NULL ();
688696 }
@@ -726,11 +734,17 @@ json_array_element_internal(Json *jb, int element)
726734Datum
727735jsonb_array_element (PG_FUNCTION_ARGS )
728736{
729- JsonValue * res = json_array_element_internal (PG_GETARG_JSONB_P (0 ),
737+ jsonbInitIterators ();
738+
739+ JsonValue * res = json_array_element_internal (PG_GETARG_JSONB_PC (0 ),
730740 PG_GETARG_INT32 (1 ));
731741
742+ Datum r = res ? JsonValueGetJsonbDatum (res ) : (Datum ) 0 ;
743+
744+ jsonbFreeIterators ();
745+
732746 if (res )
733- PG_RETURN_JSONB_P ( JsonbValueToJsonb ( res ) );
747+ PG_RETURN_DATUM ( r );
734748 else
735749 PG_RETURN_NULL ();
736750}
@@ -750,11 +764,15 @@ json_array_element(PG_FUNCTION_ARGS)
750764Datum
751765jsonb_array_element_text (PG_FUNCTION_ARGS )
752766{
753- JsonValue * res = json_array_element_internal (PG_GETARG_JSONB_P (0 ),
767+ jsonbInitIterators ();
768+ JsonValue * res = json_array_element_internal (PG_GETARG_JSONB_PC (0 ),
754769 PG_GETARG_INT32 (1 ));
770+ text * r = res && res -> type ? JsonbValueAsText (res ) : NULL ;
755771
756- if (res && res -> type != jbvNull )
757- PG_RETURN_TEXT_P (JsonbValueAsText (res ));
772+ jsonbFreeIterators ();
773+
774+ if (r )
775+ PG_RETURN_TEXT_P (r );
758776 else
759777 PG_RETURN_NULL ();
760778}
@@ -1168,7 +1186,13 @@ jsonb_each(PG_FUNCTION_ARGS)
11681186Datum
11691187jsonb_each_text (PG_FUNCTION_ARGS )
11701188{
1171- return each_worker_json (fcinfo , "jsonb_each_text" , true, true);
1189+ Datum res ;
1190+
1191+ jsonbInitIterators ();
1192+ res = each_worker_json (fcinfo , "jsonb_each_text" , true, true);
1193+ jsonbFreeIterators ();
1194+
1195+ return res ;
11721196}
11731197
11741198Datum
@@ -1318,7 +1342,13 @@ jsonb_array_elements(PG_FUNCTION_ARGS)
13181342Datum
13191343jsonb_array_elements_text (PG_FUNCTION_ARGS )
13201344{
1321- return elements_worker_json (fcinfo , "jsonb_array_elements_text" , true, true);
1345+ Datum res ;
1346+
1347+ jsonbInitIterators ();
1348+ res = elements_worker_json (fcinfo , "jsonb_array_elements_text" , true, true);
1349+ jsonbFreeIterators ();
1350+
1351+ PG_RETURN_DATUM (res );
13221352}
13231353
13241354Datum
@@ -2810,7 +2840,7 @@ json_concat_internal(Json *jb1, Json *jb2, bool is_jsonb)
28102840
28112841 Assert (res != NULL );
28122842
2813- return JsonbValueToJsonb (res );
2843+ return JsonValueToJson (res );
28142844}
28152845
28162846/*
@@ -2821,17 +2851,35 @@ json_concat_internal(Json *jb1, Json *jb2, bool is_jsonb)
28212851Datum
28222852jsonb_concat (PG_FUNCTION_ARGS )
28232853{
2824- PG_RETURN_JSONB_P (json_concat_internal (PG_GETARG_JSONB_P (0 ),
2825- PG_GETARG_JSONB_P (1 ),
2826- true));
2854+ jsonbInitIterators ();
2855+
2856+ Json * js1 = PG_GETARG_JSONB_P (0 );
2857+ Json * js2 = PG_GETARG_JSONB_P (1 );
2858+ Json * js = json_concat_internal (js1 , js2 , true);
2859+ Datum res = JsonbPGetDatum (js ); //JsonValueGetJsonbDatum(res);
2860+
2861+ jsonbFreeIterators ();
2862+ PG_FREE_IF_COPY_JSONB (js1 , 0 );
2863+ PG_FREE_IF_COPY_JSONB (js2 , 0 );
2864+
2865+ PG_RETURN_DATUM (res );
28272866}
28282867
28292868Datum
28302869json_concat (PG_FUNCTION_ARGS )
28312870{
2832- PG_RETURN_JSONT_P (json_concat_internal (PG_GETARG_JSONT_P (0 ),
2833- PG_GETARG_JSONT_P (1 ),
2834- false));
2871+ jsonbInitIterators ();
2872+
2873+ Json * js1 = PG_GETARG_JSONT_P (0 );
2874+ Json * js2 = PG_GETARG_JSONT_P (1 );
2875+ Json * js = json_concat_internal (js1 , js2 , false);
2876+ Datum res = JsontPGetDatum (js );
2877+
2878+ jsonbFreeIterators ();
2879+ PG_FREE_IF_COPY_JSONB (js1 , 0 );
2880+ PG_FREE_IF_COPY_JSONB (js2 , 0 );
2881+
2882+ PG_RETURN_DATUM (res );
28352883}
28362884
28372885static Json *
@@ -3139,10 +3187,21 @@ json_set_internal(Json *in, ArrayType *path, Json *newjsonb, bool create)
31393187Datum
31403188jsonb_set (PG_FUNCTION_ARGS )
31413189{
3142- PG_RETURN_JSONB_P (json_set_internal (PG_GETARG_JSONB_P (0 ),
3190+ jsonbInitIterators ();
3191+
3192+ Json * jb1 = PG_GETARG_JSONB_P (0 );
3193+ Json * jb2 = PG_GETARG_JSONB_P (2 );
3194+ Json * res = json_set_internal (jb1 ,
31433195 PG_GETARG_ARRAYTYPE_P (1 ),
3144- PG_GETARG_JSONB_P (2 ),
3145- PG_GETARG_BOOL (3 )));
3196+ jb2 ,
3197+ PG_GETARG_BOOL (3 ));
3198+ Datum r = JsonbPGetDatum (res );
3199+
3200+ jsonbFreeIterators ();
3201+ PG_FREE_IF_COPY_JSONB (jb1 , 0 );
3202+ PG_FREE_IF_COPY_JSONB (jb2 , 2 );
3203+
3204+ PG_RETURN_DATUM (r );
31463205}
31473206
31483207Datum
0 commit comments