]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Add further tests for rollback operations in the presence of ongoing selects.
authordan <dan@noemail.net>
Wed, 12 Nov 2014 17:45:37 +0000 (17:45 +0000)
committerdan <dan@noemail.net>
Wed, 12 Nov 2014 17:45:37 +0000 (17:45 +0000)
FossilOrigin-Name: eaf3aae014f59c8d37aa20aa31d54cf13f9e86fc

manifest
manifest.uuid
test/rollback2.test
test/rollbackfault.test [new file with mode: 0644]

index 11b9906fa07f7253b1afe4d5d1ab48d0e3cac2e3..dddb788b2de007af7f237ffe3d2f46790098f5ba 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-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
@@ -797,7 +797,8 @@ F test/releasetest.mk 2eced2f9ae701fd0a29e714a241760503ccba25a
 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
@@ -1219,7 +1220,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1
 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
index 3369a7ad97a2d71a61d03dbcce776b44cc7aa1ca..634cdcad8d6c955a08d69faa65353d92d6a8beaa 100644 (file)
@@ -1 +1 @@
-dd03a2802f3f276525f3cef9a93f825dd8606626
\ No newline at end of file
+eaf3aae014f59c8d37aa20aa31d54cf13f9e86fc
\ No newline at end of file
index 9637f0c0e592fb88fc97b3a7032deebe60f51a24..4d42dda5d6557f1041f70f75a3c1a720b7ee2d10 100644 (file)
@@ -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
 
diff --git a/test/rollbackfault.test b/test/rollbackfault.test
new file mode 100644 (file)
index 0000000..f248d07
--- /dev/null
@@ -0,0 +1,84 @@
+# 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
+
+