# LogicTest: 5node-dist

statement ok
CREATE TABLE data (a INT, b INT, c INT, d INT, PRIMARY KEY (a, b, c, d))

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

# Split into ten parts.
statement ok
ALTER TABLE data SPLIT AT SELECT i FROM generate_series(1, 9) AS g(i)

# Relocate the ten parts to the five nodes.
statement ok
ALTER TABLE data EXPERIMENTAL_RELOCATE
  SELECT ARRAY[i%5+1], i FROM generate_series(0, 9) AS g(i)

# Verify data placement.
query TTTI colnames
SELECT start_key, end_key, replicas, lease_holder from [SHOW EXPERIMENTAL_RANGES FROM TABLE data]
----
start_key  end_key  replicas  lease_holder
NULL       /1       {1}       1
/1         /2       {2}       2
/2         /3       {3}       3
/3         /4       {4}       4
/4         /5       {5}       5
/5         /6       {1}       1
/6         /7       {2}       2
/7         /8       {3}       3
/8         /9       {4}       4
/9         NULL     {5}       5

# ensure merge joins are planned when there's orderings.
query TTTTT
EXPLAIN (VERBOSE) (SELECT * FROM (SELECT a,b FROM data) NATURAL JOIN (SELECT a,b FROM data AS data2))
----
render               ·               ·                   (a, b)                          a!=NULL; b!=NULL
 │                   render 0        a                   ·                               ·
 │                   render 1        b                   ·                               ·
 └── merge-join      ·               ·                   (a, b, a[omitted], b[omitted])  a=a; b=b; a!=NULL; b!=NULL
      │              type            inner               ·                               ·
      │              equality        (a, b) = (a, b)     ·                               ·
      │              mergeJoinOrder  +"(a=a)",+"(b=b)"   ·                               ·
      ├── render     ·               ·                   (a, b)                          a!=NULL; b!=NULL; +a,+b
      │    │         render 0        test.public.data.a  ·                               ·
      │    │         render 1        test.public.data.b  ·                               ·
      │    └── scan  ·               ·                   (a, b, c[omitted], d[omitted])  a!=NULL; b!=NULL; c!=NULL; d!=NULL; key(a,b,c,d); +a,+b
      │              table           data@primary        ·                               ·
      │              spans           ALL                 ·                               ·
      └── render     ·               ·                   (a, b)                          a!=NULL; b!=NULL; +a,+b
           │         render 0        data2.a             ·                               ·
           │         render 1        data2.b             ·                               ·
           └── scan  ·               ·                   (a, b, c[omitted], d[omitted])  a!=NULL; b!=NULL; c!=NULL; d!=NULL; key(a,b,c,d); +a,+b
·                    table           data@primary        ·                               ·
·                    spans           ALL                 ·                               ·


# ORDER BY on the mergeJoinOrder columns should not require a SORT node
query TTTTT
EXPLAIN (VERBOSE) (SELECT * FROM (SELECT a,b FROM data AS data1) JOIN (SELECT c,d FROM data AS data2 ORDER BY c,d) ON a=c AND b=d ORDER BY c,d)
----
merge-join           ·               ·                  (a, b, c, d)                    a=c; b=d; a!=NULL; b!=NULL; +a,+b
 │                   type            inner              ·                               ·
 │                   equality        (a, b) = (c, d)    ·                               ·
 │                   mergeJoinOrder  +"(a=c)",+"(b=d)"  ·                               ·
 ├── render          ·               ·                  (a, b)                          a!=NULL; b!=NULL; +a,+b
 │    │              render 0        data1.a            ·                               ·
 │    │              render 1        data1.b            ·                               ·
 │    └── scan       ·               ·                  (a, b, c[omitted], d[omitted])  a!=NULL; b!=NULL; c!=NULL; d!=NULL; key(a,b,c,d); +a,+b
 │                   table           data@primary       ·                               ·
 │                   spans           ALL                ·                               ·
 └── sort            ·               ·                  (c, d)                          c!=NULL; d!=NULL; +c,+d
      │              order           +c,+d              ·                               ·
      └── render     ·               ·                  (c, d)                          c!=NULL; d!=NULL
           │         render 0        data2.c            ·                               ·
           │         render 1        data2.d            ·                               ·
           └── scan  ·               ·                  (a[omitted], b[omitted], c, d)  a!=NULL; b!=NULL; c!=NULL; d!=NULL; key(a,b,c,d)
·                    table           data@primary       ·                               ·
·                    spans           ALL                ·                               ·

query T
SELECT url FROM [EXPLAIN (DISTSQL) (SELECT * FROM (SELECT a,b FROM data AS data1) JOIN (SELECT c,d FROM data AS data2 ORDER BY c,d) ON a=c AND b=d ORDER BY c,d)]
----
https://cockroachdb.github.io/distsqlplan/decode.html#eJzEll9ro0wUxu_fTyHn6l06ojNq_ggLue3Ctku7d0subJxNhNSRcQJbSr_7ktgQ1HaOZwcmlzb5xcczv9PHV6hVKe-KZ9lC_gs4MBDAIAEGKTDIYM2g0Woj21bp41c64Lb8A3nMoKqbgzn-ec1go7SE_BVMZfYScvhZPO3lgyxKqaMYGJTSFNX-dJtGV8-FflmVhSmAwWNT1G0ehBEPiroMeKDMTmpgcH8webDibCVg_cZAHcz77S53eXoJdkW76__-GVkzaE2xlZDzN_ZvyTOX5AlbpYPkl0iCEulRaSN1xOPhg96wlbhxnU7yaZTLTyldSi3LT-8_-ZsfPN13qbfym6rq4yMOJr6Xv83_7_SXr7ra7i6XPUWYfdyp-zN-kPxOhaqJRP9YPouQ9SLw6RLyKRJGPIyEpwUiZJ-5ZSesEBLqvELcwwrx667QzMcKiekOiEkOiDBKPPlLyD53y07wFwl19ld48Fdc19-5D3-T6Q4kkxxIwij15C8h-8ItO8FfJNTZ38SDv8l1_V348Ded7kA6yYE0jDJP_hKyL92yE_xFQp39TT34m17X36XvV_APAj3ItlF1Kye9WcfHR5LlVnYDa9VBb-QPrTan23SX9yfu9G5WytZ0nybdxW3dfXQMOB1euMBcONEzF1rEdpoP6bhH9-B4CAvCwAUNXrjAg4FT6ZkLPRj4iE6sA0_tp5XaT4vbjytz2Q87jOyHHcb2A6GR_bDT2H7MrBOf2wc-d9kPO4zshx3G9gOhkf2w09h-LFz2Y-liuB1GDLfDmOEIjRhup9EGGBVIb-Ic-afCRw1CkRyhEcsRGtMcwxHPERwTnY96hGI6H_UIRXWERlxHaEx2DEdsR3BUd3uH8gzRnVKi4zOntCiVRnUn9SgVR3W3NymmO6VKqTSmO6lMyTimO6lOx7i9T_kS0Z3SqOMzp1QqlUZ1J5UqFcd0F_ZWHeq-fvvvbwAAAP__kEaZyA==

# ORDER BY on the columns equal to the mergeJoinOrder columns should not
# require a terminal SORT node.
query TTTTT
EXPLAIN (VERBOSE) (SELECT * FROM (SELECT a,b FROM data AS data1) JOIN (SELECT c,d FROM data AS data2 ORDER BY c,d) ON a=c AND b=d ORDER BY a,b)
----
merge-join           ·               ·                  (a, b, c, d)                    a=c; b=d; a!=NULL; b!=NULL; +a,+b
 │                   type            inner              ·                               ·
 │                   equality        (a, b) = (c, d)    ·                               ·
 │                   mergeJoinOrder  +"(a=c)",+"(b=d)"  ·                               ·
 ├── render          ·               ·                  (a, b)                          a!=NULL; b!=NULL; +a,+b
 │    │              render 0        data1.a            ·                               ·
 │    │              render 1        data1.b            ·                               ·
 │    └── scan       ·               ·                  (a, b, c[omitted], d[omitted])  a!=NULL; b!=NULL; c!=NULL; d!=NULL; key(a,b,c,d); +a,+b
 │                   table           data@primary       ·                               ·
 │                   spans           ALL                ·                               ·
 └── sort            ·               ·                  (c, d)                          c!=NULL; d!=NULL; +c,+d
      │              order           +c,+d              ·                               ·
      └── render     ·               ·                  (c, d)                          c!=NULL; d!=NULL
           │         render 0        data2.c            ·                               ·
           │         render 1        data2.d            ·                               ·
           └── scan  ·               ·                  (a[omitted], b[omitted], c, d)  a!=NULL; b!=NULL; c!=NULL; d!=NULL; key(a,b,c,d)
·                    table           data@primary       ·                               ·
·                    spans           ALL                ·                               ·

query T
SELECT url FROM [EXPLAIN (DISTSQL) (SELECT * FROM (SELECT a,b FROM data AS data1) JOIN (SELECT c,d FROM data AS data2 ORDER BY c,d) ON a=c AND b=d ORDER BY a,b)]
----
https://cockroachdb.github.io/distsqlplan/decode.html#eJzEll9ro0wUxu_fTyHn6l06ojNq_ggLue3Ctku7d0subJxNhNSRcQJbSr_7ktgQ1HaOZwcmlzb5xcczv9PHV6hVKe-KZ9lC_gs4MBDAIAEGKTDIYM2g0Woj21bp41c64Lb8A3nMoKqbgzn-ec1go7SE_BVMZfYScvhZPO3lgyxKqaMYGJTSFNX-dJtGV8-FflmVhSmAwWNT1G0ehBEPiroMeKDMTmpgcH8webDibCVg_cZAHcz77S53eXoJdkW76__-GVkzaE2xlZDzN_ZvyTOX5AlbpYPkl0iCEulRaSN1xOPhg96wlbhxnU7yaZTLTyldSi3LT-8_-ZsfPN13qbfym6rq4yMOJr6Xv83_7_SXr7ra7i6XPUWYfdyp-zN-kPxOhaqJRP9YPouQ9SLw6RLyKRJGPIyEpwUiZJ-5ZSesEBLqvELcwwrx667QzMcKiekOiEkOiDBKPPlLyD53y07wFwl19ld48Fdc19-5D3-T6Q4kkxxIwij15C8h-8ItO8FfJNTZ38SDv8l1_V348Ded7kA6yYE0jDJP_hKyL92yE_xFQp39TT34m17X36XvV_APAj3ItlF1Kye9WcfHR5LlVnYDa9VBb-QPrTan23SX9yfu9G5WytZ0nybdxW3dfXQMOB1euMBcONEzF1rEdpoP6bhH9-B4CAvCwAUNXrjAg4FT6ZkLPRj4iE6sA0_tp5XaT4vbjytz2Q87jOyHHcb2A6GR_bDT2H7MrBOf2wc-d9kPO4zshx3G9gOhkf2w09h-LFz2Y-liuB1GDLfDmOEIjRhup9EGGBVIb-Ic-afCRw1CkRyhEcsRGtMcwxHPERwTnY96hGI6H_UIRXWERlxHaEx2DEdsR3BUd3uH8gzRnVKi4zOntCiVRnUn9SgVR3W3NymmO6VKqTSmO6lMyTimO6lOx7i9T_kS0Z3SqOMzp1QqlUZ1J5UqFcd0F_ZWHeq-fvvvbwAAAP__kEaZyA==

# ORDER BY on a different ordering should require a terminal SORT NODE.
query TTTTT
EXPLAIN (VERBOSE) (SELECT * FROM (SELECT a,b FROM data AS data1) JOIN (SELECT c,d FROM data AS data2 ORDER BY c,d) ON a=c AND b=d ORDER BY b,a)
----
sort                      ·               ·                  (a, b, c, d)                    a=c; b=d; a!=NULL; b!=NULL; +b,+a
 │                        order           +b,+a              ·                               ·
 └── merge-join           ·               ·                  (a, b, c, d)                    a=c; b=d; a!=NULL; b!=NULL
      │                   type            inner              ·                               ·
      │                   equality        (a, b) = (c, d)    ·                               ·
      │                   mergeJoinOrder  +"(a=c)",+"(b=d)"  ·                               ·
      ├── render          ·               ·                  (a, b)                          a!=NULL; b!=NULL; +a,+b
      │    │              render 0        data1.a            ·                               ·
      │    │              render 1        data1.b            ·                               ·
      │    └── scan       ·               ·                  (a, b, c[omitted], d[omitted])  a!=NULL; b!=NULL; c!=NULL; d!=NULL; key(a,b,c,d); +a,+b
      │                   table           data@primary       ·                               ·
      │                   spans           ALL                ·                               ·
      └── sort            ·               ·                  (c, d)                          c!=NULL; d!=NULL; +c,+d
           │              order           +c,+d              ·                               ·
           └── render     ·               ·                  (c, d)                          c!=NULL; d!=NULL
                │         render 0        data2.c            ·                               ·
                │         render 1        data2.d            ·                               ·
                └── scan  ·               ·                  (a[omitted], b[omitted], c, d)  a!=NULL; b!=NULL; c!=NULL; d!=NULL; key(a,b,c,d)
·                         table           data@primary       ·                               ·
·                         spans           ALL                ·                               ·

query T
SELECT url FROM [EXPLAIN (DISTSQL) (SELECT * FROM (SELECT a,b FROM data AS data1) JOIN (SELECT c,d FROM data AS data2 ORDER BY c,d) ON a=c AND b=d ORDER BY b,a)]
----
https://cockroachdb.github.io/distsqlplan/decode.html#eJzEl0Fv2k4Qxe__T4Hm9K-yyN6xTcBSJa6p1KRKeqs4OHgLSMSL1kZqFOW7V-BQZBN2dhlpORJ4nue38_OL36DSpbovXlQN-S-QIABBQAICUhCQwUzAxui5qmttdj9pBXflH8hjAatqs212f54JmGujIH-DZtWsFeTws3heq0dVlMpEMQgoVVOs1vsxG7N6KczrtCyaAgQ8bYqqzgfDSA6KqhzIgW6WyoCAh22TD6ZSTBFm7wL0tvkYd5zy_DpYFvWye_2DZCagboqFgly-i8ucZxzniZimPedHS-hj6UmbRplIxv0bvRFTvOGmk5y1cryUNqUyqjw73_mXn9zdd2UW6pteVbtb7CW-Vr-b_z_UX76a1WJ5_NhZEWGPO70gbuzHjTdiKvtxH2dkF-f478KfmLnXQ72JsJvLOQujjgXpvujSZdEjOYwwEKQe3kc87x6YEqYOmMoAmMrrYjoKgalb3NiP2wtTdN8zdNozHEZJIEY8vN_yvHswQpg6MIIBGMHrMnIbghG3uLEftxcjifueJU57lgyjNBAjHt7HPO8ejBCmDowkARhJrsvIOAQjbnFjP24vRlL3PUud9iwdRlkgRjy8T3jePRghTB0YSQMwkl6XkUkIRtzixn7cF78SfTLjUdUbXdXK6U0n3sWmyoVqD6XWWzNXP4ye78e0Hx_2uv3_kaWqm_bbpP1wV7Vf7Qy6iyccsUxZatZsJGbLvjruqDviuC9Gj8DRTzzhiHuB-6pZs5GYnVgDT-2Bp1ZxZj_qzH7UI_voEQcuu5hYcLuYgotQs2ZTcN1aEx_bAx9z4LKLiQW3iym4CDVrNgXXxBq4jO2Jy5NHqQ9e8uRR6kMIoSbWlFBTjFBy3nSygk4eqN1TS4hTO3mi-oBCqIltJdQUKpScN52CRdrbRGZE7vY-oWhh9QmhpvaV1yiUnDedpMVeKpJoFcmqFUJN7SuvWCg5bzpJi71bkOgWZHULsrqFUBP7SqgpWig5bzpFC9q7BYluQVa3EGrqNYPXLZScN52iBe3dgkS3oF-3zN7_-xsAAP__yeWgrw==

# Merge joins should be planned for (FULL|LEFT|RIGHT) OUTER joins

query T
SELECT url FROM [EXPLAIN (DISTSQL) (SELECT * FROM (SELECT a,b FROM data AS data1) FULL OUTER JOIN (SELECT c,d FROM data AS data2 ORDER BY c,d) ON a=c and b=d ORDER BY a,b)]
----
https://cockroachdb.github.io/distsqlplan/decode.html#eJzEl09r20AQxe_9FGJOLVkj70hybEHBlxYS0rjkz6n4oFhb2-BoxUqGhpDvXmzHGNnxzm4GpKNiPc3TzPz2Ra9Q6FzdZs-qgvQPSBCAICACATEISGAqoDR6pqpKm80tO8FV_g_SvoBlUa7rzZ-nAmbaKEhfoV7WKwUpPGRPK3WnslyZsA8CclVny9W2TGmWz5l5GedZnYGA-zIrqjTohTLIijyQga4XyoCAybpOg7EUY4TpmwC9rt_LHao8vQSLrFo0n7-XTAVUdTZXkMo38TnnCcd5JMbxkfODJfSxdK9NrUwo-8cveiHGeMHtTnTWyuFR2uTKqPxsfec7P3i7X8rM1bVeFptXPOr4w0up0uDn481NMHl8-HEXXE-ubkHASv2tv74_9dt3s5wvDpeN1RH2McSfGAM6jeFQI-H39wMzt7qnyxCb_TpnYdCwIN0BkC4AhLIXYkvwengf8Lx74EuY2uMrW8BXdovvoEt83caATmM4hy-67x867R_2wqgldjy8X_K8e7BDmNqzgy2wg92yc9klO25jQKcxnGMnct-_yGn_ol4Yt8SOh_chz7sHO4SpPTtRC-xE3bIz7JIdtzGg0xjOsRO771_stH9xL0xaYsfD-4jn3YMdwtSenbgFduJu2Rl1yY7bGNBpDC6fXB_UuFNVqYtKOX1J9TftVPlc7YZV6bWZqd9Gz7ZldpeTrW77_2iuqnr3a7S7uCp2P20MuotHHLGMWWpWbSRqy2N1v6FuiPvHYvRoOPqJRxzxUcN91azaSNSOrA2P7Q2PreLEPurEPuqBvfSAA5ddTCy4XUzBRahZtSm4Lq0dH9obPuTAZRcTC24XU3ARalZtCq6RteGyb--4PDlKffCSJ0epDyGEmlhTQk0xQsl51ckIOjlQm1OLiKmdnKg-oBBqYlsJNYUKJedVp2CR9jSRCdF3e55QtLDyhFBT-8pLFErOq07SYg8VSaSKZMUKoab2lRcslJxXnaTFni1IZAuysgVZ2UKoiX0l1BQtlJxXnaIF7dmCRLYgK1sINfWZwcsWSs6rTtGC9mxBIlvQL1umb1_-BwAA__8Ry8HF

query T
SELECT url FROM [EXPLAIN (DISTSQL) (SELECT * FROM (SELECT a,b FROM data AS data1) LEFT OUTER JOIN (SELECT c,d FROM data AS data2 ORDER BY c,d) ON a=c and b=d ORDER BY a,b)]
----
https://cockroachdb.github.io/distsqlplan/decode.html#eJzEl0Fv2k4Qxe__T2HN6V9lkdmxTcBSJS6plKgNVUJPFQcHbwGJeK21kRpF-e4VEIQMYWc3I9lHBz_P88z89sWvUOhc3WfPqoL0N0gQgCAgAgExCEhgJqA0eq6qSpvtLXvBbf4X0r6AVVFu6u2fZwLm2ihIX6Fe1WsFKUyzp7V6UFmuTNgHAbmqs9V6V6Y0q-fMvIzzrM5AwGOZFVUa9EIZZEUeyEDXS2VAwGRTp8FYijHC7E2A3tTv5Y5Vnl6CZVYtm88_SGYCqjpbKEjlm_ic84TjPBLj-MT50RL6WHrUplYmlP3TF70SY7zidie6aOX4KG1yZVR-sb7znR-83Q9lFupOr4rtK550fPpSqjT4fvNtGkx-TW8egrvJ7T0IWKs_9f_vT_3y1awWy-NlY3WEfQzxJ8aATmM41kj4_f3AzL3u6TLEZr8uWRg0LEh3AKQLAKHshdgSvB7eBzzvHvgSpg74yhbwld3iO-gSX7cxoNMYLuGL7vuHTvuHvTBqiR0P79c87x7sEKYO7GAL7GC37Fx3yY7bGNBpDJfYidz3L3Lav6gXxi2x4-F9yPPuwQ5h6sBO1AI7UbfsDLtkx20M6DSGS-zE7vsXO-1f3AuTltjx8D7iefdghzB1YCdugZ24W3ZGXbLjNgZ0GoPLJ9cHNR5UVeqiUk5fUv1tO1W-UPthVXpj5uqn0fNdmf3lZKfb_T-aq6re_xrtL26L_U9bg-7iEUcsY5aaVRuJ2vJU3W-oG-L-qRg9Go5-4hFHfNJwXzWrNhK1I2vDY3vDY6s4sY86sY96YC894MBlFxMLbhdTcBFqVm0Krmtrx4f2hg85cNnFxILbxRRchJpVm4JrZG247Ns7Ls-OUh-85NlR6kMIoSbWlFBTjFByXnUygs4O1ObUImJqZyeqDyiEmthWQk2hQsl51SlYpD1NZEL03Z4nFC2sPCHU1L7yEoWS86qTtNhDRRKpIlmxQqipfeUFCyXnVSdpsWcLEtmCrGxBVrYQamJfCTVFCyXnVadoQXu2IJEtyMoWQk19ZvCyhZLzqlO0oD1bkMgW9MuW2dt__wIAAP__W3PBnQ==

query T
SELECT url FROM [EXPLAIN (DISTSQL) (SELECT * FROM (SELECT a,b FROM data AS data1) RIGHT OUTER JOIN (SELECT c,d FROM data AS data2 ORDER BY c,d) ON a=c and b=d ORDER BY a,b)]
----
https://cockroachdb.github.io/distsqlplan/decode.html#eJzEl0Fv2kAQhe_9FdacWmWR2bEhYKkSl6olUkNF6Kni4OAtIBGvtTZSoyj_vQKCkCHs7GYk--jg53memW9f_AK5ztR9-qRKSP6ABAEIAiIQEIOAHswFFEYvVFlqs7vlIBhn_yDpCljnxbba_XkuYKGNguQFqnW1UZDALH3cqKlKM2XCLgjIVJWuN_syhVk_peZ5lKVVCgIeijQvk6ATyiDNs0AGulopAwIm2yoJRlKMEOavAvS2eit3qvL4HKzSclV__lEyF1BW6VJBIl_Fx5z3OM4jMYrPnJ8soY-lB20qZULZPX_RGzHCG253oqtWTo_SJlNGZVfrO9_5ztv9VGap7vQ6373iWcdnz4VKgun4-49ZMPk9-zYN7ibjexCwUX-rz2-P_fLVrJer02Vtd4R9DvEH5oBOczjV6PEb_I6Ze93RRYj1hl2z0K9ZkO4ESBcCQtkJsSF6Pbz3ed49-CVMHfmVDfAr2-W33yq_bnNApzlc4xfdFxCdFhA7YdQQPB7eb3nePeAhTB3hwQbgwXbhuW0VHrc5oNMcrsETuS9g5LSAUSeMG4LHw_uA590DHsLUEZ6oAXiiduEZtAqP2xzQaQ7X4IndFzB2WsC4E_YagsfD-5Dn3QMewtQRnrgBeOJ24Rm2Co_bHNBpDi6fXe_UmKqy0HmpnL6murt-qmypDtMq9dYs1C-jF_syh8vJXrf_lzRTZXX4NTpcjPPDTzuD7uIhRyxjlppVG4na8lzdralr4u65GD0ajn7iIUd81nBfNas2ErUja8Nje8Njq7hnH3XPPuq-vXSfA5ddTCy4XUzBRahZtSm4bq0dH9gbPuDAZRcTC24XU3ARalZtCq6hteGya--4vDhKffCSF0epDyGEmlhTQk0xQsl51ckIujhQ61OLiKldnKg-oBBqYlsJNYUKJedVp2CR9jSRPaLv9jyhaGHlCaGm9pWXKJScV52kxR4qkkgVyYoVQk3tKy9YKDmvOkmLPVuQyBZkZQuysoVQE_tKqClaKDmvOkUL2rMFiWxBVrYQauozg5ctlJxXnaIF7dmCRLagX7bMXz_9DwAA__-3_cM8


# Nested merge joins should be planned on the same ordering
query TTTTT
EXPLAIN (VERBOSE) (SELECT a,b from data AS data3 NATURAL JOIN ((SELECT a,b FROM data AS data1) JOIN (SELECT c,d FROM data AS data2 ORDER BY c,d) ON a=c AND b=d))
----
render                         ·               ·                                    (a, b)                                                                          a!=NULL; b!=NULL
 │                             render 0        data3.a                              ·                                                                               ·
 │                             render 1        data3.b                              ·                                                                               ·
 └── merge-join                ·               ·                                    (a, b, c[omitted], d[omitted], a[omitted], b[omitted], c[omitted], d[omitted])  a=c=a=c; b=d=b=d; a!=NULL; b!=NULL
      │                        type            inner                                ·                                                                               ·
      │                        equality        (a, b, c, d) = (a, b, c, d)          ·                                                                               ·
      │                        mergeJoinOrder  +"(a=a)",+"(b=b)",+"(c=c)",+"(d=d)"  ·                                                                               ·
      ├── scan                 ·               ·                                    (a, b, c, d)                                                                    a!=NULL; b!=NULL; c!=NULL; d!=NULL; key(a,b,c,d); +a,+b,+c,+d
      │                        table           data@primary                         ·                                                                               ·
      │                        spans           ALL                                  ·                                                                               ·
      └── merge-join           ·               ·                                    (a, b, c, d)                                                                    a=c; b=d; a!=NULL; b!=NULL; +a,+b
           │                   type            inner                                ·                                                                               ·
           │                   equality        (a, b) = (c, d)                      ·                                                                               ·
           │                   mergeJoinOrder  +"(a=c)",+"(b=d)"                    ·                                                                               ·
           ├── render          ·               ·                                    (a, b)                                                                          a!=NULL; b!=NULL; +a,+b
           │    │              render 0        data1.a                              ·                                                                               ·
           │    │              render 1        data1.b                              ·                                                                               ·
           │    └── scan       ·               ·                                    (a, b, c[omitted], d[omitted])                                                  a!=NULL; b!=NULL; c!=NULL; d!=NULL; key(a,b,c,d); +a,+b
           │                   table           data@primary                         ·                                                                               ·
           │                   spans           ALL                                  ·                                                                               ·
           └── sort            ·               ·                                    (c, d)                                                                          c!=NULL; d!=NULL; +c,+d
                │              order           +c,+d                                ·                                                                               ·
                └── render     ·               ·                                    (c, d)                                                                          c!=NULL; d!=NULL
                     │         render 0        data2.c                              ·                                                                               ·
                     │         render 1        data2.d                              ·                                                                               ·
                     └── scan  ·               ·                                    (a[omitted], b[omitted], c, d)                                                  a!=NULL; b!=NULL; c!=NULL; d!=NULL; key(a,b,c,d)
·                              table           data@primary                         ·                                                                               ·
·                              spans           ALL                                  ·                                                                               ·

query T
SELECT url FROM [EXPLAIN (DISTSQL) (SELECT * FROM (SELECT a,b from data AS data3 NATURAL JOIN ((SELECT a,b FROM data AS data1) JOIN (SELECT c,d FROM data AS data2 ORDER BY c,d) ON a=c AND b=d)))]
----
https://cockroachdb.github.io/distsqlplan/decode.html#eJzMmF9vokoYxu_PpzBzdU46BmYA_yUn4bYnOe2m3buNF1Rm1cSCAUy2afzuG7WuBez78A5BvbT6Yx7enfnxLO8iSWPzEL2aXEx-CCWk0EIKT0jhCykCMZVinaUzk-dptvvJAbiPf4mJK8UyWW-K3Z-nUszSzIjJuyiWxcqIifgevazMk4likzmukCI2RbRc7ZdZZ8vXKHsL46iIhBTP6yjJJ72-o3pREvdULy0WJhPTrRTppvhY4XThl7feIsoX5UuGSoZahp4MfTHdTqXIi2huxERtpV3kwCayFI-bYtLbh7HIX0qubZMrq2kfo39M8HP0UyaPk-k5zYpdnKB6p3cy1Hdtx-N_GeV0qTSLTWbiL9dv_Mszd_e_yebmv3SZmMzRlYmvzM_i7w_6n3-z5Xxx-ljaI_LcuC13etByIDL07mToMwbziUADCr4e0PEqlUH9-TN1qE53P2hw95vk3N2cDf-Q9tO147mVX55fe1haWzFOapOD6qi-o7sWIyP0wC50d2rkDNxy4hZyBKmOchxcQI7qunJUNydH_kA6lePgsnLUzc-LbnRcdN_xuhYUI_TQLnR3gmJkV5YTtxAUSHUU1PACgtLXFZS-OUHxB9KpoIaXFZTX_Lx4jY6L13f8rgXFCD2yC92doBjZleXELQQFUh0FNbqAoLzrCsq7OUHxB9KpoEaXFZTf_Lz4jY6L33eCrgXFCD22C92doBjZleXELQQFUh0FNb6AoPzrCsq_OUHxB9KpoMbXe_91JtqTyddpkptGb7fc3c2ZeG4Oo8zTTTYz37J0tl_m8PFxz-3_Yx2bvDh8Gxw-3CeHr3YBm8NKt6JHbWjtt6E9l6YVSYOlaVipVvSwDa29VvSYpnWVdksjL8FuFfYYE9c8uDJxLj1sQ1cmzqXHNO0zzjYTrpxtLj1qQ2vwz03TlbNdowNymw7oPT6g97iiN_mwjYtpGLkY0MDFNI1cTNPIxaM2LqZh5GJAAxfTNHIxoIGLx-Q-VS69TxX99ATHE9BIxwgHPgY4EjLCgZEV_QgFSgY0cjLCgZQBjqwMcKRlRdcH4GVFP0iBWgGN3IpwIFeAI7sCHFZd-mmKFgc9AJVdgKO2C3oEqrsAB45VdJNQAyDZWpdgSZamoWQBjiRL41CyAEeS5fQoLg0ly2pSXBxKltWl6nitVbAkW2sVLMnSNJQswJFkaRxKlsaRZDWnUHFpJFmEA8kCHEkW4eilQq1VlHas1rRkda1VcCQLaCRZhAPJAhxJFuFAsprTqLg0kizCgWQBjiQLcCRZXasVHMnqWqvgSBbQSLIIB5IFOJIswKFkOYWKS0PJsgoVF4eSZRWqOl5rFWXJjoBkOa9o6seF9Y6GjSPJst7SsHEkWU6j4tJQsqxGxcWhZFmNqv7ivFYrSMlOt3_9DgAA__8D4IyZ


# Test that the distSQL MergeJoiner follows SQL NULL semantics for ON predicate equivilance.
# The use of sorts here force

statement ok
CREATE TABLE distsql_mj_test (k INT, v INT)

query T
SELECT url FROM [EXPLAIN (DISTSQL) (SELECT l.k, r.k FROM (SELECT * FROM distsql_mj_test ORDER BY k) l INNER JOIN (SELECT * FROM distsql_mj_test ORDER BY k) r ON l.k = r.k)]
----
https://cockroachdb.github.io/distsqlplan/decode.html#eJy0ks1q6zAQhff3KcKsbomCLcfOwlDwNoUmJemuhOBaU9fFkdyRDC0h715sLRKbWvmB7qTRfGfOEbMHqQQu0h1qiF-AA4MINgwqUhlqragp26a5-ILYZ1DIqjZNecMgU4QQ78EUpkSIYaEmqvIiYCDQpEXZth0YqNocIW3SHCGeHdiJMHcLP6evJa4wFUie35GHiopdSt-JKLTRn-V297E1qA0wWFep1PFoAgyWtYlHCYchM_waM2tFBsnjXR8JHw_KB7dmDf4g6_SGrNPLs4aD8kfVWioSSCj6m3K-5RePj0g5PqhCInlh12iJb-Z_wsd391Tk7_Z4_CKWBIMxok6MM3u_Ql0pqfGixfebDChytH-iVU0ZPpHK2jH2umy5tiBQG_s6s5e5tE-NwVOYO-HADQdOOOrAvA9PnXDonhxeMTnow5ET9nuTN4d_PwEAAP__4zqgpw==
