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

statement ok
CREATE INVERTED INDEX foo_inv ON json_tab(b)

statement ok
CREATE TABLE array_tab (
  a INT PRIMARY KEY,
  b INT[]
)

statement ok
CREATE INVERTED INDEX foo_inv ON array_tab(b)

statement ok
INSERT INTO json_tab VALUES
  (1, '{"a": "b"}'),
  (2, '[1,2,3,4, "foo"]'),
  (3, '{"a": {"b": "c"}}'),
  (4, '{"a": {"b": [1]}}'),
  (5, '{"a": {"b": [1, [2]]}}'),
  (6, '{"a": {"b": [[2]]}}'),
  (7, '{"a": "b", "c": "d"}'),
  (8, '{"a": {"b":true}}'),
  (9, '{"a": {"b":false}}'),
  (10, '"a"'),
  (11, 'null'),
  (12, 'true'),
  (13, 'false'),
  (14, '1'),
  (15, '1.23'),
  (16, '[{"a": {"b": [1, [2]]}}, "d"]'),
  (17, '{}'),
  (18, '[]'),
  (19, '["a", "a"]'),
  (20, '[{"a": "a"}, {"a": "a"}]'),
  (21, '[[[["a"]]], [[["a"]]]]'),
  (22, '[1,2,3,1]'),
  (23, '{"a": 123.123}'),
  (24, '{"a": 123.123000}'),
  (25, '{"a": [{}]}'),
  (26, '[[], {}]'),
  (27, '[true, false, null, 1.23, "a"]'),
  (28, '{"a": {}}'),
  (29, NULL),
  (30, '{"a": []}'),
  (31, '{"a": {"b": "c", "d": "e"}, "f": "g"}'),
  (32, '{"a": [1]}'),
  (33, '[1, "bar"]'),
  (34, '{"a": 1}'),
  (35, '[1]'),
  (36, '[2]'),
  (37, '[[1]]'),
  (38, '[[2]]'),
  (39, '["a"]'),
  (40, '{"a": [[]]}'),
  (41, '[[1, 2]]'),
  (42, '[[1], [2]]'),
  (43, '[{"a": "b", "c": "d"}]'),
  (44, '[{"a": "b"}, {"c": "d"}]')

# This query performs an inverted join.
query ITIT
SELECT * FROM json_tab@foo_inv AS j1, json_tab AS j2 WHERE j1.b @> j2.b ORDER BY j1.a, j2.a
----
1   {"a": "b"}                             1   {"a": "b"}
1   {"a": "b"}                             17  {}
2   [1, 2, 3, 4, "foo"]                    2   [1, 2, 3, 4, "foo"]
2   [1, 2, 3, 4, "foo"]                    14  1
2   [1, 2, 3, 4, "foo"]                    18  []
2   [1, 2, 3, 4, "foo"]                    22  [1, 2, 3, 1]
2   [1, 2, 3, 4, "foo"]                    35  [1]
2   [1, 2, 3, 4, "foo"]                    36  [2]
3   {"a": {"b": "c"}}                      3   {"a": {"b": "c"}}
3   {"a": {"b": "c"}}                      17  {}
3   {"a": {"b": "c"}}                      28  {"a": {}}
4   {"a": {"b": [1]}}                      4   {"a": {"b": [1]}}
4   {"a": {"b": [1]}}                      17  {}
4   {"a": {"b": [1]}}                      28  {"a": {}}
5   {"a": {"b": [1, [2]]}}                 4   {"a": {"b": [1]}}
5   {"a": {"b": [1, [2]]}}                 5   {"a": {"b": [1, [2]]}}
5   {"a": {"b": [1, [2]]}}                 6   {"a": {"b": [[2]]}}
5   {"a": {"b": [1, [2]]}}                 17  {}
5   {"a": {"b": [1, [2]]}}                 28  {"a": {}}
6   {"a": {"b": [[2]]}}                    6   {"a": {"b": [[2]]}}
6   {"a": {"b": [[2]]}}                    17  {}
6   {"a": {"b": [[2]]}}                    28  {"a": {}}
7   {"a": "b", "c": "d"}                   1   {"a": "b"}
7   {"a": "b", "c": "d"}                   7   {"a": "b", "c": "d"}
7   {"a": "b", "c": "d"}                   17  {}
8   {"a": {"b": true}}                     8   {"a": {"b": true}}
8   {"a": {"b": true}}                     17  {}
8   {"a": {"b": true}}                     28  {"a": {}}
9   {"a": {"b": false}}                    9   {"a": {"b": false}}
9   {"a": {"b": false}}                    17  {}
9   {"a": {"b": false}}                    28  {"a": {}}
10  "a"                                    10  "a"
11  null                                   11  null
12  true                                   12  true
13  false                                  13  false
14  1                                      14  1
15  1.23                                   15  1.23
16  [{"a": {"b": [1, [2]]}}, "d"]          16  [{"a": {"b": [1, [2]]}}, "d"]
16  [{"a": {"b": [1, [2]]}}, "d"]          18  []
17  {}                                     17  {}
18  []                                     18  []
19  ["a", "a"]                             10  "a"
19  ["a", "a"]                             18  []
19  ["a", "a"]                             19  ["a", "a"]
19  ["a", "a"]                             39  ["a"]
20  [{"a": "a"}, {"a": "a"}]               18  []
20  [{"a": "a"}, {"a": "a"}]               20  [{"a": "a"}, {"a": "a"}]
21  [[[["a"]]], [[["a"]]]]                 18  []
21  [[[["a"]]], [[["a"]]]]                 21  [[[["a"]]], [[["a"]]]]
22  [1, 2, 3, 1]                           14  1
22  [1, 2, 3, 1]                           18  []
22  [1, 2, 3, 1]                           22  [1, 2, 3, 1]
22  [1, 2, 3, 1]                           35  [1]
22  [1, 2, 3, 1]                           36  [2]
23  {"a": 123.123}                         17  {}
23  {"a": 123.123}                         23  {"a": 123.123}
23  {"a": 123.123}                         24  {"a": 123.123000}
24  {"a": 123.123000}                      17  {}
24  {"a": 123.123000}                      23  {"a": 123.123}
24  {"a": 123.123000}                      24  {"a": 123.123000}
25  {"a": [{}]}                            17  {}
25  {"a": [{}]}                            25  {"a": [{}]}
25  {"a": [{}]}                            30  {"a": []}
26  [[], {}]                               18  []
26  [[], {}]                               26  [[], {}]
27  [true, false, null, 1.23, "a"]         10  "a"
27  [true, false, null, 1.23, "a"]         11  null
27  [true, false, null, 1.23, "a"]         12  true
27  [true, false, null, 1.23, "a"]         13  false
27  [true, false, null, 1.23, "a"]         15  1.23
27  [true, false, null, 1.23, "a"]         18  []
27  [true, false, null, 1.23, "a"]         19  ["a", "a"]
27  [true, false, null, 1.23, "a"]         27  [true, false, null, 1.23, "a"]
27  [true, false, null, 1.23, "a"]         39  ["a"]
28  {"a": {}}                              17  {}
28  {"a": {}}                              28  {"a": {}}
30  {"a": []}                              17  {}
30  {"a": []}                              30  {"a": []}
31  {"a": {"b": "c", "d": "e"}, "f": "g"}  3   {"a": {"b": "c"}}
31  {"a": {"b": "c", "d": "e"}, "f": "g"}  17  {}
31  {"a": {"b": "c", "d": "e"}, "f": "g"}  28  {"a": {}}
31  {"a": {"b": "c", "d": "e"}, "f": "g"}  31  {"a": {"b": "c", "d": "e"}, "f": "g"}
32  {"a": [1]}                             17  {}
32  {"a": [1]}                             30  {"a": []}
32  {"a": [1]}                             32  {"a": [1]}
33  [1, "bar"]                             14  1
33  [1, "bar"]                             18  []
33  [1, "bar"]                             33  [1, "bar"]
33  [1, "bar"]                             35  [1]
34  {"a": 1}                               17  {}
34  {"a": 1}                               34  {"a": 1}
35  [1]                                    14  1
35  [1]                                    18  []
35  [1]                                    35  [1]
36  [2]                                    18  []
36  [2]                                    36  [2]
37  [[1]]                                  18  []
37  [[1]]                                  37  [[1]]
38  [[2]]                                  18  []
38  [[2]]                                  38  [[2]]
39  ["a"]                                  10  "a"
39  ["a"]                                  18  []
39  ["a"]                                  19  ["a", "a"]
39  ["a"]                                  39  ["a"]
40  {"a": [[]]}                            17  {}
40  {"a": [[]]}                            30  {"a": []}
40  {"a": [[]]}                            40  {"a": [[]]}
41  [[1, 2]]                               18  []
41  [[1, 2]]                               37  [[1]]
41  [[1, 2]]                               38  [[2]]
41  [[1, 2]]                               41  [[1, 2]]
41  [[1, 2]]                               42  [[1], [2]]
42  [[1], [2]]                             18  []
42  [[1], [2]]                             37  [[1]]
42  [[1], [2]]                             38  [[2]]
42  [[1], [2]]                             42  [[1], [2]]
43  [{"a": "b", "c": "d"}]                 18  []
43  [{"a": "b", "c": "d"}]                 43  [{"a": "b", "c": "d"}]
43  [{"a": "b", "c": "d"}]                 44  [{"a": "b"}, {"c": "d"}]
44  [{"a": "b"}, {"c": "d"}]               18  []
44  [{"a": "b"}, {"c": "d"}]               44  [{"a": "b"}, {"c": "d"}]

# This query performs a cross join followed by a filter.
query ITIT
SELECT * FROM json_tab@json_tab_pkey AS j1 CROSS HASH JOIN json_tab AS j2 WHERE j1.b @> j2.b ORDER BY j1.a, j2.a
----
1   {"a": "b"}                             1   {"a": "b"}
1   {"a": "b"}                             17  {}
2   [1, 2, 3, 4, "foo"]                    2   [1, 2, 3, 4, "foo"]
2   [1, 2, 3, 4, "foo"]                    14  1
2   [1, 2, 3, 4, "foo"]                    18  []
2   [1, 2, 3, 4, "foo"]                    22  [1, 2, 3, 1]
2   [1, 2, 3, 4, "foo"]                    35  [1]
2   [1, 2, 3, 4, "foo"]                    36  [2]
3   {"a": {"b": "c"}}                      3   {"a": {"b": "c"}}
3   {"a": {"b": "c"}}                      17  {}
3   {"a": {"b": "c"}}                      28  {"a": {}}
4   {"a": {"b": [1]}}                      4   {"a": {"b": [1]}}
4   {"a": {"b": [1]}}                      17  {}
4   {"a": {"b": [1]}}                      28  {"a": {}}
5   {"a": {"b": [1, [2]]}}                 4   {"a": {"b": [1]}}
5   {"a": {"b": [1, [2]]}}                 5   {"a": {"b": [1, [2]]}}
5   {"a": {"b": [1, [2]]}}                 6   {"a": {"b": [[2]]}}
5   {"a": {"b": [1, [2]]}}                 17  {}
5   {"a": {"b": [1, [2]]}}                 28  {"a": {}}
6   {"a": {"b": [[2]]}}                    6   {"a": {"b": [[2]]}}
6   {"a": {"b": [[2]]}}                    17  {}
6   {"a": {"b": [[2]]}}                    28  {"a": {}}
7   {"a": "b", "c": "d"}                   1   {"a": "b"}
7   {"a": "b", "c": "d"}                   7   {"a": "b", "c": "d"}
7   {"a": "b", "c": "d"}                   17  {}
8   {"a": {"b": true}}                     8   {"a": {"b": true}}
8   {"a": {"b": true}}                     17  {}
8   {"a": {"b": true}}                     28  {"a": {}}
9   {"a": {"b": false}}                    9   {"a": {"b": false}}
9   {"a": {"b": false}}                    17  {}
9   {"a": {"b": false}}                    28  {"a": {}}
10  "a"                                    10  "a"
11  null                                   11  null
12  true                                   12  true
13  false                                  13  false
14  1                                      14  1
15  1.23                                   15  1.23
16  [{"a": {"b": [1, [2]]}}, "d"]          16  [{"a": {"b": [1, [2]]}}, "d"]
16  [{"a": {"b": [1, [2]]}}, "d"]          18  []
17  {}                                     17  {}
18  []                                     18  []
19  ["a", "a"]                             10  "a"
19  ["a", "a"]                             18  []
19  ["a", "a"]                             19  ["a", "a"]
19  ["a", "a"]                             39  ["a"]
20  [{"a": "a"}, {"a": "a"}]               18  []
20  [{"a": "a"}, {"a": "a"}]               20  [{"a": "a"}, {"a": "a"}]
21  [[[["a"]]], [[["a"]]]]                 18  []
21  [[[["a"]]], [[["a"]]]]                 21  [[[["a"]]], [[["a"]]]]
22  [1, 2, 3, 1]                           14  1
22  [1, 2, 3, 1]                           18  []
22  [1, 2, 3, 1]                           22  [1, 2, 3, 1]
22  [1, 2, 3, 1]                           35  [1]
22  [1, 2, 3, 1]                           36  [2]
23  {"a": 123.123}                         17  {}
23  {"a": 123.123}                         23  {"a": 123.123}
23  {"a": 123.123}                         24  {"a": 123.123000}
24  {"a": 123.123000}                      17  {}
24  {"a": 123.123000}                      23  {"a": 123.123}
24  {"a": 123.123000}                      24  {"a": 123.123000}
25  {"a": [{}]}                            17  {}
25  {"a": [{}]}                            25  {"a": [{}]}
25  {"a": [{}]}                            30  {"a": []}
26  [[], {}]                               18  []
26  [[], {}]                               26  [[], {}]
27  [true, false, null, 1.23, "a"]         10  "a"
27  [true, false, null, 1.23, "a"]         11  null
27  [true, false, null, 1.23, "a"]         12  true
27  [true, false, null, 1.23, "a"]         13  false
27  [true, false, null, 1.23, "a"]         15  1.23
27  [true, false, null, 1.23, "a"]         18  []
27  [true, false, null, 1.23, "a"]         19  ["a", "a"]
27  [true, false, null, 1.23, "a"]         27  [true, false, null, 1.23, "a"]
27  [true, false, null, 1.23, "a"]         39  ["a"]
28  {"a": {}}                              17  {}
28  {"a": {}}                              28  {"a": {}}
30  {"a": []}                              17  {}
30  {"a": []}                              30  {"a": []}
31  {"a": {"b": "c", "d": "e"}, "f": "g"}  3   {"a": {"b": "c"}}
31  {"a": {"b": "c", "d": "e"}, "f": "g"}  17  {}
31  {"a": {"b": "c", "d": "e"}, "f": "g"}  28  {"a": {}}
31  {"a": {"b": "c", "d": "e"}, "f": "g"}  31  {"a": {"b": "c", "d": "e"}, "f": "g"}
32  {"a": [1]}                             17  {}
32  {"a": [1]}                             30  {"a": []}
32  {"a": [1]}                             32  {"a": [1]}
33  [1, "bar"]                             14  1
33  [1, "bar"]                             18  []
33  [1, "bar"]                             33  [1, "bar"]
33  [1, "bar"]                             35  [1]
34  {"a": 1}                               17  {}
34  {"a": 1}                               34  {"a": 1}
35  [1]                                    14  1
35  [1]                                    18  []
35  [1]                                    35  [1]
36  [2]                                    18  []
36  [2]                                    36  [2]
37  [[1]]                                  18  []
37  [[1]]                                  37  [[1]]
38  [[2]]                                  18  []
38  [[2]]                                  38  [[2]]
39  ["a"]                                  10  "a"
39  ["a"]                                  18  []
39  ["a"]                                  19  ["a", "a"]
39  ["a"]                                  39  ["a"]
40  {"a": [[]]}                            17  {}
40  {"a": [[]]}                            30  {"a": []}
40  {"a": [[]]}                            40  {"a": [[]]}
41  [[1, 2]]                               18  []
41  [[1, 2]]                               37  [[1]]
41  [[1, 2]]                               38  [[2]]
41  [[1, 2]]                               41  [[1, 2]]
41  [[1, 2]]                               42  [[1], [2]]
42  [[1], [2]]                             18  []
42  [[1], [2]]                             37  [[1]]
42  [[1], [2]]                             38  [[2]]
42  [[1], [2]]                             42  [[1], [2]]
43  [{"a": "b", "c": "d"}]                 18  []
43  [{"a": "b", "c": "d"}]                 43  [{"a": "b", "c": "d"}]
43  [{"a": "b", "c": "d"}]                 44  [{"a": "b"}, {"c": "d"}]
44  [{"a": "b"}, {"c": "d"}]               18  []
44  [{"a": "b"}, {"c": "d"}]               44  [{"a": "b"}, {"c": "d"}]

# This query is checking that the results of the previous two queries are identical.
# There should be no rows output.
query IIII
SELECT * FROM
(SELECT j1.a, j2.a FROM json_tab@foo_inv AS j1, json_tab AS j2 WHERE j1.b @> j2.b) AS inv_join(a1, a2)
FULL OUTER JOIN
(SELECT j1.a, j2.a FROM json_tab@json_tab_pkey AS j1, json_tab AS j2 WHERE j1.b @> j2.b) AS cross_join(a1, a2)
ON inv_join.a1 = cross_join.a1 AND inv_join.a2 = cross_join.a2
WHERE inv_join.a1 IS NULL OR cross_join.a1 IS NULL
----

# This query performs an inverted join.
query ITIT
SELECT * FROM json_tab@foo_inv AS j1, json_tab AS j2 WHERE j1.b <@ j2.b ORDER BY j1.a, j2.a
----
1   {"a": "b"}                             1   {"a": "b"}
1   {"a": "b"}                             7   {"a": "b", "c": "d"}
2   [1, 2, 3, 4, "foo"]                    2   [1, 2, 3, 4, "foo"]
3   {"a": {"b": "c"}}                      3   {"a": {"b": "c"}}
3   {"a": {"b": "c"}}                      31  {"a": {"b": "c", "d": "e"}, "f": "g"}
4   {"a": {"b": [1]}}                      4   {"a": {"b": [1]}}
4   {"a": {"b": [1]}}                      5   {"a": {"b": [1, [2]]}}
5   {"a": {"b": [1, [2]]}}                 5   {"a": {"b": [1, [2]]}}
6   {"a": {"b": [[2]]}}                    5   {"a": {"b": [1, [2]]}}
6   {"a": {"b": [[2]]}}                    6   {"a": {"b": [[2]]}}
7   {"a": "b", "c": "d"}                   7   {"a": "b", "c": "d"}
8   {"a": {"b": true}}                     8   {"a": {"b": true}}
9   {"a": {"b": false}}                    9   {"a": {"b": false}}
10  "a"                                    10  "a"
10  "a"                                    19  ["a", "a"]
10  "a"                                    27  [true, false, null, 1.23, "a"]
10  "a"                                    39  ["a"]
11  null                                   11  null
11  null                                   27  [true, false, null, 1.23, "a"]
12  true                                   12  true
12  true                                   27  [true, false, null, 1.23, "a"]
13  false                                  13  false
13  false                                  27  [true, false, null, 1.23, "a"]
14  1                                      2   [1, 2, 3, 4, "foo"]
14  1                                      14  1
14  1                                      22  [1, 2, 3, 1]
14  1                                      33  [1, "bar"]
14  1                                      35  [1]
15  1.23                                   15  1.23
15  1.23                                   27  [true, false, null, 1.23, "a"]
16  [{"a": {"b": [1, [2]]}}, "d"]          16  [{"a": {"b": [1, [2]]}}, "d"]
17  {}                                     1   {"a": "b"}
17  {}                                     3   {"a": {"b": "c"}}
17  {}                                     4   {"a": {"b": [1]}}
17  {}                                     5   {"a": {"b": [1, [2]]}}
17  {}                                     6   {"a": {"b": [[2]]}}
17  {}                                     7   {"a": "b", "c": "d"}
17  {}                                     8   {"a": {"b": true}}
17  {}                                     9   {"a": {"b": false}}
17  {}                                     17  {}
17  {}                                     23  {"a": 123.123}
17  {}                                     24  {"a": 123.123000}
17  {}                                     25  {"a": [{}]}
17  {}                                     28  {"a": {}}
17  {}                                     30  {"a": []}
17  {}                                     31  {"a": {"b": "c", "d": "e"}, "f": "g"}
17  {}                                     32  {"a": [1]}
17  {}                                     34  {"a": 1}
17  {}                                     40  {"a": [[]]}
18  []                                     2   [1, 2, 3, 4, "foo"]
18  []                                     16  [{"a": {"b": [1, [2]]}}, "d"]
18  []                                     18  []
18  []                                     19  ["a", "a"]
18  []                                     20  [{"a": "a"}, {"a": "a"}]
18  []                                     21  [[[["a"]]], [[["a"]]]]
18  []                                     22  [1, 2, 3, 1]
18  []                                     26  [[], {}]
18  []                                     27  [true, false, null, 1.23, "a"]
18  []                                     33  [1, "bar"]
18  []                                     35  [1]
18  []                                     36  [2]
18  []                                     37  [[1]]
18  []                                     38  [[2]]
18  []                                     39  ["a"]
18  []                                     41  [[1, 2]]
18  []                                     42  [[1], [2]]
18  []                                     43  [{"a": "b", "c": "d"}]
18  []                                     44  [{"a": "b"}, {"c": "d"}]
19  ["a", "a"]                             19  ["a", "a"]
19  ["a", "a"]                             27  [true, false, null, 1.23, "a"]
19  ["a", "a"]                             39  ["a"]
20  [{"a": "a"}, {"a": "a"}]               20  [{"a": "a"}, {"a": "a"}]
21  [[[["a"]]], [[["a"]]]]                 21  [[[["a"]]], [[["a"]]]]
22  [1, 2, 3, 1]                           2   [1, 2, 3, 4, "foo"]
22  [1, 2, 3, 1]                           22  [1, 2, 3, 1]
23  {"a": 123.123}                         23  {"a": 123.123}
23  {"a": 123.123}                         24  {"a": 123.123000}
24  {"a": 123.123000}                      23  {"a": 123.123}
24  {"a": 123.123000}                      24  {"a": 123.123000}
25  {"a": [{}]}                            25  {"a": [{}]}
26  [[], {}]                               26  [[], {}]
27  [true, false, null, 1.23, "a"]         27  [true, false, null, 1.23, "a"]
28  {"a": {}}                              3   {"a": {"b": "c"}}
28  {"a": {}}                              4   {"a": {"b": [1]}}
28  {"a": {}}                              5   {"a": {"b": [1, [2]]}}
28  {"a": {}}                              6   {"a": {"b": [[2]]}}
28  {"a": {}}                              8   {"a": {"b": true}}
28  {"a": {}}                              9   {"a": {"b": false}}
28  {"a": {}}                              28  {"a": {}}
28  {"a": {}}                              31  {"a": {"b": "c", "d": "e"}, "f": "g"}
30  {"a": []}                              25  {"a": [{}]}
30  {"a": []}                              30  {"a": []}
30  {"a": []}                              32  {"a": [1]}
30  {"a": []}                              40  {"a": [[]]}
31  {"a": {"b": "c", "d": "e"}, "f": "g"}  31  {"a": {"b": "c", "d": "e"}, "f": "g"}
32  {"a": [1]}                             32  {"a": [1]}
33  [1, "bar"]                             33  [1, "bar"]
34  {"a": 1}                               34  {"a": 1}
35  [1]                                    2   [1, 2, 3, 4, "foo"]
35  [1]                                    22  [1, 2, 3, 1]
35  [1]                                    33  [1, "bar"]
35  [1]                                    35  [1]
36  [2]                                    2   [1, 2, 3, 4, "foo"]
36  [2]                                    22  [1, 2, 3, 1]
36  [2]                                    36  [2]
37  [[1]]                                  37  [[1]]
37  [[1]]                                  41  [[1, 2]]
37  [[1]]                                  42  [[1], [2]]
38  [[2]]                                  38  [[2]]
38  [[2]]                                  41  [[1, 2]]
38  [[2]]                                  42  [[1], [2]]
39  ["a"]                                  19  ["a", "a"]
39  ["a"]                                  27  [true, false, null, 1.23, "a"]
39  ["a"]                                  39  ["a"]
40  {"a": [[]]}                            40  {"a": [[]]}
41  [[1, 2]]                               41  [[1, 2]]
42  [[1], [2]]                             41  [[1, 2]]
42  [[1], [2]]                             42  [[1], [2]]
43  [{"a": "b", "c": "d"}]                 43  [{"a": "b", "c": "d"}]
44  [{"a": "b"}, {"c": "d"}]               43  [{"a": "b", "c": "d"}]
44  [{"a": "b"}, {"c": "d"}]               44  [{"a": "b"}, {"c": "d"}]

# This query performs a cross join followed by a filter.
query ITIT
SELECT * FROM json_tab@json_tab_pkey AS j1 CROSS HASH JOIN json_tab AS j2 WHERE j1.b <@ j2.b ORDER BY j1.a, j2.a
----
1   {"a": "b"}                             1   {"a": "b"}
1   {"a": "b"}                             7   {"a": "b", "c": "d"}
2   [1, 2, 3, 4, "foo"]                    2   [1, 2, 3, 4, "foo"]
3   {"a": {"b": "c"}}                      3   {"a": {"b": "c"}}
3   {"a": {"b": "c"}}                      31  {"a": {"b": "c", "d": "e"}, "f": "g"}
4   {"a": {"b": [1]}}                      4   {"a": {"b": [1]}}
4   {"a": {"b": [1]}}                      5   {"a": {"b": [1, [2]]}}
5   {"a": {"b": [1, [2]]}}                 5   {"a": {"b": [1, [2]]}}
6   {"a": {"b": [[2]]}}                    5   {"a": {"b": [1, [2]]}}
6   {"a": {"b": [[2]]}}                    6   {"a": {"b": [[2]]}}
7   {"a": "b", "c": "d"}                   7   {"a": "b", "c": "d"}
8   {"a": {"b": true}}                     8   {"a": {"b": true}}
9   {"a": {"b": false}}                    9   {"a": {"b": false}}
10  "a"                                    10  "a"
10  "a"                                    19  ["a", "a"]
10  "a"                                    27  [true, false, null, 1.23, "a"]
10  "a"                                    39  ["a"]
11  null                                   11  null
11  null                                   27  [true, false, null, 1.23, "a"]
12  true                                   12  true
12  true                                   27  [true, false, null, 1.23, "a"]
13  false                                  13  false
13  false                                  27  [true, false, null, 1.23, "a"]
14  1                                      2   [1, 2, 3, 4, "foo"]
14  1                                      14  1
14  1                                      22  [1, 2, 3, 1]
14  1                                      33  [1, "bar"]
14  1                                      35  [1]
15  1.23                                   15  1.23
15  1.23                                   27  [true, false, null, 1.23, "a"]
16  [{"a": {"b": [1, [2]]}}, "d"]          16  [{"a": {"b": [1, [2]]}}, "d"]
17  {}                                     1   {"a": "b"}
17  {}                                     3   {"a": {"b": "c"}}
17  {}                                     4   {"a": {"b": [1]}}
17  {}                                     5   {"a": {"b": [1, [2]]}}
17  {}                                     6   {"a": {"b": [[2]]}}
17  {}                                     7   {"a": "b", "c": "d"}
17  {}                                     8   {"a": {"b": true}}
17  {}                                     9   {"a": {"b": false}}
17  {}                                     17  {}
17  {}                                     23  {"a": 123.123}
17  {}                                     24  {"a": 123.123000}
17  {}                                     25  {"a": [{}]}
17  {}                                     28  {"a": {}}
17  {}                                     30  {"a": []}
17  {}                                     31  {"a": {"b": "c", "d": "e"}, "f": "g"}
17  {}                                     32  {"a": [1]}
17  {}                                     34  {"a": 1}
17  {}                                     40  {"a": [[]]}
18  []                                     2   [1, 2, 3, 4, "foo"]
18  []                                     16  [{"a": {"b": [1, [2]]}}, "d"]
18  []                                     18  []
18  []                                     19  ["a", "a"]
18  []                                     20  [{"a": "a"}, {"a": "a"}]
18  []                                     21  [[[["a"]]], [[["a"]]]]
18  []                                     22  [1, 2, 3, 1]
18  []                                     26  [[], {}]
18  []                                     27  [true, false, null, 1.23, "a"]
18  []                                     33  [1, "bar"]
18  []                                     35  [1]
18  []                                     36  [2]
18  []                                     37  [[1]]
18  []                                     38  [[2]]
18  []                                     39  ["a"]
18  []                                     41  [[1, 2]]
18  []                                     42  [[1], [2]]
18  []                                     43  [{"a": "b", "c": "d"}]
18  []                                     44  [{"a": "b"}, {"c": "d"}]
19  ["a", "a"]                             19  ["a", "a"]
19  ["a", "a"]                             27  [true, false, null, 1.23, "a"]
19  ["a", "a"]                             39  ["a"]
20  [{"a": "a"}, {"a": "a"}]               20  [{"a": "a"}, {"a": "a"}]
21  [[[["a"]]], [[["a"]]]]                 21  [[[["a"]]], [[["a"]]]]
22  [1, 2, 3, 1]                           2   [1, 2, 3, 4, "foo"]
22  [1, 2, 3, 1]                           22  [1, 2, 3, 1]
23  {"a": 123.123}                         23  {"a": 123.123}
23  {"a": 123.123}                         24  {"a": 123.123000}
24  {"a": 123.123000}                      23  {"a": 123.123}
24  {"a": 123.123000}                      24  {"a": 123.123000}
25  {"a": [{}]}                            25  {"a": [{}]}
26  [[], {}]                               26  [[], {}]
27  [true, false, null, 1.23, "a"]         27  [true, false, null, 1.23, "a"]
28  {"a": {}}                              3   {"a": {"b": "c"}}
28  {"a": {}}                              4   {"a": {"b": [1]}}
28  {"a": {}}                              5   {"a": {"b": [1, [2]]}}
28  {"a": {}}                              6   {"a": {"b": [[2]]}}
28  {"a": {}}                              8   {"a": {"b": true}}
28  {"a": {}}                              9   {"a": {"b": false}}
28  {"a": {}}                              28  {"a": {}}
28  {"a": {}}                              31  {"a": {"b": "c", "d": "e"}, "f": "g"}
30  {"a": []}                              25  {"a": [{}]}
30  {"a": []}                              30  {"a": []}
30  {"a": []}                              32  {"a": [1]}
30  {"a": []}                              40  {"a": [[]]}
31  {"a": {"b": "c", "d": "e"}, "f": "g"}  31  {"a": {"b": "c", "d": "e"}, "f": "g"}
32  {"a": [1]}                             32  {"a": [1]}
33  [1, "bar"]                             33  [1, "bar"]
34  {"a": 1}                               34  {"a": 1}
35  [1]                                    2   [1, 2, 3, 4, "foo"]
35  [1]                                    22  [1, 2, 3, 1]
35  [1]                                    33  [1, "bar"]
35  [1]                                    35  [1]
36  [2]                                    2   [1, 2, 3, 4, "foo"]
36  [2]                                    22  [1, 2, 3, 1]
36  [2]                                    36  [2]
37  [[1]]                                  37  [[1]]
37  [[1]]                                  41  [[1, 2]]
37  [[1]]                                  42  [[1], [2]]
38  [[2]]                                  38  [[2]]
38  [[2]]                                  41  [[1, 2]]
38  [[2]]                                  42  [[1], [2]]
39  ["a"]                                  19  ["a", "a"]
39  ["a"]                                  27  [true, false, null, 1.23, "a"]
39  ["a"]                                  39  ["a"]
40  {"a": [[]]}                            40  {"a": [[]]}
41  [[1, 2]]                               41  [[1, 2]]
42  [[1], [2]]                             41  [[1, 2]]
42  [[1], [2]]                             42  [[1], [2]]
43  [{"a": "b", "c": "d"}]                 43  [{"a": "b", "c": "d"}]
44  [{"a": "b"}, {"c": "d"}]               43  [{"a": "b", "c": "d"}]
44  [{"a": "b"}, {"c": "d"}]               44  [{"a": "b"}, {"c": "d"}]

# This query is checking that the results of the previous two queries are identical.
# There should be no rows output.
query IIII
SELECT * FROM
(SELECT j1.a, j2.a FROM json_tab@foo_inv AS j1, json_tab AS j2 WHERE j1.b <@ j2.b) AS inv_join(a1, a2)
FULL OUTER JOIN
(SELECT j1.a, j2.a FROM json_tab@json_tab_pkey AS j1, json_tab AS j2 WHERE j1.b <@ j2.b) AS cross_join(a1, a2)
ON inv_join.a1 = cross_join.a1 AND inv_join.a2 = cross_join.a2
WHERE inv_join.a1 IS NULL OR cross_join.a1 IS NULL
----

# This query performs an inverted join with an additional filter.
query ITIT
SELECT j1.*, j2.* FROM json_tab AS j2 INNER INVERTED JOIN json_tab AS j1
ON j1.b @> j2.b AND j1.b @> '{"a": {}}' AND j2.a < 20
ORDER BY j1.a, j2.a
----
3   {"a": {"b": "c"}}                      3   {"a": {"b": "c"}}
3   {"a": {"b": "c"}}                      17  {}
4   {"a": {"b": [1]}}                      4   {"a": {"b": [1]}}
4   {"a": {"b": [1]}}                      17  {}
5   {"a": {"b": [1, [2]]}}                 4   {"a": {"b": [1]}}
5   {"a": {"b": [1, [2]]}}                 5   {"a": {"b": [1, [2]]}}
5   {"a": {"b": [1, [2]]}}                 6   {"a": {"b": [[2]]}}
5   {"a": {"b": [1, [2]]}}                 17  {}
6   {"a": {"b": [[2]]}}                    6   {"a": {"b": [[2]]}}
6   {"a": {"b": [[2]]}}                    17  {}
8   {"a": {"b": true}}                     8   {"a": {"b": true}}
8   {"a": {"b": true}}                     17  {}
9   {"a": {"b": false}}                    9   {"a": {"b": false}}
9   {"a": {"b": false}}                    17  {}
28  {"a": {}}                              17  {}
31  {"a": {"b": "c", "d": "e"}, "f": "g"}  3   {"a": {"b": "c"}}
31  {"a": {"b": "c", "d": "e"}, "f": "g"}  17  {}

# This query performs a cross join followed by a filter.
query ITIT
SELECT * FROM json_tab@json_tab_pkey AS j1 CROSS HASH JOIN json_tab AS j2
WHERE j1.b @> j2.b AND j1.b @> '{"a": {}}' AND j2.a < 20
ORDER BY j1.a, j2.a
----
3   {"a": {"b": "c"}}                      3   {"a": {"b": "c"}}
3   {"a": {"b": "c"}}                      17  {}
4   {"a": {"b": [1]}}                      4   {"a": {"b": [1]}}
4   {"a": {"b": [1]}}                      17  {}
5   {"a": {"b": [1, [2]]}}                 4   {"a": {"b": [1]}}
5   {"a": {"b": [1, [2]]}}                 5   {"a": {"b": [1, [2]]}}
5   {"a": {"b": [1, [2]]}}                 6   {"a": {"b": [[2]]}}
5   {"a": {"b": [1, [2]]}}                 17  {}
6   {"a": {"b": [[2]]}}                    6   {"a": {"b": [[2]]}}
6   {"a": {"b": [[2]]}}                    17  {}
8   {"a": {"b": true}}                     8   {"a": {"b": true}}
8   {"a": {"b": true}}                     17  {}
9   {"a": {"b": false}}                    9   {"a": {"b": false}}
9   {"a": {"b": false}}                    17  {}
28  {"a": {}}                              17  {}
31  {"a": {"b": "c", "d": "e"}, "f": "g"}  3   {"a": {"b": "c"}}
31  {"a": {"b": "c", "d": "e"}, "f": "g"}  17  {}

# This query is checking that the results of the previous two queries are identical.
# There should be no rows output.
query IIII
SELECT * FROM
(
  SELECT j1.a, j2.a FROM json_tab AS j2 INNER INVERTED JOIN json_tab AS j1
  ON j1.b @> j2.b AND j1.b @> '{"a": {}}' AND j2.a < 20
) AS inv_join(a1, a2)
FULL OUTER JOIN
(
  SELECT j1.a, j2.a FROM json_tab@json_tab_pkey AS j1, json_tab AS j2
  WHERE j1.b @> j2.b AND j1.b @> '{"a": {}}' AND j2.a < 20
) AS cross_join(a1, a2)
ON inv_join.a1 = cross_join.a1 AND inv_join.a2 = cross_join.a2
WHERE inv_join.a1 IS NULL OR cross_join.a1 IS NULL
----

# This query performs an inverted join with an additional filter.
query ITIT
SELECT j1.*, j2.* FROM json_tab AS j2 INNER INVERTED JOIN json_tab AS j1
ON j1.b <@ j2.b AND j1.b <@ '{"a": {}}' AND j2.a < 20
ORDER BY j1.a, j2.a
----
17  {}         1   {"a": "b"}
17  {}         3   {"a": {"b": "c"}}
17  {}         4   {"a": {"b": [1]}}
17  {}         5   {"a": {"b": [1, [2]]}}
17  {}         6   {"a": {"b": [[2]]}}
17  {}         7   {"a": "b", "c": "d"}
17  {}         8   {"a": {"b": true}}
17  {}         9   {"a": {"b": false}}
17  {}         17  {}
28  {"a": {}}  3   {"a": {"b": "c"}}
28  {"a": {}}  4   {"a": {"b": [1]}}
28  {"a": {}}  5   {"a": {"b": [1, [2]]}}
28  {"a": {}}  6   {"a": {"b": [[2]]}}
28  {"a": {}}  8   {"a": {"b": true}}
28  {"a": {}}  9   {"a": {"b": false}}

# This query performs a cross join followed by a filter.
query ITIT
SELECT * FROM json_tab@json_tab_pkey AS j1 CROSS HASH JOIN json_tab AS j2
WHERE j1.b <@ j2.b AND j1.b <@ '{"a": {}}' AND j2.a < 20
ORDER BY j1.a, j2.a
----
17  {}         1   {"a": "b"}
17  {}         3   {"a": {"b": "c"}}
17  {}         4   {"a": {"b": [1]}}
17  {}         5   {"a": {"b": [1, [2]]}}
17  {}         6   {"a": {"b": [[2]]}}
17  {}         7   {"a": "b", "c": "d"}
17  {}         8   {"a": {"b": true}}
17  {}         9   {"a": {"b": false}}
17  {}         17  {}
28  {"a": {}}  3   {"a": {"b": "c"}}
28  {"a": {}}  4   {"a": {"b": [1]}}
28  {"a": {}}  5   {"a": {"b": [1, [2]]}}
28  {"a": {}}  6   {"a": {"b": [[2]]}}
28  {"a": {}}  8   {"a": {"b": true}}
28  {"a": {}}  9   {"a": {"b": false}}

# This query is checking that the results of the previous two queries are identical.
# There should be no rows output.
query IIII
SELECT * FROM
(
  SELECT j1.a, j2.a FROM json_tab AS j2 INNER INVERTED JOIN json_tab AS j1
  ON j1.b <@ j2.b AND j1.b <@ '{"a": {}}' AND j2.a < 20
) AS inv_join(a1, a2)
FULL OUTER JOIN
(
  SELECT j1.a, j2.a FROM json_tab@json_tab_pkey AS j1, json_tab AS j2
  WHERE j1.b <@ j2.b AND j1.b <@ '{"a": {}}' AND j2.a < 20
) AS cross_join(a1, a2)
ON inv_join.a1 = cross_join.a1 AND inv_join.a2 = cross_join.a2
WHERE inv_join.a1 IS NULL OR cross_join.a1 IS NULL
----

# This query performs a left inverted join with an additional filter.
query ITIT
SELECT j1.*, j2.* FROM json_tab AS j2 LEFT INVERTED JOIN json_tab AS j1
ON j1.b @> j2.b AND j1.b @> '{"a": {}}' AND j2.a < 20
ORDER BY j1.a, j2.a
----
NULL  NULL                                   1   {"a": "b"}
NULL  NULL                                   2   [1, 2, 3, 4, "foo"]
NULL  NULL                                   7   {"a": "b", "c": "d"}
NULL  NULL                                   10  "a"
NULL  NULL                                   11  null
NULL  NULL                                   12  true
NULL  NULL                                   13  false
NULL  NULL                                   14  1
NULL  NULL                                   15  1.23
NULL  NULL                                   16  [{"a": {"b": [1, [2]]}}, "d"]
NULL  NULL                                   18  []
NULL  NULL                                   19  ["a", "a"]
NULL  NULL                                   20  [{"a": "a"}, {"a": "a"}]
NULL  NULL                                   21  [[[["a"]]], [[["a"]]]]
NULL  NULL                                   22  [1, 2, 3, 1]
NULL  NULL                                   23  {"a": 123.123}
NULL  NULL                                   24  {"a": 123.123000}
NULL  NULL                                   25  {"a": [{}]}
NULL  NULL                                   26  [[], {}]
NULL  NULL                                   27  [true, false, null, 1.23, "a"]
NULL  NULL                                   28  {"a": {}}
NULL  NULL                                   29  NULL
NULL  NULL                                   30  {"a": []}
NULL  NULL                                   31  {"a": {"b": "c", "d": "e"}, "f": "g"}
NULL  NULL                                   32  {"a": [1]}
NULL  NULL                                   33  [1, "bar"]
NULL  NULL                                   34  {"a": 1}
NULL  NULL                                   35  [1]
NULL  NULL                                   36  [2]
NULL  NULL                                   37  [[1]]
NULL  NULL                                   38  [[2]]
NULL  NULL                                   39  ["a"]
NULL  NULL                                   40  {"a": [[]]}
NULL  NULL                                   41  [[1, 2]]
NULL  NULL                                   42  [[1], [2]]
NULL  NULL                                   43  [{"a": "b", "c": "d"}]
NULL  NULL                                   44  [{"a": "b"}, {"c": "d"}]
3     {"a": {"b": "c"}}                      3   {"a": {"b": "c"}}
3     {"a": {"b": "c"}}                      17  {}
4     {"a": {"b": [1]}}                      4   {"a": {"b": [1]}}
4     {"a": {"b": [1]}}                      17  {}
5     {"a": {"b": [1, [2]]}}                 4   {"a": {"b": [1]}}
5     {"a": {"b": [1, [2]]}}                 5   {"a": {"b": [1, [2]]}}
5     {"a": {"b": [1, [2]]}}                 6   {"a": {"b": [[2]]}}
5     {"a": {"b": [1, [2]]}}                 17  {}
6     {"a": {"b": [[2]]}}                    6   {"a": {"b": [[2]]}}
6     {"a": {"b": [[2]]}}                    17  {}
8     {"a": {"b": true}}                     8   {"a": {"b": true}}
8     {"a": {"b": true}}                     17  {}
9     {"a": {"b": false}}                    9   {"a": {"b": false}}
9     {"a": {"b": false}}                    17  {}
28    {"a": {}}                              17  {}
31    {"a": {"b": "c", "d": "e"}, "f": "g"}  3   {"a": {"b": "c"}}
31    {"a": {"b": "c", "d": "e"}, "f": "g"}  17  {}

# This query performs a left inverted join with an additional filter.
query ITIT
SELECT j1.*, j2.* FROM json_tab AS j2 LEFT INVERTED JOIN json_tab AS j1
ON j1.b <@ j2.b AND j1.b <@ '{"a": {}}' AND j2.a < 20
ORDER BY j1.a, j2.a
----
NULL  NULL       2   [1, 2, 3, 4, "foo"]
NULL  NULL       10  "a"
NULL  NULL       11  null
NULL  NULL       12  true
NULL  NULL       13  false
NULL  NULL       14  1
NULL  NULL       15  1.23
NULL  NULL       16  [{"a": {"b": [1, [2]]}}, "d"]
NULL  NULL       18  []
NULL  NULL       19  ["a", "a"]
NULL  NULL       20  [{"a": "a"}, {"a": "a"}]
NULL  NULL       21  [[[["a"]]], [[["a"]]]]
NULL  NULL       22  [1, 2, 3, 1]
NULL  NULL       23  {"a": 123.123}
NULL  NULL       24  {"a": 123.123000}
NULL  NULL       25  {"a": [{}]}
NULL  NULL       26  [[], {}]
NULL  NULL       27  [true, false, null, 1.23, "a"]
NULL  NULL       28  {"a": {}}
NULL  NULL       29  NULL
NULL  NULL       30  {"a": []}
NULL  NULL       31  {"a": {"b": "c", "d": "e"}, "f": "g"}
NULL  NULL       32  {"a": [1]}
NULL  NULL       33  [1, "bar"]
NULL  NULL       34  {"a": 1}
NULL  NULL       35  [1]
NULL  NULL       36  [2]
NULL  NULL       37  [[1]]
NULL  NULL       38  [[2]]
NULL  NULL       39  ["a"]
NULL  NULL       40  {"a": [[]]}
NULL  NULL       41  [[1, 2]]
NULL  NULL       42  [[1], [2]]
NULL  NULL       43  [{"a": "b", "c": "d"}]
NULL  NULL       44  [{"a": "b"}, {"c": "d"}]
17    {}         1   {"a": "b"}
17    {}         3   {"a": {"b": "c"}}
17    {}         4   {"a": {"b": [1]}}
17    {}         5   {"a": {"b": [1, [2]]}}
17    {}         6   {"a": {"b": [[2]]}}
17    {}         7   {"a": "b", "c": "d"}
17    {}         8   {"a": {"b": true}}
17    {}         9   {"a": {"b": false}}
17    {}         17  {}
28    {"a": {}}  3   {"a": {"b": "c"}}
28    {"a": {}}  4   {"a": {"b": [1]}}
28    {"a": {}}  5   {"a": {"b": [1, [2]]}}
28    {"a": {}}  6   {"a": {"b": [[2]]}}
28    {"a": {}}  8   {"a": {"b": true}}
28    {"a": {}}  9   {"a": {"b": false}}

# This query performs a semi inverted join with an additional filter.
query IT
SELECT * FROM json_tab AS j2 WHERE EXISTS (
  SELECT * FROM json_tab@foo_inv AS j1
  WHERE j1.b @> j2.b AND j2.a < 20
)
ORDER BY j2.a
----
1   {"a": "b"}
2   [1, 2, 3, 4, "foo"]
3   {"a": {"b": "c"}}
4   {"a": {"b": [1]}}
5   {"a": {"b": [1, [2]]}}
6   {"a": {"b": [[2]]}}
7   {"a": "b", "c": "d"}
8   {"a": {"b": true}}
9   {"a": {"b": false}}
10  "a"
11  null
12  true
13  false
14  1
15  1.23
16  [{"a": {"b": [1, [2]]}}, "d"]
17  {}
18  []
19  ["a", "a"]

# This query performs a semi inverted join with an additional filter.
query IT
SELECT * FROM json_tab AS j2 WHERE EXISTS (
  SELECT * FROM json_tab@foo_inv AS j1
  WHERE j1.b <@ j2.b AND j2.a < 20
)
ORDER BY j2.a
----
1   {"a": "b"}
2   [1, 2, 3, 4, "foo"]
3   {"a": {"b": "c"}}
4   {"a": {"b": [1]}}
5   {"a": {"b": [1, [2]]}}
6   {"a": {"b": [[2]]}}
7   {"a": "b", "c": "d"}
8   {"a": {"b": true}}
9   {"a": {"b": false}}
10  "a"
11  null
12  true
13  false
14  1
15  1.23
16  [{"a": {"b": [1, [2]]}}, "d"]
17  {}
18  []
19  ["a", "a"]

# This query performs an anti inverted join with an additional filter.
query IT
SELECT * FROM json_tab AS j2 WHERE NOT EXISTS (
  SELECT * FROM json_tab@foo_inv AS j1
  WHERE j1.b @> j2.b AND j2.a < 20
)
ORDER BY j2.a
----
20  [{"a": "a"}, {"a": "a"}]
21  [[[["a"]]], [[["a"]]]]
22  [1, 2, 3, 1]
23  {"a": 123.123}
24  {"a": 123.123000}
25  {"a": [{}]}
26  [[], {}]
27  [true, false, null, 1.23, "a"]
28  {"a": {}}
29  NULL
30  {"a": []}
31  {"a": {"b": "c", "d": "e"}, "f": "g"}
32  {"a": [1]}
33  [1, "bar"]
34  {"a": 1}
35  [1]
36  [2]
37  [[1]]
38  [[2]]
39  ["a"]
40  {"a": [[]]}
41  [[1, 2]]
42  [[1], [2]]
43  [{"a": "b", "c": "d"}]
44  [{"a": "b"}, {"c": "d"}]

# This query performs an anti inverted join with an additional filter.
query IT
SELECT * FROM json_tab AS j2 WHERE NOT EXISTS (
  SELECT * FROM json_tab@foo_inv AS j1
  WHERE j1.b <@ j2.b AND j2.a < 20
)
ORDER BY j2.a
----
20  [{"a": "a"}, {"a": "a"}]
21  [[[["a"]]], [[["a"]]]]
22  [1, 2, 3, 1]
23  {"a": 123.123}
24  {"a": 123.123000}
25  {"a": [{}]}
26  [[], {}]
27  [true, false, null, 1.23, "a"]
28  {"a": {}}
29  NULL
30  {"a": []}
31  {"a": {"b": "c", "d": "e"}, "f": "g"}
32  {"a": [1]}
33  [1, "bar"]
34  {"a": 1}
35  [1]
36  [2]
37  [[1]]
38  [[2]]
39  ["a"]
40  {"a": [[]]}
41  [[1, 2]]
42  [[1], [2]]
43  [{"a": "b", "c": "d"}]
44  [{"a": "b"}, {"c": "d"}]

statement ok
INSERT INTO array_tab VALUES
  (1, '{}'),
  (2, '{1}'),
  (3, '{2}'),
  (4, '{1, 2}'),
  (5, '{1, 3}'),
  (6, '{1, 2, 3, 4}'),
  (7, ARRAY[NULL]::INT[]),
  (8, NULL)

# This query performs an inverted join.
query ITIT
SELECT * FROM array_tab@foo_inv AS a1, array_tab AS a2 WHERE a1.b @> a2.b ORDER BY a1.a, a2.a
----
1  {}         1  {}
2  {1}        1  {}
2  {1}        2  {1}
3  {2}        1  {}
3  {2}        3  {2}
4  {1,2}      1  {}
4  {1,2}      2  {1}
4  {1,2}      3  {2}
4  {1,2}      4  {1,2}
5  {1,3}      1  {}
5  {1,3}      2  {1}
5  {1,3}      5  {1,3}
6  {1,2,3,4}  1  {}
6  {1,2,3,4}  2  {1}
6  {1,2,3,4}  3  {2}
6  {1,2,3,4}  4  {1,2}
6  {1,2,3,4}  5  {1,3}
6  {1,2,3,4}  6  {1,2,3,4}
7  {NULL}     1  {}

# This query performs a cross join followed by a filter.
query ITIT
SELECT * FROM array_tab@array_tab_pkey AS a1 CROSS HASH JOIN array_tab AS a2 WHERE a1.b @> a2.b ORDER BY a1.a, a2.a
----
1  {}         1  {}
2  {1}        1  {}
2  {1}        2  {1}
3  {2}        1  {}
3  {2}        3  {2}
4  {1,2}      1  {}
4  {1,2}      2  {1}
4  {1,2}      3  {2}
4  {1,2}      4  {1,2}
5  {1,3}      1  {}
5  {1,3}      2  {1}
5  {1,3}      5  {1,3}
6  {1,2,3,4}  1  {}
6  {1,2,3,4}  2  {1}
6  {1,2,3,4}  3  {2}
6  {1,2,3,4}  4  {1,2}
6  {1,2,3,4}  5  {1,3}
6  {1,2,3,4}  6  {1,2,3,4}
7  {NULL}     1  {}

# This query is checking that the results of the previous two queries are identical.
# There should be no rows output.
query IIII
SELECT * FROM
(SELECT a1.a, a2.a FROM array_tab@foo_inv AS a1, array_tab AS a2 WHERE a1.b @> a2.b) AS inv_join(a1, a2)
FULL OUTER JOIN
(SELECT a1.a, a2.a FROM array_tab@array_tab_pkey AS a1, array_tab AS a2 WHERE a1.b @> a2.b) AS cross_join(a1, a2)
ON inv_join.a1 = cross_join.a1 AND inv_join.a2 = cross_join.a2
WHERE inv_join.a1 IS NULL OR cross_join.a1 IS NULL
----

# This query performs an inverted join.
query ITIT
SELECT * FROM array_tab@foo_inv AS a1, array_tab AS a2 WHERE a1.b <@ a2.b ORDER BY a1.a, a2.a
----
1  {}         1  {}
1  {}         2  {1}
1  {}         3  {2}
1  {}         4  {1,2}
1  {}         5  {1,3}
1  {}         6  {1,2,3,4}
1  {}         7  {NULL}
2  {1}        2  {1}
2  {1}        4  {1,2}
2  {1}        5  {1,3}
2  {1}        6  {1,2,3,4}
3  {2}        3  {2}
3  {2}        4  {1,2}
3  {2}        6  {1,2,3,4}
4  {1,2}      4  {1,2}
4  {1,2}      6  {1,2,3,4}
5  {1,3}      5  {1,3}
5  {1,3}      6  {1,2,3,4}
6  {1,2,3,4}  6  {1,2,3,4}

# This query performs a cross join followed by a filter.
query ITIT
SELECT * FROM array_tab@array_tab_pkey AS a1 CROSS HASH JOIN array_tab AS a2 WHERE a1.b <@ a2.b ORDER BY a1.a, a2.a
----
1  {}         1  {}
1  {}         2  {1}
1  {}         3  {2}
1  {}         4  {1,2}
1  {}         5  {1,3}
1  {}         6  {1,2,3,4}
1  {}         7  {NULL}
2  {1}        2  {1}
2  {1}        4  {1,2}
2  {1}        5  {1,3}
2  {1}        6  {1,2,3,4}
3  {2}        3  {2}
3  {2}        4  {1,2}
3  {2}        6  {1,2,3,4}
4  {1,2}      4  {1,2}
4  {1,2}      6  {1,2,3,4}
5  {1,3}      5  {1,3}
5  {1,3}      6  {1,2,3,4}
6  {1,2,3,4}  6  {1,2,3,4}

# This query is checking that the results of the previous two queries are identical.
# There should be no rows output.
query IIII
SELECT * FROM
(SELECT a1.a, a2.a FROM array_tab@foo_inv AS a1, array_tab AS a2 WHERE a1.b <@ a2.b) AS inv_join(a1, a2)
FULL OUTER JOIN
(SELECT a1.a, a2.a FROM array_tab@array_tab_pkey AS a1, array_tab AS a2 WHERE a1.b <@ a2.b) AS cross_join(a1, a2)
ON inv_join.a1 = cross_join.a1 AND inv_join.a2 = cross_join.a2
WHERE inv_join.a1 IS NULL OR cross_join.a1 IS NULL
----

# This query performs an inverted join with an additional filter.
query ITIT
SELECT a1.*, a2.* FROM array_tab@array_tab_pkey AS a2
INNER INVERTED JOIN array_tab@foo_inv AS a1
ON a1.b @> a2.b AND a1.b @> '{1}' AND a2.a < 5
ORDER BY a1.a, a2.a
----
2  {1}        1  {}
2  {1}        2  {1}
4  {1,2}      1  {}
4  {1,2}      2  {1}
4  {1,2}      3  {2}
4  {1,2}      4  {1,2}
5  {1,3}      1  {}
5  {1,3}      2  {1}
6  {1,2,3,4}  1  {}
6  {1,2,3,4}  2  {1}
6  {1,2,3,4}  3  {2}
6  {1,2,3,4}  4  {1,2}

# This query performs a cross join followed by a filter.
query ITIT
SELECT * FROM array_tab@array_tab_pkey AS a1 CROSS HASH JOIN array_tab AS a2
WHERE a1.b @> a2.b AND a1.b @> '{1}' AND a2.a < 5
ORDER BY a1.a, a2.a
----
2  {1}        1  {}
2  {1}        2  {1}
4  {1,2}      1  {}
4  {1,2}      2  {1}
4  {1,2}      3  {2}
4  {1,2}      4  {1,2}
5  {1,3}      1  {}
5  {1,3}      2  {1}
6  {1,2,3,4}  1  {}
6  {1,2,3,4}  2  {1}
6  {1,2,3,4}  3  {2}
6  {1,2,3,4}  4  {1,2}

# This query is checking that the results of the previous two queries are identical.
# There should be no rows output.
query IIII
SELECT * FROM
(
  SELECT a1.a, a2.a FROM array_tab@array_tab_pkey AS a2
  INNER INVERTED JOIN array_tab@foo_inv AS a1
  ON a1.b @> a2.b AND a1.b @> '{1}' AND a2.a < 5
) AS inv_join(a1, a2)
FULL OUTER JOIN
(
  SELECT a1.a, a2.a FROM array_tab@array_tab_pkey AS a1, array_tab AS a2
  WHERE a1.b @> a2.b AND a1.b @> '{1}' AND a2.a < 5
) AS cross_join(a1, a2)
ON inv_join.a1 = cross_join.a1 AND inv_join.a2 = cross_join.a2
WHERE inv_join.a1 IS NULL OR cross_join.a1 IS NULL
----

# This query performs an inverted join with an additional filter.
query ITIT
SELECT a1.*, a2.* FROM array_tab@array_tab_pkey AS a2
INNER INVERTED JOIN array_tab@foo_inv AS a1
ON a1.b <@ a2.b AND a1.b <@ '{1}' AND a2.a < 5
ORDER BY a1.a, a2.a
----
1  {}   1  {}
1  {}   2  {1}
1  {}   3  {2}
1  {}   4  {1,2}
2  {1}  2  {1}
2  {1}  4  {1,2}

# This query performs a cross join followed by a filter.
query ITIT
SELECT * FROM array_tab@array_tab_pkey AS a1 CROSS HASH JOIN array_tab AS a2
WHERE a1.b <@ a2.b AND a1.b <@ '{1}' AND a2.a < 5
ORDER BY a1.a, a2.a
----
1  {}   1  {}
1  {}   2  {1}
1  {}   3  {2}
1  {}   4  {1,2}
2  {1}  2  {1}
2  {1}  4  {1,2}

# This query is checking that the results of the previous two queries are identical.
# There should be no rows output.
query IIII
SELECT * FROM
(
  SELECT a1.a, a2.a FROM array_tab@array_tab_pkey AS a2
  INNER INVERTED JOIN array_tab@foo_inv AS a1
  ON a1.b <@ a2.b AND a1.b <@ '{1}' AND a2.a < 5
) AS inv_join(a1, a2)
FULL OUTER JOIN
(
  SELECT a1.a, a2.a FROM array_tab@array_tab_pkey AS a1, array_tab AS a2
  WHERE a1.b <@ a2.b AND a1.b <@ '{1}' AND a2.a < 5
) AS cross_join(a1, a2)
ON inv_join.a1 = cross_join.a1 AND inv_join.a2 = cross_join.a2
WHERE inv_join.a1 IS NULL OR cross_join.a1 IS NULL
----

# This query performs a left inverted join with an additional filter.
query ITIT
SELECT a1.*, a2.* FROM array_tab@array_tab_pkey AS a2
LEFT INVERTED JOIN array_tab@foo_inv AS a1
ON a1.b @> a2.b AND a1.b @> '{1}' AND a2.a < 5
ORDER BY a1.a, a2.a
----
NULL  NULL       5  {1,3}
NULL  NULL       6  {1,2,3,4}
NULL  NULL       7  {NULL}
NULL  NULL       8  NULL
2     {1}        1  {}
2     {1}        2  {1}
4     {1,2}      1  {}
4     {1,2}      2  {1}
4     {1,2}      3  {2}
4     {1,2}      4  {1,2}
5     {1,3}      1  {}
5     {1,3}      2  {1}
6     {1,2,3,4}  1  {}
6     {1,2,3,4}  2  {1}
6     {1,2,3,4}  3  {2}
6     {1,2,3,4}  4  {1,2}

# This query performs a left inverted join with an additional filter.
query ITIT
SELECT a1.*, a2.* FROM array_tab@array_tab_pkey AS a2
LEFT INVERTED JOIN array_tab@foo_inv AS a1
ON a1.b <@ a2.b AND a1.b <@ '{1}' AND a2.a < 5
ORDER BY a1.a, a2.a
----
NULL  NULL  5  {1,3}
NULL  NULL  6  {1,2,3,4}
NULL  NULL  7  {NULL}
NULL  NULL  8  NULL
1     {}    1  {}
1     {}    2  {1}
1     {}    3  {2}
1     {}    4  {1,2}
2     {1}   2  {1}
2     {1}   4  {1,2}

# This query performs a semi inverted join.
query IT
SELECT a2.* FROM array_tab@array_tab_pkey AS a2 WHERE EXISTS (
  SELECT * FROM array_tab@foo_inv AS a1
  WHERE a1.b @> a2.b
)
ORDER BY a2.a
----
1  {}
2  {1}
3  {2}
4  {1,2}
5  {1,3}
6  {1,2,3,4}

# This query performs a semi inverted join.
query IT
SELECT a2.* FROM array_tab@array_tab_pkey AS a2 WHERE EXISTS (
  SELECT * FROM array_tab@foo_inv AS a1
  WHERE a1.b <@ a2.b
)
ORDER BY a2.a
----
1  {}
2  {1}
3  {2}
4  {1,2}
5  {1,3}
6  {1,2,3,4}
7  {NULL}

# This query performs an anti inverted join.
query IT
SELECT a2.* FROM array_tab@array_tab_pkey AS a2 WHERE NOT EXISTS (
  SELECT * FROM array_tab@foo_inv AS a1
  WHERE a1.b @> a2.b
)
ORDER BY a2.a
----
7  {NULL}
8  NULL

# This query performs an anti inverted join.
query IT
SELECT a2.* FROM array_tab@array_tab_pkey AS a2 WHERE NOT EXISTS (
  SELECT * FROM array_tab@foo_inv AS a1
  WHERE a1.b <@ a2.b
)
ORDER BY a2.a
----
8  NULL

statement ok
CREATE TABLE j1 (
  k INT PRIMARY KEY,
  j JSON
)

statement ok
INSERT INTO j1 VALUES (1, '{"a": "b"}')

statement ok
CREATE TABLE j2 (
  k INT PRIMARY KEY,
  j JSON,
  INVERTED INDEX j_idx (j)
)

statement ok
INSERT INTO j2 VALUES (1, '{"a": "b"}')

# Regression test for #58892. Ensure that all right-side columns in the output
# are NULL.
query ITIT
SELECT j1.*, j2.*
FROM j1 LEFT INVERTED JOIN j2@j_idx
  ON j2.j @> j1.j AND j2.j = '"foo"'
ORDER BY j1.k, j2.k
----
1  {"a": "b"}  NULL  NULL
