# LogicTest: 5node

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

# Insert many types of JSON values.
statement ok
INSERT INTO j1 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"}]')

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

# Insert combinations of i and j. The first 3 primes after 44 are used to avoid
# primary key collisions.
statement ok
INSERT INTO j2 (
  SELECT k * i, i, j FROM j1
  CROSS JOIN (VALUES (47), (53), (59)) t1(i)
)

statement ok
ALTER TABLE j2 SPLIT AT VALUES (44), (88)

statement ok
ALTER TABLE j2 EXPERIMENTAL_RELOCATE VALUES (ARRAY[1], 1), (ARRAY[2], 44), (ARRAY[3], 88)

query TTTI colnames
SELECT start_key, end_key, replicas, lease_holder
FROM [SHOW EXPERIMENTAL_RANGES FROM TABLE j2 WITH DETAILS] ORDER BY lease_holder
----
start_key           end_key       replicas  lease_holder
<before:/Table/72>  …/1/44        {1}       1
…/1/44              …/1/88        {2}       2
…/1/88              <after:/Max>  {3}       3

# This query performs an inverted join.
query T
EXPLAIN (DISTSQL)
SELECT * FROM j2@ij_idx, j1 WHERE i IN (2, 3) AND j2.j @> j1.j ORDER BY j1.k, j2.k
----
distribution: local
vectorized: true
·
• sort
│ order: +k,+k
│
└── • lookup join
    │ table: j2@j2_pkey
    │ equality: (k) = (k)
    │ equality cols are key
    │ pred: j @> j
    │
    └── • inverted join
        │ table: j2@ij_idx
        │
        └── • cross join
            │
            ├── • scan
            │     missing stats
            │     table: j1@j1_pkey
            │     spans: FULL SCAN
            │
            └── • values
                  size: 1 column, 2 rows
·
Diagram: https://cockroachdb.github.io/distsqlplan/decode.html#eJyUk19v2kgUxd_3U1zdJ9hMgmdsEslPkwSvwopAFtC2VYsiF98kNsbjzthNoojvXo3JH3BjGvyANP9-5xzmzBOaHyn6GHy-Gpz2h9Dq9SfTyX-DNkyCQXA-hb_hn_HoEhIh4-Q6jh4YJBw-XQTjAFox2BOCgdtuw-mwB61EHCUgv5WO4xIk_Chpw2jcC8Zw9sUOFwwScbRAhpmKaBguyaD_FTnOGOZazckYpe3UU7WhHz2g7zCMs7ws7PSM4VxpQv8Ji7hICX2cht9TGlMYke44yDCiIozTCptwmfDrfEGPyPBcpeUyMz5YD8hwkod2dIizFUNVFm8KpghvCX2-YanfQ99ZsY-7-j9MSzIdvm3IgzNoCZjfldnCtBuVnZoyb1R-EywzpSPSFG0pzuzJP215x_5FaO7-VXFGuiO2I4zKwgfJmRRMuo0JRC2B2Oe_62c_SRcUPRtwa5f6UkRkrzuDh1yDPH4tnhS1C4_Xd75p3mOy2-jfrfl39_FvfT8X0vvNeyJeCjlQalHmkKg4A5X5IG3Q0RDkyQdzdJk8ZvKEVYEao3i1KN4-USZKF6Q73e0Y0jtgkh80SnZrkt19JMdkcpUZqvf4Qy_lkNs2U3RL69dhVKnndKXVvNq7Ho4qUDURkSnWq2I96GfVErcKmsLl68PfJPE9SGKTxOsksZPkbpGcTZKok9ydJK-Z5NZJ3k5St5nk1UndnaTjZpJjb_EmVffXcYQ-Os_f4Ts_Lx_aA-GtsVWa3Kn7Cjt9zG0RbsLUEMPLcEE9Kkgv4yw2RTxHv9AlrVZ__QoAAP__E-c4nQ==

statement ok
CREATE TABLE a1 (
  k INT PRIMARY KEY,
  a INT[]
)

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

statement ok
CREATE TABLE a2 (
  k INT PRIMARY KEY,
  i INT,
  a INT[],
  INVERTED INDEX ia_idx (i, a)
)

# Insert combinations of i and a. The first 3 primes after 44 are used to avoid
# primary key collisions.
statement ok
INSERT INTO a2 (
  SELECT k*i, i, a FROM a1
  CROSS JOIN (VALUES (47), (53), (59)) t1(i)
)

statement ok
ALTER TABLE a2 SPLIT AT VALUES (8), (16)

statement ok
ALTER TABLE a2 EXPERIMENTAL_RELOCATE VALUES (ARRAY[1], 1), (ARRAY[2], 8), (ARRAY[3], 16)

query TTTI colnames
SELECT start_key, end_key, replicas, lease_holder
FROM [SHOW EXPERIMENTAL_RANGES FROM TABLE a2 WITH DETAILS] ORDER BY lease_holder
----
start_key                 end_key       replicas  lease_holder
<before:/Table/107/1/88>  …/1/8         {1}       1
…/1/8                     …/1/16        {2}       2
…/1/16                    <after:/Max>  {3}       3

# This query performs an inverted join.
query T
EXPLAIN (DISTSQL)
SELECT * FROM a2@ia_idx, a1 WHERE i IN (2, 3) AND a2.a @> a1.a ORDER BY a1.k, a2.k
----
distribution: local
vectorized: true
·
• sort
│ order: +k,+k
│
└── • lookup join
    │ table: a2@a2_pkey
    │ equality: (k) = (k)
    │ equality cols are key
    │ pred: a @> a
    │
    └── • inverted join
        │ table: a2@ia_idx
        │
        └── • cross join
            │
            ├── • scan
            │     missing stats
            │     table: a1@a1_pkey
            │     spans: FULL SCAN
            │
            └── • values
                  size: 1 column, 2 rows
·
Diagram: https://cockroachdb.github.io/distsqlplan/decode.html#eJyUk9tv2jAYxd_3V3z6nmB1S-yEVsqT28JUJgodoF20ocojX9uMEGd2sraq-N8nh14ga1jJA5Jvv3MOPn5A-zvBELtfL_rHvQE0Or3xZPyp34Rxt989ncB7-DAanoMSMlaXcXTHQHH4ctYddaERgzshGPjNJhwPOtBQ4kCB_FF4nk-g-IFqwnDU6Y7g5JsbzhkocTBHhqmOaKAWZDH8jhynDDOjZ2StNm7qodzQi-4w9BjGaVbkbnrKcKYNYfiAeZwnhCFO1M-ERqQiMi0PGUaUqzgpsYpLxS-zOd0jw1OdFIvUhuA8IMNxptxoH6dLhrrIXxRsrq4JQ75mqdfB0Fuyt7v6rJKCbItvGgrgBBoCZjdFOrfNWmWvosxrlV8Ei1SbiAxFG4pTd_J_W16xf6bszUcdp2RaYjPCsMhDkJxJwaRfm0BUEohd_rte-odMTtGjAb9yqU9FRPa8s3uXGZCHz8WTonLh8erO180HTLZr_fsV__4u_p3vx0IG_3hX4qmQfa3nRQa_dJyCTkOQLuhwAPLojTnaTB4yecTKQLVRgkqUYJcoY21yMq32ZgwZ7DHJ92ol2xXJ9i6SI7KZTi1Ve_yml7LPXZspuqbV67C6MDO6MHpW7l0NhyWonIjI5qtVsRr00nKJOwVDavH88NdJfAeSWCfxKklsJfkbJG-dJKokfyspqCf5VVKwldSuJwVVUnsr6bCe5LlbvEr07WUcYYje47f_ys_Th-6AurauSuMbfVtiJ_eZK8KVSiwxPFdz6lBOZhGnsc3jGYa5KWi5fPc3AAD__30tN_s=
