@@ -36,6 +36,29 @@ compareNumeric(Numeric a, Numeric b)
36
36
37
37
}
38
38
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
+
39
62
static bool
40
63
recursiveAny (char * jqBase , int32 jqPos , JsonbValue * jb )
41
64
{
@@ -46,7 +69,6 @@ recursiveAny(char *jqBase, int32 jqPos, JsonbValue *jb)
46
69
47
70
check_stack_depth ();
48
71
49
-
50
72
it = JsonbIteratorInit (jb -> val .binary .data );
51
73
52
74
while (res == false && (r = JsonbIteratorNext (& it , & v , true)) != WJB_DONE )
@@ -108,7 +130,7 @@ checkArrayEquality(char *jqBase, int32 jqPos, int32 type, JsonbValue *jb)
108
130
JsonbIterator * it ;
109
131
JsonbValue v ;
110
132
111
- if (!(type == jqiArray && jb -> type == jbvBinary ))
133
+ if (!(type == jqiArray && JsonbType ( jb ) == jbvArray ))
112
134
return false;
113
135
114
136
read_int32 (nelems , jqBase , jqPos );
@@ -117,9 +139,7 @@ checkArrayEquality(char *jqBase, int32 jqPos, int32 type, JsonbValue *jb)
117
139
it = JsonbIteratorInit (jb -> val .binary .data );
118
140
119
141
r = JsonbIteratorNext (& it , & v , true);
120
-
121
- if (r != WJB_BEGIN_ARRAY )
122
- return false;
142
+ Assert (r == WJB_BEGIN_ARRAY );
123
143
124
144
if (v .val .array .nElems != nelems )
125
145
return false;
@@ -168,7 +188,7 @@ executeArrayOp(char *jqBase, int32 jqPos, int32 type, int32 op, JsonbValue *jb)
168
188
JsonbValue v ;
169
189
int32 nres = 0 , nval = 0 ;
170
190
171
- if (jb -> type != jbvBinary )
191
+ if (JsonbType ( jb ) != jbvArray )
172
192
return false;
173
193
if (type != jqiArray )
174
194
return false;
@@ -280,7 +300,7 @@ executeExpr(char *jqBase, int32 jqPos, int32 op, JsonbValue *jb)
280
300
switch (op )
281
301
{
282
302
case jqiEqual :
283
- if (jb -> type == jbvBinary && type == jqiArray )
303
+ if (JsonbType ( jb ) == jbvArray && type == jqiArray )
284
304
return checkArrayEquality (jqBase , jqPos , type , jb );
285
305
return checkEquality (jqBase , jqPos , type , jb );
286
306
case jqiIn :
@@ -332,7 +352,7 @@ recursiveExecute(char *jqBase, int32 jqPos, JsonbValue *jb)
332
352
res = ! recursiveExecute (jqBase , arg , jb );
333
353
break ;
334
354
case jqiKey :
335
- if (jb -> type == jbvBinary ) {
355
+ if (JsonbType ( jb ) == jbvObject ) {
336
356
int32 len ;
337
357
JsonbValue * v , key ;
338
358
@@ -356,11 +376,33 @@ recursiveExecute(char *jqBase, int32 jqPos, JsonbValue *jb)
356
376
res = recursiveAny (jqBase , nextPos , jb );
357
377
break ;
358
378
case 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
+ }
360
401
break ;
361
402
case jqiAnyArray :
362
403
Assert (nextPos != 0 );
363
- if (jb -> type == jbvBinary ) {
404
+ if (JsonbType (jb ) == jbvArray )
405
+ {
364
406
JsonbIterator * it ;
365
407
int32 r ;
366
408
JsonbValue v ;
@@ -369,17 +411,15 @@ recursiveExecute(char *jqBase, int32 jqPos, JsonbValue *jb)
369
411
370
412
while (res == false && (r = JsonbIteratorNext (& it , & v , true)) != WJB_DONE )
371
413
{
372
- if (r == WJB_BEGIN_OBJECT || r == WJB_KEY )
373
- break ;
374
-
375
414
if (r == WJB_ELEM )
376
415
res = recursiveExecute (jqBase , nextPos , & v );
377
416
}
378
417
}
379
418
break ;
380
419
case jqiAnyKey :
381
420
Assert (nextPos != 0 );
382
- if (jb -> type == jbvBinary ) {
421
+ if (JsonbType (jb ) == jbvObject )
422
+ {
383
423
JsonbIterator * it ;
384
424
int32 r ;
385
425
JsonbValue v ;
@@ -388,9 +428,6 @@ recursiveExecute(char *jqBase, int32 jqPos, JsonbValue *jb)
388
428
389
429
while (res == false && (r = JsonbIteratorNext (& it , & v , true)) != WJB_DONE )
390
430
{
391
- if (r == WJB_BEGIN_ARRAY || r == WJB_ELEM )
392
- break ;
393
-
394
431
if (r == WJB_VALUE )
395
432
res = recursiveExecute (jqBase , nextPos , & v );
396
433
}
0 commit comments