aboutsummaryrefslogtreecommitdiff
path: root/test/rollback2.test
diff options
context:
space:
mode:
Diffstat (limited to 'test/rollback2.test')
-rw-r--r--test/rollback2.test87
1 files changed, 85 insertions, 2 deletions
diff --git a/test/rollback2.test b/test/rollback2.test
index 9637f0c0e..4d42dda5d 100644
--- a/test/rollback2.test
+++ b/test/rollback2.test
@@ -9,6 +9,9 @@
#
#***********************************************************************
#
+# This file containst tests to verify that ROLLBACK or ROLLBACK TO
+# operations interact correctly with ongoing SELECT statements.
+#
set testdir [file dirname $argv0]
source $testdir/tester.tcl
@@ -16,7 +19,6 @@ set ::testprefix rollback2
proc int2hex {i} { format %.2X $i }
db func int2hex int2hex
-
do_execsql_test 1.0 {
SELECT int2hex(0), int2hex(100), int2hex(255)
} {00 64 FF}
@@ -32,6 +34,17 @@ do_execsql_test 1.1 {
} {}
+# do_rollback_test ID SWITCHES
+#
+# where SWITCHES are:
+#
+# -setup SQL script to open transaction and begin writing.
+# -select SELECT to execute after -setup script
+# -result Expected result of -select statement
+# -rollback Use this SQL command ("ROLLBACK" or "ROLLBACK TO ...") to
+# rollback the transaction in the middle of the -select statment
+# execution.
+#
proc do_rollback_test {tn args} {
set A(-setup) ""
set A(-select) ""
@@ -61,7 +74,7 @@ proc do_rollback_test {tn args} {
}
}
-do_rollback_test 2 -setup {
+do_rollback_test 2.1 -setup {
BEGIN;
DELETE FROM t1 WHERE (i%2)==1;
} -select {
@@ -70,5 +83,75 @@ do_rollback_test 2 -setup {
2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40
}
+do_rollback_test 2.2 -setup {
+ BEGIN;
+ DELETE FROM t1 WHERE (i%4)==1;
+ SAVEPOINT one;
+ DELETE FROM t1 WHERE (i%2)==1;
+} -rollback {
+ ROLLBACK TO one;
+} -select {
+ SELECT i FROM t1 WHERE (i%2)==0
+} -result {
+ 2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40
+}
+
+#--------------------------------------------------------------------
+# Try with some index scans
+#
+do_eqp_test 3.1 {
+ SELECT i FROM t1 WHERE (i%2)==0 ORDER BY h DESC;
+} {0 0 0 {SCAN TABLE t1 USING INDEX i1}}
+do_rollback_test 3.2 -setup {
+ BEGIN;
+ DELETE FROM t1 WHERE (i%2)==1;
+} -select {
+ SELECT i FROM t1 WHERE (i%2)==0 ORDER BY h DESC;
+} -result {
+ 40 38 36 34 32 30 28 26 24 22 20 18 16 14 12 10 8 6 4 2
+}
+do_rollback_test 3.3 -setup {
+ BEGIN;
+ DELETE FROM t1 WHERE (i%4)==1;
+ SAVEPOINT one;
+ DELETE FROM t1 WHERE (i%2)==1;
+} -rollback {
+ ROLLBACK TO one;
+} -select {
+ SELECT i FROM t1 WHERE (i%2)==0 ORDER BY h DESC;
+} -result {
+ 40 38 36 34 32 30 28 26 24 22 20 18 16 14 12 10 8 6 4 2
+}
+
+#--------------------------------------------------------------------
+# Now with some index scans that feature overflow keys.
+#
+set leader [string repeat "abcdefghij" 70]
+do_execsql_test 4.1 { UPDATE t1 SET h = $leader || h; }
+
+do_eqp_test 4.2 {
+ SELECT i FROM t1 WHERE (i%2)==0 ORDER BY h ASC;
+} {0 0 0 {SCAN TABLE t1 USING INDEX i1}}
+do_rollback_test 4.3 -setup {
+ BEGIN;
+ DELETE FROM t1 WHERE (i%2)==1;
+} -select {
+ SELECT i FROM t1 WHERE (i%2)==0 ORDER BY h ASC;
+} -result {
+ 2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40
+}
+do_rollback_test 4.4 -setup {
+ BEGIN;
+ DELETE FROM t1 WHERE (i%4)==1;
+ SAVEPOINT one;
+ DELETE FROM t1 WHERE (i%2)==1;
+} -rollback {
+ ROLLBACK TO one;
+} -select {
+ SELECT i FROM t1 WHERE (i%2)==0 ORDER BY h ASC;
+} -result {
+ 2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40
+}
+
finish_test