@@ -554,9 +554,6 @@ checkEquality(JsonbValue *jb1, JsonbValue *jb2, bool not)
554
554
return jperError ;
555
555
}
556
556
557
- if (jb1 -> type == jbvBinary )
558
- return jperError ;
559
-
560
557
switch (jb1 -> type )
561
558
{
562
559
case jbvNull :
@@ -588,8 +585,14 @@ checkEquality(JsonbValue *jb1, JsonbValue *jb2, bool not)
588
585
589
586
break ;
590
587
}
588
+
589
+ case jbvBinary :
590
+ case jbvObject :
591
+ case jbvArray :
592
+ return jperError ;
593
+
591
594
default :
592
- elog (ERROR ,"1Wrong state" );
595
+ elog (ERROR , "Unknown jsonb value type %d" , jb1 -> type );
593
596
}
594
597
595
598
return (not ^ eq ) ? jperOk : jperNotFound ;
@@ -1311,6 +1314,10 @@ recursiveExecuteNoUnwrap(JsonPathExecContext *cxt, JsonPathItem *jsp,
1311
1314
if (JsonbType (jb ) == jbvObject )
1312
1315
{
1313
1316
JsonbValue * v , key ;
1317
+ JsonbValue obj ;
1318
+
1319
+ if (jb -> type == jbvObject )
1320
+ jb = JsonbWrapInBinary (jb , & obj );
1314
1321
1315
1322
key .type = jbvString ;
1316
1323
key .val .string .val = jspGetString (jsp , & key .val .string .len );
@@ -1366,18 +1373,16 @@ recursiveExecuteNoUnwrap(JsonPathExecContext *cxt, JsonPathItem *jsp,
1366
1373
case jpiAnyArray :
1367
1374
if (JsonbType (jb ) == jbvArray )
1368
1375
{
1369
- JsonbIterator * it ;
1370
- int32 r ;
1371
- JsonbValue v ;
1372
-
1373
1376
hasNext = jspGetNext (jsp , & elem );
1374
- it = JsonbIteratorInit (jb -> val .binary .data );
1375
1377
1376
- while (( r = JsonbIteratorNext ( & it , & v , true)) != WJB_DONE )
1378
+ if ( jb -> type == jbvArray )
1377
1379
{
1378
- if (r == WJB_ELEM )
1380
+ JsonbValue * el = jb -> val .array .elems ;
1381
+ JsonbValue * last_el = el + jb -> val .array .nElems ;
1382
+
1383
+ for (; el < last_el ; el ++ )
1379
1384
{
1380
- res = recursiveExecuteNext (cxt , jsp , & elem , & v , found , true);
1385
+ res = recursiveExecuteNext (cxt , jsp , & elem , el , found , true);
1381
1386
1382
1387
if (jperIsError (res ))
1383
1388
break ;
@@ -1386,6 +1391,28 @@ recursiveExecuteNoUnwrap(JsonPathExecContext *cxt, JsonPathItem *jsp,
1386
1391
break ;
1387
1392
}
1388
1393
}
1394
+ else
1395
+ {
1396
+ JsonbValue v ;
1397
+ JsonbIterator * it ;
1398
+ JsonbIteratorToken r ;
1399
+
1400
+ it = JsonbIteratorInit (jb -> val .binary .data );
1401
+
1402
+ while ((r = JsonbIteratorNext (& it , & v , true)) != WJB_DONE )
1403
+ {
1404
+ if (r == WJB_ELEM )
1405
+ {
1406
+ res = recursiveExecuteNext (cxt , jsp , & elem , & v , found , true);
1407
+
1408
+ if (jperIsError (res ))
1409
+ break ;
1410
+
1411
+ if (res == jperOk && !found )
1412
+ break ;
1413
+ }
1414
+ }
1415
+ }
1389
1416
}
1390
1417
else
1391
1418
res = jperMakeError (ERRCODE_JSON_ARRAY_NOT_FOUND );
@@ -1397,6 +1424,7 @@ recursiveExecuteNoUnwrap(JsonPathExecContext *cxt, JsonPathItem *jsp,
1397
1424
int innermostArraySize = cxt -> innermostArraySize ;
1398
1425
int i ;
1399
1426
int size = JsonbArraySize (jb );
1427
+ bool binary = jb -> type == jbvBinary ;
1400
1428
1401
1429
cxt -> innermostArraySize = size ; /* for LAST evaluation */
1402
1430
@@ -1445,14 +1473,16 @@ recursiveExecuteNoUnwrap(JsonPathExecContext *cxt, JsonPathItem *jsp,
1445
1473
1446
1474
for (index = index_from ; index <= index_to ; index ++ )
1447
1475
{
1448
- JsonbValue * v =
1476
+ JsonbValue * v = binary ?
1449
1477
getIthJsonbValueFromContainer (jb -> val .binary .data ,
1450
- (uint32 ) index );
1478
+ (uint32 ) index ) :
1479
+ & jb -> val .array .elems [index ];
1451
1480
1452
1481
if (v == NULL )
1453
1482
continue ;
1454
1483
1455
- res = recursiveExecuteNext (cxt , jsp , & elem , v , found , false);
1484
+ res = recursiveExecuteNext (cxt , jsp , & elem , v , found ,
1485
+ !binary );
1456
1486
1457
1487
if (jperIsError (res ))
1458
1488
break ;
@@ -1510,6 +1540,10 @@ recursiveExecuteNoUnwrap(JsonPathExecContext *cxt, JsonPathItem *jsp,
1510
1540
JsonbIterator * it ;
1511
1541
int32 r ;
1512
1542
JsonbValue v ;
1543
+ JsonbValue bin ;
1544
+
1545
+ if (jb -> type == jbvObject )
1546
+ jb = JsonbWrapInBinary (jb , & bin );
1513
1547
1514
1548
hasNext = jspGetNext (jsp , & elem );
1515
1549
it = JsonbIteratorInit (jb -> val .binary .data );
@@ -1562,25 +1596,30 @@ recursiveExecuteNoUnwrap(JsonPathExecContext *cxt, JsonPathItem *jsp,
1562
1596
res = recursiveExecuteNext (cxt , jsp , NULL , jb , found , true);
1563
1597
break ;
1564
1598
case jpiAny :
1565
- {
1566
- bool hasNext = jspGetNext (jsp , & elem );
1567
-
1568
- /* first try without any intermediate steps */
1569
- if (jsp -> content .anybounds .first == 0 )
1570
1599
{
1571
- res = recursiveExecuteNext ( cxt , jsp , & elem , jb , found , true) ;
1600
+ JsonbValue jbvbuf ;
1572
1601
1573
- if (res == jperOk && !found )
1574
- break ;
1575
- }
1602
+ hasNext = jspGetNext (jsp , & elem );
1576
1603
1577
- if (jb -> type == jbvBinary )
1578
- res = recursiveAny (cxt , hasNext ? & elem : NULL , jb , found ,
1579
- 1 ,
1580
- jsp -> content .anybounds .first ,
1581
- jsp -> content .anybounds .last );
1582
- break ;
1583
- }
1604
+ /* first try without any intermediate steps */
1605
+ if (jsp -> content .anybounds .first == 0 )
1606
+ {
1607
+ res = recursiveExecuteNext (cxt , jsp , & elem , jb , found , true);
1608
+
1609
+ if (res == jperOk && !found )
1610
+ break ;
1611
+ }
1612
+
1613
+ if (jb -> type == jbvArray || jb -> type == jbvObject )
1614
+ jb = JsonbWrapInBinary (jb , & jbvbuf );
1615
+
1616
+ if (jb -> type == jbvBinary )
1617
+ res = recursiveAny (cxt , hasNext ? & elem : NULL , jb , found ,
1618
+ 1 ,
1619
+ jsp -> content .anybounds .first ,
1620
+ jsp -> content .anybounds .last );
1621
+ break ;
1622
+ }
1584
1623
case jpiExists :
1585
1624
jspGetArg (jsp , & elem );
1586
1625
@@ -1856,6 +1895,7 @@ recursiveExecuteNoUnwrap(JsonPathExecContext *cxt, JsonPathItem *jsp,
1856
1895
else
1857
1896
{
1858
1897
int32 r ;
1898
+ JsonbValue bin ;
1859
1899
JsonbValue key ;
1860
1900
JsonbValue val ;
1861
1901
JsonbValue obj ;
@@ -1866,7 +1906,9 @@ recursiveExecuteNoUnwrap(JsonPathExecContext *cxt, JsonPathItem *jsp,
1866
1906
1867
1907
hasNext = jspGetNext (jsp , & elem );
1868
1908
1869
- if (!JsonContainerSize (jb -> val .binary .data ))
1909
+ if (jb -> type == jbvBinary
1910
+ ? !JsonContainerSize (jb -> val .binary .data )
1911
+ : !jb -> val .object .nPairs )
1870
1912
{
1871
1913
res = jperNotFound ;
1872
1914
break ;
@@ -1883,6 +1925,9 @@ recursiveExecuteNoUnwrap(JsonPathExecContext *cxt, JsonPathItem *jsp,
1883
1925
valstr .val .string .val = "value" ;
1884
1926
valstr .val .string .len = 5 ;
1885
1927
1928
+ if (jb -> type == jbvObject )
1929
+ jb = JsonbWrapInBinary (jb , & bin );
1930
+
1886
1931
it = JsonbIteratorInit (jb -> val .binary .data );
1887
1932
1888
1933
while ((r = JsonbIteratorNext (& it , & key , true)) != WJB_DONE )
@@ -1945,24 +1990,43 @@ recursiveExecuteUnwrap(JsonPathExecContext *cxt, JsonPathItem *jsp,
1945
1990
{
1946
1991
if (cxt -> lax && JsonbType (jb ) == jbvArray )
1947
1992
{
1948
- JsonbValue v ;
1949
- JsonbIterator * it ;
1950
- JsonbIteratorToken tok ;
1951
1993
JsonPathExecResult res = jperNotFound ;
1952
1994
1953
- it = JsonbIteratorInit (jb -> val .binary .data );
1954
-
1955
- while ((tok = JsonbIteratorNext (& it , & v , true)) != WJB_DONE )
1995
+ if (jb -> type == jbvArray )
1956
1996
{
1957
- if (tok == WJB_ELEM )
1997
+ JsonbValue * elem = jb -> val .array .elems ;
1998
+ JsonbValue * last = elem + jb -> val .array .nElems ;
1999
+
2000
+ for (; elem < last ; elem ++ )
1958
2001
{
1959
- res = recursiveExecuteNoUnwrap (cxt , jsp , & v , found );
2002
+ res = recursiveExecuteNoUnwrap (cxt , jsp , elem , found );
2003
+
1960
2004
if (jperIsError (res ))
1961
2005
break ;
1962
2006
if (res == jperOk && !found )
1963
2007
break ;
1964
2008
}
1965
2009
}
2010
+ else
2011
+ {
2012
+ JsonbValue v ;
2013
+ JsonbIterator * it ;
2014
+ JsonbIteratorToken tok ;
2015
+
2016
+ it = JsonbIteratorInit (jb -> val .binary .data );
2017
+
2018
+ while ((tok = JsonbIteratorNext (& it , & v , true)) != WJB_DONE )
2019
+ {
2020
+ if (tok == WJB_ELEM )
2021
+ {
2022
+ res = recursiveExecuteNoUnwrap (cxt , jsp , & v , found );
2023
+ if (jperIsError (res ))
2024
+ break ;
2025
+ if (res == jperOk && !found )
2026
+ break ;
2027
+ }
2028
+ }
2029
+ }
1966
2030
1967
2031
return res ;
1968
2032
}
@@ -2345,10 +2409,15 @@ wrapItemsInArray(const JsonValueList *items)
2345
2409
2346
2410
while ((jbv = JsonValueListNext (items , & it )))
2347
2411
{
2412
+ JsonbValue bin ;
2413
+
2348
2414
if (jbv -> type == jbvBinary &&
2349
2415
JsonContainerIsScalar (jbv -> val .binary .data ))
2350
2416
JsonbExtractScalar (jbv -> val .binary .data , jbv );
2351
2417
2418
+ if (jbv -> type == jbvObject || jbv -> type == jbvArray )
2419
+ jbv = JsonbWrapInBinary (jbv , & bin );
2420
+
2352
2421
pushJsonbValue (& ps , WJB_ELEM , jbv );
2353
2422
}
2354
2423
0 commit comments