From 6768f073c88f43fdefbe3c7adfc890bbba18eb69 Mon Sep 17 00:00:00 2001 From: meteorgan Date: Tue, 24 Jun 2025 22:23:24 +0800 Subject: [PATCH] add tests for except operator --- testing/insert.test | 11 ++++ testing/select.test | 109 ++++++++++++++++++++++++++++++++++ tests/integration/fuzz/mod.rs | 2 +- 3 files changed, 121 insertions(+), 1 deletion(-) diff --git a/testing/insert.test b/testing/insert.test index 4f3fef7b1..b94d7c8d2 100755 --- a/testing/insert.test +++ b/testing/insert.test @@ -360,6 +360,17 @@ if {[info exists ::env(SQLITE_EXEC)] && ($::env(SQLITE_EXEC) eq "scripts/limbo-s INSERT INTO t SELECT * FROM t1 INTERSECT SELECT * FROM t2 INTERSECT SELECT * FROM t3; SELECT * FROM t; } {2|200} + + do_execsql_test_on_specific_db {:memory:} insert_from_select_except { + CREATE TABLE t(a, b); + CREATE TABLE t1(a, b); + CREATE TABLE t2(a, b); + + INSERT INTO t1 VALUES (1, 100), (2, 200); + INSERT INTO t2 VALUES (2, 200), (3, 300); + INSERT INTO t SELECT * FROM t1 EXCEPT SELECT * FROM t2; + SELECT * FROM t; + } {1|100} } do_execsql_test_on_specific_db {:memory:} negative-primary-integer-key { diff --git a/testing/select.test b/testing/select.test index ba16fd672..4e3c82404 100755 --- a/testing/select.test +++ b/testing/select.test @@ -449,4 +449,113 @@ if {[info exists ::env(SQLITE_EXEC)] && ($::env(SQLITE_EXEC) eq "scripts/limbo-s } {a|a b|b z|z} + + do_execsql_test_on_specific_db {:memory:} select-except-1 { + CREATE TABLE t(x TEXT, y TEXT); + CREATE TABLE u(x TEXT, y TEXT); + INSERT INTO t VALUES('x','x'),('y','y'); + INSERT INTO u VALUES('x','x'),('z','y'); + + select * from t EXCEPT select * from u; + } {y|y} + + do_execsql_test_on_specific_db {:memory:} select-except-2 { + CREATE TABLE t(x TEXT, y TEXT); + CREATE TABLE u(x TEXT, y TEXT); + INSERT INTO t VALUES('x','x'),('y','y'); + INSERT INTO u VALUES('x','x'),('y','y'); + + select * from t EXCEPT select * from u; + } {} + + do_execsql_test_on_specific_db {:memory:} select-except-3 { + CREATE TABLE t(x TEXT, y TEXT); + CREATE TABLE u(x TEXT, y TEXT); + CREATE TABLE v(x TEXT, y TEXT); + INSERT INTO t VALUES('x','x'),('y','y'); + INSERT INTO u VALUES('x','x'),('a','y'); + INSERT INTO v VALUES('a','x'),('b','y'); + + select * from t EXCEPT select * from u EXCEPT select * from v; + } {y|y} + + do_execsql_test_on_specific_db {:memory:} select-except-limit { + CREATE TABLE t(x TEXT, y TEXT); + CREATE TABLE u(x TEXT, y TEXT); + INSERT INTO t VALUES('a', 'a'),('x','x'),('y','y'),('z','z'); + INSERT INTO u VALUES('x','x'),('z','y'); + + select * from t EXCEPT select * from u limit 2; + } {a|a + y|y} + + do_execsql_test_on_specific_db {:memory:} select-except-union-all { + CREATE TABLE t(x TEXT, y TEXT); + CREATE TABLE u(x TEXT, y TEXT); + CREATE TABLE v(x TEXT, y TEXT); + INSERT INTO t VALUES('x','x'),('y','y'); + INSERT INTO u VALUES('x','x'),('z','y'); + INSERT INTO v VALUES('x','x'),('y','y'); + + select * from t EXCEPT select * from u UNION ALL select * from v; + } {y|y + x|x + y|y} + + do_execsql_test_on_specific_db {:memory:} select-union-all-except { + CREATE TABLE t(x TEXT, y TEXT); + CREATE TABLE u(x TEXT, y TEXT); + CREATE TABLE v(x TEXT, y TEXT); + INSERT INTO t VALUES('x','x'),('y','y'); + INSERT INTO u VALUES('x','x'),('z','y'); + INSERT INTO v VALUES('x','x'),('y','y'); + + select * from t UNION ALL select * from u EXCEPT select * from v; + } {z|y} + + do_execsql_test_on_specific_db {:memory:} select-except-union { + CREATE TABLE t(x TEXT, y TEXT); + CREATE TABLE u(x TEXT, y TEXT); + CREATE TABLE v(x TEXT, y TEXT); + INSERT INTO t VALUES('x','x'),('y','y'); + INSERT INTO u VALUES('x','x'),('z','y'); + INSERT INTO v VALUES('x','x'),('z','z'); + + select * from t EXCEPT select * from u UNION select * from v; + } {x|x + z|z} + + do_execsql_test_on_specific_db {:memory:} select-union-except { + CREATE TABLE t(x TEXT, y TEXT); + CREATE TABLE u(x TEXT, y TEXT); + CREATE TABLE v(x TEXT, y TEXT); + INSERT INTO t VALUES('x','x'),('y','y'); + INSERT INTO u VALUES('x','x'),('z','y'); + INSERT INTO v VALUES('x','x'),('z','z'); + + select * from t UNION select * from u EXCEPT select * from v; + } {y|y + z|y} + + do_execsql_test_on_specific_db {:memory:} select-except-intersect { + CREATE TABLE t(x TEXT, y TEXT); + CREATE TABLE u(x TEXT, y TEXT); + CREATE TABLE v(x TEXT, y TEXT); + INSERT INTO t VALUES('x','x'),('y','y'); + INSERT INTO u VALUES('x','x'),('z','y'); + INSERT INTO v VALUES('y','y'),('z','z'); + + select * from t EXCEPT select * from u INTERSECT select * from v; + } {y|y} + + do_execsql_test_on_specific_db {:memory:} select-intersect-except { + CREATE TABLE t(x TEXT, y TEXT); + CREATE TABLE u(x TEXT, y TEXT); + CREATE TABLE v(x TEXT, y TEXT); + INSERT INTO t VALUES('x','x'),('y','y'); + INSERT INTO u VALUES('x','x'),('z','y'); + INSERT INTO v VALUES('x','x'),('z','z'); + + select * from t INTERSECT select * from u EXCEPT select * from v; + } {} } diff --git a/tests/integration/fuzz/mod.rs b/tests/integration/fuzz/mod.rs index 2015f8ae7..d54d8bbd3 100644 --- a/tests/integration/fuzz/mod.rs +++ b/tests/integration/fuzz/mod.rs @@ -584,7 +584,7 @@ mod tests { )); } - const COMPOUND_OPERATORS: [&str; 3] = [" UNION ALL ", " UNION ", " INTERSECT "]; + const COMPOUND_OPERATORS: [&str; 3] = [" UNION ALL ", " UNION ", " INTERSECT ", " EXCEPT "]; let mut query = String::new(); for (i, select_statement) in select_statements.iter().enumerate() {