| Index: third_party/sqlite/src/test/rollback2.test
|
| diff --git a/third_party/sqlite/src/test/rollback2.test b/third_party/sqlite/src/test/rollback2.test
|
| index 9637f0c0e592fb88fc97b3a7032deebe60f51a24..4d42dda5d6557f1041f70f75a3c1a720b7ee2d10 100644
|
| --- a/third_party/sqlite/src/test/rollback2.test
|
| +++ b/third_party/sqlite/src/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
|
|
|
|
|