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,37 @@
# name: test/sql/delete/cleanup_delete_on_conflict.test
# description: Verify that partial deletes are cleaned up on conflicts
# group: [delete]
statement ok
CREATE TABLE tbl(i INTEGER);
statement ok
INSERT INTO tbl FROM range(1000) t(i);
statement ok
SET immediate_transaction_mode=true
statement ok con1
BEGIN
statement ok con2
BEGIN
statement ok con1
DELETE FROM tbl WHERE i BETWEEN 200 AND 300
statement error con2
DELETE FROM tbl WHERE i <= 500
----
Conflict on tuple deletion
statement ok con1
COMMIT
statement ok con2
ROLLBACK
query I
DELETE FROM tbl WHERE i <= 500
----
400

View File

@@ -0,0 +1,31 @@
# name: test/sql/delete/in_memory_bulk_delete.test_slow
# description: Test that repeated almost full delete of in-memory table frees up memory
# group: [delete]
statement ok
PRAGMA enable_verification
statement ok
SET threads=1
statement ok
CREATE TABLE a(i INTEGER)
loop i 0 10
statement ok
INSERT INTO a FROM range(1000000)
# this deletes almost all rows
statement ok
DELETE FROM a WHERE i%100000 <> 0
statement ok
CHECKPOINT
query I
SELECT memory_usage_bytes FROM duckdb_memory() WHERE tag='IN_MEMORY_TABLE'
----
262144
endloop

View File

@@ -0,0 +1,27 @@
# name: test/sql/delete/in_memory_truncate.test_slow
# description: Test that repeated truncate of in-memory table frees up memory
# group: [delete]
statement ok
PRAGMA enable_verification
statement ok
CREATE TABLE a(i INTEGER)
loop i 0 10
statement ok
INSERT INTO a FROM range(1000000)
statement ok
TRUNCATE a
statement ok
CHECKPOINT
query I
SELECT memory_usage_bytes FROM duckdb_memory() WHERE tag='IN_MEMORY_TABLE'
----
0
endloop

View File

@@ -0,0 +1,40 @@
# name: test/sql/delete/large_deletes_transactions.test
# description: Test large deletions with transactions
# group: [delete]
statement ok
PRAGMA enable_verification
statement ok con1
CREATE TABLE a AS SELECT * FROM range(1000000) t1(i);
statement ok con2
BEGIN TRANSACTION
query I con2
SELECT COUNT(*) FROM a
----
1000000
query I con1
DELETE FROM a WHERE i%2=0
----
500000
query I con1
SELECT COUNT(*) FROM a
----
500000
query I con2
SELECT COUNT(*) FROM a
----
1000000
statement ok con2
COMMIT
query I con2
SELECT COUNT(*) FROM a
----
500000

View File

@@ -0,0 +1,28 @@
# name: test/sql/delete/list_delete.test
# description: Test list deletions
# group: [delete]
statement ok
PRAGMA enable_verification
statement ok
CREATE TABLE aggr (k int[]);
statement ok
INSERT INTO aggr VALUES ([0, 1, 1, 1, 4, 0, 3, 3, 2, 2, 4, 4, 2, 4, 0, 0, 0, 1, 2, 3, 4, 2, 3, 3, 1]);
statement ok
INSERT INTO aggr VALUES ([]), ([NULL]), (NULL), ([0, 1, 1, 1, 4, NULL, 0, 3, 3, 2, NULL, 2, 4, 4, 2, 4, 0, 0, 0, 1, NULL, 2, 3, 4, 2, 3, 3, 1]);
query I
SELECT COUNT(k) FROM aggr
----
4
statement ok
DELETE FROM aggr;
query I
SELECT COUNT(k) FROM aggr
----
0

View File

@@ -0,0 +1,55 @@
# name: test/sql/delete/test_delete.test
# description: Test deletions
# group: [delete]
statement ok
PRAGMA enable_verification
statement ok
CREATE TABLE a(i INTEGER);
statement ok
INSERT INTO a VALUES (42);
query I
SELECT COUNT(*) FROM a;
----
1
# delete everything
statement ok
DELETE FROM a;
query I
SELECT COUNT(*) FROM a;
----
0
statement ok
INSERT INTO a VALUES (42);
query I
SELECT COUNT(*) FROM a;
----
1
# now test rollback of deletion
statement ok
BEGIN TRANSACTION
statement ok
DELETE FROM a;
query I
SELECT COUNT(*) FROM a;
----
0
statement ok
ROLLBACK
query I
SELECT COUNT(*) FROM a;
----
1

View File

@@ -0,0 +1,161 @@
# name: test/sql/delete/test_delete_indexed.test
# description: Test deletions on tables with indexes
# group: [delete]
statement ok
PRAGMA enable_verification
statement ok
CREATE TABLE t (id INT PRIMARY KEY, s TEXT, j BIGINT);
statement ok
CREATE INDEX idx ON t(j);
statement ok
INSERT INTO t VALUES (1, 'a', 10), (2, 'b', 20), (3, 'c', 30);
# verify initial state
query III
SELECT * FROM t ORDER BY id;
----
1 a 10
2 b 20
3 c 30
# delete using primary key
statement ok
DELETE FROM t WHERE id = 2;
query III
SELECT * FROM t ORDER BY id;
----
1 a 10
3 c 30
# delete using indexed column
statement ok
DELETE FROM t WHERE j = 30;
query III
SELECT * FROM t ORDER BY id;
----
1 a 10
# insert more data
statement ok
INSERT INTO t VALUES (4, 'd', 40), (5, 'e', 50);
# test transaction rollback
statement ok
BEGIN TRANSACTION
statement ok
DELETE FROM t WHERE j > 10;
query III
SELECT * FROM t ORDER BY id;
----
1 a 10
statement ok
ROLLBACK
query III
SELECT * FROM t ORDER BY id;
----
1 a 10
4 d 40
5 e 50
# delete everything
statement ok
DELETE FROM t;
query I
SELECT COUNT(*) FROM t;
----
0
# test delete and insert in same transaction with overlapping values
statement ok
INSERT INTO t VALUES (1, 'a', 10), (2, 'b', 20), (3, 'c', 30);
statement ok
BEGIN TRANSACTION;
# delete rows with j=20,30
statement ok
DELETE FROM t WHERE j >= 20;
# insert new rows with same ids and j values
statement ok
INSERT INTO t VALUES (2, 'new_20', 20), (3, 'new_30', 30);
# verify index lookup during transaction
query III
SELECT * FROM t WHERE j = 20;
----
2 new_20 20
query III
SELECT * FROM t WHERE j = 30;
----
3 new_30 30
statement ok
COMMIT;
# verify index lookups after commit
query III
SELECT * FROM t WHERE j = 20;
----
2 new_20 20
query III
SELECT * FROM t WHERE j = 30;
----
3 new_30 30
# test rollback with overlapping values
statement ok
BEGIN TRANSACTION;
# delete rows with j=20,30
statement ok
DELETE FROM t WHERE j >= 20;
# insert rows with same ids and j values again
statement ok
INSERT INTO t VALUES (2, 'tmp_20', 20), (3, 'tmp_30', 30);
# verify index lookup during transaction
query III
SELECT * FROM t WHERE j = 20;
----
2 tmp_20 20
query III
SELECT * FROM t WHERE j = 30;
----
3 tmp_30 30
statement ok
ROLLBACK;
# verify index lookups after rollback
query III
SELECT * FROM t WHERE j = 20;
----
2 new_20 20
query III
SELECT * FROM t WHERE j = 30;
----
3 new_30 30
# verify range queries on index
query III
SELECT * FROM t WHERE j >= 20 ORDER BY j;
----
2 new_20 20
3 new_30 30

View File

@@ -0,0 +1,24 @@
# name: test/sql/delete/test_large_delete.test
# description: Test scan with large deletions
# group: [delete]
statement ok
PRAGMA enable_verification
statement ok
CREATE TABLE a AS SELECT * FROM range(0, 10000, 1) t1(i);
query I
SELECT COUNT(*) FROM a WHERE i >= 2000 AND i < 5000;
----
3000
query I
DELETE FROM a WHERE i >= 2000 AND i < 5000;
----
3000
query I
SELECT COUNT(*) FROM a;
----
7000

View File

@@ -0,0 +1,25 @@
# name: test/sql/delete/test_large_delete_parallel.test
# description: Test scan with large deletions
# group: [delete]
statement ok
pragma threads=2
statement ok
pragma verify_parallelism
statement ok
CREATE TABLE a AS SELECT * FROM range(0, 10000, 1) t1(i);
query I
SELECT COUNT(*) FROM a;
----
10000
statement ok
DELETE FROM a WHERE i >= 2000 AND i < 5000;
query I
SELECT COUNT(*) FROM a;
----
7000

View File

@@ -0,0 +1,179 @@
# name: test/sql/delete/test_segment_deletes.test
# description: Test deletions
# group: [delete]
statement ok con1
CREATE TABLE a(i INTEGER);
# insert the values [0, 1, 2, .. 1022, 1023] repeatedly
# however, make sure the order that we insert them is
loop i 0 20
statement ok con1
INSERT INTO a SELECT * FROM range(0, 1024, 1);
endloop
# verify the count
query I con1
SELECT COUNT(*) FROM a
----
20480
# we test the values 0, 1, 1022 and 1023
# for every tested value, delete it and then rollback
# value = 0
statement ok con1
BEGIN TRANSACTION;
DELETE FROM a WHERE i=0;
# verify the deleted count
query I con1
SELECT COUNT(*) FROM a
----
20460
statement ok con1
ROLLBACK
# verify the initial count
query I con1
SELECT COUNT(*) FROM a
----
20480
# value = 1
statement ok con1
BEGIN TRANSACTION;
DELETE FROM a WHERE i=1;
# verify the deleted count
query I con1
SELECT COUNT(*) FROM a
----
20460
statement ok con1
ROLLBACK
# verify the initial count
query I con1
SELECT COUNT(*) FROM a
----
20480
# value = 1022
statement ok con1
BEGIN TRANSACTION;
DELETE FROM a WHERE i=1022;
# verify the deleted count
query I con1
SELECT COUNT(*) FROM a
----
20460
statement ok con1
ROLLBACK
# verify the initial count
query I con1
SELECT COUNT(*) FROM a
----
20480
# value = 1023
statement ok con1
BEGIN TRANSACTION;
DELETE FROM a WHERE i=1023;
# verify the deleted count
query I con1
SELECT COUNT(*) FROM a
----
20460
statement ok con1
ROLLBACK
# verify the initial count
query I con1
SELECT COUNT(*) FROM a
----
20480
# now, for every tested value, delete it in a separate connection and verify the count
# con2 -> 0
statement ok con2
BEGIN TRANSACTION;
statement ok con2
DELETE FROM a WHERE i=0;
query I con2
SELECT COUNT(*) FROM a;
----
20460
# con3 -> 1
statement ok con3
BEGIN TRANSACTION;
statement ok con3
DELETE FROM a WHERE i=1;
query I con3
SELECT COUNT(*) FROM a;
----
20460
# con4 -> 1022
statement ok con4
BEGIN TRANSACTION;
statement ok con4
DELETE FROM a WHERE i=1022;
query I con4
SELECT COUNT(*) FROM a;
----
20460
# con5 -> 1023
statement ok con5
BEGIN TRANSACTION;
statement ok con5
DELETE FROM a WHERE i=1023;
query I con5
SELECT COUNT(*) FROM a;
----
20460
# con1 still has the original count
query I con1
SELECT COUNT(*) FROM a;
----
20480
# until we update the other transactions
statement ok con2
COMMIT
statement ok con3
COMMIT
statement ok con4
COMMIT
statement ok con5
COMMIT
# now the count is updated
query I con1
SELECT COUNT(*) FROM a;
----
20400

View File

@@ -0,0 +1,54 @@
# name: test/sql/delete/test_truncate.test
# description: Test truncate
# group: [delete]
statement ok
PRAGMA enable_verification
statement ok
CREATE TABLE a(i INTEGER);
statement ok
INSERT INTO a VALUES (42);
query I
TRUNCATE TABLE a
----
1
# delete everything
statement ok
TRUNCATE a
query I
SELECT COUNT(*) FROM a;
----
0
statement ok
INSERT INTO a VALUES (42);
query I
SELECT COUNT(*) FROM a;
----
1
# now test rollback of deletion
statement ok
BEGIN TRANSACTION
statement ok
TRUNCATE a
query I
SELECT COUNT(*) FROM a;
----
0
statement ok
ROLLBACK
query I
SELECT COUNT(*) FROM a;
----
1

View File

@@ -0,0 +1,91 @@
# name: test/sql/delete/test_using_delete.test
# description: Test deletions with USING clause
# group: [delete]
statement ok
PRAGMA enable_verification;
statement ok
CREATE TABLE a(i INTEGER);
statement ok
INSERT INTO a VALUES (1), (2), (3);
query I
DELETE FROM a USING (values (1)) tbl(i) WHERE a.i=tbl.i;
----
1
query I
SELECT * FROM a;
----
2
3
# no condition?
query I
DELETE FROM a USING (values (1)) tbl(i);
----
2
query I
SELECT * FROM a;
----
statement ok
INSERT INTO a VALUES (1), (2), (3);
query I
SELECT * FROM a;
----
1
2
3
# multiple joins
query I
DELETE FROM a USING (values (1)) tbl(i), (values (1), (2)) tbl2(i) WHERE a.i=tbl.i AND a.i=tbl2.i;
----
1
query I
SELECT * FROM a;
----
2
3
# no matches
query I
DELETE FROM a USING (values (4)) tbl(i) WHERE a.i=tbl.i;
----
0
query I
SELECT * FROM a;
----
2
3
# self join
query I
DELETE FROM a USING a a2(i) WHERE a.i>a2.i;
----
1
query I
SELECT * FROM a;
----
2
# binding errors
# table does not exist
statement error
DELETE FROM a USING b WHERE a.i=b.i;
----
<REGEX>:.*Catalog Error.*does not exist.*
# column does not exist
statement error
DELETE FROM a USING a b WHERE a.i=b.j;
----
<REGEX>:.*Binder Error.*does not have a column.*

View File

@@ -0,0 +1,130 @@
# name: test/sql/delete/test_using_delete_duplicates.test
# description: Test USING deletion with duplicates
# group: [delete]
statement ok
create table integers as select * from generate_series(0, 9, 1);
statement ok
create table integers2 as select * from generate_series(0, 9, 1);
query I
DELETE FROM integers USING integers2;
----
10
query I
SELECT COUNT(*) FROM integers
----
0
# the same but with transaction local storage
statement ok
DROP TABLE integers
statement ok
DROP TABLE integers2
statement ok
BEGIN transaction
statement ok
create table integers as select * from generate_series(0, 9, 1);
statement ok
create table integers2 as select * from generate_series(0, 9, 1);
query I
DELETE FROM integers USING integers2;
----
10
query I
SELECT COUNT(*) FROM integers
----
0
statement ok
COMMIT
query I
SELECT COUNT(*) FROM integers
----
0
statement ok
CREATE or replace TABLE integers AS FROM range(10);
statement ok
create table integers_copy as select * from integers;
query I nosort delete_result_1
DELETE FROM integers USING range(100) RETURNING *;
----
query I nosort delte_result_1
select * from integers_copy;
statement ok
create or replace table t1 as select range%10 a from range(1000);
statement ok
create or replace table t2 as select range b from range(10);
statement ok
create or replace table t2_copy as select * from t2;
query I nosort delete_result_small
delete from t2 using t1 where a=b returning *;
----
query I nosort delete_result_small
select * from t2_copy;
----
statement ok
create or replace table t1 as select range%10 a from range(100);
statement ok
create or replace table t2 as select range b from range(10);
statement ok
insert into t2 select 12 from range(5);
statement ok
insert into t1 select 12 from range(10);
statement ok
create or replace table t2_copy as select * from t2;
query I nosort delete_result_small_2
delete from t2 using t1 where a=b returning *;
----
query I nosort delete_result_small_2
select * from t2_copy
----
statement ok
create or replace table t1 as select range%1000 a from range(100_000);
statement ok
create or replace table t2 as select range b from range(100);
statement ok
insert into t2 select 100_050 from range(50);
statement ok
insert into t1 select 100_050 from range(50);
statement ok
create or replace table t2_copy as select * from t2;
query I nosort delete_result
delete from t2 using t1 where a=b returning *;
query I nosort delete_result;
select * from t2_copy;