# 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 T
EXPLAIN SELECT * FROM abcd WHERE a >= 20 AND a <= 30
----
distribution: local
vectorized: true
·
• scan
  missing stats
  table: abcd@abcd_pkey
  spans: [/20 - /30]

# No hint, reverse scan.
query T
EXPLAIN SELECT * FROM abcd WHERE a >= 20 AND a <= 30 ORDER BY a DESC
----
distribution: local
vectorized: true
·
• revscan
  missing stats
  table: abcd@abcd_pkey
  spans: [/20 - /30]

# Force primary
query T
EXPLAIN SELECT * FROM abcd@abcd_pkey WHERE a >= 20 AND a <= 30
----
distribution: local
vectorized: true
·
• scan
  missing stats
  table: abcd@abcd_pkey
  spans: [/20 - /30]

# Force primary, reverse scan.
query T
EXPLAIN SELECT * FROM abcd@{FORCE_INDEX=abcd_pkey,DESC} WHERE a >= 20 AND a <= 30
----
distribution: local
vectorized: true
·
• revscan
  missing stats
  table: abcd@abcd_pkey
  spans: [/20 - /30]

# Force primary, allow reverse scan.
query T
EXPLAIN SELECT * FROM abcd@abcd_pkey WHERE a >= 20 AND a <= 30 ORDER BY a DESC
----
distribution: local
vectorized: true
·
• revscan
  missing stats
  table: abcd@abcd_pkey
  spans: [/20 - /30]

# Force primary, forward scan.
query T
EXPLAIN SELECT * FROM abcd@{FORCE_INDEX=abcd_pkey,ASC} WHERE a >= 20 AND a <= 30 ORDER BY a DESC
----
distribution: local
vectorized: true
·
• sort
│ order: -a
│
└── • scan
      missing stats
      table: abcd@abcd_pkey
      spans: [/20 - /30]

# Force index b
query T
EXPLAIN SELECT * FROM abcd@b WHERE a >= 20 AND a <= 30
----
distribution: local
vectorized: true
·
• filter
│ filter: (a >= 20) AND (a <= 30)
│
└── • index join
    │ table: abcd@abcd_pkey
    │
    └── • scan
          missing stats
          table: abcd@b
          spans: FULL SCAN

# Force index b, reverse scan.
query T
EXPLAIN SELECT * FROM abcd@{FORCE_INDEX=b,DESC} WHERE a >= 20 AND a <= 30
----
distribution: local
vectorized: true
·
• filter
│ filter: (a >= 20) AND (a <= 30)
│
└── • index join
    │ table: abcd@abcd_pkey
    │
    └── • revscan
          missing stats
          table: abcd@b
          spans: FULL SCAN

# Force index b, allowing reverse scan.
query T
EXPLAIN SELECT * FROM abcd@b ORDER BY b DESC LIMIT 5
----
distribution: local
vectorized: true
·
• index join
│ table: abcd@abcd_pkey
│
└── • revscan
      missing stats
      table: abcd@b
      spans: LIMITED SCAN
      limit: 5

# Force index b, reverse scan.
query T
EXPLAIN SELECT * FROM abcd@{FORCE_INDEX=b,DESC} ORDER BY b DESC LIMIT 5
----
distribution: local
vectorized: true
·
• index join
│ table: abcd@abcd_pkey
│
└── • revscan
      missing stats
      table: abcd@b
      spans: LIMITED SCAN
      limit: 5


# Force index b, forward scan.
query T
EXPLAIN SELECT * FROM abcd@{FORCE_INDEX=b,ASC} ORDER BY b DESC LIMIT 5
----
distribution: local
vectorized: true
·
• index join
│ table: abcd@abcd_pkey
│
└── • top-k
    │ order: -b
    │ k: 5
    │
    └── • scan
          missing stats
          table: abcd@b
          spans: FULL SCAN

# Force index cd
query T
EXPLAIN SELECT * FROM abcd@cd WHERE a >= 20 AND a <= 30
----
distribution: local
vectorized: true
·
• filter
│ filter: (a >= 20) AND (a <= 30)
│
└── • index join
    │ table: abcd@abcd_pkey
    │
    └── • scan
          missing stats
          table: abcd@cd
          spans: FULL SCAN

# Force index bcd
query T
EXPLAIN SELECT * FROM abcd@bcd WHERE a >= 20 AND a <= 30
----
distribution: local
vectorized: true
·
• filter
│ filter: (a >= 20) AND (a <= 30)
│
└── • scan
      missing stats
      table: abcd@bcd
      spans: FULL SCAN

# Force index b (covering)
query T
EXPLAIN SELECT b FROM abcd@b WHERE a >= 20 AND a <= 30
----
distribution: local
vectorized: true
·
• filter
│ filter: (a >= 20) AND (a <= 30)
│
└── • scan
      missing stats
      table: abcd@b
      spans: FULL SCAN

# Force index b (non-covering due to WHERE clause)
query T
EXPLAIN SELECT b FROM abcd@b WHERE c >= 20 AND c <= 30
----
distribution: local
vectorized: true
·
• filter
│ filter: (c >= 20) AND (c <= 30)
│
└── • index join
    │ table: abcd@abcd_pkey
    │
    └── • scan
          missing stats
          table: abcd@b
          spans: FULL SCAN

# No hint, should be using index cd
query T
EXPLAIN SELECT c, d FROM abcd WHERE c >= 20 AND c < 40
----
distribution: local
vectorized: true
·
• scan
  missing stats
  table: abcd@cd
  spans: [/20 - /39]

# Force primary index
query T
EXPLAIN SELECT c, d FROM abcd@abcd_pkey WHERE c >= 20 AND c < 40
----
distribution: local
vectorized: true
·
• filter
│ filter: (c >= 20) AND (c < 40)
│
└── • scan
      missing stats
      table: abcd@abcd_pkey
      spans: FULL SCAN

# Force index b
query T
EXPLAIN SELECT c, d FROM abcd@b WHERE c >= 20 AND c < 40
----
distribution: local
vectorized: true
·
• filter
│ filter: (c >= 20) AND (c < 40)
│
└── • index join
    │ table: abcd@abcd_pkey
    │
    └── • scan
          missing stats
          table: abcd@b
          spans: FULL SCAN

query T
EXPLAIN SELECT * FROM abcd@{FORCE_INDEX=b} WHERE a >= 20 AND a <= 30
----
distribution: local
vectorized: true
·
• filter
│ filter: (a >= 20) AND (a <= 30)
│
└── • index join
    │ table: abcd@abcd_pkey
    │
    └── • scan
          missing stats
          table: abcd@b
          spans: FULL SCAN

query T
EXPLAIN SELECT b, c, d FROM abcd WHERE c = 10
----
distribution: local
vectorized: true
·
• index join
│ table: abcd@abcd_pkey
│
└── • scan
      missing stats
      table: abcd@cd
      spans: [/10 - /10]

query T
EXPLAIN SELECT b, c, d FROM abcd@{NO_INDEX_JOIN} WHERE c = 10
----
distribution: local
vectorized: true
·
• filter
│ filter: c = 10
│
└── • scan
      missing stats
      table: abcd@abcd_pkey
      spans: FULL SCAN

query T
EXPLAIN SELECT b, c, d FROM abcd@{FORCE_INDEX=bcd} WHERE c = 10
----
distribution: local
vectorized: true
·
• filter
│ filter: c = 10
│
└── • scan
      missing stats
      table: abcd@bcd
      spans: FULL SCAN

query T
EXPLAIN SELECT b, c, d FROM abcd@{FORCE_INDEX=abcd_pkey} WHERE c = 10
----
distribution: local
vectorized: true
·
• filter
│ filter: c = 10
│
└── • scan
      missing stats
      table: abcd@abcd_pkey
      spans: FULL SCAN
