should be it
This commit is contained in:
19
external/duckdb/test/sql/alter/add_col/test_add_col.test
vendored
Normal file
19
external/duckdb/test/sql/alter/add_col/test_add_col.test
vendored
Normal 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
|
||||
|
||||
55
external/duckdb/test/sql/alter/add_col/test_add_col_chain.test
vendored
Normal file
55
external/duckdb/test/sql/alter/add_col/test_add_col_chain.test
vendored
Normal 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
|
||||
|
||||
18
external/duckdb/test/sql/alter/add_col/test_add_col_default.test
vendored
Normal file
18
external/duckdb/test/sql/alter/add_col/test_add_col_default.test
vendored
Normal 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
|
||||
43
external/duckdb/test/sql/alter/add_col/test_add_col_default_seq.test
vendored
Normal file
43
external/duckdb/test/sql/alter/add_col/test_add_col_default_seq.test
vendored
Normal 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
|
||||
29
external/duckdb/test/sql/alter/add_col/test_add_col_incorrect.test
vendored
Normal file
29
external/duckdb/test/sql/alter/add_col/test_add_col_incorrect.test
vendored
Normal 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
|
||||
|
||||
42
external/duckdb/test/sql/alter/add_col/test_add_col_index.test
vendored
Normal file
42
external/duckdb/test/sql/alter/add_col/test_add_col_index.test
vendored
Normal 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
|
||||
|
||||
35
external/duckdb/test/sql/alter/add_col/test_add_col_index_rollback.test
vendored
Normal file
35
external/duckdb/test/sql/alter/add_col/test_add_col_index_rollback.test
vendored
Normal 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
|
||||
|
||||
56
external/duckdb/test/sql/alter/add_col/test_add_col_local_storage.test
vendored
Normal file
56
external/duckdb/test/sql/alter/add_col/test_add_col_local_storage.test
vendored
Normal 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
|
||||
|
||||
31
external/duckdb/test/sql/alter/add_col/test_add_col_stats.test
vendored
Normal file
31
external/duckdb/test/sql/alter/add_col/test_add_col_stats.test
vendored
Normal 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.*
|
||||
118
external/duckdb/test/sql/alter/add_col/test_add_col_transactions.test
vendored
Normal file
118
external/duckdb/test/sql/alter/add_col/test_add_col_transactions.test
vendored
Normal 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
|
||||
----
|
||||
|
||||
43
external/duckdb/test/sql/alter/add_col/test_add_col_user_type.test
vendored
Normal file
43
external/duckdb/test/sql/alter/add_col/test_add_col_user_type.test
vendored
Normal 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;
|
||||
28
external/duckdb/test/sql/alter/add_pk/test_add_multi_column_pk.test
vendored
Normal file
28
external/duckdb/test/sql/alter/add_pk/test_add_multi_column_pk.test
vendored
Normal 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.*
|
||||
82
external/duckdb/test/sql/alter/add_pk/test_add_pk.test
vendored
Normal file
82
external/duckdb/test/sql/alter/add_pk/test_add_pk.test
vendored
Normal 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
|
||||
36
external/duckdb/test/sql/alter/add_pk/test_add_pk_alter_in_tx.test
vendored
Normal file
36
external/duckdb/test/sql/alter/add_pk/test_add_pk_alter_in_tx.test
vendored
Normal 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.*
|
||||
44
external/duckdb/test/sql/alter/add_pk/test_add_pk_attach.test
vendored
Normal file
44
external/duckdb/test/sql/alter/add_pk/test_add_pk_attach.test
vendored
Normal 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.*
|
||||
45
external/duckdb/test/sql/alter/add_pk/test_add_pk_catalog_error.test
vendored
Normal file
45
external/duckdb/test/sql/alter/add_pk/test_add_pk_catalog_error.test
vendored
Normal 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.*
|
||||
27
external/duckdb/test/sql/alter/add_pk/test_add_pk_commit.test
vendored
Normal file
27
external/duckdb/test/sql/alter/add_pk/test_add_pk_commit.test
vendored
Normal 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.*
|
||||
|
||||
31
external/duckdb/test/sql/alter/add_pk/test_add_pk_drop_and_reload.test
vendored
Normal file
31
external/duckdb/test/sql/alter/add_pk/test_add_pk_drop_and_reload.test
vendored
Normal 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)
|
||||
28
external/duckdb/test/sql/alter/add_pk/test_add_pk_gaps_in_rowids.test
vendored
Normal file
28
external/duckdb/test/sql/alter/add_pk/test_add_pk_gaps_in_rowids.test
vendored
Normal 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
|
||||
57
external/duckdb/test/sql/alter/add_pk/test_add_pk_invalid_data.test
vendored
Normal file
57
external/duckdb/test/sql/alter/add_pk/test_add_pk_invalid_data.test
vendored
Normal 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.*
|
||||
19
external/duckdb/test/sql/alter/add_pk/test_add_pk_invalid_type.test
vendored
Normal file
19
external/duckdb/test/sql/alter/add_pk/test_add_pk_invalid_type.test
vendored
Normal 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.*
|
||||
51
external/duckdb/test/sql/alter/add_pk/test_add_pk_naming_conflict.test
vendored
Normal file
51
external/duckdb/test/sql/alter/add_pk/test_add_pk_naming_conflict.test
vendored
Normal 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.*
|
||||
44
external/duckdb/test/sql/alter/add_pk/test_add_pk_reclaim_storage.test_slow
vendored
Normal file
44
external/duckdb/test/sql/alter/add_pk/test_add_pk_reclaim_storage.test_slow
vendored
Normal 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
|
||||
57
external/duckdb/test/sql/alter/add_pk/test_add_pk_rollback.test
vendored
Normal file
57
external/duckdb/test/sql/alter/add_pk/test_add_pk_rollback.test
vendored
Normal 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);
|
||||
29
external/duckdb/test/sql/alter/add_pk/test_add_pk_storage.test
vendored
Normal file
29
external/duckdb/test/sql/alter/add_pk/test_add_pk_storage.test
vendored
Normal 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.*
|
||||
37
external/duckdb/test/sql/alter/add_pk/test_add_pk_wal.test
vendored
Normal file
37
external/duckdb/test/sql/alter/add_pk/test_add_pk_wal.test
vendored
Normal 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.*
|
||||
|
||||
|
||||
39
external/duckdb/test/sql/alter/add_pk/test_add_pk_with_generated_column.test
vendored
Normal file
39
external/duckdb/test/sql/alter/add_pk/test_add_pk_with_generated_column.test
vendored
Normal 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.*
|
||||
|
||||
47
external/duckdb/test/sql/alter/add_pk/test_add_same_pk_simultaneously.test
vendored
Normal file
47
external/duckdb/test/sql/alter/add_pk/test_add_same_pk_simultaneously.test
vendored
Normal 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.*
|
||||
|
||||
|
||||
43
external/duckdb/test/sql/alter/add_pk/test_add_same_pk_twice.test
vendored
Normal file
43
external/duckdb/test/sql/alter/add_pk/test_add_same_pk_twice.test
vendored
Normal 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.*
|
||||
88
external/duckdb/test/sql/alter/alter_col/test_drop_not_null.test
vendored
Normal file
88
external/duckdb/test/sql/alter/alter_col/test_drop_not_null.test
vendored
Normal 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
|
||||
|
||||
270
external/duckdb/test/sql/alter/alter_col/test_not_null_in_tran.test
vendored
Normal file
270
external/duckdb/test/sql/alter/alter_col/test_not_null_in_tran.test
vendored
Normal 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
|
||||
253
external/duckdb/test/sql/alter/alter_col/test_not_null_multi_tran.test
vendored
Normal file
253
external/duckdb/test/sql/alter/alter_col/test_not_null_multi_tran.test
vendored
Normal 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
|
||||
|
||||
156
external/duckdb/test/sql/alter/alter_col/test_set_not_null.test
vendored
Normal file
156
external/duckdb/test/sql/alter/alter_col/test_set_not_null.test
vendored
Normal 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
|
||||
|
||||
19
external/duckdb/test/sql/alter/alter_table_set_partitioned_by.test
vendored
Normal file
19
external/duckdb/test/sql/alter/alter_table_set_partitioned_by.test
vendored
Normal 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
|
||||
19
external/duckdb/test/sql/alter/alter_table_set_sorted_by.test
vendored
Normal file
19
external/duckdb/test/sql/alter/alter_table_set_sorted_by.test
vendored
Normal 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
|
||||
38
external/duckdb/test/sql/alter/alter_type/alter_type_struct.test
vendored
Normal file
38
external/duckdb/test/sql/alter/alter_type/alter_type_struct.test
vendored
Normal 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}
|
||||
78
external/duckdb/test/sql/alter/alter_type/test_alter_type.test
vendored
Normal file
78
external/duckdb/test/sql/alter/alter_type/test_alter_type.test
vendored
Normal 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.*
|
||||
18
external/duckdb/test/sql/alter/alter_type/test_alter_type_check.test
vendored
Normal file
18
external/duckdb/test/sql/alter/alter_type/test_alter_type_check.test
vendored
Normal 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
|
||||
53
external/duckdb/test/sql/alter/alter_type/test_alter_type_dependencies.test
vendored
Normal file
53
external/duckdb/test/sql/alter/alter_type/test_alter_type_dependencies.test
vendored
Normal 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
|
||||
21
external/duckdb/test/sql/alter/alter_type/test_alter_type_expression.test
vendored
Normal file
21
external/duckdb/test/sql/alter/alter_type/test_alter_type_expression.test
vendored
Normal 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
|
||||
|
||||
37
external/duckdb/test/sql/alter/alter_type/test_alter_type_incorrect.test
vendored
Normal file
37
external/duckdb/test/sql/alter/alter_type/test_alter_type_incorrect.test
vendored
Normal 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"
|
||||
23
external/duckdb/test/sql/alter/alter_type/test_alter_type_index.test
vendored
Normal file
23
external/duckdb/test/sql/alter/alter_type/test_alter_type_index.test
vendored
Normal 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
|
||||
|
||||
35
external/duckdb/test/sql/alter/alter_type/test_alter_type_local.test
vendored
Normal file
35
external/duckdb/test/sql/alter/alter_type/test_alter_type_local.test
vendored
Normal 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
|
||||
21
external/duckdb/test/sql/alter/alter_type/test_alter_type_multi_column.test
vendored
Normal file
21
external/duckdb/test/sql/alter/alter_type/test_alter_type_multi_column.test
vendored
Normal 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
|
||||
|
||||
34
external/duckdb/test/sql/alter/alter_type/test_alter_type_not_null.test
vendored
Normal file
34
external/duckdb/test/sql/alter/alter_type/test_alter_type_not_null.test
vendored
Normal 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
|
||||
|
||||
38
external/duckdb/test/sql/alter/alter_type/test_alter_type_rollback.test
vendored
Normal file
38
external/duckdb/test/sql/alter/alter_type/test_alter_type_rollback.test
vendored
Normal 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
|
||||
|
||||
146
external/duckdb/test/sql/alter/alter_type/test_alter_type_transactions.test
vendored
Normal file
146
external/duckdb/test/sql/alter/alter_type/test_alter_type_transactions.test
vendored
Normal 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.*
|
||||
27
external/duckdb/test/sql/alter/alter_type/test_alter_type_unique.test
vendored
Normal file
27
external/duckdb/test/sql/alter/alter_type/test_alter_type_unique.test
vendored
Normal 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
|
||||
|
||||
28
external/duckdb/test/sql/alter/alter_type/test_alter_type_with_generated_column.test
vendored
Normal file
28
external/duckdb/test/sql/alter/alter_type/test_alter_type_with_generated_column.test
vendored
Normal 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
|
||||
|
||||
32
external/duckdb/test/sql/alter/default/drop_default.test
vendored
Normal file
32
external/duckdb/test/sql/alter/default/drop_default.test
vendored
Normal 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"
|
||||
93
external/duckdb/test/sql/alter/default/test_set_default.test
vendored
Normal file
93
external/duckdb/test/sql/alter/default/test_set_default.test
vendored
Normal 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
|
||||
----
|
||||
|
||||
19
external/duckdb/test/sql/alter/drop_col/test_drop_col.test
vendored
Normal file
19
external/duckdb/test/sql/alter/drop_col/test_drop_col.test
vendored
Normal 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
|
||||
|
||||
49
external/duckdb/test/sql/alter/drop_col/test_drop_col_check.test
vendored
Normal file
49
external/duckdb/test/sql/alter/drop_col/test_drop_col_check.test
vendored
Normal 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"
|
||||
35
external/duckdb/test/sql/alter/drop_col/test_drop_col_check_next.test
vendored
Normal file
35
external/duckdb/test/sql/alter/drop_col/test_drop_col_check_next.test
vendored
Normal 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
|
||||
|
||||
28
external/duckdb/test/sql/alter/drop_col/test_drop_col_failure.test
vendored
Normal file
28
external/duckdb/test/sql/alter/drop_col/test_drop_col_failure.test
vendored
Normal 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
|
||||
24
external/duckdb/test/sql/alter/drop_col/test_drop_col_index.test
vendored
Normal file
24
external/duckdb/test/sql/alter/drop_col/test_drop_col_index.test
vendored
Normal 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
|
||||
31
external/duckdb/test/sql/alter/drop_col/test_drop_col_not_null.test
vendored
Normal file
31
external/duckdb/test/sql/alter/drop_col/test_drop_col_not_null.test
vendored
Normal 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
|
||||
|
||||
40
external/duckdb/test/sql/alter/drop_col/test_drop_col_not_null_next.test
vendored
Normal file
40
external/duckdb/test/sql/alter/drop_col/test_drop_col_not_null_next.test
vendored
Normal 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
|
||||
|
||||
28
external/duckdb/test/sql/alter/drop_col/test_drop_col_operations.test
vendored
Normal file
28
external/duckdb/test/sql/alter/drop_col/test_drop_col_operations.test
vendored
Normal 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
|
||||
29
external/duckdb/test/sql/alter/drop_col/test_drop_col_pk.test
vendored
Normal file
29
external/duckdb/test/sql/alter/drop_col/test_drop_col_pk.test
vendored
Normal 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
|
||||
|
||||
33
external/duckdb/test/sql/alter/drop_col/test_drop_col_rollback.test
vendored
Normal file
33
external/duckdb/test/sql/alter/drop_col/test_drop_col_rollback.test
vendored
Normal 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
|
||||
|
||||
144
external/duckdb/test/sql/alter/drop_col/test_drop_col_transactions.test
vendored
Normal file
144
external/duckdb/test/sql/alter/drop_col/test_drop_col_transactions.test
vendored
Normal 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.*
|
||||
18
external/duckdb/test/sql/alter/drop_col/test_drop_col_with_generated_cols.test
vendored
Normal file
18
external/duckdb/test/sql/alter/drop_col/test_drop_col_with_generated_cols.test
vendored
Normal 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;
|
||||
67
external/duckdb/test/sql/alter/list/add_column_in_struct.test
vendored
Normal file
67
external/duckdb/test/sql/alter/list/add_column_in_struct.test
vendored
Normal 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.*
|
||||
51
external/duckdb/test/sql/alter/list/drop_column_in_struct.test
vendored
Normal file
51
external/duckdb/test/sql/alter/list/drop_column_in_struct.test
vendored
Normal 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}]}
|
||||
58
external/duckdb/test/sql/alter/list/rename_column_in_struct.test
vendored
Normal file
58
external/duckdb/test/sql/alter/list/rename_column_in_struct.test
vendored
Normal 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}]}
|
||||
128
external/duckdb/test/sql/alter/map/add_column_in_struct.test
vendored
Normal file
128
external/duckdb/test/sql/alter/map/add_column_in_struct.test
vendored
Normal 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
|
||||
98
external/duckdb/test/sql/alter/map/drop_column_in_struct.test
vendored
Normal file
98
external/duckdb/test/sql/alter/map/drop_column_in_struct.test
vendored
Normal 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}}}
|
||||
98
external/duckdb/test/sql/alter/map/rename_column_in_struct.test
vendored
Normal file
98
external/duckdb/test/sql/alter/map/rename_column_in_struct.test
vendored
Normal 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}}}
|
||||
17
external/duckdb/test/sql/alter/rename_col/test_rename_col.test
vendored
Normal file
17
external/duckdb/test/sql/alter/rename_col/test_rename_col.test
vendored
Normal 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
|
||||
|
||||
27
external/duckdb/test/sql/alter/rename_col/test_rename_col_check.test
vendored
Normal file
27
external/duckdb/test/sql/alter/rename_col/test_rename_col_check.test
vendored
Normal 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
|
||||
28
external/duckdb/test/sql/alter/rename_col/test_rename_col_dependencies.test
vendored
Normal file
28
external/duckdb/test/sql/alter/rename_col/test_rename_col_dependencies.test
vendored
Normal 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
|
||||
21
external/duckdb/test/sql/alter/rename_col/test_rename_col_failure.test
vendored
Normal file
21
external/duckdb/test/sql/alter/rename_col/test_rename_col_failure.test
vendored
Normal 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
|
||||
|
||||
26
external/duckdb/test/sql/alter/rename_col/test_rename_col_not_null.test
vendored
Normal file
26
external/duckdb/test/sql/alter/rename_col/test_rename_col_not_null.test
vendored
Normal 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
|
||||
36
external/duckdb/test/sql/alter/rename_col/test_rename_col_rollback.test
vendored
Normal file
36
external/duckdb/test/sql/alter/rename_col/test_rename_col_rollback.test
vendored
Normal 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
|
||||
62
external/duckdb/test/sql/alter/rename_col/test_rename_col_transactions.test
vendored
Normal file
62
external/duckdb/test/sql/alter/rename_col/test_rename_col_transactions.test
vendored
Normal 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
|
||||
|
||||
27
external/duckdb/test/sql/alter/rename_col/test_rename_col_unique.test
vendored
Normal file
27
external/duckdb/test/sql/alter/rename_col/test_rename_col_unique.test
vendored
Normal 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
|
||||
8
external/duckdb/test/sql/alter/rename_schema/rename_schema.test
vendored
Normal file
8
external/duckdb/test/sql/alter/rename_schema/rename_schema.test
vendored
Normal 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
|
||||
27
external/duckdb/test/sql/alter/rename_table/test_rename_bug4455_schema.test
vendored
Normal file
27
external/duckdb/test/sql/alter/rename_table/test_rename_bug4455_schema.test
vendored
Normal 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;
|
||||
127
external/duckdb/test/sql/alter/rename_table/test_rename_table.test
vendored
Normal file
127
external/duckdb/test/sql/alter/rename_table/test_rename_table.test
vendored
Normal 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);
|
||||
|
||||
22
external/duckdb/test/sql/alter/rename_table/test_rename_table_case.test
vendored
Normal file
22
external/duckdb/test/sql/alter/rename_table/test_rename_table_case.test
vendored
Normal 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
|
||||
81
external/duckdb/test/sql/alter/rename_table/test_rename_table_chain_commit.test
vendored
Normal file
81
external/duckdb/test/sql/alter/rename_table/test_rename_table_chain_commit.test
vendored
Normal 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
|
||||
74
external/duckdb/test/sql/alter/rename_table/test_rename_table_chain_rollback.test
vendored
Normal file
74
external/duckdb/test/sql/alter/rename_table/test_rename_table_chain_rollback.test
vendored
Normal 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
|
||||
201
external/duckdb/test/sql/alter/rename_table/test_rename_table_collision.test
vendored
Normal file
201
external/duckdb/test/sql/alter/rename_table/test_rename_table_collision.test
vendored
Normal 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
|
||||
53
external/duckdb/test/sql/alter/rename_table/test_rename_table_constraints.test
vendored
Normal file
53
external/duckdb/test/sql/alter/rename_table/test_rename_table_constraints.test
vendored
Normal 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)
|
||||
|
||||
21
external/duckdb/test/sql/alter/rename_table/test_rename_table_incorrect.test
vendored
Normal file
21
external/duckdb/test/sql/alter/rename_table/test_rename_table_incorrect.test
vendored
Normal 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"
|
||||
113
external/duckdb/test/sql/alter/rename_table/test_rename_table_many_transactions.test
vendored
Normal file
113
external/duckdb/test/sql/alter/rename_table/test_rename_table_many_transactions.test
vendored
Normal 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
|
||||
91
external/duckdb/test/sql/alter/rename_table/test_rename_table_transactions.test
vendored
Normal file
91
external/duckdb/test/sql/alter/rename_table/test_rename_table_transactions.test
vendored
Normal 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"
|
||||
23
external/duckdb/test/sql/alter/rename_table/test_rename_table_view.test
vendored
Normal file
23
external/duckdb/test/sql/alter/rename_table/test_rename_table_view.test
vendored
Normal 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
|
||||
|
||||
31
external/duckdb/test/sql/alter/rename_table/test_rename_table_with_dependency_check.test
vendored
Normal file
31
external/duckdb/test/sql/alter/rename_table/test_rename_table_with_dependency_check.test
vendored
Normal 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!
|
||||
27
external/duckdb/test/sql/alter/rename_table/test_rename_table_with_insert_transaction.test
vendored
Normal file
27
external/duckdb/test/sql/alter/rename_table/test_rename_table_with_insert_transaction.test
vendored
Normal 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
|
||||
80
external/duckdb/test/sql/alter/rename_view/test_rename_view.test
vendored
Normal file
80
external/duckdb/test/sql/alter/rename_view/test_rename_view.test
vendored
Normal 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
|
||||
24
external/duckdb/test/sql/alter/rename_view/test_rename_view_incorrect.test
vendored
Normal file
24
external/duckdb/test/sql/alter/rename_view/test_rename_view_incorrect.test
vendored
Normal 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
|
||||
116
external/duckdb/test/sql/alter/rename_view/test_rename_view_many_transactions.test
vendored
Normal file
116
external/duckdb/test/sql/alter/rename_view/test_rename_view_many_transactions.test
vendored
Normal 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
|
||||
23
external/duckdb/test/sql/alter/rename_view/test_rename_view_table.test
vendored
Normal file
23
external/duckdb/test/sql/alter/rename_view/test_rename_view_table.test
vendored
Normal 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
|
||||
|
||||
68
external/duckdb/test/sql/alter/rename_view/test_rename_view_transactions.test
vendored
Normal file
68
external/duckdb/test/sql/alter/rename_view/test_rename_view_transactions.test
vendored
Normal 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
|
||||
|
||||
45
external/duckdb/test/sql/alter/struct/add_col_nested_struct.test
vendored
Normal file
45
external/duckdb/test/sql/alter/struct/add_col_nested_struct.test
vendored
Normal 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
|
||||
|
||||
79
external/duckdb/test/sql/alter/struct/add_col_struct.test
vendored
Normal file
79
external/duckdb/test/sql/alter/struct/add_col_struct.test
vendored
Normal 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
|
||||
39
external/duckdb/test/sql/alter/struct/drop_col_nested_struct.test
vendored
Normal file
39
external/duckdb/test/sql/alter/struct/drop_col_nested_struct.test
vendored
Normal 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}
|
||||
52
external/duckdb/test/sql/alter/struct/drop_col_struct.test
vendored
Normal file
52
external/duckdb/test/sql/alter/struct/drop_col_struct.test
vendored
Normal 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
Reference in New Issue
Block a user