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

# a is the primary key so b gets optimized into a one column value. The c, d
# family has two columns, so it's encoded as a tuple
statement ok
CREATE TABLE abcd(
  a INT PRIMARY KEY,
  b INT,
  c INT,
  d INT,
  FAMILY f1 (a, b),
  FAMILY (c, d)
)

query TT
SHOW CREATE TABLE abcd
----
abcd  CREATE TABLE abcd (
      a INT8 NOT NULL,
      b INT8 NULL,
      c INT8 NULL,
      d INT8 NULL,
      CONSTRAINT "primary" PRIMARY KEY (a ASC),
      FAMILY f1 (a, b),
      FAMILY fam_1_c_d (c, d)
)

statement ok
CREATE INDEX d_idx ON abcd(d)

statement ok
INSERT INTO abcd VALUES (1, 2, 3, 4), (5, 6, 7, 8)

query IIII rowsort
SELECT * FROM abcd
----
1 2 3 4
5 6 7 8

# Test point lookup, which triggers an optimization for only scanning one
# column family.
query I
SELECT c FROM abcd WHERE a = 1
----
3

query I
SELECT count(*) FROM abcd
----
2

query I
SELECT count(*) FROM abcd@d_idx
----
2

statement ok
UPDATE abcd SET b = 9, d = 10, c = NULL where c = 7

query IIII rowsort
SELECT * FROM abcd
----
1 2 3    4
5 9 NULL 10

statement ok
DELETE FROM abcd where c = 3

query IIII
SELECT * FROM abcd
----
5 9 NULL 10

statement ok
UPSERT INTO abcd VALUES (1, 2, 3, 4), (5, 6, 7, 8)

query IIII rowsort
SELECT * FROM abcd
----
1 2 3 4
5 6 7 8

statement ok
UPDATE abcd SET b = NULL, c = NULL, d = NULL WHERE a = 1

query IIII
SELECT * FROM abcd WHERE a = 1
----
1 NULL NULL NULL

# Test updating a NULL family
statement ok
INSERT INTO abcd (a) VALUES (2)

query IIII
SELECT * FROM abcd WHERE a = 2
----
2 NULL NULL NULL

statement ok
UPDATE abcd SET d = 5 WHERE a = 2

query IIII
SELECT * FROM abcd WHERE a = 2
----
2 NULL NULL 5

statement ok
DELETE FROM abcd WHERE a = 2

query IIII
SELECT * FROM abcd WHERE a = 2
----

statement ok
ALTER TABLE abcd ADD e STRING FAMILY f1

statement ok
INSERT INTO abcd VALUES (9, 10, 11, 12, 'foo')

query IIIIT rowsort
SELECT * from abcd WHERE a > 1
----
5 6  7  8  NULL
9 10 11 12 foo

# Check the descriptor bookkeeping
statement ok
ALTER TABLE abcd ADD COLUMN f DECIMAL

statement error unknown family \"foo\"
ALTER TABLE abcd ADD COLUMN g INT FAMILY foo

statement ok
ALTER TABLE abcd ADD COLUMN g INT CREATE FAMILY

statement error family "f1" already exists
ALTER TABLE abcd ADD COLUMN h INT CREATE FAMILY F1

statement ok
ALTER TABLE abcd ADD COLUMN h INT CREATE FAMILY f_h

statement ok
ALTER TABLE abcd ADD COLUMN i INT CREATE IF NOT EXISTS FAMILY F_H

statement ok
ALTER TABLE abcd ADD COLUMN j INT CREATE IF NOT EXISTS FAMILY f_j

query TT
SHOW CREATE TABLE abcd
----
abcd  CREATE TABLE abcd (
      a INT8 NOT NULL,
      b INT8 NULL,
      c INT8 NULL,
      d INT8 NULL,
      e STRING NULL,
      f DECIMAL NULL,
      g INT8 NULL,
      h INT8 NULL,
      i INT8 NULL,
      j INT8 NULL,
      CONSTRAINT "primary" PRIMARY KEY (a ASC),
      INDEX d_idx (d ASC),
      FAMILY f1 (a, b, e, f),
      FAMILY fam_1_c_d (c, d),
      FAMILY fam_2_g (g),
      FAMILY f_h (h, i),
      FAMILY f_j (j)
)

statement ok
ALTER TABLE abcd DROP c, DROP d, DROP e, DROP h, DROP i, DROP j

query TT
SHOW CREATE TABLE abcd
----
abcd  CREATE TABLE abcd (
      a INT8 NOT NULL,
      b INT8 NULL,
      f DECIMAL NULL,
      g INT8 NULL,
      CONSTRAINT "primary" PRIMARY KEY (a ASC),
      FAMILY f1 (a, b, f),
      FAMILY fam_2_g (g)
)

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

query TT
SHOW CREATE TABLE f1
----
f1  CREATE TABLE f1 (
    a INT8 NOT NULL,
    b STRING NULL,
    c STRING NULL,
    CONSTRAINT "primary" PRIMARY KEY (a ASC),
    FAMILY "primary" (a, b, c)
)

statement ok
CREATE TABLE assign_at_create (a INT PRIMARY KEY FAMILY pri, b INT FAMILY foo, c INT CREATE FAMILY)

query TT
SHOW CREATE TABLE assign_at_create
----
assign_at_create  CREATE TABLE assign_at_create (
                  a INT8 NOT NULL,
                  b INT8 NULL,
                  c INT8 NULL,
                  CONSTRAINT "primary" PRIMARY KEY (a ASC),
                  FAMILY pri (a),
                  FAMILY foo (b),
                  FAMILY fam_2_c (c)
)

# Check the the diff-column-id storage
statement ok
CREATE TABLE unsorted_colids (a INT PRIMARY KEY, b INT NOT NULL, c INT NOT NULL, FAMILY (c, b, a))

statement ok
INSERT INTO unsorted_colids VALUES (1, 1, 1)

statement ok
UPDATE unsorted_colids SET b = 2, c = 3 WHERE a = 1

query III
SELECT * FROM unsorted_colids
----
1 2 3

# Check that family bookkeeping correctly tracks column renames
statement ok
CREATE TABLE rename_col (a INT PRIMARY KEY, b INT, c STRING, FAMILY (a, b), FAMILY (c))

statement ok
ALTER TABLE rename_col RENAME b TO d

statement ok
ALTER TABLE rename_col RENAME c TO e

query TT
SHOW CREATE TABLE rename_col
----
rename_col  CREATE TABLE rename_col (
            a INT8 NOT NULL,
            d INT8 NULL,
            e STRING NULL,
            CONSTRAINT "primary" PRIMARY KEY (a ASC),
            FAMILY fam_0_a_b (a, d),
            FAMILY fam_1_c (e)
)
