# LogicTest: 5node

statement ok
SET enable_zigzag_join = true

subtest json

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

statement ok
CREATE INVERTED INDEX foo_inv ON json_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"]')

statement ok
ANALYZE json_tab

statement ok
ALTER TABLE json_tab SPLIT AT VALUES (10), (20)

statement ok
ALTER TABLE json_tab EXPERIMENTAL_RELOCATE VALUES (ARRAY[1], 1), (ARRAY[2], 10), (ARRAY[3], 20)

query TTTI colnames
SELECT start_key, end_key, replicas, lease_holder
FROM [SHOW RANGES FROM INDEX json_tab@primary WITH DETAILS] ORDER BY lease_holder, start_key
----
start_key           end_key       replicas  lease_holder
<before:/Table/72>  …/10          {1}       1
…/10                …/20          {2}       2
…/20                …/<IndexMax>  {3}       3

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

# Filter with a fully-specified array. This should not use a zigzag join due
# to distribution costs.
query T
EXPLAIN (DISTSQL)
SELECT a FROM json_tab WHERE b @> '[1, 2]' ORDER BY a
----
distribution: full
vectorized: true
·
• filter
│ estimated row count: 0
│ filter: b @> '[1, 2]'
│
└── • scan
      estimated row count: 33 (100% of the table; stats collected <hidden> ago)
      table: json_tab@json_tab_pkey
      spans: FULL SCAN
·
Diagram: https://cockroachdb.github.io/distsqlplan/decode.html#eJy0lN9u2jAUh-_3FNa56aY5SuwAk3zFWlKNqYUuQdqmDlWGnHZZQ5zZjrqq4t2nhEFJ1iBoVV8g_Cefv_yOnQcwv1MQEHy7OPs4HJG3g2E0ib6cvSNRcBacTIgkp-H4nPwyKruycka-fgrCgMxI_0fheT6So0tGCZ8ekXE4CEJy_J1IoJCpGEdygQbEJTCgwIGCD1MKuVZzNEbpcuqhWjiM_4DwKCRZXthyeEphrjSCeACb2BRBwETOUgxRxqhdDyjEaGWSVvi1Wn_95yq_xXugcKLSYpEZQSQlM6AQ5bLsOS7zYLqkoAr7uKGx8gZBsC3D4QCEt6T7S54mqUWN2vXrhqtxQfr8v9iEEJ-j8ei4VYg3hPxWoUcPpWPUGNcl-uw9TJdPWI-Uo3K3V189Lqwgfdaq5Te0ejUttn8x2cuK6TLPcfn-9WSHeG7q2Xm9enZqQnz_4PgLg-Oes3dq_BDJTWrd10ute8i1DNHkKjNY02nbyWvs5LDyzmB8g6s7ZlSh53ih1bxau-qOK1A1EKOxq1m26gyz9ZSxGuVi81XZJrGdJF4jsW2S3yTxnaQPBzj5O0mddhJrkjrPfbtOk9TdSeq1O_Emqfdcp255Hq5TdXeVxCDA-9ecJ37WDcoH5I0pD2X0U91V2Ml9Xh6pa5kapHAub3GAFvUiyRJjkzkIqwtcLt_8DQAA__91J3EE

# Combine predicates with AND. Should have the same output as b @> '[1, 2]'.
# This should not use a zigzag join due to distribution costs.
query T
EXPLAIN (DISTSQL)
SELECT a FROM json_tab WHERE b @> '[1]' AND b @> '[2]' ORDER BY a
----
distribution: full
vectorized: true
·
• filter
│ estimated row count: 0
│ filter: (b @> '[1]') AND (b @> '[2]')
│
└── • scan
      estimated row count: 33 (100% of the table; stats collected <hidden> ago)
      table: json_tab@json_tab_pkey
      spans: FULL SCAN
·
Diagram: https://cockroachdb.github.io/distsqlplan/decode.html#eJzElFFP2z4QwN__n8K6F0B_R4mdtpP8VKBB6wQtSyptE6uQ2xwsI40z2xFDqN99SkqhiUjVwgN-qOo79-ef7-w-gvmTgoDg--X58XBEDgfDaBJ9PT8iUXAenE6IJGfh-IL8Niq7tnJGvn0OwoAczkj_Z-F5PpKDKzY9OCLHo0E9ysvoOBwEITn5QSRQyFSMI7lAA-IKGFDgQMGHKYVcqzkao3SZeqwWDuO_IDwKSZYXtgxPKcyVRhCPYBObIgiYyFmKIcoYtesBhRitTNIKv_btr79c53f4ABROVVosMiOIpGQGFKJcljPHZR5MlxRUYV82NFbeIgi2YTgcgPCWdHfJsyS1qFG7ft1wFRfksM_rtRRCfInGo5OnmtbSfCPdqssbun6r7oul0jFqjOuKffY_TJevnGmkHJW7vfrqcWEF6bNWLb-h1atpsd1bzd7Xapd5jst37zbbx_O5252P6nanpst3Lyt_Z1m55-xcU76P5HNNux9V0-4-Dz5Ek6vMYE22bSevsZPDyveG8S2u3qdRhZ7jpVbzau1qOq5AVSBGY1dZtpoMs3XKWI1y8fx_tUliW0m8RmKbJL9J4ltJn_Zw8reSOu0k1iR13nq6TpPU3UrqtTvxJqn3VqdueR9uUnV_ncQgwHsazisf6wHlD-StKS9l9EvdV9jJQ15eqRuZGqRwIe9wgBb1IskSY5M5CKsLXC7_-xcAAP__soaMGg==

# Filter with a nested array. This index expression is not tight.
# This should not use a zigzag join due to distribution costs.
query T
EXPLAIN (DISTSQL)
SELECT a FROM json_tab WHERE b @> '[[1, 2]]' ORDER BY a
----
distribution: full
vectorized: true
·
• filter
│ estimated row count: 0
│ filter: b @> '[[1, 2]]'
│
└── • scan
      estimated row count: 33 (100% of the table; stats collected <hidden> ago)
      table: json_tab@json_tab_pkey
      spans: FULL SCAN
·
Diagram: https://cockroachdb.github.io/distsqlplan/decode.html#eJy0lF9vmzwUh-_fT2Gdm77TjMAmySRfZW2olqlNOoi0TR2qnHDasRLMbKOuqvLdJ8jSFhSipFV9EcV_ePzwOzYPYH5nICD4dnH2cTwh_4_G0Sz6cvaORMFZcDIjkpyG03Pyy6j8yso5-fopCAMyJ8Mfpef5SI4uLxklPI6PyDQcBSE5_k4kUMhVghO5RAPiEhhQ4EDBh5hCodUCjVG6mnqoF46TPyA8CmlelLYajikslEYQD2BTmyEImMl5hiHKBLXrAYUErUyzGr-RG27-XBW3eA8UTlRWLnMjiKRkDhSiQlY9x2UexCsKqrRPGxorbxAEe2Y4HoHwVnR_ydM0s6hRu37TcD0uyJBvCU4I8TmaTo47lXhLye9UejJROkGNSVNjyN5DvNriPVGOKtxBc_W0tIIMWaeW39IaNLTY_uVkryunyzzH5ftXlB3i-VjR3ltWtNdQ4vtHx18ZHfecvXPjh0g-5tZ_y9z6h1zOEE2hcoMNoa6dvNZODqvuDSY3uL5nRpV6gRdaLeq16-60BtUDCRq7nmXrzjjfTBmrUS4fvy3PSWwniTdI7DnJb5P4TtKHA5z8naReN4m1Sb2Xvl2vTervJA26nXibNHipU786D9eZurtKExDg_WvOlp9Ng-oBeWOqQxn9VHc1dnZfVEfqWmYGKZzLWxyhRb1M89TYdAHC6hJXq__-BgAA__-QcHPk

subtest array

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

statement ok
CREATE INVERTED INDEX foo_inv ON array_tab(b)

statement ok
INSERT INTO array_tab VALUES
  (1, '{}'),
  (2, '{1}'),
  (3, '{1, 2}'),
  (4, '{1, 3}'),
  (5, '{1, 2, 3, 4}')

statement ok
ANALYZE array_tab

statement ok
ALTER TABLE array_tab SPLIT AT VALUES (3), (3)

statement ok
ALTER TABLE array_tab EXPERIMENTAL_RELOCATE VALUES (ARRAY[1], 1), (ARRAY[2], 3), (ARRAY[3], 5)

query TTTI colnames
SELECT start_key, end_key, replicas, lease_holder
FROM [SHOW RANGES FROM INDEX array_tab@primary WITH DETAILS] ORDER BY lease_holder, start_key
----
start_key              end_key       replicas  lease_holder
<before:/Table/106/3>  …/3           {1}       1
…/3                    …/<IndexMax>  {3}       3

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

# This should use a zigzag join.
query T
EXPLAIN (DISTSQL)
SELECT a FROM array_tab@foo_inv WHERE b @> '{1, 2}' ORDER BY a
----
distribution: local
vectorized: true
·
• sort
│ estimated row count: 0
│ order: +a
│
└── • lookup join
    │ estimated row count: 0
    │ table: array_tab@array_tab_pkey
    │ equality: (a) = (a)
    │ equality cols are key
    │
    └── • zigzag join
          estimated row count: 0
          left table: array_tab@foo_inv
          left columns: (a, b_inverted_key)
          left fixed values: 1 column
          right table: array_tab@foo_inv
          right columns: (a, b_inverted_key)
          right fixed values: 1 column
·
Diagram: https://cockroachdb.github.io/distsqlplan/decode.html#eJyUkl9v0zAUxd_5FFf3ZSA8NU7f_FRYgyjq1pFU4m9VucltME3tYDuMUuW7oyRs_QOtNj9E8fXNOb9z4y26HwUKjD7ejl-NbuD5cJRMk_fjF5BE4-hqChLexJNrkNbKzdzLxWBpzFzpn_DhbRRHsIDB1yoI-gQXW84grC9gEg-jGF5_AokMtcnoRq7JofiCHGcMS2tScs7YprRtG0bZLxQBQ6XLyjflGcPUWEKxRa98QSjws8p_y_ydUZpsL0CGGXmpilY3URlBIP6FRIZXpqjW2gmQDBbIul7-uN5J5QUM-jirGZrK7-Cclzmh4HtpRkMUQc0eH6iJEpPMyPb4YZwd2sPbvFzRBhmOjVlVJXw3SoPRAgZ8H3vHzE8yh0fM_CnMibGebC885B3wlyft-kd24VPsYnKl0Y4O7E45BUdOl7yeMaQsp-6iOVPZlG6tSdvebjtphdpCRs53p7zbjPT9kfOW5PrhD-8r8bNK4WklfqwUnlXqn2OaMVwW5m6uMhQY_F2X_3ncL2w-kLlrhp18M3et7HRTNqNaysIRw2u5oiF5smullfMqReFtRXX97E8AAAD__yUEWWw=
