# LogicTest: 5node

# This test file makes sure that experimental DistSQL planning actually plans
# processors and other components correctly. In order to make the output
# deterministic we place the data manually.

statement ok
CREATE TABLE kv (k INT PRIMARY KEY, v INT, FAMILY (k, v));
INSERT INTO kv SELECT i, i FROM generate_series(1,5) AS g(i);
CREATE TABLE kw (k INT PRIMARY KEY, w INT, FAMILY (k, w));
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);
ALTER TABLE kw SPLIT AT SELECT i FROM generate_series(1,5) AS g(i);
ALTER TABLE kv EXPERIMENTAL_RELOCATE SELECT ARRAY[i], i FROM generate_series(1, 5) as g(i);
ALTER TABLE kw EXPERIMENTAL_RELOCATE SELECT ARRAY[i], i FROM generate_series(1, 5) as g(i)

# 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

statement ok
SET experimental_distsql_planning = always

query T
EXPLAIN (DISTSQL) SELECT * FROM kv
----
distribution: full
vectorized: true
·
• scan
  missing stats
  table: kv@kv_pkey
  spans: FULL SCAN
·
Diagram: https://cockroachdb.github.io/distsqlplan/decode.html#eJyck19r2zAQwN_3Kcw9bUPGlv_sQU8bTQaGNO3iPAxGKJp1zYwdy5PkdCX4uw8521qbtGjWg0HS6Xc_zncn0D9rYLD8erv6lK29t4ss3-ZfVu-8fLlaXm29997nzc21Vx2BQCMFrvkBNbBvQIFABARiIJAAgRR2BFolC9RaKhtyGh5k4hewkEDZtJ2xxzsChVQI7ASmNDUCgy3_XuMGuUAVhEBAoOFlPaSpjh-r411b4SMQuJJ1d2g08yriWaG85XbnBxHsegKyM085tOF7BEafSWULYGFPXvB60ukaqQQqFCOVXX_BfC192QbpJPCySjRRSUcq1L1E9P9LFER-EDsXiY7MInezaIZZ7AeJs1k0MovdzeIZZokfpM5m8cgscTdLZpilvrNX8mLDX_DaoG5lo9Gpn8NJJp_aCUGxx_M4admpAm-VLIbY8_ZmAA0HArU539LzJmuGK2ozKOSHf_P6nERfJX0YkcJXSdFcJzolxXNJ0ZSUzCXFU1I6l5TYv3hfy4e7UgCD8M_yL3z-LrAP-F7bVsp_yIcBu31sbSPc81ojgWte4QINqkPZlNqUBTCjOuz7N78DAAD__9F-GFc=

# Note that we want to test DistSQL physical planning and the obvious choice
# would be to use EXPLAIN (DISTSQL). However, this explain variant doesn't have
# a textual mode which is easier to verify, so we use EXPLAIN (VEC) instead.
# TODO(yuzefovich): consider adding textual mode to EXPLAIN (DISTSQL) and
# using it here.
# TODO(yuzefovich): figure out how we would display plans that have distributed
# stages followed by local ones followed by distributed stages.

# An example of partially distributed plan (due to DOid type that is not
# supported by DistSQL).

query T
EXPLAIN (VEC) SELECT * FROM kv WHERE k::REGCLASS IS NOT NULL
----
│
├ Node 1
│ └ *colexec.isNullSelOp
│   └ *colexecbase.castNativeToDatumOp
│     └ *colexec.ParallelUnorderedSynchronizer
│       ├ *colfetcher.ColBatchScan
│       ├ *colrpc.Inbox
│       ├ *colrpc.Inbox
│       ├ *colrpc.Inbox
│       └ *colrpc.Inbox
├ Node 2
│ └ *colrpc.Outbox
│   └ *colfetcher.ColBatchScan
├ Node 3
│ └ *colrpc.Outbox
│   └ *colfetcher.ColBatchScan
├ Node 4
│ └ *colrpc.Outbox
│   └ *colfetcher.ColBatchScan
└ Node 5
  └ *colrpc.Outbox
    └ *colfetcher.ColBatchScan

# Check that the plan is local when experimental DistSQL planning is disabled.
statement ok
SET experimental_distsql_planning = off

query T
EXPLAIN (VEC) SELECT * FROM kv WHERE k::REGCLASS IS NOT NULL
----
│
└ Node 1
  └ *colexec.isNullSelOp
    └ *colexecbase.castNativeToDatumOp
      └ *colfetcher.ColBatchScan

statement ok
SET experimental_distsql_planning = always

# Check that plan is partially distributed (due to DOid type in a render
# expression which is not supported by DistSQL).
query T
EXPLAIN (VEC) SELECT k::REGCLASS FROM kv
----
│
├ Node 1
│ └ *colexecbase.castNativeToDatumOp
│   └ *colexec.ParallelUnorderedSynchronizer
│     ├ *colfetcher.ColBatchScan
│     ├ *colrpc.Inbox
│     ├ *colrpc.Inbox
│     ├ *colrpc.Inbox
│     └ *colrpc.Inbox
├ Node 2
│ └ *colrpc.Outbox
│   └ *colfetcher.ColBatchScan
├ Node 3
│ └ *colrpc.Outbox
│   └ *colfetcher.ColBatchScan
├ Node 4
│ └ *colrpc.Outbox
│   └ *colfetcher.ColBatchScan
└ Node 5
  └ *colrpc.Outbox
    └ *colfetcher.ColBatchScan

# Disable the partially distributed plans and check that a local plan is
# produced instead.
statement ok
SET disable_partially_distributed_plans = true

# TODO(yuzefovich): for some reason the plan below is not local, figure it out.
query T
EXPLAIN (VEC) SELECT k::REGCLASS FROM kv
----
│
├ Node 1
│ └ *colexecbase.castNativeToDatumOp
│   └ *colexec.ParallelUnorderedSynchronizer
│     ├ *colfetcher.ColBatchScan
│     ├ *colrpc.Inbox
│     ├ *colrpc.Inbox
│     ├ *colrpc.Inbox
│     └ *colrpc.Inbox
├ Node 2
│ └ *colrpc.Outbox
│   └ *colfetcher.ColBatchScan
├ Node 3
│ └ *colrpc.Outbox
│   └ *colfetcher.ColBatchScan
├ Node 4
│ └ *colrpc.Outbox
│   └ *colfetcher.ColBatchScan
└ Node 5
  └ *colrpc.Outbox
    └ *colfetcher.ColBatchScan

statement ok
SET disable_partially_distributed_plans = false
