# LogicTest: local-opt

statement ok
CREATE TABLE d (
  a INT PRIMARY KEY,
  b JSONB
)

statement ok
CREATE INVERTED INDEX foo_inv ON d(b)

query TTTTT
EXPLAIN (VERBOSE) SELECT * from d where b @>'{"a": "b"}'
----
index-join  ·      ·                            (a, b)  ·
 ├── scan   ·      ·                            (a)     ·
 │          table  d@foo_inv                    ·       ·
 │          spans  /"a"/"b"-/"a"/"b"/PrefixEnd  ·       ·
 └── scan   ·      ·                            (a, b)  ·
·           table  d@primary                    ·       ·

query TTTTT
EXPLAIN (VERBOSE) SELECT * from d where b @>'{"a": {"b": [1]}}'
----
index-join  ·      ·                                        (a, b)  ·
 ├── scan   ·      ·                                        (a)     ·
 │          table  d@foo_inv                                ·       ·
 │          spans  /"a"/"b"/Arr/1-/"a"/"b"/Arr/1/PrefixEnd  ·       ·
 └── scan   ·      ·                                        (a, b)  ·
·           table  d@primary                                ·       ·

query TTTTT
EXPLAIN (VERBOSE) SELECT * from d where b @> '{"a": {"b": [[2]]}}';
----
index-join  ·      ·                                                (a, b)  ·
 ├── scan   ·      ·                                                (a)     ·
 │          table  d@foo_inv                                        ·       ·
 │          spans  /"a"/"b"/Arr/Arr/2-/"a"/"b"/Arr/Arr/2/PrefixEnd  ·       ·
 └── scan   ·      ·                                                (a, b)  ·
·           table  d@primary                                        ·       ·

query TTTTT
EXPLAIN (VERBOSE) SELECT * from d where b @> '{"a": {"b":true}}';
----
index-join  ·      ·                             (a, b)  ·
 ├── scan   ·      ·                             (a)     ·
 │          table  d@foo_inv                     ·       ·
 │          spans  /"a"/"b"/True-/"a"/"b"/False  ·       ·
 └── scan   ·      ·                             (a, b)  ·
·           table  d@primary                     ·       ·

query TTTTT
EXPLAIN (VERBOSE) SELECT * from d where b @>'[1]'
----
index-join  ·      ·                        (a, b)  ·
 ├── scan   ·      ·                        (a)     ·
 │          table  d@foo_inv                ·       ·
 │          spans  /Arr/1-/Arr/1/PrefixEnd  ·       ·
 └── scan   ·      ·                        (a, b)  ·
·           table  d@primary                ·       ·

query TTTTT
EXPLAIN (VERBOSE) SELECT * from d where b @>'[{"a": {"b": [1]}}]'
----
index-join  ·      ·                                                (a, b)  ·
 ├── scan   ·      ·                                                (a)     ·
 │          table  d@foo_inv                                        ·       ·
 │          spans  /Arr/"a"/"b"/Arr/1-/Arr/"a"/"b"/Arr/1/PrefixEnd  ·       ·
 └── scan   ·      ·                                                (a, b)  ·
·           table  d@primary                                        ·       ·

query TTTTT
EXPLAIN (VERBOSE) SELECT * from d where b @> '[]';
----
scan  ·       ·          (a, b)  ·
·     table   d@primary  ·       ·
·     spans   ALL        ·       ·
·     filter  b @> '[]'  ·       ·


query TTTTT
EXPLAIN (VERBOSE) SELECT * from d where b @> '{}';
----
scan  ·       ·          (a, b)  ·
·     table   d@primary  ·       ·
·     spans   ALL        ·       ·
·     filter  b @> '{}'  ·       ·


query TTTTT
EXPLAIN (VERBOSE) SELECT * from d where b->'a' = '"b"'
----
index-join  ·      ·                            (a, b)  ·
 ├── scan   ·      ·                            (a)     ·
 │          table  d@foo_inv                    ·       ·
 │          spans  /"a"/"b"-/"a"/"b"/PrefixEnd  ·       ·
 └── scan   ·      ·                            (a, b)  ·
·           table  d@primary                    ·       ·

query TTTTT
EXPLAIN (VERBOSE) SELECT * from d where b->'a'->'c' = '"b"'
----
index-join  ·      ·                                    (a, b)  ·
 ├── scan   ·      ·                                    (a)     ·
 │          table  d@foo_inv                            ·       ·
 │          spans  /"a"/"c"/"b"-/"a"/"c"/"b"/PrefixEnd  ·       ·
 └── scan   ·      ·                                    (a, b)  ·
·           table  d@primary                            ·       ·

query TTTTT
EXPLAIN (VERBOSE) SELECT * from d where b->(NULL::STRING) = '"b"'
----
norows  ·  ·  (a, b)  ·

query TTTTT
EXPLAIN (VERBOSE) SELECT * from d where '"b"' = b->'a'
----
index-join  ·      ·                            (a, b)  ·
 ├── scan   ·      ·                            (a)     ·
 │          table  d@foo_inv                    ·       ·
 │          spans  /"a"/"b"-/"a"/"b"/PrefixEnd  ·       ·
 └── scan   ·      ·                            (a, b)  ·
·           table  d@primary                    ·       ·

query TTTTT
EXPLAIN (VERBOSE) SELECT * from d where b IS NULL
----
scan  ·       ·          (a, b)  ·
·     table   d@primary  ·       ·
·     spans   ALL        ·       ·
·     filter  b IS NULL  ·       ·

query TTT
EXPLAIN SELECT * from d where b @> '{"a": []}' ORDER BY a;
----
scan  ·       ·
·     table   d@primary
·     spans   ALL
·     filter  b @> '{"a": []}'

query TTT
EXPLAIN SELECT * from d where b @> '{"a": {}}' ORDER BY a;
----
scan  ·       ·
·     table   d@primary
·     spans   ALL
·     filter  b @> '{"a": {}}'

## Multi-path contains queries

query TTTTT
EXPLAIN (VERBOSE) SELECT * from d where b @> '{"a": {"b": "c"}, "f": "g"}'
----
filter           ·       ·                                    (a, b)  ·
 │               filter  b @> '{"a": {"b": "c"}, "f": "g"}'   ·       ·
 └── index-join  ·       ·                                    (a, b)  ·
      ├── scan   ·       ·                                    (a)     ·
      │          table   d@foo_inv                            ·       ·
      │          spans   /"a"/"b"/"c"-/"a"/"b"/"c"/PrefixEnd  ·       ·
      └── scan   ·       ·                                    (a, b)  ·
·                table   d@primary                            ·       ·

query TTTTT
EXPLAIN (VERBOSE) SELECT * from d where b @> '{"a": {"b": "c", "d": "e"}, "f": "g"}'
----
filter           ·       ·                                             (a, b)  ·
 │               filter  b @> '{"a": {"b": "c", "d": "e"}, "f": "g"}'  ·       ·
 └── index-join  ·       ·                                             (a, b)  ·
      ├── scan   ·       ·                                             (a)     ·
      │          table   d@foo_inv                                     ·       ·
      │          spans   /"a"/"b"/"c"-/"a"/"b"/"c"/PrefixEnd           ·       ·
      └── scan   ·       ·                                             (a, b)  ·
·                table   d@primary                                     ·       ·

query TTTTT
EXPLAIN (VERBOSE) SELECT * from d where b @> '[{"a": {"b": [[2]]}}, "d"]'
----
filter           ·       ·                                                        (a, b)  ·
 │               filter  b @> '[{"a": {"b": [[2]]}}, "d"]'                        ·       ·
 └── index-join  ·       ·                                                        (a, b)  ·
      ├── scan   ·       ·                                                        (a)     ·
      │          table   d@foo_inv                                                ·       ·
      │          spans   /Arr/"a"/"b"/Arr/Arr/2-/Arr/"a"/"b"/Arr/Arr/2/PrefixEnd  ·       ·
      └── scan   ·       ·                                                        (a, b)  ·
·                table   d@primary                                                ·       ·

query TTTTT
EXPLAIN (VERBOSE) SELECT * from d where b @> '{"a": {}, "b": 2}'
----
filter           ·       ·                         (a, b)  ·
 │               filter  b @> '{"a": {}, "b": 2}'  ·       ·
 └── index-join  ·       ·                         (a, b)  ·
      ├── scan   ·       ·                         (a)     ·
      │          table   d@foo_inv                 ·       ·
      │          spans   /"b"/2-/"b"/2/PrefixEnd   ·       ·
      └── scan   ·       ·                         (a, b)  ·
·                table   d@primary                 ·       ·

query TTTTT
EXPLAIN (VERBOSE) SELECT * from d where b @> '{"a": {}, "b": {}}'
----
scan  ·       ·                          (a, b)  ·
·     table   d@primary                  ·       ·
·     spans   ALL                        ·       ·
·     filter  b @> '{"a": {}, "b": {}}'  ·       ·
