# LogicTest: 5node

statement ok
CREATE TABLE kv (k INT PRIMARY KEY, v INT)

statement ok
INSERT INTO kv SELECT i, i FROM generate_series(1,5) AS g(i)

statement ok
CREATE TABLE kw (k INT PRIMARY KEY, w INT)

statement ok
INSERT INTO kw SELECT i, i FROM generate_series(1,5) AS g(i)

# Split into 5 parts, each row from each table goes to one node.
statement ok
ALTER TABLE kv SPLIT AT SELECT i FROM generate_series(1,5) AS g(i)

statement ok
ALTER TABLE kw SPLIT AT SELECT i FROM generate_series(1,5) AS g(i)

statement ok
ALTER TABLE kv EXPERIMENTAL_RELOCATE SELECT ARRAY[i], i FROM generate_series(1, 5) as g(i)

statement ok
ALTER TABLE kw EXPERIMENTAL_RELOCATE SELECT ARRAY[i], i FROM generate_series(1, 5) as g(i)

# Verify data placement.
query TTTI rowsort
SELECT start_key, end_key, replicas, lease_holder from [SHOW RANGES FROM TABLE kv WITH DETAILS]
ORDER BY 1
----
<before:/Table/72>  …/1/1                   {1}  1
…/1/1               …/1/2                   {1}  1
…/1/2               …/1/3                   {2}  2
…/1/3               …/1/4                   {3}  3
…/1/4               …/1/5                   {4}  4
…/1/5               <after:/Table/107/1/1>  {5}  5

# Verify data placement.
query TTTI rowsort
SELECT start_key, end_key, replicas, lease_holder from [SHOW RANGES FROM TABLE kw WITH DETAILS]
----
<before:/Table/106/1/5>  …/1/1         {5}  5
…/1/1                    …/1/2         {1}  1
…/1/2                    …/1/3         {2}  2
…/1/3                    …/1/4         {3}  3
…/1/4                    …/1/5         {4}  4
…/1/5                    <after:/Max>  {5}  5

# Verify that EXPLAIN ANALYZE (DISTSQL) works in a distributed setting.
query T
EXPLAIN ANALYZE (DISTSQL) SELECT count(*) FROM kv
----
planning time: 10µs
execution time: 100µs
distribution: <hidden>
vectorized: <hidden>
plan type: custom
rows decoded from KV: 5 (40 B, 10 KVs, 5 gRPC calls)
maximum memory usage: <hidden>
network usage: <hidden>
regions: <hidden>
isolation level: serializable
priority: normal
quality of service: regular
·
• group (scalar)
│ sql nodes: <hidden>
│ regions: <hidden>
│ actual row count: 1
│
└── • scan
      sql nodes: <hidden>
      kv nodes: <hidden>
      regions: <hidden>
      actual row count: 5
      KV time: 0µs
      KV contention time: 0µs
      KV rows decoded: 5
      KV pairs read: 10
      KV bytes read: 40 B
      KV gRPC calls: 5
      estimated max memory allocated: 0 B
      missing stats
      table: kv@kv_pkey
      spans: FULL SCAN
·
Diagram: https://cockroachdb.github.io/distsqlplan/decode.html#eJzsV81u4zYQvvcpiDklhQzrz47D07beLRC0SRa2d3sogoCRZrWEJVIlqdhu4MfqC_TJCklRKslrwUJd-FDrYICc0ceP33wj0i-gf4-BwvzDLx-mCxLITJiL7y_JT7P7W7J8BguEDPGOJaiB_gYOWOCCBR5Y4IMFI3iwIFUyQK2lylNeihduwjVQ2wIu0szk0w8WBFIh0Bcw3MQIFBbsKcYZshDV0AYLQjSMx8Uyy-d3y-fHdIkbsGAq4ywRmoIF85QJTclgmHP4-TPJl9KUCKccKoy4zBMMalNOGZ4gJfZff-pyHEhhUBguxU5IyZUmIQYyxJCSV8injUFNFLKQkgn5sZyMZh-nJGBxrN_yUsZVlZeTu_08nRJtMC0lJRe4NkMuzCUldrHbMgFxuS8hYWuSYCLVhrA4lgEzOS274PDETPAVNZGZSTNDSZ5f0K8mHHjYWlCOXuXXhkUI1KnV6-Y9UHtrHV6yH6JIYcSMVMNRs2LT-093i8fZ_a_zi0uwANcYZLsq_wvebov3aC_vf-hmQqoQFYYNrg_b7p05LTPOP90-3twtLt45_83OvNbOnGZJnMO7yOnVRUN3MPTOfXSkPnL6FK3mtvGJ-2jc4O0ebja3n9m8wdA_m-1IZnP7FK1mtqsTm-2qwds73GxeP7P5g-J8OpvtGGbz-hStZrbJic02afD2Dzeb389so8HZakeymt-nZDWrXZ_Yatd9LtEz1KkUGluX0m-vZLdWGjj57RXDCMurrpaZCvCjkkGRWw7vC6BiIkRtyqhTDm5EFdJGIUve_gPUkZxOJLeB5NSRRm0kt5tTH1JeJ5S_H8lpI_l9t8eKqoBAs5JqSWJmUASbNydV8yvGTdNjIWpUnMX8D7ZrwOq1wnQKA-TPVbNXoarjq1jZ9VU0Qa1Z1EiwDzR2XZ9xW59Rpz7j_Uq7baTxWem6Pldtfa469ZnsV9prI03OStf1mbT1ue7-ENn7pfZ3vo7dH9r_ndbX-ZH0JZarRx4CBfv1GXzjp3ogf4FFOj8X51_lqhBrsUnzU-0LizVacMuW-B4NqoQLrg0PgBqV4Xb73d8BAAD__2pJxf8=

query T
EXPLAIN ANALYZE (DISTSQL) SELECT * FROM kv JOIN kw ON kv.k = kw.k
----
planning time: 10µs
execution time: 100µs
distribution: <hidden>
vectorized: <hidden>
plan type: custom
rows decoded from KV: 10 (80 B, 20 KVs, 10 gRPC calls)
maximum memory usage: <hidden>
network usage: <hidden>
regions: <hidden>
isolation level: serializable
priority: normal
quality of service: regular
·
• merge join
│ sql nodes: <hidden>
│ regions: <hidden>
│ actual row count: 5
│ estimated max memory allocated: 0 B
│ estimated max sql temp disk usage: 0 B
│ equality: (k) = (k)
│ left cols are key
│ right cols are key
│
├── • scan
│     sql nodes: <hidden>
│     kv nodes: <hidden>
│     regions: <hidden>
│     actual row count: 5
│     KV time: 0µs
│     KV contention time: 0µs
│     KV rows decoded: 5
│     KV pairs read: 10
│     KV bytes read: 40 B
│     KV gRPC calls: 5
│     estimated max memory allocated: 0 B
│     missing stats
│     table: kv@kv_pkey
│     spans: FULL SCAN
│
└── • scan
      sql nodes: <hidden>
      kv nodes: <hidden>
      regions: <hidden>
      actual row count: 5
      KV time: 0µs
      KV contention time: 0µs
      KV rows decoded: 5
      KV pairs read: 10
      KV bytes read: 40 B
      KV gRPC calls: 5
      estimated max memory allocated: 0 B
      missing stats
      table: kw@kw_pkey
      spans: FULL SCAN
·
Diagram: https://cockroachdb.github.io/distsqlplan/decode.html#eJzsmt9um8gXx-9_TzGaq_ZXXHv4kz9IlaxNu1K6m6RKq96somoCJzYCMy4ztuON8lj7AvtkK6BOYmO8Pmg7WIAvosAMMOdzZr7znYEHKr9H1KWfP_z-4ewL-T_59frqgoRz8vHq_JKEC3J1ScL525C8I-HibUgNGgsfLvkEJHX_oIwa1KQGtahBbWpQh94YdJoID6QUSVrlIbvg3L-n7sCgQTydqfT0jUE9kQB1H6gKVATUpV_4bQTXwH1I-gNqUB8UD6LsMeF8GM6_TUNYUoOeiWg2iaVLQoPMqUE_T3l61OunDfntK0mfJ10Ss_wwgVEg0goKpMpPqWACLhn8_ZfMjz0RK4hVIOJCUSIWkvjgCR98l_y45e1SgSQJcN8lJ-SX_OTo-tMZ8XgUyad6Ux4kq3pp4y6-np0RqWBKPDGLFXkF96ofxOq1SwZZyHkFgLCswoTfkwlMRLIkPIqEx1XarEHWhluuvDFIImZqOlMuSetnzV-dYPTm0aD5UZ6aFfrbJRlzOV6HPkzr3xhUKj4C6rIXiT1_T93Bo1Ett0cbuV0Mw8W23C6ec9tnXXZ_bnbNjewelWb3-b4i8SEBf_O-b9KG7FVrS0e5gGQEH0UQQ9JnGyoQwZ16NWRvXr9LgtE4_5ca9CqNfsiMoWkMLWOYyhDcgzcrZnwX37RMfo-IgsmU-IEMyUzyEVTG_4zW2kDLykfOM4dZvI3bVmSXoiemfeaswypB8K9xOKVx2JtxOGtxsP0VgOHVvW_2-lanABr1nVXN7nEFfe-yq1nfj0uzq1HfWTP1fX3kmPuPHLOCLlq9vt2NHI26aFbN7kkFXeyyq1kXT0qzq1EXzWbq4vrIsfYfOVYFXbR7facbORp10aqa3dMKuthlV7MunpZmV6MuWs3UxfWRY-8_cuwKuuj0unGjURXtqrl18KrY6zPCY58wItQYki7PGvXRKc2zRn20m6mPNuZNwzXIqYglbOybbn_UYONRPZYyBn8EeeakmCUefEqEl9XND6-yG2VD3Qep8lIzPziPV0VScbVrI_Znsh3QLMQE-OTpTc3-oRyVhhKDWogkJBFXEHvLp1hW5xc8UOtR-iAhCXgU_MmLCFaXZW1PwINgnjF4UbTSlqeyDMCqdAIy5bJ5MZYPQwI6rRkQ2wHo5D8BxNYBmUhArHw0NLQLWVhCTtsI2QVCDCGo5kEJ6hEulKPSUBqaa4YEdFozIP2CigTEykdDQ7uQhSXktI2QXSBkbhIavCRkFWec1a2cgjZbO2_F1hVtcFDiXIjFrmjcG9pvGI5P-Wqg_lQzZCx1G3ftuTaRgFpo3LGE6jbu2r2KXSDkVDTuDe1Cxzg-5auBAxBUZCx1G3f9gooE1ELjjiVUt3HXL6gFQkdY495sQE5hxjnuLPyaCuH4tG9DHwmofF1Q_5RsImOp3cJrlwsLS6huC69_q6hA6KSz8C8BneD4tG9DHwmofF1wAIKKjKV2C69fULGE6rbw-gW1QOi0s_BrFr4w47Cq3880tAtZSEB1m3jtXYhhCbVvdx9LaMfaoP552UJH0z4fX0RU9SOahhI6RQKq28nrV1UsofZt8WMJ7VggHICqoqNpn5kvIkJ_SdNs0XCK807hA6GDcvP63-kgAdXt5vXvIGEJtc_NYwnVvtOvf82MRlS-RKh_araL0WA-VWyBWXWQgOp28_pVFUuofW4eS6j27X79qopGVL5EOABVLUZT-ACp5W7efrwx6F0kFt8Cn7p08OPX2_Jn9aPpBXwkqftAP4_FIqP1ZTkFSd07Hkkw6AUP4T0oSCZBHEgVeNRVyQweH__3TwAAAP__sPAEnQ==

query T
EXPLAIN (VEC, VERBOSE) SELECT count(*) FROM kv
----
│
├ Node 1
│ └ *colflow.BatchFlowCoordinator
│   └ *colexec.invariantsChecker
│     └ *colexec.orderedAggregator
│       └ *colexecbase.distinctChainOps
│         └ *colexec.invariantsChecker
│           └ *colexec.ParallelUnorderedSynchronizer
│             ├ *colexec.invariantsChecker
│             │ └ *colexec.countOp
│             │   └ *colexec.invariantsChecker
│             │     └ *colexecutils.CancelChecker
│             │       └ *colexec.invariantsChecker
│             │         └ *colfetcher.ColBatchScan
│             ├ *colexec.invariantsChecker
│             │ └ *colrpc.Inbox
│             ├ *colexec.invariantsChecker
│             │ └ *colrpc.Inbox
│             ├ *colexec.invariantsChecker
│             │ └ *colrpc.Inbox
│             └ *colexec.invariantsChecker
│               └ *colrpc.Inbox
├ Node 2
│ └ *colrpc.Outbox
│   └ *colexecutils.deselectorOp
│     └ *colexec.invariantsChecker
│       └ *colexec.countOp
│         └ *colexec.invariantsChecker
│           └ *colexecutils.CancelChecker
│             └ *colexec.invariantsChecker
│               └ *colfetcher.ColBatchScan
├ Node 3
│ └ *colrpc.Outbox
│   └ *colexecutils.deselectorOp
│     └ *colexec.invariantsChecker
│       └ *colexec.countOp
│         └ *colexec.invariantsChecker
│           └ *colexecutils.CancelChecker
│             └ *colexec.invariantsChecker
│               └ *colfetcher.ColBatchScan
├ Node 4
│ └ *colrpc.Outbox
│   └ *colexecutils.deselectorOp
│     └ *colexec.invariantsChecker
│       └ *colexec.countOp
│         └ *colexec.invariantsChecker
│           └ *colexecutils.CancelChecker
│             └ *colexec.invariantsChecker
│               └ *colfetcher.ColBatchScan
└ Node 5
  └ *colrpc.Outbox
    └ *colexecutils.deselectorOp
      └ *colexec.invariantsChecker
        └ *colexec.countOp
          └ *colexec.invariantsChecker
            └ *colexecutils.CancelChecker
              └ *colexec.invariantsChecker
                └ *colfetcher.ColBatchScan

query T
EXPLAIN (VEC, VERBOSE) SELECT count(*) FROM kv NATURAL INNER HASH JOIN kv kv2
----
│
├ Node 1
│ └ *colflow.BatchFlowCoordinator
│   └ *colexec.invariantsChecker
│     └ *colexec.orderedAggregator
│       └ *colexecbase.distinctChainOps
│         └ *colexec.invariantsChecker
│           └ *colexec.ParallelUnorderedSynchronizer
│             ├ *colexec.invariantsChecker
│             │ └ *colexec.countOp
│             │   └ *colexec.invariantsChecker
│             │     └ *colexecbase.simpleProjectOp
│             │       └ *colexecdisk.diskSpillerBase
│             │         ├ *colexecjoin.hashJoiner
│             │         │ ├ *colexec.invariantsChecker
│             │         │ │ └ *colexec.ParallelUnorderedSynchronizer
│             │         │ │   ├ *colexec.invariantsChecker
│             │         │ │   │ └ *colflow.routerOutputOp
│             │         │ │   │   └ *colflow.HashRouter
│             │         │ │   │     └ *colexec.invariantsChecker
│             │         │ │   │       └ *colexecutils.CancelChecker
│             │         │ │   │         └ *colexec.invariantsChecker
│             │         │ │   │           └ *colfetcher.ColBatchScan
│             │         │ │   ├ *colexec.invariantsChecker
│             │         │ │   │ └ *colrpc.Inbox
│             │         │ │   ├ *colexec.invariantsChecker
│             │         │ │   │ └ *colrpc.Inbox
│             │         │ │   ├ *colexec.invariantsChecker
│             │         │ │   │ └ *colrpc.Inbox
│             │         │ │   └ *colexec.invariantsChecker
│             │         │ │     └ *colrpc.Inbox
│             │         │ └ *colexec.invariantsChecker
│             │         │   └ *colexec.ParallelUnorderedSynchronizer
│             │         │     ├ *colexec.invariantsChecker
│             │         │     │ └ *colflow.routerOutputOp
│             │         │     │   └ *colflow.HashRouter
│             │         │     │     └ *colexec.invariantsChecker
│             │         │     │       └ *colexecutils.CancelChecker
│             │         │     │         └ *colexec.invariantsChecker
│             │         │     │           └ *colfetcher.ColBatchScan
│             │         │     ├ *colexec.invariantsChecker
│             │         │     │ └ *colrpc.Inbox
│             │         │     ├ *colexec.invariantsChecker
│             │         │     │ └ *colrpc.Inbox
│             │         │     ├ *colexec.invariantsChecker
│             │         │     │ └ *colrpc.Inbox
│             │         │     └ *colexec.invariantsChecker
│             │         │       └ *colrpc.Inbox
│             │         ├ *colexec.invariantsChecker
│             │         ├ *colexec.invariantsChecker
│             │         └ *colexecdisk.hashBasedPartitioner
│             │           ├ *colexecdisk.bufferExportingOperator
│             │           └ *colexecdisk.bufferExportingOperator
│             ├ *colexec.invariantsChecker
│             │ └ *colrpc.Inbox
│             ├ *colexec.invariantsChecker
│             │ └ *colrpc.Inbox
│             ├ *colexec.invariantsChecker
│             │ └ *colrpc.Inbox
│             └ *colexec.invariantsChecker
│               └ *colrpc.Inbox
├ Node 2
│ └ *colrpc.Outbox
│   └ *colexecutils.deselectorOp
│     └ *colexec.invariantsChecker
│       └ *colexec.countOp
│         └ *colexec.invariantsChecker
│           └ *colexecbase.simpleProjectOp
│             └ *colexecdisk.diskSpillerBase
│               ├ *colexecjoin.hashJoiner
│               │ ├ *colexec.invariantsChecker
│               │ │ └ *colexec.ParallelUnorderedSynchronizer
│               │ │   ├ *colexec.invariantsChecker
│               │ │   │ └ *colrpc.Inbox
│               │ │   ├ *colexec.invariantsChecker
│               │ │   │ └ *colflow.routerOutputOp
│               │ │   │   └ *colflow.HashRouter
│               │ │   │     └ *colexec.invariantsChecker
│               │ │   │       └ *colexecutils.CancelChecker
│               │ │   │         └ *colexec.invariantsChecker
│               │ │   │           └ *colfetcher.ColBatchScan
│               │ │   ├ *colexec.invariantsChecker
│               │ │   │ └ *colrpc.Inbox
│               │ │   ├ *colexec.invariantsChecker
│               │ │   │ └ *colrpc.Inbox
│               │ │   └ *colexec.invariantsChecker
│               │ │     └ *colrpc.Inbox
│               │ └ *colexec.invariantsChecker
│               │   └ *colexec.ParallelUnorderedSynchronizer
│               │     ├ *colexec.invariantsChecker
│               │     │ └ *colrpc.Inbox
│               │     ├ *colexec.invariantsChecker
│               │     │ └ *colflow.routerOutputOp
│               │     │   └ *colflow.HashRouter
│               │     │     └ *colexec.invariantsChecker
│               │     │       └ *colexecutils.CancelChecker
│               │     │         └ *colexec.invariantsChecker
│               │     │           └ *colfetcher.ColBatchScan
│               │     ├ *colexec.invariantsChecker
│               │     │ └ *colrpc.Inbox
│               │     ├ *colexec.invariantsChecker
│               │     │ └ *colrpc.Inbox
│               │     └ *colexec.invariantsChecker
│               │       └ *colrpc.Inbox
│               ├ *colexec.invariantsChecker
│               ├ *colexec.invariantsChecker
│               └ *colexecdisk.hashBasedPartitioner
│                 ├ *colexecdisk.bufferExportingOperator
│                 └ *colexecdisk.bufferExportingOperator
├ Node 3
│ └ *colrpc.Outbox
│   └ *colexecutils.deselectorOp
│     └ *colexec.invariantsChecker
│       └ *colexec.countOp
│         └ *colexec.invariantsChecker
│           └ *colexecbase.simpleProjectOp
│             └ *colexecdisk.diskSpillerBase
│               ├ *colexecjoin.hashJoiner
│               │ ├ *colexec.invariantsChecker
│               │ │ └ *colexec.ParallelUnorderedSynchronizer
│               │ │   ├ *colexec.invariantsChecker
│               │ │   │ └ *colrpc.Inbox
│               │ │   ├ *colexec.invariantsChecker
│               │ │   │ └ *colrpc.Inbox
│               │ │   ├ *colexec.invariantsChecker
│               │ │   │ └ *colflow.routerOutputOp
│               │ │   │   └ *colflow.HashRouter
│               │ │   │     └ *colexec.invariantsChecker
│               │ │   │       └ *colexecutils.CancelChecker
│               │ │   │         └ *colexec.invariantsChecker
│               │ │   │           └ *colfetcher.ColBatchScan
│               │ │   ├ *colexec.invariantsChecker
│               │ │   │ └ *colrpc.Inbox
│               │ │   └ *colexec.invariantsChecker
│               │ │     └ *colrpc.Inbox
│               │ └ *colexec.invariantsChecker
│               │   └ *colexec.ParallelUnorderedSynchronizer
│               │     ├ *colexec.invariantsChecker
│               │     │ └ *colrpc.Inbox
│               │     ├ *colexec.invariantsChecker
│               │     │ └ *colrpc.Inbox
│               │     ├ *colexec.invariantsChecker
│               │     │ └ *colflow.routerOutputOp
│               │     │   └ *colflow.HashRouter
│               │     │     └ *colexec.invariantsChecker
│               │     │       └ *colexecutils.CancelChecker
│               │     │         └ *colexec.invariantsChecker
│               │     │           └ *colfetcher.ColBatchScan
│               │     ├ *colexec.invariantsChecker
│               │     │ └ *colrpc.Inbox
│               │     └ *colexec.invariantsChecker
│               │       └ *colrpc.Inbox
│               ├ *colexec.invariantsChecker
│               ├ *colexec.invariantsChecker
│               └ *colexecdisk.hashBasedPartitioner
│                 ├ *colexecdisk.bufferExportingOperator
│                 └ *colexecdisk.bufferExportingOperator
├ Node 4
│ └ *colrpc.Outbox
│   └ *colexecutils.deselectorOp
│     └ *colexec.invariantsChecker
│       └ *colexec.countOp
│         └ *colexec.invariantsChecker
│           └ *colexecbase.simpleProjectOp
│             └ *colexecdisk.diskSpillerBase
│               ├ *colexecjoin.hashJoiner
│               │ ├ *colexec.invariantsChecker
│               │ │ └ *colexec.ParallelUnorderedSynchronizer
│               │ │   ├ *colexec.invariantsChecker
│               │ │   │ └ *colrpc.Inbox
│               │ │   ├ *colexec.invariantsChecker
│               │ │   │ └ *colrpc.Inbox
│               │ │   ├ *colexec.invariantsChecker
│               │ │   │ └ *colrpc.Inbox
│               │ │   ├ *colexec.invariantsChecker
│               │ │   │ └ *colflow.routerOutputOp
│               │ │   │   └ *colflow.HashRouter
│               │ │   │     └ *colexec.invariantsChecker
│               │ │   │       └ *colexecutils.CancelChecker
│               │ │   │         └ *colexec.invariantsChecker
│               │ │   │           └ *colfetcher.ColBatchScan
│               │ │   └ *colexec.invariantsChecker
│               │ │     └ *colrpc.Inbox
│               │ └ *colexec.invariantsChecker
│               │   └ *colexec.ParallelUnorderedSynchronizer
│               │     ├ *colexec.invariantsChecker
│               │     │ └ *colrpc.Inbox
│               │     ├ *colexec.invariantsChecker
│               │     │ └ *colrpc.Inbox
│               │     ├ *colexec.invariantsChecker
│               │     │ └ *colrpc.Inbox
│               │     ├ *colexec.invariantsChecker
│               │     │ └ *colflow.routerOutputOp
│               │     │   └ *colflow.HashRouter
│               │     │     └ *colexec.invariantsChecker
│               │     │       └ *colexecutils.CancelChecker
│               │     │         └ *colexec.invariantsChecker
│               │     │           └ *colfetcher.ColBatchScan
│               │     └ *colexec.invariantsChecker
│               │       └ *colrpc.Inbox
│               ├ *colexec.invariantsChecker
│               ├ *colexec.invariantsChecker
│               └ *colexecdisk.hashBasedPartitioner
│                 ├ *colexecdisk.bufferExportingOperator
│                 └ *colexecdisk.bufferExportingOperator
└ Node 5
  └ *colrpc.Outbox
    └ *colexecutils.deselectorOp
      └ *colexec.invariantsChecker
        └ *colexec.countOp
          └ *colexec.invariantsChecker
            └ *colexecbase.simpleProjectOp
              └ *colexecdisk.diskSpillerBase
                ├ *colexecjoin.hashJoiner
                │ ├ *colexec.invariantsChecker
                │ │ └ *colexec.ParallelUnorderedSynchronizer
                │ │   ├ *colexec.invariantsChecker
                │ │   │ └ *colrpc.Inbox
                │ │   ├ *colexec.invariantsChecker
                │ │   │ └ *colrpc.Inbox
                │ │   ├ *colexec.invariantsChecker
                │ │   │ └ *colrpc.Inbox
                │ │   ├ *colexec.invariantsChecker
                │ │   │ └ *colrpc.Inbox
                │ │   └ *colexec.invariantsChecker
                │ │     └ *colflow.routerOutputOp
                │ │       └ *colflow.HashRouter
                │ │         └ *colexec.invariantsChecker
                │ │           └ *colexecutils.CancelChecker
                │ │             └ *colexec.invariantsChecker
                │ │               └ *colfetcher.ColBatchScan
                │ └ *colexec.invariantsChecker
                │   └ *colexec.ParallelUnorderedSynchronizer
                │     ├ *colexec.invariantsChecker
                │     │ └ *colrpc.Inbox
                │     ├ *colexec.invariantsChecker
                │     │ └ *colrpc.Inbox
                │     ├ *colexec.invariantsChecker
                │     │ └ *colrpc.Inbox
                │     ├ *colexec.invariantsChecker
                │     │ └ *colrpc.Inbox
                │     └ *colexec.invariantsChecker
                │       └ *colflow.routerOutputOp
                │         └ *colflow.HashRouter
                │           └ *colexec.invariantsChecker
                │             └ *colexecutils.CancelChecker
                │               └ *colexec.invariantsChecker
                │                 └ *colfetcher.ColBatchScan
                ├ *colexec.invariantsChecker
                ├ *colexec.invariantsChecker
                └ *colexecdisk.hashBasedPartitioner
                  ├ *colexecdisk.bufferExportingOperator
                  └ *colexecdisk.bufferExportingOperator
