diff --git a/testing/materialized_views.test b/testing/materialized_views.test index 2b6a56be3..5d226b016 100755 --- a/testing/materialized_views.test +++ b/testing/materialized_views.test @@ -385,3 +385,174 @@ do_execsql_test_on_specific_db {:memory:} matview-projections { SELECT * from v; } {4|3|7|22|3 3|4|7|22|3} + +do_execsql_test_on_specific_db {:memory:} matview-rollback-insert { + CREATE TABLE t(a INTEGER, b INTEGER); + INSERT INTO t VALUES (1, 10), (2, 20), (3, 30); + + CREATE MATERIALIZED VIEW v AS + SELECT * FROM t WHERE b > 15; + + SELECT * FROM v ORDER BY a; + + BEGIN; + INSERT INTO t VALUES (4, 40), (5, 50); + SELECT * FROM v ORDER BY a; + ROLLBACK; + + SELECT * FROM v ORDER BY a; +} {2|20 +3|30 +2|20 +3|30 +4|40 +5|50 +2|20 +3|30} + +do_execsql_test_on_specific_db {:memory:} matview-rollback-delete { + CREATE TABLE t(a INTEGER, b INTEGER); + INSERT INTO t VALUES (1, 10), (2, 20), (3, 30), (4, 40); + + CREATE MATERIALIZED VIEW v AS + SELECT * FROM t WHERE b > 15; + + SELECT * FROM v ORDER BY a; + + BEGIN; + DELETE FROM t WHERE a IN (2, 3); + SELECT * FROM v ORDER BY a; + ROLLBACK; + + SELECT * FROM v ORDER BY a; +} {2|20 +3|30 +4|40 +4|40 +2|20 +3|30 +4|40} + +do_execsql_test_on_specific_db {:memory:} matview-rollback-update { + CREATE TABLE t(a INTEGER, b INTEGER); + INSERT INTO t VALUES (1, 10), (2, 20), (3, 30); + + CREATE MATERIALIZED VIEW v AS + SELECT * FROM t WHERE b > 15; + + SELECT * FROM v ORDER BY a; + + BEGIN; + UPDATE t SET b = 5 WHERE a = 2; + UPDATE t SET b = 35 WHERE a = 1; + SELECT * FROM v ORDER BY a; + ROLLBACK; + + SELECT * FROM v ORDER BY a; +} {2|20 +3|30 +1|35 +3|30 +2|20 +3|30} + +do_execsql_test_on_specific_db {:memory:} matview-rollback-aggregation { + CREATE TABLE sales(product_id INTEGER, amount INTEGER); + INSERT INTO sales VALUES (1, 100), (1, 200), (2, 150), (2, 250); + + CREATE MATERIALIZED VIEW product_totals AS + SELECT product_id, SUM(amount) as total, COUNT(*) as cnt + FROM sales + GROUP BY product_id; + + SELECT * FROM product_totals ORDER BY product_id; + + BEGIN; + INSERT INTO sales VALUES (1, 50), (3, 300); + SELECT * FROM product_totals ORDER BY product_id; + ROLLBACK; + + SELECT * FROM product_totals ORDER BY product_id; +} {1|300|2 +2|400|2 +1|350|3 +2|400|2 +3|300|1 +1|300|2 +2|400|2} + +do_execsql_test_on_specific_db {:memory:} matview-rollback-mixed-operations { + CREATE TABLE orders(id INTEGER PRIMARY KEY, customer INTEGER, amount INTEGER); + INSERT INTO orders VALUES (1, 100, 50), (2, 200, 75), (3, 100, 25); + + CREATE MATERIALIZED VIEW customer_totals AS + SELECT customer, SUM(amount) as total, COUNT(*) as cnt + FROM orders + GROUP BY customer; + + SELECT * FROM customer_totals ORDER BY customer; + + BEGIN; + INSERT INTO orders VALUES (4, 100, 100); + UPDATE orders SET amount = 150 WHERE id = 2; + DELETE FROM orders WHERE id = 3; + SELECT * FROM customer_totals ORDER BY customer; + ROLLBACK; + + SELECT * FROM customer_totals ORDER BY customer; +} {100|75|2 +200|75|1 +100|150|2 +200|150|1 +100|75|2 +200|75|1} + +do_execsql_test_on_specific_db {:memory:} matview-rollback-filtered-aggregation { + CREATE TABLE transactions(id INTEGER, account INTEGER, amount INTEGER, type TEXT); + INSERT INTO transactions VALUES + (1, 100, 50, 'deposit'), + (2, 100, 30, 'withdraw'), + (3, 200, 100, 'deposit'), + (4, 200, 40, 'withdraw'); + + CREATE MATERIALIZED VIEW deposits AS + SELECT account, SUM(amount) as total_deposits, COUNT(*) as cnt + FROM transactions + WHERE type = 'deposit' + GROUP BY account; + + SELECT * FROM deposits ORDER BY account; + + BEGIN; + INSERT INTO transactions VALUES (5, 100, 75, 'deposit'); + UPDATE transactions SET amount = 60 WHERE id = 1; + DELETE FROM transactions WHERE id = 3; + SELECT * FROM deposits ORDER BY account; + ROLLBACK; + + SELECT * FROM deposits ORDER BY account; +} {100|50|1 +200|100|1 +100|135|2 +100|50|1 +200|100|1} + +do_execsql_test_on_specific_db {:memory:} matview-rollback-empty-view { + CREATE TABLE t(a INTEGER, b INTEGER); + INSERT INTO t VALUES (1, 5), (2, 8); + + CREATE MATERIALIZED VIEW v AS + SELECT * FROM t WHERE b > 10; + + SELECT COUNT(*) FROM v; + + BEGIN; + INSERT INTO t VALUES (3, 15), (4, 20); + SELECT * FROM v ORDER BY a; + ROLLBACK; + + SELECT COUNT(*) FROM v; +} {0 +3|15 +4|20 +0}