@@ -822,17 +822,24 @@ jsonb_object_field(PG_FUNCTION_ARGS)
822822 text * key = PG_GETARG_TEXT_PP (1 );
823823 JsonbValue * v ;
824824 JsonbValue vbuf ;
825+ Datum res ;
825826
826827 if (!JB_ROOT_IS_OBJECT (jb ))
827828 PG_RETURN_NULL ();
828829
830+ jsonbInitIterators ();
831+
829832 v = getKeyJsonValueFromContainer (& jb -> root ,
830833 VARDATA_ANY (key ),
831834 VARSIZE_ANY_EXHDR (key ),
832835 & vbuf );
833836
834- if (v != NULL )
835- PG_RETURN_JSONB_VALUE_P (v );
837+ res = v ? JsonValueToJsonbDatum (v ) : (Datum ) 0 ;
838+
839+ jsonbFreeIterators ();
840+
841+ if (res != (Datum ) 0 )
842+ PG_RETURN_DATUM (res );
836843
837844 PG_RETURN_NULL ();
838845}
@@ -860,17 +867,24 @@ jsonb_object_field_text(PG_FUNCTION_ARGS)
860867 text * key = PG_GETARG_TEXT_PP (1 );
861868 JsonbValue * v ;
862869 JsonbValue vbuf ;
870+ text * res ;
863871
864872 if (!JB_ROOT_IS_OBJECT (jb ))
865873 PG_RETURN_NULL ();
866874
875+ jsonbInitIterators ();
876+
867877 v = getKeyJsonValueFromContainer (& jb -> root ,
868878 VARDATA_ANY (key ),
869879 VARSIZE_ANY_EXHDR (key ),
870880 & vbuf );
871881
872- if (v != NULL && v -> type != jbvNull )
873- PG_RETURN_TEXT_P (JsonbValueAsText (v ));
882+ res = v != NULL && v -> type != jbvNull ? JsonbValueAsText (v ) : NULL ;
883+
884+ jsonbFreeIterators ();
885+
886+ if (res )
887+ PG_RETURN_TEXT_P (res );
874888
875889 PG_RETURN_NULL ();
876890}
@@ -896,6 +910,7 @@ jsonb_array_element(PG_FUNCTION_ARGS)
896910 Jsonb * jb = PG_GETARG_JSONB_P (0 );
897911 int element = PG_GETARG_INT32 (1 );
898912 JsonbValue * v ;
913+ Datum res ;
899914
900915 if (!JB_ROOT_IS_ARRAY (jb ))
901916 PG_RETURN_NULL ();
@@ -911,9 +926,15 @@ jsonb_array_element(PG_FUNCTION_ARGS)
911926 element += nelements ;
912927 }
913928
929+ jsonbInitIterators ();
930+
914931 v = getIthJsonbValueFromContainer (JsonbRoot (jb ), element );
915- if (v != NULL )
916- PG_RETURN_JSONB_VALUE_P (v );
932+ res = v != NULL ? JsonValueToJsonbDatum (v ) : (Datum ) 0 ;
933+
934+ jsonbFreeIterators ();
935+
936+ if (res != (Datum ) 0 )
937+ PG_RETURN_DATUM (res );
917938
918939 PG_RETURN_NULL ();
919940}
@@ -939,6 +960,7 @@ jsonb_array_element_text(PG_FUNCTION_ARGS)
939960 Jsonb * jb = PG_GETARG_JSONB_P (0 );
940961 int element = PG_GETARG_INT32 (1 );
941962 JsonbValue * v ;
963+ text * res ;
942964
943965 if (!JB_ROOT_IS_ARRAY (jb ))
944966 PG_RETURN_NULL ();
@@ -954,10 +976,15 @@ jsonb_array_element_text(PG_FUNCTION_ARGS)
954976 element += nelements ;
955977 }
956978
979+ jsonbInitIterators ();
980+
957981 v = getIthJsonbValueFromContainer (JsonbRoot (jb ), element );
982+ res = v != NULL && v -> type != jbvNull ? JsonbValueAsText (v ) : NULL ;
983+
984+ jsonbFreeIterators ();
958985
959- if (v != NULL && v -> type != jbvNull )
960- PG_RETURN_TEXT_P (JsonbValueAsText ( v ) );
986+ if (res )
987+ PG_RETURN_TEXT_P (res );
961988
962989 PG_RETURN_NULL ();
963990}
@@ -1457,8 +1484,12 @@ get_jsonb_path_all(FunctionCallInfo fcinfo, bool as_text)
14571484
14581485 deconstruct_array_builtin (path , TEXTOID , & pathtext , & pathnulls , & npath );
14591486
1487+ jsonbInitIterators ();
1488+
14601489 res = jsonb_get_element (jb , pathtext , npath , & isnull , as_text );
14611490
1491+ jsonbFreeIterators ();
1492+
14621493 if (isnull )
14631494 PG_RETURN_NULL ();
14641495 else
@@ -1886,7 +1917,13 @@ json_each(PG_FUNCTION_ARGS)
18861917Datum
18871918jsonb_each (PG_FUNCTION_ARGS )
18881919{
1889- return each_worker_jsonb (fcinfo , "jsonb_each" , false);
1920+ Datum res ;
1921+
1922+ jsonbInitIterators ();
1923+ res = each_worker_jsonb (fcinfo , "jsonb_each" , false);
1924+ jsonbFreeIterators ();
1925+
1926+ PG_RETURN_DATUM (res );
18901927}
18911928
18921929Datum
@@ -2128,13 +2165,25 @@ each_scalar(void *state, char *token, JsonTokenType tokentype)
21282165Datum
21292166jsonb_array_elements (PG_FUNCTION_ARGS )
21302167{
2131- return elements_worker_jsonb (fcinfo , "jsonb_array_elements" , false);
2168+ Datum res ;
2169+
2170+ jsonbInitIterators ();
2171+ res = elements_worker_jsonb (fcinfo , "jsonb_array_elements" , false);
2172+ jsonbFreeIterators ();
2173+
2174+ PG_RETURN_DATUM (res );
21322175}
21332176
21342177Datum
21352178jsonb_array_elements_text (PG_FUNCTION_ARGS )
21362179{
2137- return elements_worker_jsonb (fcinfo , "jsonb_array_elements_text" , true);
2180+ Datum res ;
2181+
2182+ jsonbInitIterators ();
2183+ res = elements_worker_jsonb (fcinfo , "jsonb_array_elements_text" , true);
2184+ jsonbFreeIterators ();
2185+
2186+ PG_RETURN_DATUM (res );
21382187}
21392188
21402189static Datum
0 commit comments