@@ -526,9 +526,6 @@ checkEquality(JsonbValue *jb1, JsonbValue *jb2, bool not)
526
526
return jperError ;
527
527
}
528
528
529
- if (jb1 -> type == jbvBinary )
530
- return jperError ;
531
-
532
529
switch (jb1 -> type )
533
530
{
534
531
case jbvNull :
@@ -560,8 +557,14 @@ checkEquality(JsonbValue *jb1, JsonbValue *jb2, bool not)
560
557
561
558
break ;
562
559
}
560
+
561
+ case jbvBinary :
562
+ case jbvObject :
563
+ case jbvArray :
564
+ return jperError ;
565
+
563
566
default :
564
- elog (ERROR ,"1Wrong state" );
567
+ elog (ERROR , "Unknown jsonb value type %d" , jb1 -> type );
565
568
}
566
569
567
570
return (not ^ eq ) ? jperOk : jperNotFound ;
@@ -1284,6 +1287,10 @@ recursiveExecuteNoUnwrap(JsonPathExecContext *cxt, JsonPathItem *jsp,
1284
1287
if (JsonbType (jb ) == jbvObject )
1285
1288
{
1286
1289
JsonbValue * v , key ;
1290
+ JsonbValue obj ;
1291
+
1292
+ if (jb -> type == jbvObject )
1293
+ jb = JsonbWrapInBinary (jb , & obj );
1287
1294
1288
1295
key .type = jbvString ;
1289
1296
key .val .string .val = jspGetString (jsp , & key .val .string .len );
@@ -1339,18 +1346,16 @@ recursiveExecuteNoUnwrap(JsonPathExecContext *cxt, JsonPathItem *jsp,
1339
1346
case jpiAnyArray :
1340
1347
if (JsonbType (jb ) == jbvArray )
1341
1348
{
1342
- JsonbIterator * it ;
1343
- int32 r ;
1344
- JsonbValue v ;
1345
-
1346
1349
hasNext = jspGetNext (jsp , & elem );
1347
- it = JsonbIteratorInit (jb -> val .binary .data );
1348
1350
1349
- while (( r = JsonbIteratorNext ( & it , & v , true)) != WJB_DONE )
1351
+ if ( jb -> type == jbvArray )
1350
1352
{
1351
- if (r == WJB_ELEM )
1353
+ JsonbValue * el = jb -> val .array .elems ;
1354
+ JsonbValue * last_el = el + jb -> val .array .nElems ;
1355
+
1356
+ for (; el < last_el ; el ++ )
1352
1357
{
1353
- res = recursiveExecuteNext (cxt , jsp , & elem , & v , found , true);
1358
+ res = recursiveExecuteNext (cxt , jsp , & elem , el , found , true);
1354
1359
1355
1360
if (jperIsError (res ))
1356
1361
break ;
@@ -1359,6 +1364,28 @@ recursiveExecuteNoUnwrap(JsonPathExecContext *cxt, JsonPathItem *jsp,
1359
1364
break ;
1360
1365
}
1361
1366
}
1367
+ else
1368
+ {
1369
+ JsonbValue v ;
1370
+ JsonbIterator * it ;
1371
+ JsonbIteratorToken r ;
1372
+
1373
+ it = JsonbIteratorInit (jb -> val .binary .data );
1374
+
1375
+ while ((r = JsonbIteratorNext (& it , & v , true)) != WJB_DONE )
1376
+ {
1377
+ if (r == WJB_ELEM )
1378
+ {
1379
+ res = recursiveExecuteNext (cxt , jsp , & elem , & v , found , true);
1380
+
1381
+ if (jperIsError (res ))
1382
+ break ;
1383
+
1384
+ if (res == jperOk && !found )
1385
+ break ;
1386
+ }
1387
+ }
1388
+ }
1362
1389
}
1363
1390
else
1364
1391
res = jperMakeError (ERRCODE_JSON_ARRAY_NOT_FOUND );
@@ -1370,6 +1397,7 @@ recursiveExecuteNoUnwrap(JsonPathExecContext *cxt, JsonPathItem *jsp,
1370
1397
int innermostArraySize = cxt -> innermostArraySize ;
1371
1398
int i ;
1372
1399
int size = JsonbArraySize (jb );
1400
+ bool binary = jb -> type == jbvBinary ;
1373
1401
1374
1402
cxt -> innermostArraySize = size ; /* for LAST evaluation */
1375
1403
@@ -1418,14 +1446,16 @@ recursiveExecuteNoUnwrap(JsonPathExecContext *cxt, JsonPathItem *jsp,
1418
1446
1419
1447
for (index = index_from ; index <= index_to ; index ++ )
1420
1448
{
1421
- JsonbValue * v =
1449
+ JsonbValue * v = binary ?
1422
1450
getIthJsonbValueFromContainer (jb -> val .binary .data ,
1423
- (uint32 ) index );
1451
+ (uint32 ) index ) :
1452
+ & jb -> val .array .elems [index ];
1424
1453
1425
1454
if (v == NULL )
1426
1455
continue ;
1427
1456
1428
- res = recursiveExecuteNext (cxt , jsp , & elem , v , found , false);
1457
+ res = recursiveExecuteNext (cxt , jsp , & elem , v , found ,
1458
+ !binary );
1429
1459
1430
1460
if (jperIsError (res ))
1431
1461
break ;
@@ -1483,6 +1513,10 @@ recursiveExecuteNoUnwrap(JsonPathExecContext *cxt, JsonPathItem *jsp,
1483
1513
JsonbIterator * it ;
1484
1514
int32 r ;
1485
1515
JsonbValue v ;
1516
+ JsonbValue bin ;
1517
+
1518
+ if (jb -> type == jbvObject )
1519
+ jb = JsonbWrapInBinary (jb , & bin );
1486
1520
1487
1521
hasNext = jspGetNext (jsp , & elem );
1488
1522
it = JsonbIteratorInit (jb -> val .binary .data );
@@ -1535,25 +1569,30 @@ recursiveExecuteNoUnwrap(JsonPathExecContext *cxt, JsonPathItem *jsp,
1535
1569
res = recursiveExecuteNext (cxt , jsp , NULL , jb , found , true);
1536
1570
break ;
1537
1571
case jpiAny :
1538
- {
1539
- bool hasNext = jspGetNext (jsp , & elem );
1540
-
1541
- /* first try without any intermediate steps */
1542
- if (jsp -> content .anybounds .first == 0 )
1543
1572
{
1544
- res = recursiveExecuteNext ( cxt , jsp , & elem , jb , found , true) ;
1573
+ JsonbValue jbvbuf ;
1545
1574
1546
- if (res == jperOk && !found )
1547
- break ;
1548
- }
1575
+ hasNext = jspGetNext (jsp , & elem );
1549
1576
1550
- if (jb -> type == jbvBinary )
1551
- res = recursiveAny (cxt , hasNext ? & elem : NULL , jb , found ,
1552
- 1 ,
1553
- jsp -> content .anybounds .first ,
1554
- jsp -> content .anybounds .last );
1555
- break ;
1556
- }
1577
+ /* first try without any intermediate steps */
1578
+ if (jsp -> content .anybounds .first == 0 )
1579
+ {
1580
+ res = recursiveExecuteNext (cxt , jsp , & elem , jb , found , true);
1581
+
1582
+ if (res == jperOk && !found )
1583
+ break ;
1584
+ }
1585
+
1586
+ if (jb -> type == jbvArray || jb -> type == jbvObject )
1587
+ jb = JsonbWrapInBinary (jb , & jbvbuf );
1588
+
1589
+ if (jb -> type == jbvBinary )
1590
+ res = recursiveAny (cxt , hasNext ? & elem : NULL , jb , found ,
1591
+ 1 ,
1592
+ jsp -> content .anybounds .first ,
1593
+ jsp -> content .anybounds .last );
1594
+ break ;
1595
+ }
1557
1596
case jpiExists :
1558
1597
jspGetArg (jsp , & elem );
1559
1598
@@ -1829,6 +1868,7 @@ recursiveExecuteNoUnwrap(JsonPathExecContext *cxt, JsonPathItem *jsp,
1829
1868
else
1830
1869
{
1831
1870
int32 r ;
1871
+ JsonbValue bin ;
1832
1872
JsonbValue key ;
1833
1873
JsonbValue val ;
1834
1874
JsonbValue obj ;
@@ -1839,7 +1879,9 @@ recursiveExecuteNoUnwrap(JsonPathExecContext *cxt, JsonPathItem *jsp,
1839
1879
1840
1880
hasNext = jspGetNext (jsp , & elem );
1841
1881
1842
- if (!JsonContainerSize (jb -> val .binary .data ))
1882
+ if (jb -> type == jbvBinary
1883
+ ? !JsonContainerSize (jb -> val .binary .data )
1884
+ : !jb -> val .object .nPairs )
1843
1885
{
1844
1886
res = jperNotFound ;
1845
1887
break ;
@@ -1856,6 +1898,9 @@ recursiveExecuteNoUnwrap(JsonPathExecContext *cxt, JsonPathItem *jsp,
1856
1898
valstr .val .string .val = "value" ;
1857
1899
valstr .val .string .len = 5 ;
1858
1900
1901
+ if (jb -> type == jbvObject )
1902
+ jb = JsonbWrapInBinary (jb , & bin );
1903
+
1859
1904
it = JsonbIteratorInit (jb -> val .binary .data );
1860
1905
1861
1906
while ((r = JsonbIteratorNext (& it , & key , true)) != WJB_DONE )
@@ -1918,24 +1963,43 @@ recursiveExecuteUnwrap(JsonPathExecContext *cxt, JsonPathItem *jsp,
1918
1963
{
1919
1964
if (cxt -> lax && JsonbType (jb ) == jbvArray )
1920
1965
{
1921
- JsonbValue v ;
1922
- JsonbIterator * it ;
1923
- JsonbIteratorToken tok ;
1924
1966
JsonPathExecResult res = jperNotFound ;
1925
1967
1926
- it = JsonbIteratorInit (jb -> val .binary .data );
1927
-
1928
- while ((tok = JsonbIteratorNext (& it , & v , true)) != WJB_DONE )
1968
+ if (jb -> type == jbvArray )
1929
1969
{
1930
- if (tok == WJB_ELEM )
1970
+ JsonbValue * elem = jb -> val .array .elems ;
1971
+ JsonbValue * last = elem + jb -> val .array .nElems ;
1972
+
1973
+ for (; elem < last ; elem ++ )
1931
1974
{
1932
- res = recursiveExecuteNoUnwrap (cxt , jsp , & v , found );
1975
+ res = recursiveExecuteNoUnwrap (cxt , jsp , elem , found );
1976
+
1933
1977
if (jperIsError (res ))
1934
1978
break ;
1935
1979
if (res == jperOk && !found )
1936
1980
break ;
1937
1981
}
1938
1982
}
1983
+ else
1984
+ {
1985
+ JsonbValue v ;
1986
+ JsonbIterator * it ;
1987
+ JsonbIteratorToken tok ;
1988
+
1989
+ it = JsonbIteratorInit (jb -> val .binary .data );
1990
+
1991
+ while ((tok = JsonbIteratorNext (& it , & v , true)) != WJB_DONE )
1992
+ {
1993
+ if (tok == WJB_ELEM )
1994
+ {
1995
+ res = recursiveExecuteNoUnwrap (cxt , jsp , & v , found );
1996
+ if (jperIsError (res ))
1997
+ break ;
1998
+ if (res == jperOk && !found )
1999
+ break ;
2000
+ }
2001
+ }
2002
+ }
1939
2003
1940
2004
return res ;
1941
2005
}
@@ -2305,10 +2369,15 @@ wrapItemsInArray(const JsonValueList *items)
2305
2369
2306
2370
while ((jbv = JsonValueListNext (items , & it )))
2307
2371
{
2372
+ JsonbValue bin ;
2373
+
2308
2374
if (jbv -> type == jbvBinary &&
2309
2375
JsonContainerIsScalar (jbv -> val .binary .data ))
2310
2376
JsonbExtractScalar (jbv -> val .binary .data , jbv );
2311
2377
2378
+ if (jbv -> type == jbvObject || jbv -> type == jbvArray )
2379
+ jbv = JsonbWrapInBinary (jbv , & bin );
2380
+
2312
2381
pushJsonbValue (& ps , WJB_ELEM , jbv );
2313
2382
}
2314
2383
0 commit comments