should be it

This commit is contained in:
2025-10-24 19:21:19 -05:00
parent a4b23fc57c
commit f09560c7b1
14047 changed files with 3161551 additions and 1 deletions

View File

@@ -0,0 +1,19 @@
# name: test/sql/alter/add_col/test_add_col.test
# description: Test ALTER TABLE ADD COLUMN: standard add column
# group: [add_col]
statement ok
CREATE TABLE test(i INTEGER, j INTEGER)
statement ok
INSERT INTO test VALUES (1, 1), (2, 2)
statement ok
ALTER TABLE test ADD COLUMN k INTEGER
query III
SELECT * FROM test
----
1 1 NULL
2 2 NULL

View File

@@ -0,0 +1,55 @@
# name: test/sql/alter/add_col/test_add_col_chain.test
# description: Test ALTER TABLE ADD COLUMN: multiple ADD COLUMN in the same transaction
# group: [add_col]
statement ok
CREATE TABLE test(i INTEGER, j INTEGER)
statement ok
INSERT INTO test VALUES (1, 1), (2, 2)
statement ok
BEGIN TRANSACTION
statement ok
INSERT INTO test VALUES (3, 3)
statement ok
ALTER TABLE test ADD COLUMN k INTEGER
statement ok
ALTER TABLE test ADD COLUMN l INTEGER
statement ok
ALTER TABLE test ADD COLUMN m INTEGER DEFAULT 3
query IIIII
SELECT * FROM test
----
1
1
NULL
NULL
3
2
2
NULL
NULL
3
3
3
NULL
NULL
3
statement ok
ROLLBACK
query II
SELECT * FROM test
----
1
1
2
2

View File

@@ -0,0 +1,18 @@
# name: test/sql/alter/add_col/test_add_col_default.test
# description: Test ALTER TABLE ADD COLUMN: ADD COLUMN with a default value.
# group: [add_col]
statement ok
CREATE TABLE test(i INTEGER, j INTEGER)
statement ok
INSERT INTO test VALUES (1, 1), (2, 2)
statement ok
ALTER TABLE test ADD COLUMN l INTEGER DEFAULT 3
query III
SELECT i, j, l FROM test
----
1 1 3
2 2 3

View File

@@ -0,0 +1,43 @@
# name: test/sql/alter/add_col/test_add_col_default_seq.test
# description: Test ALTER TABLE ADD COLUMN: ADD COLUMN with sequence as default value
# group: [add_col]
require skip_reload
statement ok
CREATE TABLE test(i INTEGER, j INTEGER)
statement ok
INSERT INTO test VALUES (1, 1), (2, 2)
statement ok
CREATE SEQUENCE seq
statement ok
ALTER TABLE test ADD COLUMN m INTEGER DEFAULT nextval('seq')
query III
SELECT * FROM test
----
1
1
1
2
2
2
statement ok
ALTER TABLE test ADD COLUMN n INTEGER DEFAULT currval('seq')
query IIII
SELECT * FROM test
----
1
1
1
2
2
2
2
2

View File

@@ -0,0 +1,29 @@
# name: test/sql/alter/add_col/test_add_col_incorrect.test
# description: Test ALTER TABLE ADD COLUMN: Incorrect usage
# group: [add_col]
statement ok
CREATE TABLE test(i INTEGER, j INTEGER)
statement ok
INSERT INTO test VALUES (1, 1), (2, 2)
statement error
ALTER TABLE test ADD COLUMN i INTEGER
----
statement ok
CREATE VIEW x(x) AS (SELECT 1)
# Cannot add columns to views
statement error
ALTER VIEW x ADD COLUMN i INTEGER
----
Parser Error: Adding columns is only supported for tables
# Multiple alter per statement not supported yet
statement error
ALTER TABLE i ADD COLUMN j INT, ADD COLUMN k INT
----
Parser Error: Only one ALTER command per statement is supported

View File

@@ -0,0 +1,42 @@
# name: test/sql/alter/add_col/test_add_col_index.test
# description: Test ALTER TABLE ADD COLUMN: ADD COLUMN with index
# group: [add_col]
statement ok
CREATE TABLE test(i INTEGER, j INTEGER)
statement ok
INSERT INTO test VALUES (1, 1), (2, 2)
statement ok
BEGIN TRANSACTION
statement ok
ALTER TABLE test ADD COLUMN k INTEGER DEFAULT 2
statement ok
CREATE INDEX i_index ON test(k)
statement ok
COMMIT
statement ok
INSERT INTO test VALUES (3, 3, 3)
query III
SELECT * FROM test WHERE k=2
----
1
1
2
2
2
2
query III
SELECT * FROM test WHERE k=3
----
3
3
3

View File

@@ -0,0 +1,35 @@
# name: test/sql/alter/add_col/test_add_col_index_rollback.test
# description: Test ALTER TABLE ADD COLUMN: ADD COLUMN rollback with index
# group: [add_col]
statement ok
CREATE TABLE test(i INTEGER, j INTEGER)
statement ok
INSERT INTO test VALUES (1, 1), (2, 2)
statement ok
BEGIN TRANSACTION
statement ok
ALTER TABLE test ADD COLUMN k INTEGER
statement ok
CREATE INDEX i_index ON test(k)
statement ok
ROLLBACK
statement ok
INSERT INTO test VALUES (3, 3)
query II
SELECT * FROM test
----
1
1
2
2
3
3

View File

@@ -0,0 +1,56 @@
# name: test/sql/alter/add_col/test_add_col_local_storage.test
# description: Test ALTER TABLE ADD COLUMN: ADD COLUMN with data inside local storage
# group: [add_col]
statement ok
CREATE TABLE test(i INTEGER, j INTEGER)
statement ok
INSERT INTO test VALUES (1, 1), (2, 2)
statement ok
BEGIN TRANSACTION
statement ok
INSERT INTO test VALUES (3, 3)
statement ok
ALTER TABLE test ADD COLUMN k INTEGER
query III
SELECT * FROM test
----
1
1
NULL
2
2
NULL
3
3
NULL
statement ok
ROLLBACK
query II
SELECT * FROM test
----
1
1
2
2
statement ok
INSERT INTO test VALUES (3, 3)
query II
SELECT * FROM test
----
1
1
2
2
3
3

View File

@@ -0,0 +1,31 @@
# name: test/sql/alter/add_col/test_add_col_stats.test
# description: Test correct stats on adding a new column
# group: [add_col]
statement ok
CREATE TABLE test(i INTEGER, j INTEGER)
statement ok
INSERT INTO test VALUES (1, 1), (2, 2)
statement ok
CREATE SEQUENCE seq
statement ok
ALTER TABLE test ADD COLUMN m INTEGER DEFAULT nextval('seq')
query III
SELECT * FROM test
----
1 1 1
2 2 2
query III
SELECT * FROM test WHERE m=2
----
2 2 2
query I
SELECT stats(m) FROM test LIMIT 1
----
<REGEX>:.*1.*2.*

View File

@@ -0,0 +1,118 @@
# name: test/sql/alter/add_col/test_add_col_transactions.test
# description: Test ALTER TABLE ADD COLUMN with multiple transactions
# group: [add_col]
statement ok con1
CREATE TABLE test(i INTEGER, j INTEGER)
statement ok con1
INSERT INTO test VALUES (1, 1), (2, 2)
# Only one pending table alter can be active at a time
statement ok con1
BEGIN TRANSACTION
# con adds a column to test
statement ok con1
ALTER TABLE test ADD COLUMN k INTEGER
# con2 cannot add a new column now!
statement error con2
ALTER TABLE test ADD COLUMN l INTEGER
----
statement ok con1
COMMIT
# after a commit, con2 can add a new column again
statement ok con2
ALTER TABLE test ADD COLUMN l INTEGER
statement ok con1
DROP TABLE test
statement ok con1
CREATE TABLE test(i INTEGER, j INTEGER)
statement ok con1
INSERT INTO test VALUES (1, 1), (2, 2)
# Can only append to newest table
statement ok con1
BEGIN TRANSACTION
# con adds a column to test
statement ok con1
ALTER TABLE test ADD COLUMN k INTEGER
# con2 cannot append now!
statement error con2
INSERT INTO test (i, j) VALUES (3, 3)
----
# nor delete
statement error con2
DELETE FROM test WHERE i=1
----
altered
query III con1
SELECT * FROM test
----
1 1 NULL
2 2 NULL
query II con2
SELECT * FROM test
----
1 1
2 2
# cannot update an altered table
statement error con2
UPDATE test SET j=100
----
query III con1
SELECT * FROM test
----
1 1 NULL
2 2 NULL
statement ok con1
UPDATE test SET j=100
statement ok con1
COMMIT
query III con1
SELECT * FROM test
----
1 100 NULL
2 100 NULL
statement ok con1
DROP TABLE test
statement ok con1
CREATE TABLE test(i INTEGER, j INTEGER)
statement ok con1
INSERT INTO test VALUES (1, 1), (2, 2)
# Alter table while other transaction still has pending appends
statement ok con2
BEGIN TRANSACTION
statement ok con2
INSERT INTO test VALUES (3, 3)
# now con adds a column
statement ok con1
ALTER TABLE test ADD COLUMN k INTEGER
# cannot commit con2! conflict on append
statement error con2
COMMIT
----

View File

@@ -0,0 +1,43 @@
# name: test/sql/alter/add_col/test_add_col_user_type.test
# description: Test ALTER TABLE ADD COLUMN with "CREATE TYPE"-based types
# group: [add_col]
statement ok
CREATE SCHEMA test_schema;
statement ok
CREATE TYPE main_int AS int32;
statement ok
CREATE TYPE test_schema.test_int AS int32;
statement ok
CREATE TABLE test_schema.test_t1 (i INT);
statement ok
CREATE TABLE main_t1 (i INT);
#
# main.<type> in test_schema.<table>
#
statement error
ALTER TABLE main_t1 ADD COLUMN j test_int;
----
#
# main.<type> in test_schema.<table>
#
statement ok
ALTER TABLE test_schema.test_t1 ADD COLUMN not_found main_int;
#
# test.<type> in test_schema.<table>, with qualifier
# TODO(morrita): Currently the type name cannot be qualified. Fix this.
# statement ok
# ALTER TABLE test_schema.test_t1 ADD COLUMN k test_schema.test_int;
#
# test.<type> in test_schema.<table>, without qualifier
#
statement ok
ALTER TABLE test_schema.test_t1 ADD COLUMN l test_int;

View File

@@ -0,0 +1,28 @@
# name: test/sql/alter/add_pk/test_add_multi_column_pk.test
# description: Test adding a multi-column PRIMARY KEY to a table.
# group: [add_pk]
statement ok
PRAGMA enable_verification;
statement ok
CREATE TABLE test (i INTEGER, j INTEGER, d TEXT);
statement ok
INSERT INTO test VALUES (3, 4, 'hello'), (44, 45, '56');
statement ok
ALTER TABLE test ADD PRIMARY KEY (i, j);
statement ok
INSERT INTO test VALUES (1, 1, 'foo'), (1, 2, 'bar');
statement error
INSERT INTO test VALUES (1, 2, 'oops');
----
<REGEX>:Constraint Error.*Duplicate key "i: 1, j: 2" violates primary key constraint.*
statement error
INSERT INTO test VALUES (NULL, 2, 'nada');
----
<REGEX>:Constraint Error.*NOT NULL constraint failed: test.i.*

View File

@@ -0,0 +1,82 @@
# name: test/sql/alter/add_pk/test_add_pk.test
# description: Test adding a PRIMARY KEY to a table.
# group: [add_pk]
statement ok
PRAGMA enable_verification
statement ok
CREATE TABLE test (i INTEGER, j INTEGER)
statement ok
INSERT INTO test VALUES (1, 1)
statement ok
ALTER TABLE test ADD PRIMARY KEY (j)
query II
SELECT * FROM test
----
1 1
statement ok
INSERT INTO test VALUES (1, 2)
statement error
INSERT INTO test VALUES (2, 1)
----
<REGEX>:Constraint Error.*Duplicate key "j: 1" violates primary key constraint.*
statement error
INSERT INTO test VALUES (2, NULL)
----
<REGEX>:Constraint Error.*NOT NULL constraint failed.*
# FIXME: Perform duplicate verification before building the index.
statement error
ALTER TABLE test ADD PRIMARY KEY (i)
----
<REGEX>:Constraint Error.*contains duplicates on indexed column.*
statement error
ALTER TABLE test ADD PRIMARY KEY (j)
----
<REGEX>:Catalog Error.*an index with that name already exists for this table: PRIMARY_test_j.*
# Reverse the column order in the index.
statement ok
CREATE TABLE reverse (i INTEGER, j INTEGER)
statement ok
INSERT INTO reverse VALUES (1, 2)
statement ok
ALTER TABLE reverse ADD PRIMARY KEY (j, i)
statement error
INSERT INTO reverse VALUES (1, 2)
----
<REGEX>:Constraint Error.*Duplicate key "j: 2, i: 1" violates primary key constraint.*
statement error
INSERT INTO reverse (j, i) VALUES (2, 1)
----
<REGEX>:Constraint Error.*Duplicate key "j: 2, i: 1" violates primary key constraint.*
# Use an index scan.
statement ok
CREATE TABLE scan (i INTEGER, j INTEGER)
statement ok
INSERT INTO scan SELECT range, range + 1 FROM range(30000);
statement ok
ALTER TABLE scan ADD PRIMARY KEY (i)
query II
SELECT * FROM scan WHERE i = 2
----
2 3

View File

@@ -0,0 +1,36 @@
# name: test/sql/alter/add_pk/test_add_pk_alter_in_tx.test
# description: Test altering a different constraint in the transaction.
# group: [add_pk]
statement ok
PRAGMA enable_verification
statement ok
CREATE TABLE test (i INTEGER, j INTEGER)
statement ok
ALTER TABLE test ADD PRIMARY KEY (j);
statement ok
INSERT INTO test VALUES (1, 1)
statement ok
BEGIN TRANSACTION
statement ok
ALTER TABLE test ALTER COLUMN j SET NOT NULL;
# Throw a constraint violation on the transaction-local storage.
statement error
INSERT INTO test VALUES (2, 1)
----
<REGEX>:Constraint Error.*violates primary key constraint.*
statement ok
ROLLBACK
statement error
INSERT INTO test VALUES (2, 1)
----
<REGEX>:Constraint Error.*violates primary key constraint.*

View File

@@ -0,0 +1,44 @@
# name: test/sql/alter/add_pk/test_add_pk_attach.test
# description: Test adding a PRIMARY KEY combined with ATTACH/DETACH.
# group: [add_pk]
require skip_reload
load __TEST_DIR__/test_add_pk_attach.db
statement ok
PRAGMA enable_verification
statement ok
CREATE TABLE test (i INTEGER, j INTEGER)
statement ok
ALTER TABLE test ADD PRIMARY KEY (j)
statement ok
INSERT INTO test VALUES (1, 1)
statement ok
ATTACH ':memory:' as memory
statement ok
USE memory
statement ok
DETACH test_add_pk_attach
statement ok
ATTACH '__TEST_DIR__/test_add_pk_attach.db' as test_add_pk_attach
statement ok
USE test_add_pk_attach
statement error
ALTER TABLE test ADD PRIMARY KEY (i)
----
<REGEX>:Catalog Error.*table "test" can have only one primary key.*
statement error
INSERT INTO test VALUES (2, 1)
----
<REGEX>:Constraint Error.*Duplicate key "j: 1" violates primary key constraint.*

View File

@@ -0,0 +1,45 @@
# name: test/sql/alter/add_pk/test_add_pk_catalog_error.test
# description: Test adding a PRIMARY KEY to an invalid table and column.
# group: [add_pk]
statement ok
PRAGMA enable_verification
statement ok
CREATE TABLE test (i INTEGER, j INTEGER)
statement error
ALTER TABLE test ADD PRIMARY KEY (i_do_not_exist)
----
<REGEX>:Catalog Error.*table "test" does not have a column named "i_do_not_exist".*
statement error
ALTER TABLE i_do_not_exist ADD PRIMARY KEY (i, j)
----
<REGEX>:Catalog Error.*Table with name i_do_not_exist does not exist!.*
# Try to add it to a column that already has a UNIQUE index.
statement ok
CREATE TABLE uniq (i INTEGER UNIQUE, j INTEGER)
statement ok
INSERT INTO uniq VALUES (1, 10), (2, 20), (3, 30)
statement error
INSERT INTO uniq VALUES (1, 100)
----
<REGEX>:Constraint Error.*Duplicate key "i: 1" violates unique constraint.*
statement ok
ALTER TABLE uniq ADD PRIMARY KEY (i)
statement error
INSERT INTO uniq VALUES (1, 101)
----
<REGEX>:Constraint Error.*Duplicate key "i: 1" violates.*constraint.*
statement error
INSERT INTO uniq VALUES (NULL, 100)
----
<REGEX>:Constraint Error.*NOT NULL constraint failed: uniq.i.*

View File

@@ -0,0 +1,27 @@
# name: test/sql/alter/add_pk/test_add_pk_commit.test
# description: Test committing the transaction-local ADD PRIMARY KEY command.
# group: [add_pk]
statement ok
PRAGMA enable_verification
statement ok
CREATE TABLE test (i INTEGER, j INTEGER)
statement ok
BEGIN TRANSACTION
statement ok
INSERT INTO test VALUES (1, 1)
statement ok
ALTER TABLE test ADD PRIMARY KEY (j)
statement ok
COMMIT
statement error
INSERT INTO test VALUES (2, 1)
----
<REGEX>:Constraint Error.*Duplicate key "j: 1" violates primary key constraint.*

View File

@@ -0,0 +1,31 @@
# name: test/sql/alter/add_pk/test_add_pk_drop_and_reload.test
# description: Test adding a PRIMARY KEY, dropping everything, restarting, and recreating the PRIMARY KEY.
# group: [add_pk]
load __TEST_DIR__/test_add_pk_drop_reload.db
statement ok
PRAGMA enable_verification
statement ok
CREATE TABLE test (i INTEGER, j INTEGER)
statement ok
ALTER TABLE test ADD PRIMARY KEY (j)
statement ok
INSERT INTO test VALUES (1, 1)
statement ok
DROP TABLE test
restart
statement ok
CREATE TABLE test (i INTEGER, j INTEGER)
statement ok
INSERT INTO test VALUES (1, 1)
statement ok
ALTER TABLE test ADD PRIMARY KEY (j)

View File

@@ -0,0 +1,28 @@
# name: test/sql/alter/add_pk/test_add_pk_gaps_in_rowids.test
# description: Test adding a PRIMARY KEY to a table with gaps in its row IDs.
# group: [add_pk]
statement ok
PRAGMA enable_verification
statement ok
CREATE TABLE integers(i integer)
statement ok
INSERT INTO integers SELECT * FROM range(50000);
query I
SELECT i FROM integers WHERE i = 100
----
100
statement ok
DELETE FROM integers WHERE i = 42;
statement ok
ALTER TABLE integers ADD PRIMARY KEY (i);
query I
SELECT i FROM integers WHERE i = 100
----
100

View File

@@ -0,0 +1,57 @@
# name: test/sql/alter/add_pk/test_add_pk_invalid_data.test
# description: Test adding a PRIMARY KEY to a table with invalid data.
# group: [add_pk]
statement ok
PRAGMA enable_verification
statement ok
CREATE TABLE duplicates (i INTEGER, j INTEGER)
statement ok
INSERT INTO duplicates VALUES (1, 10), (2, 20), (3, 30), (1, 100)
statement error
ALTER TABLE duplicates ADD PRIMARY KEY (i)
----
<REGEX>:Constraint Error.*contains duplicates on indexed column.*
# Now test with NULLs.
statement ok
CREATE TABLE nulls (i INTEGER, j INTEGER);
statement ok
INSERT INTO nulls VALUES (1, 10), (2, NULL), (3, 30), (4, 40);
statement error
ALTER TABLE nulls ADD PRIMARY KEY (i, j);
----
<REGEX>:Constraint Error.*NOT NULL constraint failed.*
statement ok
DROP TABLE nulls;
statement ok
CREATE TABLE nulls (i INTEGER, j INTEGER);
statement ok
INSERT INTO nulls VALUES (5, 10), (NULL, 20), (7, 30), (8, 100);
statement error
ALTER TABLE nulls ADD PRIMARY KEY (i)
----
<REGEX>:Constraint Error.*NOT NULL constraint failed.*
# Validate NULL on a compound index.
statement ok
CREATE TABLE nulls_compound (i INTEGER, j INTEGER, k VARCHAR)
statement ok
INSERT INTO nulls_compound VALUES (1, 10, 'hello'), (2, 20, 'world'), (NULL, NULL, NULL), (3, 100, 'yay');
statement error
ALTER TABLE nulls_compound ADD PRIMARY KEY (k, i)
----
<REGEX>:Constraint Error.*NOT NULL constraint failed.*

View File

@@ -0,0 +1,19 @@
# name: test/sql/alter/add_pk/test_add_pk_invalid_type.test
# description: Test adding a PRIMARY KEY with an invalid type.
# group: [add_pk]
statement ok
PRAGMA enable_verification
statement ok
CREATE TABLE test (a INTEGER[], b INTEGER)
statement error
ALTER TABLE test ADD PRIMARY KEY (a)
----
<REGEX>:Invalid type Error.*Invalid Type.*Invalid type for index key.*
statement error
ALTER TABLE test ADD PRIMARY KEY (a, b)
----
<REGEX>:Invalid type Error.*Invalid Type.*Invalid type for index key.*

View File

@@ -0,0 +1,51 @@
# name: test/sql/alter/add_pk/test_add_pk_naming_conflict.test
# description: Test adding a PRIMARY KEY to a table that already has an index with that name.
# group: [add_pk]
# There is also a catalog dependency conflict,
# which prevents altering a table with a dependency (index) on it.
load __TEST_DIR__/test_add_pk_naming_conflict.db
statement ok
PRAGMA enable_verification;
statement ok
CREATE TABLE tbl (i INTEGER);
statement ok
INSERT INTO tbl VALUES (1);
statement ok
CREATE INDEX PRIMARY_tbl_i ON tbl(i);
statement error
ALTER TABLE tbl ADD PRIMARY KEY (i);
----
<REGEX>:Catalog Error.*already exists.*
restart
statement ok
PRAGMA enable_verification;
statement error
ALTER TABLE tbl ADD PRIMARY KEY (i);
----
<REGEX>:Catalog Error.*already exists.*
# Let's do it the other way around now.
statement ok
CREATE TABLE test (i INTEGER)
statement ok
INSERT INTO test VALUES (1);
statement ok
ALTER TABLE test ADD PRIMARY KEY (i);
statement error
CREATE INDEX PRIMARY_test_i ON test(i);
----
<REGEX>:Catalog Error.*index with the name PRIMARY_test_i already exists.*

View File

@@ -0,0 +1,44 @@
# name: test/sql/alter/add_pk/test_add_pk_reclaim_storage.test_slow
# description: Test that we reclaim the storage after adding and dropping a PK.
# group: [add_pk]
load __TEST_DIR__/test_add_pk_reclaim_storage.db
statement ok
PRAGMA disable_checkpoint_on_shutdown
statement ok
PRAGMA wal_autocheckpoint='1TB';
statement ok
PRAGMA enable_verification
statement ok
SET force_compression='uncompressed';
loop i 0 10
statement ok
CREATE TABLE tbl${i} AS SELECT range AS i FROM range(500000)
statement ok
ALTER TABLE tbl${i} ADD PRIMARY KEY (i);
query I
SELECT i FROM tbl${i} WHERE i = 500;
----
500
statement ok
CHECKPOINT;
statement ok
DROP TABLE tbl${i};
statement ok
CHECKPOINT;
query I nosort expected_blocks
SELECT round(total_blocks / 100.0) FROM pragma_database_size();
endloop

View File

@@ -0,0 +1,57 @@
# name: test/sql/alter/add_pk/test_add_pk_rollback.test
# description: Test invalidating the constraint with uncommitted changes.
# group: [add_pk]
statement ok
PRAGMA enable_verification;
statement ok
CREATE TABLE test (i INTEGER, j INTEGER);
statement ok
BEGIN TRANSACTION
statement ok
INSERT INTO test VALUES (1, 1);
statement ok
ALTER TABLE test ADD PRIMARY KEY (j);
statement ok
INSERT INTO test VALUES (2, 1);
# Throw a constraint violation on the transaction-local storage.
statement error
COMMIT
----
<REGEX>:TransactionContext Error.*Failed to commit: PRIMARY KEY or UNIQUE constraint violation: duplicate key "1".*
# Inserting duplicate values must work after rolling back.
statement ok
INSERT INTO test VALUES (1, 1), (2, 1), (2, NULL);
# Invalidate the transaction with a constraint violation.
statement ok
CREATE TABLE other (i INTEGER, j INTEGER);
statement ok
BEGIN TRANSACTION
statement ok
INSERT INTO other VALUES (1, 1), (2, 1);
statement ok
ALTER TABLE other ADD PRIMARY KEY (j);
statement error
COMMIT
----
<REGEX>:TransactionContext Error.*Failed to commit: PRIMARY KEY or UNIQUE constraint violation: duplicate key "1".*
# Inserting duplicate values must work after rolling back.
statement ok
INSERT INTO test VALUES (1, 1), (2, 1), (2, NULL);

View File

@@ -0,0 +1,29 @@
# name: test/sql/alter/add_pk/test_add_pk_storage.test
# description: Test adding and persisting a PRIMARY KEY.
# group: [add_pk]
load __TEST_DIR__/test_add_pk.db
statement ok
PRAGMA enable_verification
statement ok
CREATE TABLE test (i INTEGER, j INTEGER)
statement ok
ALTER TABLE test ADD PRIMARY KEY (j)
statement ok
INSERT INTO test VALUES (1, 1)
restart
statement error
ALTER TABLE test ADD PRIMARY KEY (i)
----
<REGEX>:Catalog Error.*table "test" can have only one primary key.*
statement error
INSERT INTO test VALUES (2, 1)
----
<REGEX>:Constraint Error.*Duplicate key "j: 1" violates primary key constraint.*

View File

@@ -0,0 +1,37 @@
# name: test/sql/alter/add_pk/test_add_pk_wal.test
# description: Test persisting the ALTER TABLE ... ADD PRIMARY KEY statement to the WAL.
# group: [add_pk]
load __TEST_DIR__/test_add_pk_wal.db
statement ok
PRAGMA disable_checkpoint_on_shutdown
statement ok
PRAGMA wal_autocheckpoint='1TB';
statement ok
PRAGMA enable_verification
statement ok
CREATE TABLE test (i INTEGER, j INTEGER);
statement ok
INSERT INTO test VALUES (1, 2), (3, 4);
statement ok
ALTER TABLE test ADD PRIMARY KEY (j)
restart
statement error
ALTER TABLE test ADD PRIMARY KEY (i)
----
<REGEX>:Catalog Error.*table "test" can have only one primary key.*
statement error
INSERT INTO test VALUES (2, 2)
----
<REGEX>:Constraint Error.*Duplicate key "j: 2" violates primary key constraint.*

View File

@@ -0,0 +1,39 @@
# name: test/sql/alter/add_pk/test_add_pk_with_generated_column.test
# description: Test adding a PRIMARY KEY to a table with a generated column.
# group: [add_pk]
statement ok
PRAGMA enable_verification;
statement ok
CREATE TABLE test (
a INT NOT NULL,
b INT GENERATED ALWAYS AS (a) VIRTUAL,
c INT,
);
statement ok
INSERT INTO test VALUES (5, 4);
# Cannot add a PK to generated columns.
statement error
ALTER TABLE test ADD PRIMARY KEY (b);
----
<REGEX>:Binder Error.*cannot create a PRIMARY KEY on a generated column: b.*
statement error
ALTER TABLE test ADD PRIMARY KEY (b, c);
----
<REGEX>:Binder Error.*cannot create a PRIMARY KEY on a generated column: b.*
# Can add a PK to a non-generated column.
statement ok
ALTER TABLE test ADD PRIMARY KEY (c);
statement error
INSERT INTO test VALUES (1, 4);
----
<REGEX>:Constraint Error.*violates primary key constraint.*

View File

@@ -0,0 +1,47 @@
# name: test/sql/alter/add_pk/test_add_same_pk_simultaneously.test
# description: Test adding the same PRIMARY KEY in two different transactions.
# group: [add_pk]
statement ok
PRAGMA enable_verification
statement ok
CREATE TABLE test (i INTEGER, j INTEGER)
statement ok tran1
BEGIN TRANSACTION
statement ok tran1
ALTER TABLE test ADD PRIMARY KEY (j)
statement ok tran2
BEGIN TRANSACTION
# We trigger a Catalog write-write conflict.
statement error tran2
ALTER TABLE test ADD PRIMARY KEY (j)
----
<REGEX>:TransactionContext Error.*cannot add an index to a table that has been altered.*
statement ok tran3
BEGIN TRANSACTION
statement ok tran1
ROLLBACK
statement ok tran2
ROLLBACK
statement ok tran3
ALTER TABLE test ADD PRIMARY KEY (j)
statement ok tran3
COMMIT
statement error
INSERT INTO test VALUES (1, 1), (1, 1)
----
<REGEX>:Constraint Error.*PRIMARY KEY or UNIQUE constraint violation.*

View File

@@ -0,0 +1,43 @@
# name: test/sql/alter/add_pk/test_add_same_pk_twice.test
# description: Test adding the same PRIMARY KEY twice.
# group: [add_pk]
statement ok
PRAGMA enable_verification
statement ok
CREATE TABLE test (i INTEGER, j INTEGER)
statement ok
BEGIN TRANSACTION
statement ok
ALTER TABLE test ADD PRIMARY KEY (j)
statement error
ALTER TABLE test ADD PRIMARY KEY (i)
----
<REGEX>:Catalog Error.*table "test" can have only one primary key.*
statement ok
COMMIT
# Without a transaction.
statement ok
CREATE TABLE other (i INTEGER PRIMARY KEY, j INTEGER)
statement error
ALTER TABLE other ADD PRIMARY KEY (i, j)
----
<REGEX>:Catalog Error.*table "other" can have only one primary key.*
statement error
ALTER TABLE other ADD PRIMARY KEY (i)
----
<REGEX>:Catalog Error.*table "other" can have only one primary key.*
statement error
ALTER TABLE other ADD PRIMARY KEY (j)
----
<REGEX>:Catalog Error.*table "other" can have only one primary key.*

View File

@@ -0,0 +1,88 @@
# name: test/sql/alter/alter_col/test_drop_not_null.test
# description: Test ALTER TABLE ALTER COLUMN column_name DROP NOT NULL
# group: [alter_col]
# Happy path
statement ok
PRAGMA enable_verification
statement ok
CREATE TABLE test(i INTEGER, j INTEGER NOT NULL)
statement ok
INSERT INTO test VALUES (1, 1), (2, 2)
statement error
INSERT INTO test VALUES (3, NULL)
----
query II
SELECT * FROM test
----
1 1
2 2
statement ok
ALTER TABLE test ALTER COLUMN j DROP NOT NULL
statement ok
INSERT INTO test VALUES (3, NULL)
query II
SELECT * FROM test
----
1 1
2 2
3 NULL
# Negative path
statement ok
CREATE TABLE test2(i INTEGER, j INTEGER)
statement ok
INSERT INTO test2 VALUES (1, 1), (2, 2)
statement ok
ALTER TABLE test2 ALTER COLUMN j DROP NOT NULL
statement ok
INSERT INTO test VALUES (3, NULL)
# Drop not null with generated column presented
statement ok
DROP TABLE IF EXISTS test
statement ok
CREATE TABLE test(i AS (1), j INTEGER NOT NULL)
statement ok
INSERT INTO test VALUES (1), (2)
statement error
INSERT INTO test VALUES (NULL)
----
query II
SELECT * FROM test
----
1 1
1 2
statement ok
ALTER TABLE test ALTER COLUMN i DROP NOT NULL
statement ok
ALTER TABLE test ALTER COLUMN j DROP NOT NULL
statement ok
INSERT INTO test VALUES (NULL)
query II
SELECT * FROM test
----
1 1
1 2
1 NULL

View File

@@ -0,0 +1,270 @@
# name: test/sql/alter/alter_col/test_not_null_in_tran.test
# description: Test Set/Drop NOT NULL in transaction
# group: [alter_col]
statement ok
PRAGMA enable_verification
# Scenario #1, alter with uncommitted data
statement ok
CREATE TABLE t(i INTEGER, j INTEGER)
statement ok
INSERT INTO t SELECT i, i FROM RANGE(2048) tbl(i)
# Insert uncommitted null
statement ok
BEGIN TRANSACTION
statement ok
INSERT INTO t VALUES(9999, NULL)
statement error
ALTER TABLE t ALTER COLUMN j SET NOT NULL
----
statement ok
ROLLBACK
statement ok
INSERT INTO t VALUES(9999, NULL)
# Has null, cannot alter after tran
statement error
ALTER TABLE t ALTER COLUMN j SET NOT NULL
----
query I
SELECT i FROM t WHERE j IS NULL
----
9999
# Prepare persistent data
statement ok
DROP TABLE IF EXISTS t
statement ok
CREATE TABLE t(i INTEGER, j INTEGER)
statement ok
INSERT INTO t SELECT i, i FROM RANGE(2048) tbl(i)
# Insert uncommitted data
statement ok
BEGIN TRANSACTION
statement ok
INSERT INTO t values(8888, 8888)
statement ok
ALTER TABLE t ALTER COLUMN j SET NOT NULL
statement ok
COMMIT
# Cannot insert after tran
statement error
INSERT INTO t VALUES(9999, NULL)
----
# No null data
query II
SELECT * FROM t WHERE j = 8888
----
8888 8888
# Scenario #2, add/drop in the same tran
statement ok
DROP TABLE IF EXISTS t
statement ok
CREATE TABLE t(i int, j int)
statement ok
INSERT INTO T SELECT 1,1 FROM RANGE(2048)
statement ok
BEGIN TRANSACTION
statement ok
ALTER TABLE t ALTER COLUMN j SET NOT NULL
statement ok
INSERT INTO t VALUES(2, 2)
statement ok
ALTER TABLE t ALTER COLUMN j DROP NOT NULL
statement ok
INSERT INTO t values(3, NULL)
statement ok
COMMIT
# Insert null after tran
statement ok
INSERT INTO t VALUES(4, NULL)
query II
SELECT * FROM t WHERE j IS NULL
----
3 NULL
4 NULL
# Scenario #3, rollback alter
statement ok
DROP TABLE IF EXISTS t
statement ok
CREATE TABLE t(i int, j int)
statement ok
INSERT INTO T SELECT 1,1 FROM RANGE(2048)
statement ok
BEGIN TRANSACTION
# Set&Rollback
statement ok
ALTER TABLE t ALTER COLUMN j SET NOT NULL
statement ok
INSERT INTO T VALUES(8888, 8888)
statement ok
ROLLBACK
# CAN insert null after rollback
statement ok
INSERT INTO t VALUES(9999, NULL)
query I
SELECT i FROM t WHERE j IS NULL
----
9999
# Prepare data with NOT NULL constraint
statement ok
DROP TABLE IF EXISTS t
statement ok
CREATE TABLE t(i int, j int)
statement ok
ALTER TABLE t ALTER COLUMN j SET NOT NULL
statement ok
INSERT INTO T SELECT 1,1 FROM RANGE(2048)
statement ok
BEGIN TRANSACTION
# Drop&Rollback
statement ok
ALTER TABLE t ALTER COLUMN j DROP NOT NULL
statement ok
INSERT INTO T VALUES(7777, NULL)
statement ok
ROLLBACK
# CANNOT insert null after rollback
statement error
INSERT INTO t VALUES(8888, NULL)
----
# NO null values
query I
SELECT COUNT(*) FROM t WHERE j IS NULL
----
0
# Scenario #4, Create table then Alter in the same tran
# Set in the same tran
statement ok
DROP TABLE IF EXISTS t
statement ok
BEGIN TRANSACTION
statement ok
CREATE TABLE t(i INTEGER)
statement ok
ALTER TABLE t ALTER COLUMN i SET NOT NULL
statement ok
INSERT INTO t SELECT 1 FROM RANGE(1024)
statement ok
COMMIT
statement error
INSERT INTO t VALUES(NULL)
----
# Drop in the same tran
statement ok
DROP TABLE IF EXISTS t
statement ok
BEGIN TRANSACTION
statement ok
CREATE TABLE t(i INTEGER NOT NULL)
statement ok
INSERT INTO t SELECT 1 FROM RANGE(1024)
statement ok
ALTER TABLE t ALTER COLUMN i DROP NOT NULL
statement ok
INSERT INTO t VALUES(NULL)
statement ok
COMMIT
statement ok
INSERT INTO t VALUES(NULL)
mode skip
# Scenario #5, Insert null, delete null locally, then alter
statement ok
DROP TABLE IF EXISTS t
statement ok
CREATE TABLE t(i INTEGER, j INTEGER)
statement ok
INSERT INTO t SELECT 1,1 FROM RANGE(1024)
# Insert null
statement ok
INSERT INTO t VALUES(2,NULL)
statement ok
BEGIN TRANSACTION
# Delete null locally
statement ok
DELETE FROM t WHERE i = 2
statement ok
ALTER TABLE t ALTER COLUMN j SET NOT NULL
statement ok
COMMIT
statement error
INSERT INTO t VALUES(3, NULL)
----
# NO null values
query I
SELECT COUNT(*) FROM t WHERE j IS NULL
----
0
mode unskip

View File

@@ -0,0 +1,253 @@
# name: test/sql/alter/alter_col/test_not_null_multi_tran.test
# description: Test Set/Drop NOT NULL in multiple transactions
# group: [alter_col]
statement ok
PRAGMA enable_verification
# Scenario #1, tran1 set not null, tran2 not able to insert
statement ok con1
CREATE TABLE t(i INTEGER, j INTEGER)
statement ok con1
BEGIN TRANSACTION
statement ok con1
ALTER TABLE t ALTER COLUMN j SET NOT NULL
statement ok con2
BEGIN TRANSACTION
statement error con2
INSERT INTO t VALUES(7777, NULL)
----
statement ok con1
INSERT INTO t VALUES(7, 7)
statement ok con2
ROLLBACK
statement ok con1
COMMIT
query I con1
SELECT i FROM t
----
7
# Scenario #2, tran1 set not null, tran2 failed to commit
statement ok con1
DROP TABLE IF EXISTS t
statement ok con1
CREATE TABLE t(i INTEGER, j INTEGER)
statement ok con1
BEGIN TRANSACTION
statement ok con2
BEGIN TRANSACTION
statement ok con2
INSERT INTO t VALUES(7777, NULL)
statement ok con1
ALTER TABLE t ALTER COLUMN j SET NOT NULL
statement ok con1
COMMIT
statement error con2
COMMIT
----
statement error con1
INSERT INTO t VALUES(7777, NULL)
----
query I con1
SELECT COUNT(*) FROM t
----
0
# Scenario #3, cannot insert if one connection alter column
statement ok con1
DROP TABLE IF EXISTS t
statement ok con1
CREATE TABLE t(i INTEGER, j INTEGER)
statement ok con1
BEGIN TRANSACTION
statement ok con1
ALTER TABLE t ALTER COLUMN j SET NOT NULL
statement ok con2
BEGIN TRANSACTION
statement error con2
INSERT INTO t VALUES(1, 1)
----
statement ok con1
COMMIT
statement ok con2
ROLLBACK
query I con1
SELECT count(*) from t
----
0
# For following tests:
# begin t1 and begin t2
# a1 = alter in t1;
# c1 = commint t1;
# i2 = insert in t1;
# c2 = commit t2
#
# Scenario #4, a1+c1+i2+c2
# i2 failed with following error:
# Transaction conflict: adding entries to a table that has been altered!
statement ok con1
DROP TABLE IF EXISTS t
statement ok con1
CREATE TABLE t(i INTEGER, j INTEGER)
statement ok con1
BEGIN TRANSACTION
statement ok con2
BEGIN TRANSACTION
statement ok con1
ALTER TABLE t ALTER COLUMN j SET NOT NULL
statement ok con1
COMMIT
statement error con2
INSERT INTO t VALUES(1, NULL)
----
statement ok con2
ROLLBACK
query I con1
SELECT count(*) from t
----
0
# Scenario #5, i2+a1+c1+c2
# c2 failed with following error
# Transaction conflict: adding entries to a table that has been altered!
statement ok con1
DROP TABLE IF EXISTS t
statement ok con1
CREATE TABLE t(i INTEGER, j INTEGER)
statement ok con1
BEGIN TRANSACTION
statement ok con2
BEGIN TRANSACTION
statement ok con2
INSERT INTO t VALUES(1, NULL)
statement ok con1
ALTER TABLE t ALTER COLUMN j SET NOT NULL
statement ok con1
COMMIT
#Failed to commit
statement error con2
COMMIT
----
statement error con2
INSERT INTO t VALUES(2, NULL)
----
query I con1
SELECT count(*) from t
----
0
# Scenario #6, i2+a1+c2+c1
# c2 failed with following error
# Transaction conflict: adding entries to a table that has been altered!
statement ok con1
DROP TABLE IF EXISTS t
statement ok con1
CREATE TABLE t(i INTEGER, j INTEGER)
statement ok con1
BEGIN TRANSACTION
statement ok con2
BEGIN TRANSACTION
statement ok con2
INSERT INTO t VALUES(1, NULL)
statement ok con1
ALTER TABLE t ALTER COLUMN j SET NOT NULL
# Failed to commit
statement error con2
COMMIT
----
statement ok con1
COMMIT
# Failed to insert null
statement error con2
INSERT INTO t VALUES(2, NULL)
----
query I con1
SELECT count(*) from t
----
0
# Scenario #7, i2+c2+a1+c1
# a1 should failed!
statement ok con1
DROP TABLE IF EXISTS t
statement ok con1
CREATE TABLE t(i INTEGER, j INTEGER)
statement ok con1
BEGIN TRANSACTION
statement ok con2
BEGIN TRANSACTION
statement ok con2
INSERT INTO t VALUES(1, NULL)
statement ok con2
COMMIT
statement error con1
ALTER TABLE t ALTER COLUMN j SET NOT NULL
----
statement ok con1
ROLLBACK
query I con1
SELECT count(*) from t
----
1

View File

@@ -0,0 +1,156 @@
# name: test/sql/alter/alter_col/test_set_not_null.test
# description: Test ALTER TABLE ALTER COLUMN column_name SET NOT NULL
# group: [alter_col]
# Happy path
statement ok
PRAGMA enable_verification
statement ok
CREATE TABLE t(i INTEGER, j INTEGER)
statement ok
INSERT INTO t VALUES (1, 1), (2, 2)
statement ok
ALTER TABLE t ALTER COLUMN j SET NOT NULL
statement error
INSERT INTO t VALUES (3, NULL)
----
# SET again
statement ok
ALTER TABLE t ALTER COLUMN j SET NOT NULL
statement error
INSERT INTO t VALUES (3, NULL)
----
query II
SELECT * FROM t
----
1 1
2 2
# Large table
statement ok
INSERT INTO t SELECT 5,5 from range(65534)
statement ok
ALTER TABLE t ALTER COLUMN j SET NOT NULL
statement error
INSERT INTO t VALUES (6, NULL)
----
query I
SELECT COUNT(*) FROM t WHERE j IS NULL
----
0
# SET NOT NULL failed if contains null value
statement ok
DROP TABLE IF EXISTS t
statement ok
CREATE TABLE t(i INTEGER, j INTEGER)
statement ok
INSERT INTO t VALUES (1, 1), (2, 2), (3, null)
statement ok
INSERT INTO t SELECT 4,4 FROM RANGE(65536)
statement error
ALTER TABLE t ALTER COLUMN j SET NOT NULL
----
statement ok
INSERT INTO t VALUES (5, null)
query II
SELECT * FROM t WHERE j IS NULL
----
3 NULL
5 NULL
# Insert null before&after drop constraint
statement ok
DROP TABLE IF EXISTS t
statement ok
CREATE TABLE t(i INTEGER, j INTEGER)
statement ok
INSERT INTO t SELECT 1,1 FROM RANGE(65536)
# Set not null
statement ok
ALTER TABLE t ALTER COLUMN j SET NOT NULL
# Failed to insert before drop constraint
statement error
INSERT INTO t VALUES (2, null)
----
# Drop not null
statement ok
ALTER TABLE t ALTER COLUMN j DROP NOT NULL
# Insert after drop constraint
statement ok
INSERT INTO t VALUES (3, null)
# Only 1 null
query II
SELECT * FROM t WHERE j IS NULL
----
3 NULL
# Basic test with generated column
statement ok
CREATE TABLE t0(c0 AS (1), c1 INT);
statement ok
ALTER TABLE t0 ALTER c1 SET NOT NULL;
# Insert null before&after drop constraint with generated column
statement ok
DROP TABLE IF EXISTS t
statement ok
CREATE TABLE t(i AS (1), j INTEGER)
statement ok
INSERT INTO t SELECT 1 FROM RANGE(65536)
# Set not null
statement error
ALTER TABLE t ALTER COLUMN i SET NOT NULL
----
# Set not null
statement ok
ALTER TABLE t ALTER COLUMN j SET NOT NULL
# Failed to insert before drop constraint
statement error
INSERT INTO t VALUES (null)
----
# Drop not null
statement ok
ALTER TABLE t ALTER COLUMN j DROP NOT NULL
# Insert after drop constraint
statement ok
INSERT INTO t VALUES (null)
# Only 1 null
query II
SELECT * FROM t WHERE j IS NULL
----
1 NULL

View File

@@ -0,0 +1,19 @@
# name: test/sql/alter/alter_table_set_partitioned_by.test
# description: Test ALTER TABLE SET PARTITIONED BY
# group: [alter]
statement ok
PRAGMA enable_verification
statement ok
CREATE TABLE tbl(i INTEGER);
statement error
ALTER TABLE tbl SET PARTITIONED BY (i)
----
not supported
statement error
ALTER TABLE tbl RESET PARTITIONED BY;
----
not supported

View File

@@ -0,0 +1,19 @@
# name: test/sql/alter/alter_table_set_sorted_by.test
# description: Test ALTER TABLE SET SORTED BY
# group: [alter]
statement ok
PRAGMA enable_verification
statement ok
CREATE TABLE tbl(i INTEGER);
statement error
ALTER TABLE tbl SET SORTED BY (i DESC NULLS FIRST)
----
not supported
statement error
ALTER TABLE tbl RESET SORTED BY;
----
not supported

View File

@@ -0,0 +1,38 @@
# name: test/sql/alter/alter_type/alter_type_struct.test
# description: ALTER TYPE with multi column references
# group: [alter_type]
statement ok
CREATE TABLE test AS SELECT {'t': 42} t
query I
SELECT * FROM test
----
{'t': 42}
statement ok
ALTER TABLE test ALTER t TYPE ROW(t VARCHAR) USING {'t': concat('hello', (test.t.t + 42)::varchar)}
query I
SELECT * FROM test
----
{'t': hello84}
statement ok
DROP TABLE test;
statement ok
CREATE TABLE test AS SELECT {'t': 42} t
query I
SELECT * FROM test
----
{'t': 42}
statement ok
ALTER TABLE test ALTER t TYPE ROW(t VARCHAR) USING {'t': concat('hello', (t.t + 42)::varchar)}
query I
SELECT * FROM test
----
{'t': hello84}

View File

@@ -0,0 +1,78 @@
# name: test/sql/alter/alter_type/test_alter_type.test
# description: Test ALTER TABLE ALTER TYPE.
# group: [alter_type]
statement ok
PRAGMA enable_verification
statement ok
CREATE TABLE test(i INTEGER, j INTEGER)
statement ok
INSERT INTO test VALUES (1, 1), (2, 2)
statement ok
ALTER TABLE test ALTER i SET DATA TYPE VARCHAR
query TI
SELECT * FROM test ORDER BY ALL
----
1 1
2 2
# Filter on an altered column.
query TI
SELECT * FROM test WHERE i = '1'
----
1 1
statement ok
ALTER TABLE test ALTER i SET DATA TYPE INTEGER
query II
SELECT * FROM test WHERE i = 1
----
1 1
statement ok
PRAGMA disable_verification
query I
SELECT stats(i) FROM test LIMIT 1
----
<REGEX>:.*1.*2.*
statement ok
PRAGMA enable_verification
# Fail on non-existent column.
statement error
ALTER TABLE test ALTER not_a_column SET DATA TYPE INTEGER
----
<REGEX>:Binder Error.*does not have a column with name.*
# Test ALTER TYPE USING
statement ok
CREATE TABLE tbl (col STRUCT(i INT));
statement ok
INSERT INTO tbl SELECT {'i': range} FROM range(5000);
statement ok
ALTER TABLE tbl ALTER col TYPE USING struct_insert(col, a := 42, b := NULL::VARCHAR);
statement ok
INSERT INTO tbl VALUES ({'i': 10000, 'a': NULL, 'b': 'hello'});
query I
SELECT col FROM tbl ORDER BY col DESC LIMIT 3;
----
{'i': 10000, 'a': NULL, 'b': hello}
{'i': 4999, 'a': 42, 'b': NULL}
{'i': 4998, 'a': 42, 'b': NULL}
statement error
ALTER TABLE tbl ALTER col TYPE;
----
<REGEX>:Parser Error.*Omitting the type is only possible in combination with USING.*

View File

@@ -0,0 +1,18 @@
# name: test/sql/alter/alter_type/test_alter_type_check.test
# description: ALTER TYPE with CHECK constraint
# group: [alter_type]
statement ok
CREATE TABLE test(i INTEGER CHECK(i < 10), j INTEGER)
statement ok
INSERT INTO test VALUES (1, 1), (2, 2)
# we disallow ALTER TYPE on a column with a CHECK constraint
statement error
ALTER TABLE test ALTER i SET DATA TYPE VARCHAR
----
# we can change the other columns' type though
statement ok
ALTER TABLE test ALTER j SET DATA TYPE VARCHAR

View File

@@ -0,0 +1,53 @@
# name: test/sql/alter/alter_type/test_alter_type_dependencies.test
# description: Test ALTER TABLE ALTER TYPE and dependencies
# group: [alter_type]
statement ok
CREATE TABLE test(i INTEGER, j INTEGER)
statement ok
INSERT INTO test VALUES (1, 1), (2, 2)
# prepare a statement that depends on test
statement ok
PREPARE v1 AS SELECT * FROM test
# we can run the statement
query II
EXECUTE v1
----
1 1
2 2
# now change the type of "i" to varchar
statement ok
ALTER TABLE test ALTER i TYPE VARCHAR USING i::VARCHAR
# executing the prepared statement now works as the alter type has not broken the query
query II
EXECUTE v1
----
1 1
2 2
statement ok
ALTER TABLE test ALTER i TYPE INTEGER USING i::INTEGER
# do the same, but this time the prepared statement depends on the type
statement ok
PREPARE v2 AS SELECT i+$1 FROM test
query I
EXECUTE v2(1)
----
2
3
statement ok
ALTER TABLE test ALTER i TYPE VARCHAR USING i::VARCHAR
# this now results in an error when rebinding
statement error
EXECUTE v2
----
Invalid Input Error: Values were not provided

View File

@@ -0,0 +1,21 @@
# name: test/sql/alter/alter_type/test_alter_type_expression.test
# description: Test ALTER TABLE ALTER TYPE with expression
# group: [alter_type]
statement ok
CREATE TABLE test(i INTEGER, j INTEGER)
statement ok
INSERT INTO test VALUES (1, 1), (2, 2)
statement ok
ALTER TABLE test ALTER i TYPE BIGINT USING i+100
query II
SELECT * FROM test
----
101
1
102
2

View File

@@ -0,0 +1,37 @@
# name: test/sql/alter/alter_type/test_alter_type_incorrect.test
# description: Incorrect ALTER TYPE usage
# group: [alter_type]
statement ok
CREATE TABLE test(i INTEGER, j INTEGER)
statement ok
INSERT INTO test VALUES (1, 1), (2, 2)
# cannot alter columns that don't exist
statement error
ALTER TABLE test ALTER blabla SET TYPE VARCHAR
----
Binder Error: Table "test" does not have a column with name "blabla"
# expression error
statement error
ALTER TABLE test ALTER i SET TYPE VARCHAR USING blabla
----
Binder Error: Table does not contain column blabla referenced
# cannot use aggregates/window functions
statement error
ALTER TABLE test ALTER i SET TYPE VARCHAR USING SUM(i)
----
Binder Error: aggregate functions are not allowed in alter statement
statement error
ALTER TABLE test ALTER i SET TYPE VARCHAR USING row_id() OVER ()
----
Binder Error: window functions are not allowed in alter statement
statement error
ALTER TABLE test ALTER i SET TYPE VARCHAR USING othertable.j
----
Binder Error: Cannot extract field 'othertable' from expression "#0"

View File

@@ -0,0 +1,23 @@
# name: test/sql/alter/alter_type/test_alter_type_index.test
# description: ALTER TYPE with INDEX
# group: [alter_type]
statement ok
CREATE TABLE test(i INTEGER, j INTEGER)
statement ok
INSERT INTO test VALUES (1, 1), (2, 2)
statement ok
CREATE INDEX i_index ON test(i)
statement error
ALTER TABLE test ALTER i SET DATA TYPE VARCHAR
----
statement ok
DROP INDEX i_index
statement ok
ALTER TABLE test ALTER i SET DATA TYPE VARCHAR

View File

@@ -0,0 +1,35 @@
# name: test/sql/alter/alter_type/test_alter_type_local.test
# description: ALTER TYPE with transaction local data
# group: [alter_type]
statement ok
CREATE TABLE test(i INTEGER, j INTEGER)
statement ok
INSERT INTO test VALUES (1, 1), (2, 2)
statement ok
BEGIN TRANSACTION
statement ok
INSERT INTO test VALUES (3, 3)
statement ok
ALTER TABLE test ALTER i SET DATA TYPE BIGINT
query II
SELECT * FROM test
----
1 1
2 2
3 3
statement ok
COMMIT
query II
SELECT * FROM test
----
1 1
2 2
3 3

View File

@@ -0,0 +1,21 @@
# name: test/sql/alter/alter_type/test_alter_type_multi_column.test
# description: ALTER TYPE with expression using multiple columns
# group: [alter_type]
statement ok
CREATE TABLE test(i INTEGER, j INTEGER)
statement ok
INSERT INTO test VALUES (1, 1), (2, 2)
statement ok
ALTER TABLE test ALTER i TYPE INTEGER USING 2*(i+j)
query II
SELECT * FROM test
----
4
1
8
2

View File

@@ -0,0 +1,34 @@
# name: test/sql/alter/alter_type/test_alter_type_not_null.test
# description: ALTER TYPE with NOT NULL constraint
# group: [alter_type]
statement ok
CREATE TABLE test(i INTEGER NOT NULL, j INTEGER)
statement ok
INSERT INTO test VALUES (1, 1), (2, 2)
statement error
INSERT INTO test VALUES (NULL, 4)
----
statement ok
ALTER TABLE test ALTER i SET DATA TYPE VARCHAR
statement ok
INSERT INTO test VALUES ('hello', 3)
statement error
INSERT INTO test VALUES (NULL, 4)
----
query TI
SELECT * FROM test
----
1
1
2
2
hello
3

View File

@@ -0,0 +1,38 @@
# name: test/sql/alter/alter_type/test_alter_type_rollback.test
# description: Test ALTER TABLE ALTER TYPE with rollback
# group: [alter_type]
statement ok
CREATE TABLE test(i INTEGER, j INTEGER)
statement ok
INSERT INTO test VALUES (1, 1), (2, 2)
statement ok
BEGIN TRANSACTION
statement ok
ALTER TABLE test ALTER i SET DATA TYPE VARCHAR
statement ok
UPDATE test SET i='hello'
query TI
SELECT * FROM test
----
hello
1
hello
2
statement ok
ROLLBACK
query II
SELECT * FROM test
----
1
1
2
2

View File

@@ -0,0 +1,146 @@
# name: test/sql/alter/alter_type/test_alter_type_transactions.test
# description: Test ALTER TABLE ALTER TYPE with multiple transactions
# group: [alter_type]
statement ok con1
CREATE TABLE test(i INTEGER, j INTEGER)
statement ok con1
INSERT INTO test VALUES (1, 1), (2, 2)
# Only one pending table alter can be active at a time
statement ok con1
BEGIN TRANSACTION
# con alters a column to test
statement ok con1
ALTER TABLE test ALTER j TYPE VARCHAR
# con2 cannot alter another column now!
statement error con2
ALTER TABLE test ALTER i TYPE VARCHAR
----
TransactionContext Error: Catalog write-write conflict on alter with "test"
statement ok con1
COMMIT
# we can alter the column after the commit
statement ok con2
ALTER TABLE test ALTER i TYPE VARCHAR
statement ok con1
DROP TABLE test
statement ok con1
CREATE TABLE test(i INTEGER, j INTEGER)
statement ok con1
INSERT INTO test VALUES (1, 1), (2, 2)
# Can only append to newest table
statement ok con1
BEGIN TRANSACTION
# con removes a column from test
statement ok con1
ALTER TABLE test ALTER i TYPE VARCHAR
# con2 cannot append now!
statement error con2
INSERT INTO test (i, j) VALUES (3, 3)
----
<REGEX>:.*TransactionContext Error: Transaction conflict.*altered by a different transaction.*
# nor delete
statement error con2
DELETE FROM test WHERE i=1
----
<REGEX>:.*TransactionContext Error: Failed to commit.*altered this table.*
query TI con1
SELECT * FROM test
----
1 1
2 2
query II con2
SELECT * FROM test
----
1 1
2 2
# we cannot update rows on tables that have been altered
statement error con2
UPDATE test SET i=1000
----
<REGEX>:.*TransactionContext Error: Transaction conflict.*altered by a different transaction.*
statement error con2
UPDATE test SET j=100
----
<REGEX>:.*TransactionContext Error: Transaction conflict.*altered by a different transaction.*
query TI con1
SELECT * FROM test
----
1 1
2 2
statement ok con1
COMMIT
query TI con1
SELECT * FROM test
----
1 1
2 2
statement ok con1
DROP TABLE test
statement ok con1
CREATE TABLE test(i INTEGER, j INTEGER)
statement ok con1
INSERT INTO test VALUES (1, 1), (2, 2)
# Alter table while other transaction still has pending appends
statement ok con2
BEGIN TRANSACTION
statement ok con2
INSERT INTO test VALUES (3, 3)
# now con adds a column
statement ok con1
ALTER TABLE test ALTER i TYPE VARCHAR
# cannot commit con2! conflict on append
statement error con2
COMMIT
----
<REGEX>:.*TransactionContext Error: Failed to commit.*altered by a different transaction.*
statement ok con1
DROP TABLE test
statement ok con1
CREATE TABLE test(i INTEGER, j INTEGER)
statement ok con1
INSERT INTO test VALUES (1, 1), (2, 2)
# Create index on column that has been altered by other transaction
# con2 removes a column
statement ok con2
BEGIN TRANSACTION
statement ok con2
ALTER TABLE test ALTER j TYPE VARCHAR
# now con tries to add an index to that column: this should fail
statement error con1
CREATE INDEX i_index ON test(j)
----
<REGEX>:.*TransactionContext Error: Transaction conflict.*altered or dropped.*

View File

@@ -0,0 +1,27 @@
# name: test/sql/alter/alter_type/test_alter_type_unique.test
# description: ALTER TYPE with UNIQUE constraint
# group: [alter_type]
statement ok
CREATE TABLE test(i INTEGER UNIQUE, j INTEGER)
statement ok
INSERT INTO test VALUES (1, 1), (2, 2)
# we disallow ALTER TYPE on a column with a CHECK constraint
statement error
ALTER TABLE test ALTER i SET DATA TYPE VARCHAR
----
# but we can change the other column
statement ok
ALTER TABLE test ALTER j SET DATA TYPE VARCHAR
query IT
SELECT * FROM test
----
1
1
2
2

View File

@@ -0,0 +1,28 @@
# name: test/sql/alter/alter_type/test_alter_type_with_generated_column.test
# description: Test ALTER TABLE ALTER TYPE with Generated Column
# group: [alter_type]
statement ok
PRAGMA enable_verification
statement ok
CREATE TABLE test(i AS (1), j INTEGER)
statement ok
INSERT INTO test VALUES (1), (2)
# Alter generated column
statement error
ALTER TABLE test ALTER i TYPE VARCHAR
----
# Alter normal column
statement ok
ALTER TABLE test ALTER j TYPE VARCHAR
query IT
SELECT * FROM test
----
1 1
1 2

View File

@@ -0,0 +1,32 @@
# name: test/sql/alter/default/drop_default.test
# description: Test ALTER TABLE DROP DEFAULT
# group: [default]
statement ok
PRAGMA enable_verification;
statement ok
CREATE TABLE data(id INTEGER, x INTEGER);
statement ok
ALTER TABLE data ALTER COLUMN id DROP DEFAULT;
statement ok
INSERT INTO data VALUES (1, 0), (2, 1);
statement ok
ALTER TABLE data ALTER COLUMN id DROP DEFAULT;
statement ok
ALTER TABLE data ALTER COLUMN id DROP DEFAULT;
statement ok
ALTER TABLE data ALTER COLUMN x DROP DEFAULT;
statement ok
ALTER TABLE data ALTER COLUMN x DROP DEFAULT;
statement error
ALTER TABLE data ALTER COLUMN j DROP DEFAULT;
----
Binder Error: Table "data" does not have a column with name "j"

View File

@@ -0,0 +1,93 @@
# name: test/sql/alter/default/test_set_default.test
# description: Test ALTER TABLE SET DEFAULT
# group: [default]
statement ok
CREATE TABLE test(i INTEGER, j INTEGER)
statement ok
INSERT INTO test VALUES (1, 1), (2, 2)
statement ok
ALTER TABLE test ALTER j SET DEFAULT 3
statement ok
INSERT INTO test (i) VALUES (3)
query II
SELECT * FROM test
----
1
1
2
2
3
3
statement ok
ALTER TABLE test ALTER COLUMN j DROP DEFAULT
statement ok
INSERT INTO test (i) VALUES (4)
query II
SELECT * FROM test
----
1
1
2
2
3
3
4
NULL
statement ok
CREATE SEQUENCE seq
statement ok
ALTER TABLE test ALTER j SET DEFAULT nextval('seq')
statement ok
INSERT INTO test (i) VALUES (5), (6)
query II
SELECT * FROM test
----
1
1
2
2
3
3
4
NULL
5
1
6
2
# set default on a table with constraints
statement ok
CREATE TABLE constrainty(i INTEGER PRIMARY KEY, j INTEGER);
statement ok
ALTER TABLE constrainty ALTER j SET DEFAULT 3
statement ok
INSERT INTO constrainty (i) VALUES (2)
query II
SELECT * FROM constrainty
----
2 3
# fail when column does not exist
statement error
ALTER TABLE test ALTER blabla SET DEFAULT 3
----
statement error
ALTER TABLE test ALTER blabla DROP DEFAULT
----

View File

@@ -0,0 +1,19 @@
# name: test/sql/alter/drop_col/test_drop_col.test
# description: Test ALTER TABLE DROP COLUMN: standard drop column
# group: [drop_col]
statement ok
CREATE TABLE test(i INTEGER, j INTEGER)
statement ok
INSERT INTO test VALUES (1, 1), (2, 2)
statement ok
ALTER TABLE test DROP COLUMN j
query I
SELECT * FROM test
----
1
2

View File

@@ -0,0 +1,49 @@
# name: test/sql/alter/drop_col/test_drop_col_check.test
# description: Test ALTER TABLE DROP COLUMN: DROP COLUMN with check constraint
# group: [drop_col]
statement ok
CREATE TABLE test(i INTEGER, j INTEGER CHECK(j < 10))
statement ok
INSERT INTO test VALUES (1, 1), (2, 2)
query II
SELECT * FROM test
----
1
1
2
2
statement ok
ALTER TABLE test DROP COLUMN j
statement ok
INSERT INTO test VALUES (3)
query I
SELECT * FROM test
----
1
2
3
statement ok
CREATE TABLE test2(i INTEGER, j INTEGER CHECK(i+j < 10))
statement ok
INSERT INTO test2 VALUES (1, 1), (2, 2)
query II
SELECT * FROM test2
----
1
1
2
2
statement error
ALTER TABLE test2 DROP COLUMN j
----
Catalog Error: Cannot drop column "j"

View File

@@ -0,0 +1,35 @@
# name: test/sql/alter/drop_col/test_drop_col_check_next.test
# description: Test ALTER TABLE DROP COLUMN: DROP COLUMN with check constraint on subsequent column
# group: [drop_col]
statement ok
CREATE TABLE test(i INTEGER, j INTEGER CHECK(j < 10))
statement ok
INSERT INTO test VALUES (1, 1), (2, 2)
query II
SELECT * FROM test
----
1
1
2
2
statement ok
ALTER TABLE test DROP COLUMN i
statement error
INSERT INTO test VALUES (20)
----
statement ok
INSERT INTO test VALUES (3)
query I
SELECT * FROM test
----
1
2
3

View File

@@ -0,0 +1,28 @@
# name: test/sql/alter/drop_col/test_drop_col_failure.test
# description: Test ALTER TABLE DROP COLUMN: Incorrect DROP COLUMN usage
# group: [drop_col]
statement ok
CREATE TABLE test(i INTEGER, j INTEGER)
statement ok
INSERT INTO test VALUES (1, 1), (2, 2)
# cannot drop column which does not exist
statement error
ALTER TABLE test DROP COLUMN blabla
----
Binder Error: Table "test" does not have a column with name "blabla"
# unless IF EXISTS is specified
statement ok
ALTER TABLE test DROP COLUMN IF EXISTS blabla
# cannot drop ALL columns of a table
statement ok
ALTER TABLE test DROP COLUMN i
statement error
ALTER TABLE test DROP COLUMN j
----
Catalog Error: Cannot drop column: table only has one column remaining

View File

@@ -0,0 +1,24 @@
# name: test/sql/alter/drop_col/test_drop_col_index.test
# description: Test ALTER TABLE DROP COLUMN: DROP COLUMN with index built on subsequent column
# group: [drop_col]
statement ok
CREATE TABLE test(i INTEGER, j INTEGER)
statement ok
INSERT INTO test VALUES (1, 1), (2, 2)
statement ok
CREATE INDEX i_index ON test(j)
# cannot drop indexed column
statement error
ALTER TABLE test DROP COLUMN j
----
Catalog Error: Cannot drop this column: an index depends on it
# we also cannot drop the column i (for now) because an index depends on a subsequent column
statement error
ALTER TABLE test DROP COLUMN i
----
Catalog Error: Cannot drop this column: an index depends on a column

View File

@@ -0,0 +1,31 @@
# name: test/sql/alter/drop_col/test_drop_col_not_null.test
# description: Test ALTER TABLE DROP COLUMN: DROP COLUMN with NOT NULL constraint
# group: [drop_col]
statement ok
CREATE TABLE test(i INTEGER, j INTEGER NOT NULL)
statement ok
INSERT INTO test VALUES (1, 1), (2, 2)
query II
SELECT * FROM test
----
1
1
2
2
statement ok
ALTER TABLE test DROP COLUMN j
statement ok
INSERT INTO test VALUES (3)
query I
SELECT * FROM test
----
1
2
3

View File

@@ -0,0 +1,40 @@
# name: test/sql/alter/drop_col/test_drop_col_not_null_next.test
# description: Test ALTER TABLE DROP COLUMN: DROP COLUMN with NOT NULL constraint on subsequent column
# group: [drop_col]
statement ok
CREATE TABLE test(i INTEGER, j INTEGER, k INTEGER NOT NULL)
statement ok
INSERT INTO test VALUES (1, 1, 11), (2, 2, 12)
query III
SELECT * FROM test
----
1
1
11
2
2
12
statement ok
ALTER TABLE test DROP COLUMN j
statement error
INSERT INTO test VALUES (3, NULL)
----
statement ok
INSERT INTO test VALUES (3, 13)
query II
SELECT * FROM test
----
1
11
2
12
3
13

View File

@@ -0,0 +1,28 @@
# name: test/sql/alter/drop_col/test_drop_col_operations.test
# description: Test various operations on a table after dropping a column
# group: [drop_col]
statement ok
CREATE TABLE test(i INTEGER, j INTEGER)
statement ok
INSERT INTO test SELECT i, i FROM range(100) tbl(i);
statement ok
ALTER TABLE test DROP COLUMN i
statement ok
DELETE FROM test WHERE j%2=0
query II
SELECT COUNT(j), SUM(j) FROM test
----
50 2500
statement ok
UPDATE test SET j=j+100
query II
SELECT COUNT(j), SUM(j) FROM test
----
50 7500

View File

@@ -0,0 +1,29 @@
# name: test/sql/alter/drop_col/test_drop_col_pk.test
# description: Test ALTER TABLE DROP COLUMN: DROP COLUMN from table with primary key constraint
# group: [drop_col]
statement ok
CREATE TABLE test(i INTEGER PRIMARY KEY, j INTEGER)
statement ok
INSERT INTO test VALUES (1, 1), (2, 2)
# cannot drop primary key column
statement error
ALTER TABLE test DROP COLUMN i
----
# but we can drop column "j"
statement ok
ALTER TABLE test DROP COLUMN j
statement ok
INSERT INTO test VALUES (3)
query I
SELECT * FROM test
----
1
2
3

View File

@@ -0,0 +1,33 @@
# name: test/sql/alter/drop_col/test_drop_col_rollback.test
# description: Test ALTER TABLE DROP COLUMN: Rollback of DROP COLUMN
# group: [drop_col]
statement ok
CREATE TABLE test(i INTEGER, j INTEGER)
statement ok
INSERT INTO test VALUES (1, 1), (2, 2)
statement ok
BEGIN TRANSACTION
statement ok
ALTER TABLE test DROP COLUMN j
query I
SELECT * FROM test
----
1
2
statement ok
ROLLBACK
query II
SELECT * FROM test
----
1
1
2
2

View File

@@ -0,0 +1,144 @@
# name: test/sql/alter/drop_col/test_drop_col_transactions.test
# description: Test ALTER TABLE DROP COLUMN with multiple transactions
# group: [drop_col]
statement ok con1
CREATE TABLE test(i INTEGER, j INTEGER)
statement ok con1
INSERT INTO test VALUES (1, 1), (2, 2)
# Only one pending table alter can be active at a time
statement ok con1
BEGIN TRANSACTION
# con removes a column to test
statement ok con1
ALTER TABLE test DROP COLUMN j
# con2 cannot add a new column now!
statement error con2
ALTER TABLE test ADD COLUMN k INTEGER
----
TransactionContext Error: Catalog write-write conflict
statement ok con1
COMMIT
# we can add the column after the commit
statement ok con2
ALTER TABLE test ADD COLUMN k INTEGER
statement ok con1
DROP TABLE test
statement ok con1
CREATE TABLE test(i INTEGER, j INTEGER)
statement ok con1
INSERT INTO test VALUES (1, 1), (2, 2)
# Can only append to newest table
statement ok con1
BEGIN TRANSACTION
# con removes a column from test
statement ok con1
ALTER TABLE test DROP COLUMN i
# con2 cannot append now!
statement error con2
INSERT INTO test (i, j) VALUES (3, 3)
----
<REGEX>:.*TransactionContext Error: Transaction conflict.*altered by a different transaction.*
# nor delete
statement error con2
DELETE FROM test WHERE i=1
----
<REGEX>:.*TransactionContext Error: Failed to commit.*another transaction has altered this table.*
query I con1
SELECT * FROM test
----
1
2
query II con2
SELECT * FROM test
----
1 1
2 2
# we can't update on tables that have been altered
statement error con2
UPDATE test SET j=100
----
<REGEX>:.*TransactionContext Error: Transaction conflict.*altered by a different transaction.*
query I con1
SELECT * FROM test
----
1
2
statement ok con1
UPDATE test SET j=100
statement ok con1
COMMIT
query I con1
SELECT * FROM test
----
100
100
statement ok con1
DROP TABLE test
statement ok con1
CREATE TABLE test(i INTEGER, j INTEGER)
statement ok con1
INSERT INTO test VALUES (1, 1), (2, 2)
# Alter table while other transaction still has pending appends
statement ok con2
BEGIN TRANSACTION
statement ok con2
INSERT INTO test VALUES (3, 3)
# now con adds a column
statement ok con1
ALTER TABLE test DROP COLUMN i
# cannot commit con2! conflict on append
statement error con2
COMMIT
----
<REGEX>:.*TransactionContext Error: Failed to commit.*altered by a different transaction.*
statement ok con1
DROP TABLE test
statement ok con1
CREATE TABLE test(i INTEGER, j INTEGER)
statement ok con1
INSERT INTO test VALUES (1, 1), (2, 2)
# Create index on column that has been removed by other transaction
# con2 removes a column
statement ok con2
BEGIN TRANSACTION
statement ok con2
ALTER TABLE test DROP COLUMN j
# now con tries to add an index to that column: this should fail
statement error con1
CREATE INDEX i_index ON test(j)
----
<REGEX>:.*TransactionContext Error: Transaction conflict: cannot add an index.*

View File

@@ -0,0 +1,18 @@
# name: test/sql/alter/drop_col/test_drop_col_with_generated_cols.test
# description: Test ALTER TABLE DROP COLUMN with generated cols in the table
# group: [drop_col]
statement ok
create table t(i int, j as (2), k int, m as (3), n int);
statement ok
alter table t drop column n;
statement ok
alter table t drop column m;
statement ok
alter table t drop column k;
statement ok
alter table t drop column j;

View File

@@ -0,0 +1,67 @@
# name: test/sql/alter/list/add_column_in_struct.test
# description: Test adding fields to a STRUCT.
# group: [list]
query I
WITH cte AS (
SELECT a::STRUCT(i INTEGER, j INTEGER)[] a FROM
VALUES ([ROW(1, 1)]), ([ROW(2, 2)]) t(a)
)
SELECT remap_struct(
a,
NULL::STRUCT(i INTEGER, j INTEGER, k INTEGER)[],
{'list': ('list', {'i': 'i', 'j': 'j'})},
{'list': {'k': NULL::INTEGER}}
) FROM cte;
----
[{'i': 1, 'j': 1, 'k': NULL}]
[{'i': 2, 'j': 2, 'k': NULL}]
statement ok
CREATE TABLE test(s STRUCT(i INTEGER, j INTEGER)[])
statement ok
INSERT INTO test VALUES ([ROW(1, 1)]), ([ROW(2, 2)])
# Add a field to a STRUCT.
statement ok
ALTER TABLE test ADD COLUMN s.element.k INTEGER
query I
SELECT * FROM test;
----
[{'i': 1, 'j': 1, 'k': NULL}]
[{'i': 2, 'j': 2, 'k': NULL}]
statement ok
DROP TABLE test;
statement ok
CREATE TABLE test(
s STRUCT(
a STRUCT(i INTEGER, j INTEGER)[]
)
)
statement ok
INSERT INTO test VALUES (ROW([ROW(1, 1)])), (ROW([ROW(2, 2)]))
# Add another (one more nesting level) STRUCT field.
statement ok
ALTER TABLE test ADD COLUMN s.a.element.k INTEGER
query I
SELECT * FROM test;
----
{'a': [{'i': 1, 'j': 1, 'k': NULL}]}
{'a': [{'i': 2, 'j': 2, 'k': NULL}]}
# Try to add an element to the list.
statement error
ALTER TABLE test ADD COLUMN s.a.not_element INTEGER
----
<REGEX>:Binder Error.*Column a is not a struct - ALTER TABLE can only add fields to structs.*

View File

@@ -0,0 +1,51 @@
# name: test/sql/alter/list/drop_column_in_struct.test
# description: Test dropping fields in a STRUCT.
# group: [list]
statement ok
CREATE TABLE test(s STRUCT(i INTEGER, j INTEGER)[])
statement ok
INSERT INTO test VALUES ([ROW(1, 1)]), ([ROW(2, 2)])
# Try to drop element from the list.
statement error
ALTER TABLE test DROP COLUMN s.element
----
<REGEX>:Catalog Error.*Cannot drop field.*not a struct.*
# Now drop a STRUCT field.
statement ok
ALTER TABLE test DROP COLUMN s.element.j
query I
SELECT * FROM test
----
[{'i': 1}]
[{'i': 2}]
statement ok
DROP TABLE test;
statement ok
CREATE TABLE test(
s STRUCT(
a STRUCT(i INTEGER, j INTEGER)[]
)
)
statement ok
INSERT INTO test VALUES (ROW([ROW(1, 1)])), (ROW([ROW(2, 2)]))
# Drop another (one more nesting level) STRUCT field.
statement ok
ALTER TABLE test DROP COLUMN s.a.element.i
query I
SELECT * FROM test
----
{'a': [{'j': 1}]}
{'a': [{'j': 2}]}

View File

@@ -0,0 +1,58 @@
# name: test/sql/alter/list/rename_column_in_struct.test
# group: [list]
statement ok
CREATE TABLE test(
s STRUCT(
i INTEGER,
j INTEGER
)[]
)
statement ok
INSERT INTO test VALUES
([ROW(1, 1)]),
([ROW(2, 2)])
# attempt to rename 'element' from the list
statement error
ALTER TABLE test RENAME COLUMN s.element TO not_element
----
Catalog Error: Cannot rename field 'element' from column 's' - can only rename fields inside a struct
statement ok
ALTER TABLE test RENAME COLUMN s.element.j TO k
query I
select * from test
----
[{'i': 1, 'k': 1}]
[{'i': 2, 'k': 2}]
statement ok
drop table test;
statement ok
CREATE TABLE test(
s STRUCT(
a STRUCT(
i INTEGER,
j INTEGER
)[]
)
)
statement ok
INSERT INTO test VALUES
(ROW([ROW(1, 1)])),
(ROW([ROW(2, 2)]))
# add a column to a struct
statement ok
ALTER TABLE test RENAME COLUMN s.a.element.i TO k
query I
select * from test
----
{'a': [{'k': 1, 'j': 1}]}
{'a': [{'k': 2, 'j': 2}]}

View File

@@ -0,0 +1,128 @@
# name: test/sql/alter/map/add_column_in_struct.test
# group: [map]
query I
WITH cte as (
select a::MAP(STRUCT(n INTEGER, m INTEGER), STRUCT(i INTEGER, j INTEGER)) a from
VALUES
(MAP {ROW(3,3): ROW(1, 1)}),
(MAP {ROW(4,4): ROW(2, 2)})
t(a)
)
SELECT remap_struct(
a,
NULL::MAP(STRUCT(n INTEGER, m INTEGER), STRUCT(i INTEGER, j INTEGER, k INTEGER)),
{
'key': 'key',
'value': (
'value', {
'i': 'i',
'j': 'j'
}
)
},
{
'value': {
'k': NULL::INTEGER
}
}
) from cte;
----
{{'n': 3, 'm': 3}={'i': 1, 'j': 1, 'k': NULL}}
{{'n': 4, 'm': 4}={'i': 2, 'j': 2, 'k': NULL}}
statement ok
CREATE TABLE test(
s MAP(
STRUCT(
n INTEGER,
m INTEGER
),
STRUCT(
i INTEGER,
j INTEGER
)
)
)
statement ok
INSERT INTO test VALUES
(MAP {ROW(3,3): ROW(1, 1)}),
(MAP {ROW(4,4): ROW(2, 2)})
# add a column to the struct inside the 'key'
statement ok
ALTER TABLE test ADD COLUMN s.key.k INTEGER
query I
select * from test;
----
{{'n': 3, 'm': 3, 'k': NULL}={'i': 1, 'j': 1}}
{{'n': 4, 'm': 4, 'k': NULL}={'i': 2, 'j': 2}}
# add a column to the struct inside the 'value'
statement ok
ALTER TABLE test ADD COLUMN s.value.b VARCHAR
query I
select * from test;
----
{{'n': 3, 'm': 3, 'k': NULL}={'i': 1, 'j': 1, 'b': NULL}}
{{'n': 4, 'm': 4, 'k': NULL}={'i': 2, 'j': 2, 'b': NULL}}
statement ok
drop table test;
statement ok
CREATE TABLE test(
s STRUCT(
a MAP(
STRUCT(
n INTEGER,
m INTEGER
),
STRUCT(
i INTEGER,
j INTEGER
)
)
)
)
statement ok
INSERT INTO test VALUES
(ROW(MAP {ROW(3,3): ROW(1, 1)})),
(ROW(MAP {ROW(4,4): ROW(2, 2)}))
# add a column to the struct in the 'key'
statement ok
ALTER TABLE test ADD COLUMN s.a.key.k INTEGER
query I
select * from test;
----
{'a': {{'n': 3, 'm': 3, 'k': NULL}={'i': 1, 'j': 1}}}
{'a': {{'n': 4, 'm': 4, 'k': NULL}={'i': 2, 'j': 2}}}
# add a column to the struct in the 'value'
statement ok
ALTER TABLE test ADD COLUMN s.a.value.b VARCHAR
query I
select * from test;
----
{'a': {{'n': 3, 'm': 3, 'k': NULL}={'i': 1, 'j': 1, 'b': NULL}}}
{'a': {{'n': 4, 'm': 4, 'k': NULL}={'i': 2, 'j': 2, 'b': NULL}}}
# attempt to add a field to a map
statement error
ALTER TABLE test ADD COLUMN s.a.not_key INTEGER
----
Binder Error: Column a is not a struct - ALTER TABLE can only add fields to structs
# attempt to add the 'key' field to a map
statement error
ALTER TABLE test ADD COLUMN s.a.key INTEGER
----
Binder Error: Column a is not a struct - ALTER TABLE can only add fields to structs

View File

@@ -0,0 +1,98 @@
# name: test/sql/alter/map/drop_column_in_struct.test
# group: [map]
statement ok
CREATE TABLE test(
s MAP(
STRUCT(
n INTEGER,
m INTEGER
),
STRUCT(
i INTEGER,
j INTEGER
)
)
)
statement ok
INSERT INTO test VALUES
(MAP {ROW(3,3): ROW(1, 1)}),
(MAP {ROW(4,4): ROW(2, 2)})
# attempt to drop 'key' from the map
statement error
ALTER TABLE test DROP COLUMN s.key
----
Catalog Error: Cannot drop field 'key' from column 's' - it's not a struct
# attempt to drop 'value' from the map
statement error
ALTER TABLE test DROP COLUMN s.value
----
Catalog Error: Cannot drop field 'value' from column 's' - it's not a struct
# drop a column from the struct inside the 'value'
statement ok
ALTER TABLE test DROP COLUMN s.value.j
query I
select * from test;
----
{{'n': 3, 'm': 3}={'i': 1}}
{{'n': 4, 'm': 4}={'i': 2}}
# drop a column from the struct inside the 'key'
statement ok
ALTER TABLE test DROP COLUMN s.key.n
query I
select * from test;
----
{{'m': 3}={'i': 1}}
{{'m': 4}={'i': 2}}
statement ok
drop table test;
statement ok
CREATE TABLE test(
s STRUCT(
a MAP(
STRUCT(
n INTEGER,
m INTEGER
),
STRUCT(
i INTEGER,
j INTEGER
)
)
)
)
statement ok
INSERT INTO test VALUES
(ROW(MAP {ROW(3,3): ROW(1, 1)})),
(ROW(MAP {ROW(4,4): ROW(2, 2)}))
# drop a column from the struct in the 'key'
statement ok
ALTER TABLE test DROP COLUMN s.a.key.m
query I
select * from test;
----
{'a': {{'n': 3}={'i': 1, 'j': 1}}}
{'a': {{'n': 4}={'i': 2, 'j': 2}}}
# drop a column from the struct in the 'value'
statement ok
ALTER TABLE test DROP COLUMN s.a.value.j
query I
select * from test;
----
{'a': {{'n': 3}={'i': 1}}}
{'a': {{'n': 4}={'i': 2}}}

View File

@@ -0,0 +1,98 @@
# name: test/sql/alter/map/rename_column_in_struct.test
# group: [map]
statement ok
CREATE TABLE test(
s MAP(
STRUCT(
n INTEGER,
m INTEGER
),
STRUCT(
i INTEGER,
j INTEGER
)
)
)
statement ok
INSERT INTO test VALUES
(MAP {ROW(3,3): ROW(1, 1)}),
(MAP {ROW(4,4): ROW(2, 2)})
# attempt to rename 'key'
statement error
ALTER TABLE test RENAME COLUMN s.key to anything
----
Catalog Error: Cannot rename field 'key' from column 's' - can only rename fields inside a struct
# attempt to rename 'value'
statement error
ALTER TABLE test RENAME COLUMN s.value to anything
----
Catalog Error: Cannot rename field 'value' from column 's' - can only rename fields inside a struct
# rename a column from the struct inside the 'value'
statement ok
ALTER TABLE test RENAME COLUMN s.value.j TO abc
query I
select * from test;
----
{{'n': 3, 'm': 3}={'i': 1, 'abc': 1}}
{{'n': 4, 'm': 4}={'i': 2, 'abc': 2}}
# rename a column from the struct inside the 'key'
statement ok
ALTER TABLE test RENAME COLUMN s.key.n TO def
query I
select * from test;
----
{{'def': 3, 'm': 3}={'i': 1, 'abc': 1}}
{{'def': 4, 'm': 4}={'i': 2, 'abc': 2}}
statement ok
drop table test;
statement ok
CREATE TABLE test(
s STRUCT(
a MAP(
STRUCT(
n INTEGER,
m INTEGER
),
STRUCT(
i INTEGER,
j INTEGER
)
)
)
)
statement ok
INSERT INTO test VALUES
(ROW(MAP {ROW(3,3): ROW(1, 1)})),
(ROW(MAP {ROW(4,4): ROW(2, 2)}))
# rename a column from the struct in the 'key'
statement ok
ALTER TABLE test RENAME COLUMN s.a.key.m TO abc
query I
select * from test;
----
{'a': {{'n': 3, 'abc': 3}={'i': 1, 'j': 1}}}
{'a': {{'n': 4, 'abc': 4}={'i': 2, 'j': 2}}}
# rename a column from the struct in the 'value'
statement ok
ALTER TABLE test RENAME COLUMN s.a.value.j TO def
query I
select * from test;
----
{'a': {{'n': 3, 'abc': 3}={'i': 1, 'def': 1}}}
{'a': {{'n': 4, 'abc': 4}={'i': 2, 'def': 2}}}

View File

@@ -0,0 +1,17 @@
# name: test/sql/alter/rename_col/test_rename_col.test
# description: Test ALTER TABLE RENAME COLUMN
# group: [rename_col]
statement ok
CREATE TABLE test(i INTEGER, j INTEGER)
# rename the column
statement ok
ALTER TABLE test RENAME COLUMN i TO k
statement ok
SELECT * FROM test
statement ok
DROP TABLE IF EXISTS test

View File

@@ -0,0 +1,27 @@
# name: test/sql/alter/rename_col/test_rename_col_check.test
# description: Test ALTER TABLE RENAME COLUMN on a table with constraints: CHECK constraint
# group: [rename_col]
# create a table with a check constraint referencing the to-be-renamed column
statement ok
CREATE TABLE test(i INTEGER CHECK(i < 10), j INTEGER)
statement ok
INSERT INTO test (i, j) VALUES (1, 2), (2, 3)
statement error
INSERT INTO test (i, j) VALUES (100, 2)
----
Constraint Error: CHECK constraint failed
statement ok
ALTER TABLE test RENAME COLUMN i TO k
# the check should still work after the alter table
statement ok
INSERT INTO test (k, j) VALUES (1, 2), (2, 3)
statement error
INSERT INTO test (k, j) VALUES (100, 2)
----
Constraint Error: CHECK constraint failed

View File

@@ -0,0 +1,28 @@
# name: test/sql/alter/rename_col/test_rename_col_dependencies.test
# description: Test ALTER TABLE RENAME COLUMN and dependencies
# group: [rename_col]
statement ok
CREATE TABLE test(i INTEGER, j INTEGER)
# create two prepared statements
# one uses specific columns (i, j)
# the other uses select *
statement ok
PREPARE v1 AS SELECT i, j FROM test
statement ok
PREPARE v2 AS SELECT * FROM test
# now rename "i" to "k"
statement ok
ALTER TABLE test RENAME COLUMN i TO k
# v1 does not work anymore: "i" does not exist
statement error
EXECUTE v1
----
# v2 still works
statement ok
EXECUTE v2

View File

@@ -0,0 +1,21 @@
# name: test/sql/alter/rename_col/test_rename_col_failure.test
# description: Test failure conditions of ALTER TABLE
# group: [rename_col]
statement ok
CREATE TABLE test(i INTEGER, j INTEGER)
# cannot rename a column that does not exist
statement error
ALTER TABLE test RENAME COLUMN blablabla TO k
----
# cannot rename a column to an already existing column
statement error
ALTER TABLE test RENAME COLUMN i TO j
----
# after failure original columns should still be there
statement ok
SELECT i, j FROM test

View File

@@ -0,0 +1,26 @@
# name: test/sql/alter/rename_col/test_rename_col_not_null.test
# description: Test ALTER TABLE RENAME COLUMN on a table with constraints: NOT NULL constraint
# group: [rename_col]
statement ok
CREATE TABLE test(i INTEGER NOT NULL, j INTEGER)
statement ok
INSERT INTO test (i, j) VALUES (1, 2), (2, 3)
statement error
INSERT INTO test (i, j) VALUES (NULL, 2)
----
Constraint Error: NOT NULL constraint failed: test.i
statement ok
ALTER TABLE test RENAME COLUMN i TO k
# the not null constraint should still work after altering the table
statement ok
INSERT INTO test (k, j) VALUES (1, 2), (2, 3)
statement error
INSERT INTO test (k, j) VALUES (NULL, 2)
----
Constraint Error: NOT NULL constraint failed: test.k

View File

@@ -0,0 +1,36 @@
# name: test/sql/alter/rename_col/test_rename_col_rollback.test
# description: Test ALTER TABLE RENAME COLUMN with rollback
# group: [rename_col]
# CREATE TABLE
statement ok
CREATE TABLE test(i INTEGER, j INTEGER)
statement ok
START TRANSACTION
# rename the column in the first transaction
statement ok
ALTER TABLE test RENAME COLUMN i TO k
# now we should see the new name
statement error
SELECT i FROM test
----
Binder Error: Referenced column "i" not found in FROM clause
statement ok
SELECT k FROM test
# rollback
statement ok
ROLLBACK
# now we should see the old name again
statement ok
SELECT i FROM test
statement error
SELECT k FROM test
----
Binder Error: Referenced column "k" not found in FROM clause

View File

@@ -0,0 +1,62 @@
# name: test/sql/alter/rename_col/test_rename_col_transactions.test
# description: Test ALTER TABLE RENAME COLUMN with transactions
# group: [rename_col]
# CREATE TABLE
statement ok con1
CREATE TABLE test(
i INTEGER,
j INTEGER
)
# start two transactions
statement ok con1
START TRANSACTION
statement ok con2
START TRANSACTION
# rename column in first transaction
statement ok con1
ALTER TABLE test RENAME COLUMN i TO k
# first transaction should see the new name
statement error con1
SELECT i FROM test
----
statement ok con1
SELECT k FROM test
# second transaction should still consider old name
statement ok con2
SELECT i FROM test
statement error con2
SELECT k FROM test
----
# now commit
statement ok con1
COMMIT
# second transaction should still see old name
statement ok con2
SELECT i FROM test
statement error con2
SELECT k FROM test
----
# now rollback the second transasction
# it should now see the new name
statement ok con2
COMMIT
statement error con1
SELECT i FROM test
----
statement ok
SELECT k FROM test

View File

@@ -0,0 +1,27 @@
# name: test/sql/alter/rename_col/test_rename_col_unique.test
# description: Test ALTER TABLE RENAME COLUMN on a table with constraints: UNIQUE constraint
# group: [rename_col]
statement ok
CREATE TABLE test(i INTEGER, j INTEGER, PRIMARY KEY(i, j))
statement ok
INSERT INTO test (i, j) VALUES (1, 1), (2, 2)
statement error
INSERT INTO test (i, j) VALUES (1, 1)
----
Constraint Error: Duplicate key "i: 1, j: 1"
statement ok
ALTER TABLE test RENAME COLUMN i TO k
# the unique constraint should still work after altering the table
# error message refers to the old name of the column (was i, renamed to k)
statement ok
INSERT INTO test (k, j) VALUES (3, 3), (4, 4)
statement error
INSERT INTO test (k, j) VALUES (1, 1)
----
Constraint Error: Duplicate key

View File

@@ -0,0 +1,8 @@
# name: test/sql/alter/rename_schema/rename_schema.test
# description: Fix #6640: Crash When Altering Schema
# group: [rename_schema]
statement error
ALTER SCHEMA a RENAME TO b;
----
Not implemented Error: Altering schemas is not yet supported

View File

@@ -0,0 +1,27 @@
# name: test/sql/alter/rename_table/test_rename_bug4455_schema.test
# description: Test ALTER TABLE RENAME COLUMN
# group: [rename_table]
statement ok
create schema public;
statement ok
set schema=public;
statement ok
create table a1 (c int);
statement ok
alter table public.a1 rename to a2;
statement ok
alter table a2 rename to a3;
statement ok
create view v1 as select 42;
statement ok
alter view public.v1 rename to v2;
statement ok
alter view v2 rename to v3;

View File

@@ -0,0 +1,127 @@
# name: test/sql/alter/rename_table/test_rename_table.test
# description: Test RENAME TABLE single transaction
# group: [rename_table]
statement ok
CREATE TABLE tbl(i INTEGER);
statement ok
INSERT INTO tbl VALUES (999), (100);
statement ok
BEGIN TRANSACTION
statement ok
ALTER TABLE tbl RENAME TO tbl2
query I
SELECT * FROM tbl2
----
999
100
statement error
SELECT * FROM tbl
----
statement ok
ROLLBACK
query I
SELECT * FROM tbl;
----
999
100
statement error
SELECT * FROM tbl2
----
statement ok
BEGIN TRANSACTION;
statement ok
ALTER TABLE tbl RENAME TO tbl2
statement ok
COMMIT
query I
SELECT * FROM tbl2
----
999
100
statement error
SELECT * FROM tbl
----
query I
SELECT * FROM tbl2
----
999
100
# multiple renames in the same transaction
statement ok
BEGIN TRANSACTION
statement ok
ALTER TABLE tbl2 RENAME TO tbl3
statement ok
ALTER TABLE tbl3 RENAME TO tbl4
statement ok
ALTER TABLE tbl4 RENAME TO tbl5
statement ok
ROLLBACK
# everything was rolled back
query I
SELECT * FROM tbl2
----
999
100
statement error
SELECT * FROM tbl5
----
statement ok
BEGIN TRANSACTION
statement ok
ALTER TABLE tbl2 RENAME TO tbl3
statement ok
ALTER TABLE tbl3 RENAME TO tbl4
statement ok
ALTER TABLE tbl4 RENAME TO tbl5
statement ok
COMMIT
# everything was committed
statement error
SELECT * FROM tbl2
----
query I
SELECT * FROM tbl5
----
999
100
# we can create these tables again
statement ok
CREATE TABLE tbl2(i INTEGER);
statement ok
CREATE TABLE tbl3(i INTEGER);
statement ok
CREATE TABLE tbl4(i INTEGER);

View File

@@ -0,0 +1,22 @@
# name: test/sql/alter/rename_table/test_rename_table_case.test
# description: Test RENAME TABLE only changing the case
# group: [rename_table]
statement ok
create table MY_TABLE (i integer);
statement ok
insert into MY_TABLE values(42);
statement ok
alter table MY_TABLE rename to my_table;
query I
select * from my_table;
----
42
query I
select * from MY_TABLE;
----
42

View File

@@ -0,0 +1,81 @@
# name: test/sql/alter/rename_table/test_rename_table_chain_commit.test
# description: test a chain of table creates and renames in a transaction, followed by a commit
# group: [rename_table]
statement ok con1
CREATE TABLE entry(i INTEGER);
statement ok con1
INSERT INTO entry VALUES (1)
query I con2
SELECT * FROM entry
----
1
statement ok con1
BEGIN TRANSACTION;
statement ok con1
ALTER TABLE entry RENAME TO entry2;
statement ok con1
CREATE TABLE entry(j INTEGER);
statement ok con1
INSERT INTO entry VALUES (2)
statement ok con1
ALTER TABLE entry2 RENAME TO entry3;
statement ok con1
ALTER TABLE entry RENAME TO entry2;
statement ok con1
CREATE TABLE entry(k INTEGER);
statement ok con1
ALTER TABLE entry3 RENAME TO entry4;
statement ok con1
ALTER TABLE entry2 RENAME TO entry3;
statement ok con1
ALTER TABLE entry RENAME TO entry2;
query I con2
SELECT * FROM entry
----
1
statement error con2
SELECT * FROM entry2
----
statement error con2
SELECT * FROM entry3
----
statement error con2
SELECT * FROM entry4
----
statement ok con1
COMMIT
statement error con2
SELECT * FROM entry
----
query I con2
SELECT * FROM entry4
----
1
query I con2
SELECT * FROM entry3
----
2
statement ok con2
SELECT * FROM entry2

View File

@@ -0,0 +1,74 @@
# name: test/sql/alter/rename_table/test_rename_table_chain_rollback.test
# description: test a chain of table creates and renames in a transaction, followed by a rollback
# group: [rename_table]
statement ok con1
CREATE TABLE entry(i INTEGER);
statement ok con1
INSERT INTO entry VALUES (1)
query I con2
SELECT * FROM entry
----
1
statement ok con1
BEGIN TRANSACTION;
statement ok con1
ALTER TABLE entry RENAME TO entry2;
statement ok con1
CREATE TABLE entry(i INTEGER);
statement ok con1
ALTER TABLE entry2 RENAME TO entry3;
statement ok con1
ALTER TABLE entry RENAME TO entry2;
statement ok con1
CREATE TABLE entry(i INTEGER);
statement ok con1
ALTER TABLE entry3 RENAME TO entry4;
statement ok con1
ALTER TABLE entry2 RENAME TO entry3;
statement ok con1
ALTER TABLE entry RENAME TO entry2;
query I con2
SELECT * FROM entry
----
1
statement error con2
SELECT * FROM entry2
----
Catalog Error: Table with name entry2 does not exist
statement error con2
SELECT * FROM entry3
----
Catalog Error: Table with name entry3 does not exist
statement error con2
SELECT * FROM entry4
----
Catalog Error: Table with name entry4 does not exist
statement ok con1
ROLLBACK
query I con2
SELECT * FROM entry
----
1
statement error con2
SELECT * FROM entry4
----
Catalog Error: Table with name entry4 does not exist

View File

@@ -0,0 +1,201 @@
# name: test/sql/alter/rename_table/test_rename_table_collision.test
# description: Test RENAME TABLE multiple transactions with rename after drop
# group: [rename_table]
statement ok con1
CREATE TABLE t1(i INTEGER);
statement ok con1
INSERT INTO t1 VALUES (1), (2), (3);
statement ok con2
CREATE TABLE t2(i VARCHAR);
statement ok con2
INSERT INTO t2 VALUES (4), (5), (6);
statement ok con2
BEGIN TRANSACTION
statement ok con2
DROP TABLE t2;
statement ok con2
ALTER TABLE t1 RENAME TO t2;
query I con2
SELECT i FROM t2 ORDER BY i;
----
1
2
3
query I con1
SELECT i FROM t1 ORDER BY i;
----
1
2
3
query I con1
SELECT i FROM t2 ORDER BY i;
----
4
5
6
statement ok con2
COMMIT
query I con1
SELECT i FROM t2 ORDER BY i;
----
1
2
3
statement error con1
SELECT * FROM t1
----
# Now we're going to do a rollback instead of a commit
statement ok con2
BEGIN TRANSACTION
statement ok con2
ALTER TABLE t2 RENAME TO t3;
statement error con1
SELECT i FROM t3 ORDER BY i
----
statement error con2
SELECT i FROM t2 ORDER BY i
----
query I con2
SELECT i FROM t3 ORDER BY i
----
1
2
3
statement ok con2
DROP TABLE t3;
query I con1
SELECT i FROM t2 ORDER BY i;
----
1
2
3
statement ok con2
CREATE TABLE t2 (i integer)
statement ok con2
INSERT INTO t2 VALUES (7), (8), (9)
query I con2
SELECT i FROM t2 ORDER BY i
----
7
8
9
statement ok con2
ROLLBACK
query I con1
SELECT i FROM t2 ORDER BY i;
----
1
2
3
query I con2
SELECT i FROM t2 ORDER BY i;
----
1
2
3
# alter/create collision
statement ok con1
BEGIN TRANSACTION
statement ok con2
BEGIN TRANSACTION
statement ok con1
ALTER TABLE t2 RENAME TO t3
statement error con2
CREATE TABLE t3 (i INTEGER)
----
statement ok con1
ROLLBACK
statement ok con2
ROLLBACK
# alter/alter collision
statement ok con1
BEGIN TRANSACTION
statement ok con2
BEGIN TRANSACTION
statement ok con2
ALTER TABLE t2 RENAME TO t3
statement error con1
ALTER TABLE t2 RENAME TO t4
----
statement ok con1
ROLLBACK
statement ok con2
ROLLBACK
# create some additional reference tables
# for testing, outside of any transaction
statement ok con1
CREATE TABLE e1 (i INTEGER)
statement ok con2
CREATE TABLE e2 (i INTEGER)
# crossing drops/renames
statement ok con1
BEGIN TRANSACTION
statement ok con2
BEGIN TRANSACTION
statement ok con1
DROP TABLE e2
statement ok con2
DROP TABLE e1
statement error con1
ALTER TABLE e1 RENAME TO e2
----
statement error con2
ALTER TABLE e2 RENAME TO e1
----
statement ok con1
ROLLBACK
statement ok con2
ROLLBACK

View File

@@ -0,0 +1,53 @@
# name: test/sql/alter/rename_table/test_rename_table_constraints.test
# description: Test RENAME TABLE with constraints
# group: [rename_table]
# create a table with a check constraint
statement ok
CREATE TABLE tbl(i INTEGER PRIMARY KEY, j INTEGER CHECK(j < 10))
# check primary key constrain
statement ok
INSERT INTO tbl VALUES (999, 4), (1000, 5)
statement error
INSERT INTO tbl VALUES (999, 4), (1000, 5)
----
# check value constrain (j < 10)
statement ok
INSERT INTO tbl VALUES (9999, 0), (10000, 1)
statement error
INSERT INTO tbl VALUES (777, 10), (888, 10)
----
query II
SELECT * FROM tbl
----
999 4
1000 5
9999 0
10000 1
statement ok
ALTER TABLE tbl RENAME TO new_tbl
# insert two conflicting pairs at the same time
statement error
INSERT INTO new_tbl VALUES (999, 0), (1000, 1)
----
# insert two conflicting pairs at the same time
statement error
INSERT INTO new_tbl VALUES (9999, 0), (10000, 1)
----
# insert values out of range constrain
statement error
INSERT INTO new_tbl VALUES (1, 10), (2, 999)
----
statement ok
INSERT INTO new_tbl VALUES (66, 6), (55, 5)

View File

@@ -0,0 +1,21 @@
# name: test/sql/alter/rename_table/test_rename_table_incorrect.test
# description: Test RENAME TABLE: table does not exist and rename to an already existing table
# group: [rename_table]
statement ok
CREATE TABLE tbl(i INTEGER)
statement ok
CREATE TABLE tbl2(i INTEGER)
# Renaming a non existing table
statement error
ALTER TABLE non_table RENAME TO tbl
----
Catalog Error: Table with name non_table does not exist
# rename to an already existing table
statement error
ALTER TABLE tbl2 RENAME TO tbl
----
Catalog Error: Could not rename "tbl2" to "tbl"

View File

@@ -0,0 +1,113 @@
# name: test/sql/alter/rename_table/test_rename_table_many_transactions.test
# description: Test RENAME TABLE four table rename and four parallel transactions
# group: [rename_table]
statement ok
SET immediate_transaction_mode=true
statement ok con1
CREATE TABLE tbl1(i INTEGER)
statement ok con1
INSERT INTO tbl1 VALUES (999), (100)
# rename chain
# con2 starts a transaction now
statement ok con2
BEGIN TRANSACTION
# rename in con1, con2 should still see "tbl1"
statement ok con1
ALTER TABLE tbl1 RENAME TO tbl2
# con3 starts a transaction now
statement ok con3
BEGIN TRANSACTION
# rename in con1, con3 should still see "tbl2"
statement ok con1
ALTER TABLE tbl2 RENAME TO tbl3
# con4 starts a transaction now
statement ok con4
BEGIN TRANSACTION
# rename in con1, con4 should still see "tbl3"
statement ok con1
ALTER TABLE tbl3 RENAME TO tbl4
# con2 sees ONLY tbl1
query I con2
SELECT * FROM tbl1
----
999
100
statement error con2
SELECT * FROM tbl2
----
statement error con2
SELECT * FROM tbl3
----
statement error con2
SELECT * FROM tbl4
----
# con3 sees ONLY tbl2
statement error con3
SELECT * FROM tbl1
----
query I con3
SELECT * FROM tbl2
----
999
100
statement error con3
SELECT * FROM tbl3
----
statement error con3
SELECT * FROM tbl4
----
# con4 sees ONLY tbl3
statement error con4
SELECT * FROM tbl1
----
statement error con4
SELECT * FROM tbl2
----
query I con4
SELECT * FROM tbl3
----
999
100
statement error con4
SELECT * FROM tbl4
----
# con1 sees ONLY tbl4
statement error con1
SELECT * FROM tbl1
----
statement error con1
SELECT * FROM tbl2
----
statement error con1
SELECT * FROM tbl3
----
query I con1
SELECT * FROM tbl4
----
999
100

View File

@@ -0,0 +1,91 @@
# name: test/sql/alter/rename_table/test_rename_table_transactions.test
# description: Test RENAME TABLE two parallel transactions
# group: [rename_table]
statement ok con1
CREATE TABLE tbl(i INTEGER)
statement ok con1
INSERT INTO tbl VALUES (999), (100)
statement ok con1
BEGIN TRANSACTION
statement ok con2
BEGIN TRANSACTION
statement ok con1
ALTER TABLE tbl RENAME TO tbl2
query I con1
SELECT * FROM tbl2
----
999
100
statement error con1
SELECT * FROM tbl
----
Catalog Error: Table with name tbl does not exist
query I con2
SELECT * FROM tbl
----
999
100
statement error con2
SELECT * FROM tbl2
----
Catalog Error: Table with name tbl2 does not exist
statement ok con1
COMMIT
statement ok con2
COMMIT
statement error con1
SELECT * FROM tbl
----
Catalog Error: Table with name tbl does not exist
statement error con2
SELECT * FROM tbl
----
Catalog Error: Table with name tbl does not exist
query I con1
SELECT * FROM tbl2
----
999
100
query I con2
SELECT * FROM tbl2
----
999
100
# we can create "tbl" again
statement ok con1
CREATE TABLE tbl(i INTEGER);
# tbl2 is still occupied though
statement error con1
CREATE TABLE tbl2(i INTEGER);
----
Catalog Error: Table with name "tbl2" already exists
# we can drop and re-create the table
statement ok con1
DROP TABLE tbl2;
statement ok con1
CREATE TABLE tbl2(i INTEGER);
# a rename fails now
statement error con1
ALTER TABLE tbl RENAME TO tbl2
----
Catalog Error: Could not rename "tbl" to "tbl2"

View File

@@ -0,0 +1,23 @@
# name: test/sql/alter/rename_table/test_rename_table_view.test
# description: Test RENAME TABLE with a view as entry
# group: [rename_table]
statement ok
CREATE TABLE tbl(i INTEGER)
statement ok
INSERT INTO tbl VALUES (999), (100)
statement ok
CREATE VIEW v1 AS SELECT * FROM tbl
statement error
ALTER TABLE v1 RENAME TO v2
----
query I
SELECT * FROM v1
----
999
100

View File

@@ -0,0 +1,31 @@
# name: test/sql/alter/rename_table/test_rename_table_with_dependency_check.test
# description: Test RENAME TABLE with dependency check
# group: [rename_table]
statement ok
CREATE TABLE t0 (c0 INT);
statement ok
CREATE UNIQUE INDEX i1 ON t0 (c0);
statement error
ALTER TABLE t0 RENAME TO t3;
----
Cannot alter entry "t0" because there are entries that depend on it
# t3 is not exist
statement ok
CREATE TABLE t3 (c0 INT);
statement error
ALTER TABLE t0 RENAME TO t4;
----
Cannot alter entry "t0" because there are entries that depend on it
statement ok
DROP TABLE t0;
statement error
ANALYZE t4;
----
Table with name t4 does not exist!

View File

@@ -0,0 +1,27 @@
# name: test/sql/alter/rename_table/test_rename_table_with_insert_transaction.test
# description: Test RENAME TABLE with insert transactions
# group: [rename_table]
statement ok con1
CREATE TABLE t1 (i INTEGER)
statement ok con1
INSERT INTO t1 VALUES (1)
statement ok con1
BEGIN TRANSACTION
statement ok con1
INSERT INTO t1 VALUES (2)
statement ok con1
ALTER TABLE t1 RENAME TO t2
statement ok con1
COMMIT
query I
SELECT * FROM t2
----
1
2

View File

@@ -0,0 +1,80 @@
# name: test/sql/alter/rename_view/test_rename_view.test
# description: Test RENAME VIEW single transaction
# group: [rename_view]
statement ok
CREATE TABLE tbl(i INTEGER);
INSERT INTO tbl VALUES (999), (100);
CREATE VIEW vw AS SELECT * FROM tbl;
statement ok
BEGIN TRANSACTION
statement ok
ALTER VIEW vw RENAME TO vw2
query I
SELECT * FROM vw2
----
999
100
statement error
SELECT * FROM vw
----
Catalog Error: Table with name vw does not exist
statement ok
ROLLBACK
query I
SELECT * FROM vw;
----
999
100
statement error
SELECT * FROM vw2
----
Catalog Error: Table with name vw2 does not exist
statement ok
BEGIN TRANSACTION;
statement ok
ALTER VIEW vw RENAME TO vw2
statement ok
COMMIT
query I
SELECT * FROM vw2
----
999
100
statement error
SELECT * FROM vw
----
Catalog Error: Table with name vw does not exist
statement ok
CREATE VIEW vw AS SELECT i+1 AS i FROM tbl
query I
SELECT * FROM vw
----
1000
101
# cannot rename a system view
statement error
ALTER VIEW sqlite_master RENAME TO my_sqlite_master
----
Binder Error: Can not comment on System Catalog entries
# cannot rename a view that does not exist
statement error
ALTER VIEW nonexistingview RENAME TO my_new_view
----
Catalog Error: View with name nonexistingview does not exist

View File

@@ -0,0 +1,24 @@
# name: test/sql/alter/rename_view/test_rename_view_incorrect.test
# description: Test RENAME VIEW: view does not exist and rename to an already existing view
# group: [rename_view]
statement ok
CREATE TABLE tbl(i INTEGER)
statement ok
CREATE VIEW vw AS SELECT * FROM tbl
statement ok
CREATE VIEW vw2 AS SELECT 1729 AS i
# Renaming a non existing view
statement error
ALTER VIEW non_view RENAME TO vw
----
<REGEX>:.*Catalog Error: View.*does not exist.*
# rename to an already existing view
statement error
ALTER VIEW vw2 RENAME TO vw
----
Catalog Error: Could not rename

View File

@@ -0,0 +1,116 @@
# name: test/sql/alter/rename_view/test_rename_view_many_transactions.test
# description: Test RENAME VIEW four view renames and four parallel transactions
# group: [rename_view]
statement ok
SET immediate_transaction_mode=true
statement ok con1
CREATE TABLE tbl1(i INTEGER)
statement ok con1
INSERT INTO tbl1 VALUES (999), (100)
statement ok con1
CREATE VIEW vw1 AS SELECT * FROM tbl1
# rename chain
# con2 starts a transaction now
statement ok con2
BEGIN TRANSACTION
# rename in con1, con2 should still see "vw1"
statement ok con1
ALTER VIEW vw1 RENAME TO vw2
# con3 starts a transaction now
statement ok con3
BEGIN TRANSACTION
# rename in con1, con3 should still see "vw2"
statement ok con1
ALTER VIEW vw2 RENAME TO vw3
# con4 starts a transaction now
statement ok con4
BEGIN TRANSACTION
# rename in con1, con4 should still see "vw3"
statement ok con1
ALTER VIEW vw3 RENAME TO vw4
# con2 sees ONLY vw1
query I con2
SELECT * FROM vw1
----
999
100
statement error con2
SELECT * FROM vw2
----
statement error con2
SELECT * FROM vw3
----
statement error con2
SELECT * FROM vw4
----
# con3 sees ONLY vw2
statement error con3
SELECT * FROM vw1
----
query I con3
SELECT * FROM vw2
----
999
100
statement error con3
SELECT * FROM vw3
----
statement error con3
SELECT * FROM vw4
----
# con4 sees ONLY vw3
statement error con4
SELECT * FROM vw1
----
statement error con4
SELECT * FROM vw2
----
query I con4
SELECT * FROM vw3
----
999
100
statement error con4
SELECT * FROM vw4
----
# con1 sees ONLY vw4
statement error con1
SELECT * FROM vw1
----
statement error con1
SELECT * FROM vw2
----
statement error con1
SELECT * FROM vw3
----
query I con1
SELECT * FROM vw4
----
999
100

View File

@@ -0,0 +1,23 @@
# name: test/sql/alter/rename_view/test_rename_view_table.test
# description: Test RENAME VIEW with a table as entry
# group: [rename_view]
statement ok
CREATE TABLE tbl(i INTEGER)
statement ok
INSERT INTO tbl VALUES (999), (100)
statement ok
CREATE VIEW v1 AS SELECT * FROM tbl
statement error
ALTER VIEW tbl RENAME TO tbl2
----
query I
SELECT * FROM v1
----
999
100

View File

@@ -0,0 +1,68 @@
# name: test/sql/alter/rename_view/test_rename_view_transactions.test
# description: Test RENAME VIEW two parallel transactions
# group: [rename_view]
statement ok con1
CREATE TABLE tbl(i INTEGER)
statement ok con1
INSERT INTO tbl VALUES (999), (100)
statement ok con1
CREATE VIEW vw AS SELECT * FROM tbl
statement ok con1
BEGIN TRANSACTION
statement ok con2
BEGIN TRANSACTION
statement ok con1
ALTER VIEW vw RENAME TO vw2
query I con1
SELECT * FROM vw2
----
999
100
statement error con1
SELECT * FROM vw
----
query I con2
SELECT * FROM vw
----
999
100
statement error con2
SELECT * FROM vw2
----
statement ok con1
COMMIT
statement ok con2
COMMIT
statement error con1
SELECT * FROM vw
----
statement error con2
SELECT * FROM vw
----
query I con1
SELECT * FROM vw2
----
999
100
query I con2
SELECT * FROM vw2
----
999
100

View File

@@ -0,0 +1,45 @@
# name: test/sql/alter/struct/add_col_nested_struct.test
# description: Test ALTER TABLE ADD COLUMN: add column to a struct nested
# group: [struct]
statement ok
CREATE TABLE test(s STRUCT(s2 STRUCT(v1 INT, v2 INT)))
statement ok
INSERT INTO test VALUES (ROW(ROW(1, 1))), (ROW(ROW(2, 2)))
# add a column to a nested struct
statement ok
ALTER TABLE test ADD COLUMN s.s2.k INTEGER
query I
SELECT * FROM test
----
{'s2': {'v1': 1, 'v2': 1, 'k': NULL}}
{'s2': {'v1': 2, 'v2': 2, 'k': NULL}}
# already exists
statement error
ALTER TABLE test ADD COLUMN s.s2.v1 VARCHAR
----
field already exists in struct s2
# this just gets ignored
statement ok
ALTER TABLE test ADD COLUMN IF NOT EXISTS s.s2.v1 VARCHAR
# we can add columns at all levels
statement ok
ALTER TABLE test ADD COLUMN s.i INTEGER DEFAULT 100
query I
SELECT * FROM test
----
{'s2': {'v1': 1, 'v2': 1, 'k': NULL}, 'i': 100}
{'s2': {'v1': 2, 'v2': 2, 'k': NULL}, 'i': 100}
statement error
ALTER TABLE test ADD COLUMN s.s2.v1.x INTEGER
----
Binder Error: Column 'v1' is not a nested type, ADD COLUMN can only be used on nested types

View File

@@ -0,0 +1,79 @@
# name: test/sql/alter/struct/add_col_struct.test
# description: Test ALTER TABLE ADD COLUMN: add column to a struct
# group: [struct]
statement ok
CREATE TABLE test(s STRUCT(i INTEGER, j INTEGER))
statement ok
INSERT INTO test VALUES (ROW(1, 1)), (ROW(2, 2))
# add a column to a struct
statement ok
ALTER TABLE test ADD COLUMN s.k INTEGER
query I
SELECT * FROM test
----
{'i': 1, 'j': 1, 'k': NULL}
{'i': 2, 'j': 2, 'k': NULL}
# defaults
statement ok
ALTER TABLE test ADD COLUMN s.l INTEGER DEFAULT 42
query I
SELECT * FROM test
----
{'i': 1, 'j': 1, 'k': NULL, 'l': 42}
{'i': 2, 'j': 2, 'k': NULL, 'l': 42}
# this is transactional
statement ok
BEGIN
statement ok
ALTER TABLE test ADD COLUMN s.m INTEGER DEFAULT 42
query I
SELECT * FROM test
----
{'i': 1, 'j': 1, 'k': NULL, 'l': 42, 'm': 42}
{'i': 2, 'j': 2, 'k': NULL, 'l': 42, 'm': 42}
statement ok
ROLLBACK
query I
SELECT * FROM test
----
{'i': 1, 'j': 1, 'k': NULL, 'l': 42}
{'i': 2, 'j': 2, 'k': NULL, 'l': 42}
# already exists
statement error
ALTER TABLE test ADD COLUMN s.i VARCHAR
----
field already exists in struct s
# this just gets ignored
statement ok
ALTER TABLE test ADD COLUMN IF NOT EXISTS s.i VARCHAR
query I
SELECT * FROM test
----
{'i': 1, 'j': 1, 'k': NULL, 'l': 42}
{'i': 2, 'j': 2, 'k': NULL, 'l': 42}
# not a struct
statement error
ALTER TABLE test ADD COLUMN s.i.a INTEGER
----
Binder Error: Column 'i' is not a nested type, ADD COLUMN can only be used on nested types
# nested column does not exist
statement error
ALTER TABLE test ADD COLUMN s.x.a INTEGER
----
does not exist

View File

@@ -0,0 +1,39 @@
# name: test/sql/alter/struct/drop_col_nested_struct.test
# description: Test ALTER TABLE DROP COLUMN: drop column from a nested struct
# group: [struct]
statement ok
CREATE TABLE test(s STRUCT(i INT, s2 STRUCT(v1 INT, v2 INT)))
statement ok
INSERT INTO test VALUES (ROW(42, ROW(1, 1))), (ROW(84, ROW(2, 2)))
# add a column to a nested struct
statement ok
ALTER TABLE test DROP s.s2.v1
query I
SELECT * FROM test
----
{'i': 42, 's2': {'v2': 1}}
{'i': 84, 's2': {'v2': 2}}
# does not exists
statement error
ALTER TABLE test DROP COLUMN s.s2.v1
----
does not exist
# this just gets ignored
statement ok
ALTER TABLE test DROP COLUMN IF EXISTS s.s2.v1
# we can drop the struct in its entirety
statement ok
ALTER TABLE test DROP COLUMN s.s2
query I
SELECT * FROM test
----
{'i': 42}
{'i': 84}

View File

@@ -0,0 +1,52 @@
# name: test/sql/alter/struct/drop_col_struct.test
# description: Test ALTER TABLE DROP COLUMN: drop column from a struct
# group: [struct]
statement ok
CREATE TABLE test(s STRUCT(i INTEGER, j INTEGER))
statement ok
INSERT INTO test VALUES (ROW(1, 1)), (ROW(2, 2))
# drop a column from a struct
statement ok
ALTER TABLE test DROP COLUMN s.i
query I
SELECT * FROM test
----
{'j': 1}
{'j': 2}
# we cannot drop the last column
statement error
ALTER TABLE test DROP COLUMN s.j
----
last field
# does not exists
statement error
ALTER TABLE test DROP COLUMN s.v
----
does not exist
statement ok
ALTER TABLE test DROP COLUMN IF EXISTS s.v
# not a struct
statement error
ALTER TABLE test DROP COLUMN s.j.a
----
Catalog Error: Cannot drop field from column "s" - not a nested type
# field does not exist
statement error
ALTER TABLE test DROP COLUMN z.j
----
does not exist
# nested column does not exist
statement error
ALTER TABLE test DROP COLUMN s.v1.a
----
does not exist

Some files were not shown because too many files have changed in this diff Show More