# LogicTest: local local-opt local-parallel-stmts fakedist fakedist-opt fakedist-metadata

statement ok
CREATE TABLE t (
  a INT PRIMARY KEY,
  b INT,
  c INT,
  d INT,
  INDEX b_idx (b) STORING (c, d),
  UNIQUE INDEX c_idx (c) STORING (b, d)
)

query TTBITTBB colnames
SHOW INDEXES FROM t
----
table_name  index_name  non_unique  seq_in_index  column_name  direction  storing  implicit
t           primary     false       1             a            ASC        false    false
t           b_idx       true        1             b            ASC        false    false
t           b_idx       true        2             c            N/A        true     false
t           b_idx       true        3             d            N/A        true     false
t           b_idx       true        4             a            ASC        false    true
t           c_idx       false       1             c            ASC        false    false
t           c_idx       false       2             b            N/A        true     false
t           c_idx       false       3             d            N/A        true     false
t           c_idx       false       4             a            ASC        false    true

statement ok
INSERT INTO t VALUES (1, 2, 3, 4)

query IIII
SELECT a, b, c, d FROM t@b_idx
----
1 2 3 4

query IIII
SELECT a, b, c, d FROM t@c_idx
----
1 2 3 4

# Test index backfill for UNIQUE and non-UNIQUE indexes with STORING columns.

statement ok
CREATE INDEX d_idx ON t (d) STORING ( b)

query III
SELECT a, b, d FROM t@d_idx
----
1 2 4

statement error index "error" already contains column "d"
CREATE INDEX error ON t (d) STORING (d)

statement error index "error" already contains column "a"
CREATE INDEX error ON t (d) STORING (a)

statement error index "b_idx" already contains column "a"
CREATE TABLE t30984 (
  a INT PRIMARY KEY,
  b INT,
  c INT,
  INDEX b_idx (b) STORING (c, a)
)

statement error index "b_idx" already contains column "a"
CREATE TABLE t30984 (
  a INT PRIMARY KEY,
  b INT,
  c INT,
  UNIQUE INDEX b_idx (b) STORING (c, a)
)

statement error index "b_idx" already contains column "d"
CREATE TABLE t30984 (
  a INT,
  b INT,
  c INT,
  d INT,
  PRIMARY KEY (a, d),
  UNIQUE INDEX b_idx (b) STORING (c, d)
)

statement ok
CREATE UNIQUE INDEX a_idx ON t (a) STORING (b)

# Regression test for #14601.

statement ok
CREATE TABLE t14601 (a STRING, b BOOL)

statement ok
CREATE INDEX i14601 ON t14601 (a) STORING (b)

statement ok
INSERT INTO t14601 VALUES
  ('a', FALSE),
  ('b', FALSE),
  ('c', FALSE)

statement ok
DELETE FROM t14601 WHERE a > 'a' AND a < 'c'

query T
SELECT a FROM t14601 ORDER BY a
----
a
c

statement ok
DROP INDEX i14601

query T
SELECT a FROM t14601 ORDER BY a
----
a
c

# Updates were broken too.

statement ok
CREATE TABLE t14601a (
  a STRING,
  b BOOL,
  c INT,
  FAMILY f1 (a),
  FAMILY f2 (b),
  FAMILY f3 (c)
)

statement ok
CREATE INDEX i14601a ON t14601a (a) STORING (b, c)

statement ok
INSERT INTO t14601a VALUES
  ('a', FALSE, 1),
  ('b', TRUE, 2),
  ('c', FALSE, 3)

statement ok
UPDATE t14601a SET b = NOT b WHERE a > 'a' AND a < 'c'

query TB
SELECT a, b FROM t14601a ORDER BY a
----
a  false
b  false
c  false

statement ok
DROP INDEX i14601a

query TB
SELECT a, b FROM t14601a ORDER BY a
----
a  false
b  false
c  false

statement ok
DELETE FROM t14601a

statement ok
CREATE UNIQUE INDEX i14601a ON t14601a (a) STORING (b)

statement ok
INSERT INTO t14601a VALUES
  ('a', FALSE),
  ('b', TRUE),
  ('c', FALSE)

statement ok
UPDATE t14601a SET b = NOT b WHERE a > 'a' AND a < 'c'

query TB
SELECT a, b FROM t14601a ORDER BY a
----
a  false
b  false
c  false

statement ok
DROP INDEX i14601a CASCADE

query TB
SELECT a, b FROM t14601a ORDER BY a
----
a  false
b  false
c  false

# Test that unspecified storing values are treated like NULL values.
statement ok
INSERT INTO t (a) VALUES (2)

statement ok
INSERT INTO t VALUES (3)

# Regression test for #30984: indirectly ensure that index descriptors don't
# get recreated every time any other schema change occurs.

statement ok
CREATE TABLE a(a INT, b INT, c INT, PRIMARY KEY(a, b))

statement ok
CREATE UNIQUE INDEX foo ON a(a) STORING(c)

statement ok
INSERT INTO a VALUES(1,2,3)

statement ok
CREATE UNIQUE INDEX ON a(a) STORING(c)

query III
SELECT * FROM a@foo
----
1 2 3
