# LogicTest: local

statement ok
CREATE TABLE mn (
  k INT PRIMARY KEY,
  m INT,
  n STRING,
  FAMILY (k, m, n)
)

statement ok
CREATE TABLE t (
  k INT PRIMARY KEY,
  a INT,
  b INT,
  c STRING,
  FAMILY (k, a, b, c)
)

statement ok
CREATE INDEX t_a_plus_b_idx ON t ((a + b))

statement ok
CREATE INDEX t_lower_c_idx ON t (lower(c))

statement ok
CREATE INDEX t_lower_c_a_plus_b_idx ON t (lower(c), (a + b))

query T
SELECT * FROM [
  EXPLAIN SELECT * FROM t@t_a_plus_b_idx WHERE a + b = 110
] OFFSET 2
----
·
• index join
│ table: t@t_pkey
│
└── • scan
      missing stats
      table: t@t_a_plus_b_idx
      spans: [/110 - /110]

query T
SELECT * FROM [
  EXPLAIN SELECT * FROM t@t_a_plus_b_idx WHERE (a + b) > 110
] OFFSET 2
----
·
• index join
│ table: t@t_pkey
│
└── • scan
      missing stats
      table: t@t_a_plus_b_idx
      spans: [/111 - ]

query T
SELECT * FROM [
  EXPLAIN SELECT * FROM t@t_lower_c_idx WHERE lower(c) = 'foo'
] OFFSET 2
----
·
• index join
│ table: t@t_pkey
│
└── • scan
      missing stats
      table: t@t_lower_c_idx
      spans: [/'foo' - /'foo']

query T
SELECT * FROM [
  EXPLAIN SELECT * FROM t@t_lower_c_idx WHERE lower(c) LIKE 'foo%'
] OFFSET 2
----
·
• index join
│ table: t@t_pkey
│
└── • scan
      missing stats
      table: t@t_lower_c_idx
      spans: [/'foo' - /'fop')

query T
SELECT * FROM [
  EXPLAIN SELECT * FROM t@t_lower_c_a_plus_b_idx WHERE lower(c) = 'foo' AND a + b > 110
] OFFSET 2
----
·
• index join
│ table: t@t_pkey
│
└── • scan
      missing stats
      table: t@t_lower_c_a_plus_b_idx
      spans: [/'foo'/111 - /'foo']


# Lookup joins can be planned on expression indexes.

query T
SELECT * FROM [
  EXPLAIN SELECT * FROM mn INNER LOOKUP JOIN t ON n = lower(c)
] OFFSET 2
----
·
• lookup join
│ table: t@t_pkey
│ equality: (k) = (k)
│ equality cols are key
│
└── • lookup join
    │ table: t@t_lower_c_idx
    │ equality: (n) = (crdb_internal_idx_expr_1)
    │
    └── • scan
          missing stats
          table: mn@mn_pkey
          spans: FULL SCAN

query T
SELECT * FROM [
  EXPLAIN SELECT * FROM mn INNER LOOKUP JOIN t ON m = a + b AND n = lower(c)
] OFFSET 2
----
·
• lookup join
│ table: t@t_pkey
│ equality: (k) = (k)
│ equality cols are key
│
└── • lookup join
    │ table: t@t_lower_c_a_plus_b_idx
    │ equality: (n, m) = (crdb_internal_idx_expr_1, crdb_internal_idx_expr)
    │
    └── • scan
          missing stats
          table: mn@mn_pkey
          spans: FULL SCAN
