# LogicTest: 5node-dist

# The following tables form the interleaved hierarchy:
#   name:             primary key:                # rows:   'a' = id mod X :
#   parent1           (pid1)                      40        8
#     child1          (pid1, cid1)                150       66
#       grandchild1   (pid1, cid1, gcid1)         410       201
#     child2          (pid1, cid2, cid3)          15        7
#       grandchild2   (pid1, cid2, cid3, gcid2)   51        13
#   parent2           (pid2)                      5         2
# Additional rows in child1, child2, and grandchild1 with no corresponding
# parent row are also inserted.
#
# All IDs belonging to a table (pid1 --> parent1, cid1 --> child1, cid2,cid3
# --> child2, etc.) start from 1 up to (# rows).
# Foreign keys are modded by their ancestor's (# rows). For example, for child1
# row with cid1=500, we take ((cid1-1) % 200 + 1) = 100 as pid1.
# One exception is cid3, which is taken as cid2 % 15.
# There's a column 'a' that's modded by a factor.
#
# This allows us to test the following edge cases (in order of tests):
#   - one-to-many (parent1 - child1)
#   - one-to-one and one-to-none (parent1 - child2)
#   - parent-grandchild (parent1 - grandchild1)
#   - multiple interleaved columns (child2 - grandchild2)
#   - additional ancestor above (child2 - grandchild2)
#   - no interleaved relationship (parent1 - parent2, parent2 - child1)
#   - TODO(richardwu): sibling-sibling (child1 - child2)

#################
# Create tables #
#################

statement ok
CREATE TABLE parent1 (pid1 INT PRIMARY KEY, pa1 INT)

statement ok
CREATE TABLE parent2 (pid2 INT PRIMARY KEY, pa2 INT)

statement ok
CREATE TABLE child1 (
  pid1 INT,
  cid1 INT,
  ca1 INT,
  PRIMARY KEY(pid1, cid1)
)
INTERLEAVE IN PARENT parent1 (pid1)

statement ok
CREATE TABLE child2 (
  pid1 INT,
  cid2 INT,
  cid3 INT,
  ca2 INT,
  PRIMARY KEY(pid1, cid2, cid3)
)
INTERLEAVE IN PARENT parent1 (pid1)

statement ok
CREATE TABLE grandchild1 (
  pid1 INT,
  cid1 INT,
  gcid1 INT,
  gca1 INT,
  PRIMARY KEY(pid1, cid1, gcid1)
)
INTERLEAVE IN PARENT child1 (pid1, cid1)

# No foreign key since we are permitting the rows to overflow out of child2
# for pid1 > 15.
statement ok
CREATE TABLE grandchild2 (
  pid1 INT,
  cid2 INT,
  cid3 INT,
  gcid2 INT,
  gca2 INT,
  PRIMARY KEY(pid1, cid2, cid3, gcid2)
)
INTERLEAVE IN PARENT child2 (pid1, cid2, cid3)

####################
# Split our ranges #
####################

# Prevent the merge queue from immediately discarding our splits.
statement ok
SET CLUSTER SETTING kv.range_merge.queue_enabled = false;

# Split at parent1 key into five parts.
statement ok
ALTER TABLE parent1 SPLIT AT SELECT i FROM generate_series(8, 32, 8) AS g(i)

# Split at child1 keys in between parent1 parts (total 10 parts).
statement ok
ALTER TABLE child1 SPLIT AT SELECT pid1, pid1 + 40 FROM
generate_series(4, 36, 8) AS g(pid1)

# Split at grandchild2 keys in between the 10 parts (total 20 parts).
statement ok
ALTER TABLE grandchild2 SPLIT AT SELECT pid1, pid1 + 40, pid1, pid1 FROM
generate_series(2, 38, 4) AS g(pid1)

# Relocate the twenty parts to the five nodes.
statement ok
ALTER TABLE grandchild2 EXPERIMENTAL_RELOCATE
  SELECT ARRAY[((i-1)/2)::INT%5+1], i, i+20, i, i FROM generate_series(1, 39, 2) AS g(i)

# Verify data placement.
query TTTI colnames
SELECT start_key, end_key, replicas, lease_holder FROM [SHOW EXPERIMENTAL_RANGES FROM TABLE parent1]
----
start_key                   end_key                     replicas  lease_holder
NULL                        /2/#/56/1/42/2/#/58/1/2     {1}       1
/2/#/56/1/42/2/#/58/1/2     /4/#/55/1/44                {2}       2
/4/#/55/1/44                /6/#/56/1/46/6/#/58/1/6     {3}       3
/6/#/56/1/46/6/#/58/1/6     /8                          {4}       4
/8                          /10/#/56/1/50/10/#/58/1/10  {5}       5
/10/#/56/1/50/10/#/58/1/10  /12/#/55/1/52               {1}       1
/12/#/55/1/52               /14/#/56/1/54/14/#/58/1/14  {2}       2
/14/#/56/1/54/14/#/58/1/14  /16                         {3}       3
/16                         /18/#/56/1/58/18/#/58/1/18  {4}       4
/18/#/56/1/58/18/#/58/1/18  /20/#/55/1/60               {5}       5
/20/#/55/1/60               /22/#/56/1/62/22/#/58/1/22  {1}       1
/22/#/56/1/62/22/#/58/1/22  /24                         {2}       2
/24                         /26/#/56/1/66/26/#/58/1/26  {3}       3
/26/#/56/1/66/26/#/58/1/26  /28/#/55/1/68               {4}       4
/28/#/55/1/68               /30/#/56/1/70/30/#/58/1/30  {5}       5
/30/#/56/1/70/30/#/58/1/30  /32                         {1}       1
/32                         /34/#/56/1/74/34/#/58/1/34  {2}       2
/34/#/56/1/74/34/#/58/1/34  /36/#/55/1/76               {3}       3
/36/#/55/1/76               /38/#/56/1/78/38/#/58/1/38  {4}       4
/38/#/56/1/78/38/#/58/1/38  NULL                        {5}       5

query TTTI colnames
SELECT start_key, end_key, replicas, lease_holder FROM [SHOW EXPERIMENTAL_RANGES FROM TABLE child1]
----
start_key                   end_key                     replicas  lease_holder
NULL                        /2/#/56/1/42/2/#/58/1/2     {1}       1
/2/#/56/1/42/2/#/58/1/2     /4/#/55/1/44                {2}       2
/4/#/55/1/44                /6/#/56/1/46/6/#/58/1/6     {3}       3
/6/#/56/1/46/6/#/58/1/6     /8                          {4}       4
/8                          /10/#/56/1/50/10/#/58/1/10  {5}       5
/10/#/56/1/50/10/#/58/1/10  /12/#/55/1/52               {1}       1
/12/#/55/1/52               /14/#/56/1/54/14/#/58/1/14  {2}       2
/14/#/56/1/54/14/#/58/1/14  /16                         {3}       3
/16                         /18/#/56/1/58/18/#/58/1/18  {4}       4
/18/#/56/1/58/18/#/58/1/18  /20/#/55/1/60               {5}       5
/20/#/55/1/60               /22/#/56/1/62/22/#/58/1/22  {1}       1
/22/#/56/1/62/22/#/58/1/22  /24                         {2}       2
/24                         /26/#/56/1/66/26/#/58/1/26  {3}       3
/26/#/56/1/66/26/#/58/1/26  /28/#/55/1/68               {4}       4
/28/#/55/1/68               /30/#/56/1/70/30/#/58/1/30  {5}       5
/30/#/56/1/70/30/#/58/1/30  /32                         {1}       1
/32                         /34/#/56/1/74/34/#/58/1/34  {2}       2
/34/#/56/1/74/34/#/58/1/34  /36/#/55/1/76               {3}       3
/36/#/55/1/76               /38/#/56/1/78/38/#/58/1/38  {4}       4
/38/#/56/1/78/38/#/58/1/38  NULL                        {5}       5

query TTTI colnames
SELECT start_key, end_key, replicas, lease_holder FROM [SHOW EXPERIMENTAL_RANGES FROM TABLE grandchild1]
----
start_key                   end_key                     replicas  lease_holder
NULL                        /2/#/56/1/42/2/#/58/1/2     {1}       1
/2/#/56/1/42/2/#/58/1/2     /4/#/55/1/44                {2}       2
/4/#/55/1/44                /6/#/56/1/46/6/#/58/1/6     {3}       3
/6/#/56/1/46/6/#/58/1/6     /8                          {4}       4
/8                          /10/#/56/1/50/10/#/58/1/10  {5}       5
/10/#/56/1/50/10/#/58/1/10  /12/#/55/1/52               {1}       1
/12/#/55/1/52               /14/#/56/1/54/14/#/58/1/14  {2}       2
/14/#/56/1/54/14/#/58/1/14  /16                         {3}       3
/16                         /18/#/56/1/58/18/#/58/1/18  {4}       4
/18/#/56/1/58/18/#/58/1/18  /20/#/55/1/60               {5}       5
/20/#/55/1/60               /22/#/56/1/62/22/#/58/1/22  {1}       1
/22/#/56/1/62/22/#/58/1/22  /24                         {2}       2
/24                         /26/#/56/1/66/26/#/58/1/26  {3}       3
/26/#/56/1/66/26/#/58/1/26  /28/#/55/1/68               {4}       4
/28/#/55/1/68               /30/#/56/1/70/30/#/58/1/30  {5}       5
/30/#/56/1/70/30/#/58/1/30  /32                         {1}       1
/32                         /34/#/56/1/74/34/#/58/1/34  {2}       2
/34/#/56/1/74/34/#/58/1/34  /36/#/55/1/76               {3}       3
/36/#/55/1/76               /38/#/56/1/78/38/#/58/1/38  {4}       4
/38/#/56/1/78/38/#/58/1/38  NULL                        {5}       5

statement ok
SET CLUSTER SETTING sql.distsql.interleaved_joins.enabled = true;

#####################
# Interleaved joins #
#####################

# Select over two ranges for parent/child with split at children key.
query T
SELECT url FROM [EXPLAIN (DISTSQL) SELECT * FROM parent1 JOIN child1 USING(pid1) WHERE pid1 >= 3 AND pid1 <= 5]
----
https://cockroachdb.github.io/distsqlplan/decode.html#eJzMkkFr6zAQhO_vVzzm9B7dEstpL4aCryklKbkWH4S1SQSOZFZyaSn570VWoU5oQ9tTb5ZmZscf2hc4b3ip9xxQPUCBUIIwR0PoxbccgpckZePCPKEqCNb1Q8zX0caOUWFwXgwLGxAMR227pDeHhtB6YVTv1qW_9P2sPDES_BDfxjaEEPWWUZUHmlSrSfUHgxcusnSsH3nN2rDceutYZsVRE-54E5Hw7F7Lc91rYRcT-dpud1Ol3dnOJCHPAaHjTfxXq4v_N5K84ycIqyFWf2tFdUn1FdXX-IxGHdGUP6JRv5SmOE-z5tB7F_hLr16ktWGz5bxjwQ_S8r34dqzJx9WYGy8Mh5jVeT4sXJbSD07D6my4OAqr03D5rXBz-PMaAAD__y7yGHk=

# Swap parent1 and child1 tables.
query T
SELECT url FROM [EXPLAIN (DISTSQL) SELECT * FROM child1 JOIN parent1 USING(pid1) WHERE pid1 >= 3 AND pid1 <= 5]
----
https://cockroachdb.github.io/distsqlplan/decode.html#eJzMklFL-zAUxd__n-LPeVK8sqbDl4LQ14lsslfpQ2jutkCXlJtUFNl3lzSC3dChPvnW5JxzT3_kvsJ5w0u954DqEQqEEoQ5GkIvvuUQvCQpGxfmGVVBsK4fYr6ONnaMCoPzYljYgGA4atslvTk0hNYLo_qwLv2172fliZHgh_g-tiGEqLeMqjzQpFpNqj8ZvHCRpWP9xGvWhuXOW8cyK46acM-biIRn91pe6nZnO5PA13a7mwq9FnYxKXkOCB1v4kWtri5vJZnHTxBWQ6z-14rqkuo51Tf4ikYd0ZS_olF_lKY4T7Pm0HsX-FuvXqS1YbPlvGPBD9Lyg_h2rMnH1ZgbLwyHmNV5PixcltIPTsPqbLg4CqvTcPmjcHP49xYAAP__IiwYdw==

# Select over two ranges for parent/child with split at grandchild key.
# Also, rows with pid1 <= 30 should have 4 rows whereas pid1 > 30 should
# have 3 rows.
query T
SELECT url FROM [EXPLAIN (DISTSQL) SELECT * FROM parent1 JOIN child1 ON parent1.pid1 = child1.pid1 WHERE parent1.pid1 >= 29 AND parent1.pid1 <= 31 ORDER BY parent1.pid1]
----
https://cockroachdb.github.io/distsqlplan/decode.html#eJzUUcFq6zAQvL-veOypJSqxnOZiKOiaUpKSa_FBWBtH4EhmtS4twf9eJB0Sl6S0vfVm7czs7IyP4LzBtT5ggOoFJAhYQi2gJ99gCJ7iOJNW5g2qQoB1_cBxXAtoPCFUR2DLHUIFK8dIHepX3KI2SI_eOqR5XGuQte2SyxPuGKKHPWh6V70mdBw5W9vuz5FmbzsTgbwHBHS44xslZ7cPFLnpEwRsBq7-KylUKdRCqHuhllCPAvzAp2MD6xahkqO4EuiUw5NBQjM9W8kZ1OOF1Gt_5_t5OWFfcy8n7vJXdRZ_o84LgbYYeu8CfquqInaNpsX8b4IfqMFn8k2yyc9N0qWBwcAZlfmxcglKB56L5ZfixURcfBaXP3Kux38fAQAA__8x_hkU

# Parent-child where pid1 <= 15 have one joined row and pid1 > 15 have no
# joined rows (since child2 only has 15 rows up to pid1 = 15).
# Note this spans all 5 nodes, which makes sense since we want to read all
# parent rows even if child rows are non-existent (so we can support OUTER
# joins).
# TODO(richardwu): we can remove nodes reading from just one table for INNER
# joins or LEFT/RIGHT joins.
query T
SELECT url FROM [EXPLAIN (DISTSQL) SELECT * FROM parent1 JOIN child2 USING(pid1) WHERE pid1 >= 12 ORDER BY pid1]
----
https://cockroachdb.github.io/distsqlplan/decode.html#eJzMlD1rwzAQhvf-ivJOLbkSyx8ZDAWtKSUpWYsHY10Sg2MZSS4twf-92B4Sl6YfzuLN0t3j9x6BdESpFa_SA1vErxAg-CAEIIQgREgIldEZW6tN29IDS_WO2CPkZVW7djshZNow4iNc7gpGjGXp2BScvvGGU8XmSeclm7kHgmKX5kWX-MxbhzYjP6TmQ1ap4dK1Y2zy3f68ku3zQrWz9f8BoeCtu5Nidv9o2t7uE4R17eJbKUj6JEOSEckFkoaga3ca1rp0x4hFQxeETh7aKDashmNLMUPSfGO90g-6mkeD7kvp_iBdjDpOMd3j9EcJ-dMVCkYJBdMVCkcJhdMV-uVJ2rCtdGn5T7fTa683qx33z4HVtcn4xeisi-mX647rNhRb11dFv1iWXakb8BwWP8KLAex9hf1rkoNr4PAaOPoXnDQ3nwEAAP__9wcgdA==

# These rows are all on the same node 1 (gateway).
query T
SELECT url FROM [EXPLAIN (DISTSQL) SELECT * FROM parent1 JOIN child2 USING(pid1) WHERE pid1 IN (1, 11, 21, 31) ORDER BY pid1]
----
https://cockroachdb.github.io/distsqlplan/decode.html#eJyMUE1LxDAUvPsrZE6KD9ws6iEg5LoirvQqPYTmbTfQTcrLqyhL_7u0OagHwVvmIzOZnJFy4Bd_4gL7BoOWMEruuJQsC1UNu_ABuyHENE660C2hy8KwZ2jUgWGxS8oysH_nhn1gecoxsdxuQAisPg5rwzMfFEtHPHn5dKMXTmpAaGJ__Kl0xziELQg1B4SBD3rlzM31oyze9QjCflJ76Qy5Lbk7cvfkHtDOhDzp92OL-p5hzUz_H9RwGXMq_GvAX8mbuSVw6Ll-WsmTdPwquVtrKtyv91YicNGqmgp2qUpzO198BQAA___Vk4P-

# Parent-grandchild.
query T
SELECT url FROM [EXPLAIN (DISTSQL)
  SELECT * FROM parent1 JOIN grandchild2 USING(pid1) WHERE
    pid1 >= 11 AND pid1 <= 13
    OR pid1 >= 19 AND pid1 <= 21
    OR pid1 >= 31 AND pid1 <= 33
]
----
https://cockroachdb.github.io/distsqlplan/decode.html#eJzslE9r3DAQxe_9FGJOu3RKLDnpH8GCCqXgUrzF9Nb6IKyJI3AkI8mlJfi7F9sk8Yb0X3pIDnuz9ObHG_xGcwXOGyr1JUWQX4ADggCEM6gR-uAbitGHSVoKC_MdZIZgXT-k6bpGaHwgkFeQbOoIJBQuUehIf6OKtKHwwVtH4SQDBENJ2252-kjnCSYPe6nDD9XrQC5N9pPA3tsuUZBss1GcfR2yLG92jOdSyqL8_HrL9tVKoh3jb26kt-U7tqYEv5a2C7fC8hsNECrbXqxbaoN2prmwnRHX6qP0tfw_QOjoPG0Uf77dhamZ-RMQ9kOSTHFUAtUpqjNUL1G9gnpE8EO6zSkm3RJIPuIvsryNcHA-GApkDjKrx3vSLv0L35_kdwrvtxYH1vxBY8SPY_QEx0g8KEtxzPIJZvmH9V5R7L2L9FcvPptWBpmWlv0S_RAa-hR8M9ssx_3MzReGYlpUvhwKN0tzg2uY_xY-PYCzu7D4H-f8n-B6fPYzAAD__4MtKf0=

query T
SELECT url FROM [EXPLAIN (DISTSQL)
  SELECT * FROM grandchild2 JOIN parent1 USING(pid1) WHERE
    pid1 >= 11 AND pid1 <= 13
    OR pid1 >= 19 AND pid1 <= 21
    OR pid1 >= 31 AND pid1 <= 33
]
----
https://cockroachdb.github.io/distsqlplan/decode.html#eJzslE-L2zAQxe_9FGJOCZ2ylr1LW0FAhVJwKU4xvbU-CGvWK_BKRpJLy-LvXmyzGyek_9JDc8jN0psfb_AbzQNYp6lQ9xRAfAYOCCkg3ECF0HlXUwjOj9JcmOtvIBIEY7s-jtcVQu08gXiAaGJLICC3kXxL6iuVpDT5985Y8lcJIGiKyrST0we6jTB6mHvlv8vGK6vrO9Pq0X4U2TvTRvKCrVaSsy99kmT1hvFMCJEXn16t2bZcSLRh_PWT9KZ4y5ZUyh-l9cwtsOxJA4TSNHfLtjrlyUb-qPyXnub_Bwgt3caV5M_XGz82M30CwraPgkmOMkWZobxGeYPyJVQDguvjLqcQVUMg-IA_yXIXYW-d1-RJ72VWDUfSLtwL111lB4XHrdM9a37SGPHLGJ3hGKUnZZlesjzDLH-z3ksKnbOB_ujFJ-PKIN3QvF-C631NH72rJ5v5uJ246UJTiLPK50NuJ2lqcAnzX8LXe3ByCKf_4pz9FVwNz34EAAD__zwZKfQ=

query TTT
EXPLAIN SELECT * FROM grandchild2 JOIN parent1 USING(pid1) WHERE
  pid1 >= 11 AND pid1 <= 13
  OR pid1 >= 19 AND pid1 <= 21
  OR pid1 >= 31 AND pid1 <= 33
----
render           ·               ·
 └── merge-join  ·               ·
      │          type            inner
      │          equality        (pid1) = (pid1)
      │          mergeJoinOrder  +"(pid1=pid1)"
      ├── scan   ·               ·
      │          table           grandchild2@primary
      │          spans           /11/#/56/1-/13/#/56/2 /19/#/56/1-/21/#/56/2 /31/#/56/1-/33/#/56/2
      │          filter          ((pid1 <= 13) OR ((pid1 >= 19) AND (pid1 <= 21))) OR (pid1 >= 31)
      └── scan   ·               ·
·                table           parent1@primary
·                spans           /11-/13/# /19-/21/# /31-/33/#
·                parallel        ·
·                filter          ((pid1 <= 13) OR ((pid1 >= 19) AND (pid1 <= 21))) OR (pid1 >= 31)

# Join on multiple interleaved columns with an overarching ancestor (parent1).
# Note there are 5 nodes because the filter cid2 >= 12 AND cid2 <= 14
# creates a giant parent span which requires reading from all rows.
query T
SELECT url FROM [EXPLAIN (DISTSQL)
  SELECT * FROM child2 JOIN grandchild2 ON
    child2.pid1=grandchild2.pid1
    AND child2.cid2=grandchild2.cid2
    AND child2.cid3=grandchild2.cid3
  WHERE
    child2.pid1 >= 5 AND child2.pid1 <= 7
    OR child2.cid2 >= 12 AND child2.cid2 <= 14
    OR gcid2 >= 49 AND gcid2 <= 51
]
----
https://cockroachdb.github.io/distsqlplan/decode.html#eJzslU2L2zAQhu_9FWJODpmylizvhyCgQimklKSE3lofjDWbNXitIMmlZcl_L7ZZ7zqkpU0gvfhovXp4JT-CeYLaGlrlj-RBfQUOCAIQEkCQgJBChrBztiDvrWu39MDS_AAVI5T1rgntcoZQWEegniCUoSJQsKwDuYry77Sh3JD7aMua3FUMCIZCXlZd4ye6D9B2lI-5-6mLh7Iy7Qk25fbhdbB1eW3GKftQVoGcYlEUac6-NXGc0IKlSqnl6svtjL1bvWdDUizYzXMyY-sNiyItBoiLA0oMFJcD9szJgZN3B5wcuJQPHCD0tweEiu5DpPkctZijTuazhWsvM1oChHUTFNMctUCdoJaoU9TXqG9Q36K-g2yPYJvw8vt9yLcEiu_xN4pezDS1dYYcmZGKbH9E4sq-tbur9GDj8WoxquYnvQ4-vY7LvQ5xkiIxKbqcouQkRcmk6HKK5EmK5KTo_4zBI4o25He29vRXUy5uxySZLfUz1dvGFfTZ2aKr6T_XHdctGPKhT3n_say7qDvga5j_Eb4ewfEhLM5pTs6B5Tlw-k9wtn_zKwAA__9OgRn6

query TTT
EXPLAIN
  SELECT * FROM child2 JOIN grandchild2 ON
    child2.pid1=grandchild2.pid1
    AND child2.cid2=grandchild2.cid2
    AND child2.cid3=grandchild2.cid3
  WHERE
    child2.pid1 >= 5 AND child2.pid1 <= 7
    OR child2.cid2 >= 12 AND child2.cid2 <= 14
    OR gcid2 >= 49 AND gcid2 <= 51
----
merge-join  ·               ·
 │          type            inner
 │          equality        (pid1, cid2, cid3) = (pid1, cid2, cid3)
 │          mergeJoinOrder  +"(pid1=pid1)",+"(cid2=cid2)",+"(cid3=cid3)"
 ├── scan   ·               ·
 │          table           child2@primary
 │          spans           ALL
 └── scan   ·               ·
·           table           grandchild2@primary
·           spans           ALL
·           filter          (((pid1 >= 5) AND (pid1 <= 7)) OR ((cid2 >= 12) AND (cid2 <= 14))) OR ((gcid2 >= 49) AND (gcid2 <= 51))

# Aggregation over parent and child keys.
query T
SELECT url FROM [EXPLAIN (DISTSQL)
  SELECT sum(parent1.pid1), sum(child1.cid1) FROM parent1 JOIN child1 USING(pid1) WHERE
    pid1 >= 10 AND pid1 <= 39
]
----
https://cockroachdb.github.io/distsqlplan/decode.html#eJzUlVGrmzAUx9_3KS7n6V4WuEZtbysM3GPHto6OPQ0fgjm1gk0kiWOj-N1HlLVa2jisL74lOefv75z_CeYEQnL8yo6oIfoJFAj4QCAAAiEQWEBCoFQyRa2lsimtYMN_Q-QRyEVZGXucEEilQohOYHJTIESwEQZVgewX7pBxVJ9kLlC9WgRHw_KiIX7GvQHLyI9M_YlLplAYm2MDT9vKRE-x3e7y7NBNTA95wc-Bf4kkttW3JCBQ4N48x_T9ywdls5olEDgnB5DUBGRlLl1owzKEiNbk_zv9mGUKM2akel32u_v-48tzTC2zWfkvd4H-XeCFUwmpOCrkPUhSu0ui3tiagl5NdNS4_RmOe6DTjrdv04zbH2VtMENrBzrtWLuaxtpglLXhDK0d6LRj7Xoaa8NR1noztHag0461i-n__zeAO9SlFBqv3oHbX_bs-4A8w_Yx0bJSKX5TMm0w7Xbb6JoDjtq0UdpuNqIN2QK7YuoU-z0xvRb7bvIAOnCqQ7c4fKTuhVO8dJOXj5DfnOKVm7x6hLx2z8obuCbuS3bNTup3fwMAAP__hy1jzg==

###############
# Outer joins #
###############

# The schema/values for each table are as follows:
# Table:        pkey:                     pkey values (same):   values:
# outer_p1      (pid1)                    {1, 2, 3, ... 20}     100 + pkey
# outer_c1      (pid1, cid1, cid2)        {2, 4, 6, ... 28}     200 + pkey
# outer_gc1     (pid1, cid1, cid2, gcid1) {4, 8, 12, ... 36}    300 + pkey

# Split between 4 nodes based on pkey value (p):
# node 1:       p - 1 mod 20 ∈ [1...5)
# node 2:       p - 1 mod 20 ∈ [5...10)
# node 3:       p - 1 mod 20 ∈ [10...15)
# node 4:       p - 1 mod 20 ∈ [15...20)

statement ok
CREATE TABLE outer_p1 (
  pid1 INT PRIMARY KEY,
  pa1 INT
)

statement ok
CREATE TABLE outer_c1 (
  pid1 INT,
  cid1 INT,
  cid2 INT,
  ca1 INT,
  PRIMARY KEY (pid1, cid1, cid2)
) INTERLEAVE IN PARENT outer_p1 (pid1)

statement ok
CREATE TABLE outer_gc1 (
  pid1 INT,
  cid1 INT,
  cid2 INT,
  gcid1 INT,
  gca1 INT,
  PRIMARY KEY (pid1, cid1, cid2, gcid1)
) INTERLEAVE IN PARENT outer_c1 (pid1, cid1, cid2)

statement ok
ALTER TABLE outer_p1 SPLIT AT
  SELECT i FROM generate_series(0, 40, 5) AS g(i)

statement ok
ALTER TABLE outer_p1 EXPERIMENTAL_RELOCATE
  SELECT ARRAY[(((i-3)/5)%4)::INT + 1], i FROM generate_series(3, 40, 5) AS g(i)

query TTTI colnames
SELECT start_key, end_key, replicas, lease_holder FROM [SHOW EXPERIMENTAL_RANGES FROM TABLE outer_p1]
----
start_key  end_key  replicas  lease_holder
NULL       /0       {5}       5
/0         /5       {1}       1
/5         /10      {2}       2
/10        /15      {3}       3
/15        /20      {4}       4
/20        /25      {1}       1
/25        /30      {2}       2
/30        /35      {3}       3
/35        /40      {4}       4
/40        NULL     {5}       5

### Begin OUTER queries

query T
SELECT url FROM [EXPLAIN (DISTSQL) SELECT * FROM outer_p1 FULL OUTER JOIN outer_c1 USING (pid1)]
----
https://cockroachdb.github.io/distsqlplan/decode.html#eJzclE2L2zAQhu_9FWJOu3TK-nMPhoIuDTgYp5jkVEwx1iQ1OJKR5NIQ_N-L7EOaNP1Y5-abpdEzr585zBmkEpRXRzKQfAEfEAJACAEhAoQYSoROq5qMUdo9mYBU_IDEQ2hk11t3XSLUShMkZ7CNbQkSSKUl3VL1nQqqBOm1aiTpFxchyFZNOyZmtLfgMppjpU9c9Zb01849KprDt99LtStNrQBhe-ooYatdlrHNbvupYOtNmgNCS3v7xP33zx-16zJ-upYkBemEpat8l2VP3EcePiPjATIeIeMxMv4K5YCgensxM7Y6ECT-gH-wv0j3UmlBmsSVZTncmU-uPqjuJb55eD86uIr2Zw0-WMjgg1n24ULsw1n20ULso1n23kLs_7FwCzKdkob-a6N4biWRONC0v4zqdU2ftarHmOm4GbnxQpCxU9WfDqkcS-MP_gr7f4Vfr2DvFg4eSQ4fgaNH4PhNcDm8-xkAAP__5oReVw==

query T
SELECT url FROM [EXPLAIN (DISTSQL) SELECT * FROM outer_gc1 FULL OUTER JOIN outer_c1 USING (pid1, cid1, cid2)]
----
https://cockroachdb.github.io/distsqlplan/decode.html#eJzklU2LnEAQhu_5FVKnHabC-rlJhEBfsuAiTpCdU5Agdq0R3G7pbkOWwf8eWiEzTiYf6xw9Vlc9_crTUB5ASE5Z-Uwa4i_gAYIPCAEghIAQQYHQKVmR1lLZkQlI-A-IXYRGdL2xxwVCJRVBfADTmJYghkQYUi2V3ymnkpN6kI0gdWsjOJmyacfElJ4M2IzmuVQvTPaG1Ne6slN5U3_7vTe2prsA4fGlo9i536eps9s_fsqdh12SAUJLT-aGeVtk_hZZsN18VPa22ZGNIMFJxU5yn-3T9IZ5yO42-Kv0kb07KQNk7zfosBAdFqHDPkAxIMjeHCVoU9YEsTfgH0Qd_fRCKk6K-ExIMVxQmcm3sruNzgYvR_uzaG_RG_nreyN_kahgfaKCRaLC9YkKF4ly1yfqH_-RnHQnhab_2n6uXZ_Ea5p2rZa9quizktUYM5W7kRsPOGkzdb2pSMTYGj_wFPb-Ct_NYPcc9q9JDq6Bw2vg6FVwMbz5GQAA__8alY8h

query T
SELECT url FROM [EXPLAIN (DISTSQL) SELECT * FROM outer_c1 LEFT OUTER JOIN outer_p1 USING (pid1) WHERE pid1 >= 0 AND pid1 < 40]
----
https://cockroachdb.github.io/distsqlplan/decode.html#eJzUlE-Lo0AQxe_7KeSddtlaYqu7B2HBSwYMIQ6SOQ0yiF3JCMaW7naYEPzug3rIJJP5l5xys_v1q1e_gnKHWkle5Bs2CO8hQPBA8EEIkBEarQo2RuleHh_H8hmhSyjrprX9dUYolGaEO9jSVowQcW1ZV5w_ccq5ZD1TZc164oIg2eZlNaTNeWXRZ5SbXG8j1VrWD0XfQ1quH99KTS-NpUBYbhsOnfn0Zukkd8tp6sySeAFCxSv7MxK_f_3XfZXhE4SktaETCYo8inyKAor-IesIqrV7DmPzNSMUHb3Dukdsa6Ula5YHTFl3YhoL9Uc1k-Do4elo7yBanDVmcZVj9s5i9a6S1T-L1b9K1k9-FSmbRtWGv7Qdbr9eLNc87qJRrS74VqtiiBmPyeAbLiQbO6piPMT1IA0NvjaLD81_D8zusdm7JNm_xBx8y5x1P14CAAD___ca6HA=

query T
SELECT url FROM [EXPLAIN (DISTSQL) SELECT * FROM outer_p1 RIGHT OUTER JOIN outer_gc1 USING (pid1) WHERE pid1 >= 1 AND pid1 <= 20]
----
https://cockroachdb.github.io/distsqlplan/decode.html#eJzUlE9r20AQxe_9FOKdWjrF-ucWBIW9lFamWEW4pyCC0I4VgawVu6sQY_Tdg6SDY8f5Z5980-7bN29-A6MdGiV5mW_YILqBB4IPQgBCiIzQalWwMUoP8vQ4lg-IXELVtJ0drjNCoTQj2sFWtmZEiBvLuub8nlPOJeuFqhrWMxcEyTav6jHtL68thoxqk-utUJ1lfdsOPaRVefdcKotBm2qBsNq2HDlp_PvPykn-r36lziKJlyDUvLafhff1y0891Bk_QUg6GzkiIOGTCEnMSXwn8QNZT1Cd3cMYm5eMyOvpBeA9Z9coLVmzPADL-hMjWapvqp2FRw9PR_sH0d5Zs_aud9b-WcD-9QIHZwEH1wv8xu8jZdOqxvC7lsUdto1lydNqGtXpgv9pVYwx0zEZfeOFZGMn1ZsOcTNKY4NPzd6r5vmB2T02-5ckB5eYww-Zs_7TYwAAAP__Vjbt9A==

########################
# Non-interleaved joins #
########################

# Join on siblings uses merge joiner.
# TODO(richardwu): Update this once sibling joins are implemented.
query T
SELECT url FROM [EXPLAIN (DISTSQL) SELECT * FROM child1 JOIN child2 USING(pid1)]
----
https://cockroachdb.github.io/distsqlplan/decode.html#eJy8ll9vmzwUxu_fTxGd92ZTjYzNnyZIk7jtpLVTt7uJCxq8BCnFyBBpVZXvPhG6tSXgY8-CO5Lwy_Hj87t4nqGShbjNH0UDyQ9gQIADgQAIhEAggoxAreRWNI1U3Ss9cFP8gsQnUFb1se2-zghspRKQPENbtgcBCXzPHw7iXuSFUNQHAoVo8_JwHlOr8jFXT-l2Xx6Kbua3Oq-aZOVRTv-nUUwZDXn_vKaM8lVeFatgJdu9UA1kJwLy2L5Mfh348LTa583-_aiUQXbKCDRtvhOQsBP5twSRJgFfMgGfTPD6P1IVQoli-D9X3WCjt0Yu44tQO_FZlpVQlA32eRA_2w8pu_r4SZW7ff8IBO6ObbJKGUk5SQOSRiSNSXo9SP-aLDBIdqzGTj164FvpyZqyaPDm-Ozw3Wxm7gUzM3tCC4-G3XPUfR_OZblFmtjM8mXT8Mk0CxrP5jeem--JG1r3Zh8ejf8uLe6fu6XFc1lnkeba0LpF0_DJNAtax-e3LjDfU2Bo3fhqPLqeyzWLDGtD1xbIwCczLGhYML9hofl2QkPD1h5l_p8NRf7Lh25FzJ9LMosYG0PJlonBJ2Ms6Fm4bGMcOc69aGpZNcKoD_pdIFHsRH9NjTyqrfiq5PY8pv94d-bOjaQQTdv_yvsPN1X_U3dAczh2gTcuMHM6N4v0NLO4Mm4Hxy7wxgVmTuceXNkFzYe0_5YO9PcdaGH2_s78IR26CK6HEcH1MCK4HsYER2hE8MhFcD2MCK6HEcH1MCY4QiOCxy6CX7soqocRRfUwoqgexhRFaETRtYuiehhRVA8jiuphTFGERhTduCjKnHoCQiOSIjRiKUJjmmI41hXcyoJbW3CrC459wa0wMKfGwC4qg5WtehqzVU9jtupp1FYEx2y1KUuXO7NpS7Y0ZqtVX7LGMVsvyoPW1uz03-8AAAD__6i7nUQ=

# Join on non-interleaved tables (with key) uses merge joiner.
query T
SELECT url FROM [EXPLAIN (DISTSQL) SELECT * FROM parent1 JOIN parent2 ON pid1=pid2]
----
https://cockroachdb.github.io/distsqlplan/decode.html#eJy8lV9r2zAUxd_3Kczdy0ZlZMl_6hoGfu1g7ej2NvzgxneJIbWM7MBKyXcfjrslMYmugnDepFg_XZ1zLrlv0KgKH8oX7CD7BQIYSGAQAoMIGMRQMGi1WmDXKT0cGYH76g9kAYO6aTf98HPBYKE0QvYGfd2vETL4WT6v8QnLCjUPgEGFfVmvd2VaXb-U-jVvS41NPxT90ZZNl3k-l_wjjxMueCTHdcoFl17ZVF7oqX6FuoNiy0Bt-vfS-4rPr96q7FbHtXIBxbZg0PXlEiETW3ZGwv4epSvUWE3vuRkK709tmlPndrWmVnxDvcSvqm5Q8-T42jX-7j_l4ubzF10vV-MSGDxu-szLBcsly0OWRxPNez2hhZ4LXvqgfNVyISYnT9eOjmoL-3YQlu1wpht8Hg3rePg9mqs1xPVb43bO1pD28UjbeA5i8HnyP6tkXA9ZJXPFI68fTzpnPKF9PKFtPKcT8Xk6Vyjh9UO5mzOUyD6UyDaU1Oci-BdMHLxvhmREMFcuF-iITTrkwaR2ep48-7wrtY0IrjWGTzzkCbtWNR1aDdlgkILVEkd3OrXRC_yu1WJXZtw-7rjdzKqw68ev75v7Zvw0PNAejlzgxAVOXWBBiBZTOjikpRmWRlgc08GUDl3CMsNEWGaYCMsME2ERmgnRkUtYsYvdZpiw2wwTdpthwm5CMyE6cbH71sVuM0zYbYYJu80wYTehmRCduth952K3GSbsNsOE3WaYsJvQTP3zXzIs5YV05EQnTnTqRAtK-GUTs9h--BsAAP__Ppb2Og==

# Join on non-interleaved column uses hash joiner.
query T
SELECT url FROM [EXPLAIN (DISTSQL) SELECT * FROM parent1 JOIN child1 ON pa1 = ca1]
----
https://cockroachdb.github.io/distsqlplan/decode.html#eJy8lr1u2zwUhvfvKozzLQlAgyL1E1tAAY1Nh6RIuxUaFIuNBTiiQNFAg8D3XshK69hWeMgS9CbZfnz48jzD-wqtrMVd9Sx6yH8AAwIcCMRAIAECKZQEOiVXou-lGn4yArf1L8gjAk3bbfXwcUlgJZWA_BV0ozcCcvhePW7Eg6hqoWgEBGqhq2azH9Op5rlSL0VXKdHqYei3rmr7fDannP5P04wymvDxeUEZ5bOqrWfxTOq1UD2UOwJyq99GHyY-vszWVb8-nlVwKHclgV5XTwJytiP_FiGdjrBaN5s6cIL4KAH_MMHhf7atVLVQoj76p3IgsZ9MXMPnql9_kU0rFGUnm9yIn_qq4NefVPO01ldFfA0E7rc6nxWMFJwUMSkSUqQniQ9pYo80E0e9k3PZUZae5p6cnRzNZvYuMEudP3BhTpPhOR0-T0Kp7RAns1M7dBqT5uzCmrOgmnP73XBb1d4tYU6zv5vKxudhU1ko1Rzi3FiqFjiNSTV-YdV4UNVi-93EtqpN72NOF6EEcwixsBQsSAaTVvGFtYqDapXYbySx1Woxpyz6s5Y0ensZ9sKiUGY55FhamhUqhkmu5MJyJRdrgRMHeRB9J9teWHW8aIgi6icxXk0vt2olviq52o8ZX-_33L5k1KLX47d8fLltx6-GA9rDmQ-89IGZ17lZaqaZw5VxNzjzgZc-MPM698mVndH8lI7e07H5vmMjzI7vLDqlEx_BzTAiuBlGBDfDmOAIjQie-ghuhhHBzTAiuBnGBEdoRPDMR_AbH0XNMKKoGUYUNcOYogiNKLrwUdQMI4qaYURRM4wpitCIoksfRZlXT0BoRFKERixFaExTDMe6gl9Z8GsLfnXBsy_4FQbm1RjYWWVwstVMY7aaacxWM43aiuCYrS5l6XxnLm3JlcZsdepLzjhm61l5MNpa7v77HQAA___JMpkW

# Prefix join on interleaved columns uses merge joiner.
query T
SELECT url FROM [EXPLAIN (DISTSQL) SELECT * FROM child2 JOIN grandchild2 USING(pid1, cid2)]
----
https://cockroachdb.github.io/distsqlplan/decode.html#eJzEll9r2zwUh-_fTxHOe7NRBVnynyaGgW87WDu63Y1cuLGWGFLLyA6slHz34bhbGsfWkSZi31mJHx_9dB7BeYVCZuI-fRYVxD-AAQEOBHwgEACBEFYESiXXoqqkal5pgbvsF8Qegbwo93Xz84rAWioB8SvUeb0TEMP39GknHkWaCUU9IJCJOs13xzKlyp9T9ZKst_kua-p9K9Oiimdzyun_NIwoowFvnxeUUT5Li2zmz2S9FaqC1YGA3NdvlU8Fn15m27TanpdKGEk4rA4rAlWdbgTE7ED-LUTYH2Kj0iKbJAkfTHL6lFSZUCLrfuqGJPymqW_8Zs_hfBFqIz7LvBCKsk6Ld-Jn_eGN_vhJ5ZvtaQkEHvZ1PDsmIolPkoAktyRZkGTZOZNTWN8g7L7oC9G793s5lyVlYefN_trBWW1mrgwz835AljkNmuew-T244h2wCBRZ3IHRU_HBVBPcBzbqfeDmLeSGTr7r0pxGf1sZtc9NK6MrOmkR6NbGybFT8cFUEzjJR3XSN2-hb-hkf8PmdHFFEy1iLGxMHCcLH8wygX_-qP4F5o0LDP1bzCnz_vQt9N4WTeOYd0UFLZIsbRQcLQ4fjDOBhcFkk2rPzh5FVcqiEkZzqNdkE9lGtCdXyb1ai69Kro9l2uXDkTuOP5mo6vZf3i7uivavZoPmcOQCL11g5rRvFuppZnFk3A6OXOClC8yc9t05sguad2nvPe3rz9vXwuz8zLwuHbgIrocRwfUwIrgexgRHaETw0EVwPYwIrocRwfUwJjhCI4JHLoLfuiiqhxFF9TCiqB7GFEVoRNGFi6J6GFFUDyOK6mFMUYRGFF26KMqc5gSERiRFaMRShMY0xXBsVnAbFtymBbdxwXFecBsYmNPEwC5GBitb9TRmq57GbNXTqK0IjtlqMyxd9sxmWrKlMVut5iVrHLP1YnjQ2ro6_Pc7AAD__9fkwKM=

# Subset join on interleaved columns uses hash joiner.
query T
SELECT url FROM [EXPLAIN (DISTSQL) SELECT * FROM child2 JOIN grandchild2 USING(pid1, cid3)]
----
https://cockroachdb.github.io/distsqlplan/decode.html#eJzElk9vmzAYxu_7FNG7yyY5MjZ_miBN4rju0E7dbhMHGrwEKcXIJtKqKt99Atq1IeAXzwq94YQf9uP3d3ieoJS5uMkehIb4FzAgwIGADwQCIBBCSqBSciO0lqp5pQOu8z8QewSKsjrUzc8pgY1UAuInqIt6LyCGn9n9XtyJLBeKekAgF3VW7NttKlU8ZOox2eyKfd7s96PKSh0vlpTTjzSMKKMB755XlFG-yMp84S9kvRNKQ3okIA_1886vG94_LnaZ3p1ulTCS-JAeUwK6zrYCYnYk_xciHA6xVVmZv0sSPprk9VOHUqpcKJGffCxtSOyVgev4mundN1mUQlHWm-le_K4_tWf8_EUV293LAgjcHup40a5IwkkSkCQiyYok694FvCbzHZINHPtGLmVFWdi_g8G9g5O92XQ_2DTJR8xY0qB5DpvfgwsKbxEoshB-9lR8NNUc8rPZ5OfT58UnCvhmJEsa_Ztb1D03c4suKKBFoCsbAedOxUdTzSEgn01Af_q8_IkCDk9nSVcX1M4ixspGu3my8NEsc8jmzyZbMH1KwUTZVkvKvJchhd7zopkS8y7om0WStY1vs8Xho3HmUC54l3Y5cKg7oStZajGpO3pNLJFvRXdNWh7URnxXctNu0y1vW66tLLnQdfcv7xbXZfdXc8DpcOQCr11g5nRuFpppZnFl3A6OXOC1C8yczt27sjOa92nvLe2b79s3wuz0zrw-HbgIboYRwc0wIrgZxgRHaETw0EVwM4wIboYRwc0wJjhCI4JHLoJfuShqhhFFzTCiqBnGFEVoRNGVi6JmGFHUDCOKmmFMUYRGFF27KMqcegJCI5IiNGIpQmOaYjjWFdzKgltbcKsLjn3BrTAwp8bAziqDla1mGrPVTGO2mmnUVgTHbLUpS-czs2lLtjRmq1VfssYxW8_Kg9HW9PjhbwAAAP__WEKzfg==

# Sort node in between join and child nodes produces hash joiner.
query T
SELECT url FROM [EXPLAIN (DISTSQL) SELECT * FROM parent1 JOIN (SELECT * FROM child1 ORDER BY cid1) USING(pid1)]
----
https://cockroachdb.github.io/distsqlplan/decode.html#eJy8ls1um0oUgPf3KaxzN_eqYw0z_BgjVWLZdJFUSXcVC2KmMZLDoAFLjSK_e4WJmxrMnJmM8A5sf8z5-Y4Pr1DJQtzmz6KB5AcwIMCBgA8EAiAQQkagVnIjmkaq7ic9cFP8gsQjUFb1vu0-zghspBKQvEJbtjsBCXzPH3fiXuSFUNQDAoVo83J3PKZW5XOuXtI6V6Jqu0Mf6rxqksWScvovDSPKaMD765gyyhd5VSz8hWy3QjWQHQjIfft29PuJjy-Lbd5sz89KGWSHjEDT5k8CEnYgH0shvJzCZlvuCscM3qPjNtE9SNUKRdmguCn_5FQhfzKG9-fsK6kKoURx9qSsI7GfXEjkS95sv8qy6pIZlHknfrb_pez_z6p82h6vgMDdvk0WKSMpJ2lA0nCynIFDKhfivJVLWVPuDZO-eHZ4djYzF40ZzsqEaEsadNdh93kw19xYpBOZzY1rNlMzhER6miE25wyxK89QNN8McfPGc1OP_-rwkkZ_NIj6606DaC6PLdJZGXrsmM2Ux0ikJ4_5nB7zK3u8ms9j37zxvqnHl5u9pPFc9lokERva-6EcppxF4js568_prH9lZ-P5nA3M2x2YOhsvKfNOPQ-9t5uu6cybS1uLPNaG2n40jSlzkRBP5gZzmhtc2dz1dd68L0RxL5paVo0weq_2ujxE8ST6ujRyrzbim5Kb4zH97d2RO754FaJp-2_9_uam6r_qAjSHYxeYcSc6cqG5p6fZkPbO6DPYG8LcouDcDo5d4EHBbenIhR4UfET72oIH-m4F-m4xfbtCl_nQw8h86GFsPhAamQ89jc1HpK34Sl_wlct86GFkPvQwNh8IjcyHnsbmI3aZj7WL4XoYMVwPY4YjNGK4nkY3wGiBnFWcIX8qbLRBbCRHaMRyhMY0x3DEcwTHRGejPWJjOhvtERvVERpxHaEx2TEcsR3BUd31O5SFiO42S3Tcc5stakujulvtUVsc1V2_STHdbVapLY3pbrVMrXFMd6t1Osb1-5StEd1tNuq45zYr1ZZGdbdaqrY4pjvXb9Wh7tnhn98BAAD__6l0mnQ=

query TTT
EXPLAIN SELECT * FROM parent1 JOIN (SELECT * FROM child1 ORDER BY cid1) USING (pid1)
----
render               ·         ·
 └── hash-join       ·         ·
      │              type      inner
      │              equality  (pid1) = (pid1)
      ├── scan       ·         ·
      │              table     parent1@primary
      │              spans     ALL
      └── sort       ·         ·
           │         order     +cid1
           └── scan  ·         ·
·                    table     child1@primary
·                    spans     ALL

# Multi-table staggered join uses interleaved joiner on the bottom join
# and a merge joiner.
query T
SELECT url FROM[EXPLAIN (DISTSQL)
  SELECT * FROM grandchild1
  JOIN child1 USING (pid1, cid1)
  JOIN parent1 USING (pid1)
ORDER BY pid1
]
----
https://cockroachdb.github.io/distsqlplan/decode.html#eJzclstu2zoQhvfnKYw5m3MQGhSpS2wBBbRN0SZF2l3hhWJNbAGOZFB00SDwuxe0nES-hCOZUA14p9snDoffAP8LFGWGt-kTVhD_BAEMJDDwgUEADEKYMFiqcopVVSrzSQ3cZL8h9hjkxXKlzeMJg2mpEOIX0LleIMRwU2hUC0x_4T2mGarPZV6g4h4wyFCn-WKz4hd81GDWyJ9S9ZzMVFpk03m-yEwp9_ls3nz79qL-FzBY4KP-LxFXLJFX_39S5vu3W2Bwt9LxIBEskSzxWRKw5BomawblSm8Lf6_34XkwT6v5bnmJgMl6wqDS6QwhFmvWvgE_0ofFdu883P3t64aWqcJCmx19X6ZFFQ-GXPJ_eRhxwQNZX4-44HKQFtnAH5R6jqpy2oL8cAvv_ylVhgqz_f9cmYVbfXWkG19RzXDrgNiT4PUUGyd4_PTCwwN835nvtrMjNd-Ww3LJxe7hfbR8sLO8OGk4xOUMB9GA5nBELYfjg9kY8sBch-Z50NegiPMMiuh_UORJpsrLMZVoQNPU67amNowc8uhN26i-NtpGfZkqz2Oq7N9U_yRT_csxlWhA09RRW1OPyznko7789M_jp9-_n8FJfgaX4yfRgKaf47Z-joZceK-Oht72xkgqvL4UDc6jaPB3U_GRcu6xWpZFha0Cr2c2hNkM6zZV5UpN8Zsqp5tl6tu7DbeJTxlWun4r65ubon5lCmwPRy7w2AUWTnWL0E6LDi2T3eDIBR67wMKp7r2WHdByn_aatG_vt2-FxW7PvH06cBHcDhOC22FCcDtMCU7QhOChi-B2mBDcDhOC22FKcIImBI9cBL92UdQOE4raYUJRO0wpStCEoiMXRe0woagdJhS1w5SiBE0oOnZRVDjlBIImJCVowlKCpjSlcCoruIUFt7TgFhcc84JbYBBOiUEcRIZOttppylY7Tdlqp0lbCZyytUtYOjyzLmmpK03Z2ikvdcYpWw_Cg9XWyfqfPwEAAP__suwChg==

# Multi-table join with parent1 and child1 at the bottom uses interleaved
# joiner but induces a hash joiner on the higher join.
query T
SELECT url FROM [EXPLAIN (DISTSQL)
  SELECT * FROM parent1
  JOIN child1 USING (pid1)
  JOIN grandchild1 USING (pid1, cid1)
]
----
https://cockroachdb.github.io/distsqlplan/decode.html#eJzUll9v2jwUh-_fT8F7drNpRo6dP4VIk3K5TlU7ddvVlIuUuBCJJsgx06qK7z6Z0JIA9cFYROKO4DzxOfZzpN8LlFUubrMnUUP8GxgQ4EDABwIBEAghJbCQ1UTUdSX1Kw1wnf-F2CNQlIul0n-nBCaVFBC_gCrUXEAM16USci6yP-JeZLmQ36qiFJJ6QCAXKivm6x1vxKMCvUfxlMnnZJFJUSpdxn0xnbVXJrNinuuF5jtAYC4e1ceEff70Rep31z-BwN1SxYOEkYSTJCBJCOmKQLVUm0q3BT48D2ZZPevWo0Ef0lVKoFbZVEDMVuT4pn9mD_NNvzTsfvm1kanMyvytmx-LrKzjwZBy-oGGEWU04JTT_29_3dzQcEQZ5YOszAf-oFIzIWv7bninG_5uN9tPLctK5kKKvPOxVJPYKweO5GtWzzZ3z3Yuf3ODJPG3d0gS3rlF__Uir0gy2ul-25bv0NaBmm-rYbWgLNw9gIN7B5292UlTwS57KpCm21MRWUyFYSiGNNBroV4LzjghrOcJYf1MCD_JUn7ZliJNty29srG0ZeKQRm_KRjRqKxud0VLes6W8H0v9kyz1L9tSpOm2pSMbS98Xc0hHZ3TT79lNvx83g5PcDC7bTaTptptjGzdHQ8q8Vz9DTz-0BGXeGfUMetYz6D8CH6joXtSLqqzFUQHX0z2JfCqaM6qrpZyI77KarLdpHu_W3Dov5aJWzSpvHq7LZkkXeDwcucBjF5g51c1CM80sjozbwZELPHaBmVPdO0e2R_Nd2mvTvvm8fSPMumfm7dKBi-BmGBHcDCOCm2FMcIRGBA9dBDfDiOBmGBHcDGOCIzQieOQi-JWLomYYUdQMI4qaYUxRhEYUHbkoaoYRRc0woqgZxhRFaETRsYuizCknIDQiKUIjliI0pimGY1nBLSy4pQW3uOCYF9wCA3NKDGwvMljZaqYxW800ZquZRm1FcMxWm7C0f2c2acmWxmy1ykvWOGbrXngw2pqu_vsXAAD__11MBmw=
