122 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			122 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| # 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
 | 
