@@ -111,23 +111,23 @@ select _jsonpath_exists(json '[1]', '$.[1.2]');
111
111
select _jsonpath_exists(json '[1]', 'strict $.[1.2]');
112
112
ERROR: Invalid SQL/JSON subscript
113
113
select _jsonpath_exists(json '{}', 'strict $.[0.3]');
114
- ERROR: SQL/JSON array not found
114
+ ERROR: Invalid SQL/JSON subscript
115
115
select _jsonpath_exists(json '{}', 'lax $.[0.3]');
116
116
_jsonpath_exists
117
117
------------------
118
118
t
119
119
(1 row)
120
120
121
121
select _jsonpath_exists(json '{}', 'strict $.[1.2]');
122
- ERROR: SQL/JSON array not found
122
+ ERROR: Invalid SQL/JSON subscript
123
123
select _jsonpath_exists(json '{}', 'lax $.[1.2]');
124
124
_jsonpath_exists
125
125
------------------
126
126
f
127
127
(1 row)
128
128
129
129
select _jsonpath_exists(json '{}', 'strict $.[-2 to 3]');
130
- ERROR: SQL/JSON array not found
130
+ ERROR: Invalid SQL/JSON subscript
131
131
select _jsonpath_exists(json '{}', 'lax $.[-2 to 3]');
132
132
_jsonpath_exists
133
133
------------------
@@ -1160,6 +1160,25 @@ select _jsonpath_query(json '{}', '$.datetime()');
1160
1160
ERROR: Invalid argument for SQL/JSON datetime function
1161
1161
select _jsonpath_query(json '""', '$.datetime()');
1162
1162
ERROR: Invalid argument for SQL/JSON datetime function
1163
+ -- Standard extension: UNIX epoch to timestamptz
1164
+ select _jsonpath_query(json '0', '$.datetime()');
1165
+ _jsonpath_query
1166
+ --------------------------------
1167
+ "Wed Dec 31 16:00:00 1969 PST"
1168
+ (1 row)
1169
+
1170
+ select _jsonpath_query(json '0', '$.datetime().type()');
1171
+ _jsonpath_query
1172
+ ----------------------------
1173
+ "timestamp with time zone"
1174
+ (1 row)
1175
+
1176
+ select _jsonpath_query(json '1490216035.5', '$.datetime()');
1177
+ _jsonpath_query
1178
+ ----------------------------------
1179
+ "Wed Mar 22 13:53:55.5 2017 PDT"
1180
+ (1 row)
1181
+
1163
1182
select _jsonpath_query(json '"10-03-2017"', '$.datetime("dd-mm-yyyy")');
1164
1183
_jsonpath_query
1165
1184
-----------------
@@ -1601,6 +1620,12 @@ SELECT json '[{"a": 1}, {"a": 2}]' @* '$[*] ? (@.a > 10)';
1601
1620
----------
1602
1621
(0 rows)
1603
1622
1623
+ SELECT json '[{"a": 1}, {"a": 2}]' @* '[$[*].a]';
1624
+ ?column?
1625
+ ----------
1626
+ [1, 2]
1627
+ (1 row)
1628
+
1604
1629
SELECT json '[{"a": 1}, {"a": 2}]' @? '$[*].a > 1';
1605
1630
?column?
1606
1631
----------
@@ -1613,3 +1638,285 @@ SELECT json '[{"a": 1}, {"a": 2}]' @? '$[*].a > 2';
1613
1638
f
1614
1639
(1 row)
1615
1640
1641
+ -- extension: map item method
1642
+ select _jsonpath_query(json '1', 'strict $.map(@ + 10)');
1643
+ ERROR: SQL/JSON array not found
1644
+ select _jsonpath_query(json '1', 'lax $.map(@ + 10)');
1645
+ _jsonpath_query
1646
+ -----------------
1647
+ 11
1648
+ (1 row)
1649
+
1650
+ select _jsonpath_query(json '[1, 2, 3]', '$.map(@ + 10)');
1651
+ _jsonpath_query
1652
+ -----------------
1653
+ [11, 12, 13]
1654
+ (1 row)
1655
+
1656
+ select _jsonpath_query(json '[[1, 2], [3, 4, 5], [], [6, 7]]', '$.map(@.map(@ + 10))');
1657
+ _jsonpath_query
1658
+ ----------------------------------------
1659
+ [[11, 12], [13, 14, 15], [], [16, 17]]
1660
+ (1 row)
1661
+
1662
+ -- extension: reduce/fold item methods
1663
+ select _jsonpath_query(json '1', 'strict $.reduce($1 + $2)');
1664
+ ERROR: SQL/JSON array not found
1665
+ select _jsonpath_query(json '1', 'lax $.reduce($1 + $2)');
1666
+ _jsonpath_query
1667
+ -----------------
1668
+ 1
1669
+ (1 row)
1670
+
1671
+ select _jsonpath_query(json '1', 'strict $.fold($1 + $2, 10)');
1672
+ ERROR: SQL/JSON array not found
1673
+ select _jsonpath_query(json '1', 'lax $.fold($1 + $2, 10)');
1674
+ _jsonpath_query
1675
+ -----------------
1676
+ 11
1677
+ (1 row)
1678
+
1679
+ select _jsonpath_query(json '[1, 2, 3]', '$.reduce($1 + $2)');
1680
+ _jsonpath_query
1681
+ -----------------
1682
+ 6
1683
+ (1 row)
1684
+
1685
+ select _jsonpath_query(json '[1, 2, 3]', '$.fold($1 + $2, 100)');
1686
+ _jsonpath_query
1687
+ -----------------
1688
+ 106
1689
+ (1 row)
1690
+
1691
+ select _jsonpath_query(json '[]', '$.reduce($1 + $2)');
1692
+ _jsonpath_query
1693
+ -----------------
1694
+ (0 rows)
1695
+
1696
+ select _jsonpath_query(json '[]', '$.fold($1 + $2, 100)');
1697
+ _jsonpath_query
1698
+ -----------------
1699
+ 100
1700
+ (1 row)
1701
+
1702
+ select _jsonpath_query(json '[1]', '$.reduce($1 + $2)');
1703
+ _jsonpath_query
1704
+ -----------------
1705
+ 1
1706
+ (1 row)
1707
+
1708
+ select _jsonpath_query(json '[1, 2, 3]', '$.foldl([$1, $2], [])');
1709
+ _jsonpath_query
1710
+ -------------------
1711
+ [[[[], 1], 2], 3]
1712
+ (1 row)
1713
+
1714
+ select _jsonpath_query(json '[1, 2, 3]', '$.foldr([$2, $1], [])');
1715
+ _jsonpath_query
1716
+ -------------------
1717
+ [[[[], 3], 2], 1]
1718
+ (1 row)
1719
+
1720
+ select _jsonpath_query(json '[[1, 2], [3, 4, 5], [], [6, 7]]', '$.fold($1 + $2.fold($1 + $2, 100), 1000)');
1721
+ _jsonpath_query
1722
+ -----------------
1723
+ 1428
1724
+ (1 row)
1725
+
1726
+ -- extension: min/max item methods
1727
+ select _jsonpath_query(json '1', 'strict $.min()');
1728
+ ERROR: SQL/JSON array not found
1729
+ select _jsonpath_query(json '1', 'lax $.min()');
1730
+ _jsonpath_query
1731
+ -----------------
1732
+ 1
1733
+ (1 row)
1734
+
1735
+ select _jsonpath_query(json '[]', '$.min()');
1736
+ _jsonpath_query
1737
+ -----------------
1738
+ (0 rows)
1739
+
1740
+ select _jsonpath_query(json '[]', '$.max()');
1741
+ _jsonpath_query
1742
+ -----------------
1743
+ (0 rows)
1744
+
1745
+ select _jsonpath_query(json '[1, 2, 3]', '$.min()');
1746
+ ERROR: json comparison is not implemented
1747
+ select _jsonpath_query(json '[1, 2, 3]', '$.max()');
1748
+ ERROR: json comparison is not implemented
1749
+ select _jsonpath_query(json '[2, 3, 5, 1, 4]', '$.min()');
1750
+ ERROR: json comparison is not implemented
1751
+ select _jsonpath_query(json '[2, 3, 5, 1, 4]', '$.max()');
1752
+ ERROR: json comparison is not implemented
1753
+ -- extension: path sequences
1754
+ select _jsonpath_query(json '[1,2,3,4,5]', '10, 20, $[*], 30');
1755
+ _jsonpath_query
1756
+ -----------------
1757
+ 10
1758
+ 20
1759
+ 1
1760
+ 2
1761
+ 3
1762
+ 4
1763
+ 5
1764
+ 30
1765
+ (8 rows)
1766
+
1767
+ select _jsonpath_query(json '[1,2,3,4,5]', 'lax 10, 20, $[*].a, 30');
1768
+ _jsonpath_query
1769
+ -----------------
1770
+ 10
1771
+ 20
1772
+ 30
1773
+ (3 rows)
1774
+
1775
+ select _jsonpath_query(json '[1,2,3,4,5]', 'strict 10, 20, $[*].a, 30');
1776
+ ERROR: SQL/JSON member not found
1777
+ select _jsonpath_query(json '[1,2,3,4,5]', '-(10, 20, $[1 to 3], 30)');
1778
+ _jsonpath_query
1779
+ -----------------
1780
+ -10
1781
+ -20
1782
+ -2
1783
+ -3
1784
+ -4
1785
+ -30
1786
+ (6 rows)
1787
+
1788
+ select _jsonpath_query(json '[1,2,3,4,5]', 'lax (10, 20, $[1 to 3], 30).map(@ + 100)');
1789
+ _jsonpath_query
1790
+ -----------------
1791
+ 110
1792
+ 120
1793
+ 102
1794
+ 103
1795
+ 104
1796
+ 130
1797
+ (6 rows)
1798
+
1799
+ select _jsonpath_query(json '[1,2,3,4,5]', '$[(0, $[*], 5) ? (@ == 3)]');
1800
+ _jsonpath_query
1801
+ -----------------
1802
+ 4
1803
+ (1 row)
1804
+
1805
+ select _jsonpath_query(json '[1,2,3,4,5]', '$[(0, $[*], 3) ? (@ == 3)]');
1806
+ ERROR: Invalid SQL/JSON subscript
1807
+ -- extension: array constructors
1808
+ select _jsonpath_query(json '[1, 2, 3]', '[]');
1809
+ _jsonpath_query
1810
+ -----------------
1811
+ []
1812
+ (1 row)
1813
+
1814
+ select _jsonpath_query(json '[1, 2, 3]', '[1, 2, $.map(@ + 100)[*], 4, 5]');
1815
+ _jsonpath_query
1816
+ -----------------------------
1817
+ [1, 2, 101, 102, 103, 4, 5]
1818
+ (1 row)
1819
+
1820
+ select _jsonpath_query(json '[1, 2, 3]', '[1, 2, $.map(@ + 100)[*], 4, 5][*]');
1821
+ _jsonpath_query
1822
+ -----------------
1823
+ 1
1824
+ 2
1825
+ 101
1826
+ 102
1827
+ 103
1828
+ 4
1829
+ 5
1830
+ (7 rows)
1831
+
1832
+ select _jsonpath_query(json '[1, 2, 3]', '[(1, (2, $.map(@ + 100)[*])), (4, 5)]');
1833
+ _jsonpath_query
1834
+ -----------------------------
1835
+ [1, 2, 101, 102, 103, 4, 5]
1836
+ (1 row)
1837
+
1838
+ select _jsonpath_query(json '[1, 2, 3]', '[[1, 2], [$.map(@ + 100)[*], 4], 5, [(1,2)?(@ > 5)]]');
1839
+ _jsonpath_query
1840
+ -------------------------------------
1841
+ [[1, 2], [101, 102, 103, 4], 5, []]
1842
+ (1 row)
1843
+
1844
+ select _jsonpath_query(json '[1, 2, 3]', 'strict [1, 2, $.map(@.a)[*], 4, 5]');
1845
+ ERROR: SQL/JSON member not found
1846
+ select _jsonpath_query(json '[[1, 2], [3, 4, 5], [], [6, 7]]', '[$[*].map(@ + 10)[*] ? (@ > 13)]');
1847
+ _jsonpath_query
1848
+ ------------------
1849
+ [14, 15, 16, 17]
1850
+ (1 row)
1851
+
1852
+ -- extension: object constructors
1853
+ select _jsonpath_query(json '[1, 2, 3]', '{}');
1854
+ _jsonpath_query
1855
+ -----------------
1856
+ {}
1857
+ (1 row)
1858
+
1859
+ select _jsonpath_query(json '[1, 2, 3]', '{a: 2 + 3, "b": [$[*], 4, 5]}');
1860
+ _jsonpath_query
1861
+ --------------------------------
1862
+ {"a": 5, "b": [1, 2, 3, 4, 5]}
1863
+ (1 row)
1864
+
1865
+ select _jsonpath_query(json '[1, 2, 3]', '{a: 2 + 3, "b": [$[*], 4, 5]}.*');
1866
+ _jsonpath_query
1867
+ -----------------
1868
+ 5
1869
+ [1, 2, 3, 4, 5]
1870
+ (2 rows)
1871
+
1872
+ select _jsonpath_query(json '[1, 2, 3]', '{a: 2 + 3, "b": ($[*], 4, 5)}');
1873
+ ERROR: Singleton SQL/JSON item required
1874
+ select _jsonpath_query(json '[1, 2, 3]', '{a: 2 + 3, "b": [$.map({x: @, y: @ < 3})[*], {z: "foo"}]}');
1875
+ _jsonpath_query
1876
+ -----------------------------------------------------------------------------------------------
1877
+ {"a": 5, "b": [{"x": 1, "y": true}, {"x": 2, "y": true}, {"x": 3, "y": false}, {"z": "foo"}]}
1878
+ (1 row)
1879
+
1880
+ -- extension: object subscripting
1881
+ select _jsonpath_exists(json '{"a": 1}', '$["a"]');
1882
+ _jsonpath_exists
1883
+ ------------------
1884
+ t
1885
+ (1 row)
1886
+
1887
+ select _jsonpath_exists(json '{"a": 1}', '$["b"]');
1888
+ _jsonpath_exists
1889
+ ------------------
1890
+ f
1891
+ (1 row)
1892
+
1893
+ select _jsonpath_exists(json '{"a": 1}', 'strict $["b"]');
1894
+ ERROR: SQL/JSON member not found
1895
+ select _jsonpath_exists(json '{"a": 1}', '$["b", "a"]');
1896
+ _jsonpath_exists
1897
+ ------------------
1898
+ t
1899
+ (1 row)
1900
+
1901
+ select * from _jsonpath_query(json '{"a": 1}', '$["a"]');
1902
+ _jsonpath_query
1903
+ -----------------
1904
+ 1
1905
+ (1 row)
1906
+
1907
+ select * from _jsonpath_query(json '{"a": 1}', 'strict $["b"]');
1908
+ ERROR: SQL/JSON member not found
1909
+ select * from _jsonpath_query(json '{"a": 1}', 'lax $["b"]');
1910
+ _jsonpath_query
1911
+ -----------------
1912
+ (0 rows)
1913
+
1914
+ select * from _jsonpath_query(json '{"a": 1, "b": 2}', 'lax $["b", "c", "b", "a", 0 to 3]');
1915
+ _jsonpath_query
1916
+ ------------------
1917
+ 2
1918
+ 2
1919
+ 1
1920
+ {"a": 1, "b": 2}
1921
+ (4 rows)
1922
+
0 commit comments