# LogicTest: 5node-dist-opt

# 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 TTITI colnames
SHOW EXPERIMENTAL_RANGES FROM TABLE parent1
----
start_key                   end_key                     range_id  replicas  lease_holder
NULL                        /2/#/56/1/42/2/#/58/1/2     1         {1}       1
/2/#/56/1/42/2/#/58/1/2     /4/#/55/1/44                11        {2}       2
/4/#/55/1/44                /6/#/56/1/46/6/#/58/1/6     6         {3}       3
/6/#/56/1/46/6/#/58/1/6     /8                          12        {4}       4
/8                          /10/#/56/1/50/10/#/58/1/10  2         {5}       5
/10/#/56/1/50/10/#/58/1/10  /12/#/55/1/52               13        {1}       1
/12/#/55/1/52               /14/#/56/1/54/14/#/58/1/14  7         {2}       2
/14/#/56/1/54/14/#/58/1/14  /16                         14        {3}       3
/16                         /18/#/56/1/58/18/#/58/1/18  3         {4}       4
/18/#/56/1/58/18/#/58/1/18  /20/#/55/1/60               15        {5}       5
/20/#/55/1/60               /22/#/56/1/62/22/#/58/1/22  8         {1}       1
/22/#/56/1/62/22/#/58/1/22  /24                         16        {2}       2
/24                         /26/#/56/1/66/26/#/58/1/26  4         {3}       3
/26/#/56/1/66/26/#/58/1/26  /28/#/55/1/68               17        {4}       4
/28/#/55/1/68               /30/#/56/1/70/30/#/58/1/30  9         {5}       5
/30/#/56/1/70/30/#/58/1/30  /32                         18        {1}       1
/32                         /34/#/56/1/74/34/#/58/1/34  5         {2}       2
/34/#/56/1/74/34/#/58/1/34  /36/#/55/1/76               19        {3}       3
/36/#/55/1/76               /38/#/56/1/78/38/#/58/1/38  10        {4}       4
/38/#/56/1/78/38/#/58/1/38  NULL                        20        {5}       5

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

query TTITI colnames
SHOW EXPERIMENTAL_RANGES FROM TABLE grandchild1
----
start_key                   end_key                     range_id  replicas  lease_holder
NULL                        /2/#/56/1/42/2/#/58/1/2     1         {1}       1
/2/#/56/1/42/2/#/58/1/2     /4/#/55/1/44                11        {2}       2
/4/#/55/1/44                /6/#/56/1/46/6/#/58/1/6     6         {3}       3
/6/#/56/1/46/6/#/58/1/6     /8                          12        {4}       4
/8                          /10/#/56/1/50/10/#/58/1/10  2         {5}       5
/10/#/56/1/50/10/#/58/1/10  /12/#/55/1/52               13        {1}       1
/12/#/55/1/52               /14/#/56/1/54/14/#/58/1/14  7         {2}       2
/14/#/56/1/54/14/#/58/1/14  /16                         14        {3}       3
/16                         /18/#/56/1/58/18/#/58/1/18  3         {4}       4
/18/#/56/1/58/18/#/58/1/18  /20/#/55/1/60               15        {5}       5
/20/#/55/1/60               /22/#/56/1/62/22/#/58/1/22  8         {1}       1
/22/#/56/1/62/22/#/58/1/22  /24                         16        {2}       2
/24                         /26/#/56/1/66/26/#/58/1/26  4         {3}       3
/26/#/56/1/66/26/#/58/1/26  /28/#/55/1/68               17        {4}       4
/28/#/55/1/68               /30/#/56/1/70/30/#/58/1/30  9         {5}       5
/30/#/56/1/70/30/#/58/1/30  /32                         18        {1}       1
/32                         /34/#/56/1/74/34/#/58/1/34  5         {2}       2
/34/#/56/1/74/34/#/58/1/34  /36/#/55/1/76               19        {3}       3
/36/#/55/1/76               /38/#/56/1/78/38/#/58/1/38  10        {4}       4
/38/#/56/1/78/38/#/58/1/38  NULL                        20        {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_9FGJOu3RKLDlpqWBBhVJwKd5iemt9ENbEETiSkeTSEvzdi-0u8Yb0Xwohh71ZevPjDX6juQHnDZX6miLIz8ABQQDCBdQIffANxejDJC2FhfkGMkOwrh_SdF0jND4QyBtINnUEEgqXKHSkv1JF2lB4762jcJYBgqGkbTc7faDLBJOHvdbhu-p1IJcm-0lg72yXKEi22SjOvgxZljc7xnMpZVF-2rJ9tVJox_jrg_KmfMvWjOA_le1CraD8IAFCZdurdTtt0M40V7Yz4qA-ek_LfwOEji7TRvHn212YGpk_AWE_JMkURyVQnaO6QPUS1SuoRwQ_pNt8YtItgeQj_iLD2-gG54OhQOYoq3q8J-XSv_D9WX6n8H5rcWTNHzQ-_DQ-T2h8xIMyFKcMn1CGf1jjFcXeu0h_9cKzaUWQaWnZJ9EPoaGPwTezzXLcz9x8YSimReXLoXCzNDe4hvlv4fMjOLsLi_9xzv8JrsdnPwIAAP__gf0kvQ==

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_9FGJOCZ2ylr1LqSCgQim4FKeY3lofhDXrFXglI8mlZfF3L7Yb4oT0Xwolh9wsvfnxBr_RPIF1mgr1SAHEJ-CAkALCHVQInXc1heD8KM2Fuf4KIkEwtuvjeF0h1M4TiCeIJrYEAnIbybekvlBJSpN_54wlf5MAgqaoTDs5vaf7CKOHeVT-m2y8srp-MK0e7UeRvTVtJC_YaiU5-9wnSVZvGM-EEHnxcc225UKhDeOvdsrr4g1bMin_oaxnagFlOwkQStM8LFvqlCcb-U757_3M_w0QWrqPK8mfrzd-bGT6BIRtHwWTHGWKMkN5i_IO5UuoBgTXx30-IaqGQPABf5LhPrreOq_Jkz7IqhpOpFy4F667yY4KT1unB9b8rPHh1_G5oPFJz8owvWZ4QRn-Zo2XFDpnA_3RC0_GFUG6oXmfBNf7mj54V08283E7cdOFphBnlc-H3E7S1OAS5r-Ebw_g5BhO_8U5-yu4Gp59DwAA__8zXSS0

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          ·               ·
 └── 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/#
·               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#eJzslUFr2zAUx-_7FOKdHPJGLVluV0FAgzHIGMkIu20-GOs1NbhWkOSxUfLdh-3FrUs21gRy8tH668df8k_wHqG2hlb5A3lQ34ADggCEBBAkIKSQIeycLch769otPbA0P0HFCGW9a0K7nCEU1hGoRwhlqAgULOtArqL8B20oN-Q-2bImdxUDgqGQl1XX-JnuArQd5UPufunivqxMe4JNub1_HmxdXptxyj6WVSCnWBRFmrPvTRwntGCpUmq5-jpj71cf2BAUC3bzJ5ix9YZFkRYDwsWYEQPD5QE6UHKg5O2YkgOV8gMFCP29AaGiuxBpPkct5qiT-Wzh2muMlgBh3QTFNEctUCeoJeoU9TXqG9TvUN9CtkewTXj68T7kWwLF9_gXOU9Omto6Q47MSEK2P6JvZd_a3VX6YuPxajGq5ie9Cz69i0u8C3GSHDHJuYSc5CQ5ySTnEnLkSXLkJOfS4-6InA35na09_dc0i9txSGZL_ez0tnEFfXG26Gr6z3XHdQuGfOhT3n8s6y7qDvgc5v-Er0dw_BIW5zQn58DyHDh9FZzt3_wOAAD__-mfE2o=

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
----
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 TTITI colnames
SHOW EXPERIMENTAL_RANGES FROM TABLE outer_p1
----
start_key  end_key  range_id  replicas  lease_holder
NULL       /0       20        {5}       5
/0         /5       31        {1}       1
/5         /10      32        {2}       2
/10        /15      33        {3}       3
/15        /20      34        {4}       4
/20        /25      35        {1}       1
/25        /30      36        {2}       2
/30        /35      37        {3}       3
/35        /40      38        {4}       4
/40        NULL     39        {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-nMPhoLKkoIXExd3cyqmGGuSGhzJSHJpCP7vRfYhTZp-rHPzzdLomdfPHOYIUglaV3sykHwBHxACQAgBIQKEGEqETquajFHaPZmAVPyAxENoZNdbd10i1EoTJEewjW0JEkilJd1S9Z0KqgTpZ9VI0g8uQpCtmnZMzGhrwWU0-0ofuOot6a-de1Q0u2-_l2pXmloBwsuho4R93GQZyzcvq4I95-kaEFra2jvuv71_r12X8dO1JClIJ-wp_5CtPj-t7riPPLxHxgNkPELGY2T8EcoBQfX25GZstSNI_AH_4H_S7qXSgjSJM89yuDKhtXqnuof44uH16OAs2p81-mAxow9m-YeL8Q9n-UeL8Y9m-XuL8f_H6i3IdEoa-q_N4rnVRGJH0x4zqtc1fdKqHmOmYz5y44UgY6eqPx1SOZbGH_wV9v8KP57B3iUc3JIc3gJHt8Dxq-ByePMzAAD__9hCYKA=

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-rlJhECHZQIuMgazewoSxK41gtst3W3IsvjfQ-thxsnkyzl67Kp6-pWnoXwBITntyyfSEH8BDxB8QAgAIQSECAqETsmKtJbKjkxAwn9A7CI0ouuNLRcIlVQE8QuYxrQEMSTCkGqp_E45lZzUnWwEqWsbwcmUTTsmpvRowGY0T6V6ZrI3pL7WlZ3Km_rbr72xNd0FCPfPHcXOx4c0dbKH-13u3GXJHhBaejRXzNsi87fIgu3mvbK3zUo2ggQnFTu32Yd09_l2d8U8ZDcbPCr4yN7MCgGytxt0WIgOi9Bh76AYEGRvDiq0KWuC2BvwN7oOlnohFSdFfKalGM4I3cvXsruOTgbPR_uzaG_RS_lrfSl_ka5grbqCRbrCteoKF-ly16rrL3-ZnHQnhaZ_2oquXavEa5p2sJa9quiTktUYMx2zkRsLnLSZut50SMTYGj_wGPb-CN_MYPcU9i9JDi6Bw0vg6L_gYnj1MwAA___oe5X8

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#eJzElsFq20AQhu99ijCnlmyxdyXZsaCgawpNSuit-KBYU1vgaM1Kgobgdy-yCq5ldUabwfLNsvbbnZ35QP8bFDbDh_QFS4h_ggYFBhQEoCAEBREsFeycXWFZWtcsaYH77DfEUwV5saur5u-lgpV1CPEbVHm1RYjhR_q8xSdMM3STKSjIsErz7eGYnctfUvearDb5NtOw3CuwdfV3q-MOz683m7TcnLJJs36poKzSNUKs9-p9JUVESUZUkvlvScd9rMvQYdbd57Y5eNCqntt9Q7fGrzYv0E10p-Nb_FV9TPTtpy8uX2_an6Dgsa7im0SrxKgkUEmkkplK5p3bH28WDLhZXfRV3Vvwg_1sdxMddVb2nx2enK2HD1qP5J5HSbOR3NPXcU9f3j0zvNlmpPl7lDQfaf7mOvM3l59_MLzZwUjz9yjpbqT5B9eZf3D5-YfDmx2ONH-PkhYjzT-8zvzDcbNHTzlPWO5sUeKgZDFtLoTZGts2lbZ2K_zu7OpwTPv4eOAOX9QMy6p9a9qH-6J91RQ4HJ5J4IUE1qK6dUTT2qNlxg-eSeCFBNaiujstO6NNl57-Swd0vwMS1qc9m3bpUCI4DTOC0zAjOA1zgjM0I3gkEZyGGcFpmBGchjnBGZoRfCYRfC5RlIYZRWmYUZSGOUUZmlH0TqIoDTOK0jCjKA1zijI0o-hCoqgW5QSGZiRlaMZShuY05XAuK8jCgiwtyOKCMC_IAoMWJQZ9Fhm8bKVpzlaa5myladZWBuds9QlL5zPzSUu-NGerV17yxjlbz8IDaety_-FPAAAA__-7ahyi

# 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#eJy8lVFr2zAQx9_3Kco9bVQjluykqWHg1w7WjrK34Qc1uiWG1DKSDCsl333YLmQxic5GRG9xrJ_u_r8D3zvUWuGjfEUL-W_gwEAAgxQYZMBgCSWDxugNWqtNd2QAHtRfyBMGVd20rvu7ZLDRBiF_B1e5PUIOv-TLHp9RKjSLBBgodLLa92UaU71K81Y00mDtOJQHBrp1H3cdr3h5u9lJuzuFi-58ycA6uUXI-YFd6Ol4jzYKDarxPbdd4eOptj53rq81zvYDzRa_66pGs1idXrvHP-5zwW-_fDPVdjf8BAZPrctvCs4KwYqUFdko8zFPOiHPjE4f9VfdLDgfnTxfOzupzafPl8eaL48_37trzldMdyxiORbxHa-v6Tid7jiN5TiN7_j-mo6z6Y6zWI5n9LT09SSCehIXe4o0d57EWlBnGnlG2-ja4qT1k3RRUG1xsGN1azb40-hNX2Z4fOq5fhEotG54-_HwUA-vuganw1kIvAqB1yEwJ0LzMZ38Tws_LLwwP6WTMZ2GDMsPE8Pyw8Sw_DAxLCIzEToLGdYyRLcfJnT7YUK3HyZ0E5mJ0KsQ3Xchuv0wodsPE7r9MKGbyEyEXofovg_R7YcJ3X6Y0O2HCd1EZurLP2dZipl0FkSvguh1EM2p4PM2Znn49C8AAP__9ASy7Q==

# 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#eJy8llFr2zwUhu-_X1HOVQv6SCTZaWMY-HLdRTvK7oYv3PgsMaSWkRVYKfnvI_Egi-PpWDtEl2nySK_OeaDvBzSmwqfyDTvIvoMEAQoEaBCQgIAUCgGtNSvsOmMPP-mBx-onZHMBddPu3OHPhYCVsQjZB7jabREy-Fa-bvEFywrtbA4CKnRlvT1e09r6rbTveVtabJyEYi_A7Nzvs05HvL7fbMpucw7nCop9IaBz5Rohk3vxb5nS8UyrTb2tQiPps0jqr5FO5-waYyu0WJ2dVBxI6icj7_pcdpsvpm7QzuRg1lv84W5zdffJ1uuNu831HQh43rnsJpciVyLXIk9Eng5efHqNZrxmJOqT-d-0M5kO3z16d3J2t5y-XBlLuIBMi0jCycjCyasKp6YPWMVaekCm-0hLV5GXrq66dD19wDrW0gMyPURauo68dH3VpSfTB5zEWnpApmWkpSeRl55E6xMjQV6wa03T4aS2MD88Bas19qPpzM6u8Ks1q-M1_cfnI3f8J1lh5_pvVf_hsem_OgScDi848JIDS1ZumfppGTAyFQYvOPCSA0tW7sHILmg1pOd_0to_b-2F5fnM5kM64QjuhwnB_TAhuB-mBCdoQvCUI7gfJgT3w4TgfpgSnKAJwRccwe85ivphQlE_TCjqhylFCZpQ9IGjqB8mFPXDhKJ-mFKUoAlFlxxFJasnEDQhKUETlhI0pSmFU12BVxZ4bYFXF5h9gVcYJKsxyIvKEGSrn6Zs9dOUrX6atJXAKVtDytLlzkLaUihN2RrUl4JxytaL8uC1tdj_9ysAAP__U3kYdA==

# 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#eJzEll1r2zAUhu_3K8q52qhGItn5Mgx828HaUXY3cuFGZ47BtYxsw0rJfx-2C1kcT8eainzp2I_06uiBvK9QKIn3yTNWEP0EDgwEMAiAQQgMVrBnUGp1wKpSuv2kB-7kb4iWDLKibOr25z2Dg9II0SvUWZ0jRPAjecrxEROJerEEBhLrJMu7bUqdPSf6JT4cs1wK2J8YqKZ-W-q8wtPLzTGpjpdszFncInsGVZ2kCBE_sf9LtRpPleqkkO8TTfwz2nkppSVqlMOlblksbtv9J385ctpvqFP8qrIC9YIPLiHHX_XHN_rTF52lx_MjMHho6uimOxGLAxaHLN6weMvi3WAm58MGEw7bFGOHGM1-rz6rcsFXgy_H9w4v9ubTHeD-zLRItfZsJp_XTO7VTDH9HoQ_OyxSbTzbIea1Q3i1I5h-D4E_OyxSbT3bEcxrR-DVjnD6PYT-7LBItfNsRzivHeFsnWck2SNWpSoqnNRolu3ZUKbYT65SjT7gd60O3Tb940PHdX_fEqu6fyv6h7uif9UGnA6vXeCdC8ydcvOVmeYWIxN28NoF3rnA3Cn3YGRXtBjSy7_pwDzvwAjzy5kth3ToIrgZJgQ3w4TgZpgSnKAJwVcugpthQnAzTAhuhinBCZoQfO0i-MZFUTNMKGqGCUXNMKUoQROKbl0UNcOEomaYUNQMU4oSNKHozkVR7tQTCJqQlKAJSwma0pTCqa7gVhbc2oJbXXDsC26FgTs1Bn5VGaxsNdOUrWaastVMk7YSOGWrTVm6vjObtmRLU7Za9SVrnLL1qjwYbd2fPvwJAAD__4eyQAE=

# 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#eJzElsGK2zAQhu99imVOLagkkp1sYij42O1htyy9FR-80TQxZK0gOdBlybsX2y1pHFdjdYp6VOxP-jX-IP8r1EbjffmMDrKvIEGAAgEJCEhBwAIKAQdrNuicse0rPXCnv0M2F1DVh2PT_lwI2BiLkL1CUzV7hAy-lE97fMRSo53NQYDGpqz23TEHWz2X9iXf7Kq9VlCcBJhj83Or8w5PLze70u0u2VyKPIHiVAhwTblFyORJ_F2qxXiqrS1r_W-iqT9GO291rI3VaFFfbFa0JPXKyP0-lm73yVQ12pkcTH2P35q3XcZ3H2y13f1agICHY5PddCuRK5GnIl-KfCXy9WAA55sljJuNxL43781hJhfDGYyenV6cLad_cBlPw4BUy8gaysgaymgaqulDV_FUCEh1G1kFFVkFFU2FZPrQk3gqBKRaRVYhiaxCEk2FdPrQ03gqBKRaR1YhjaxC-l96ykioR3QHUzuc1ELm7bVQb7EfkzNHu8HP1my6Y_rlQ8d1f7kaXdM_Vf3iru4ftQGnw0sOvObAkpVbLvy0DBiZCoOXHHjNgSUr92BkV7Qa0vPf6cQ_78QLy8uZzYd0yhHcDxOC-2FCcD9MCU7QhOALjuB-mBDcDxOC-2FKcIImBF9yBL_lKOqHCUX9MKGoH6YUJWhC0RVHUT9MKOqHCUX9MKUoQROKrjmKSlZPIGhCUoImLCVoSlMKp7oCryzw2gKvLjD7Aq8wSFZjkFeVIchWP03Z6qcpW_00aSuBU7aGlKXrbxbSlkJpytagvhSMU7ZelQevrcXpzY8AAAD__5b5Mtw=

# Multi-table staggered join uses interleaved joiner on the bottom join
# and a lookup join on the higher join.
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#eJzUlU-L2zAQxe_9FGFOLZmSyHb-GQq6piy7Jdfig7Fms269GiPLpWXJdy-K6K69JHJIICVHWX5-v_fGMC-gWdF9_kwNpN9BAEIECDEgJIAwgwyhNlxQ07Bxr3jBWv2GdIpQ6rq17nGGULAhSF_AlrYiSGGtLZmK8l-0oVyR-cqlJjOZAoIim5fV3vGOHi04j_I5N3_k1uRaFU9lpRzKptw-dW9fL_y3AKGiR_tRijHKaPzpi3Hvvx4B4aG16UgKlBHKGGWCcoZyjnIB2Q6BW_uG39h8S5CKHZ4e0WH4cJNZP9Y_4jo3pK1DvmP-2dajH1zqEWtHdZBvgXJ1FC46CvfGxEaRIdXHkWIM2e5Agnv-zPVE9IdyzD7u2Yuzxi9uafwDETvjn19__NFZ_Ue31P9AxE7_i-v3H5_Vf3xL_Q9E7PS_vH7_yVn9J7fU_0DETv-r_7t-DsBtqKlZN3TSZpm63URqS36XNdyagr4ZLvY2_viw1-0fKGqsvxX-sNb-ygF2xSIojnpi8V4chZ0HrOOgOgmLk0u4Z0HxPOw8v8R5ERQvw87LS5xX4VlNB36T8E_23jvbffgbAAD__z5elJs=

# 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#eJzUlkGL2zwQhu_fr1jm9JWqbCTb2cRQ8LEpZbeE3ooP2ng2MXitICuly5L_XmynxHZSTRyBILc40iPNaJ7D-w6lyvBRvmIF8U_gwEAAgwAYhMAggpTBVqsVVpXS9ZYWWGS_IZ4wyMvtztR_pwxWSiPE72ByUyDEsCgN6gLlL1yizFB_VXmJ-n4CDDI0Mi-aG7_hi4H6jvxV6rdkKzWWpi5jma833ZXVJi-yeqE9BxgU-GL-T_jHD591vbf5CQyedia-SzhLBEsCloQsiSDdM1A7cyj2WOPz291GVpt-STUbQrpPGVRGrhFivmeX9_1DPheHlu-j_sl_e1lrWWaHhkaXJnqliX-WdjxqVyqdocasd1hak9SWM_19kdXmMEs-GOZhIiwJjzNhiehNJWwGE7FkxpL5oPtjW4FDW2dqflSf1PaeR8MHOHt32LubX2U5v3nLib67lk89W849W879WC6uMk3cvGlE313THjybJjybJvyYFlxlWnDzphF9d02beTYt8Gxa4Me08CrTwps3jei7a9rcs2mhZ9NC_xnxTEVLrLaqrPCiBDipe8Jsje0bVWqnV_hdq1VzTfv51HBNGMmwMu2qaD8WZbtUF3g5PHWB5y4wd6qbR3aaj3gyMQ6eusBzF5g71T14shNaDOlJlw7s7x1YYd5_s8mQDl0Et8OE4HaYENwOU4ITNCF45CK4HSYEt8OE4HaYEpygCcGnLoI_uChqhwlF7TChqB2mFCVoQtGZi6J2mFDUDhOK2mFKUYImFJ27KMqdcgJBE5ISNGEpQVOaUjiVFdzCgltacIsLjnnBLTBwp8TATyLDKFvtNGWrnaZstdOkrQRO2TomLJ3ObExaGktTto7KS6NxytaT8GC1Nd3_9ycAAP___vbDKA==
