@@ -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
/*