| Index: third_party/sqlite/src/test/io.test | 
| diff --git a/third_party/sqlite/src/test/io.test b/third_party/sqlite/src/test/io.test | 
| index 0cc26eff4c22ec10b8d95c3e87101810ea61d27b..c5086c10ecb391cb00cb53c3eb0d3f003d05f98a 100644 | 
| --- a/third_party/sqlite/src/test/io.test | 
| +++ b/third_party/sqlite/src/test/io.test | 
| @@ -16,6 +16,7 @@ | 
|  | 
| set testdir [file dirname $argv0] | 
| source $testdir/tester.tcl | 
| +set ::testprefix io | 
|  | 
| db close | 
| sqlite3_simulate_device | 
| @@ -38,6 +39,10 @@ sqlite3 db test.db -vfs devsym | 
| # | 
| # io-5.* -  Test that the default page size is selected and used | 
| #           correctly. | 
| +# | 
| +# io-6.* -  Test that the pager-cache is not being flushed unnecessarily | 
| +#           after a transaction that uses the special atomic-write path | 
| +#           is committed. | 
| # | 
|  | 
| set ::nWrite 0 | 
| @@ -146,11 +151,15 @@ do_test io-2.2 { | 
| # written because page 1 - the change-counter page - is written using | 
| # an out-of-band method that bypasses the write counter. | 
| # | 
| +# UPDATE: As of [05f98d4eec] (adding SQLITE_DBSTATUS_CACHE_WRITE), the | 
| +# second write is also counted. So this now reports two writes and a | 
| +# single fsync. | 
| +# | 
| sqlite3_simulate_device -char atomic | 
| do_test io-2.3 { | 
| execsql { INSERT INTO abc VALUES(3, 4) } | 
| list [nWrite db] [nSync] | 
| -} {1 1} | 
| +} {2 1} | 
|  | 
| # Test that the journal file is not created and the change-counter is | 
| # updated when the atomic-write optimization is used. | 
| @@ -203,7 +212,7 @@ do_test io-2.5.3 { | 
| # Changed 2010-03-27:  The size of the database is now stored in | 
| # bytes 28..31 and so when a page is added to the database, page 1 | 
| # is immediately modified and the journal file immediately comes into | 
| -# existance.  To fix this test, the BEGIN is changed into a a | 
| +# existence.  To fix this test, the BEGIN is changed into a a | 
| # BEGIN IMMEDIATE and the INSERT is omitted. | 
| # | 
| do_test io-2.6.1 { | 
| @@ -225,7 +234,7 @@ do_test io-2.6.2 { | 
| } | 
| } {1 {unable to open database file}} | 
| do_test io-2.6.3 { | 
| -  file delete -force test.db-journal | 
| +  forcedelete test.db-journal | 
| catchsql { COMMIT } | 
| } {0 {}} | 
| do_test io-2.6.4 { | 
| @@ -237,7 +246,7 @@ do_test io-2.6.4 { | 
| # is created during execution of the COMMIT statement, so we have to | 
| # use the same technique to check that it is created as in the above | 
| # block. | 
| -file delete -force test2.db test2.db-journal | 
| +forcedelete test2.db test2.db-journal | 
| ifcapable attach { | 
| do_test io-2.7.1 { | 
| execsql { | 
| @@ -261,7 +270,7 @@ ifcapable attach { | 
| catchsql { COMMIT } | 
| } {1 {unable to open database file}} | 
| do_test io-2.7.5 { | 
| -    file delete -force test2.db-journal | 
| +    forcedelete test2.db-journal | 
| catchsql { COMMIT } | 
| } {1 {cannot commit - no transaction is active}} | 
| do_test io-2.7.6 { | 
| @@ -304,7 +313,7 @@ do_test io-2.9.1 { | 
| do_test io-2.9.2 { | 
| execsql { ROLLBACK; } | 
| db close | 
| -  file delete -force test.db test.db-journal | 
| +  forcedelete test.db test.db-journal | 
| sqlite3 db test.db -vfs devsym | 
| execsql { | 
| PRAGMA auto_vacuum = OFF; | 
| @@ -375,7 +384,7 @@ sqlite3_simulate_device -char sequential -sectorsize 0 | 
| ifcapable pager_pragmas { | 
| do_test io-3.1 { | 
| db close | 
| -    file delete -force test.db test.db-journal | 
| +    forcedelete test.db test.db-journal | 
| sqlite3 db test.db -vfs devsym | 
| db eval { | 
| PRAGMA auto_vacuum=OFF; | 
| @@ -544,7 +553,7 @@ foreach {char                 sectorsize pgsize} { | 
| incr tn | 
| if {$pgsize>$::SQLITE_MAX_PAGE_SIZE} continue | 
| db close | 
| -  file delete -force test.db test.db-journal | 
| +  forcedelete test.db test.db-journal | 
| sqlite3_simulate_device -char $char -sectorsize $sectorsize | 
| sqlite3 db test.db -vfs devsym | 
| db eval { | 
| @@ -561,5 +570,74 @@ foreach {char                 sectorsize pgsize} { | 
| } $pgsize | 
| } | 
|  | 
| +#---------------------------------------------------------------------- | 
| +# | 
| +do_test io-6.1 { | 
| +  db close | 
| +  sqlite3_simulate_device -char atomic | 
| +  forcedelete test.db | 
| +  sqlite3 db test.db -vfs devsym | 
| +  execsql { | 
| +    PRAGMA mmap_size = 0; | 
| +    PRAGMA page_size = 1024; | 
| +    PRAGMA cache_size = 2000; | 
| +    CREATE TABLE t1(x); | 
| +    CREATE TABLE t2(x); | 
| +    CREATE TABLE t3(x); | 
| +    CREATE INDEX i3 ON t3(x); | 
| +    INSERT INTO t3 VALUES(randomblob(100)); | 
| +    INSERT INTO t3 SELECT randomblob(100) FROM t3; | 
| +    INSERT INTO t3 SELECT randomblob(100) FROM t3; | 
| +    INSERT INTO t3 SELECT randomblob(100) FROM t3; | 
| +    INSERT INTO t3 SELECT randomblob(100) FROM t3; | 
| +    INSERT INTO t3 SELECT randomblob(100) FROM t3; | 
| +    INSERT INTO t3 SELECT randomblob(100) FROM t3; | 
| +    INSERT INTO t3 SELECT randomblob(100) FROM t3; | 
| +    INSERT INTO t3 SELECT randomblob(100) FROM t3; | 
| +    INSERT INTO t3 SELECT randomblob(100) FROM t3; | 
| +    INSERT INTO t3 SELECT randomblob(100) FROM t3; | 
| +    INSERT INTO t3 SELECT randomblob(100) FROM t3; | 
| +  } | 
| + | 
| +  db_save_and_close | 
| +} {} | 
| + | 
| +foreach {tn sql} { | 
| +  1 { BEGIN; | 
| +        INSERT INTO t1 VALUES('123'); | 
| +        INSERT INTO t2 VALUES('456'); | 
| +      COMMIT; | 
| +  } | 
| +  2 { BEGIN; | 
| +        INSERT INTO t1 VALUES('123'); | 
| +      COMMIT; | 
| +  } | 
| +} { | 
| + | 
| +  # These tests don't work with memsubsys1, as it causes the effective page | 
| +  # cache size to become too small to hold the entire db in memory. | 
| +  if {[permutation] == "memsubsys1"} continue | 
| + | 
| +  db_restore | 
| +  sqlite3 db test.db -vfs devsym | 
| +  execsql { | 
| +    PRAGMA cache_size = 2000; | 
| +    PRAGMA mmap_size = 0; | 
| +    SELECT x FROM t3 ORDER BY rowid; | 
| +    SELECT x FROM t3 ORDER BY x; | 
| +  } | 
| +  do_execsql_test 6.2.$tn.1 { PRAGMA integrity_check } {ok} | 
| +  do_execsql_test 6.2.$tn.2 $sql | 
| + | 
| +  # Corrupt the database file on disk. This should not matter for the | 
| +  # purposes of the following "PRAGMA integrity_check", as the entire | 
| +  # database should be cached in the pager-cache. If corruption is | 
| +  # reported, it indicates that executing $sql caused the pager cache | 
| +  # to be flushed. Which is a bug. | 
| +  hexio_write test.db [expr 1024 * 5] [string repeat 00 2048] | 
| +  do_execsql_test 6.2.$tn.3 { PRAGMA integrity_check } {ok} | 
| +  db close | 
| +} | 
| + | 
| sqlite3_simulate_device -char {} -sectorsize 0 | 
| finish_test | 
|  |