# LogicTest: local-opt

# ------------------------------------------------------------------------------
# ALTER TABLE tests.
# ------------------------------------------------------------------------------
statement ok
CREATE TABLE other (b INT PRIMARY KEY)

statement ok
INSERT INTO other VALUES (9)

statement ok
CREATE TABLE t (a INT PRIMARY KEY CHECK(a > 0), f INT REFERENCES other, INDEX (f))

statement ok
INSERT INTO t VALUES (1, 9)

statement ok
SET tracing = on,kv,results; SELECT * FROM t; SET tracing = off

query T
SELECT message FROM [SHOW KV TRACE FOR SESSION]
 WHERE message LIKE 'fetched:%' OR message LIKE 'output row%'
----
fetched: /t/primary/1/f -> /9
output row: [1 9]

statement ok
ALTER TABLE t ADD b INT

statement ok
ALTER TABLE t ADD CONSTRAINT foo UNIQUE (b)

statement ok
SET tracing = on,kv,results; SELECT b FROM t@foo; SET tracing = off

query T
SELECT message FROM [SHOW KV TRACE FOR SESSION]
 WHERE message LIKE 'fetched:%' OR message LIKE 'output row%'
----
fetched: /t/foo/NULL -> /1
output row: [NULL]

statement ok
ALTER TABLE t ADD c INT

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

statement ok
ALTER TABLE t DROP CONSTRAINT check_a

statement ok
DROP INDEX foo CASCADE

statement ok
SET tracing = on,kv,results; SELECT * FROM t; SET tracing = off

query T
SELECT message FROM [SHOW KV TRACE FOR SESSION]
 WHERE message LIKE 'fetched:%' OR message LIKE 'output row%'
----
fetched: /t/primary/1/f -> /9
output row: [1 9 NULL NULL]
fetched: /t/primary/2/f/b/c -> /9/1/1
output row: [2 9 1 1]
fetched: /t/primary/3/f/b/c -> /9/2/1
output row: [3 9 2 1]

statement ok
ALTER TABLE t DROP b, DROP c

statement ok
SET tracing = on,kv,results; SELECT * FROM t; SET tracing = off

query T
SELECT message FROM [SHOW KV TRACE FOR SESSION]
 WHERE message LIKE 'fetched:%' OR message LIKE 'output row%'
----
fetched: /t/primary/1/f -> /9
output row: [1 9]
fetched: /t/primary/2/f -> /9
output row: [2 9]
fetched: /t/primary/3/f -> /9
output row: [3 9]

# Verify limits and orderings are propagated correctly to the select.
statement ok
CREATE TABLE s (k1 INT, k2 INT, v INT, PRIMARY KEY (k1,k2))

query TTTTT colnames
EXPLAIN (VERBOSE) ALTER TABLE s SPLIT AT SELECT k1,k2 FROM s ORDER BY k1 LIMIT 3
----
tree                 field     description       columns               ordering
split                ·         ·                 (key, pretty)         ·
 └── limit           ·         ·                 (k1, k2)              k1!=NULL; k2!=NULL; key(k1,k2); +k1
      │              count     3                 ·                     ·
      └── render     ·         ·                 (k1, k2)              k1!=NULL; k2!=NULL; key(k1,k2); +k1
           │         render 0  test.public.s.k1  ·                     ·
           │         render 1  test.public.s.k2  ·                     ·
           └── scan  ·         ·                 (k1, k2, v[omitted])  k1!=NULL; k2!=NULL; key(k1,k2); +k1
·                    table     s@primary         ·                     ·
·                    spans     ALL               ·                     ·
·                    limit     3                 ·                     ·

statement ok
DROP TABLE t; DROP TABLE other

# ------------------------------------------------------------------------------
# CREATE INDEX tests.
# ------------------------------------------------------------------------------
statement ok
CREATE TABLE t (
  a INT PRIMARY KEY,
  b INT,
  FAMILY (a),
  FAMILY (b)
)

statement ok
INSERT INTO t VALUES (1,1)

statement ok
SET tracing = on,kv,results; SELECT * FROM t; SET tracing = off

query T
SELECT message FROM [SHOW KV TRACE FOR SESSION]
 WHERE message LIKE 'fetched:%' OR message LIKE 'output row%'
----
fetched: /t/primary/1 -> NULL
fetched: /t/primary/1/b -> 1
output row: [1 1]

user root

statement ok
CREATE INDEX foo ON t (b)

statement error duplicate index name: \"foo\"
CREATE INDEX foo ON t (a)

statement error index \"bar\" contains unknown column \"c\"
CREATE INDEX bar ON t (c)

statement error index \"bar\" contains duplicate column \"b\"
CREATE INDEX bar ON t (b, b);

statement ok
SET tracing = on,kv,results; SELECT * FROM t@foo; SET tracing = off

query T
SELECT message FROM [SHOW KV TRACE FOR SESSION]
 WHERE message LIKE 'fetched:%' OR message LIKE 'output row%'
----
fetched: /t/foo/1/1 -> NULL
output row: [1 1]

statement ok
INSERT INTO t VALUES (2,1)

statement ok
SET tracing = on,kv,results; SELECT * FROM t@foo; SET tracing = off

query T
SELECT message FROM [SHOW KV TRACE FOR SESSION]
 WHERE message LIKE 'fetched:%' OR message LIKE 'output row%'
----
fetched: /t/foo/1/1 -> NULL
output row: [1 1]
fetched: /t/foo/1/2 -> NULL
output row: [2 1]

# test for DESC index

statement ok
DROP TABLE t

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

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

statement ok
CREATE INDEX b_desc ON t (b DESC)

statement ok
CREATE INDEX b_asc ON t (b ASC, c DESC)

# index b_desc is well formed and column c is scanned using the primary index.
statement ok
SET tracing = on,kv,results; SELECT * FROM t@b_desc; SET tracing = off

query T
SELECT message FROM [SHOW KV TRACE FOR SESSION]
 WHERE message LIKE 'fetched:%' OR message LIKE 'output row%'
----
fetched: /t/b_desc/2/2 -> NULL
fetched: /t/b_desc/1/1 -> NULL
fetched: /t/primary/2/b/c -> /2/2
output row: [2 2 2]
fetched: /t/primary/1/b/c -> /1/1
output row: [1 1 1]

statement ok
DROP table t

# ------------------------------------------------------------------------------
# CREATE VIEW tests.
# ------------------------------------------------------------------------------
statement ok
CREATE TABLE test_kv(k INT PRIMARY KEY, v INT, w DECIMAL);
  CREATE UNIQUE INDEX test_v_idx ON test_kv(v);
  CREATE INDEX test_v_idx2 ON test_kv(v DESC) STORING(w);
  CREATE INDEX test_v_idx3 ON test_kv(w) STORING(v);
  CREATE TABLE test_kvr1(k INT PRIMARY KEY REFERENCES test_kv(k));
  CREATE TABLE test_kvr2(k INT, v INT UNIQUE REFERENCES test_kv(k));
  CREATE TABLE test_kvr3(k INT, v INT UNIQUE REFERENCES test_kv(v));
  CREATE TABLE test_kvi1(k INT PRIMARY KEY) INTERLEAVE IN PARENT test_kv(k);
  CREATE TABLE test_kvi2(k INT PRIMARY KEY, v INT);
  CREATE UNIQUE INDEX test_kvi2_idx ON test_kvi2(v) INTERLEAVE IN PARENT test_kv(v);
  CREATE VIEW test_v1 AS SELECT v FROM test_kv;
  CREATE VIEW test_v2 AS SELECT v FROM test_v1;

# Verify that we report a dependency on a column that is being mutated.
statement ok
CREATE TABLE kv (k INT PRIMARY KEY, v INT);
BEGIN;
  ALTER TABLE kv ADD COLUMN z INT DEFAULT 123;
  CREATE VIEW v AS SELECT k FROM [UPDATE kv SET v = 444 WHERE k > 0 RETURNING k];
COMMIT

# The view should contain column z.
query TTTTT colnames
EXPLAIN (VERBOSE) SELECT * FROM v
----
tree                      field     description       columns                ordering
render                    ·         ·                 (k)                    ·
 │                        render 0  test.public.kv.k  ·                      ·
 └── run                  ·         ·                 (k, v, z)              ·
      └── update          ·         ·                 (k, v, z)              ·
           │              table     kv                ·                      ·
           │              set       v                 ·                      ·
           └── render     ·         ·                 (k, v, z, "?column?")  "?column?"=CONST; k!=NULL; key(k)
                │         render 0  test.public.kv.k  ·                      ·
                │         render 1  test.public.kv.v  ·                      ·
                │         render 2  test.public.kv.z  ·                      ·
                │         render 3  444               ·                      ·
                └── scan  ·         ·                 (k, v, z)              k!=NULL; key(k)
·                         table     kv@primary        ·                      ·
·                         spans     /1-               ·                      ·
