# LogicTest: local-opt

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/#

# No hint, reverse scan.
query TTT
EXPLAIN SELECT * FROM abcd WHERE a >= 20 AND a <= 30 ORDER BY a DESC
----
revscan  ·      ·
·        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 primary, allow reverse scan.
query TTT
EXPLAIN SELECT * FROM abcd@primary WHERE a >= 20 AND a <= 30 ORDER BY a DESC
----
revscan  ·      ·
·        table  abcd@primary
·        spans  /20-/30/#

# Force primary, forward scan.
query TTT
EXPLAIN SELECT * FROM abcd@{FORCE_INDEX=primary,ASC} WHERE a >= 20 AND a <= 30 ORDER BY a DESC
----
sort       ·      ·
 │         order  -a
 └── scan  ·      ·
·          table  abcd@primary
·          spans  /20-/30/#

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

# Force index b, allowing reverse scan.
query TTT
EXPLAIN SELECT * FROM abcd@b ORDER BY b DESC LIMIT 5
----
index-join    ·      ·
 ├── revscan  ·      ·
 │            table  abcd@b
 │            spans  ALL
 │            limit  5
 └── scan     ·      ·
·             table  abcd@primary

# Force index b, reverse scan.
query TTT
EXPLAIN SELECT * FROM abcd@{FORCE_INDEX=b,DESC} ORDER BY b DESC LIMIT 5
----
index-join    ·      ·
 ├── revscan  ·      ·
 │            table  abcd@b
 │            spans  ALL
 │            limit  5
 └── scan     ·      ·
·             table  abcd@primary


# Force index b, forward scan.
query TTT
EXPLAIN SELECT * FROM abcd@{FORCE_INDEX=b,ASC} ORDER BY b DESC LIMIT 5
----
limit                 ·      ·
 │                    count  5
 └── sort             ·      ·
      │               order  -b
      └── index-join  ·      ·
           ├── scan   ·      ·
           │          table  abcd@b
           │          spans  ALL
           └── scan   ·      ·
·                     table  abcd@primary

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

# No hint, should be using index cd
query TTT
EXPLAIN SELECT c, d FROM abcd WHERE c >= 20 AND c < 40
----
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
----
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
----
filter           ·       ·
 │               filter  (c >= 20) AND (c < 40)
 └── index-join  ·       ·
      ├── scan   ·       ·
      │          table   abcd@b
      │          spans   ALL
      └── scan   ·       ·
·                table   abcd@primary

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

query TTT
EXPLAIN SELECT b, c, d FROM abcd WHERE c = 10
----
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
----
scan  ·       ·
·     table   abcd@primary
·     spans   ALL
·     filter  c = 10

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

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