-C When\sa\stransaction\sor\ssavepoint\srollback\soccurs,\ssave\sthe\spositions\sof\sall\sopen\sread-cursors\sso\sthat\sthey\scan\sbe\srestored\sfollowing\sthe\srollback\soperation.
-D 2014-11-12T14:56:02.923
+C Add\sfurther\stests\sfor\srollback\soperations\sin\sthe\spresence\sof\songoing\sselects.
+D 2014-11-12T17:45:37.113
F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
F Makefile.in a226317fdf3f4c895fb3cfedc355b4d0868ce1fb
F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
F test/releasetest.tcl a4279c890698584feb2ffc86735857a4e4474180
F test/resolver01.test 33abf37ff8335e6bf98f2b45a0af3e06996ccd9a
F test/rollback.test 458fe73eb3ffdfdf9f6ba3e9b7350a6220414dea
-F test/rollback2.test 552abaab8e721b6060a727d639896427059e51ec
+F test/rollback2.test fc14cf6d1a2b250d2735ef16124b971bce152f14
+F test/rollbackfault.test 6a004f71087cc399296cffbb5429ea6da655ae65
F test/rowhash.test 0bc1d31415e4575d10cacf31e1a66b5cc0f8be81
F test/rowid.test 742b5741584a8a44fd83e856cc2896688401d645
F test/rtree.test 0c8d9dd458d6824e59683c19ab2ffa9ef946f798
F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
F tool/warnings.sh 0abfd78ceb09b7f7c27c688c8e3fe93268a13b32
F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
-P 1412fcc480799ecbd68d44dd18d5bad40e20ccf1
-R 668a86f911283b47b6c156fecf772681
+P dd03a2802f3f276525f3cef9a93f825dd8606626
+R c0a8c133338658022754212d7071964f
U dan
-Z cf8e25329461439611751d7913ef3ef9
+Z c8dc7391cf2e61af731936b53ad2fd87
-dd03a2802f3f276525f3cef9a93f825dd8606626
\ No newline at end of file
+eaf3aae014f59c8d37aa20aa31d54cf13f9e86fc
\ No newline at end of file
#
#***********************************************************************
#
+# 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
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}
} {}
+# 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) ""
}
}
-do_rollback_test 2 -setup {
+do_rollback_test 2.1 -setup {
BEGIN;
DELETE FROM t1 WHERE (i%2)==1;
} -select {
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
--- /dev/null
+# 2014-11-12
+#
+# The author disclaims copyright to this source code. In place of
+# a legal notice, here is a blessing:
+#
+# May you do good and not evil.
+# May you find forgiveness for yourself and forgive others.
+# May you share freely, never taking more than you give.
+#
+#***********************************************************************
+#
+# Test that errors encountered during a ROLLBACK operation correctly
+# affect ongoing SQL statements.
+#
+
+set testdir [file dirname $argv0]
+source $testdir/tester.tcl
+source $testdir/malloc_common.tcl
+set testprefix rollbackfault
+
+
+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}
+do_execsql_test 1.1 {
+ CREATE TABLE t1(i, h);
+ CREATE INDEX i1 ON t1(h);
+ WITH data(a, b) AS (
+ SELECT 1, int2hex(1)
+ UNION ALL
+ SELECT a+1, int2hex(a+1) FROM data WHERE a<40
+ )
+ INSERT INTO t1 SELECT * FROM data;
+} {}
+
+foreach f {oom ioerr} {
+ do_faultsim_test 1.2 -faults $f* -prep {
+ set sql1 { SELECT i FROM t1 WHERE (i%2)==0 }
+ set sql2 { SELECT i FROM t1 WHERE (i%2)==0 ORDER BY h }
+ set ::s1 [sqlite3_prepare db $sql1 -1 dummy]
+ set ::s2 [sqlite3_prepare db $sql2 -1 dummy]
+
+ for {set i 0} {$i < 10} {incr i} { sqlite3_step $::s1 }
+ for {set i 0} {$i < 3} {incr i} { sqlite3_step $::s2 }
+
+ execsql {
+ BEGIN; DELETE FROM t1 WHERE (i%2)
+ }
+ } -body {
+ execsql { ROLLBACK }
+ } -test {
+
+ set res1 [list]
+ set res2 [list]
+ while {"SQLITE_ROW" == [sqlite3_step $::s1]} {
+ lappend res1 [sqlite3_column_text $::s1 0]
+ }
+ while {"SQLITE_ROW" == [sqlite3_step $::s2]} {
+ lappend res2 [sqlite3_column_text $::s2 0]
+ }
+ set rc1 [sqlite3_finalize $::s1]
+ set rc2 [sqlite3_finalize $::s2]
+
+ catchsql { ROLLBACK }
+
+ if {$rc1=="SQLITE_OK" && $rc2=="SQLITE_OK"
+ && $res1=="22 24 26 28 30 32 34 36 38 40"
+ && $res2=="8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40"
+ } {
+ # This is Ok.
+ } elseif {$rc1!="SQLITE_OK" && $rc2!="SQLITE_OK" && $res1=="" &&$res2==""} {
+ # Also Ok.
+ } else {
+ error "statements don't look right"
+ }
+ }
+}
+
+
+finish_test
+
+