should be it
This commit is contained in:
134
external/duckdb/test/sql/upsert/upsert_transaction.test
vendored
Normal file
134
external/duckdb/test/sql/upsert/upsert_transaction.test
vendored
Normal file
@@ -0,0 +1,134 @@
|
||||
# name: test/sql/upsert/upsert_transaction.test
|
||||
# group: [upsert]
|
||||
|
||||
# This tests the desired behavior when UPSERT is used on a conflict that only exists within the transaction local storage.
|
||||
# NOTE: This does not test behavior of conflicts that arise between transactions
|
||||
|
||||
# DO UPDATE
|
||||
|
||||
statement ok
|
||||
BEGIN TRANSACTION;
|
||||
|
||||
statement ok
|
||||
CREATE TABLE tbl (
|
||||
a SHORT PRIMARY KEY,
|
||||
b SHORT
|
||||
);
|
||||
|
||||
statement ok
|
||||
INSERT INTO tbl VALUES
|
||||
(1, 2)
|
||||
ON CONFLICT (a) DO UPDATE SET b = excluded.b;
|
||||
|
||||
# Create a conflict within the transaction
|
||||
statement ok
|
||||
INSERT INTO tbl VALUES
|
||||
(1, 3)
|
||||
ON CONFLICT (a) DO UPDATE SET b = excluded.b;
|
||||
|
||||
query II
|
||||
select * from tbl;
|
||||
----
|
||||
1 3
|
||||
|
||||
statement ok
|
||||
COMMIT;
|
||||
|
||||
query II
|
||||
select * from tbl;
|
||||
----
|
||||
1 3
|
||||
|
||||
# DO NOTHING
|
||||
|
||||
statement ok
|
||||
BEGIN TRANSACTION;
|
||||
|
||||
statement ok
|
||||
INSERT INTO tbl VALUES
|
||||
(2, 1),
|
||||
(3, 1),
|
||||
(4, 1);
|
||||
|
||||
statement ok
|
||||
INSERT INTO tbl VALUES
|
||||
(2, 1),
|
||||
(3, 1),
|
||||
(4, 1)
|
||||
ON CONFLICT (a) DO NOTHING;
|
||||
|
||||
statement ok
|
||||
COMMIT;
|
||||
|
||||
# Attempt to update the same row twice within the same UPSERT
|
||||
statement ok
|
||||
BEGIN TRANSACTION;
|
||||
|
||||
statement ok
|
||||
INSERT INTO tbl VALUES
|
||||
(5, 0)
|
||||
|
||||
statement ok
|
||||
insert into tbl VALUES
|
||||
(5, 0),
|
||||
(5, 1)
|
||||
ON CONFLICT (a) DO UPDATE SET
|
||||
b = excluded.b;
|
||||
|
||||
statement ok
|
||||
COMMIT;
|
||||
|
||||
# DO UPDATE 'affected_tuples' return value
|
||||
|
||||
statement ok
|
||||
BEGIN TRANSACTION;
|
||||
|
||||
statement ok
|
||||
INSERT INTO tbl VALUES (6,0);
|
||||
|
||||
# Both of these inserts turn into updates
|
||||
# The first affected tuple (5) is an update in the global storage
|
||||
# The second affected tuple (6) is an update in the local storage
|
||||
# The third affected tuple is an insert into the local storage
|
||||
query I
|
||||
INSERT INTO tbl VALUES (5,0), (6,0), (7,0) ON CONFLICT (a) DO UPDATE set b = excluded.b;
|
||||
----
|
||||
3
|
||||
|
||||
# The only affected tuple is the insert into the local storage
|
||||
# (5,0) causes a constraint error in the global storage
|
||||
# (3,0) causes a constraint error in the local storage
|
||||
query I
|
||||
INSERT INTO tbl VALUES (-1, 0), (5,0), (6,0) ON CONFLICT (a) DO NOTHING;
|
||||
----
|
||||
1
|
||||
|
||||
statement ok
|
||||
COMMIT;
|
||||
|
||||
# DO UPDATE > STANDARD_VECTOR_SIZE
|
||||
|
||||
statement ok
|
||||
BEGIN TRANSACTION;
|
||||
|
||||
statement ok
|
||||
CREATE OR REPLACE TABLE tbl (a SHORT PRIMARY KEY, b SHORT);
|
||||
|
||||
statement ok
|
||||
INSERT INTO tbl (select i, 0 from range(2500) tbl(i));
|
||||
|
||||
query I
|
||||
select max(b) from tbl;
|
||||
----
|
||||
0
|
||||
|
||||
statement ok
|
||||
INSERT INTO tbl (select i, i from range(2500) tbl(i)) ON CONFLICT (a) DO UPDATE SET b = excluded.b;
|
||||
|
||||
query I
|
||||
select max(b) from tbl;
|
||||
----
|
||||
2499
|
||||
|
||||
statement ok
|
||||
COMMIT;
|
||||
Reference in New Issue
Block a user