# LogicTest: local

statement ok
CREATE TABLE abcd (
  a INT PRIMARY KEY,
  b INT,
  c INT,
  d INT,
  INDEX b (b),
  INDEX cd (c,d),
  UNIQUE INDEX bcd (b,c,d)
)

# No hint
query TTT
EXPLAIN SELECT * FROM abcd WHERE a >= 20 AND a <= 30
----
scan  ·      ·
·     table  abcd@primary
·     spans  /20-/30/#

# Force primary
query TTT
EXPLAIN SELECT * FROM abcd@primary WHERE a >= 20 AND a <= 30
----
scan  ·      ·
·     table  abcd@primary
·     spans  /20-/30/#

# Force primary, reverse scan.
query TTT
EXPLAIN SELECT * FROM abcd@{FORCE_INDEX=primary,DESC} WHERE a >= 20 AND a <= 30
----
revscan  ·      ·
·        table  abcd@primary
·        spans  /20-/30/#

# Force index b
query TTT
EXPLAIN SELECT * FROM abcd@b WHERE a >= 20 AND a <= 30
----
index-join  ·       ·
 ├── scan   ·       ·
 │          table   abcd@b
 │          spans   ALL
 │          filter  (a >= 20) AND (a <= 30)
 └── scan   ·       ·
·           table   abcd@primary

# Force index b, reverse scan.
query TTT
EXPLAIN SELECT * FROM abcd@{FORCE_INDEX=b,DESC} WHERE a >= 20 AND a <= 30
----
index-join    ·       ·
 ├── revscan  ·       ·
 │            table   abcd@b
 │            spans   ALL
 │            filter  (a >= 20) AND (a <= 30)
 └── scan     ·       ·
·             table   abcd@primary

# Force index cd
query TTT
EXPLAIN SELECT * FROM abcd@cd WHERE a >= 20 AND a <= 30
----
index-join  ·       ·
 ├── scan   ·       ·
 │          table   abcd@cd
 │          spans   ALL
 │          filter  (a >= 20) AND (a <= 30)
 └── scan   ·       ·
·           table   abcd@primary

# Force index bcd
query TTT
EXPLAIN SELECT * FROM abcd@bcd WHERE a >= 20 AND a <= 30
----
scan  ·       ·
·     table   abcd@bcd
·     spans   ALL
·     filter  (a >= 20) AND (a <= 30)

# Force index b (covering)
query TTT
EXPLAIN SELECT b FROM abcd@b WHERE a >= 20 AND a <= 30
----
render     ·       ·
 └── scan  ·       ·
·          table   abcd@b
·          spans   ALL
·          filter  (a >= 20) AND (a <= 30)

# Force index b (non-covering due to WHERE clause)
query TTT
EXPLAIN SELECT b FROM abcd@b WHERE c >= 20 AND c <= 30
----
render           ·       ·
 └── index-join  ·       ·
      ├── scan   ·       ·
      │          table   abcd@b
      │          spans   ALL
      └── scan   ·       ·
·                table   abcd@primary
·                filter  (c >= 20) AND (c <= 30)

# No hint, should be using index cd
query TTT
EXPLAIN SELECT c, d FROM abcd WHERE c >= 20 AND c < 40
----
render     ·      ·
 └── scan  ·      ·
·          table  abcd@cd
·          spans  /20-/40

# Force primary index
query TTT
EXPLAIN SELECT c, d FROM abcd@primary WHERE c >= 20 AND c < 40
----
render     ·       ·
 └── scan  ·       ·
·          table   abcd@primary
·          spans   ALL
·          filter  (c >= 20) AND (c < 40)

# Force index b
query TTT
EXPLAIN SELECT c, d FROM abcd@b WHERE c >= 20 AND c < 40
----
render           ·       ·
 └── index-join  ·       ·
      ├── scan   ·       ·
      │          table   abcd@b
      │          spans   ALL
      └── scan   ·       ·
·                table   abcd@primary
·                filter  (c >= 20) AND (c < 40)

query TTT
EXPLAIN SELECT * FROM abcd@{FORCE_INDEX=b} WHERE a >= 20 AND a <= 30
----
index-join  ·       ·
 ├── scan   ·       ·
 │          table   abcd@b
 │          spans   ALL
 │          filter  (a >= 20) AND (a <= 30)
 └── scan   ·       ·
·           table   abcd@primary

query TTT
EXPLAIN SELECT b, c, d FROM abcd WHERE c = 10
----
render           ·      ·
 └── index-join  ·      ·
      ├── scan   ·      ·
      │          table  abcd@cd
      │          spans  /10-/11
      └── scan   ·      ·
·                table  abcd@primary

query TTT
EXPLAIN SELECT b, c, d FROM abcd@{NO_INDEX_JOIN} WHERE c = 10
----
render     ·       ·
 └── scan  ·       ·
·          table   abcd@bcd
·          hint    no index join
·          spans   ALL
·          filter  c = 10

query TTT
EXPLAIN SELECT b, c, d FROM abcd@{FORCE_INDEX=bcd} WHERE c = 10
----
render     ·       ·
 └── scan  ·       ·
·          table   abcd@bcd
·          spans   ALL
·          filter  c = 10

query TTT
EXPLAIN SELECT b, c, d FROM abcd@{FORCE_INDEX=primary} WHERE c = 10
----
render     ·       ·
 └── scan  ·       ·
·          table   abcd@primary
·          spans   ALL
·          filter  c = 10
