@@ -466,8 +466,7 @@ static JsonbValue *setPath(JsonbIterator **it, Datum *path_elems,
466
466
int op_type );
467
467
static void setPathObject (JsonbIterator * * it , Datum * path_elems ,
468
468
bool * path_nulls , int path_len , JsonbParseState * * st ,
469
- int level ,
470
- Jsonb * newval , uint32 npairs , int op_type );
469
+ int level , Jsonb * newval , int op_type );
471
470
static void setPathArray (JsonbIterator * * it , Datum * path_elems ,
472
471
bool * path_nulls , int path_len , JsonbParseState * * st ,
473
472
int level , Jsonb * newval , uint32 nelems , int op_type );
@@ -4822,9 +4821,8 @@ setPath(JsonbIterator **it, Datum *path_elems,
4822
4821
break ;
4823
4822
case WJB_BEGIN_OBJECT :
4824
4823
(void ) pushJsonbValue (st , r , NULL );
4825
- setPathObject (it , path_elems , path_nulls , path_len , st , level ,
4826
- newval , v .val .object .nPairs , op_type );
4827
- r = JsonbIteratorNext (it , & v , true);
4824
+ r = setPathObject (it , path_elems , path_nulls , path_len , st , level ,
4825
+ newval , op_type );
4828
4826
Assert (r == WJB_END_OBJECT );
4829
4827
res = pushJsonbValue (st , r , NULL );
4830
4828
break ;
@@ -4844,39 +4842,21 @@ setPath(JsonbIterator **it, Datum *path_elems,
4844
4842
/*
4845
4843
* Object walker for setPath
4846
4844
*/
4847
- static void
4845
+ static JsonbIteratorToken
4848
4846
setPathObject (JsonbIterator * * it , Datum * path_elems , bool * path_nulls ,
4849
4847
int path_len , JsonbParseState * * st , int level ,
4850
- Jsonb * newval , uint32 npairs , int op_type )
4848
+ Jsonb * newval , int op_type )
4851
4849
{
4852
4850
JsonbValue v ;
4853
- int i ;
4854
4851
JsonbValue k ;
4852
+ JsonbIteratorToken r ;
4855
4853
bool done = false;
4856
4854
4857
4855
if (level >= path_len || path_nulls [level ])
4858
4856
done = true;
4859
4857
4860
- /* empty object is a special case for create */
4861
- if ((npairs == 0 ) && (op_type & JB_PATH_CREATE_OR_INSERT ) &&
4862
- (level == path_len - 1 ))
4858
+ while ((r = JsonbIteratorNext (it , & k , true)) == WJB_KEY )
4863
4859
{
4864
- JsonbValue newkey ;
4865
-
4866
- newkey .type = jbvString ;
4867
- newkey .val .string .len = VARSIZE_ANY_EXHDR (path_elems [level ]);
4868
- newkey .val .string .val = VARDATA_ANY (path_elems [level ]);
4869
-
4870
- (void ) pushJsonbValue (st , WJB_KEY , & newkey );
4871
- addJsonbToParseState (st , newval );
4872
- }
4873
-
4874
- for (i = 0 ; i < npairs ; i ++ )
4875
- {
4876
- JsonbIteratorToken r = JsonbIteratorNext (it , & k , true);
4877
-
4878
- Assert (r == WJB_KEY );
4879
-
4880
4860
if (!done &&
4881
4861
k .val .string .len == VARSIZE_ANY_EXHDR (path_elems [level ]) &&
4882
4862
memcmp (k .val .string .val , VARDATA_ANY (path_elems [level ]),
@@ -4896,6 +4876,8 @@ setPathObject(JsonbIterator **it, Datum *path_elems, bool *path_nulls,
4896
4876
"to replace key value." )));
4897
4877
4898
4878
r = JsonbIteratorNext (it , & v , true); /* skip value */
4879
+ Assert (r == WJB_VALUE );
4880
+
4899
4881
if (!(op_type & JB_PATH_DELETE ))
4900
4882
{
4901
4883
(void ) pushJsonbValue (st , WJB_KEY , & k );
@@ -4912,25 +4894,26 @@ setPathObject(JsonbIterator **it, Datum *path_elems, bool *path_nulls,
4912
4894
}
4913
4895
else
4914
4896
{
4915
- if ((op_type & JB_PATH_CREATE_OR_INSERT ) && !done &&
4916
- level == path_len - 1 && i == npairs - 1 )
4917
- {
4918
- JsonbValue newkey ;
4919
-
4920
- newkey .type = jbvString ;
4921
- newkey .val .string .len = VARSIZE_ANY_EXHDR (path_elems [level ]);
4922
- newkey .val .string .val = VARDATA_ANY (path_elems [level ]);
4923
-
4924
- (void ) pushJsonbValue (st , WJB_KEY , & newkey );
4925
- addJsonbToParseState (st , newval );
4926
- }
4927
-
4928
4897
(void ) pushJsonbValue (st , r , & k );
4929
4898
r = JsonbIteratorNext (it , & v , true);
4930
4899
Assert (r == WJB_VALUE );
4931
4900
(void ) pushJsonbValue (st , r , & v );
4932
4901
}
4933
4902
}
4903
+
4904
+ if ((op_type & JB_PATH_CREATE_OR_INSERT ) && !done && level == path_len - 1 )
4905
+ {
4906
+ JsonbValue newkey ;
4907
+
4908
+ newkey .type = jbvString ;
4909
+ newkey .val .string .len = VARSIZE_ANY_EXHDR (path_elems [level ]);
4910
+ newkey .val .string .val = VARDATA_ANY (path_elems [level ]);
4911
+
4912
+ (void ) pushJsonbValue (st , WJB_KEY , & newkey );
4913
+ addJsonbToParseState (st , newval );
4914
+ }
4915
+
4916
+ return r ;
4934
4917
}
4935
4918
4936
4919
/*
0 commit comments