@@ -51,6 +51,27 @@ appendResult(ResultAccum *ra, JsonbValue *jb)
51
51
pushJsonbValue (& ra -> jbArrayState , WJB_ELEM , jb );
52
52
}
53
53
54
+ static void
55
+ concatResult (ResultAccum * ra , JsonbParseState * a , JsonbParseState * b )
56
+ {
57
+ Jsonb * value ;
58
+ JsonbIterator * it ;
59
+ int32 r ;
60
+ JsonbValue v ;
61
+
62
+ Assert (a );
63
+ Assert (b );
64
+
65
+ ra -> jbArrayState = a ;
66
+
67
+ value = JsonbValueToJsonb (pushJsonbValue (& b , WJB_END_ARRAY , NULL ));
68
+ it = JsonbIteratorInit (& value -> root );
69
+
70
+ while ((r = JsonbIteratorNext (& it , & v , true)) != WJB_DONE )
71
+ if (r == WJB_ELEM )
72
+ pushJsonbValue (& ra -> jbArrayState , WJB_ELEM , & v );
73
+ }
74
+
54
75
static int
55
76
compareNumeric (Numeric a , Numeric b )
56
77
{
@@ -435,14 +456,37 @@ recursiveExecute(JsQueryItem *jsq, JsonbValue *jb, JsQueryItem *jsqLeftArg,
435
456
436
457
switch (jsq -> type ) {
437
458
case jqiAnd :
438
- jsqGetLeftArg (jsq , & elem );
439
- res = recursiveExecute (& elem , jb , jsqLeftArg , ra );
440
- if (res == true)
441
459
{
442
- jsqGetRightArg (jsq , & elem );
460
+ JsonbParseState * saveJbArrayState = NULL ;
461
+
462
+ jsqGetLeftArg (jsq , & elem );
463
+ if (ra && ra -> missAppend == false)
464
+ {
465
+ saveJbArrayState = ra -> jbArrayState ;
466
+ ra -> jbArrayState = NULL ;
467
+ }
468
+
443
469
res = recursiveExecute (& elem , jb , jsqLeftArg , ra );
470
+ if (res == true)
471
+ {
472
+ jsqGetRightArg (jsq , & elem );
473
+ res = recursiveExecute (& elem , jb , jsqLeftArg , ra );
474
+ }
475
+
476
+ if (ra && ra -> missAppend == false)
477
+ {
478
+ if (res == true)
479
+ {
480
+ if (saveJbArrayState != NULL )
481
+ /* append args lists to current */
482
+ concatResult (ra , saveJbArrayState , ra -> jbArrayState );
483
+ }
484
+ else
485
+ ra -> jbArrayState = saveJbArrayState ;
486
+ }
487
+
488
+ break ;
444
489
}
445
- break ;
446
490
case jqiOr :
447
491
jsqGetLeftArg (jsq , & elem );
448
492
res = recursiveExecute (& elem , jb , jsqLeftArg , ra );
@@ -453,9 +497,18 @@ recursiveExecute(JsQueryItem *jsq, JsonbValue *jb, JsQueryItem *jsqLeftArg,
453
497
}
454
498
break ;
455
499
case jqiNot :
456
- jsqGetArg (jsq , & elem );
457
- res = !recursiveExecute (& elem , jb , jsqLeftArg , ra );
458
- break ;
500
+ {
501
+ bool saveMissAppend = (ra ) ? ra -> missAppend : true;
502
+
503
+ jsqGetArg (jsq , & elem );
504
+ if (ra )
505
+ ra -> missAppend = true;
506
+ res = !recursiveExecute (& elem , jb , jsqLeftArg , ra );
507
+ if (ra )
508
+ ra -> missAppend = saveMissAppend ;
509
+
510
+ break ;
511
+ }
459
512
case jqiKey :
460
513
if (JsonbType (jb ) == jbvObject ) {
461
514
JsonbValue * v , key ;
0 commit comments