github.com/cockroachdb/cockroach@v20.2.0-alpha.1+incompatible/pkg/sql/opt/exec/execbuilder/testdata/distsql_join (about)

     1  # LogicTest: 5node
     2  
     3  statement ok
     4  CREATE TABLE data (a INT, b INT, c INT, d INT, PRIMARY KEY (a, b, c, d))
     5  
     6  # Split into ten parts.
     7  statement ok
     8  ALTER TABLE data SPLIT AT SELECT i FROM generate_series(1, 9) AS g(i)
     9  
    10  # Relocate the ten parts to the five nodes.
    11  statement ok
    12  ALTER TABLE data EXPERIMENTAL_RELOCATE
    13    SELECT ARRAY[i%5+1], i FROM generate_series(0, 9) AS g(i)
    14  
    15  # Verify data placement.
    16  query TTTI colnames,rowsort
    17  SELECT start_key, end_key, replicas, lease_holder from [SHOW RANGES FROM TABLE data]
    18  ----
    19  start_key  end_key  replicas  lease_holder
    20  NULL       /1       {1}       1
    21  /1         /2       {2}       2
    22  /2         /3       {3}       3
    23  /3         /4       {4}       4
    24  /4         /5       {5}       5
    25  /5         /6       {1}       1
    26  /6         /7       {2}       2
    27  /7         /8       {3}       3
    28  /8         /9       {4}       4
    29  /9         NULL     {5}       5
    30  
    31  # ensure merge joins are planned when there's orderings.
    32  query TTTTT
    33  EXPLAIN (VERBOSE) (SELECT * FROM (SELECT a,b FROM data) NATURAL JOIN (SELECT a,b FROM data AS data2))
    34  ----
    35  ·                distributed     true               ·             ·
    36  ·                vectorized      true               ·             ·
    37  render           ·               ·                  (a, b)        ·
    38   │               render 0        a                  ·             ·
    39   │               render 1        b                  ·             ·
    40   └── merge-join  ·               ·                  (a, b, a, b)  ·
    41        │          type            inner              ·             ·
    42        │          equality        (a, b) = (a, b)    ·             ·
    43        │          mergeJoinOrder  +"(a=a)",+"(b=b)"  ·             ·
    44        ├── scan   ·               ·                  (a, b)        +a,+b
    45        │          table           data@primary       ·             ·
    46        │          spans           FULL SCAN          ·             ·
    47        └── scan   ·               ·                  (a, b)        +a,+b
    48  ·                table           data@primary       ·             ·
    49  ·                spans           FULL SCAN          ·             ·
    50  
    51  # TODO(radu): enable these tests when joins pass through orderings on equality
    52  # columns.
    53  #
    54  # # ORDER BY on the mergeJoinOrder columns should not require a SORT node
    55  # query TTTTT
    56  # 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)
    57  # ----
    58  # join                 ·               ·                  (a, b, c, d)                    a=c; b=d; a!=NULL; b!=NULL; +a,+b
    59  #  │                   type            inner              ·                               ·
    60  #  │                   equality        (a, b) = (c, d)    ·                               ·
    61  #  │                   mergeJoinOrder  +"(a=c)",+"(b=d)"  ·                               ·
    62  #  ├── render          ·               ·                  (a, b)                          a!=NULL; b!=NULL; +a,+b
    63  #  │    │              render 0        data1.a            ·                               ·
    64  #  │    │              render 1        data1.b            ·                               ·
    65  #  │    └── scan       ·               ·                  (a, b, c[omitted], d[omitted])  a!=NULL; b!=NULL; c!=NULL; d!=NULL; key(a,b,c,d); +a,+b
    66  #  │                   table           data@primary       ·                               ·
    67  #  │                   spans           ALL                ·                               ·
    68  #  └── sort            ·               ·                  (c, d)                          c!=NULL; d!=NULL; +c,+d
    69  #       │              order           +c,+d              ·                               ·
    70  #       └── render     ·               ·                  (c, d)                          c!=NULL; d!=NULL
    71  #            │         render 0        data2.c            ·                               ·
    72  #            │         render 1        data2.d            ·                               ·
    73  #            └── scan  ·               ·                  (a[omitted], b[omitted], c, d)  a!=NULL; b!=NULL; c!=NULL; d!=NULL; key(a,b,c,d)
    74  # ·                    table           data@primary       ·                               ·
    75  # ·                    spans           ALL                ·                               ·
    76  # 
    77  # query T
    78  # 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)]
    79  # ----
    80  # https://cockroachdb.github.io/distsqlplan/decode.html#eJzElk9v2kwQxu_vp4jm9FbZCu_a_LNUiWsqNanS3ioODt6CJcKitZEaRXz3ChyEbMM-ni6yjwR-3tmZ3-TxO21Mqh-TV51T_IskCVIkKCRBEQka0lzQ1pqFznNjDz8pgYf0D8WBoGyz3RWHP88FLYzVFL9TkRVrTTH9TF7W-lknqbaDgASlukiy9fGYrc1eE_s2S5MiIUFPuyK-m0kxUzTfCzK74uOp54e9vN2tknxVfcwJmQvKi2SpKZZ78W8FDlsUGIpZVCvwfLLinPzD2ELbgQzq97kXM3Xv24TwainnRxmbaqvTq-e3_uWF233Tdqm_mmxzuGKtsWv9u_j_g_70xWbL1fljxQThbnfkf8cLlT-az2Y7UNWxXCthWClBtndN9rIMjAJHt10GcPJpGWQHyyD7XYZRF8ug2g9a9WIio8DxbU0EJ59MVB2YqPo1cdyFiWH7QYe9mMgocHJbE8HJJxPDDkwM-zVx0oWJUftBR72YyChwelsTwcknE6MOTIz6NXHa9avqhYKedb41m1y3egMNDlfS6VKXDcvNzi70d2sWx2PKj09H7vjmk-q8KL8Nyw8Pm_KrQ4Ht4YkPLJUXPfKhVeCmZZ0OKnQFDuqwYjRc8eCJD1xrOJce-dC1hjfo0NnwyD2tyD0t6R7X0Gc_3DDYDzeM9gPQYD_cNNqPkbPjY3fDxz774YbBfrhhtB-ABvvhptF-THz2Y-pjuBsGhrthZDiggeFuGiZAI0AqHZfgn4psJAhHckADywGNNEc48BzgSHTZyBGO6bKRIxzVAQ1cBzSSHeHAdoBD3d0ZKodAd06INmfOSVEuDXVn5SgXh7q7kxTpzolSLo10Z4UpG0e6s-K0ibvzVE6B7pxEbc6cE6lcGurOClUujnRX7lSt6z7f__c3AAD__68_ThQ=
    81  # 
    82  # # ORDER BY on the columns equal to the mergeJoinOrder columns should not
    83  # # require a terminal SORT node.
    84  # query TTTTT
    85  # 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)
    86  # ----
    87  # join                 ·               ·                  (a, b, c, d)                    a=c; b=d; a!=NULL; b!=NULL; +a,+b
    88  #  │                   type            inner              ·                               ·
    89  #  │                   equality        (a, b) = (c, d)    ·                               ·
    90  #  │                   mergeJoinOrder  +"(a=c)",+"(b=d)"  ·                               ·
    91  #  ├── render          ·               ·                  (a, b)                          a!=NULL; b!=NULL; +a,+b
    92  #  │    │              render 0        data1.a            ·                               ·
    93  #  │    │              render 1        data1.b            ·                               ·
    94  #  │    └── scan       ·               ·                  (a, b, c[omitted], d[omitted])  a!=NULL; b!=NULL; c!=NULL; d!=NULL; key(a,b,c,d); +a,+b
    95  #  │                   table           data@primary       ·                               ·
    96  #  │                   spans           ALL                ·                               ·
    97  #  └── sort            ·               ·                  (c, d)                          c!=NULL; d!=NULL; +c,+d
    98  #       │              order           +c,+d              ·                               ·
    99  #       └── render     ·               ·                  (c, d)                          c!=NULL; d!=NULL
   100  #            │         render 0        data2.c            ·                               ·
   101  #            │         render 1        data2.d            ·                               ·
   102  #            └── scan  ·               ·                  (a[omitted], b[omitted], c, d)  a!=NULL; b!=NULL; c!=NULL; d!=NULL; key(a,b,c,d)
   103  # ·                    table           data@primary       ·                               ·
   104  # ·                    spans           ALL                ·                               ·
   105  # 
   106  # query T
   107  # 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)]
   108  # ----
   109  # https://cockroachdb.github.io/distsqlplan/decode.html#eJzElk9v2kwQxu_vp4jm9FbZCu_a_LNUiWsqNanS3ioODt6CJcKitZEaRXz3ChyEbMM-ni6yjwR-3tmZ3-TxO21Mqh-TV51T_IskCVIkKCRBEQka0lzQ1pqFznNjDz8pgYf0D8WBoGyz3RWHP88FLYzVFL9TkRVrTTH9TF7W-lknqbaDgASlukiy9fGYrc1eE_s2S5MiIUFPuyK-m0kxUzTfCzK74uOp54e9vN2tknxVfcwJmQvKi2SpKZZ78W8FDlsUGIpZVCvwfLLinPzD2ELbgQzq97kXM3Xv24TwainnRxmbaqvTq-e3_uWF233Tdqm_mmxzuGKtsWv9u_j_g_70xWbL1fljxQThbnfkf8cLlT-az2Y7UNWxXCthWClBtndN9rIMjAJHt10GcPJpGWQHyyD7XYZRF8ug2g9a9WIio8DxbU0EJ59MVB2YqPo1cdyFiWH7QYe9mMgocHJbE8HJJxPDDkwM-zVx0oWJUftBR72YyChwelsTwcknE6MOTIz6NXHa9avqhYKedb41m1y3egMNDlfS6VKXDcvNzi70d2sWx2PKj09H7vjmk-q8KL8Nyw8Pm_KrQ4Ht4YkPLJUXPfKhVeCmZZ0OKnQFDuqwYjRc8eCJD1xrOJce-dC1hjfo0NnwyD2tyD0t6R7X0Gc_3DDYDzeM9gPQYD_cNNqPkbPjY3fDxz774YbBfrhhtB-ABvvhptF-THz2Y-pjuBsGhrthZDiggeFuGiZAI0AqHZfgn4psJAhHckADywGNNEc48BzgSHTZyBGO6bKRIxzVAQ1cBzSSHeHAdoBD3d0ZKodAd06INmfOSVEuDXVn5SgXh7q7kxTpzolSLo10Z4UpG0e6s-K0ibvzVE6B7pxEbc6cE6lcGurOClUujnRX7lSt6z7f__c3AAD__68_ThQ=
   110  
   111  # ORDER BY on a different ordering should require a terminal SORT NODE.
   112  query TTTTT
   113  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)
   114  ----
   115  ·               distributed  true             ·             ·
   116  ·               vectorized   true             ·             ·
   117  sort            ·            ·                (a, b, c, d)  +b,+a
   118   │              order        +b,+a            ·             ·
   119   └── hash-join  ·            ·                (a, b, c, d)  ·
   120        │         type         inner            ·             ·
   121        │         equality     (a, b) = (c, d)  ·             ·
   122        ├── scan  ·            ·                (a, b)        ·
   123        │         table        data@primary     ·             ·
   124        │         spans        FULL SCAN        ·             ·
   125        └── scan  ·            ·                (c, d)        ·
   126  ·               table        data@primary     ·             ·
   127  ·               spans        FULL SCAN        ·             ·
   128  
   129  query T
   130  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)]
   131  ----
   132  https://cockroachdb.github.io/distsqlplan/decode.html#eJy8ll1v-jYUh-_3KaxzBatRsBPeIlWiW5lG1UEHvdhUcWGIV5Bowpwgrar63aeERm0I9Yn_hlxVCX7iX3ye05M3iP_dgg_z0f3o10eyV1vy22z6B3ka_fVwfzOekMbteP44__O-SRofa34-rMgvBSXLw51AJILczLO_rEnupin-sWpFSVBexcl0djuakV_-zhY0yXRCGoJck1WT3ExuSWNJrrPb-aolJaK5AAphFMiJeJEx-E_AgAIHCi5Q8IBCBxYUdipayTiOVLrkLQPGwX_gtylswt0-SW8vKKwiJcF_g2STbCX48CiWWzmTIpDKaQOFQCZis8222anNi1CvwzQ5UJjvRBj7pOUwIsKAMBIla6mAwnSf-GTI6JDD4p1CtE8-tvvcZflK1iJeF5-fIwsKcSKeJfjsnf5Y8o5NcpcOPdvk_Nvkn4_ah5EKpJJB4WGLlMSWnHj930W8vos2oVQOOyrcVv6TNLKMzWu1eV7nF4Va0VPv_flCrkkp5pFK0hxHZRjyKzpkV9_u4VU4tFPn8eXBJ8JMola0c3j7-JRPRugUIrDqxrEqxjms5fCausUge9cu-_n7hdXcL-zS_YIUI--Xrk2_8OoF55UKzluOW5OsBtl7dtnPLyuvWVZ-aVmRYuSy9mxkdasX3K1UcLfleDXJapC9b5f9_LK6NcvqXlpWpBi5rH0bWb3qBfcqFdxrOZ2aZDXIPrDLfn5ZvZpl9S4tK1KMXNbBuT6bT-wxk_EuCmNZ6Wu4nZ6YDJ7loQJxtFcr-aCiVbbN4XKacdknTiDj5PArP1yMw8NPacDqcM8GZsyK7ljRAz3NDM6Mm8E9G_jozEzpjhU90NP8mG5_pd0C3D6GXS3s6avlaWHO9Ft3bPpDDyP9oYex_kBopD8QGumPrk1_6GGkP_Qw1h8IjfQHQiP90dNa2tdL2rfpj4GN4XoYMVwPY4YjNGI4QmMTwGRslv-TmsxNUxodAkaT0xhHNGelKVJQlXG96Ew_RhDTWWmOmKiO0IjrCI3JjuGI7RiO6V6aoUa662lMdz2N6o7gmO4IjuleGqRF3buI7qWZYqR7aaYY6a6nMd31NKo7gmO6Izime2meGumupzHd9TSqO4JjuiM4pntpqha_tdt63Xlptmh1X7z_9H8AAAD__xwOvEs=
   133  
   134  # TODO(radu): rework these tests (the inner ORDER BY aren't useful anymore).
   135  #
   136  # # Merge joins should be planned for (FULL|LEFT|RIGHT) OUTER joins
   137  # 
   138  # query T
   139  # 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)]
   140  # ----
   141  # https://cockroachdb.github.io/distsqlplan/decode.html#eJzEl0Fv2kAQhe_9FWhOrbJVvGNDwFIlLq2UKA1VmpwqDg7eEiTCorWRGkX57xUQhAxh3zqD8NHBb994Zj6_-IVmNjc32ZMpKP1DmhQxKYpJUUKK2jRUNHd2ZIrCuuUta8Fl_o_SSNFkNl-Uyz8PFY2sM5S-UDkpp4ZSussepubWZLlx5xEpyk2ZTaYrm7mbPGXuuZ9nZUaKBosybfW16jMNXxXZRfl26vawh-fWY1Y8Vo_ZSIaKijIbG0r1q_pYge2AAmPVT3YK3DpzHeff1pXGneto93nOVJ_PpE2ID5ayPcq63DiTH_QPvvOdp_tp3Nhc2cls-Yg7jb17npu09eP--ro1uL_7ftu6GlzekKKp-Vt-fjv1yzc3GT9uLysbovxjSD4wBg4aw9ajLe_vO8Xc2K92fs7Vfh0qoVMpQYfvuW4ExBoFdo4LInDegKhPAKJuFsROkyCGjYGDxnAIRA5fMm6EghoFXhyXAuC8oYBPQAE3S8FFkxSEjYGDxnCIgjh8yeJGKKhRYPe4FADnDQXxCSiIm6Wg2yQFYWPgoDEcoiAJX7KkEQpqFNg7LgXAeUNBcgIKkmYp6DVJQdgYOGgMIZ8m73jcmmJuZ4UJ-uKIlu00-dish1XYhRuZX86OVjbry8FKt_pvLzdFuf41Xl9cztY_LQsMF_ckYp2I1CJvBt56Vx1V1BVxtCvmGg3neuKeRLzT8LpqkTcD79jb8MTf8MQrbvtH3faPuuO37kjg8ovBgvvFCC6gFnkjuC68He_6G96VwOUXgwX3ixFcQC3yRnD1vA3Xkb_jeu9VWgcvvfcqrUMIUIM1BWrECJLL3GEE7b1Qq1OLwdT23qh1QAFqsK1AjVBBcpk7gkX700S3Qd_9eYJoEeUJUKN9lSUKksvcIS3-UNEgVbQoVoAa7assWJBc5g5p8WcLg2xhUbawKFuAGuwrUCNakFzmjmhhf7YwyBYWZQtQo88MWbYgucwd0cL-bGGQLVwvW4avn_4HAAD__9-kdhE=
   142  # 
   143  # query T
   144  # 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)]
   145  # ----
   146  # https://cockroachdb.github.io/distsqlplan/decode.html#eJzEl0Fv2k4Qxe__T4Hm9K-yVbxjQ8BSJS6plKgNVUpPFQcHbwkSYdHaSI2ifPcKCEKGsG-dQfjo4LdvPDM_v_iF5jY3d9mTKSj9TZoUMSmKSVFCito0UrRwdmyKwrrVLRvBTf6X0kjRdL5Ylqs_jxSNrTOUvlA5LWeGUhpmDzNzb7LcuMuIFOWmzKaztc3CTZ8y99zPszIjRYNlmbb6WvWZRq-K7LJ8O3V32MNz6zErHqvHbCUjRUWZTQyl-lV9rMB2QIGx6id7Be6cuY7zT-tK4y51tP88F6rPF9ImxEdL2R1lXW6cyY_6B9_5ztN9N25ibu10vnrEvcYOnxcmbX27_jpsDX4Nr-9bt4ObO1I0M3_K_99O_fTFTSePu8vKhij_GJIPjIGDxrDzaMv7-04xd_azXVxytV_HSuhUStDhe64bAbFGgZ3TggictyDqM4ComwWx0ySIYWPgoDEcA5HDl4wboaBGgVenpQA4byngM1DAzVJw1SQFYWPgoDEcoyAOX7K4EQpqFNg9LQXAeUtBfAYK4mYp6DZJQdgYOGgMxyhIwpcsaYSCGgX2TksBcN5SkJyBgqRZCnpNUhA2Bg4aQ8inyTse96ZY2Hlhgr44olU7TT4xm2EVdunG5oez47XN5nKw1q3_28tNUW5-jTcXN_PNT6sCw8U9iVgnIrXIm4G33ldHFXVFHO2LuUbDuZ64JxHvNbyuWuTNwDv2NjzxNzzxitv-Ubf9o-74rTsSuPxisOB-MYILqEXeCK4rb8e7_oZ3JXD5xWDB_WIEF1CLvBFcPW_DdeTvuD54ldbBSx-8SusQAtRgTYEaMYLkMncYQQcv1OrUYjC1gzdqHVCAGmwrUCNUkFzmjmDR_jTRbdB3f54gWkR5AtRoX2WJguQyd0iLP1Q0SBUtihWgRvsqCxYkl7lDWvzZwiBbWJQtLMoWoAb7CtSIFiSXuSNa2J8tDLKFRdkC1OgzQ5YtSC5zR7SwP1sYZAvXy5bR63__AgAA__86O3Xp
   147  # 
   148  # query T
   149  # 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)]
   150  # ----
   151  # https://cockroachdb.github.io/distsqlplan/decode.html#eJzEl0Fv2kAQhe_9FWhOrbJV2LEhYKkSl6olUkNF6ani4OAtQSIsWhupUZT_XgFByBD2rTMIHx389o1n5vOLn2lhM3OXPpqckj-kSRGToogUxaSoRWNFS2cnJs-tW9-yFfSzf5Q0Fc0Wy1Wx_vNY0cQ6Q8kzFbNibiihUXo_N0OTZsZdN0lRZop0Nt_YLN3sMXVPvSwtUlI0WBVJo6dVj2n8osiuitdT94fdPzUe0vyhfMxOMlaUF-nUUKJf1PsKbAUUGKlefFDg3pmrOP-yrjDuWjcPn-dK9fhK2oToZCn7o6zLjDPZSf_gO994uh_GTc2tnS3Wj3jQ2NHT0iSNYf_b91Fj8Hv0ddi4HfTvSNHc_C0-vh776YubTR_2l6UVUf45xO-YAwfNYe_Rkjf4jWLu7Ge7vOZyw06V0C6VoMMXXddCYoUC2-clETjvSNQXIFHXS2K7VhLD5sBBczhFIodvGdeCQYUCb86LAXDeYcAXwIDrxeCmVgzC5sBBcziFQRS-ZVEtGFQosHNeDIDzDoPoAhhE9WLQqRWDsDlw0BxOYRCHb1lcCwYVCuyeFwPgvMMgvgAGcb0YdGvFIGwOHDSHkM-TNzyGJl_aRW6Cvjqa636abGq208rtyk3MT2cnG5vt5WCj2_zDl5m82P4abS_6i-1P6wLDxV2JWMcitcibgbc-VDdL6pK4eSjmCg3nauKuRHzQ8KpqkTcD78jb8Njf8NgrbvlH3fKPuu23bkvg8ovBgvvFCC6gFnkjuG68He_4G96RwOUXgwX3ixFcQC3yRnB1vQ3XTX_H9dGrtApe-uhVWoUQoAZrCtSIESSXucMIOnqhlqcWgakdvVGrgALUYFuBGqGC5DJ3BIv2p4lugb778wTRIsoToEb7KksUJJe5Q1r8oaJBqmhRrAA12ldZsCC5zB3S4s8WBtnComxhUbYANdhXoEa0ILnMHdHC_mxhkC0syhagRp8ZsmxBcpk7ooX92cIgW7hatoxfPvwPAAD__wYqd4g=
   152  #
   153  #
   154  ## Nested merge joins should be planned on the same ordering
   155  # query TTTTT
   156  # 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))
   157  # ----
   158  # render                         ·               ·                                    (a, b)                                                                          a!=NULL; b!=NULL
   159  #  │                             render 0        data3.a                              ·                                                                               ·
   160  #  │                             render 1        data3.b                              ·                                                                               ·
   161  #  └── 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
   162  #       │                        type            inner                                ·                                                                               ·
   163  #       │                        equality        (a, b, c, d) = (a, b, c, d)          ·                                                                               ·
   164  #       │                        mergeJoinOrder  +"(a=a)",+"(b=b)",+"(c=c)",+"(d=d)"  ·                                                                               ·
   165  #       ├── scan                 ·               ·                                    (a, b, c, d)                                                                    a!=NULL; b!=NULL; c!=NULL; d!=NULL; key(a,b,c,d); +a,+b,+c,+d
   166  #       │                        table           data@primary                         ·                                                                               ·
   167  #       │                        spans           ALL                                  ·                                                                               ·
   168  #       └── join                 ·               ·                                    (a, b, c, d)                                                                    a=c; b=d; a!=NULL; b!=NULL; +a,+b
   169  #            │                   type            inner                                ·                                                                               ·
   170  #            │                   equality        (a, b) = (c, d)                      ·                                                                               ·
   171  #            │                   mergeJoinOrder  +"(a=c)",+"(b=d)"                    ·                                                                               ·
   172  #            ├── render          ·               ·                                    (a, b)                                                                          a!=NULL; b!=NULL; +a,+b
   173  #            │    │              render 0        data1.a                              ·                                                                               ·
   174  #            │    │              render 1        data1.b                              ·                                                                               ·
   175  #            │    └── scan       ·               ·                                    (a, b, c[omitted], d[omitted])                                                  a!=NULL; b!=NULL; c!=NULL; d!=NULL; key(a,b,c,d); +a,+b
   176  #            │                   table           data@primary                         ·                                                                               ·
   177  #            │                   spans           ALL                                  ·                                                                               ·
   178  #            └── sort            ·               ·                                    (c, d)                                                                          c!=NULL; d!=NULL; +c,+d
   179  #                 │              order           +c,+d                                ·                                                                               ·
   180  #                 └── render     ·               ·                                    (c, d)                                                                          c!=NULL; d!=NULL
   181  #                      │         render 0        data2.c                              ·                                                                               ·
   182  #                      │         render 1        data2.d                              ·                                                                               ·
   183  #                      └── scan  ·               ·                                    (a[omitted], b[omitted], c, d)                                                  a!=NULL; b!=NULL; c!=NULL; d!=NULL; key(a,b,c,d)
   184  # ·                              table           data@primary                         ·                                                                               ·
   185  # ·                              spans           ALL                                  ·                                                                               ·
   186  # 
   187  # query T
   188  # 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)))]
   189  # ----
   190  # https://cockroachdb.github.io/distsqlplan/decode.html#eJzMmE1v2kwQx-_Pp4jm9FTZKt61eZUq-ZpKTaq0t4qDg7cEiWBkG6lRxHevgFBiL5m_xxY2R15-zOxk9-d_9pWWSWzvomeb0fgXaVJkSJFPigJS1KOJolWaTG2WJen2K3vgNv5DY0_RfLla59u3J4qmSWpp_Er5PF9YGtPP6HFhH2wU2_TGI0WxzaP5Yldmlc6fo_QljKM8oslGUbLO337oyD--XD1F2VORDLUKjQp9FQY02UwUZXk0szTWG1Wvsx7TmaL7dT6-2tWs0WahQVO3Qc3N7tDh2zzed3gs7UtK_0jSfFu1V17QtQrNddMpBB-2cvypJI1tauMP61f-5onVfbPpzH5N5kub3pjSYBf2d_7_G_3pSzqfPR1fFraCOjXumvu213AgKvSvVRgIBvOOQAPqfTygw6-UBvXvbe7sHFffr7D69fLUak42f5d8TlY3vlf65unag0JtLTiQ7bpM0Fm_E5dJRsfNrobLQOmDy_otuEx36zJ9cS6TD-SsLuu36zJT_VCYdn0i6GzQiU8EDWpudjV8AkoffDJowSemW5-Yi_OJfCBn9cmgXZ_41Q-F365PBJ0NO_GJoEHNza6GT0Dpg0-GLfjE79Yn_sX5RD6Qs_pk2K5PguqHImjXJ4LORp34RNCg5mZXwyeg9MEnoxZ8EnTrk-DifCIfyFl9Muru7uZEaw82WyXLzFa6mfG2i7PxzO5HmSXrdGq_p8l0V2b_8n7H7f7LjG2W7z_t7V_cLvcfbRusDmvTiB42oU3QhPY9ntYsDUrzsNaN6EET2viN6BFPmzLtFUZegL0y7AsmbmRwaeJSetCELk1cSo94OhCcbSFcOttSetiENuDPzdOls-3QPXab9vk93uf3uOY3-aCJi3kYuRjQwMU8jVzM08jFwyYu5mHkYkADF_M0cjGggYtH7D7VHr9PNf_0BMcT0EjHCAc-BjgSMsKBkTX_CAVKBjRyMsKBlAGOrAxwpGXNxwfgZc0_SIFaAY3cinAgV4AjuwIcRl3-aYqKgxyAwi7AUdoFOQLFXYADx2o-Seg-kKyTJUSS5WkoWYAjyfI4lCzAkWQlOUpKQ8mKkpQUh5IVZSkXd1KFSLJOqhBJlqehZAGOJMvjULI8jiRrJIFKSiPJIhxIFuBIsghHlwpOqijsWGN4yRonVUgkC2gkWYQDyQIcSRbhQLJGkqikNJIswoFkAY4kC3AkWePEColkjZMqJJIFNJIswoFkAY4kC3AoWUmgktJQsqJAJcWhZEWBysWdVFGU7BBIVnJF4x4X0R2NGEeSFd3SiHEkWUmiktJQsqJEJcWhZEWJyr04d2IFK9nJ5r-_AQAA__9IVxsL
   191  # 
   192  # 
   193  # statement ok
   194  # CREATE TABLE distsql_mj_test (k INT, v INT)
   195  # 
   196  # query T
   197  # 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)]
   198  # ----
   199  # https://cockroachdb.github.io/distsqlplan/decode.html#eJyskk9Lw0AQxe9-CpmT0pVk06SHgJBrBVup3qSUmB3jSpqNsxtQSr-7JHtIE8z2D952Z-f35r1ldlAqgYt0ixriV-DAIII1g4pUhlorasq2aS6-IfYZyLKqTVNeM8gUIcQ7MNIUCDEs1J2qvAgYCDSpLNq2PQNVmw7SJs0R4tmeHQhzt_BL-lbgClOB5Pk9eahIblP6SYTURn8Vm-3nxqA2wGBZm_g64TDmgJ_j4FmRQfJ4f3jCJ6PywaUBg_8KOL0g4PT0gOGofKdal4oEEorhThxv-cPjI1KOD0qWSF7YN1rgu7lJ-OT2nmT-YY_dF7EkGI0R9WIc2fAV6kqVGk9acb_JgCJH-yda1ZThE6msHWOvy5ZrCwK1sa8ze5mX9qkxeAhzJxy44cAJRz2YD-GpEw7dk8MzJgdDOHLC_mDyen_1GwAA___yFZqv