# LogicTest: 5node

# These tests are different from explain_analyze because they require manual
# data placement.

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

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, FAMILY (k, w))

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 that EXPLAIN ANALYZE (DISTSQL) annotates plans with collected
# statistics.

# Verify data placement.
query TTTI colnames,rowsort
SELECT start_key, end_key, replicas, lease_holder from [SHOW RANGES FROM TABLE kv WITH DETAILS]
ORDER BY 1
----
start_key           end_key                 replicas  lease_holder
<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 colnames,rowsort
SELECT start_key, end_key, replicas, lease_holder from [SHOW RANGES FROM TABLE kw WITH DETAILS]
----
start_key                end_key       replicas  lease_holder
<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

# This query verifies stat collection for the tableReader, mergeJoiner, and
# aggregator.
query T
EXPLAIN ANALYZE (DISTSQL) SELECT kv.k, avg(kw.k) FROM kv JOIN kw ON kv.k=kw.k GROUP BY kv.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
·
• group (streaming)
│ sql nodes: <hidden>
│ regions: <hidden>
│ actual row count: 5
│ group by: k
│ ordered: +k
│
└── • 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#eJzsm-1u2koTx78_V7HaT6lqCusXIJYq0aZ9jtLTQJWXStVRFDl4SiyMTe0lJCfKZZ0bOFd2ZFMS7A0mQ9o18jofKmwvxvOb8czuf6d3NP7hU5uefPz88eCUjK_fjDXiXI_2xvM341fk_8eDIzK-Jp8Gh30ynpNBPx1C3pLkOvnjeHD2hbz_lp6kGg1CF_rOBGJq_0UZ1ahONWpQjZpUoxY91-g0CocQx2GUDLlLv3Do3lC7pVEvmM54cvpco8MwAmrfUe5xH6hNT51LH47BcSFqtqhGXeCO56c_M77uja8vpmO4pRo9CP3ZJIhtkjzNydRJPjaayVP8-ZUkPxbbJGCLwwhGXpgM4BDzxSnuTcAmrX__iRfHwzDgEHAvDIRLUTiPiQvD0AXXJj9veXnLISYROK5NuuT94uTo-MsBGTq-Hz-MmzpetByXPNzR14MDEnOYkmE4CzjZgxve9AL-yiat1N7FAIDxugET54ZMYBJGt8Tx_XDo8OSxWukzXDp8eAUxCWd8OuM2Scanj788wej5vUYXRwu_LLlf3pIrJ77KEu8l4881GnNnBNRmK149_EDt1r22nWPbOcfOe-N5kWObrHbt73WtnnNte61rH-8bRi5E4Obv-zp5kGeNeiJKjiAawafQCyBqstz778N3vtdjr1-9jbzR1eIj1eggsb7HtF7iBLiB4Uz0dRHZ5Fr8wyccJlPievGYzGJnBFuDf4Rq5KAy1AvzbjSKYOTwMGoyS3CeRgcLsIntVKPv-t8u-oPTi_7Z5897PZaAOTk72uvpyaeDwVn_9OfnNYR-c3yZeRTWywKsmJfeehmvk7Oji8OEmJEcHUPgQpTGGOnpzZ7xCyk-ErJyhPT1wfJo8yx4itGTePphI5w29VwkbWuHtdaOdt6OrKfZ86sEQ5b_pt5oGnWVkDgBYNu6toOdANSulTwB6Kx1rcQJAKvaBAD1wqxOANqVmwC0XxZgGyYArAITgGyw6M_Prjq2cBqNpllnV4mFU9_WtV1s4axdK7lwdte6VmLh1KtWOFEvzGrh7FSucHZeFmAbCqdegcKZDRbj-dnVwBZOs9G06uwqsXAa27p2H1s4a9dKLpz7a10rsXAaVSucqBdmtXB2K1c4uy8LsA2F06hA4cwGi_n87GpiC6fVqHOrxLJpbutYC1k2G01GnMAljIT8CqLayRILqLXWyRILqFm1Aop6dVYL6H7lCuj-ywJsQwE1K1BATcwG_zHE0zCIIbd3-_RPtXI_1WAJT3BHsOAfh7NoCF-icJiOXRwO0hul5cCFmC-u6ouDw2B5KeYOL9oM_p0vYoumJkbgTB46ip5vSnetKQHweRiNie9wCIa3D7Ysz88dj2etdCGGyHN8729HRLD8WvrsEQzBu04ZrFxalqCHaymA5dUJxAmX_JexfBgSEDNKJsQKCHV_CSGWJaRjCSkXQwaSkF52DEknZAqEGCKj6juVUds4U7prTamorxkSUC6jyickP6NiCSkXQwaSkF52DMnPqAIhPU-otUooC6i1eitLSM5GIWxzl6a7uVfLsnC2sJZqpbiN9DazlCOEjCFduRjqIGNIVy6GOkIMmYXp-QlAy1t1BdhW4a30tpjqd2byLNjS3lJZqWjcMByf9Uvt8l3NkLaUrqxId7aOJaSesoIkVLqyIn0taQqEOlsqKxUNoQ6Oz_ql9g5kVKQtpSsr8jMqlpB6ygqSUOnKivyMKhDqFs639wuUFSE572-prFQ0Gi1BxSoGVCDXlK89tZHeVlBZQbpbQWUFGUMKKivi1oCw27pJWql2AesKMcQwu60KxJCOBKTcupthCRWIN-Wvm3S0NWU7XHrOMLCISlda5O-4ioiELVe1pZYuEpByi2-GJVSg4OxAWkVbU7bD5adVLKLS5Rb5aVVEJGwmZ-bzzCwQXMQcLey7Kq64COrWBkIKdshgg6hAyNkBVQrrcAVFF6zDFVRdxCgq7kIpm5B81UUMorq3JTsZQgJSbhHOsIQUbJlBI9rlFikDa42CqouIqG5wyRDaRwJSbhHOsIQU7JtBI9rlPikDa42CqouIqLjLhRW1uYg5uu5zyaouosi1daNLRRG1sUGkYPsMNooKpJzyhakO1uEKqi6Cw_W61yWrughBpO92r4v8dlYkoLJVF_mbslhCCqouaETKRZGBRVQg5ZS_gjJFa3a710V6WhX-f-8GQGWrLvLTKpaQgqoLGpFyUWRgERVIOTuQVkVrintd9KJeFzFH170u2RwtiFwbCCmoumCDSEHVBRtFCjbQYKOoQMrZAWFKdHjd65JVXcz7c41-98P5hedSm7Z-_jWe-Gf5R5MvOKOY2nf05Cqcp7ROb6cQU_u748eg0SNnDB-AQzTxAi_m3pDaPJrB_f3__gsAAP__VOQWIQ==

# This query verifies stats collection for the hashJoiner, distinct and sorter.
query T
EXPLAIN ANALYZE (DISTSQL) SELECT DISTINCT(kw.w) FROM kv JOIN kw ON kv.k = kw.w ORDER BY kw.w
----
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
·
• sort
│ sql nodes: <hidden>
│ regions: <hidden>
│ actual row count: 5
│ estimated max memory allocated: 0 B
│ estimated max sql temp disk usage: 0 B
│ order: +w
│
└── • distinct
    │ sql nodes: <hidden>
    │ regions: <hidden>
    │ actual row count: 5
    │ estimated max memory allocated: 0 B
    │ estimated max sql temp disk usage: 0 B
    │ distinct on: w
    │
    └── • hash 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) = (w)
        │ left 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#eJzsm91u27gSx-_PUxC8anHk2tSHPwQUCJr04KTnNCmSoMBiERSKxCaCZMkV6TjZII-1L7BPtpBcx7EmojP2VhJM96KILFrW_GY4M_qTeqDiR0xdev7x_x8PL8jR8fnF8cnhBXkTzd7N3pL_nJ1-JtEt-XR6fEKiGTk9IdHtu4i8J_l5cnp29PGMfPitOKIGTdKAn3hjLqj7O2XUoCY1qEUNalODOvTSoJMs9bkQaZYPeSi-cBzcUbdn0DCZTGX-8aVB_TTj1H2gMpQxpy698K5ifsa9gGfdHjVowKUXxsXPRLcH0e23ScTvqUEP03g6ToRLImrQ84mX_9np5nfxv68k_zHhkoTNDzN-Hab5AMmFnH8kwzF3Se-vP8X82E8TyRMZpgk4laUzQQLupwEPXPLzklf3kguScS9wyZB8mH94ffblkPheHIuncRMvzBbj8pv7_PXwkAjJJ8RPp4kkb_id7IaJfOuSXmHvfADnUdWAsXdHxnycZvfEi-PU92R-W73iHq486d9wQdKpnEylS_Lxxe0vPmD08tGg86O5Xxbcr-7JjSduVokf5OMvDSqkd82py5559fiIur1HYzPH9kuOnR1EM-DY2dKxXbZ37a91rVlybb_StcvrTpM0C3jGg5UrX-bfXDfkhfj4ryduPqVhwrMuK038mH-Xbw7Y2_dZeH1T_EUNepobfZCD53fcn0L_qmjm58SPmEg-npAgFBGZCu-abwx7CdIqgWSoSXIUChkmvuwyB7irFYbiosouw3C2CCsVLrPXTlxLFE4JhYmKi_M0kzzrmiAq_t02O_tlO1_j8pccXhj3otdP0k466Voll1dQWGuKU2nKoGSKteoy9vp6x5CNTNfsdK19vauxlWGbunaAbWX2rq25lRlUuraOVobtUCuDmiTLVqbfztq8ZSvT3yKslK0MaycuRSuDiotFKwOiov2tzKrLzdcXCRNb_61O194XiRrrv7mpa4fY-r93bc31f1jp2jrqv7lD9R81SZb1f9DOgrZl_R9sEVbK-m-2E5ei_qPiYlH_QVS0v_6vutx6fZGwsPXf7nSdfZGosf5bm7p2hK3_e9fWXP9Hla6to_5bO1T_UZNkWf-H7SxoW9b_4RZhpaz_VjtxKeo_Ki4W9R9ERfvr_6rL7dcXCRtb_53OvkTUWP3tTR3rIKt_p8uIlwSEkVTe8Gzv5Br7AKfSyXX0AfYO9QGo6bLsA0btLGxb9gGjLcJK2QfY7cSl6ANQcbHoA0BUtL8PGGG2bpxxMUkTwcsZ5cWf6pV-qsPyGOHBNZ8HlEinmc-_ZKlfjJ0fnhYXKqpawIWcnzXnB8fJ4pSQnlRtlPiVbHu0MDHj3vhp3-DrTRlVmpJwOUuziMSe5Il__2TL4vOZF8pVKwMueBZ6cfiHBxEsvlbce8Z9Ht4WDJ6dWlTSp3MFgMXZMRc5l_KXsXwYEhBzGibEFISG_wghtkrIRBIymW4xZGEJDXQjZANCDJFRzVZl1D7OlFGlKTvqa4YEVMqo9ROqP6MiCZUyqgYxZGEJDXQjZANCZplQ7zkhawVQ7_mlHJCcLSVsu03tbmlqOQ7OFqZds9JHeptp16z0kTFkWroRGiBjyNTusXIAYshWpmenOj0PAWxHeak-ZP10KXBXfXXRYPC2WtOHAyyDDUWaHQ1BhuNTPUWbdzVD2tK4SFO7s00kIQ1FGiyhpvue2h9LbUBouKFIs6MhNMDxqVZ-WpBRkbY0LtLUn1GRhDQUabCEmhZp6s-ogNBI2W-znkKlAdmZqVcZqmWaHY1HB4qGa9byqpug5pWsPtbfGgo1WIdrqNRgo0hDqQZGEVhsWM3SpkKsgbzVuvwLas1u18QhxL1GPNQtIE0kIO1mLMMSUuhBzT-KmVhrGtduas8ZFhqRdr2QDRGBFQe91ZshEpB-G3ewhBSiUAvSKtaaxgWc-tMqGlHTCk79aRUiUq--sr5CwoE5Gqy_ai7hAMFsDSEN9-9gg0ihC7VA5cI6XEMJB-twDSUcGEVgcXc1Sw8VEg7kDdY1NJdwIG6wrqG3hGMhATU9Y2sPIYYlpOGWHiwihS7U_OOYhbZGPwkHIDIx751q8DQ2QgJqWsKpP61iCWm4rweLSKELtSCtoq3RT8KBiNTru6ZifdeBORqs72ou4QDFbA0hDSUcbBBpuLUHG0UKXah5lWuAdbiGEg50OFjiXc3StkLCgbzVr1_pJ-FA3GBdo1USTv17d5GAtJuxDEtIQwkHi6jxrT31K6VoRK1azio_a0Br1qzV6KZQgDeQ1wBqWsKpP61iCWko4WARNb61p_60ikZUrQu1IK1Ca9Tru6ZifdeBOVr93pp-Eg5UzNa8Hapd29LHBpGGEg42ijTc2oONIoUu1AKVCzpc_bqrpXjddQjQWGBhQ3MJZ_R4adDvcTr7FgbUpb2f_zov_Lf4R_MveNeCug_0_CadFbQu7idcUPe7Fwtu0M9exI-45Nk4TEIhQ5-6Mpvyx8d__R0AAP__8G4ZdQ==

# This query verifies stats collection for WITH ORDINALITY and the hashJoiner.
query T
EXPLAIN ANALYZE (DISTSQL) SELECT * FROM kv WITH ORDINALITY AS a, kv WITH ORDINALITY AS b
----
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
·
• cross join
│ sql nodes: <hidden>
│ regions: <hidden>
│ actual row count: 25
│ estimated max memory allocated: 0 B
│ estimated max sql temp disk usage: 0 B
│
├── • ordinality
│   │ sql nodes: <hidden>
│   │ regions: <hidden>
│   │ actual row count: 5
│   │
│   └── • 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
│
└── • ordinality
    │ sql nodes: <hidden>
    │ regions: <hidden>
    │ actual row count: 5
    │
    └── • 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#eJzsVMFu2zgQve9XDOa0u2BgSbb3wJOzToq4TeLANlIUhRHQ0sQhJJEKSTk2An9Wf6BfVtCKE1uJ3aRFeyoPAmbm8fHNvIHu0d5myHF4fHrcHcG_8G7QP4N0Bh97oxPoD45654envdEnOByCYDsKE2SodELnIieL_DOGOGZYGB2Ttdr41P0K0EvmyAOGUhWl8-kxw1gbQn6PTrqMkONITDIakEjINAJkmJATMlvRprNOOrsqUlogw67OylxZDimDGTIcFsJHB8jwwyX41ywHFVahoanUvuzIuirlZE4cgq9fbBXHWjlSTmr1rGT0nYWEYp1QwqFdJScLRxYMiYRDK4D_q-x0cNGFWGSZfQQWQpo1MPQdnV12u2AdFRDrUjn4m-auIZX7h0PQeAIQpbsAuZhDTrk2CxBZpmPhvLBKxES4-IYs6NIVpePg8asG1ok2jpcMq-jBA-vElJCHG6b1jpAHS_Z63_omkUpk0i0a4bZtNKe4fD7YnxAa1YSGbxG6uWDRnwX7nQvWrPkW_eCCNX_1grVqQps7hT7pK5U2CRlKtsSN_c3vQV7o9kTYm_daKjKN1na3fS-9E7JOxDpN1mmxTpt1_kO2awz7vPQ1e5uBo7yARNoUSium9Gqro90jbNdG2HqL1wOyhVaW6qN88aWg9tJB6AdKyZQqg6wuTUwXRscrbBX2V0SrRELWVdWwCnpqXbLOkMgf_4WbTOFeptYWU7jJFNWZor1Mzd2awjpT8w2aok2mZp2ptZepvW9OY4bXmb67kglyDB7OwQuf9UF_QUytX4Dhjb5b0Y4WhbfvWmSWGJ6JlI7IkcmlktbJGLkzJS2Xf30LAAD__-Ov0gg=

# Verify that EXPLAIN ANALYZE on an unsupported query doesn't return an error.
statement ok
EXPLAIN ANALYZE (DISTSQL) SHOW QUERIES;

statement ok
EXPLAIN ANALYZE (DISTSQL) EXPLAIN SELECT 1

# This query verifies support for zeroNode in DistSQL.
query T
EXPLAIN (DISTSQL) SELECT sum(k) FROM kv WHERE FALSE
----
distribution: local
vectorized: true
·
• group (scalar)
│ estimated row count: 1
│
└── • norows
·
Diagram: https://cockroachdb.github.io/distsqlplan/decode.html#eJyUkltLwzAUx9_9FOE8dZCxxsc8OV3Fwm6u8wJSJLRnXeklNUmdMvrdpanbVHTMPBRyzunvx_mTLeiXHDh4j_Px0J8SZ-QHy-B23COBN_aulkTXhZP1yPViNiHZK3m48RYeWYlcI1AoZYxTUaAG_gQMQgqVkhFqLVVb2toBP34D7lJIy6o2bTmkEEmFwLdgUpMjcLgXeY164AKFGI1Ic0t0ySVxXBKt6zLTPQgbCrI2B4o2IkHL3mv9EXC3oaebh0miMBFGqgH7bg_uJs4F-1vLfmjZf7QL1JUsbYgH5akL9lkTUsA4wS5lLWsV4VzJyM5215kF2UKM2nRd1l38ctfSRqEo9ql9JbGjpPNjpJDCKpeb5zQGDu7n6f_y2R1ofxCJbiMK1nJjscv3ql3QPjYKE5HhCA2qIi1TbdIIuFE1Ns3ZRwAAAP___Pbhag==

# This query verifies stat collection for the tableReader and windower.
query T
EXPLAIN ANALYZE (DISTSQL) SELECT avg(k) OVER () 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
·
• window
│ sql nodes: <hidden>
│ regions: <hidden>
│ actual row count: 5
│ estimated max memory allocated: 0 B
│ estimated max sql temp disk usage: 0 B
│
└── • 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#eJzslt1u4jgUx-_3KaxzBVIQ-WK18lV3aXdV7XapaMVcjFDlxqfUSmKntsPHVDzWvMA82chJ0yEUKpC4JBcI-xwfn_x_fzl-BfOSAYW7q_-uhveEzWedtEtGk6sx6XTJ3-PRDUnn4IFUHP9nORqgXyEAD0LwIAIPYvBgAFMPCq0SNEZpl_JaLbjmS6C-B0IWpXXTUw8SpRHoK1hhMwQK9-wxwzEyjrrvgwccLRNZtU06v0jnD0WKK_BgqLIyl4aSFDy4K5j72-u7Lv6dELeZoUQG9VDjTCiXYNHYesqKHCnxf3w39ThR0qK0QskPIa0WhnBMFEdOyVvJx5VFQzQyTskf5K96cja-HZKEZZl5zyuY0E2ea-5mMhwSY7EgiSqlJR1c2r6QtkuJX71vnYCY7kvI2ZLkmCu9IizLVMKsa8uvenhkNnlGQ1Rpi9JS4vKr9puJAKZrD-rRGwBj2QyBBhvEri-B-mtvD7RfrEqpNEeNvMVput6B9YuQXC1Q9wdtpn9O_ulcBF3wYOT6u3Aa4RKT8iOKz17cxcxLRizmBeHCpKQ0bIYH6zLYq0u4pcugpUtwuJmDI83cD3v96GznE9k5aGELD8cWHost6vXjM7YTYQtb2KLDsUXHYot71dF0xnYKbFELW3w4tvhYbIPeGdqJoMV7v_g7oI3RFEoa3Pry797J39qpF7grAvIZ1vcJo0qd4K1WSZVbD0dVoWqCo7F1NKgH17IKBW4HjSx_v7BsVgo-rfR7q5L_aaXw2J5YJQBItAulU5IxizJZvVusmV8wYdvm42hQC5aJb-yjM5tlFV-NCYp5488m1Ji0idVGbaI5Gncr2kzwD_TQpj7Btj7RWZ9NfcJtfeKzPpv6RNv6DM76bOoTu9PxKVOLB8GBgv_29Hb8NA-4BWxm3BF996wWlVj3q8IdsE8sM-jBDUvxEi3qXEhhrEiAWl3iev3bzwAAAP__Bh4wxA==

# Very simple query to make it easier to spot regressions when rewriting results
# in test files.
query T
EXPLAIN ANALYZE (DISTSQL) SELECT k FROM kv WHERE k = 0
----
planning time: 10µs
execution time: 100µs
distribution: <hidden>
vectorized: <hidden>
plan type: custom
maximum memory usage: <hidden>
network usage: <hidden>
regions: <hidden>
isolation level: serializable
priority: normal
quality of service: regular
·
• scan
  sql nodes: <hidden>
  kv nodes: <hidden>
  regions: <hidden>
  actual row count: 0
  KV time: 0µs
  KV contention time: 0µs
  KV rows decoded: 0
  KV bytes read: 0 B
  KV gRPC calls: 0
  estimated max memory allocated: 0 B
  missing stats
  table: kv@kv_pkey
  spans: [/0 - /0]
·
Diagram: https://cockroachdb.github.io/distsqlplan/decode.html#eJyMUl2L2zAQfO-vWPapBR1xXgWF0lxKQ5vekYTrQwmHIu_lhGXJ1a7zQfDP6h_oLyu2cunnQfVgPLOjnTHjE_JXjxqX04_TyQoqeLe4mUO1g8_vp4spVPAaClQYYkmfTE2M-guOca2wSdESc0w9dRoEs_KAulDoQtNKT68V2pgI9QnFiSfUuDIbTwsyJaVRv7gkMc4Pa6vdm2p331R0RIWT6Ns6sIYKFS4b07-OiuHKhzvo3VhDGGeYaOtirxBiyZS4mjQU379xxjYGoSAuhr9GKe4ZSrKxpFLD2WFzFGJIZHoK3mZyu7idgDXe80XXGJcuOlQ4v5tMgIUasLENAi_pICMX5JWGnD4LiKrnBLU5QE11TEcw3kdrhC4ZNkbsIzHEVppWsuMQ_yex7hRmdG6AxWwJ9fiXymbXqItO_X9rC-ImBqbfCnvOqfjD6WrcrRVSuaX8q3Bsk6XbFO2gzfBmWDQQJbHk6TiDWXgasSQydY6_Vvjg4_7elaixOJ-rfzyeDvYXzJb7D1s-xv2wdnVs-lgPxjMpnJuKrkko1S44FmdRS2qp6178CAAA__-InP65

# Test a query that has a subquery and a postquery.
statement ok
CREATE TABLE parent (p INT PRIMARY KEY);
INSERT INTO parent VALUES (1), (2);
CREATE TABLE child (c INT PRIMARY KEY, p INT REFERENCES parent(p))

query T
EXPLAIN ANALYZE (DISTSQL) INSERT INTO child VALUES (1, (SELECT min(p) FROM parent))
----
planning time: 10µs
execution time: 100µs
distribution: <hidden>
vectorized: <hidden>
plan type: custom
rows decoded from KV: 2 (16 B, 4 KVs, 2 gRPC calls)
maximum memory usage: <hidden>
network usage: <hidden>
regions: <hidden>
isolation level: serializable
priority: normal
quality of service: regular
·
• root
│
├── • insert
│   │ sql nodes: <hidden>
│   │ regions: <hidden>
│   │ actual row count: 1
│   │ into: child(c, p)
│   │
│   └── • buffer
│       │ sql nodes: <hidden>
│       │ regions: <hidden>
│       │ actual row count: 1
│       │ label: buffer 1
│       │
│       └── • values
│             sql nodes: <hidden>
│             regions: <hidden>
│             actual row count: 1
│             size: 2 columns, 1 row
│
├── • subquery
│   │ id: @S1
│   │ original sql: (SELECT min(p) FROM parent)
│   │ exec mode: one row
│   │
│   └── • group (scalar)
│       │ sql nodes: <hidden>
│       │ regions: <hidden>
│       │ actual row count: 1
│       │
│       └── • scan
│             sql nodes: <hidden>
│             kv nodes: <hidden>
│             regions: <hidden>
│             actual row count: 1
│             KV time: 0µs
│             KV contention time: 0µs
│             KV rows decoded: 1
│             KV pairs read: 2
│             KV bytes read: 8 B
│             KV gRPC calls: 1
│             estimated max memory allocated: 0 B
│             missing stats
│             table: parent@parent_pkey
│             spans: LIMITED SCAN
│             limit: 1
│
└── • constraint-check
    │
    └── • error if rows
        │ sql nodes: <hidden>
        │ regions: <hidden>
        │ actual row count: 0
        │
        └── • lookup join (anti)
            │ sql nodes: <hidden>
            │ kv nodes: <hidden>
            │ regions: <hidden>
            │ actual row count: 0
            │ KV time: 0µs
            │ KV contention time: 0µs
            │ KV rows decoded: 1
            │ KV pairs read: 2
            │ KV bytes read: 8 B
            │ KV gRPC calls: 1
            │ estimated max memory allocated: 0 B
            │ table: parent@parent_pkey
            │ equality: (column2) = (p)
            │ equality cols are key
            │
            └── • filter
                │ sql nodes: <hidden>
                │ regions: <hidden>
                │ actual row count: 1
                │ estimated row count: 1
                │ filter: column2 IS NOT NULL
                │
                └── • scan buffer
                      sql nodes: <hidden>
                      regions: <hidden>
                      actual row count: 1
                      estimated row count: 1
                      label: buffer 1
·
Diagram 1 (subquery): https://cockroachdb.github.io/distsqlplan/decode.html#eJysU9Fu2koQfb9fsZonkBZhE12p2qekhEooBCIgSFWF0GY9cVbYu-7uuEAjPqs_0C-r1o5TSJq0UesH8M6cnTk-Z-Ye_OcMBAzHs8F0zobj-YSpO50lbHE2uh7MWCvmrDUbjAb9Ocu1aRVt9mE6uWSFdGio3QYOxiY4ljl6EJ8gBg7_w5JD4axC760L4fsKNEy2ICIO2hQlhfCSg7IOQdwDacoQBIxtxxbdHnBIkKTOqqK4RVWStoaRzlGw6Ps3DxxuJKk79MyWVJQkWAQcnN38DMSw3HOoTw_9PMkUQZwcEByeg-jt-QHH-HWOc3mT4RRlgq4bHTOtZTmt_1bFGnfAoW-zMjdesAI4zAoZXjvAYaRzTSwodrFgobkXzDwcHabaBiChpzp09O0XC6asITTPZQm3gwoJKptgIpoONztCzxzKRLB37H0dTKdXfaZklvlHXCG1a3DBiMtFv888YcGULQ2xFm6pqw21BYuq768BiOuXALncshxz63ZMZplVkgKtqOLwFybGT0yM3mLiWZo6TCVZ142PPTwbf1yNJ_PV-Ho0ap3GYcT__QD2nnCPj7j_Zkmm6AtrPB7xfqlT9KRTJ94vOWCSYr2Z3pZO4ZWzqsLWx0lVqAok6KnOntSHoWlSnhzK_FH6w0rxq5V6b6jUe7VS9LySrAQAg7Sxbs0ySWjU7tG0Jr6Rmo7tTNCj0zLTX-Vzr5trlb8OFeovzW41qWbBmly9ZE02R-9legSI_nCGDvWp3LvN7GalExAQPTydX_w0D4QLMvVhhGZ3dlOJNd8VYQBuZeaRw6Vc4zkSulwb7UkrEORK3O__-xEAAP__ru7_KA==
Diagram 2 (main-query): https://cockroachdb.github.io/distsqlplan/decode.html#eJy0ksGK2zAQhu99CjGnBLTE8t50K90UDLtJSdJeiilaeZyIypIrjZotwY_VF-iTFdu77dZ0AzmsDoL5JX3zIeYE8ZsFCcVqu9zsWLHarZk-GFuxT29vPy63bCY4m22Xt8t3O9YYN2vn7P1mfcdaFdDRfA4cnK9wpRqMID-DgJJDG7zGGH3oo9NwoageQGYcjGsT9XHJQfuAIE9AhiyCBOu1suy7sgkjyxYZcKiQlLEDGR9QJzLeMTINSpb9-hmBw70ifcDIfKI2kWT9q-CPfwMBZcdhrB4bR1J7BCmemRY3ILOOXyp7n-oaAxML8dqy-URWXC6rfXLE8kX-2q7XE9f8EtcNxta7iP9IvtQpm3S6El3JAas9jqMXfQoaPwSvh7tjuR5AQ1BhpPFUjEXhno4iBVTNn7l4ThJnSfnLJDEl5WdJ1-ecSg619ccvpgIJ2eO6-s_2tKB_oPax_-ztwR8H7O5H239VrWxEDnfqK94gYWiMM5GMBkkhYde9-R0AAP__XNhbxw==
Diagram 3 (postquery): https://cockroachdb.github.io/distsqlplan/decode.html#eJy0lNFuKjcQhu_7FKO5AskRu5CLyldJCZE2IRAB4aZCkbM7EBevvbW9CijisfoCfbLKGNJAC-fkSGcvQDM7_v3N7G-_o_tTIcdsMO6NJpANJkPIX6UqYHrdf-qNoZEyaIx7_V53AqXUjaoJt6PhA1TCkvbNJjLUpqCBKMkh_x1TnDGsrMnJOWND6n1bkBUr5AlDqavah_SMYW4sIX9HL70i5KhMLhS4XGh4qedzspC0EmRYkBdSbeWHtedw1UaGtKK89tJo8LIkDsnffzlk-CJ8_koOTO2rUBvWW_P2byLF2YZhjHYczosFIU8_gWc3yJMN-372W6k8WbKt9BA45jlcpZCNYTCcwOCp3_8p_O0j_vQr_HdG6hGJgmyrfdjBZF0Rh37vdgLXg0kGd8NsgAyjAa7i33O1pDUy7BuzrCv4w0gNRoeukWHXqLrUjkOFOwYIHYVW9rHzQqnDQdxPIbA7DjqNoaWFNEHHk_MxdbwiN9qT_u9Uw-owxIJyU1ARt76fwsvakwNLouDwK_wWk4vRYxdyoZT7qKuEtPu6MJ6HabcLzlMFuam1hwatfEtq3-Q7y8YCouWpghOfvxQrKKk0dg1ChfPgA22yRfumNZKT1ugcWaP9FWvEY0nWGgtyHgeZtjqHLvlRO59mvjxi7nyFeUSuMtrRAeSpnZKjnS7SzYwhFQuK95cztc3p0Zp8WxvD4VZomyjI-fg2jUGm96-ctyTKj9vks1J6Vql9Wik9VmqfVeqcVmofK3XOKl2e627GcK7M27MskGOyey7-52f_YFggFi58tvGredvKhsvGIZ8L5Yjhg1jSDXmypdTSeZkj97amzeaXfwIAAP__Mpgtzg==
