should be it

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

View File

@@ -0,0 +1,104 @@
# name: test/sql/copy_database/copy_database_different_types.test
# description: Test attach mixed with the COPY statement
# group: [copy_database]
statement ok
ATTACH '__TEST_DIR__/copy_database_different_types.db' AS db1
statement ok
USE db1
statement ok
CREATE TABLE test(a INTEGER, b INTEGER, c VARCHAR(10));
statement ok
INSERT INTO test VALUES (42, 88, 'hello');
# FIXME - (unique) indexes aren't copied currently
mode skip
statement ok
CREATE UNIQUE INDEX i_unique ON test(a);
mode unskip
statement ok
CREATE VIEW v1 AS FROM test;
statement ok
CREATE TYPE mood AS ENUM('ok', 'sad', 'happy');
statement ok
CREATE TABLE enums(i mood)
statement ok
INSERT INTO enums VALUES ('ok'), ('sad'), (NULL)
statement ok
select * from db1.enums
statement ok
CREATE SEQUENCE seq;
query I
SELECT nextval('seq')
----
1
statement ok
CREATE FUNCTION my_add(a, b) AS a + b
statement ok
ATTACH '__TEST_DIR__/other_copy_database_different_types.db' AS db2;
statement ok
COPY FROM DATABASE db1 TO db2
statement ok
USE db2
query III
SELECT * FROM test;
----
42 88 hello
query I
SELECT * FROM enums;
----
ok
sad
NULL
query III
SELECT * FROM v1;
----
42 88 hello
# FIXME - unique indexes aren't copied currently
mode skip
statement error
INSERT INTO test VALUES (42, 88, 'hello');
----
xx
mode unskip
statement ok
INSERT INTO test VALUES (43, 88, 'hello');
query III
SELECT * FROM v1;
----
42 88 hello
43 88 hello
query I
SELECT nextval('seq')
----
2
query I
SELECT my_add(1, 2)
----
3

View File

@@ -0,0 +1,51 @@
# name: test/sql/copy_database/copy_database_errors.test
# description: Test COPY DATABASE errors
# group: [copy_database]
statement ok
PRAGMA enable_verification
statement ok
ATTACH DATABASE ':memory:' AS db1;
statement ok
ATTACH DATABASE ':memory:' AS db2;
# copying an empty database should work
statement ok
COPY FROM DATABASE db1 TO db2
statement ok
CREATE TABLE db1.test(a INTEGER, b INTEGER, c VARCHAR);
statement ok
INSERT INTO db1.test VALUES (42, 84, 'hello')
# we cannot copy from the same database to the same database
statement error
COPY FROM DATABASE db1 TO db1
----
FROM and TO databases are the same
# read-only test
statement ok
ATTACH DATABASE '__TEST_DIR__/read_only.db' AS read_only
statement ok
CREATE TABLE read_only.t(i INT);
statement ok
DETACH read_only
statement ok
ATTACH DATABASE '__TEST_DIR__/read_only.db' AS read_only (READ_ONLY)
# we cannot copy TO a read-only database
statement error
COPY FROM DATABASE db1 TO read_only
----
attached in read-only mode
# we can copy FROM a read-only database
statement ok
COPY FROM DATABASE read_only TO db1

View File

@@ -0,0 +1,71 @@
# name: test/sql/copy_database/copy_database_fk.test
# description: Test COPY DATABASE with foreign key constraint
# group: [copy_database]
statement ok
PRAGMA enable_verification
# FIXME - this is not working right now - we need to correctly take dependencies into account for COPY FROM DATABASE
mode skip
statement ok
CREATE TABLE pk_integers(i INTEGER PRIMARY KEY)
statement ok
CREATE TABLE fk_integers(j INTEGER, FOREIGN KEY (j) REFERENCES pk_integers(i))
statement ok
INSERT INTO pk_integers VALUES (1), (2), (3)
statement ok
INSERT INTO fk_integers VALUES (1), (2)
# now export the db
statement ok
ATTACH ':memory:' AS db1
statement ok
COPY FROM DATABASE memory TO db1
statement ok
USE db1
# check foreign key constraint
statement error
INSERT INTO fk_integers VALUES (4)
----
statement ok
INSERT INTO fk_integers VALUES (3)
statement error
DELETE FROM pk_integers WHERE i=3
----
statement ok
DELETE FROM fk_integers WHERE j=3
statement ok
DELETE FROM pk_integers WHERE i=3
statement error
UPDATE pk_integers SET i=5 WHERE i=2
----
statement error
UPDATE fk_integers SET i=4 WHERE j=2
----
statement error
UPDATE fk_integers SET i=4 WHERE j=2
----
statement error
DROP TABLE pk_integers;
----
statement ok
DROP TABLE fk_integers;
statement ok
DROP TABLE pk_integers;

View File

@@ -0,0 +1,27 @@
# name: test/sql/copy_database/copy_database_gen_col.test
# group: [copy_database]
load __TEST_DIR__/mydb.db
statement ok
pragma enable_verification;
statement ok
CREATE TABLE test (x INT, y AS (x + 100));
statement ok
insert into test VALUES (42);
statement ok
FROM test;
statement ok
ATTACH '__TEST_DIR__/myotherdb.db';
statement ok
COPY FROM DATABASE mydb TO myotherdb;
query II
select * from myotherdb.test;
----
42 142

View File

@@ -0,0 +1,58 @@
# name: test/sql/copy_database/copy_database_index.test
# description: Test COPY DATABASE with indexes
# group: [copy_database]
statement ok
PRAGMA enable_verification
statement ok
ATTACH '__TEST_DIR__/copy_database_index.db' AS db1;
statement ok
USE db1
statement ok
CREATE TABLE test(a INTEGER, b INTEGER, c VARCHAR(10));
statement ok
CREATE INDEX i_index ON test(a);
statement ok
INSERT INTO test SELECT range, 88, 'hello' FROM range(10000);
query II
EXPLAIN ANALYZE SELECT a, b, c FROM db1.test WHERE a = 42;
----
analyzed_plan <REGEX>:.*Type: Index Scan.*
query III
SELECT a, b, c FROM db1.test WHERE a = 42;
----
42 88 hello
statement ok
ATTACH '__TEST_DIR__/other_copy_database_index.db' AS db2;
statement ok
COPY FROM DATABASE db1 TO db2
statement ok
USE db2
query III
SELECT * FROM test WHERE a = 42;
----
42 88 hello
query II
EXPLAIN ANALYZE SELECT * FROM test WHERE a = 42;
----
analyzed_plan <REGEX>:.*Type: Index Scan.*
statement ok
DROP INDEX i_index;
query II
EXPLAIN ANALYZE SELECT * FROM test WHERE a = 42;
----
analyzed_plan <REGEX>:.*Type: Sequential Scan.*

View File

@@ -0,0 +1,30 @@
# name: test/sql/copy_database/copy_database_multiple.test
# description: Run the same COPY FROM DATABASE multiple times
# group: [copy_database]
statement ok
PRAGMA enable_verification
statement ok
ATTACH ':memory:' AS db1;
statement ok
ATTACH ':memory:' AS db2;
statement ok
CREATE TABLE db1.tbl1 AS FROM range(3) r(i);
statement ok
COPY FROM DATABASE db1 TO db2;
statement error
COPY FROM DATABASE db1 TO db2;
----
Table with name "tbl1" already exists!
query I
FROM db2.tbl1
----
0
1
2

View File

@@ -0,0 +1,37 @@
# name: test/sql/copy_database/copy_database_simple.test
# description: Test attach mixed with the COPY statement
# group: [copy_database]
statement ok
PRAGMA enable_verification
statement ok
ATTACH '__TEST_DIR__/copy_database_simple.db' AS db1
statement ok
CREATE TABLE db1.test(a INTEGER, b INTEGER, c VARCHAR(10));
statement ok
INSERT INTO db1.test VALUES (42, 88, 'hello');
statement ok
ATTACH '__TEST_DIR__/other_copy_database_simple.db' AS db2;
statement ok
COPY FROM DATABASE db1 TO db2
query III
SELECT * FROM db2.test;
----
42 88 hello
# unrecognized database
statement error
COPY FROM DATABASE dbxx TO memory
----
dbxx
statement error
COPY FROM DATABASE db1 TO dbxx
----
dbxx

View File

@@ -0,0 +1,35 @@
# name: test/sql/copy_database/copy_database_tpch.test_slow
# description: Test COPY statement with TPC-H database
# group: [copy_database]
require tpch
statement ok
CALL dbgen(sf=1);
statement ok
ATTACH DATABASE ':memory:' AS db1;
statement ok
COPY FROM DATABASE memory TO db1
statement ok
USE db1
loop i 1 9
query I
PRAGMA tpch(${i})
----
<FILE>:extension/tpch/dbgen/answers/sf1/q0${i}.csv
endloop
loop i 10 23
query I
PRAGMA tpch(${i})
----
<FILE>:extension/tpch/dbgen/answers/sf1/q${i}.csv
endloop

View File

@@ -0,0 +1,40 @@
# name: test/sql/copy_database/copy_database_with_index.test
# description: Test the COPY DATABASE statement with an index.
# group: [copy_database]
statement ok
PRAGMA enable_verification;
statement ok
ATTACH ':memory:' AS db1;
statement ok
USE db1;
statement ok
CREATE TABLE data AS
SELECT i, hash(i)::VARCHAR AS value FROM generate_series(1, 10000) s(i);
statement ok
ALTER TABLE data ALTER COLUMN value SET NOT NULL;
statement ok
CREATE INDEX data_value ON data(value);
statement ok
ATTACH ':memory:' AS db2;
statement ok
COPY FROM DATABASE db1 TO db2;
query III
SELECT database_name, table_name, index_name FROM duckdb_indexes ORDER BY ALL;
----
db1 data data_value
db2 data data_value
query III
SELECT database_name, table_name, index_count FROM duckdb_tables ORDER BY ALL;
----
db1 data 1
db2 data 1

View File

@@ -0,0 +1,60 @@
# name: test/sql/copy_database/copy_database_with_unique_index.test
# description: Test the COPY DATABASE statement with unique indexes.
# group: [copy_database]
statement ok
PRAGMA enable_verification;
statement ok
ATTACH '__TEST_DIR__/copy_db_old.db' AS old;
statement ok
CREATE TABLE old.items (id INT, uniq INT UNIQUE);
statement ok
INSERT INTO old.items VALUES (1, 1), (2, 2), (3, 3);
statement ok
CREATE UNIQUE INDEX idx_id ON old.items(id);
statement ok
ATTACH '__TEST_DIR__/copy_db_new1.db' AS new1;
statement ok
COPY FROM DATABASE old TO new1 (SCHEMA);
statement ok
COPY FROM DATABASE old TO new1 (DATA);
query II
SELECT id, uniq FROM new1.items ORDER BY ALL;
----
1 1
2 2
3 3
statement error
INSERT INTO new1.items VALUES (1, 4);
----
<REGEX>:Constraint Error.*violates unique constraint.*
statement error
INSERT INTO new1.items VALUES (4, 1);
----
<REGEX>:Constraint Error.*violates unique constraint.*
statement ok
DETACH new1;
statement ok
ATTACH '__TEST_DIR__/copy_db_new1.db' AS new1;
statement error
INSERT INTO new1.items VALUES (1, 4);
----
<REGEX>:Constraint Error.*violates unique constraint.*
statement error
INSERT INTO new1.items VALUES (4, 1);
----
<REGEX>:Constraint Error.*violates unique constraint.*

View File

@@ -0,0 +1,106 @@
# name: test/sql/copy_database/copy_table_with_sequence.test
# group: [copy_database]
statement ok
pragma enable_verification;
statement ok
attach '__TEST_DIR__/backup.db';
## Only specifying a sequence name
statement ok
create sequence seq start 1;
statement ok
create table tbl (
id int default nextval('seq')
);
statement ok
insert into tbl values (DEFAULT);
insert into tbl values (DEFAULT);
statement ok
copy from database memory to backup;
statement ok
drop sequence seq cascade;
query I
select * from backup.tbl;
----
1
2
query I
select currval('backup.main.seq');
----
3
statement ok
drop sequence backup.main.seq cascade;
## Explicitly specifying the schema
statement ok
create schema my_schema;
statement ok
create sequence my_schema.seq start 1;
statement ok
create table tbl (
id int default nextval('my_schema.seq')
);
statement ok
copy from database memory to backup;
statement ok
drop sequence my_schema.seq cascade;
statement ok
drop sequence backup.my_schema.seq cascade;
## Explicitly specifying the schema, with the same name as the catalog
statement ok
create schema backup;
statement ok
create sequence memory.backup.seq start 1;
statement error
create table tbl (
id int default nextval('backup.seq')
);
----
Ambiguous reference to catalog or schema "backup"
statement ok
drop schema backup cascade;
## Explicitly specifying the catalog + schema (results in an error)
statement ok
create schema backup;
statement ok
create sequence memory.backup.seq start 1;
statement ok
create table tbl (
id int default nextval('memory.backup.seq')
);
statement error
copy from database memory to backup;
----
<REGEX>:TransactionContext Error: Attempting to write to database .* in a transaction that has already modified database .*
statement ok
drop sequence memory.backup.seq cascade;
statement ok
drop sequence backup.backup.seq cascade;