@@ -36,6 +36,29 @@ compareNumeric(Numeric a, Numeric b)
3636
3737}
3838
39+ #define jbvScalar jbvBinary
40+ static int
41+ JsonbType (JsonbValue * jb )
42+ {
43+ int type = jb -> type ;
44+
45+ if (jb -> type == jbvBinary )
46+ {
47+ JsonbContainer * jbc = jb -> val .binary .data ;
48+
49+ if (jbc -> header & JB_FSCALAR )
50+ type = jbvScalar ;
51+ else if (jbc -> header & JB_FOBJECT )
52+ type = jbvObject ;
53+ else if (jbc -> header & JB_FARRAY )
54+ type = jbvArray ;
55+ else
56+ elog (ERROR ,"Unknown container type: 0x%08x" ,jbc -> header );
57+ }
58+
59+ return type ;
60+ }
61+
3962static bool
4063recursiveAny (char * jqBase ,int32 jqPos ,JsonbValue * jb )
4164{
@@ -46,7 +69,6 @@ recursiveAny(char *jqBase, int32 jqPos, JsonbValue *jb)
4669
4770check_stack_depth ();
4871
49-
5072it = JsonbIteratorInit (jb -> val .binary .data );
5173
5274while (res == false&& (r = JsonbIteratorNext (& it ,& v , true))!= WJB_DONE )
@@ -108,7 +130,7 @@ checkArrayEquality(char *jqBase, int32 jqPos, int32 type, JsonbValue *jb)
108130JsonbIterator * it ;
109131JsonbValue v ;
110132
111- if (!(type == jqiArray && jb -> type == jbvBinary ))
133+ if (!(type == jqiArray && JsonbType ( jb ) == jbvArray ))
112134return false;
113135
114136read_int32 (nelems ,jqBase ,jqPos );
@@ -117,9 +139,7 @@ checkArrayEquality(char *jqBase, int32 jqPos, int32 type, JsonbValue *jb)
117139it = JsonbIteratorInit (jb -> val .binary .data );
118140
119141r = JsonbIteratorNext (& it ,& v , true);
120-
121- if (r != WJB_BEGIN_ARRAY )
122- return false;
142+ Assert (r == WJB_BEGIN_ARRAY );
123143
124144if (v .val .array .nElems != nelems )
125145return false;
@@ -168,7 +188,7 @@ executeArrayOp(char *jqBase, int32 jqPos, int32 type, int32 op, JsonbValue *jb)
168188JsonbValue v ;
169189int32 nres = 0 ,nval = 0 ;
170190
171- if (jb -> type != jbvBinary )
191+ if (JsonbType ( jb ) != jbvArray )
172192return false;
173193if (type != jqiArray )
174194return false;
@@ -280,7 +300,7 @@ executeExpr(char *jqBase, int32 jqPos, int32 op, JsonbValue *jb)
280300switch (op )
281301{
282302case jqiEqual :
283- if (jb -> type == jbvBinary && type == jqiArray )
303+ if (JsonbType ( jb ) == jbvArray && type == jqiArray )
284304return checkArrayEquality (jqBase ,jqPos ,type ,jb );
285305return checkEquality (jqBase ,jqPos ,type ,jb );
286306case jqiIn :
@@ -332,7 +352,7 @@ recursiveExecute(char *jqBase, int32 jqPos, JsonbValue *jb)
332352res = !recursiveExecute (jqBase ,arg ,jb );
333353break ;
334354case jqiKey :
335- if (jb -> type == jbvBinary ) {
355+ if (JsonbType ( jb ) == jbvObject ) {
336356int32 len ;
337357JsonbValue * v ,key ;
338358
@@ -356,11 +376,33 @@ recursiveExecute(char *jqBase, int32 jqPos, JsonbValue *jb)
356376res = recursiveAny (jqBase ,nextPos ,jb );
357377break ;
358378case jqiCurrent :
359- res = recursiveExecute (jqBase ,nextPos ,jb );
379+ if (JsonbType (jb )== jbvScalar )
380+ {
381+ JsonbIterator * it ;
382+ int32 r ;
383+ JsonbValue v ;
384+
385+ it = JsonbIteratorInit (jb -> val .binary .data );
386+
387+ r = JsonbIteratorNext (& it ,& v , true);
388+ Assert (r == WJB_BEGIN_ARRAY );
389+ Assert (v .val .array .rawScalar == 1 );
390+ Assert (v .val .array .nElems == 1 );
391+
392+ r = JsonbIteratorNext (& it ,& v , true);
393+ Assert (r == WJB_ELEM );
394+
395+ res = recursiveExecute (jqBase ,nextPos ,& v );
396+ }
397+ else
398+ {
399+ res = recursiveExecute (jqBase ,nextPos ,jb );
400+ }
360401break ;
361402case jqiAnyArray :
362403Assert (nextPos != 0 );
363- if (jb -> type == jbvBinary ) {
404+ if (JsonbType (jb )== jbvArray )
405+ {
364406JsonbIterator * it ;
365407int32 r ;
366408JsonbValue v ;
@@ -369,17 +411,15 @@ recursiveExecute(char *jqBase, int32 jqPos, JsonbValue *jb)
369411
370412while (res == false&& (r = JsonbIteratorNext (& it ,& v , true))!= WJB_DONE )
371413{
372- if (r == WJB_BEGIN_OBJECT || r == WJB_KEY )
373- break ;
374-
375414if (r == WJB_ELEM )
376415res = recursiveExecute (jqBase ,nextPos ,& v );
377416}
378417}
379418break ;
380419case jqiAnyKey :
381420Assert (nextPos != 0 );
382- if (jb -> type == jbvBinary ) {
421+ if (JsonbType (jb )== jbvObject )
422+ {
383423JsonbIterator * it ;
384424int32 r ;
385425JsonbValue v ;
@@ -388,9 +428,6 @@ recursiveExecute(char *jqBase, int32 jqPos, JsonbValue *jb)
388428
389429while (res == false&& (r = JsonbIteratorNext (& it ,& v , true))!= WJB_DONE )
390430{
391- if (r == WJB_BEGIN_ARRAY || r == WJB_ELEM )
392- break ;
393-
394431if (r == WJB_VALUE )
395432res = recursiveExecute (jqBase ,nextPos ,& v );
396433}