@ -2731,6 +2731,114 @@ SELECT count(*) FROM testjsonb WHERE j ?& ARRAY['public','disabled'];
42
(1 row)
SELECT count(*) FROM testjsonb WHERE j @@ '$.wait == null';
count
-------
1
(1 row)
SELECT count(*) FROM testjsonb WHERE j @@ '"CC" == $.wait';
count
-------
15
(1 row)
SELECT count(*) FROM testjsonb WHERE j @@ '$.wait == "CC" && true == $.public';
count
-------
2
(1 row)
SELECT count(*) FROM testjsonb WHERE j @@ '$.age == 25';
count
-------
2
(1 row)
SELECT count(*) FROM testjsonb WHERE j @@ '$.age == 25.0';
count
-------
2
(1 row)
SELECT count(*) FROM testjsonb WHERE j @@ 'exists($)';
count
-------
1012
(1 row)
SELECT count(*) FROM testjsonb WHERE j @@ 'exists($.public)';
count
-------
194
(1 row)
SELECT count(*) FROM testjsonb WHERE j @@ 'exists($.bar)';
count
-------
0
(1 row)
SELECT count(*) FROM testjsonb WHERE j @@ 'exists($.public) || exists($.disabled)';
count
-------
337
(1 row)
SELECT count(*) FROM testjsonb WHERE j @@ 'exists($.public) && exists($.disabled)';
count
-------
42
(1 row)
SELECT count(*) FROM testjsonb WHERE j @? '$.wait ? (@ == null)';
count
-------
1
(1 row)
SELECT count(*) FROM testjsonb WHERE j @? '$.wait ? ("CC" == @)';
count
-------
15
(1 row)
SELECT count(*) FROM testjsonb WHERE j @? '$ ? (@.wait == "CC" && true == @.public)';
count
-------
2
(1 row)
SELECT count(*) FROM testjsonb WHERE j @? '$.age ? (@ == 25)';
count
-------
2
(1 row)
SELECT count(*) FROM testjsonb WHERE j @? '$ ? (@.age == 25.0)';
count
-------
2
(1 row)
SELECT count(*) FROM testjsonb WHERE j @? '$';
count
-------
1012
(1 row)
SELECT count(*) FROM testjsonb WHERE j @? '$.public';
count
-------
194
(1 row)
SELECT count(*) FROM testjsonb WHERE j @? '$.bar';
count
-------
0
(1 row)
CREATE INDEX jidx ON testjsonb USING gin (j);
SET enable_seqscan = off;
SELECT count(*) FROM testjsonb WHERE j @> '{"wait":null}';
@ -2806,6 +2914,196 @@ SELECT count(*) FROM testjsonb WHERE j ?& ARRAY['public','disabled'];
42
(1 row)
EXPLAIN (COSTS OFF)
SELECT count(*) FROM testjsonb WHERE j @@ '$.wait == null';
QUERY PLAN
-----------------------------------------------------------------
Aggregate
-> Bitmap Heap Scan on testjsonb
Recheck Cond: (j @@ '($."wait" == null)'::jsonpath)
-> Bitmap Index Scan on jidx
Index Cond: (j @@ '($."wait" == null)'::jsonpath)
(5 rows)
SELECT count(*) FROM testjsonb WHERE j @@ '$.wait == null';
count
-------
1
(1 row)
SELECT count(*) FROM testjsonb WHERE j @@ 'exists($ ? (@.wait == null))';
count
-------
1
(1 row)
SELECT count(*) FROM testjsonb WHERE j @@ 'exists($.wait ? (@ == null))';
count
-------
1
(1 row)
SELECT count(*) FROM testjsonb WHERE j @@ '"CC" == $.wait';
count
-------
15
(1 row)
SELECT count(*) FROM testjsonb WHERE j @@ '$.wait == "CC" && true == $.public';
count
-------
2
(1 row)
SELECT count(*) FROM testjsonb WHERE j @@ '$.age == 25';
count
-------
2
(1 row)
SELECT count(*) FROM testjsonb WHERE j @@ '$.age == 25.0';
count
-------
2
(1 row)
SELECT count(*) FROM testjsonb WHERE j @@ '$.array[*] == "foo"';
count
-------
3
(1 row)
SELECT count(*) FROM testjsonb WHERE j @@ '$.array[*] == "bar"';
count
-------
3
(1 row)
SELECT count(*) FROM testjsonb WHERE j @@ 'exists($ ? (@.array[*] == "bar"))';
count
-------
3
(1 row)
SELECT count(*) FROM testjsonb WHERE j @@ 'exists($.array ? (@[*] == "bar"))';
count
-------
3
(1 row)
SELECT count(*) FROM testjsonb WHERE j @@ 'exists($.array[*] ? (@ == "bar"))';
count
-------
3
(1 row)
SELECT count(*) FROM testjsonb WHERE j @@ 'exists($)';
count
-------
1012
(1 row)
SELECT count(*) FROM testjsonb WHERE j @@ 'exists($.public)';
count
-------
194
(1 row)
SELECT count(*) FROM testjsonb WHERE j @@ 'exists($.bar)';
count
-------
0
(1 row)
SELECT count(*) FROM testjsonb WHERE j @@ 'exists($.public) || exists($.disabled)';
count
-------
337
(1 row)
SELECT count(*) FROM testjsonb WHERE j @@ 'exists($.public) && exists($.disabled)';
count
-------
42
(1 row)
EXPLAIN (COSTS OFF)
SELECT count(*) FROM testjsonb WHERE j @? '$.wait ? (@ == null)';
QUERY PLAN
-------------------------------------------------------------------
Aggregate
-> Bitmap Heap Scan on testjsonb
Recheck Cond: (j @? '$."wait"?(@ == null)'::jsonpath)
-> Bitmap Index Scan on jidx
Index Cond: (j @? '$."wait"?(@ == null)'::jsonpath)
(5 rows)
SELECT count(*) FROM testjsonb WHERE j @? '$.wait ? (@ == null)';
count
-------
1
(1 row)
SELECT count(*) FROM testjsonb WHERE j @? '$.wait ? ("CC" == @)';
count
-------
15
(1 row)
SELECT count(*) FROM testjsonb WHERE j @? '$ ? (@.wait == "CC" && true == @.public)';
count
-------
2
(1 row)
SELECT count(*) FROM testjsonb WHERE j @? '$.age ? (@ == 25)';
count
-------
2
(1 row)
SELECT count(*) FROM testjsonb WHERE j @? '$ ? (@.age == 25.0)';
count
-------
2
(1 row)
SELECT count(*) FROM testjsonb WHERE j @? '$ ? (@.array[*] == "bar")';
count
-------
3
(1 row)
SELECT count(*) FROM testjsonb WHERE j @? '$.array ? (@[*] == "bar")';
count
-------
3
(1 row)
SELECT count(*) FROM testjsonb WHERE j @? '$.array[*] ? (@ == "bar")';
count
-------
3
(1 row)
SELECT count(*) FROM testjsonb WHERE j @? '$';
count
-------
1012
(1 row)
SELECT count(*) FROM testjsonb WHERE j @? '$.public';
count
-------
194
(1 row)
SELECT count(*) FROM testjsonb WHERE j @? '$.bar';
count
-------
0
(1 row)
-- array exists - array elements should behave as keys (for GIN index scans too)
CREATE INDEX jidx_array ON testjsonb USING gin((j->'array'));
SELECT count(*) from testjsonb WHERE j->'array' ? 'bar';
@ -2956,6 +3254,161 @@ SELECT count(*) FROM testjsonb WHERE j @> '{}';
1012
(1 row)
SELECT count(*) FROM testjsonb WHERE j @@ '$.wait == null';
count
-------
1
(1 row)
SELECT count(*) FROM testjsonb WHERE j @@ 'exists($ ? (@.wait == null))';
count
-------
1
(1 row)
SELECT count(*) FROM testjsonb WHERE j @@ 'exists($.wait ? (@ == null))';
count
-------
1
(1 row)
SELECT count(*) FROM testjsonb WHERE j @@ '"CC" == $.wait';
count
-------
15
(1 row)
SELECT count(*) FROM testjsonb WHERE j @@ '$.wait == "CC" && true == $.public';
count
-------
2
(1 row)
SELECT count(*) FROM testjsonb WHERE j @@ '$.age == 25';
count
-------
2
(1 row)
SELECT count(*) FROM testjsonb WHERE j @@ '$.age == 25.0';
count
-------
2
(1 row)
SELECT count(*) FROM testjsonb WHERE j @@ '$.array[*] == "foo"';
count
-------
3
(1 row)
SELECT count(*) FROM testjsonb WHERE j @@ '$.array[*] == "bar"';
count
-------
3
(1 row)
SELECT count(*) FROM testjsonb WHERE j @@ 'exists($ ? (@.array[*] == "bar"))';
count
-------
3
(1 row)
SELECT count(*) FROM testjsonb WHERE j @@ 'exists($.array ? (@[*] == "bar"))';
count
-------
3
(1 row)
SELECT count(*) FROM testjsonb WHERE j @@ 'exists($.array[*] ? (@ == "bar"))';
count
-------
3
(1 row)
SELECT count(*) FROM testjsonb WHERE j @@ 'exists($)';
count
-------
1012
(1 row)
EXPLAIN (COSTS OFF)
SELECT count(*) FROM testjsonb WHERE j @? '$.wait ? (@ == null)';
QUERY PLAN
-------------------------------------------------------------------
Aggregate
-> Bitmap Heap Scan on testjsonb
Recheck Cond: (j @? '$."wait"?(@ == null)'::jsonpath)
-> Bitmap Index Scan on jidx
Index Cond: (j @? '$."wait"?(@ == null)'::jsonpath)
(5 rows)
SELECT count(*) FROM testjsonb WHERE j @? '$.wait ? (@ == null)';
count
-------
1
(1 row)
SELECT count(*) FROM testjsonb WHERE j @? '$.wait ? ("CC" == @)';
count
-------
15
(1 row)
SELECT count(*) FROM testjsonb WHERE j @? '$ ? (@.wait == "CC" && true == @.public)';
count
-------
2
(1 row)
SELECT count(*) FROM testjsonb WHERE j @? '$.age ? (@ == 25)';
count
-------
2
(1 row)
SELECT count(*) FROM testjsonb WHERE j @? '$ ? (@.age == 25.0)';
count
-------
2
(1 row)
SELECT count(*) FROM testjsonb WHERE j @? '$ ? (@.array[*] == "bar")';
count
-------
3
(1 row)
SELECT count(*) FROM testjsonb WHERE j @? '$.array ? (@[*] == "bar")';
count
-------
3
(1 row)
SELECT count(*) FROM testjsonb WHERE j @? '$.array[*] ? (@ == "bar")';
count
-------
3
(1 row)
SELECT count(*) FROM testjsonb WHERE j @? '$';
count
-------
1012
(1 row)
SELECT count(*) FROM testjsonb WHERE j @? '$.public';
count
-------
194
(1 row)
SELECT count(*) FROM testjsonb WHERE j @? '$.bar';
count
-------
0
(1 row)
RESET enable_seqscan;
DROP INDEX jidx;
-- nested tests