# LogicTest: local

# ------------------------------------------------------------------------------
# Test index selection for deeply interleaved tables.
# These tests are in their own file because table IDs appear in EXPLAIN output.
# ------------------------------------------------------------------------------
statement ok
CREATE TABLE level1 (
  k1 INT,
  PRIMARY KEY (k1)
)

statement ok
CREATE TABLE level2 (
  k1 INT,
  PRIMARY KEY (k1),
  CONSTRAINT fk1 FOREIGN KEY (k1) REFERENCES level1
) INTERLEAVE IN PARENT level1 (k1)

statement ok
CREATE TABLE level3 (
  k1 INT,
  k2 INT,
  k3 INT,
  PRIMARY KEY (k1, k2, k3),
  CONSTRAINT fk2 FOREIGN KEY (k1) REFERENCES level2
) INTERLEAVE IN PARENT level2 (k1)

statement ok
CREATE TABLE level4 (
  k1 INT,
  k2 INT,
  k3 INT,
  PRIMARY KEY (k1, k2, k3),
  CONSTRAINT fk3 FOREIGN KEY (k1, k2, k3) REFERENCES level3
) INTERLEAVE IN PARENT level3 (k1, k2, k3)

query TTT
EXPLAIN SELECT * FROM level4
----
scan  ·      ·
·     table  level4@primary
·     spans  ALL

# The span below ends at the end of the first index of table 53, and is not
# constraining the value of k2 or k3. This is confusing on first glance because
# the second interleave in the hierarchy doesn't contain any new primary key
# columns on top of the first interleave.
query TTT
EXPLAIN SELECT * FROM level4 WHERE k1 > 1 AND k1 < 3
----
scan  ·      ·
·     table  level4@primary
·     spans  /2/#/54/1/#/55/1-/2/#/54/1/#/55/2

query TTT
EXPLAIN SELECT * FROM level4 WHERE k1 = 2 AND k2 > 10 AND k2 < 30
----
scan  ·      ·
·     table  level4@primary
·     spans  /2/#/54/1/#/55/1/11-/2/#/54/1/#/55/1/30

query TTT
EXPLAIN SELECT * FROM level4 WHERE k1 = 2 AND k2 = 20 AND k3 > 100 AND k3 < 300
----
scan  ·      ·
·     table  level4@primary
·     spans  /2/#/54/1/#/55/1/20/101/#/56/1-/2/#/54/1/#/55/1/20/299/#/56/1/#

query TTT
EXPLAIN SELECT * FROM level4 WHERE k1 = 2 AND k2 = 20 AND k3 = 200
----
scan  ·      ·
·     table  level4@primary
·     spans  /2/#/54/1/#/55/1/20/200/#/56/1-/2/#/54/1/#/55/1/20/200/#/56/1/#

# ------------------------------------------------------------------------------
# Trace of interleaved fetches from interesting interleaved hierarchy.
# ------------------------------------------------------------------------------
# Grandparent table
statement ok
CREATE TABLE p2 (i INT PRIMARY KEY, s STRING)

# Two tables interleaved at the same level
statement ok
CREATE TABLE p1_0 (
  i INT,
  s1 STRING,
  s2 STRING,
  d DECIMAL,
  PRIMARY KEY (i, s1),
  FAMILY (i, s1, s2),
  FAMILY (d)
) INTERLEAVE IN PARENT p2 (i)

statement ok
CREATE TABLE p1_1 (
  i INT PRIMARY KEY,
  s1 STRING,
  s2 STRING,
  d DECIMAL
) INTERLEAVE IN PARENT p2 (i)

# Two level deep interleave
statement ok
CREATE TABLE p0 (
  i INT,
  s1 STRING,
  s2 STRING,
  d DECIMAL,
  PRIMARY KEY (i, s1, s2)
) INTERLEAVE IN PARENT p1_0 (i, s1)

statement ok
INSERT INTO p2 VALUES (2, '2'), (3, '3'), (5, '5'), (7, '7')

statement ok
INSERT INTO p1_0 VALUES (2, '2', '2.01', 2), (3, '3', '3.01', 3), (5, '5', NULL, NULL)

statement ok
INSERT INTO p1_1 VALUES (2, '2', '2.11', 2), (3, '3', '3.11', 3)

statement ok
INSERT INTO p0 VALUES (2, '2', '2.0', 2), (3, '3', '3.0', 3), (5, '5', '5.0', 5)

statement ok
SET tracing = on,kv,results; SELECT * FROM p1_0; SET tracing = off

query T
SELECT message FROM [SHOW KV TRACE FOR SESSION]
 WHERE message LIKE 'fetched:%' OR message LIKE 'output row%'
----
fetched: /p1_0/primary/2/'2'/s2 -> /'2.01'
fetched: /p1_0/primary/2/'2'/d -> 2
output row: [2 '2' '2.01' 2]
fetched: /p1_0/primary/3/'3'/s2 -> /'3.01'
fetched: /p1_0/primary/3/'3'/d -> 3
output row: [3 '3' '3.01' 3]
fetched: /p1_0/primary/5/'5' -> NULL
output row: [5 '5' NULL NULL]
