limbo/testing/rollback.test
2025-07-03 12:36:48 +02:00

153 lines
3.8 KiB
Tcl
Executable file

#!/usr/bin/env tclsh
set testdir [file dirname $argv0]
source $testdir/tester.tcl
do_execsql_test_on_specific_db {:memory:} simple-rollback {
create table t (x);
insert into t values (1);
begin;
insert into t values (2);
rollback;
select * from t;
} {1}
do_execsql_test_on_specific_db {:memory:} simple-rollback-2 {
create table t (x);
begin;
insert into t values (1);
insert into t values (2);
rollback;
select * from t;
} {}
do_execsql_test_on_specific_db {:memory:} rollback-after-update {
create table t (x);
insert into t values (1);
insert into t values (2);
begin;
update t set x = x + 10;
rollback;
select * from t;
} {1 2}
do_execsql_test_on_specific_db {:memory:} rollback-after-delete {
create table t (x);
insert into t values (1);
insert into t values (2);
insert into t values (3);
begin;
delete from t where x = 2;
rollback;
select * from t order by x;
} {1 2 3}
do_execsql_test_on_specific_db {:memory:} rollback-mixed-operations {
create table t (x);
insert into t values (1);
insert into t values (2);
begin;
insert into t values (3);
update t set x = x + 10 where x = 1;
delete from t where x = 2;
rollback;
select * from t order by x;
} {1 2}
# The point of this test was to test we drop dirty pages after rollback by inserting into another table so that
# pages used are different.
do_execsql_test_on_specific_db {:memory:} insert-after-rollback {
create table t (x);
create table t2 (x);
insert into t values (1);
insert into t values (2);
begin;
insert into t values (3);
update t set x = x + 10 where x = 1;
delete from t where x = 2;
rollback;
insert into t2 values (1);
select * from t2 order by x;
} {1}
do_execsql_test_on_specific_db {:memory:} schema-change-rollback {
begin;
create table t (x);
insert into t values (1);
rollback;
PRAGMA integrity_check;
} {ok}
do_execsql_test_on_specific_db {:memory:} schema-change-rollback-version {
begin;
create table t (x);
insert into t values (1);
rollback;
PRAGMA schema_version;
} {0}
do_execsql_test_on_specific_db {:memory:} schema-version-after-update {
create table t (x);
PRAGMA schema_version;
} {1}
do_execsql_test_on_specific_db {:memory:} schema-change-rollback-2 {
begin;
create table t (x);
rollback;
select tbl_name from sqlite_schema;
} {}
do_execsql_test_on_specific_db {:memory:} schema-change-rollback-2 {
create table before (x);
begin;
create table t (x);
rollback;
create table after (x);
select tbl_name from sqlite_schema;
} {before after}
do_execsql_test_on_specific_db {:memory:} schema-alter-rollback {
create table t (x);
begin;
alter table t add column y;
rollback;
select sql from sqlite_schema;
} {"CREATE TABLE t (x)"}
do_execsql_test_on_specific_db {:memory:} schema-alter-rollback-and-repeat {
create table t (x);
begin;
alter table t add column y;
rollback;
alter table t add column y;
select sql from sqlite_schema;
} {"CREATE TABLE t (x, y)"}
if {[info exists ::env(SQLITE_EXEC)] && ($::env(SQLITE_EXEC) eq "scripts/limbo-sqlite3-index-experimental" || $::env(SQLITE_EXEC) eq "sqlite3")} {
do_execsql_test_on_specific_db {:memory:} schema-create-index-rollback {
create table t (x);
begin;
create index i on t(x);
rollback;
select sql from sqlite_schema;
} {"CREATE TABLE t (x)"}
}
do_execsql_test_on_specific_db {:memory:} schema-drop-table-rollback {
create table t (x);
begin;
drop table t;
rollback;
select sql from sqlite_schema;
} {"CREATE TABLE t (x)"}
# TODO: add tests for:
# * create virtual table
# * drop index
# * views...