Index: third_party/sqlite/src/test/zerodamage.test |
diff --git a/third_party/sqlite/src/test/zerodamage.test b/third_party/sqlite/src/test/zerodamage.test |
new file mode 100644 |
index 0000000000000000000000000000000000000000..dccaba816e6e081e421bf9f338df48537b147356 |
--- /dev/null |
+++ b/third_party/sqlite/src/test/zerodamage.test |
@@ -0,0 +1,121 @@ |
+# 2011 December 21 |
+# |
+# 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. |
+# |
+#*********************************************************************** |
+# |
+# This file implements tests of the SQLITE_IOCAP_POWERSAFE_OVERWRITE property |
+# and the SQLITE_FCNTL_POWERSAFE_OVERWRITE file-control for manipulating it. |
+# |
+# The name of this file comes from the fact that we used to call the |
+# POWERSAFE_OVERWRITE property ZERO_DAMAGE. |
+# |
+ |
+set testdir [file dirname $argv0] |
+source $testdir/tester.tcl |
+set testprefix zerodamage |
+ |
+ifcapable !vtab { |
+ finish_test |
+ return |
+} |
+ |
+# POWERSAFE_OVERWRITE defaults to true |
+# |
+do_test zerodamage-1.0 { |
+ file_control_powersafe_overwrite db -1 |
+} {0 1} |
+ |
+# Check the ability to turn zero-damage on and off. |
+# |
+do_test zerodamage-1.1 { |
+ file_control_powersafe_overwrite db 0 |
+ file_control_powersafe_overwrite db -1 |
+} {0 0} |
+do_test zerodamage-1.2 { |
+ file_control_powersafe_overwrite db 1 |
+ file_control_powersafe_overwrite db -1 |
+} {0 1} |
+ |
+# Run a transaction with zero-damage on, a small page size and a much larger |
+# sectorsize. Verify that the maximum journal size is small - that the |
+# rollback journal is not being padded. |
+# |
+do_test zerodamage-2.0 { |
+ db close |
+ testvfs tv -default 1 |
+ tv sectorsize 8192 |
+ sqlite3 db file:test.db?psow=TRUE -uri 1 |
+ unset -nocomplain ::max_journal_size |
+ set ::max_journal_size 0 |
+ proc xDeleteCallback {method file args} { |
+ set sz [file size $file] |
+ if {$sz>$::max_journal_size} {set ::max_journal_size $sz} |
+ } |
+ tv filter xDelete |
+ tv script xDeleteCallback |
+ load_static_extension db wholenumber |
+ db eval { |
+ PRAGMA page_size=1024; |
+ PRAGMA journal_mode=DELETE; |
+ PRAGMA cache_size=5; |
+ CREATE VIRTUAL TABLE nums USING wholenumber; |
+ CREATE TABLE t1(x, y); |
+ INSERT INTO t1 SELECT value, randomblob(100) FROM nums |
+ WHERE value BETWEEN 1 AND 400; |
+ } |
+ set ::max_journal_size 0 |
+ db eval { |
+ UPDATE t1 SET y=randomblob(50) WHERE x=123; |
+ } |
+ concat [file_control_powersafe_overwrite db -1] [set ::max_journal_size] |
+} {0 1 2576} |
+ |
+# Repeat the previous step with zero-damage turned off. This time the |
+# maximum rollback journal size should be much larger. |
+# |
+do_test zerodamage-2.1 { |
+ set ::max_journal_size 0 |
+ db close |
+ sqlite3 db file:test.db?psow=FALSE -uri 1 |
+ db eval { |
+ UPDATE t1 SET y=randomblob(50) WHERE x=124; |
+ } |
+ concat [file_control_powersafe_overwrite db -1] [set ::max_journal_size] |
+} {0 0 24704} |
+ |
+ifcapable wal { |
+ # Run a WAL-mode transaction with POWERSAFE_OVERWRITE on to verify that the |
+ # WAL file does not get too big. |
+ # |
+ do_test zerodamage-3.0 { |
+ db eval { |
+ PRAGMA journal_mode=WAL; |
+ } |
+ db close |
+ sqlite3 db file:test.db?psow=TRUE -uri 1 |
+ db eval { |
+ UPDATE t1 SET y=randomblob(50) WHERE x=124; |
+ } |
+ file size test.db-wal |
+ } {1080} |
+ |
+ # Repeat the previous with POWERSAFE_OVERWRITE off. Verify that the WAL file |
+ # is padded. |
+ # |
+ do_test zerodamage-3.1 { |
+ db close |
+ sqlite3 db file:test.db?psow=FALSE -uri 1 |
+ db eval { |
+ UPDATE t1 SET y=randomblob(50) WHERE x=124; |
+ } |
+ file size test.db-wal |
+ } {16800} |
+} |
+ |
+finish_test |