@@ -51,6 +51,27 @@ appendResult(ResultAccum *ra, JsonbValue *jb)
5151 pushJsonbValue (& ra -> jbArrayState , WJB_ELEM , jb );
5252}
5353
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+
5475static int
5576compareNumeric (Numeric a , Numeric b )
5677{
@@ -435,14 +456,37 @@ recursiveExecute(JsQueryItem *jsq, JsonbValue *jb, JsQueryItem *jsqLeftArg,
435456
436457 switch (jsq -> type ) {
437458 case jqiAnd :
438- jsqGetLeftArg (jsq , & elem );
439- res = recursiveExecute (& elem , jb , jsqLeftArg , ra );
440- if (res == true)
441459 {
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+
443469 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 ;
444489 }
445- break ;
446490 case jqiOr :
447491 jsqGetLeftArg (jsq , & elem );
448492 res = recursiveExecute (& elem , jb , jsqLeftArg , ra );
@@ -453,9 +497,18 @@ recursiveExecute(JsQueryItem *jsq, JsonbValue *jb, JsQueryItem *jsqLeftArg,
453497 }
454498 break ;
455499 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+ }
459512 case jqiKey :
460513 if (JsonbType (jb ) == jbvObject ) {
461514 JsonbValue * v , key ;
0 commit comments