]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Add a test case to waloverwrite.test to check that savepoint rollback does not cause... wal-overwrite-frames
authordan <dan@noemail.net>
Mon, 11 Jan 2016 08:12:40 +0000 (08:12 +0000)
committerdan <dan@noemail.net>
Mon, 11 Jan 2016 08:12:40 +0000 (08:12 +0000)
FossilOrigin-Name: 87dae56c322454094d445e474ae36a4f464272a4

manifest
manifest.uuid
test/waloverwrite.test

index fb39c5119cb04f77bbf713d6d60ef1c8ad83d486..975aaa75ce83a525217eb86b0036f821b008bac4 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Improved\stestability.
-D 2016-01-11T00:52:32.218
+C Add\sa\stest\scase\sto\swaloverwrite.test\sto\scheck\sthat\ssavepoint\srollback\sdoes\snot\scause\sa\sproblem.
+D 2016-01-11T08:12:40.471
 F Makefile.in 7c8cc4c2f0179efc6fa9492141d1fb65f4807054
 F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434
 F Makefile.msc e45d8b9b56dfa3f2cd860b2c28bd9d304513b042
@@ -1301,7 +1301,7 @@ F test/walfault.test 1f8389f7709877e9b4cc679033d71d6fe529056b
 F test/walhook.test ed00a40ba7255da22d6b66433ab61fab16a63483
 F test/walmode.test 4022fe03ae6e830583672caa101f046438a0473c
 F test/walnoshm.test 84ca10c544632a756467336b7c3b864d493ee496
-F test/waloverwrite.test 59476a2cf0638a057ced738b62dc719ed4e32e53
+F test/waloverwrite.test 8702964967c2f28204f0b4f27af65da81999fc99
 F test/walpersist.test 8c6b7e3ec1ba91b5e4dc4e0921d6d3f87cd356a6
 F test/walro.test 34422d1d95aaff0388f0791ec20edb34e2a3ed57
 F test/walshared.test 0befc811dcf0b287efae21612304d15576e35417
@@ -1407,7 +1407,7 @@ F tool/vdbe_profile.tcl 246d0da094856d72d2c12efec03250d71639d19f
 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b
 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
-P 99b31a6b491c1c51227f478d3713b020d37a17cf
-R d76e78fad37168874a95f2cf1af1f963
-U drh
-Z b9a236105d87275bc956baaa16673a98
+P e83d3a2a4e06665e8a056f63063bd6df03f063b9
+R 328bc4f1800dd81a2ef2edb5973d61be
+U dan
+Z 271430cf4c8b2d1a2970f55a9b9d9220
index 23e6efc988ecc23731047754f00cdec4d3979de8..a1ad7a192ad1d6d5315b1f58116cae2702f93ef3 100644 (file)
@@ -1 +1 @@
-e83d3a2a4e06665e8a056f63063bd6df03f063b9
\ No newline at end of file
+87dae56c322454094d445e474ae36a4f464272a4
\ No newline at end of file
index 02fe4c1ccf8c1c3579a5960b44f0bfb3becf7cc6..5e51a70d3fac716b19b0eadf8a0cf2c22655b8ec 100644 (file)
@@ -22,18 +22,28 @@ ifcapable !wal {finish_test ; return }
 
 # Simple test:
 #
-#   1. Create a database of blobs roughly 50 pages in size.
+# Test cases *.1 - *.6:
 #
-#   2. Set the db cache size to something much smaller than this (5 pages)
+#   + Create a database of blobs roughly 50 pages in size.
 #
-#   3. Within a transaction, loop through the set of blobs 5 times. Update
+#   + Set the db cache size to something much smaller than this (5 pages)
+#
+#   + Within a transaction, loop through the set of blobs 5 times. Update
 #      each blob as it is visited.
 #
-#   4. Test that the wal file is roughly 50 pages in size - even though many
+#   + Test that the wal file is roughly 50 pages in size - even though many
 #      database pages have been written to it multiple times.
 #
-#   5. Take a copy of the database and wal file. Test that recovery can
-#      be run on it.
+#   + Take a copy of the database and wal file. Test that recovery can
+#     be run on it.
+#
+# Test cases *.7 - *.9:
+#
+#   + Same thing, but before committing the statement transaction open
+#     a SAVEPOINT, update the blobs another 5 times, then roll it back.
+#
+#   + Check that if recovery is run on the resulting wal file, the rolled
+#     back changes from within the SAVEPOINT are not present in the db.
 #
 # The above is run twice - once where the wal file is empty at the start of
 # step 3 (tn==1) and once where it already contains a transaction (tn==2).
@@ -45,6 +55,7 @@ foreach {tn xtra} {
   reset_db
   do_execsql_test 1.$tn.0 {
     CREATE TABLE t1(x, y);
+    CREATE TABLE t2(x, y);
     CREATE INDEX i1y ON t1(y);
   
     WITH cnt(i) AS (
@@ -98,6 +109,55 @@ foreach {tn xtra} {
   do_test 1.$tn.6 {
     execsql { PRAGMA integrity_check } db2
   } ok
+  db2 close
+
+  do_test 1.$tn.7 {
+    execsql { PRAGMA wal_checkpoint }
+    db transaction {
+      for {set i 0} {$i < 1} {incr i} {
+        foreach x [db eval {SELECT x FROM t1}] {
+          execsql { UPDATE t1 SET y = randomblob(798) WHERE x=$x }
+        }
+      }
+
+      execsql {
+        WITH cnt(i) AS (SELECT 1 UNION ALL SELECT i+1 FROM cnt WHERE i<20)
+        INSERT INTO t2 SELECT i, randomblob(800) FROM cnt;
+      }
+
+      execsql {SAVEPOINT abc}
+      for {set i 0} {$i < 5} {incr i} {
+        foreach x [db eval {SELECT x FROM t1}] {
+          execsql { UPDATE t1 SET y = randomblob(797) WHERE x=$x }
+        }
+      }
+      breakpoint
+      execsql {ROLLBACK TO abc}
+
+    }
+
+    set nPg [wal_frame_count test.db-wal 1024]
+    expr $nPg>55 && $nPg<75
+  } {1}
+
+  do_test 1.$tn.8 {
+    forcedelete test.db2 test.db2-wal
+    forcecopy test.db test.db2
+    sqlite3 db2 test.db2
+    execsql { SELECT sum(length(y)) FROM t1 } db2
+  } [expr 20*799]
+
+  do_test 1.$tn.9 {
+    db2 close
+    forcecopy test.db-wal test.db2-wal
+    sqlite3 db2 test.db2
+    execsql { SELECT sum(length(y)) FROM t1 } db2
+  } [expr 20*798]
+
+  do_test 1.$tn.9 {
+    execsql { PRAGMA integrity_check } db2
+  } ok
+  db2 close
 }
 
 finish_test