@@ -452,10 +452,10 @@ static JsonbValue *setPath(JsonbIterator **it, Datum *path_elems,
452
452
bool * path_nulls ,int path_len ,
453
453
JsonbParseState * * st ,int level ,Jsonb * newval ,
454
454
int op_type );
455
- static void setPathObject (JsonbIterator * * it ,Datum * path_elems ,
455
+ static JsonbIteratorToken setPathObject (JsonbIterator * * it ,Datum * path_elems ,
456
456
bool * path_nulls ,int path_len ,JsonbParseState * * st ,
457
457
int level ,
458
- Jsonb * newval ,uint32 npairs , int op_type );
458
+ Jsonb * newval ,int op_type );
459
459
static void setPathArray (JsonbIterator * * it ,Datum * path_elems ,
460
460
bool * path_nulls ,int path_len ,JsonbParseState * * st ,
461
461
int level ,Jsonb * newval ,uint32 nelems ,int op_type );
@@ -4550,9 +4550,8 @@ setPath(JsonbIterator **it, Datum *path_elems,
4550
4550
break ;
4551
4551
case WJB_BEGIN_OBJECT :
4552
4552
(void )pushJsonbValue (st ,r ,NULL );
4553
- setPathObject (it ,path_elems ,path_nulls ,path_len ,st ,level ,
4554
- newval ,v .val .object .nPairs ,op_type );
4555
- r = JsonbIteratorNext (it ,& v , true);
4553
+ r = setPathObject (it ,path_elems ,path_nulls ,path_len ,st ,level ,
4554
+ newval ,op_type );
4556
4555
Assert (r == WJB_END_OBJECT );
4557
4556
res = pushJsonbValue (st ,r ,NULL );
4558
4557
break ;
@@ -4572,39 +4571,21 @@ setPath(JsonbIterator **it, Datum *path_elems,
4572
4571
/*
4573
4572
* Object walker for setPath
4574
4573
*/
4575
- static void
4574
+ static JsonbIteratorToken
4576
4575
setPathObject (JsonbIterator * * it ,Datum * path_elems ,bool * path_nulls ,
4577
4576
int path_len ,JsonbParseState * * st ,int level ,
4578
- Jsonb * newval ,uint32 npairs , int op_type )
4577
+ Jsonb * newval ,int op_type )
4579
4578
{
4580
4579
JsonbValue v ;
4581
- int i ;
4582
4580
JsonbValue k ;
4581
+ JsonbIteratorToken r ;
4583
4582
bool done = false;
4584
4583
4585
4584
if (level >=path_len || path_nulls [level ])
4586
4585
done = true;
4587
4586
4588
- /* empty object is a special case for create */
4589
- if ((npairs == 0 )&& (op_type & JB_PATH_CREATE_OR_INSERT )&&
4590
- (level == path_len - 1 ))
4587
+ while ((r = JsonbIteratorNext (it ,& k , true))== WJB_KEY )
4591
4588
{
4592
- JsonbValue newkey ;
4593
-
4594
- newkey .type = jbvString ;
4595
- newkey .val .string .len = VARSIZE_ANY_EXHDR (path_elems [level ]);
4596
- newkey .val .string .val = VARDATA_ANY (path_elems [level ]);
4597
-
4598
- (void )pushJsonbValue (st ,WJB_KEY ,& newkey );
4599
- addJsonbToParseState (st ,newval );
4600
- }
4601
-
4602
- for (i = 0 ;i < npairs ;i ++ )
4603
- {
4604
- JsonbIteratorToken r = JsonbIteratorNext (it ,& k , true);
4605
-
4606
- Assert (r == WJB_KEY );
4607
-
4608
4589
if (!done &&
4609
4590
k .val .string .len == VARSIZE_ANY_EXHDR (path_elems [level ])&&
4610
4591
memcmp (k .val .string .val ,VARDATA_ANY (path_elems [level ]),
@@ -4624,6 +4605,8 @@ setPathObject(JsonbIterator **it, Datum *path_elems, bool *path_nulls,
4624
4605
"to replace key value." )));
4625
4606
4626
4607
r = JsonbIteratorNext (it ,& v , true);/* skip value */
4608
+ Assert (r == WJB_VALUE );
4609
+
4627
4610
if (!(op_type & JB_PATH_DELETE ))
4628
4611
{
4629
4612
(void )pushJsonbValue (st ,WJB_KEY ,& k );
@@ -4640,25 +4623,26 @@ setPathObject(JsonbIterator **it, Datum *path_elems, bool *path_nulls,
4640
4623
}
4641
4624
else
4642
4625
{
4643
- if ((op_type & JB_PATH_CREATE_OR_INSERT )&& !done &&
4644
- level == path_len - 1 && i == npairs - 1 )
4645
- {
4646
- JsonbValue newkey ;
4647
-
4648
- newkey .type = jbvString ;
4649
- newkey .val .string .len = VARSIZE_ANY_EXHDR (path_elems [level ]);
4650
- newkey .val .string .val = VARDATA_ANY (path_elems [level ]);
4651
-
4652
- (void )pushJsonbValue (st ,WJB_KEY ,& newkey );
4653
- addJsonbToParseState (st ,newval );
4654
- }
4655
-
4656
4626
(void )pushJsonbValue (st ,r ,& k );
4657
4627
r = JsonbIteratorNext (it ,& v , true);
4658
4628
Assert (r == WJB_VALUE );
4659
4629
(void )pushJsonbValue (st ,r ,& v );
4660
4630
}
4661
4631
}
4632
+
4633
+ if ((op_type & JB_PATH_CREATE_OR_INSERT )&& !done && level == path_len - 1 )
4634
+ {
4635
+ JsonbValue newkey ;
4636
+
4637
+ newkey .type = jbvString ;
4638
+ newkey .val .string .len = VARSIZE_ANY_EXHDR (path_elems [level ]);
4639
+ newkey .val .string .val = VARDATA_ANY (path_elems [level ]);
4640
+
4641
+ (void )pushJsonbValue (st ,WJB_KEY ,& newkey );
4642
+ addJsonbToParseState (st ,newval );
4643
+ }
4644
+
4645
+ return r ;
4662
4646
}
4663
4647
4664
4648
/*