@@ -114,6 +114,7 @@ recursiveExtract(JsQueryItem *jsq, bool not, bool indirect, PathItem *path)
114
114
return recursiveExtract (& elem , not , indirect , pathItem );
115
115
case jqiAny :
116
116
case jqiAll :
117
+ /* 'NOT *: (predicate)' is equivalent to '*: (NOT predicate)' */
117
118
if ((not && jsq -> type == jqiAny ) || (!not && jsq -> type == jqiAll ))
118
119
return NULL ;
119
120
pathItem = (PathItem * )palloc (sizeof (PathItem ));
@@ -130,19 +131,23 @@ recursiveExtract(JsQueryItem *jsq, bool not, bool indirect, PathItem *path)
130
131
if (!jsqGetNext (jsq , & elem ))
131
132
return makeAnyNode (not , indirect , pathItem );
132
133
return recursiveExtract (& elem , not , true, pathItem );
133
- case jqiAnyArray :
134
134
case jqiAllArray :
135
- if ((not && jsq -> type == jqiAnyArray ) || (!not && jsq -> type == jqiAllArray ))
135
+ /* 'NOT #: (predicate)' is not equivalent to '#: (NOT predicate)' */
136
+ return NULL ;
137
+ case jqiAnyArray :
138
+ if (not )
136
139
return NULL ;
137
140
pathItem = (PathItem * )palloc (sizeof (PathItem ));
138
141
pathItem -> type = iAnyArray ;
139
142
pathItem -> parent = path ;
140
143
if (!jsqGetNext (jsq , & elem ))
141
144
return makeAnyNode (not , indirect , pathItem );
142
145
return recursiveExtract (& elem , not , true, pathItem );
143
- case jqiAnyKey :
144
146
case jqiAllKey :
145
- if ((not && jsq -> type == jqiAnyKey ) || (!not && jsq -> type == jqiAllKey ))
147
+ /* 'NOT %: (predicate)' is not equivalent to '%: (NOT predicate)' */
148
+ return NULL ;
149
+ case jqiAnyKey :
150
+ if (not )
146
151
return NULL ;
147
152
pathItem = (PathItem * )palloc (sizeof (PathItem ));
148
153
pathItem -> type = iAnyKey ;
0 commit comments