@@ -466,8 +466,7 @@ static JsonbValue *setPath(JsonbIterator **it, Datum *path_elems,
466466 int op_type );
467467static void setPathObject (JsonbIterator * * it , Datum * path_elems ,
468468 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 );
471470static void setPathArray (JsonbIterator * * it , Datum * path_elems ,
472471 bool * path_nulls , int path_len , JsonbParseState * * st ,
473472 int level , Jsonb * newval , uint32 nelems , int op_type );
@@ -4822,9 +4821,8 @@ setPath(JsonbIterator **it, Datum *path_elems,
48224821 break ;
48234822 case WJB_BEGIN_OBJECT :
48244823 (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 );
48284826 Assert (r == WJB_END_OBJECT );
48294827 res = pushJsonbValue (st , r , NULL );
48304828 break ;
@@ -4844,39 +4842,21 @@ setPath(JsonbIterator **it, Datum *path_elems,
48444842/*
48454843 * Object walker for setPath
48464844 */
4847- static void
4845+ static JsonbIteratorToken
48484846setPathObject (JsonbIterator * * it , Datum * path_elems , bool * path_nulls ,
48494847 int path_len , JsonbParseState * * st , int level ,
4850- Jsonb * newval , uint32 npairs , int op_type )
4848+ Jsonb * newval , int op_type )
48514849{
48524850 JsonbValue v ;
4853- int i ;
48544851 JsonbValue k ;
4852+ JsonbIteratorToken r ;
48554853 bool done = false;
48564854
48574855 if (level >= path_len || path_nulls [level ])
48584856 done = true;
48594857
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 )
48634859 {
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-
48804860 if (!done &&
48814861 k .val .string .len == VARSIZE_ANY_EXHDR (path_elems [level ]) &&
48824862 memcmp (k .val .string .val , VARDATA_ANY (path_elems [level ]),
@@ -4896,6 +4876,8 @@ setPathObject(JsonbIterator **it, Datum *path_elems, bool *path_nulls,
48964876 "to replace key value." )));
48974877
48984878 r = JsonbIteratorNext (it , & v , true); /* skip value */
4879+ Assert (r == WJB_VALUE );
4880+
48994881 if (!(op_type & JB_PATH_DELETE ))
49004882 {
49014883 (void ) pushJsonbValue (st , WJB_KEY , & k );
@@ -4912,25 +4894,26 @@ setPathObject(JsonbIterator **it, Datum *path_elems, bool *path_nulls,
49124894 }
49134895 else
49144896 {
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-
49284897 (void ) pushJsonbValue (st , r , & k );
49294898 r = JsonbIteratorNext (it , & v , true);
49304899 Assert (r == WJB_VALUE );
49314900 (void ) pushJsonbValue (st , r , & v );
49324901 }
49334902 }
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 ;
49344917}
49354918
49364919/*
0 commit comments