should be it
This commit is contained in:
33
external/duckdb/test/sql/catalog/dependencies/add_column_to_table_referenced_by_fk.test
vendored
Normal file
33
external/duckdb/test/sql/catalog/dependencies/add_column_to_table_referenced_by_fk.test
vendored
Normal file
@@ -0,0 +1,33 @@
|
||||
# name: test/sql/catalog/dependencies/add_column_to_table_referenced_by_fk.test
|
||||
# group: [dependencies]
|
||||
|
||||
statement ok
|
||||
pragma enable_verification;
|
||||
|
||||
statement ok
|
||||
create table tbl(a varchar primary key);
|
||||
|
||||
statement ok
|
||||
create table tbl2(
|
||||
a varchar,
|
||||
foreign key (a) references tbl(a)
|
||||
)
|
||||
|
||||
statement ok
|
||||
insert into tbl values('abc');
|
||||
|
||||
statement ok
|
||||
insert into tbl2 values ('abc');
|
||||
|
||||
statement ok
|
||||
alter table tbl add column b integer default 5;
|
||||
|
||||
query II
|
||||
select * from tbl;
|
||||
----
|
||||
abc 5
|
||||
|
||||
query I
|
||||
select * from tbl2;
|
||||
----
|
||||
abc
|
||||
27
external/duckdb/test/sql/catalog/dependencies/add_column_to_table_referenced_by_macro.test
vendored
Normal file
27
external/duckdb/test/sql/catalog/dependencies/add_column_to_table_referenced_by_macro.test
vendored
Normal file
@@ -0,0 +1,27 @@
|
||||
# name: test/sql/catalog/dependencies/add_column_to_table_referenced_by_macro.test
|
||||
# group: [dependencies]
|
||||
|
||||
statement ok
|
||||
pragma enable_verification;
|
||||
|
||||
statement ok
|
||||
create table tbl(a varchar default 'abc');
|
||||
|
||||
statement ok
|
||||
insert into tbl values(DEFAULT);
|
||||
|
||||
statement ok
|
||||
create macro mcr() as table select * from tbl;
|
||||
|
||||
query I
|
||||
select * from mcr();
|
||||
----
|
||||
abc
|
||||
|
||||
statement ok
|
||||
alter table tbl add column b integer default 5;
|
||||
|
||||
query II
|
||||
select * from mcr();
|
||||
----
|
||||
abc 5
|
||||
27
external/duckdb/test/sql/catalog/dependencies/add_column_to_table_referenced_by_view.test
vendored
Normal file
27
external/duckdb/test/sql/catalog/dependencies/add_column_to_table_referenced_by_view.test
vendored
Normal file
@@ -0,0 +1,27 @@
|
||||
# name: test/sql/catalog/dependencies/add_column_to_table_referenced_by_view.test
|
||||
# group: [dependencies]
|
||||
|
||||
statement ok
|
||||
pragma enable_verification;
|
||||
|
||||
statement ok
|
||||
create table tbl(a varchar default 'abc');
|
||||
|
||||
statement ok
|
||||
insert into tbl values(DEFAULT);
|
||||
|
||||
statement ok
|
||||
create view vw as select * from tbl;
|
||||
|
||||
query I
|
||||
select * from vw;
|
||||
----
|
||||
abc
|
||||
|
||||
statement ok
|
||||
alter table tbl add column b integer default 5;
|
||||
|
||||
statement error
|
||||
select * from vw;
|
||||
----
|
||||
Contents of view were altered: types don't match! Expected [VARCHAR], but found [VARCHAR, INTEGER] instead
|
||||
@@ -0,0 +1,16 @@
|
||||
# name: test/sql/catalog/dependencies/change_type_of_table_column_referenced_by_index.test
|
||||
# group: [dependencies]
|
||||
|
||||
statement ok
|
||||
pragma enable_verification;
|
||||
|
||||
statement ok
|
||||
create table tbl(a varchar, b integer);
|
||||
|
||||
statement ok
|
||||
create index idx on tbl(a);
|
||||
|
||||
statement error
|
||||
alter table tbl alter a set type integer;
|
||||
----
|
||||
Catalog Error: Cannot change the type of this column: an index depends on it!
|
||||
16
external/duckdb/test/sql/catalog/dependencies/remove_table_column_referenced_by_index.test
vendored
Normal file
16
external/duckdb/test/sql/catalog/dependencies/remove_table_column_referenced_by_index.test
vendored
Normal file
@@ -0,0 +1,16 @@
|
||||
# name: test/sql/catalog/dependencies/remove_table_column_referenced_by_index.test
|
||||
# group: [dependencies]
|
||||
|
||||
statement ok
|
||||
pragma enable_verification;
|
||||
|
||||
statement ok
|
||||
create table tbl(a varchar, b integer);
|
||||
|
||||
statement ok
|
||||
create index idx on tbl(a);
|
||||
|
||||
statement error
|
||||
alter table tbl drop column a;
|
||||
----
|
||||
Catalog Error: Cannot drop this column: an index depends on it!
|
||||
16
external/duckdb/test/sql/catalog/dependencies/rename_table_column_referenced_by_index.test
vendored
Normal file
16
external/duckdb/test/sql/catalog/dependencies/rename_table_column_referenced_by_index.test
vendored
Normal file
@@ -0,0 +1,16 @@
|
||||
# name: test/sql/catalog/dependencies/rename_table_column_referenced_by_index.test
|
||||
# group: [dependencies]
|
||||
|
||||
statement ok
|
||||
pragma enable_verification;
|
||||
|
||||
statement ok
|
||||
create table tbl(a varchar);
|
||||
|
||||
statement ok
|
||||
create index idx on tbl(a);
|
||||
|
||||
statement error
|
||||
alter table tbl rename a to b;
|
||||
----
|
||||
Cannot alter entry "tbl" because there are entries that depend on it.
|
||||
27
external/duckdb/test/sql/catalog/dependencies/rename_view_referenced_by_table_macro.test
vendored
Normal file
27
external/duckdb/test/sql/catalog/dependencies/rename_view_referenced_by_table_macro.test
vendored
Normal file
@@ -0,0 +1,27 @@
|
||||
# name: test/sql/catalog/dependencies/rename_view_referenced_by_table_macro.test
|
||||
# group: [dependencies]
|
||||
|
||||
statement ok
|
||||
pragma enable_verification;
|
||||
|
||||
# Create a table so our view has something to reference
|
||||
statement ok
|
||||
create table tbl (a varchar);
|
||||
|
||||
# Create the view
|
||||
statement ok
|
||||
create view vw as select * from tbl;
|
||||
|
||||
# Create a table macro that references the view
|
||||
statement ok
|
||||
create macro static_table() as table select * from vw;
|
||||
|
||||
# Rename the view (Postgres 16.0 does not block this ALTER)
|
||||
statement ok
|
||||
alter view vw rename to vw2;
|
||||
|
||||
# Our table macro now errors
|
||||
statement error
|
||||
select * from static_table();
|
||||
----
|
||||
Catalog Error: Table with name vw does not exist!
|
||||
@@ -0,0 +1,17 @@
|
||||
# name: test/sql/catalog/dependencies/set_default_of_table_column_referenced_by_index.test
|
||||
# group: [dependencies]
|
||||
|
||||
statement ok
|
||||
pragma enable_verification;
|
||||
|
||||
statement ok
|
||||
create table tbl(a varchar, b integer);
|
||||
|
||||
statement ok
|
||||
create index idx on tbl(a);
|
||||
|
||||
statement error
|
||||
alter table tbl alter a set default 'test';
|
||||
----
|
||||
Dependency Error: Cannot alter entry "tbl" because there are entries that depend on it.
|
||||
|
||||
538
external/duckdb/test/sql/catalog/dependencies/test_alter_dependency_ownership.test
vendored
Normal file
538
external/duckdb/test/sql/catalog/dependencies/test_alter_dependency_ownership.test
vendored
Normal file
@@ -0,0 +1,538 @@
|
||||
# name: test/sql/catalog/dependencies/test_alter_dependency_ownership.test
|
||||
# description: Tests alter of ownership of sequences
|
||||
# group: [dependencies]
|
||||
|
||||
require skip_reload
|
||||
|
||||
##TEST: If the table is dropped, then the sequence is also droppped
|
||||
statement ok
|
||||
CREATE SEQUENCE sequence1;
|
||||
|
||||
statement ok
|
||||
CREATE TABLE tablename (
|
||||
colname integer
|
||||
);
|
||||
|
||||
statement ok
|
||||
ALTER SEQUENCE sequence1 OWNED BY tablename;
|
||||
|
||||
statement ok
|
||||
DROP TABLE tablename;
|
||||
|
||||
statement error
|
||||
SELECT nextval('sequence1');
|
||||
----
|
||||
Catalog Error: Sequence with name sequence1 does not exist!
|
||||
|
||||
##TEST: If the table is dropped, then the sequence is also droppped, using schemas
|
||||
statement ok
|
||||
CREATE SEQUENCE main.sequence1;
|
||||
|
||||
statement ok
|
||||
CREATE TABLE main.tablename (
|
||||
colname integer
|
||||
);
|
||||
|
||||
statement ok
|
||||
ALTER SEQUENCE main.sequence1 OWNED BY main.tablename;
|
||||
|
||||
statement ok
|
||||
DROP TABLE main.tablename;
|
||||
|
||||
statement error
|
||||
SELECT nextval('main.sequence1');
|
||||
----
|
||||
Catalog Error: Sequence with name sequence1 does not exist!
|
||||
|
||||
##TEST: If the owned sequence is dropped with CASCADE, then the table is also dropped
|
||||
statement ok
|
||||
CREATE SEQUENCE sequence1;
|
||||
|
||||
statement ok
|
||||
CREATE TABLE tablename (
|
||||
colname integer
|
||||
);
|
||||
|
||||
statement ok
|
||||
ALTER SEQUENCE sequence1 OWNED BY tablename;
|
||||
|
||||
statement ok
|
||||
DROP SEQUENCE sequence1 CASCADE;
|
||||
|
||||
statement error
|
||||
SELECT * FROM tablename;
|
||||
----
|
||||
Catalog Error: Table with name tablename does not exist!
|
||||
|
||||
##TEST: The owned sequence cannot be dropped without CASCADE
|
||||
statement ok
|
||||
CREATE SEQUENCE sequence1;
|
||||
|
||||
statement ok
|
||||
CREATE TABLE tablename (
|
||||
colname integer
|
||||
);
|
||||
|
||||
statement ok
|
||||
ALTER SEQUENCE sequence1 OWNED BY tablename;
|
||||
|
||||
statement error
|
||||
DROP SEQUENCE sequence1;
|
||||
----
|
||||
table "tablename" depends on index "sequence1".
|
||||
|
||||
statement ok
|
||||
DROP TABLE tablename;
|
||||
|
||||
##TEST: If sequence is already owned by other table throw an error
|
||||
statement ok
|
||||
CREATE SEQUENCE sequence1;
|
||||
|
||||
statement ok
|
||||
CREATE TABLE tablename (
|
||||
colname integer
|
||||
);
|
||||
|
||||
statement ok
|
||||
CREATE TABLE tablename2 (
|
||||
colname integer
|
||||
);
|
||||
|
||||
# owned by specified more than once
|
||||
statement error
|
||||
ALTER SEQUENCE sequence1 OWNED BY tablename OWNED BY tablename2;
|
||||
----
|
||||
Parser Error: Owned by value should be passed as most once
|
||||
|
||||
statement ok
|
||||
ALTER SEQUENCE sequence1 OWNED BY tablename;
|
||||
|
||||
statement error
|
||||
ALTER SEQUENCE sequence1 OWNED BY tablename2;
|
||||
----
|
||||
Dependency Error: sequence1 is already owned by tablename
|
||||
|
||||
statement ok
|
||||
DROP TABLE tablename;
|
||||
|
||||
statement ok
|
||||
DROP TABLE tablename2;
|
||||
|
||||
##TEST: If owning the sequence twice shouldn't return any error
|
||||
statement ok
|
||||
CREATE SEQUENCE sequence1;
|
||||
|
||||
statement ok
|
||||
CREATE TABLE tablename (
|
||||
colname integer
|
||||
);
|
||||
|
||||
statement ok
|
||||
ALTER SEQUENCE sequence1 OWNED BY tablename;
|
||||
|
||||
statement ok
|
||||
ALTER SEQUENCE sequence1 OWNED BY tablename;
|
||||
|
||||
statement ok
|
||||
DROP TABLE tablename;
|
||||
|
||||
##TEST: A table can own many sequences, and when the table is dropped, all sequences are also dropped
|
||||
statement ok
|
||||
CREATE SEQUENCE sequence1;
|
||||
|
||||
statement ok
|
||||
CREATE SEQUENCE sequence2;
|
||||
|
||||
statement ok
|
||||
CREATE SEQUENCE sequence3;
|
||||
|
||||
statement ok
|
||||
CREATE TABLE tablename (
|
||||
colname integer
|
||||
);
|
||||
|
||||
statement ok
|
||||
ALTER SEQUENCE sequence1 OWNED BY tablename;
|
||||
|
||||
statement ok
|
||||
ALTER SEQUENCE sequence2 OWNED BY tablename;
|
||||
|
||||
statement ok
|
||||
ALTER SEQUENCE sequence3 OWNED BY tablename;
|
||||
|
||||
statement ok
|
||||
DROP TABLE tablename;
|
||||
|
||||
statement error
|
||||
SELECT nextval('sequence1');
|
||||
----
|
||||
Catalog Error: Sequence with name sequence1 does not exist!
|
||||
|
||||
statement error
|
||||
SELECT nextval('sequence2');
|
||||
----
|
||||
Catalog Error: Sequence with name sequence2 does not exist!
|
||||
|
||||
statement error
|
||||
SELECT nextval('sequence3');
|
||||
----
|
||||
Catalog Error: Sequence with name sequence3 does not exist!
|
||||
|
||||
##TEST: When owning a sequence, insertions work normally
|
||||
statement ok
|
||||
CREATE SEQUENCE sequence1;
|
||||
|
||||
# sequence 2 will not be owned by tablename
|
||||
statement ok
|
||||
CREATE SEQUENCE sequence2;
|
||||
|
||||
statement ok
|
||||
CREATE TABLE tablename (
|
||||
colname integer DEFAULT nextval('sequence1'),
|
||||
colname2 integer DEFAULT nextval('sequence2'),
|
||||
colname3 integer,
|
||||
colname4 float,
|
||||
colname5 string
|
||||
);
|
||||
|
||||
statement ok
|
||||
ALTER SEQUENCE sequence1 OWNED BY tablename;
|
||||
|
||||
statement ok
|
||||
INSERT INTO tablename VALUES(default, default, 10, 2.0, 'aaaa');
|
||||
|
||||
statement ok
|
||||
INSERT INTO tablename VALUES(default, default, 20, 3.0, 'bbbb');
|
||||
|
||||
query IIIII
|
||||
SELECT colname, colname2, colname3, colname4, colname5 FROM tablename;
|
||||
----
|
||||
1 1 10 2.0 aaaa
|
||||
2 2 20 3.0 bbbb
|
||||
|
||||
statement ok
|
||||
DROP TABLE tablename;
|
||||
|
||||
statement ok
|
||||
DROP SEQUENCE sequence2;
|
||||
|
||||
##TEST: If we change the name of a table that has an owned sequence, the ownership moves to the new table name
|
||||
statement ok
|
||||
CREATE SEQUENCE sequence1;
|
||||
|
||||
statement ok
|
||||
CREATE TABLE tablename (
|
||||
colname integer
|
||||
);
|
||||
|
||||
statement ok
|
||||
ALTER SEQUENCE sequence1 OWNED BY tablename;
|
||||
|
||||
statement ok
|
||||
ALTER TABLE tablename RENAME TO new_tablename;
|
||||
|
||||
# Create a new table, with the same name as the old table and try to own the sequence
|
||||
statement ok
|
||||
CREATE TABLE tablename (
|
||||
colname integer
|
||||
);
|
||||
|
||||
statement error
|
||||
ALTER SEQUENCE sequence1 OWNED BY tablename;
|
||||
----
|
||||
sequence1 is already owned by new_tablename
|
||||
|
||||
statement error
|
||||
DROP SEQUENCE sequence1;
|
||||
----
|
||||
table "new_tablename" depends on index "sequence1".
|
||||
|
||||
statement error
|
||||
CREATE OR REPLACE SEQUENCE sequence1;
|
||||
----
|
||||
table "new_tablename" depends on index "sequence1".
|
||||
|
||||
# Owning the sequence with the same table shouldn't return any error
|
||||
statement ok
|
||||
ALTER SEQUENCE sequence1 OWNED BY new_tablename;
|
||||
|
||||
statement ok
|
||||
DROP TABLE tablename;
|
||||
|
||||
statement ok
|
||||
DROP TABLE new_tablename;
|
||||
|
||||
##TEST: If we add a column to a table that has an owned sequence, the ownership remains
|
||||
statement ok
|
||||
CREATE SEQUENCE sequence1;
|
||||
|
||||
statement ok
|
||||
CREATE TABLE tablename (
|
||||
colname integer
|
||||
);
|
||||
|
||||
statement ok
|
||||
ALTER SEQUENCE sequence1 OWNED BY tablename;
|
||||
|
||||
statement ok
|
||||
ALTER TABLE tablename ADD COLUMN colname2 integer DEFAULT nextval('sequence1')
|
||||
|
||||
statement ok
|
||||
ALTER SEQUENCE sequence1 OWNED BY tablename;
|
||||
|
||||
statement error
|
||||
DROP SEQUENCE sequence1;
|
||||
----
|
||||
table "tablename" depends on index "sequence1".
|
||||
|
||||
statement ok
|
||||
DROP TABLE tablename;
|
||||
|
||||
##TEST: If we remove a column to a table that has an owned sequence, the ownership remains
|
||||
statement ok
|
||||
CREATE SEQUENCE sequence1;
|
||||
|
||||
statement ok
|
||||
CREATE TABLE tablename (
|
||||
colname integer,
|
||||
colname2 integer DEFAULT nextval('sequence1')
|
||||
);
|
||||
|
||||
statement ok
|
||||
ALTER SEQUENCE sequence1 OWNED BY tablename;
|
||||
|
||||
statement ok
|
||||
ALTER TABLE tablename DROP colname2;
|
||||
|
||||
statement error
|
||||
DROP SEQUENCE sequence1;
|
||||
----
|
||||
table "tablename" depends on index "sequence1".
|
||||
|
||||
statement ok
|
||||
DROP TABLE tablename;
|
||||
|
||||
##TEST: If we alter the type of a column that has the sequence as default value
|
||||
statement ok
|
||||
CREATE SEQUENCE sequence1;
|
||||
|
||||
statement ok
|
||||
CREATE TABLE tablename (
|
||||
colname integer DEFAULT nextval('sequence1')
|
||||
);
|
||||
|
||||
statement ok
|
||||
ALTER SEQUENCE sequence1 OWNED BY tablename;
|
||||
|
||||
statement ok
|
||||
ALTER TABLE tablename ALTER colname TYPE float;
|
||||
|
||||
statement error
|
||||
DROP SEQUENCE sequence1;
|
||||
----
|
||||
table "tablename" depends on index "sequence1".
|
||||
|
||||
statement ok
|
||||
DROP TABLE tablename;
|
||||
|
||||
###TEST: If we have many columns using the sequence as default and drop one by one, the ownership should remain intact
|
||||
statement ok
|
||||
CREATE SEQUENCE sequence1;
|
||||
|
||||
statement ok
|
||||
CREATE TABLE tablename (
|
||||
colname integer DEFAULT nextval('sequence1'),
|
||||
colname2 integer DEFAULT nextval('sequence1'),
|
||||
colname3 integer DEFAULT nextval('sequence1'),
|
||||
colname4 integer DEFAULT nextval('sequence1')
|
||||
);
|
||||
|
||||
statement ok
|
||||
ALTER SEQUENCE sequence1 OWNED BY tablename;
|
||||
|
||||
statement ok
|
||||
ALTER TABLE tablename DROP colname4;
|
||||
|
||||
statement error
|
||||
DROP SEQUENCE sequence1;
|
||||
----
|
||||
table "tablename" depends on index "sequence1".
|
||||
|
||||
statement ok
|
||||
ALTER TABLE tablename DROP colname3;
|
||||
|
||||
statement error
|
||||
DROP SEQUENCE sequence1;
|
||||
----
|
||||
table "tablename" depends on index "sequence1".
|
||||
|
||||
statement ok
|
||||
ALTER TABLE tablename DROP colname2;
|
||||
|
||||
statement error
|
||||
DROP SEQUENCE sequence1;
|
||||
----
|
||||
table "tablename" depends on index "sequence1".
|
||||
|
||||
statement ok
|
||||
DROP TABLE tablename;
|
||||
|
||||
##TEST: If we drop a table which owns a sequence and then roll back, the ownership should remain
|
||||
statement ok
|
||||
CREATE SEQUENCE sequence1;
|
||||
|
||||
statement ok
|
||||
CREATE TABLE tablename (
|
||||
colname integer DEFAULT nextval('sequence1')
|
||||
);
|
||||
|
||||
statement ok
|
||||
ALTER SEQUENCE sequence1 OWNED BY tablename;
|
||||
|
||||
statement ok
|
||||
BEGIN TRANSACTION;
|
||||
|
||||
statement ok
|
||||
DROP TABLE tablename;
|
||||
|
||||
statement error
|
||||
select nextval('sequence1');
|
||||
----
|
||||
Catalog Error: Sequence with name sequence1 does not exist!
|
||||
|
||||
statement ok
|
||||
ROLLBACK;
|
||||
|
||||
query I
|
||||
select nextval('sequence1');
|
||||
----
|
||||
1
|
||||
|
||||
statement error
|
||||
DROP SEQUENCE sequence1;
|
||||
----
|
||||
table "tablename" depends on index "sequence1".
|
||||
|
||||
statement ok
|
||||
DROP TABLE tablename;
|
||||
|
||||
##TEST: View can own a sequence
|
||||
statement ok
|
||||
CREATE SEQUENCE sequence1;
|
||||
|
||||
statement ok
|
||||
CREATE VIEW v1_sequence1(a) AS SELECT 42;
|
||||
|
||||
statement ok
|
||||
ALTER SEQUENCE sequence1 OWNED BY v1_sequence1;
|
||||
|
||||
statement error
|
||||
DROP SEQUENCE sequence1;
|
||||
----
|
||||
view "v1_sequence1" depends on index "sequence1".
|
||||
|
||||
statement ok
|
||||
DROP VIEW v1_sequence1;
|
||||
|
||||
statement error
|
||||
SELECT nextval('sequence1');
|
||||
----
|
||||
Catalog Error: Sequence with name sequence1 does not exist!
|
||||
|
||||
##TEST: Sequence can own a sequence
|
||||
statement ok
|
||||
CREATE SEQUENCE sequence1;
|
||||
|
||||
statement ok
|
||||
CREATE SEQUENCE sequence2;
|
||||
|
||||
statement ok
|
||||
ALTER SEQUENCE sequence1 OWNED BY sequence2;
|
||||
|
||||
statement error
|
||||
DROP SEQUENCE sequence1;
|
||||
----
|
||||
index "sequence2" depends on index "sequence1".
|
||||
|
||||
statement ok
|
||||
DROP SEQUENCE sequence2;
|
||||
|
||||
statement error
|
||||
SELECT nextval('sequence1');
|
||||
----
|
||||
Catalog Error: Sequence with name sequence1 does not exist!
|
||||
|
||||
##TEST: Sequence cant own its owner
|
||||
statement ok
|
||||
CREATE SEQUENCE sequence1;
|
||||
|
||||
statement ok
|
||||
CREATE SEQUENCE sequence2;
|
||||
|
||||
statement ok
|
||||
ALTER SEQUENCE sequence1 OWNED BY sequence2;
|
||||
|
||||
statement error
|
||||
ALTER SEQUENCE sequence2 OWNED BY sequence1;
|
||||
----
|
||||
Dependency Error: sequence1 can not become the owner, it is already owned by sequence2
|
||||
|
||||
statement ok
|
||||
DROP SEQUENCE sequence2;
|
||||
|
||||
##TEST: Dependency cycle should throw error
|
||||
statement ok
|
||||
CREATE SEQUENCE sequence1;
|
||||
|
||||
statement ok
|
||||
CREATE SEQUENCE sequence2;
|
||||
|
||||
statement ok
|
||||
CREATE SEQUENCE sequence3;
|
||||
|
||||
statement ok
|
||||
CREATE SEQUENCE sequence4;
|
||||
|
||||
statement ok
|
||||
ALTER SEQUENCE sequence2 OWNED BY sequence1;
|
||||
|
||||
statement error
|
||||
ALTER SEQUENCE sequence3 OWNED BY sequence2;
|
||||
----
|
||||
Dependency Error: sequence2 can not become the owner, it is already owned by sequence1
|
||||
|
||||
# FIXME: this error makes no sense, if there is no circular dependency
|
||||
# this should be allowed
|
||||
statement error
|
||||
ALTER SEQUENCE sequence1 OWNED BY sequence3;
|
||||
----
|
||||
Dependency Error: sequence1 already owns sequence2. Cannot have circular dependencies
|
||||
|
||||
statement ok
|
||||
ALTER SEQUENCE sequence3 OWNED BY sequence4;
|
||||
|
||||
statement ok
|
||||
DROP SEQUENCE sequence1;
|
||||
|
||||
statement ok
|
||||
DROP SEQUENCE sequence4;
|
||||
|
||||
statement error
|
||||
SELECT nextval('sequence1');
|
||||
----
|
||||
Catalog Error: Sequence with name sequence1 does not exist!
|
||||
|
||||
statement error
|
||||
SELECT nextval('sequence2');
|
||||
----
|
||||
Catalog Error: Sequence with name sequence2 does not exist!
|
||||
|
||||
statement error
|
||||
SELECT nextval('sequence3');
|
||||
----
|
||||
Catalog Error: Sequence with name sequence3 does not exist!
|
||||
|
||||
statement error
|
||||
SELECT nextval('sequence4');
|
||||
----
|
||||
Catalog Error: Sequence with name sequence4 does not exist!
|
||||
55
external/duckdb/test/sql/catalog/dependencies/test_alter_owned_by.test
vendored
Normal file
55
external/duckdb/test/sql/catalog/dependencies/test_alter_owned_by.test
vendored
Normal file
@@ -0,0 +1,55 @@
|
||||
# name: test/sql/catalog/dependencies/test_alter_owned_by.test
|
||||
# group: [dependencies]
|
||||
|
||||
require skip_reload
|
||||
|
||||
statement ok
|
||||
PRAGMA verify_serializer
|
||||
|
||||
##TEST: If the table is dropped, then the sequence is also droppped
|
||||
statement ok
|
||||
CREATE SEQUENCE sequence1;
|
||||
|
||||
statement ok
|
||||
CREATE SEQUENCE sequence2;
|
||||
|
||||
statement ok
|
||||
CREATE TABLE tbl1 (
|
||||
colname integer
|
||||
);
|
||||
|
||||
statement ok
|
||||
CREATE TABLE tbl2 (
|
||||
colname integer
|
||||
);
|
||||
|
||||
statement ok
|
||||
ALTER SEQUENCE sequence1 OWNED BY tbl1;
|
||||
|
||||
# sequence1 can not be the owner of an entry, sequence1 is already owned
|
||||
statement error
|
||||
ALTER SEQUENCE sequence2 OWNED BY sequence1;
|
||||
----
|
||||
<REGEX>:.*Dependency Error.*is already owned.*
|
||||
|
||||
# sequence1 is already owned by another entry
|
||||
statement error
|
||||
ALTER SEQUENCE sequence1 OWNED BY tbl2;
|
||||
----
|
||||
<REGEX>:.*Dependency Error.*is already owned.*
|
||||
|
||||
statement ok
|
||||
create sequence sequence3;
|
||||
|
||||
statement error
|
||||
alter sequence sequence3 owned by sequence1
|
||||
----
|
||||
<REGEX>:.*Dependency Error.*is already owned.*
|
||||
|
||||
statement ok
|
||||
DROP TABLE tbl1;
|
||||
|
||||
statement error
|
||||
SELECT nextval('sequence1');
|
||||
----
|
||||
<REGEX>:.*Catalog Error.*does not exist.*
|
||||
44
external/duckdb/test/sql/catalog/dependencies/test_alter_owning_table.test
vendored
Normal file
44
external/duckdb/test/sql/catalog/dependencies/test_alter_owning_table.test
vendored
Normal file
@@ -0,0 +1,44 @@
|
||||
# name: test/sql/catalog/dependencies/test_alter_owning_table.test
|
||||
# description: Test ALTER of table that owns a sequence
|
||||
# group: [dependencies]
|
||||
|
||||
# FIXME: we don't preserve OWNED BY on restarts
|
||||
require skip_reload
|
||||
|
||||
statement ok
|
||||
create sequence seq;
|
||||
|
||||
statement ok
|
||||
create sequence other_seq;
|
||||
|
||||
statement ok
|
||||
create table tbl (
|
||||
a integer default nextval('other_seq')
|
||||
);
|
||||
|
||||
statement ok
|
||||
alter sequence seq owned by tbl;
|
||||
|
||||
statement ok
|
||||
alter table tbl rename to tbl2;
|
||||
|
||||
statement error
|
||||
drop sequence seq;
|
||||
----
|
||||
table "tbl2" depends on index "seq".
|
||||
|
||||
statement error
|
||||
drop sequence other_seq;
|
||||
----
|
||||
table "tbl2" depends on index "other_seq".
|
||||
|
||||
statement ok
|
||||
drop table tbl2;
|
||||
|
||||
statement error
|
||||
drop sequence seq;
|
||||
----
|
||||
Sequence with name seq does not exist!
|
||||
|
||||
statement ok
|
||||
drop sequence other_seq;
|
||||
36
external/duckdb/test/sql/catalog/dependencies/test_concurrent_alter.test
vendored
Normal file
36
external/duckdb/test/sql/catalog/dependencies/test_concurrent_alter.test
vendored
Normal file
@@ -0,0 +1,36 @@
|
||||
# name: test/sql/catalog/dependencies/test_concurrent_alter.test
|
||||
# group: [dependencies]
|
||||
|
||||
require skip_reload
|
||||
|
||||
# Create the table
|
||||
statement ok
|
||||
CREATE TABLE t2 AS (SELECT 42);
|
||||
|
||||
# Create a sequence
|
||||
statement ok
|
||||
create sequence seq;
|
||||
|
||||
# Let the table own the sequence
|
||||
statement ok
|
||||
alter sequence seq owned by t2;
|
||||
|
||||
concurrentloop i 1 100
|
||||
|
||||
loop j 1 10
|
||||
|
||||
statement maybe
|
||||
alter table t2 rename to t3;
|
||||
----
|
||||
Error
|
||||
|
||||
statement maybe
|
||||
alter table t3 rename to t2;
|
||||
----
|
||||
Error
|
||||
|
||||
# j
|
||||
endloop
|
||||
|
||||
# i
|
||||
endloop
|
||||
38
external/duckdb/test/sql/catalog/dependencies/test_concurrent_drop.test
vendored
Normal file
38
external/duckdb/test/sql/catalog/dependencies/test_concurrent_drop.test
vendored
Normal file
@@ -0,0 +1,38 @@
|
||||
# name: test/sql/catalog/dependencies/test_concurrent_drop.test
|
||||
# description: Test concurrent alter and rename of tables
|
||||
# group: [dependencies]
|
||||
|
||||
require skip_reload
|
||||
|
||||
# Create a sequence object
|
||||
statement ok
|
||||
create sequence seq;
|
||||
|
||||
concurrentloop i 0 100
|
||||
|
||||
# Create dependencies on the sequence
|
||||
statement ok
|
||||
create table tbl${i} (
|
||||
a integer default nextval('seq')
|
||||
);
|
||||
|
||||
# Cant drop the sequence because we just added a dependency
|
||||
statement error
|
||||
drop sequence seq;
|
||||
----
|
||||
Cannot drop entry "seq" because there are entries that depend on it.
|
||||
|
||||
# Use the sequence
|
||||
statement ok
|
||||
insert into tbl${i} VALUES(DEFAULT);
|
||||
|
||||
# Drop the table - removing the dependency
|
||||
statement ok
|
||||
drop table tbl${i};
|
||||
|
||||
# i
|
||||
endloop
|
||||
|
||||
# We can now drop the sequence, all its dependents are gone
|
||||
statement ok
|
||||
drop sequence seq;
|
||||
34
external/duckdb/test/sql/catalog/dependencies/test_concurrent_index_creation.test
vendored
Normal file
34
external/duckdb/test/sql/catalog/dependencies/test_concurrent_index_creation.test
vendored
Normal file
@@ -0,0 +1,34 @@
|
||||
# name: test/sql/catalog/dependencies/test_concurrent_index_creation.test
|
||||
# description: Test concurrent alter and rename of tables
|
||||
# group: [dependencies]
|
||||
|
||||
mode skip
|
||||
|
||||
require skip_reload
|
||||
|
||||
statement ok
|
||||
ATTACH '__TEST_DIR__/concurrent_index_creation.db' AS source;
|
||||
|
||||
concurrentloop i 0 10
|
||||
|
||||
statement maybe
|
||||
CREATE TABLE IF NOT EXISTS source.tbl (i INT);
|
||||
----
|
||||
|
||||
# Create an index on the table.
|
||||
statement maybe
|
||||
CREATE INDEX index${i} ON source.tbl (i);
|
||||
----
|
||||
|
||||
# Drop the table and its indexes.
|
||||
statement maybe
|
||||
DROP TABLE source.tbl;
|
||||
----
|
||||
|
||||
endloop
|
||||
|
||||
statement ok
|
||||
DETACH source;
|
||||
|
||||
statement ok
|
||||
ATTACH '__TEST_DIR__/concurrent_index_creation.db' AS source;
|
||||
38
external/duckdb/test/sql/catalog/dependencies/test_concurrent_rename.test_slow
vendored
Normal file
38
external/duckdb/test/sql/catalog/dependencies/test_concurrent_rename.test_slow
vendored
Normal file
@@ -0,0 +1,38 @@
|
||||
# name: test/sql/catalog/dependencies/test_concurrent_rename.test_slow
|
||||
# description: Tests concurrent rename of tables
|
||||
# group: [dependencies]
|
||||
|
||||
require skip_reload
|
||||
|
||||
statement ok
|
||||
CREATE TABLE t2 AS (SELECT 42);
|
||||
|
||||
concurrentloop i 1 100
|
||||
|
||||
loop j 1 10
|
||||
|
||||
# Rename to t3
|
||||
statement maybe
|
||||
alter table t2 rename to t3;
|
||||
----
|
||||
|
||||
# Rename back to t2
|
||||
statement maybe
|
||||
alter table t3 rename to t2;
|
||||
----
|
||||
|
||||
# Select from t3 - might succeed
|
||||
statement maybe
|
||||
select * from t3;
|
||||
----
|
||||
|
||||
# Select from t2 - might succeed
|
||||
statement maybe
|
||||
select * from t2;
|
||||
----
|
||||
|
||||
# j
|
||||
endloop
|
||||
|
||||
# i
|
||||
endloop
|
||||
36
external/duckdb/test/sql/catalog/dependencies/test_concurrent_schema_creation.test
vendored
Normal file
36
external/duckdb/test/sql/catalog/dependencies/test_concurrent_schema_creation.test
vendored
Normal file
@@ -0,0 +1,36 @@
|
||||
# name: test/sql/catalog/dependencies/test_concurrent_schema_creation.test
|
||||
# description: Test concurrent schema creation + table creation
|
||||
# group: [dependencies]
|
||||
|
||||
require skip_reload
|
||||
|
||||
concurrentloop i 0 100
|
||||
|
||||
# Create a schema for every thread
|
||||
statement ok
|
||||
create schema schema${i};
|
||||
|
||||
# Create a table inside this schema
|
||||
statement ok
|
||||
create table schema${i}.tbl${i} (a integer);
|
||||
|
||||
# Drop the schema for the thread - should fail
|
||||
statement error
|
||||
drop schema schema${i};
|
||||
----
|
||||
because there are entries that depend on it
|
||||
|
||||
# Insert into the table
|
||||
statement ok
|
||||
insert into schema${i}.tbl${i} VALUES(1);
|
||||
|
||||
# Drop the table
|
||||
statement ok
|
||||
drop table schema${i}.tbl${i};
|
||||
|
||||
# Drop the schema again - now it succeeds
|
||||
statement ok
|
||||
drop schema schema${i};
|
||||
|
||||
# i
|
||||
endloop
|
||||
78
external/duckdb/test/sql/catalog/dependencies/test_default_value_dependency.test
vendored
Normal file
78
external/duckdb/test/sql/catalog/dependencies/test_default_value_dependency.test
vendored
Normal file
@@ -0,0 +1,78 @@
|
||||
# name: test/sql/catalog/dependencies/test_default_value_dependency.test
|
||||
# description: Default values and dependencies
|
||||
# group: [dependencies]
|
||||
|
||||
require skip_reload
|
||||
|
||||
|
||||
# dependency on a sequence in a default value
|
||||
statement ok con1
|
||||
CREATE SEQUENCE seq
|
||||
|
||||
statement ok con1
|
||||
CREATE TABLE integers(i INTEGER DEFAULT nextval('seq'), j INTEGER)
|
||||
|
||||
statement ok con1
|
||||
INSERT INTO integers (j) VALUES (1), (1), (1), (1), (1)
|
||||
|
||||
query R con2
|
||||
SELECT SUM(i) FROM integers
|
||||
----
|
||||
15.000000
|
||||
|
||||
# we can't drop the sequence: the table depends on it
|
||||
statement error con1
|
||||
DROP SEQUENCE seq
|
||||
----
|
||||
|
||||
# cascade drop works
|
||||
statement ok con1
|
||||
DROP SEQUENCE seq CASCADE
|
||||
|
||||
# but it also drops the table
|
||||
statement error con1
|
||||
SELECT * FROM integers
|
||||
----
|
||||
|
||||
# dependency on multiple sequences in default value
|
||||
statement ok con1
|
||||
CREATE SEQUENCE seq
|
||||
|
||||
statement ok con1
|
||||
CREATE SEQUENCE seq1
|
||||
|
||||
statement ok con1
|
||||
CREATE SEQUENCE seq2
|
||||
|
||||
statement error con1
|
||||
CREATE TABLE integers(i INTEGER DEFAULT nextval('seq' || CAST(nextval('seq') AS VARCHAR)), j INTEGER)
|
||||
----
|
||||
non-constant sequences are no longer supported
|
||||
|
||||
statement ok con1
|
||||
CREATE TABLE integers(i INTEGER DEFAULT nextval('seq1') + nextval('seq2'), j INTEGER)
|
||||
|
||||
# seq1 exists, so the result of the first default value is 1
|
||||
statement ok con1
|
||||
INSERT INTO integers (j) VALUES (1)
|
||||
|
||||
# we canot drop seq1 and seq2: the dependency is fixed
|
||||
statement error con1
|
||||
DROP SEQUENCE seq1
|
||||
----
|
||||
Cannot drop entry
|
||||
|
||||
statement error con1
|
||||
DROP SEQUENCE seq2
|
||||
----
|
||||
Cannot drop entry
|
||||
|
||||
# need to do a cascading drop
|
||||
statement ok con1
|
||||
DROP SEQUENCE seq1 CASCADE
|
||||
|
||||
# now the table is gone
|
||||
statement error con1
|
||||
SELECT * FROM integers
|
||||
----
|
||||
does not exist
|
||||
81
external/duckdb/test/sql/catalog/dependencies/test_prepare_dependencies_transactions.test
vendored
Normal file
81
external/duckdb/test/sql/catalog/dependencies/test_prepare_dependencies_transactions.test
vendored
Normal file
@@ -0,0 +1,81 @@
|
||||
# name: test/sql/catalog/dependencies/test_prepare_dependencies_transactions.test
|
||||
# description: Prepare dependencies and transactions
|
||||
# group: [dependencies]
|
||||
|
||||
require skip_reload
|
||||
|
||||
statement ok
|
||||
SET immediate_transaction_mode=true
|
||||
|
||||
# case one: prepared statement is created outside of transaction and committed
|
||||
statement ok con1
|
||||
CREATE TABLE integers(i INTEGER)
|
||||
|
||||
statement ok con1
|
||||
INSERT INTO integers VALUES (1), (2), (3), (4), (5)
|
||||
|
||||
statement ok con2
|
||||
PREPARE v AS SELECT SUM(i) FROM integers
|
||||
|
||||
# begin a transaction in con2
|
||||
statement ok con2
|
||||
BEGIN TRANSACTION
|
||||
|
||||
# now drop the table in con, with a cascading drop
|
||||
statement ok con1
|
||||
DROP TABLE integers CASCADE
|
||||
|
||||
# we can still execute v in con2
|
||||
statement ok con2
|
||||
EXECUTE v
|
||||
|
||||
# if we try to drop integers we get a conflict though
|
||||
statement error con2
|
||||
DROP TABLE integers CASCADE
|
||||
----
|
||||
<REGEX>:.*TransactionContext Error: Catalog write-write conflict on alter.*
|
||||
|
||||
# now we rollback
|
||||
statement ok con2
|
||||
ROLLBACK
|
||||
|
||||
# now we can't use the prepared statement anymore
|
||||
statement error con2
|
||||
EXECUTE v
|
||||
----
|
||||
<REGEX>:.*Catalog Error.*does not exist.*
|
||||
|
||||
# case two: prepared statement is created inside transaction
|
||||
statement ok con1
|
||||
CREATE TABLE integers(i INTEGER)
|
||||
|
||||
statement ok con1
|
||||
INSERT INTO integers VALUES (1), (2), (3), (4), (5)
|
||||
|
||||
# begin a transaction and create a prepared statement
|
||||
statement ok con2
|
||||
BEGIN TRANSACTION
|
||||
|
||||
statement ok con2
|
||||
PREPARE v AS SELECT SUM(i) FROM integers
|
||||
|
||||
# use the prepared statement
|
||||
statement ok con2
|
||||
EXECUTE v
|
||||
|
||||
# integers has a prepared statement depending on it, but we can still drop it
|
||||
statement ok con1
|
||||
DROP TABLE integers
|
||||
|
||||
# using the prepared statement after the table is still works: we are inside a transaction that uses an old version
|
||||
statement ok con2
|
||||
EXECUTE v
|
||||
|
||||
statement ok con2
|
||||
COMMIT
|
||||
|
||||
# after committing we can no longer use the prepared statement
|
||||
statement error con2
|
||||
EXECUTE v
|
||||
----
|
||||
<REGEX>:.*Catalog Error.*does not exist.*
|
||||
46
external/duckdb/test/sql/catalog/dependencies/test_prepared_dependency.test
vendored
Normal file
46
external/duckdb/test/sql/catalog/dependencies/test_prepared_dependency.test
vendored
Normal file
@@ -0,0 +1,46 @@
|
||||
# name: test/sql/catalog/dependencies/test_prepared_dependency.test
|
||||
# description: Prepared statement dependencies
|
||||
# group: [dependencies]
|
||||
|
||||
require skip_reload
|
||||
|
||||
|
||||
# prepared statements and dependencies
|
||||
# dependency on a bound table
|
||||
statement ok con1
|
||||
CREATE TABLE integers(i INTEGER)
|
||||
|
||||
statement ok con2
|
||||
PREPARE v AS SELECT * FROM integers
|
||||
|
||||
statement ok con2
|
||||
EXECUTE v
|
||||
|
||||
statement ok con1
|
||||
DROP TABLE integers CASCADE
|
||||
|
||||
# after the drop the prepared statement is invalidated
|
||||
statement error con2
|
||||
EXECUTE v
|
||||
----
|
||||
<REGEX>:.*Catalog Error.*does not exist.*
|
||||
|
||||
# dependency on a sequence for prepare
|
||||
statement ok con1
|
||||
CREATE SEQUENCE seq
|
||||
|
||||
statement ok con2
|
||||
PREPARE v AS SELECT nextval('seq')
|
||||
|
||||
statement ok con2
|
||||
EXECUTE v
|
||||
|
||||
# drop the sequence
|
||||
statement ok con1
|
||||
DROP SEQUENCE seq CASCADE
|
||||
|
||||
# after the drop the prepared statement is invalidated
|
||||
statement error con2
|
||||
EXECUTE v
|
||||
----
|
||||
<REGEX>:.*Catalog Error.*does not exist.*
|
||||
103
external/duckdb/test/sql/catalog/dependencies/test_schema_dependency.test
vendored
Normal file
103
external/duckdb/test/sql/catalog/dependencies/test_schema_dependency.test
vendored
Normal file
@@ -0,0 +1,103 @@
|
||||
# name: test/sql/catalog/dependencies/test_schema_dependency.test
|
||||
# description: Schema dependencies
|
||||
# group: [dependencies]
|
||||
|
||||
# single schema and dependencies
|
||||
statement ok con1
|
||||
CREATE SCHEMA s1
|
||||
|
||||
statement ok con1
|
||||
CREATE TABLE s1.integers(i INTEGER)
|
||||
|
||||
query I con1
|
||||
SELECT * FROM s1.integers
|
||||
----
|
||||
|
||||
# can't drop: dependency
|
||||
statement error con1
|
||||
DROP SCHEMA s1
|
||||
----
|
||||
table "integers" depends on schema "s1".
|
||||
|
||||
query I con1
|
||||
SELECT * FROM s1.integers
|
||||
----
|
||||
|
||||
# we can drop with cascade though
|
||||
statement ok con1
|
||||
DROP SCHEMA s1 CASCADE
|
||||
|
||||
# this also drops the table
|
||||
statement error con1
|
||||
SELECT * FROM s1.integers
|
||||
----
|
||||
Table with name integers does not exist
|
||||
|
||||
# schemas and dependencies
|
||||
# create a schema and a table inside the schema
|
||||
statement ok con1
|
||||
CREATE SCHEMA s1
|
||||
|
||||
statement ok con1
|
||||
CREATE TABLE s1.integers(i INTEGER)
|
||||
|
||||
statement ok con1
|
||||
BEGIN TRANSACTION
|
||||
|
||||
statement ok con2
|
||||
BEGIN TRANSACTION
|
||||
|
||||
# drop the table in con1
|
||||
statement ok con1
|
||||
DROP TABLE s1.integers
|
||||
|
||||
# we can't drop the schema from con2 because the table still exists for con2!
|
||||
statement error con2
|
||||
DROP SCHEMA s1
|
||||
----
|
||||
table "integers" depends on schema "s1".
|
||||
|
||||
# now rollback the table drop
|
||||
statement ok con1
|
||||
ROLLBACK
|
||||
|
||||
statement ok con2
|
||||
ROLLBACK
|
||||
|
||||
# the table exists again
|
||||
query I con1
|
||||
SELECT * FROM s1.integers
|
||||
----
|
||||
|
||||
# try again, but this time we commit
|
||||
statement ok con1
|
||||
BEGIN TRANSACTION
|
||||
|
||||
statement ok con2
|
||||
BEGIN TRANSACTION
|
||||
|
||||
# drop the schema entirely now
|
||||
statement ok con1
|
||||
DROP SCHEMA s1 CASCADE
|
||||
|
||||
# we can still query the table from con2
|
||||
query I con2
|
||||
SELECT * FROM s1.integers
|
||||
----
|
||||
|
||||
# even after we commit
|
||||
statement ok con1
|
||||
COMMIT
|
||||
|
||||
query I con2
|
||||
SELECT * FROM s1.integers
|
||||
----
|
||||
|
||||
# however if we end the transaction in con2 the schema is gone
|
||||
statement ok con2
|
||||
ROLLBACK
|
||||
|
||||
statement error con2
|
||||
CREATE TABLE s1.dummy(i INTEGER)
|
||||
----
|
||||
Schema with name s1 does not exist
|
||||
43
external/duckdb/test/sql/catalog/dependencies/test_write_after_rename.test
vendored
Normal file
43
external/duckdb/test/sql/catalog/dependencies/test_write_after_rename.test
vendored
Normal file
@@ -0,0 +1,43 @@
|
||||
# name: test/sql/catalog/dependencies/test_write_after_rename.test
|
||||
# group: [dependencies]
|
||||
|
||||
load __TEST_DIR__/create_after_rename.db
|
||||
|
||||
# Create 'tbl'
|
||||
statement ok
|
||||
create table tbl (i integer);
|
||||
|
||||
statement ok
|
||||
insert into tbl VALUES (5);
|
||||
|
||||
statement ok
|
||||
begin transaction;
|
||||
|
||||
# Rename 'tbl' -> 'tbl2'
|
||||
statement ok
|
||||
alter table tbl rename to tbl2;
|
||||
|
||||
# Create a new table with the old name: 'tbl'
|
||||
statement ok
|
||||
create table tbl (b varchar);
|
||||
|
||||
statement ok
|
||||
insert into tbl VALUES ('test')
|
||||
|
||||
statement ok
|
||||
commit;
|
||||
|
||||
statement ok
|
||||
checkpoint;
|
||||
|
||||
restart
|
||||
|
||||
query I
|
||||
select * from tbl2;
|
||||
----
|
||||
5
|
||||
|
||||
query I
|
||||
select * from tbl;
|
||||
----
|
||||
test
|
||||
Reference in New Issue
Block a user