# LogicTest: 5node

# Regression test for #39317.

statement ok
CREATE TABLE l (a INT PRIMARY KEY, b INT, FAMILY (a, b))

statement ok
CREATE TABLE r (a INT PRIMARY KEY, b INT, FAMILY (a, b))

statement ok
INSERT INTO l VALUES (1, 10), (2, 20), (3, 30)

statement ok
INSERT INTO r VALUES (2, 200), (3, 300), (4, 400)

statement ok
ALTER TABLE l SPLIT AT VALUES (2), (3)

statement ok
ALTER TABLE r SPLIT AT VALUES (2), (3)

statement ok
ALTER TABLE l EXPERIMENTAL_RELOCATE VALUES (ARRAY[1], 1), (ARRAY[2], 2), (ARRAY[3], 3)

statement ok
ALTER TABLE r EXPERIMENTAL_RELOCATE VALUES (ARRAY[1], 2), (ARRAY[2], 3), (ARRAY[3], 1)

query TTTI colnames
SELECT start_key, end_key, replicas, lease_holder from [SHOW EXPERIMENTAL_RANGES FROM TABLE l WITH DETAILS] ORDER BY lease_holder
----
start_key           end_key                 replicas  lease_holder
<before:/Table/72>  …/1/2                   {1}       1
…/1/2               …/1/3                   {2}       2
…/1/3               <after:/Table/107/1/2>  {3}       3

query TTTI colnames
SELECT start_key, end_key, replicas, lease_holder from [SHOW EXPERIMENTAL_RANGES FROM TABLE r WITH DETAILS] ORDER BY lease_holder
----
start_key                end_key       replicas  lease_holder
…/1/2                    …/1/3         {1}       1
…/1/3                    <after:/Max>  {2}       2
<before:/Table/106/1/3>  …/1/2         {3}       3

query T
EXPLAIN (DISTSQL) SELECT * FROM l LEFT OUTER JOIN r USING(a) WHERE a = 2
----
distribution: full
vectorized: true
·
• merge join (left outer)
│ equality: (a) = (a)
│ left cols are key
│ right cols are key
│
├── • scan
│     missing stats
│     table: l@l_pkey
│     spans: [/2 - /2]
│
└── • scan
      missing stats
      table: r@r_pkey
      spans: [/2 - /2]
·
Diagram: https://cockroachdb.github.io/distsqlplan/decode.html#eJzEk19v0zAUxd_5FNZ9WsFV4zR7sTQpaM0gU_-MJhNIKJrc5raNlsbBdjSqqt8dJRm0iVooTIAfovjfz-ceH29Bf0mBg_fpbvjWH5OLgR-EwYdhhwTe0LsOyWtyM52MSEqG3k1Ibif-mChyH_jjd-RCdMjH997UI4JcERsoZDLGsVijBv4ZGFCwIaKQKzlHraUqh7fVIj_-CtyikGR5YcrhiMJcKgS-BZOYFIFDKGYpTlHEqHolK0YjkrRCK1c95I-4AQrXMi3WmeZEUDIDCkEuyl7P7lkQ7SjIwjwfsSfPNmQl9KrJdBlEu4iCNmKJwO0D3f4AONvRE9L33CKTKkaFcYMclTt_teRI_SNUS7yVSYaq129qDTc58vpGJvehN63uBSikuDAXLnvTuVLJclX_AoVJYThxGXVt6jotV_YV91sV919Q8ZFyxrIr857TtuaoFKclxWlIYefnxmr6lrrp384Na0m3Tkr_F7mx_0Nu7JO5OSJ2ijqXmcazYmG1Tuqysn6Ml1j7qWWh5nin5LxaW3cnFaiyPkZt6lmn7vhZNWWXJygU6x8P_XwSO03qt0msTbIOSXaDxA5Jl22S_VPSZYNkHZKsNqn_Gz6xF5DYaZLdJjl_6pNT5mGRyqeHJAYO1nPrHvl8b1BuEEtdhjJYyacKW74TDXwhUo0URuIRB2hQrZMs0SaZAzeqwN3u1bcAAAD__wr9Uho=

# Test that we can handle merge joins with equality columns of integers with
# different widths.
statement ok
CREATE TABLE numbers (_int2 INT2, _int4 INT4, _int8 INT8, _float FLOAT, _decimal DECIMAL);
INSERT INTO numbers VALUES (1, 1, 1, 1, 1)

# Place the single range on node 1 for determinism.
statement ok
ALTER TABLE numbers EXPERIMENTAL_RELOCATE VALUES (ARRAY[1], 1)

query T
EXPLAIN (VEC) SELECT * FROM numbers AS t1 INNER MERGE JOIN numbers AS t2 ON t1._int2 = t2._int4
----
│
└ Node 1
  └ *colexecjoin.mergeJoinInnerOp
    ├ *colexecbase.castInt2Int4Op
    │ └ *colexec.sortOp
    │   └ *colfetcher.ColBatchScan
    └ *colexec.sortOp
      └ *colfetcher.ColBatchScan

query T
EXPLAIN (VEC) SELECT * FROM numbers AS t1 INNER MERGE JOIN numbers AS t2 ON t1._int8 = t2._int2
----
│
└ Node 1
  └ *colexecjoin.mergeJoinInnerOp
    ├ *colexec.sortOp
    │ └ *colfetcher.ColBatchScan
    └ *colexecbase.castInt2IntOp
      └ *colexec.sortOp
        └ *colfetcher.ColBatchScan

# Also check that we cannot plan a merge join with other numeric types.
statement error could not produce a query plan conforming to the MERGE JOIN hint
EXPLAIN SELECT * FROM numbers AS t1 INNER MERGE JOIN numbers AS t2 ON t1._int8 = t2._float

statement error could not produce a query plan conforming to the MERGE JOIN hint
EXPLAIN SELECT * FROM numbers AS t1 INNER MERGE JOIN numbers AS t2 ON t1._int8 = t2._decimal

statement error could not produce a query plan conforming to the MERGE JOIN hint
EXPLAIN SELECT * FROM numbers AS t1 INNER MERGE JOIN numbers AS t2 ON t1._float = t2._decimal
