# LogicTest: local

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)           b=CONST; a!=NULL; key(a)
 ├── scan   ·      ·                            (a, b[omitted])  b=CONST; a!=NULL; key(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)           b=CONST; a!=NULL; key(a)
 ├── scan   ·      ·                                        (a, b[omitted])  b=CONST; a!=NULL; key(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)           b=CONST; a!=NULL; key(a)
 ├── scan   ·      ·                                                (a, b[omitted])  b=CONST; a!=NULL; key(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)           b=CONST; a!=NULL; key(a)
 ├── scan   ·      ·                             (a, b[omitted])  b=CONST; a!=NULL; key(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)           b=CONST; a!=NULL; key(a)
 ├── scan   ·      ·                        (a, b[omitted])  b=CONST; a!=NULL; key(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)           b=CONST; a!=NULL; key(a)
 ├── scan   ·      ·                                                (a, b[omitted])  b=CONST; a!=NULL; key(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)  a!=NULL; b!=NULL; key(a)
·     table   d@primary  ·       ·
·     spans   ALL        ·       ·
·     filter  b @> '[]'  ·       ·


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

query TTTTT
EXPLAIN (VERBOSE) SELECT * from d where b->'a' = '"b"'
----
index-join  ·      ·                            (a, b)           b=CONST; a!=NULL; key(a)
 ├── scan   ·      ·                            (a, b[omitted])  b=CONST; a!=NULL; key(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)           b=CONST; a!=NULL; key(a)
 ├── scan   ·      ·                                    (a, b[omitted])  b=CONST; a!=NULL; key(a)
 │          table  d@foo_inv                            ·                ·
 │          spans  /"a"/"c"/"b"-/"a"/"c"/"b"/PrefixEnd  ·                ·
 └── scan   ·      ·                                    (a, b)           ·
·           table  d@primary                            ·                ·

# Regression test for #29399. Do not panic when NULL::STRING is on the right
# hand side of ->.
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)           b=CONST; a!=NULL; key(a)
 ├── scan   ·      ·                            (a, b[omitted])  b=CONST; a!=NULL; key(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)  a!=NULL; key(a)
·     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"}'
----
index-join  ·       ·                                    (a, b)           b=CONST; a!=NULL; key(a)
 ├── scan   ·       ·                                    (a, b[omitted])  b=CONST; a!=NULL; key(a)
 │          table   d@foo_inv                            ·                ·
 │          spans   /"a"/"b"/"c"-/"a"/"b"/"c"/PrefixEnd  ·                ·
 └── scan   ·       ·                                    (a, b)           ·
·           table   d@primary                            ·                ·
·           filter  b @> '{"a": {"b": "c"}, "f": "g"}'   ·                ·

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

query TTTTT
EXPLAIN (VERBOSE) SELECT * from d where b @> '[{"a": {"b": [[2]]}}, "d"]'
----
index-join  ·       ·                                                        (a, b)           b=CONST; a!=NULL; key(a)
 ├── scan   ·       ·                                                        (a, b[omitted])  b=CONST; a!=NULL; key(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                                                ·                ·
·           filter  b @> '[{"a": {"b": [[2]]}}, "d"]'                        ·                ·

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

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