Merge changes from trunk.
[sqlite.git] / test / pager1.test
blob8451e0b3d2f96564e0b18a9a8e1930ec1142926a
1 # 2010 June 15
3 # The author disclaims copyright to this source code.  In place of
4 # a legal notice, here is a blessing:
6 #    May you do good and not evil.
7 #    May you find forgiveness for yourself and forgive others.
8 #    May you share freely, never taking more than you give.
10 #***********************************************************************
13 set testdir [file dirname $argv0]
14 source $testdir/tester.tcl
15 source $testdir/lock_common.tcl
16 source $testdir/malloc_common.tcl
17 source $testdir/wal_common.tcl
18 set testprefix pager1
20 # Do not use a codec for tests in this file, as the database file is
21 # manipulated directly using tcl scripts (using the [hexio_write] command).
23 do_not_use_codec
26 # pager1-1.*: Test inter-process locking (clients in multiple processes).
28 # pager1-2.*: Test intra-process locking (multiple clients in this process).
30 # pager1-3.*: Savepoint related tests.
32 # pager1-4.*: Hot-journal related tests.
34 # pager1-5.*: Cases related to multi-file commits.
36 # pager1-6.*: Cases related to "PRAGMA max_page_count"
38 # pager1-7.*: Cases specific to "PRAGMA journal_mode=TRUNCATE"
40 # pager1-8.*: Cases using temporary and in-memory databases.
42 # pager1-9.*: Tests related to the backup API.
44 # pager1-10.*: Test that the assumed file-system sector-size is limited to
45 #              64KB.
47 # pager1-12.*: Tests involving "PRAGMA page_size"
49 # pager1-13.*: Cases specific to "PRAGMA journal_mode=PERSIST"
51 # pager1-14.*: Cases specific to "PRAGMA journal_mode=OFF"
53 # pager1-15.*: Varying sqlite3_vfs.szOsFile
55 # pager1-16.*: Varying sqlite3_vfs.mxPathname
57 # pager1-17.*: Tests related to "PRAGMA omit_readlock"
58 #              (The omit_readlock pragma has been removed and so have
59 #              these tests.)
61 # pager1-18.*: Test that the pager layer responds correctly if the b-tree
62 #              requests an invalid page number (due to db corruption).
65 proc recursive_select {id table {script {}}} {
66   set cnt 0
67   db eval "SELECT rowid, * FROM $table WHERE rowid = ($id-1)" {
68     recursive_select $rowid $table $script
69     incr cnt
70   }
71   if {$cnt==0} { eval $script }
74 set a_string_counter 1
75 proc a_string {n} {
76   global a_string_counter
77   incr a_string_counter
78   string range [string repeat "${a_string_counter}." $n] 1 $n
80 db func a_string a_string
82 do_multiclient_test tn {
84   # Create and populate a database table using connection [db]. Check 
85   # that connections [db2] and [db3] can see the schema and content.
86   #
87   do_test pager1-$tn.1 {
88     sql1 {
89       CREATE TABLE t1(a PRIMARY KEY, b);
90       CREATE INDEX i1 ON t1(b);
91       INSERT INTO t1 VALUES(1, 'one'); INSERT INTO t1 VALUES(2, 'two');
92     }
93   } {}
94   do_test pager1-$tn.2 { sql2 { SELECT * FROM t1 } } {1 one 2 two}
95   do_test pager1-$tn.3 { sql3 { SELECT * FROM t1 } } {1 one 2 two}
97   # Open a transaction and add a row using [db]. This puts [db] in
98   # RESERVED state. Check that connections [db2] and [db3] can still
99   # read the database content as it was before the transaction was
100   # opened. [db] should see the inserted row.
101   #
102   do_test pager1-$tn.4 {
103     sql1 {
104       BEGIN;
105         INSERT INTO t1 VALUES(3, 'three');
106     }
107   } {}
108   do_test pager1-$tn.5 { sql2 { SELECT * FROM t1 } } {1 one 2 two}
109   do_test pager1-$tn.7 { sql1 { SELECT * FROM t1 } } {1 one 2 two 3 three}
111   # [db] still has an open write transaction. Check that this prevents
112   # other connections (specifically [db2]) from writing to the database.
113   #
114   # Even if [db2] opens a transaction first, it may not write to the
115   # database. After the attempt to write the db within a transaction, 
116   # [db2] is left with an open transaction, but not a read-lock on
117   # the main database. So it does not prevent [db] from committing.
118   #
119   do_test pager1-$tn.8 { 
120     csql2 { UPDATE t1 SET a = a + 10 }
121   } {1 {database is locked}}
122   do_test pager1-$tn.9 { 
123     csql2 { 
124       BEGIN;
125       UPDATE t1 SET a = a + 10;
126     }
127   } {1 {database is locked}}
129   # Have [db] commit its transactions. Check the other connections can
130   # now see the new database content.
131   #
132   do_test pager1-$tn.10 { sql1 { COMMIT } } {}
133   do_test pager1-$tn.11 { sql1 { SELECT * FROM t1 } } {1 one 2 two 3 three}
134   do_test pager1-$tn.12 { sql2 { SELECT * FROM t1 } } {1 one 2 two 3 three}
135   do_test pager1-$tn.13 { sql3 { SELECT * FROM t1 } } {1 one 2 two 3 three}
137   # Check that, as noted above, [db2] really did keep an open transaction
138   # after the attempt to write the database failed.
139   #
140   do_test pager1-$tn.14 { 
141     csql2 { BEGIN } 
142   } {1 {cannot start a transaction within a transaction}}
143   do_test pager1-$tn.15 { sql2 { ROLLBACK } } {}
145   # Have [db2] open a transaction and take a read-lock on the database.
146   # Check that this prevents [db] from writing to the database (outside
147   # of any transaction). After this fails, check that [db3] can read
148   # the db (showing that [db] did not take a PENDING lock etc.)
149   #
150   do_test pager1-$tn.15 { 
151     sql2 { BEGIN; SELECT * FROM t1; }
152   } {1 one 2 two 3 three}
153   do_test pager1-$tn.16 { 
154     csql1 { UPDATE t1 SET a = a + 10 }
155   } {1 {database is locked}}
156   do_test pager1-$tn.17 { sql3 { SELECT * FROM t1 } } {1 one 2 two 3 three}
158   # This time, have [db] open a transaction before writing the database.
159   # This works - [db] gets a RESERVED lock which does not conflict with
160   # the SHARED lock [db2] is holding.
161   #
162   do_test pager1-$tn.18 { 
163     sql1 { 
164       BEGIN;  
165       UPDATE t1 SET a = a + 10; 
166     }
167   } {}
168   do_test pager1-$tn-19 { 
169     sql1 { PRAGMA lock_status } 
170   } {main reserved temp closed}
171   do_test pager1-$tn-20 { 
172     sql2 { PRAGMA lock_status } 
173   } {main shared temp closed}
175   # Check that all connections can still read the database. Only [db] sees
176   # the updated content (as the transaction has not been committed yet).
177   #
178   do_test pager1-$tn.21 { sql1 { SELECT * FROM t1 } } {11 one 12 two 13 three}
179   do_test pager1-$tn.22 { sql2 { SELECT * FROM t1 } } {1 one 2 two 3 three}
180   do_test pager1-$tn.23 { sql3 { SELECT * FROM t1 } } {1 one 2 two 3 three}
182   # Because [db2] still has the SHARED lock, [db] is unable to commit the
183   # transaction. If it tries, an error is returned and the connection 
184   # upgrades to a PENDING lock.
185   #
186   # Once this happens, [db] can read the database and see the new content,
187   # [db2] (still holding SHARED) can still read the old content, but [db3]
188   # (not holding any lock) is prevented by [db]'s PENDING from reading
189   # the database.
190   #
191   do_test pager1-$tn.24 { csql1 { COMMIT } } {1 {database is locked}}
192   do_test pager1-$tn-25 { 
193     sql1 { PRAGMA lock_status } 
194   } {main pending temp closed}
195   do_test pager1-$tn.26 { sql1 { SELECT * FROM t1  } } {11 one 12 two 13 three}
196   do_test pager1-$tn.27 { sql2 { SELECT * FROM t1  } } {1 one 2 two 3 three}
197   do_test pager1-$tn.28 { csql3 { SELECT * FROM t1 } } {1 {database is locked}}
199   # Have [db2] commit its read transaction, releasing the SHARED lock it
200   # is holding. Now, neither [db2] nor [db3] may read the database (as [db]
201   # is still holding a PENDING).
202   #
203   do_test pager1-$tn.29 { sql2 { COMMIT } } {}
204   do_test pager1-$tn.30 { csql2 { SELECT * FROM t1 } } {1 {database is locked}}
205   do_test pager1-$tn.31 { csql3 { SELECT * FROM t1 } } {1 {database is locked}}
207   # [db] is now able to commit the transaction. Once the transaction is 
208   # committed, all three connections can read the new content.
209   #
210   do_test pager1-$tn.25 { sql1 { UPDATE t1 SET a = a+10 } } {}
211   do_test pager1-$tn.26 { sql1 { COMMIT } } {}
212   do_test pager1-$tn.27 { sql1 { SELECT * FROM t1 } } {21 one 22 two 23 three}
213   do_test pager1-$tn.27 { sql2 { SELECT * FROM t1 } } {21 one 22 two 23 three}
214   do_test pager1-$tn.28 { sql3 { SELECT * FROM t1 } } {21 one 22 two 23 three}
216   # Install a busy-handler for connection [db].
217   #
218   set ::nbusy [list]
219   proc busy {n} {
220     lappend ::nbusy $n
221     if {$n>5} { sql2 COMMIT }
222     return 0
223   }
224   db busy busy
226   do_test pager1-$tn.29 { 
227     sql1 { BEGIN ; INSERT INTO t1 VALUES('x', 'y') } 
228   } {}
229   do_test pager1-$tn.30 { 
230     sql2 { BEGIN ; SELECT * FROM t1 } 
231   } {21 one 22 two 23 three}
232   do_test pager1-$tn.31 { sql1 COMMIT } {}
233   do_test pager1-$tn.32 { set ::nbusy } {0 1 2 3 4 5 6}
236 #-------------------------------------------------------------------------
237 # Savepoint related test cases.
239 # pager1-3.1.2.*: Force a savepoint rollback to cause the database file
240 #                 to grow.
242 # pager1-3.1.3.*: Use a journal created in synchronous=off mode as part
243 #                 of a savepoint rollback.
245 do_test pager1-3.1.1 {
246   faultsim_delete_and_reopen
247   execsql {
248     CREATE TABLE t1(a PRIMARY KEY, b);
249     CREATE TABLE counter(
250       i CHECK (i<5), 
251       u CHECK (u<10)
252     );
253     INSERT INTO counter VALUES(0, 0);
254     CREATE TRIGGER tr1 AFTER INSERT ON t1 BEGIN
255       UPDATE counter SET i = i+1;
256     END;
257     CREATE TRIGGER tr2 AFTER UPDATE ON t1 BEGIN
258       UPDATE counter SET u = u+1;
259     END;
260   }
261   execsql { SELECT * FROM counter }
262 } {0 0}
264 do_execsql_test pager1-3.1.2 {
265   PRAGMA cache_size = 10;
266   BEGIN;
267     INSERT INTO t1 VALUES(1, randomblob(1500));
268     INSERT INTO t1 VALUES(2, randomblob(1500));
269     INSERT INTO t1 VALUES(3, randomblob(1500));
270     SELECT * FROM counter;
271 } {3 0}
272 do_catchsql_test pager1-3.1.3 {
273     INSERT INTO t1 SELECT a+3, randomblob(1500) FROM t1
274 } {1 {CHECK constraint failed: counter}}
275 do_execsql_test pager1-3.4 { SELECT * FROM counter } {3 0}
276 do_execsql_test pager1-3.5 { SELECT a FROM t1 } {1 2 3}
277 do_execsql_test pager1-3.6 { COMMIT } {}
279 foreach {tn sql tcl} {
280   7  { PRAGMA synchronous = NORMAL ; PRAGMA temp_store = 0 } {
281     testvfs tv -default 1
282     tv devchar safe_append
283   }
284   8  { PRAGMA synchronous = NORMAL ; PRAGMA temp_store = 2 } {
285     testvfs tv -default 1
286     tv devchar sequential
287   }
288   9  { PRAGMA synchronous = FULL } { }
289   10 { PRAGMA synchronous = NORMAL } { }
290   11 { PRAGMA synchronous = OFF } { }
291   12 { PRAGMA synchronous = FULL ; PRAGMA fullfsync = 1 } { }
292   13 { PRAGMA synchronous = FULL } {
293     testvfs tv -default 1
294     tv devchar sequential
295   }
296   14 { PRAGMA locking_mode = EXCLUSIVE } {
297   }
298 } {
299   do_test pager1-3.$tn.1 {
300     eval $tcl
301     faultsim_delete_and_reopen
302     db func a_string a_string
303     execsql $sql
304     execsql {
305       PRAGMA auto_vacuum = 2;
306       PRAGMA cache_size = 10;
307       CREATE TABLE z(x INTEGER PRIMARY KEY, y);
308       BEGIN;
309         INSERT INTO z VALUES(NULL, a_string(800));
310         INSERT INTO z SELECT NULL, a_string(800) FROM z;     --   2
311         INSERT INTO z SELECT NULL, a_string(800) FROM z;     --   4
312         INSERT INTO z SELECT NULL, a_string(800) FROM z;     --   8
313         INSERT INTO z SELECT NULL, a_string(800) FROM z;     --  16
314         INSERT INTO z SELECT NULL, a_string(800) FROM z;     --  32
315         INSERT INTO z SELECT NULL, a_string(800) FROM z;     --  64
316         INSERT INTO z SELECT NULL, a_string(800) FROM z;     -- 128
317         INSERT INTO z SELECT NULL, a_string(800) FROM z;     -- 256
318       COMMIT;
319     }
320     execsql { PRAGMA auto_vacuum }
321   } {2}
322   do_execsql_test pager1-3.$tn.2 {
323     BEGIN;
324       INSERT INTO z VALUES(NULL, a_string(800));
325       INSERT INTO z VALUES(NULL, a_string(800));
326       SAVEPOINT one;
327         UPDATE z SET y = NULL WHERE x>256;
328         PRAGMA incremental_vacuum;
329         SELECT count(*) FROM z WHERE x < 100;
330       ROLLBACK TO one;
331     COMMIT;
332   } {99}
334   do_execsql_test pager1-3.$tn.3 {
335     BEGIN;
336       SAVEPOINT one;
337         UPDATE z SET y = y||x;
338       ROLLBACK TO one;
339     COMMIT;
340     SELECT count(*) FROM z;
341   } {258}
343   do_execsql_test pager1-3.$tn.4 {
344     SAVEPOINT one;
345       UPDATE z SET y = y||x;
346     ROLLBACK TO one;
347   } {}
348   do_execsql_test pager1-3.$tn.5 {
349     SELECT count(*) FROM z;
350     RELEASE one;
351     PRAGMA integrity_check;
352   } {258 ok}
354   do_execsql_test pager1-3.$tn.6 {
355     SAVEPOINT one;
356     RELEASE one;
357   } {}
359   db close
360   catch { tv delete }
363 #-------------------------------------------------------------------------
364 # Hot journal rollback related test cases.
366 # pager1.4.1.*: Test that the pager module deletes very small invalid
367 #               journal files.
369 # pager1.4.2.*: Test that if the master journal pointer at the end of a
370 #               hot-journal file appears to be corrupt (checksum does not
371 #               compute) the associated journal is rolled back (and no
372 #               xAccess() call to check for the presence of any master 
373 #               journal file is made).
375 # pager1.4.3.*: Test that the contents of a hot-journal are ignored if the
376 #               page-size or sector-size in the journal header appear to
377 #               be invalid (too large, too small or not a power of 2).
379 # pager1.4.4.*: Test hot-journal rollback of journal file with a master
380 #               journal pointer generated in various "PRAGMA synchronous"
381 #               modes.
383 # pager1.4.5.*: Test that hot-journal rollback stops if it encounters a
384 #               journal-record for which the checksum fails.
386 # pager1.4.6.*: Test that when rolling back a hot-journal that contains a
387 #               master journal pointer, the master journal file is deleted
388 #               after all the hot-journals that refer to it are deleted.
390 # pager1.4.7.*: Test that if a hot-journal file exists but a client can
391 #               open it for reading only, the database cannot be accessed and
392 #               SQLITE_CANTOPEN is returned.
394 do_test pager1.4.1.1 {
395   faultsim_delete_and_reopen
396   execsql { 
397     CREATE TABLE x(y, z);
398     INSERT INTO x VALUES(1, 2);
399   }
400   set fd [open test.db-journal w]
401   puts -nonewline $fd "helloworld"
402   close $fd
403   file exists test.db-journal
404 } {1}
405 do_test pager1.4.1.2 { execsql { SELECT * FROM x } } {1 2}
406 do_test pager1.4.1.3 { file exists test.db-journal } {0}
408 # Set up a [testvfs] to snapshot the file-system just before SQLite
409 # deletes the master-journal to commit a multi-file transaction.
411 # In subsequent test cases, invoking [faultsim_restore_and_reopen] sets
412 # up the file system to contain two databases, two hot-journal files and
413 # a master-journal.
415 do_test pager1.4.2.1 {
416   testvfs tstvfs -default 1
417   tstvfs filter xDelete
418   tstvfs script xDeleteCallback
419   proc xDeleteCallback {method file args} {
420     set file [file tail $file]
421     if { [string match *mj* $file] } { faultsim_save }
422   }
423   faultsim_delete_and_reopen
424   db func a_string a_string
425   execsql {
426     ATTACH 'test.db2' AS aux;
427     PRAGMA journal_mode = DELETE;
428     PRAGMA main.cache_size = 10;
429     PRAGMA aux.cache_size = 10;
430     CREATE TABLE t1(a UNIQUE, b UNIQUE);
431     CREATE TABLE aux.t2(a UNIQUE, b UNIQUE);
432     INSERT INTO t1 VALUES(a_string(200), a_string(300));
433     INSERT INTO t1 SELECT a_string(200), a_string(300) FROM t1;
434     INSERT INTO t1 SELECT a_string(200), a_string(300) FROM t1;
435     INSERT INTO t2 SELECT * FROM t1;
436     BEGIN;
437       INSERT INTO t1 SELECT a_string(201), a_string(301) FROM t1;
438       INSERT INTO t1 SELECT a_string(202), a_string(302) FROM t1;
439       INSERT INTO t1 SELECT a_string(203), a_string(303) FROM t1;
440       INSERT INTO t1 SELECT a_string(204), a_string(304) FROM t1;
441       REPLACE INTO t2 SELECT * FROM t1;
442     COMMIT;
443   }
444   db close
445   tstvfs delete
446 } {}
448 if {$::tcl_platform(platform)!="windows"} {
449 do_test pager1.4.2.2 {
450   faultsim_restore_and_reopen
451   execsql {
452     SELECT count(*) FROM t1;
453     PRAGMA integrity_check;
454   }
455 } {4 ok}
456 do_test pager1.4.2.3 {
457   faultsim_restore_and_reopen
458   foreach f [glob test.db-mj*] { forcedelete $f }
459   execsql {
460     SELECT count(*) FROM t1;
461     PRAGMA integrity_check;
462   }
463 } {64 ok}
464 do_test pager1.4.2.4 {
465   faultsim_restore_and_reopen
466   hexio_write test.db-journal [expr [file size test.db-journal]-30] 123456
467   execsql {
468     SELECT count(*) FROM t1;
469     PRAGMA integrity_check;
470   }
471 } {4 ok}
472 do_test pager1.4.2.5 {
473   faultsim_restore_and_reopen
474   hexio_write test.db-journal [expr [file size test.db-journal]-30] 123456
475   foreach f [glob test.db-mj*] { forcedelete $f }
476   execsql {
477     SELECT count(*) FROM t1;
478     PRAGMA integrity_check;
479   }
480 } {4 ok}
483 do_test pager1.4.3.1 {
484   testvfs tstvfs -default 1
485   tstvfs filter xSync
486   tstvfs script xSyncCallback
487   proc xSyncCallback {method file args} {
488     set file [file tail $file]
489     if { 0==[string match *journal $file] } { faultsim_save }
490   }
491   faultsim_delete_and_reopen
492   execsql {
493     PRAGMA journal_mode = DELETE;
494     CREATE TABLE t1(a, b);
495     INSERT INTO t1 VALUES(1, 2);
496     INSERT INTO t1 VALUES(3, 4);
497   }
498   db close
499   tstvfs delete
500 } {}
502 foreach {tn ofst value result} {
503           2   20    31       {1 2 3 4}
504           3   20    32       {1 2 3 4}
505           4   20    33       {1 2 3 4}
506           5   20    65536    {1 2 3 4}
507           6   20    131072   {1 2 3 4}
509           7   24    511      {1 2 3 4}
510           8   24    513      {1 2 3 4}
511           9   24    131072   {1 2 3 4}
513          10   32    65536    {1 2}
514 } {
515   do_test pager1.4.3.$tn {
516     faultsim_restore_and_reopen
517     hexio_write test.db-journal $ofst [format %.8x $value]
518     execsql { SELECT * FROM t1 }
519   } $result
521 db close
523 # Set up a VFS that snapshots the file-system just before a master journal
524 # file is deleted to commit a multi-file transaction. Specifically, the
525 # file-system is saved just before the xDelete() call to remove the 
526 # master journal file from the file-system.
528 set pwd [get_pwd]
529 testvfs tv -default 1
530 tv script copy_on_mj_delete
531 set ::mj_filename_length 0
532 set ::mj_delete_cnt 0
533 proc copy_on_mj_delete {method filename args} {
534   if {[string match *mj* [file tail $filename]]} { 
535     #
536     # NOTE: Is the file name relative?  If so, add the length of the current
537     #       directory.
538     #
539     if {[is_relative_file $filename]} {
540       set ::mj_filename_length \
541         [expr {[string length $filename] + [string length $::pwd]}]
542     } else {
543       set ::mj_filename_length [string length $filename]
544     }
545     faultsim_save 
546     incr ::mj_delete_cnt
547   }
548   return SQLITE_OK
551 foreach {tn1 tcl} {
552   1 { set prefix "test.db" }
553   2 { 
554     # This test depends on the underlying VFS being able to open paths
555     # 512 bytes in length. The idea is to create a hot-journal file that
556     # contains a master-journal pointer so large that it could contain
557     # a valid page record (if the file page-size is 512 bytes). So as to
558     # make sure SQLite doesn't get confused by this.
559     #
560     set nPadding [expr 511 - $::mj_filename_length]
561     if {$tcl_platform(platform)=="windows"} {
562       # TBD need to figure out how to do this correctly for Windows!!!
563       set nPadding [expr 255 - $::mj_filename_length]
564     }
566     # We cannot just create a really long database file name to open, as
567     # Linux limits a single component of a path to 255 bytes by default
568     # (and presumably other systems have limits too). So create a directory
569     # hierarchy to work in.
570     #
571     set dirname "d123456789012345678901234567890/"
572     set nDir [expr $nPadding / 32]
573     if { $nDir } {
574       set p [string repeat $dirname $nDir]
575       file mkdir $p
576       cd $p
577     }
579     set padding [string repeat x [expr $nPadding %32]]
580     set prefix "test.db${padding}"
581   }
582 } {
583   eval $tcl
584   foreach {tn2 sql usesMJ} {
585     o { 
586       PRAGMA main.synchronous=OFF;
587       PRAGMA aux.synchronous=OFF;
588       PRAGMA journal_mode = DELETE;
589     } 0
590     o512 { 
591       PRAGMA main.synchronous=OFF;
592       PRAGMA aux.synchronous=OFF;
593       PRAGMA main.page_size = 512;
594       PRAGMA aux.page_size = 512;
595       PRAGMA journal_mode = DELETE;
596     } 0
597     n { 
598       PRAGMA main.synchronous=NORMAL;
599       PRAGMA aux.synchronous=NORMAL;
600       PRAGMA journal_mode = DELETE;
601     } 1
602     f { 
603       PRAGMA main.synchronous=FULL;
604       PRAGMA aux.synchronous=FULL;
605       PRAGMA journal_mode = DELETE;
606     } 1
607     w1 { 
608       PRAGMA main.synchronous=NORMAL;
609       PRAGMA aux.synchronous=NORMAL;
610       PRAGMA journal_mode = WAL;
611     } 0
612     w2 { 
613       PRAGMA main.synchronous=NORMAL;
614       PRAGMA aux.synchronous=NORMAL;
615       PRAGMA main.journal_mode=DELETE;
616       PRAGMA aux.journal_mode=WAL;
617     } 0
618     o1a { 
619       PRAGMA main.synchronous=FULL;
620       PRAGMA aux.synchronous=OFF;
621       PRAGMA journal_mode=DELETE;
622     } 0
623     o1b { 
624       PRAGMA main.synchronous=OFF;
625       PRAGMA aux.synchronous=NORMAL;
626       PRAGMA journal_mode=DELETE;
627     } 0
628     m1 { 
629       PRAGMA main.synchronous=NORMAL;
630       PRAGMA aux.synchronous=NORMAL;
631       PRAGMA main.journal_mode=DELETE;
632       PRAGMA aux.journal_mode = MEMORY;
633     } 0
634     t1 { 
635       PRAGMA main.synchronous=NORMAL;
636       PRAGMA aux.synchronous=NORMAL;
637       PRAGMA main.journal_mode=DELETE;
638       PRAGMA aux.journal_mode = TRUNCATE;
639     } 1
640     p1 { 
641       PRAGMA main.synchronous=NORMAL;
642       PRAGMA aux.synchronous=NORMAL;
643       PRAGMA main.journal_mode=DELETE;
644       PRAGMA aux.journal_mode = PERSIST;
645     } 1
646   } {
648     set tn "${tn1}.${tn2}"
649   
650     # Set up a connection to have two databases, test.db (main) and 
651     # test.db2 (aux). Then run a multi-file transaction on them. The
652     # VFS will snapshot the file-system just before the master-journal
653     # file is deleted to commit the transaction.
654     #
655     tv filter xDelete
656     do_test pager1-4.4.$tn.1 {
657       set ::mj_delete_cnt 0
658       faultsim_delete_and_reopen $prefix
659       execsql "
660         ATTACH '${prefix}2' AS aux;
661         $sql
662         CREATE TABLE a(x);
663         CREATE TABLE aux.b(x);
664         INSERT INTO a VALUES('double-you');
665         INSERT INTO a VALUES('why');
666         INSERT INTO a VALUES('zed');
667         INSERT INTO b VALUES('won');
668         INSERT INTO b VALUES('too');
669         INSERT INTO b VALUES('free');
670       "
671       execsql {
672         BEGIN;
673           INSERT INTO a SELECT * FROM b WHERE rowid<=3;
674           INSERT INTO b SELECT * FROM a WHERE rowid<=3;
675         COMMIT;
676       }
677     } {}
678     tv filter {}
680     # Verify that a master journal was deleted only for those cases where
681     # master journals really ought to be used
682     #
683     do_test pager1-4.4.$tn.1b {
684       set ::mj_delete_cnt
685     } $usesMJ
686     
687     # Check that the transaction was committed successfully.
688     #
689     do_execsql_test pager1-4.4.$tn.2 {
690       SELECT * FROM a
691     } {double-you why zed won too free}
692     do_execsql_test pager1-4.4.$tn.3 {
693       SELECT * FROM b
694     } {won too free double-you why zed}
695     
696     if {$usesMJ} {
697       # Restore the file-system and reopen the databases. Check that it now
698       # appears that the transaction was not committed (because the file-system
699       # was restored to the state where it had not been).
700       #
701       do_test pager1-4.4.$tn.4 {
702         faultsim_restore_and_reopen $prefix
703         execsql "ATTACH '${prefix}2' AS aux"
704       } {}
705       do_execsql_test pager1-4.4.$tn.5 {SELECT * FROM a} {double-you why zed}
706       do_execsql_test pager1-4.4.$tn.6 {SELECT * FROM b} {won too free}
707     }
708     
709     # Restore the file-system again. This time, before reopening the databases,
710     # delete the master-journal file from the file-system. It now appears that
711     # the transaction was committed (no master-journal file == no rollback).
712     #
713     do_test pager1-4.4.$tn.7 {
714       if {$::mj_delete_cnt>0} {
715         faultsim_restore_and_reopen $prefix
716         foreach f [glob ${prefix}-mj*] { forcedelete $f }
717       } else {
718         db close
719         sqlite3 db $prefix
720       }
721       execsql "ATTACH '${prefix}2' AS aux"
722       glob -nocomplain ${prefix}-mj*
723     } {}
724     do_execsql_test pager1-4.4.$tn.8 {
725       SELECT * FROM a
726     } {double-you why zed won too free}
727     do_execsql_test pager1-4.4.$tn.9 {
728       SELECT * FROM b
729     } {won too free double-you why zed}
730   }
732   cd $pwd
734 db close
735 tv delete
736 forcedelete $dirname
738 # Set up a VFS to make a copy of the file-system just before deleting a
739 # journal file to commit a transaction. The transaction modifies exactly
740 # two database pages (and page 1 - the change counter).
742 testvfs tv -default 1
743 tv sectorsize 512
744 tv script copy_on_journal_delete
745 tv filter xDelete
746 proc copy_on_journal_delete {method filename args} {
747   if {[string match *journal $filename]} faultsim_save 
748   return SQLITE_OK
750 faultsim_delete_and_reopen
751 do_execsql_test pager1.4.5.1 {
752   PRAGMA journal_mode = DELETE;
753   PRAGMA page_size = 1024;
754   CREATE TABLE t1(a, b);
755   CREATE TABLE t2(a, b);
756   INSERT INTO t1 VALUES('I', 'II');
757   INSERT INTO t2 VALUES('III', 'IV');
758   BEGIN;
759     INSERT INTO t1 VALUES(1, 2);
760     INSERT INTO t2 VALUES(3, 4);
761   COMMIT;
762 } {delete}
763 tv filter {}
765 # Check the transaction was committed:
767 do_execsql_test pager1.4.5.2 {
768   SELECT * FROM t1;
769   SELECT * FROM t2;
770 } {I II 1 2 III IV 3 4}
772 # Now try four tests:
774 #  pager1-4.5.3: Restore the file-system. Check that the whole transaction 
775 #                is rolled back.
777 #  pager1-4.5.4: Restore the file-system. Corrupt the first record in the
778 #                journal. Check the transaction is not rolled back.
780 #  pager1-4.5.5: Restore the file-system. Corrupt the second record in the
781 #                journal. Check that the first record in the transaction is 
782 #                played back, but not the second.
784 #  pager1-4.5.6: Restore the file-system. Try to open the database with a
785 #                readonly connection. This should fail, as a read-only
786 #                connection cannot roll back the database file.
788 faultsim_restore_and_reopen
789 do_execsql_test pager1.4.5.3 {
790   SELECT * FROM t1;
791   SELECT * FROM t2;
792 } {I II III IV}
793 faultsim_restore_and_reopen
794 hexio_write test.db-journal [expr 512+4+1024 - 202] 0123456789ABCDEF
795 do_execsql_test pager1.4.5.4 {
796   SELECT * FROM t1;
797   SELECT * FROM t2;
798 } {I II 1 2 III IV 3 4}
799 faultsim_restore_and_reopen
800 hexio_write test.db-journal [expr 512+4+1024+4+4+1024 - 202] 0123456789ABCDEF
801 do_execsql_test pager1.4.5.5 {
802   SELECT * FROM t1;
803   SELECT * FROM t2;
804 } {I II III IV 3 4}
806 faultsim_restore_and_reopen
807 db close
808 sqlite3 db test.db -readonly 1
809 do_catchsql_test pager1.4.5.6 {
810   SELECT * FROM t1;
811   SELECT * FROM t2;
812 } {1 {attempt to write a readonly database}}
813 db close
815 # Snapshot the file-system just before multi-file commit. Save the name
816 # of the master journal file in $::mj_filename.
818 tv script copy_on_mj_delete
819 tv filter xDelete
820 proc copy_on_mj_delete {method filename args} {
821   if {[string match *mj* [file tail $filename]]} { 
822     set ::mj_filename $filename
823     faultsim_save 
824   }
825   return SQLITE_OK
827 do_test pager1.4.6.1 {
828   faultsim_delete_and_reopen
829   execsql {
830     PRAGMA journal_mode = DELETE;
831     ATTACH 'test.db2' AS two;
832     CREATE TABLE t1(a, b);
833     CREATE TABLE two.t2(a, b);
834     INSERT INTO t1 VALUES(1, 't1.1');
835     INSERT INTO t2 VALUES(1, 't2.1');
836     BEGIN;
837       UPDATE t1 SET b = 't1.2';
838       UPDATE t2 SET b = 't2.2';
839     COMMIT;
840   }
841   tv filter {}
842   db close
843 } {}
845 faultsim_restore_and_reopen
846 do_execsql_test pager1.4.6.2 { SELECT * FROM t1 }           {1 t1.1}
847 do_test         pager1.4.6.3 { file exists $::mj_filename } {1}
848 do_execsql_test pager1.4.6.4 {
849   ATTACH 'test.db2' AS two;
850   SELECT * FROM t2;
851 } {1 t2.1}
852 do_test pager1.4.6.5 { file exists $::mj_filename } {0}
854 faultsim_restore_and_reopen
855 db close
856 do_test pager1.4.6.8 {
857   set ::mj_filename1 $::mj_filename
858   tv filter xDelete
859   sqlite3 db test.db2
860   execsql {
861     PRAGMA journal_mode = DELETE;
862     ATTACH 'test.db3' AS three;
863     CREATE TABLE three.t3(a, b);
864     INSERT INTO t3 VALUES(1, 't3.1');
865     BEGIN;
866       UPDATE t2 SET b = 't2.3';
867       UPDATE t3 SET b = 't3.3';
868     COMMIT;
869   }
870   expr {$::mj_filename1 != $::mj_filename}
871 } {1}
872 faultsim_restore_and_reopen
873 tv filter {}
875 # The file-system now contains:
877 #   * three databases
878 #   * three hot-journal files
879 #   * two master-journal files.
881 # The hot-journals associated with test.db2 and test.db3 point to
882 # master journal $::mj_filename. The hot-journal file associated with
883 # test.db points to master journal $::mj_filename1. So reading from
884 # test.db should delete $::mj_filename1.
886 do_test pager1.4.6.9 {
887   lsort [glob test.db*]
888 } [lsort [list                                           \
889   test.db test.db2 test.db3                              \
890   test.db-journal test.db2-journal test.db3-journal      \
891   [file tail $::mj_filename] [file tail $::mj_filename1]
894 # The master-journal $::mj_filename1 contains pointers to test.db and 
895 # test.db2. However the hot-journal associated with test.db2 points to
896 # a different master-journal. Therefore, reading from test.db only should
897 # be enough to cause SQLite to delete $::mj_filename1.
899 do_test         pager1.4.6.10 { file exists $::mj_filename  } {1}
900 do_test         pager1.4.6.11 { file exists $::mj_filename1 } {1}
901 do_execsql_test pager1.4.6.12 { SELECT * FROM t1 } {1 t1.1}
902 do_test         pager1.4.6.13 { file exists $::mj_filename  } {1}
903 do_test         pager1.4.6.14 { file exists $::mj_filename1 } {0}
905 do_execsql_test pager1.4.6.12 {
906   ATTACH 'test.db2' AS two;
907   SELECT * FROM t2;
908 } {1 t2.1}
909 do_test         pager1.4.6.13 { file exists $::mj_filename }  {1}
910 do_execsql_test pager1.4.6.14 {
911   ATTACH 'test.db3' AS three;
912   SELECT * FROM t3;
913 } {1 t3.1}
914 do_test         pager1.4.6.15 { file exists $::mj_filename }  {0}
916 db close
917 tv delete
919 testvfs tv -default 1
920 tv sectorsize 512
921 tv script copy_on_journal_delete
922 tv filter xDelete
923 proc copy_on_journal_delete {method filename args} {
924   if {[string match *journal $filename]} faultsim_save 
925   return SQLITE_OK
927 faultsim_delete_and_reopen
928 do_execsql_test pager1.4.7.1 {
929   PRAGMA journal_mode = DELETE;
930   CREATE TABLE t1(x PRIMARY KEY, y);
931   CREATE INDEX i1 ON t1(y);
932   INSERT INTO t1 VALUES('I',   'one');
933   INSERT INTO t1 VALUES('II',  'four');
934   INSERT INTO t1 VALUES('III', 'nine');
935   BEGIN;
936     INSERT INTO t1 VALUES('IV', 'sixteen');
937     INSERT INTO t1 VALUES('V' , 'twentyfive');
938   COMMIT;
939 } {delete}
940 tv filter {}
941 db close
942 tv delete 
943 catch {
944   test_syscall install fchmod
945   test_syscall fault 1 1
947 do_test pager1.4.7.2 {
948   faultsim_restore_and_reopen
949   catch {file attributes test.db-journal -permissions r--------}
950   catch {file attributes test.db-journal -readonly 1}
951   catchsql { SELECT * FROM t1 }
952 } {1 {unable to open database file}}
953 catch {
954   test_syscall reset
955   test_syscall fault 0 0
957 do_test pager1.4.7.3 {
958   db close
959   catch {file attributes test.db-journal -permissions rw-rw-rw-}
960   catch {file attributes test.db-journal -readonly 0}
961   delete_file test.db-journal
962   file exists test.db-journal
963 } {0}
964 do_test pager1.4.8.1 {
965   catch {file attributes test.db -permissions r--------}
966   catch {file attributes test.db -readonly 1}
967   sqlite3 db test.db
968   db eval { SELECT * FROM t1 }
969   sqlite3_db_readonly db main
970 } {1}
971 do_test pager1.4.8.2 {
972   sqlite3_db_readonly db xyz
973 } {-1}
974 do_test pager1.4.8.3 {
975   db close
976   catch {file attributes test.db -readonly 0}
977   catch {file attributes test.db -permissions rw-rw-rw-} msg
978   sqlite3 db test.db
979   db eval { SELECT * FROM t1 }
980   sqlite3_db_readonly db main
981 } {0}
983 #-------------------------------------------------------------------------
984 # The following tests deal with multi-file commits.
986 # pager1-5.1.*: The case where a multi-file cannot be committed because
987 #               another connection is holding a SHARED lock on one of the
988 #               files. After the SHARED lock is removed, the COMMIT succeeds.
990 # pager1-5.2.*: Multi-file commits with journal_mode=memory.
992 # pager1-5.3.*: Multi-file commits with journal_mode=memory.
994 # pager1-5.4.*: Check that with synchronous=normal, the master-journal file
995 #               name is added to a journal file immediately after the last
996 #               journal record. But with synchronous=full, extra unused space
997 #               is allocated between the last journal record and the 
998 #               master-journal file name so that the master-journal file
999 #               name does not lie on the same sector as the last journal file
1000 #               record.
1002 # pager1-5.5.*: Check that in journal_mode=PERSIST mode, a journal file is
1003 #               truncated to zero bytes when a multi-file transaction is 
1004 #               committed (instead of the first couple of bytes being zeroed).
1007 do_test pager1-5.1.1 {
1008   faultsim_delete_and_reopen
1009   execsql {
1010     ATTACH 'test.db2' AS aux;
1011     CREATE TABLE t1(a, b);
1012     CREATE TABLE aux.t2(a, b);
1013     INSERT INTO t1 VALUES(17, 'Lenin');
1014     INSERT INTO t1 VALUES(22, 'Stalin');
1015     INSERT INTO t1 VALUES(53, 'Khrushchev');
1016   }
1017 } {}
1018 do_test pager1-5.1.2 {
1019   execsql {
1020     BEGIN;
1021       INSERT INTO t1 VALUES(64, 'Brezhnev');
1022       INSERT INTO t2 SELECT * FROM t1;
1023   }
1024   sqlite3 db2 test.db2
1025   execsql {
1026     BEGIN;
1027       SELECT * FROM t2;
1028   } db2
1029 } {}
1030 do_test pager1-5.1.3 {
1031   catchsql COMMIT
1032 } {1 {database is locked}}
1033 do_test pager1-5.1.4 {
1034   execsql COMMIT db2
1035   execsql COMMIT
1036   execsql { SELECT * FROM t2 } db2
1037 } {17 Lenin 22 Stalin 53 Khrushchev 64 Brezhnev}
1038 do_test pager1-5.1.5 {
1039   db2 close
1040 } {}
1042 do_test pager1-5.2.1 {
1043   execsql {
1044     PRAGMA journal_mode = memory;
1045     BEGIN;
1046       INSERT INTO t1 VALUES(84, 'Andropov');
1047       INSERT INTO t2 VALUES(84, 'Andropov');
1048     COMMIT;
1049   }
1050 } {memory}
1051 do_test pager1-5.3.1 {
1052   execsql {
1053     PRAGMA journal_mode = off;
1054     BEGIN;
1055       INSERT INTO t1 VALUES(85, 'Gorbachev');
1056       INSERT INTO t2 VALUES(85, 'Gorbachev');
1057     COMMIT;
1058   }
1059 } {off}
1061 do_test pager1-5.4.1 {
1062   db close
1063   testvfs tv
1064   sqlite3 db test.db -vfs tv
1065   execsql { ATTACH 'test.db2' AS aux }
1067   tv filter xDelete
1068   tv script max_journal_size
1069   tv sectorsize 512
1070   set ::max_journal 0
1071   proc max_journal_size {method args} {
1072     set sz 0
1073     catch { set sz [file size test.db-journal] }
1074     if {$sz > $::max_journal} {
1075       set ::max_journal $sz
1076     }
1077     return SQLITE_OK
1078   }
1079   execsql {
1080     PRAGMA journal_mode = DELETE;
1081     PRAGMA synchronous = NORMAL;
1082     BEGIN;
1083       INSERT INTO t1 VALUES(85, 'Gorbachev');
1084       INSERT INTO t2 VALUES(85, 'Gorbachev');
1085     COMMIT;
1086   }
1088   # The size of the journal file is now:
1089   # 
1090   #   1) 512 byte header +
1091   #   2) 2 * (1024+8) byte records +
1092   #   3) 20+N bytes of master-journal pointer, where N is the size of 
1093   #      the master-journal name encoded as utf-8 with no nul term.
1094   #
1095   set mj_pointer [expr {
1096     20 + [string length "test.db-mjXXXXXX9XX"]
1097   }]
1098   #
1099   #   NOTE: For item 3 above, if the current SQLite VFS lacks the concept of a
1100   #         current directory, the length of the current directory name plus 1
1101   #         character for the directory separator character are NOT counted as
1102   #         part of the total size; otherwise, they are.
1103   #
1104   ifcapable curdir {
1105     set mj_pointer [expr {$mj_pointer + [string length [get_pwd]] + 1}]
1106   }
1107   expr {$::max_journal==(512+2*(1024+8)+$mj_pointer)}
1108 } 1
1109 do_test pager1-5.4.2 {
1110   set ::max_journal 0
1111   execsql {
1112     PRAGMA synchronous = full;
1113     BEGIN;
1114       DELETE FROM t1 WHERE b = 'Lenin';
1115       DELETE FROM t2 WHERE b = 'Lenin';
1116     COMMIT;
1117   }
1119   # In synchronous=full mode, the master-journal pointer is not written
1120   # directly after the last record in the journal file. Instead, it is
1121   # written starting at the next (in this case 512 byte) sector boundary.
1122   #
1123   set mj_pointer [expr {
1124     20 + [string length "test.db-mjXXXXXX9XX"]
1125   }]
1126   #
1127   #   NOTE: If the current SQLite VFS lacks the concept of a current directory,
1128   #         the length of the current directory name plus 1 character for the
1129   #         directory separator character are NOT counted as part of the total
1130   #         size; otherwise, they are.
1131   #
1132   ifcapable curdir {
1133     set mj_pointer [expr {$mj_pointer + [string length [get_pwd]] + 1}]
1134   }
1135   expr {$::max_journal==(((512+2*(1024+8)+511)/512)*512 + $mj_pointer)}
1136 } 1
1137 db close
1138 tv delete
1140 do_test pager1-5.5.1 {
1141   sqlite3 db test.db
1142   execsql { 
1143     ATTACH 'test.db2' AS aux;
1144     PRAGMA journal_mode = PERSIST;
1145     CREATE TABLE t3(a, b);
1146     INSERT INTO t3 SELECT randomblob(1500), randomblob(1500) FROM t1;
1147     UPDATE t3 SET b = randomblob(1500);
1148   }
1149   expr [file size test.db-journal] > 15000
1150 } {1}
1151 do_test pager1-5.5.2 {
1152   execsql {
1153     PRAGMA synchronous = full;
1154     BEGIN;
1155       DELETE FROM t1 WHERE b = 'Stalin';
1156       DELETE FROM t2 WHERE b = 'Stalin';
1157     COMMIT;
1158   }
1159   file size test.db-journal
1160 } {0}
1163 #-------------------------------------------------------------------------
1164 # The following tests work with "PRAGMA max_page_count"
1166 do_test pager1-6.1 {
1167   faultsim_delete_and_reopen
1168   execsql {
1169     PRAGMA auto_vacuum = none;
1170     PRAGMA max_page_count = 10;
1171     CREATE TABLE t2(a, b);
1172     CREATE TABLE t3(a, b);
1173     CREATE TABLE t4(a, b);
1174     CREATE TABLE t5(a, b);
1175     CREATE TABLE t6(a, b);
1176     CREATE TABLE t7(a, b);
1177     CREATE TABLE t8(a, b);
1178     CREATE TABLE t9(a, b);
1179     CREATE TABLE t10(a, b);
1180   }
1181 } {10}
1182 do_catchsql_test pager1-6.2 {
1183   CREATE TABLE t11(a, b)
1184 } {1 {database or disk is full}}
1185 do_execsql_test pager1-6.4 { PRAGMA max_page_count      } {10}
1186 do_execsql_test pager1-6.5 { PRAGMA max_page_count = 15 } {15}
1187 do_execsql_test pager1-6.6 { CREATE TABLE t11(a, b)     } {}
1188 do_execsql_test pager1-6.7 {
1189   BEGIN;
1190     INSERT INTO t11 VALUES(1, 2);
1191     PRAGMA max_page_count = 13;
1192 } {13}
1193 do_execsql_test pager1-6.8 {
1194     INSERT INTO t11 VALUES(3, 4);
1195     PRAGMA max_page_count = 10;
1196 } {11}
1197 do_execsql_test pager1-6.9 { COMMIT } {}
1199 do_execsql_test pager1-6.10 { PRAGMA max_page_count = 10 } {11}
1200 do_execsql_test pager1-6.11 { SELECT * FROM t11 }          {1 2 3 4}
1201 do_execsql_test pager1-6.12 { PRAGMA max_page_count }      {11}
1204 #-------------------------------------------------------------------------
1205 # The following tests work with "PRAGMA journal_mode=TRUNCATE" and
1206 # "PRAGMA locking_mode=EXCLUSIVE".
1208 # Each test is specified with 5 variables. As follows:
1210 #   $tn:  Test Number. Used as part of the [do_test] test names.
1211 #   $sql: SQL to execute.
1212 #   $res: Expected result of executing $sql.
1213 #   $js:  The expected size of the journal file, in bytes, after executing
1214 #         the SQL script. Or -1 if the journal is not expected to exist.
1215 #   $ws:  The expected size of the WAL file, in bytes, after executing
1216 #         the SQL script. Or -1 if the WAL is not expected to exist.
1218 ifcapable wal {
1219   faultsim_delete_and_reopen
1220   foreach {tn sql res js ws} [subst {
1221   
1222     1  {
1223       CREATE TABLE t1(a, b);
1224       PRAGMA auto_vacuum=OFF;
1225       PRAGMA synchronous=NORMAL;
1226       PRAGMA page_size=1024;
1227       PRAGMA locking_mode=EXCLUSIVE;
1228       PRAGMA journal_mode=TRUNCATE;
1229       INSERT INTO t1 VALUES(1, 2);
1230     } {exclusive truncate} 0 -1
1231   
1232     2  {
1233       BEGIN IMMEDIATE;
1234         SELECT * FROM t1;
1235       COMMIT;
1236     } {1 2} 0 -1
1237   
1238     3  {
1239       BEGIN;
1240         SELECT * FROM t1;
1241       COMMIT;
1242     } {1 2} 0 -1
1243   
1244     4  { PRAGMA journal_mode = WAL }    wal       -1 -1
1245     5  { INSERT INTO t1 VALUES(3, 4) }  {}        -1 [wal_file_size 1 1024]
1246     6  { PRAGMA locking_mode = NORMAL } exclusive -1 [wal_file_size 1 1024]
1247     7  { INSERT INTO t1 VALUES(5, 6); } {}        -1 [wal_file_size 2 1024]
1248   
1249     8  { PRAGMA journal_mode = TRUNCATE } truncate          0 -1
1250     9  { INSERT INTO t1 VALUES(7, 8) }    {}                0 -1
1251     10 { SELECT * FROM t1 }               {1 2 3 4 5 6 7 8} 0 -1
1252   
1253   }] {
1254     do_execsql_test pager1-7.1.$tn.1 $sql $res
1255     catch { set J -1 ; set J [file size test.db-journal] }
1256     catch { set W -1 ; set W [file size test.db-wal] }
1257     do_test pager1-7.1.$tn.2 { list $J $W } [list $js $ws]
1258   }
1261 do_test pager1-7.2.1 {
1262   faultsim_delete_and_reopen
1263   execsql {
1264     PRAGMA locking_mode = EXCLUSIVE;
1265     CREATE TABLE t1(a, b);
1266     BEGIN;
1267       PRAGMA journal_mode = delete;
1268       PRAGMA journal_mode = truncate;
1269   }
1270 } {exclusive delete truncate}
1271 do_test pager1-7.2.2 {
1272   execsql { INSERT INTO t1 VALUES(1, 2) }
1273   execsql { PRAGMA journal_mode = persist }
1274 } {truncate}
1275 do_test pager1-7.2.3 {
1276   execsql { COMMIT }
1277   execsql {
1278     PRAGMA journal_mode = persist;
1279     PRAGMA journal_size_limit;
1280   }
1281 } {persist -1}
1283 #-------------------------------------------------------------------------
1284 # The following tests, pager1-8.*, test that the special filenames 
1285 # ":memory:" and "" open temporary databases.
1287 foreach {tn filename} {
1288   1 :memory:
1289   2 ""
1290 } {
1291   do_test pager1-8.$tn.1 {
1292     faultsim_delete_and_reopen
1293     db close
1294     sqlite3 db $filename
1295     execsql {
1296       PRAGMA auto_vacuum = 1;
1297       CREATE TABLE x1(x);
1298       INSERT INTO x1 VALUES('Charles');
1299       INSERT INTO x1 VALUES('James');
1300       INSERT INTO x1 VALUES('Mary');
1301       SELECT * FROM x1;
1302     }
1303   } {Charles James Mary}
1305   do_test pager1-8.$tn.2 {
1306     sqlite3 db2 $filename
1307     catchsql { SELECT * FROM x1 } db2
1308   } {1 {no such table: x1}}
1310   do_execsql_test pager1-8.$tn.3 {
1311     BEGIN;
1312       INSERT INTO x1 VALUES('William');
1313       INSERT INTO x1 VALUES('Anne');
1314     ROLLBACK;
1315   } {}
1318 #-------------------------------------------------------------------------
1319 # The next block of tests - pager1-9.* - deal with interactions between
1320 # the pager and the backup API. Test cases:
1322 #   pager1-9.1.*: Test that a backup completes successfully even if the
1323 #                 source db is written to during the backup op.
1325 #   pager1-9.2.*: Test that a backup completes successfully even if the
1326 #                 source db is written to and then rolled back during a 
1327 #                 backup operation.
1329 do_test pager1-9.0.1 {
1330   faultsim_delete_and_reopen
1331   db func a_string a_string
1332   execsql {
1333     PRAGMA cache_size = 10;
1334     BEGIN;
1335       CREATE TABLE ab(a, b, UNIQUE(a, b));
1336       INSERT INTO ab VALUES( a_string(200), a_string(300) );
1337       INSERT INTO ab SELECT a_string(200), a_string(300) FROM ab;
1338       INSERT INTO ab SELECT a_string(200), a_string(300) FROM ab;
1339       INSERT INTO ab SELECT a_string(200), a_string(300) FROM ab;
1340       INSERT INTO ab SELECT a_string(200), a_string(300) FROM ab;
1341       INSERT INTO ab SELECT a_string(200), a_string(300) FROM ab;
1342       INSERT INTO ab SELECT a_string(200), a_string(300) FROM ab;
1343       INSERT INTO ab SELECT a_string(200), a_string(300) FROM ab;
1344     COMMIT;
1345   }
1346 } {}
1347 do_test pager1-9.0.2 {
1348   sqlite3 db2 test.db2
1349   db2 eval { PRAGMA cache_size = 10 }
1350   sqlite3_backup B db2 main db main
1351   list [B step 10000] [B finish]
1352 } {SQLITE_DONE SQLITE_OK}
1353 do_test pager1-9.0.3 {
1354  db one {SELECT md5sum(a, b) FROM ab}
1355 } [db2 one {SELECT md5sum(a, b) FROM ab}]
1357 do_test pager1-9.1.1 {
1358   execsql { UPDATE ab SET a = a_string(201) }
1359   sqlite3_backup B db2 main db main
1360   B step 30
1361 } {SQLITE_OK}
1362 do_test pager1-9.1.2 {
1363   execsql { UPDATE ab SET b = a_string(301) }
1364   list [B step 10000] [B finish]
1365 } {SQLITE_DONE SQLITE_OK}
1366 do_test pager1-9.1.3 {
1367  db one {SELECT md5sum(a, b) FROM ab}
1368 } [db2 one {SELECT md5sum(a, b) FROM ab}]
1369 do_test pager1-9.1.4 { execsql { SELECT count(*) FROM ab } } {128}
1371 do_test pager1-9.2.1 {
1372   execsql { UPDATE ab SET a = a_string(202) }
1373   sqlite3_backup B db2 main db main
1374   B step 30
1375 } {SQLITE_OK}
1376 do_test pager1-9.2.2 {
1377   execsql { 
1378     BEGIN;
1379       UPDATE ab SET b = a_string(301);
1380     ROLLBACK;
1381   }
1382   list [B step 10000] [B finish]
1383 } {SQLITE_DONE SQLITE_OK}
1384 do_test pager1-9.2.3 {
1385  db one {SELECT md5sum(a, b) FROM ab}
1386 } [db2 one {SELECT md5sum(a, b) FROM ab}]
1387 do_test pager1-9.2.4 { execsql { SELECT count(*) FROM ab } } {128}
1388 db close
1389 db2 close
1391 do_test pager1-9.3.1 {
1392   testvfs tv -default 1
1393   tv sectorsize 4096
1394   faultsim_delete_and_reopen
1396   execsql { PRAGMA page_size = 1024 }
1397   for {set ii 0} {$ii < 4} {incr ii} { execsql "CREATE TABLE t${ii}(a, b)" }
1398 } {}
1399 if {[nonzero_reserved_bytes]} {
1400   # backup with a page size changes is not possible with the codec
1401   #
1402   do_test pager1-9.3.2codec {
1403     sqlite3 db2 test.db2
1404     execsql {
1405       PRAGMA page_size = 4096;
1406       PRAGMA synchronous = OFF;
1407       CREATE TABLE t1(a, b);
1408       CREATE TABLE t2(a, b);
1409     } db2
1410     sqlite3_backup B db2 main db main
1411     B step 30
1412     list [B step 10000] [B finish]
1413   } {SQLITE_READONLY SQLITE_READONLY}
1414   do_test pager1-9.3.3codec {
1415     db2 close
1416     db close
1417     tv delete
1418     file size test.db2
1419   } [file size test.db2]
1420 } else {
1421   do_test pager1-9.3.2 {
1422     sqlite3 db2 test.db2
1423     execsql {
1424       PRAGMA page_size = 4096;
1425       PRAGMA synchronous = OFF;
1426       CREATE TABLE t1(a, b);
1427       CREATE TABLE t2(a, b);
1428     } db2
1429     sqlite3_backup B db2 main db main
1430     B step 30
1431     list [B step 10000] [B finish]
1432   } {SQLITE_DONE SQLITE_OK}
1433   do_test pager1-9.3.3 {
1434     db2 close
1435     db close
1436     tv delete
1437     file size test.db2
1438   } [file size test.db]
1441 do_test pager1-9.4.1 {
1442   faultsim_delete_and_reopen
1443   sqlite3 db2 test.db2
1444   execsql {
1445     PRAGMA page_size = 4096;
1446     CREATE TABLE t1(a, b);
1447     CREATE TABLE t2(a, b);
1448   } db2
1449   sqlite3_backup B db2 main db main
1450   list [B step 10000] [B finish]
1451 } {SQLITE_DONE SQLITE_OK}
1452 do_test pager1-9.4.2 {
1453   list [file size test.db2] [file size test.db]
1454 } {1024 0}
1455 db2 close
1457 #-------------------------------------------------------------------------
1458 # Test that regardless of the value returned by xSectorSize(), the
1459 # minimum effective sector-size is 512 and the maximum 65536 bytes.
1461 testvfs tv -default 1
1462 foreach sectorsize {
1463     16
1464     32   64   128   256   512   1024   2048 
1465     4096 8192 16384 32768 65536 131072 262144
1466 } {
1467   tv sectorsize $sectorsize
1468   tv devchar {}
1469   set eff $sectorsize
1470   if {$sectorsize < 512}   { set eff 512 }
1471   if {$sectorsize > 65536} { set eff 65536 }
1473   do_test pager1-10.$sectorsize.1 {
1474     faultsim_delete_and_reopen
1475     db func a_string a_string
1476     execsql {
1477       PRAGMA journal_mode = PERSIST;
1478       PRAGMA page_size = 1024;
1479       BEGIN;
1480         CREATE TABLE t1(a, b);
1481         CREATE TABLE t2(a, b);
1482         CREATE TABLE t3(a, b);
1483       COMMIT;
1484     }
1485     file size test.db-journal
1486   } [expr $sectorsize > 65536 ? 65536 : ($sectorsize<32 ? 512 : $sectorsize)]
1488   do_test pager1-10.$sectorsize.2 {
1489     execsql { 
1490       INSERT INTO t3 VALUES(a_string(300), a_string(300));
1491       INSERT INTO t3 SELECT * FROM t3;        /*  2 */
1492       INSERT INTO t3 SELECT * FROM t3;        /*  4 */
1493       INSERT INTO t3 SELECT * FROM t3;        /*  8 */
1494       INSERT INTO t3 SELECT * FROM t3;        /* 16 */
1495       INSERT INTO t3 SELECT * FROM t3;        /* 32 */
1496     }
1497   } {}
1499   do_test pager1-10.$sectorsize.3 {
1500     db close
1501     sqlite3 db test.db
1502     execsql { 
1503       PRAGMA cache_size = 10;
1504       BEGIN;
1505     }
1506     recursive_select 32 t3 {db eval "INSERT INTO t2 VALUES(1, 2)"}
1507     execsql {
1508       COMMIT;
1509       SELECT * FROM t2;
1510     }
1511   } {1 2}
1513   do_test pager1-10.$sectorsize.4 {
1514     execsql {
1515       CREATE TABLE t6(a, b);
1516       CREATE TABLE t7(a, b);
1517       CREATE TABLE t5(a, b);
1518       DROP TABLE t6;
1519       DROP TABLE t7;
1520     }
1521     execsql {
1522       BEGIN;
1523         CREATE TABLE t6(a, b);
1524     }
1525     recursive_select 32 t3 {db eval "INSERT INTO t5 VALUES(1, 2)"}
1526     execsql {
1527       COMMIT;
1528       SELECT * FROM t5;
1529     }
1530   } {1 2}
1531   
1533 db close
1535 tv sectorsize 4096
1536 do_test pager1.10.x.1 {
1537   faultsim_delete_and_reopen
1538   execsql {
1539     PRAGMA auto_vacuum = none;
1540     PRAGMA page_size = 1024;
1541     CREATE TABLE t1(x);
1542   }
1543   for {set i 0} {$i<30} {incr i} {
1544     execsql { INSERT INTO t1 VALUES(zeroblob(900)) }
1545   }
1546   file size test.db
1547 } {32768}
1548 do_test pager1.10.x.2 {
1549   execsql {
1550     CREATE TABLE t2(x);
1551     DROP TABLE t2;
1552   }
1553   file size test.db
1554 } {33792}
1555 do_test pager1.10.x.3 {
1556   execsql {
1557     BEGIN;
1558     CREATE TABLE t2(x);
1559   }
1560   recursive_select 30 t1
1561   execsql {
1562     CREATE TABLE t3(x);
1563     COMMIT;
1564   }
1565 } {}
1567 db close
1568 tv delete
1570 testvfs tv -default 1
1571 faultsim_delete_and_reopen
1572 db func a_string a_string
1573 do_execsql_test pager1-11.1 {
1574   PRAGMA journal_mode = DELETE;
1575   PRAGMA cache_size = 10;
1576   BEGIN;
1577     CREATE TABLE zz(top PRIMARY KEY);
1578     INSERT INTO zz VALUES(a_string(222));
1579     INSERT INTO zz SELECT a_string((SELECT 222+max(rowid) FROM zz)) FROM zz;
1580     INSERT INTO zz SELECT a_string((SELECT 222+max(rowid) FROM zz)) FROM zz;
1581     INSERT INTO zz SELECT a_string((SELECT 222+max(rowid) FROM zz)) FROM zz;
1582     INSERT INTO zz SELECT a_string((SELECT 222+max(rowid) FROM zz)) FROM zz;
1583     INSERT INTO zz SELECT a_string((SELECT 222+max(rowid) FROM zz)) FROM zz;
1584   COMMIT;
1585   BEGIN;
1586     UPDATE zz SET top = a_string(345);
1587 } {delete}
1589 proc lockout {method args} { return SQLITE_IOERR }
1590 tv script lockout
1591 tv filter {xWrite xTruncate xSync}
1592 do_catchsql_test pager1-11.2 { COMMIT } {1 {disk I/O error}}
1594 tv script {}
1595 do_test pager1-11.3 {
1596   sqlite3 db2 test.db
1597   execsql {
1598     PRAGMA journal_mode = TRUNCATE;
1599     PRAGMA integrity_check;
1600   } db2
1601 } {truncate ok}
1602 do_test pager1-11.4 {
1603   db2 close
1604   file exists test.db-journal
1605 } {0}
1606 do_execsql_test pager1-11.5 { SELECT count(*) FROM zz } {32}
1607 db close
1608 tv delete
1609   
1610 #-------------------------------------------------------------------------
1611 # Test "PRAGMA page_size"
1613 testvfs tv -default 1
1614 tv sectorsize 1024
1615 foreach pagesize {
1616     512   1024   2048 4096 8192 16384 32768 
1617 } {
1618   faultsim_delete_and_reopen
1620   # The sector-size (according to the VFS) is 1024 bytes. So if the
1621   # page-size requested using "PRAGMA page_size" is greater than the
1622   # compile time value of SQLITE_MAX_PAGE_SIZE, then the effective 
1623   # page-size remains 1024 bytes.
1624   #
1625   set eff $pagesize
1626   if {$eff > $::SQLITE_MAX_PAGE_SIZE} { set eff 1024 }
1628   do_test pager1-12.$pagesize.1 {
1629     sqlite3 db2 test.db
1630     execsql "
1631       PRAGMA page_size = $pagesize;
1632       CREATE VIEW v AS SELECT * FROM sqlite_master;
1633     " db2
1634     file size test.db
1635   } $eff
1636   do_test pager1-12.$pagesize.2 {
1637     sqlite3 db2 test.db
1638     execsql { 
1639       SELECT count(*) FROM v;
1640       PRAGMA main.page_size;
1641     } db2
1642   } [list 1 $eff]
1643   do_test pager1-12.$pagesize.3 {
1644     execsql { 
1645       SELECT count(*) FROM v;
1646       PRAGMA main.page_size;
1647     }
1648   } [list 1 $eff]
1649   db2 close
1651 db close
1652 tv delete
1654 #-------------------------------------------------------------------------
1655 # Test specal "PRAGMA journal_mode=PERSIST" test cases.
1657 # pager1-13.1.*: This tests a special case encountered in persistent 
1658 #                journal mode: If the journal associated with a transaction
1659 #                is smaller than the journal file (because a previous 
1660 #                transaction left a very large non-hot journal file in the
1661 #                file-system), then SQLite has to be careful that there is
1662 #                not a journal-header left over from a previous transaction
1663 #                immediately following the journal content just written.
1664 #                If there is, and the process crashes so that the journal
1665 #                becomes a hot-journal and must be rolled back by another
1666 #                process, there is a danger that the other process may roll
1667 #                back the aborted transaction, then continue copying data
1668 #                from an older transaction from the remainder of the journal.
1669 #                See the syncJournal() function for details.
1671 # pager1-13.2.*: Same test as the previous. This time, throw an index into
1672 #                the mix to make the integrity-check more likely to catch
1673 #                errors.
1675 testvfs tv -default 1
1676 tv script xSyncCb
1677 tv filter xSync
1678 proc xSyncCb {method filename args} {
1679   set t [file tail $filename]
1680   if {$t == "test.db"} faultsim_save
1681   return SQLITE_OK
1683 faultsim_delete_and_reopen
1684 db func a_string a_string
1686 # The UPDATE statement at the end of this test case creates a really big
1687 # journal. Since the cache-size is only 10 pages, the journal contains 
1688 # frequent journal headers.
1690 do_execsql_test pager1-13.1.1 {
1691   PRAGMA page_size = 1024;
1692   PRAGMA journal_mode = PERSIST;
1693   PRAGMA cache_size = 10;
1694   BEGIN;
1695     CREATE TABLE t1(a INTEGER PRIMARY KEY, b BLOB);
1696     INSERT INTO t1 VALUES(NULL, a_string(400));
1697     INSERT INTO t1 SELECT NULL, a_string(400) FROM t1;          /*   2 */
1698     INSERT INTO t1 SELECT NULL, a_string(400) FROM t1;          /*   4 */
1699     INSERT INTO t1 SELECT NULL, a_string(400) FROM t1;          /*   8 */
1700     INSERT INTO t1 SELECT NULL, a_string(400) FROM t1;          /*  16 */
1701     INSERT INTO t1 SELECT NULL, a_string(400) FROM t1;          /*  32 */
1702     INSERT INTO t1 SELECT NULL, a_string(400) FROM t1;          /*  64 */
1703     INSERT INTO t1 SELECT NULL, a_string(400) FROM t1;          /* 128 */
1704   COMMIT;
1705   UPDATE t1 SET b = a_string(400);
1706 } {persist}
1708 if {$::tcl_platform(platform)!="windows"} {
1709 # Run transactions of increasing sizes. Eventually, one (or more than one)
1710 # of these will write just enough content that one of the old headers created 
1711 # by the transaction in the block above lies immediately after the content
1712 # journalled by the current transaction.
1714 for {set nUp 1} {$nUp<64} {incr nUp} {
1715   do_execsql_test pager1-13.1.2.$nUp.1 { 
1716     UPDATE t1 SET b = a_string(399) WHERE a <= $nUp
1717   } {}
1718   do_execsql_test pager1-13.1.2.$nUp.2 { PRAGMA integrity_check } {ok} 
1720   # Try to access the snapshot of the file-system.
1721   #
1722   sqlite3 db2 sv_test.db
1723   do_test pager1-13.1.2.$nUp.3 {
1724     execsql { SELECT sum(length(b)) FROM t1 } db2
1725   } [expr {128*400 - ($nUp-1)}]
1726   do_test pager1-13.1.2.$nUp.4 {
1727     execsql { PRAGMA integrity_check } db2
1728   } {ok}
1729   db2 close
1733 if {$::tcl_platform(platform)!="windows"} {
1734 # Same test as above. But this time with an index on the table.
1736 do_execsql_test pager1-13.2.1 {
1737   CREATE INDEX i1 ON t1(b);
1738   UPDATE t1 SET b = a_string(400);
1739 } {}
1740 for {set nUp 1} {$nUp<64} {incr nUp} {
1741   do_execsql_test pager1-13.2.2.$nUp.1 { 
1742     UPDATE t1 SET b = a_string(399) WHERE a <= $nUp
1743   } {}
1744   do_execsql_test pager1-13.2.2.$nUp.2 { PRAGMA integrity_check } {ok} 
1745   sqlite3 db2 sv_test.db
1746   do_test pager1-13.2.2.$nUp.3 {
1747     execsql { SELECT sum(length(b)) FROM t1 } db2
1748   } [expr {128*400 - ($nUp-1)}]
1749   do_test pager1-13.2.2.$nUp.4 {
1750     execsql { PRAGMA integrity_check } db2
1751   } {ok}
1752   db2 close
1756 db close
1757 tv delete
1759 #-------------------------------------------------------------------------
1760 # Test specal "PRAGMA journal_mode=OFF" test cases.
1762 faultsim_delete_and_reopen
1763 do_execsql_test pager1-14.1.1 {
1764   PRAGMA journal_mode = OFF;
1765   CREATE TABLE t1(a, b);
1766   BEGIN;
1767     INSERT INTO t1 VALUES(1, 2);
1768   COMMIT;
1769   SELECT * FROM t1;
1770 } {off 1 2}
1771 do_catchsql_test pager1-14.1.2 {
1772   BEGIN;
1773     INSERT INTO t1 VALUES(3, 4);
1774   ROLLBACK;
1775 } {0 {}}
1776 do_execsql_test pager1-14.1.3 {
1777   SELECT * FROM t1;
1778 } {1 2}
1779 do_catchsql_test pager1-14.1.4 {
1780   BEGIN;
1781     INSERT INTO t1(rowid, a, b) SELECT a+3, b, b FROM t1;
1782     INSERT INTO t1(rowid, a, b) SELECT a+3, b, b FROM t1;
1783 } {1 {UNIQUE constraint failed: t1.rowid}}
1784 do_execsql_test pager1-14.1.5 {
1785   COMMIT;
1786   SELECT * FROM t1;
1787 } {1 2 2 2}
1789 #-------------------------------------------------------------------------
1790 # Test opening and closing the pager sub-system with different values
1791 # for the sqlite3_vfs.szOsFile variable.
1793 faultsim_delete_and_reopen
1794 do_execsql_test pager1-15.0 {
1795   CREATE TABLE tx(y, z);
1796   INSERT INTO tx VALUES('Ayutthaya', 'Beijing');
1797   INSERT INTO tx VALUES('London', 'Tokyo');
1798 } {}
1799 db close
1800 for {set i 0} {$i<513} {incr i 3} {
1801   testvfs tv -default 1 -szosfile $i
1802   sqlite3 db test.db
1803   do_execsql_test pager1-15.$i.1 {
1804     SELECT * FROM tx;
1805   } {Ayutthaya Beijing London Tokyo}
1806   db close
1807   tv delete
1810 #-------------------------------------------------------------------------
1811 # Check that it is not possible to open a database file if the full path
1812 # to the associated journal file will be longer than sqlite3_vfs.mxPathname.
1814 testvfs tv -default 1
1815 tv script xOpenCb
1816 tv filter xOpen
1817 proc xOpenCb {method filename args} {
1818   set ::file_len [string length $filename]
1820 sqlite3 db test.db
1821 db close
1822 tv delete
1824 for {set ii [expr $::file_len-5]} {$ii < [expr $::file_len+20]} {incr ii} {
1825   testvfs tv -default 1 -mxpathname $ii
1827   # The length of the full path to file "test.db-journal" is ($::file_len+8).
1828   # If the configured sqlite3_vfs.mxPathname value greater than or equal to
1829   # this, then the file can be opened. Otherwise, it cannot.
1830   #
1831   if {$ii >= [expr $::file_len+8]} {
1832     set res {0 {}}
1833   } else {
1834     set res {1 {unable to open database file}}
1835   }
1837   do_test pager1-16.1.$ii {
1838     list [catch { sqlite3 db test.db } msg] $msg
1839   } $res
1841   catch {db close}
1842   tv delete
1846 #-------------------------------------------------------------------------
1847 # Test the pagers response to the b-tree layer requesting illegal page 
1848 # numbers:
1850 #   + The locking page,
1851 #   + Page 0,
1852 #   + A page with a page number greater than (2^31-1).
1854 # These tests will not work if SQLITE_DIRECT_OVERFLOW_READ is defined. In
1855 # that case IO errors are sometimes reported instead of SQLITE_CORRUPT.
1857 ifcapable !direct_read {
1858 do_test pager1-18.1 {
1859   faultsim_delete_and_reopen
1860   db func a_string a_string
1861   execsql { 
1862     PRAGMA page_size = 1024;
1863     CREATE TABLE t1(a, b);
1864     INSERT INTO t1 VALUES(a_string(500), a_string(200));
1865     INSERT INTO t1 SELECT a_string(500), a_string(200) FROM t1;
1866     INSERT INTO t1 SELECT a_string(500), a_string(200) FROM t1;
1867     INSERT INTO t1 SELECT a_string(500), a_string(200) FROM t1;
1868     INSERT INTO t1 SELECT a_string(500), a_string(200) FROM t1;
1869     INSERT INTO t1 SELECT a_string(500), a_string(200) FROM t1;
1870     INSERT INTO t1 SELECT a_string(500), a_string(200) FROM t1;
1871     INSERT INTO t1 SELECT a_string(500), a_string(200) FROM t1;
1872   }
1873 } {}
1874 do_test pager1-18.2 {
1875   set root [db one "SELECT rootpage FROM sqlite_master"]
1876   set lockingpage [expr (0x10000/1024) + 1]
1877   execsql {
1878     PRAGMA writable_schema = 1;
1879     UPDATE sqlite_master SET rootpage = $lockingpage;
1880   }
1881   sqlite3 db2 test.db
1882   catchsql { SELECT count(*) FROM t1 } db2
1883 } {1 {database disk image is malformed}}
1884 db2 close
1885 do_test pager1-18.3.1 {
1886   execsql {
1887     CREATE TABLE t2(x);
1888     INSERT INTO t2 VALUES(a_string(5000));
1889   }
1890   set pgno [expr ([file size test.db] / 1024)-2]
1891   hexio_write test.db [expr ($pgno-1)*1024] 00000000
1892   sqlite3 db2 test.db
1893   # even though x is malformed, because typeof() does
1894   # not load the content of x, the error is not noticed.
1895   catchsql { SELECT typeof(x) FROM t2 } db2
1896 } {0 text}
1897 do_test pager1-18.3.2 {
1898   # in this case, the value of x is loaded and so the error is
1899   # detected
1900   catchsql { SELECT length(x||'') FROM t2 } db2
1901 } {1 {database disk image is malformed}}
1902 db2 close
1903 do_test pager1-18.3.3 {
1904   execsql {
1905     DELETE FROM t2;
1906     INSERT INTO t2 VALUES(randomblob(5000));
1907   }
1908   set pgno [expr ([file size test.db] / 1024)-2]
1909   hexio_write test.db [expr ($pgno-1)*1024] 00000000
1910   sqlite3 db2 test.db
1911   # even though x is malformed, because length() and typeof() do
1912   # not load the content of x, the error is not noticed.
1913   catchsql { SELECT length(x), typeof(x) FROM t2 } db2
1914 } {0 {5000 blob}}
1915 do_test pager1-18.3.4 {
1916   # in this case, the value of x is loaded and so the error is
1917   # detected
1918   catchsql { SELECT length(x||'') FROM t2 } db2
1919 } {1 {database disk image is malformed}}
1920 db2 close
1921 do_test pager1-18.4 {
1922   hexio_write test.db [expr ($pgno-1)*1024] 90000000
1923   sqlite3 db2 test.db
1924   catchsql { SELECT length(x||'') FROM t2 } db2
1925 } {1 {database disk image is malformed}}
1926 db2 close
1927 do_test pager1-18.5 {
1928   sqlite3 db ""
1929   execsql {
1930     CREATE TABLE t1(a, b);
1931     CREATE TABLE t2(a, b);
1932     PRAGMA writable_schema = 1;
1933     UPDATE sqlite_master SET rootpage=5 WHERE tbl_name = 't1';
1934     PRAGMA writable_schema = 0;
1935     ALTER TABLE t1 RENAME TO x1;
1936   }
1937   catchsql { SELECT * FROM x1 }
1938 } {1 {database disk image is malformed}}
1939 db close
1941 do_test pager1-18.6 {
1942   faultsim_delete_and_reopen
1943   db func a_string a_string
1944   execsql {
1945     PRAGMA page_size = 1024;
1946     CREATE TABLE t1(x);
1947     INSERT INTO t1 VALUES(a_string(800));
1948     INSERT INTO t1 VALUES(a_string(800));
1949   }
1951   set root [db one "SELECT rootpage FROM sqlite_master"]
1952   db close
1954   hexio_write test.db [expr ($root-1)*1024 + 8] 00000000
1955   sqlite3 db test.db
1956   catchsql { SELECT length(x) FROM t1 }
1957 } {1 {database disk image is malformed}}
1960 do_test pager1-19.1 {
1961   sqlite3 db ""
1962   db func a_string a_string
1963   execsql {
1964     PRAGMA page_size = 512;
1965     PRAGMA auto_vacuum = 1;
1966     CREATE TABLE t1(aa, ab, ac, ad, ae, af, ag, ah, ai, aj, ak, al, am, an,
1967                     ba, bb, bc, bd, be, bf, bg, bh, bi, bj, bk, bl, bm, bn,
1968                     ca, cb, cc, cd, ce, cf, cg, ch, ci, cj, ck, cl, cm, cn,
1969                     da, db, dc, dd, de, df, dg, dh, di, dj, dk, dl, dm, dn,
1970                     ea, eb, ec, ed, ee, ef, eg, eh, ei, ej, ek, el, em, en,
1971                     fa, fb, fc, fd, fe, ff, fg, fh, fi, fj, fk, fl, fm, fn,
1972                     ga, gb, gc, gd, ge, gf, gg, gh, gi, gj, gk, gl, gm, gn,
1973                     ha, hb, hc, hd, he, hf, hg, hh, hi, hj, hk, hl, hm, hn,
1974                     ia, ib, ic, id, ie, if, ig, ih, ii, ij, ik, il, im, ix,
1975                     ja, jb, jc, jd, je, jf, jg, jh, ji, jj, jk, jl, jm, jn,
1976                     ka, kb, kc, kd, ke, kf, kg, kh, ki, kj, kk, kl, km, kn,
1977                     la, lb, lc, ld, le, lf, lg, lh, li, lj, lk, ll, lm, ln,
1978                     ma, mb, mc, md, me, mf, mg, mh, mi, mj, mk, ml, mm, mn
1979     );
1980     CREATE TABLE t2(aa, ab, ac, ad, ae, af, ag, ah, ai, aj, ak, al, am, an,
1981                     ba, bb, bc, bd, be, bf, bg, bh, bi, bj, bk, bl, bm, bn,
1982                     ca, cb, cc, cd, ce, cf, cg, ch, ci, cj, ck, cl, cm, cn,
1983                     da, db, dc, dd, de, df, dg, dh, di, dj, dk, dl, dm, dn,
1984                     ea, eb, ec, ed, ee, ef, eg, eh, ei, ej, ek, el, em, en,
1985                     fa, fb, fc, fd, fe, ff, fg, fh, fi, fj, fk, fl, fm, fn,
1986                     ga, gb, gc, gd, ge, gf, gg, gh, gi, gj, gk, gl, gm, gn,
1987                     ha, hb, hc, hd, he, hf, hg, hh, hi, hj, hk, hl, hm, hn,
1988                     ia, ib, ic, id, ie, if, ig, ih, ii, ij, ik, il, im, ix,
1989                     ja, jb, jc, jd, je, jf, jg, jh, ji, jj, jk, jl, jm, jn,
1990                     ka, kb, kc, kd, ke, kf, kg, kh, ki, kj, kk, kl, km, kn,
1991                     la, lb, lc, ld, le, lf, lg, lh, li, lj, lk, ll, lm, ln,
1992                     ma, mb, mc, md, me, mf, mg, mh, mi, mj, mk, ml, mm, mn
1993     );
1994     INSERT INTO t1(aa) VALUES( a_string(100000) );
1995     INSERT INTO t2(aa) VALUES( a_string(100000) );
1996     VACUUM;
1997   }
1998 } {}
2000 #-------------------------------------------------------------------------
2001 # Test a couple of special cases that come up while committing 
2002 # transactions:
2004 #   pager1-20.1.*: Committing an in-memory database transaction when the 
2005 #                  database has not been modified at all.
2007 #   pager1-20.2.*: As above, but with a normal db in exclusive-locking mode.
2009 #   pager1-20.3.*: Committing a transaction in WAL mode where the database has
2010 #                  been modified, but all dirty pages have been flushed to 
2011 #                  disk before the commit.
2013 do_test pager1-20.1.1 {
2014   catch {db close}
2015   sqlite3 db :memory:
2016   execsql {
2017     CREATE TABLE one(two, three);
2018     INSERT INTO one VALUES('a', 'b');
2019   }
2020 } {}
2021 do_test pager1-20.1.2 {
2022   execsql {
2023     BEGIN EXCLUSIVE;
2024     COMMIT;
2025   }
2026 } {}
2028 do_test pager1-20.2.1 {
2029   faultsim_delete_and_reopen
2030   execsql {
2031     PRAGMA locking_mode = exclusive;
2032     PRAGMA journal_mode = persist;
2033     CREATE TABLE one(two, three);
2034     INSERT INTO one VALUES('a', 'b');
2035   }
2036 } {exclusive persist}
2037 do_test pager1-20.2.2 {
2038   execsql {
2039     BEGIN EXCLUSIVE;
2040     COMMIT;
2041   }
2042 } {}
2044 ifcapable wal {
2045   do_test pager1-20.3.1 {
2046     faultsim_delete_and_reopen
2047     db func a_string a_string
2048     execsql {
2049       PRAGMA cache_size = 10;
2050       PRAGMA journal_mode = wal;
2051       BEGIN;
2052         CREATE TABLE t1(x);
2053         CREATE TABLE t2(y);
2054         INSERT INTO t1 VALUES(a_string(800));
2055         INSERT INTO t1 SELECT a_string(800) FROM t1;         /*   2 */
2056         INSERT INTO t1 SELECT a_string(800) FROM t1;         /*   4 */
2057         INSERT INTO t1 SELECT a_string(800) FROM t1;         /*   8 */
2058         INSERT INTO t1 SELECT a_string(800) FROM t1;         /*  16 */
2059         INSERT INTO t1 SELECT a_string(800) FROM t1;         /*  32 */
2060       COMMIT;
2061     }
2062   } {wal}
2063   do_test pager1-20.3.2 {
2064     execsql {
2065       BEGIN;
2066       INSERT INTO t2 VALUES('xxxx');
2067     }
2068     recursive_select 32 t1
2069     execsql COMMIT
2070   } {}
2073 #-------------------------------------------------------------------------
2074 # Test that a WAL database may not be opened if:
2076 #   pager1-21.1.*: The VFS has an iVersion less than 2, or
2077 #   pager1-21.2.*: The VFS does not provide xShmXXX() methods.
2079 ifcapable wal {
2080   do_test pager1-21.0 {
2081     faultsim_delete_and_reopen
2082     execsql {
2083       PRAGMA journal_mode = WAL;
2084       CREATE TABLE ko(c DEFAULT 'abc', b DEFAULT 'def');
2085       INSERT INTO ko DEFAULT VALUES;
2086     }
2087   } {wal}
2088   do_test pager1-21.1 {
2089     testvfs tv -noshm 1
2090     sqlite3 db2 test.db -vfs tv
2091     catchsql { SELECT * FROM ko } db2
2092   } {1 {unable to open database file}}
2093   db2 close
2094   tv delete
2095   do_test pager1-21.2 {
2096     testvfs tv -iversion 1
2097     sqlite3 db2 test.db -vfs tv
2098     catchsql { SELECT * FROM ko } db2
2099   } {1 {unable to open database file}}
2100   db2 close
2101   tv delete
2104 #-------------------------------------------------------------------------
2105 # Test that a "PRAGMA wal_checkpoint":
2107 #   pager1-22.1.*: is a no-op on a non-WAL db, and
2108 #   pager1-22.2.*: does not cause xSync calls with a synchronous=off db.
2110 ifcapable wal {
2111   do_test pager1-22.1.1 {
2112     faultsim_delete_and_reopen
2113     execsql {
2114       CREATE TABLE ko(c DEFAULT 'abc', b DEFAULT 'def');
2115       INSERT INTO ko DEFAULT VALUES;
2116     }
2117     execsql { PRAGMA wal_checkpoint }
2118   } {0 -1 -1}
2119   do_test pager1-22.2.1 {
2120     testvfs tv -default 1
2121     tv filter xSync
2122     tv script xSyncCb
2123     proc xSyncCb {args} {incr ::synccount}
2124     set ::synccount 0
2125     sqlite3 db test.db
2126     execsql {
2127       PRAGMA synchronous = off;
2128       PRAGMA journal_mode = WAL;
2129       INSERT INTO ko DEFAULT VALUES;
2130     }
2131     execsql { PRAGMA wal_checkpoint }
2132     set synccount
2133   } {0}
2134   db close
2135   tv delete
2138 #-------------------------------------------------------------------------
2139 # Tests for changing journal mode.
2141 #   pager1-23.1.*: Test that when changing from PERSIST to DELETE mode,
2142 #                  the journal file is deleted.
2144 #   pager1-23.2.*: Same test as above, but while a shared lock is held
2145 #                  on the database file.
2147 #   pager1-23.3.*: Same test as above, but while a reserved lock is held
2148 #                  on the database file.
2150 #   pager1-23.4.*: And, for fun, while holding an exclusive lock.
2152 #   pager1-23.5.*: Try to set various different journal modes with an
2153 #                  in-memory database (only MEMORY and OFF should work).
2155 #   pager1-23.6.*: Try to set locking_mode=normal on an in-memory database
2156 #                  (doesn't work - in-memory databases always use
2157 #                  locking_mode=exclusive).
2159 do_test pager1-23.1.1 {
2160   faultsim_delete_and_reopen
2161   execsql {
2162     PRAGMA journal_mode = PERSIST;
2163     CREATE TABLE t1(a, b);
2164   }
2165   file exists test.db-journal
2166 } {1}
2167 do_test pager1-23.1.2 {
2168   execsql { PRAGMA journal_mode = DELETE }
2169   file exists test.db-journal
2170 } {0}
2172 do_test pager1-23.2.1 {
2173   execsql {
2174     PRAGMA journal_mode = PERSIST;
2175     INSERT INTO t1 VALUES('Canberra', 'ACT');
2176   }
2177   db eval { SELECT * FROM t1 } {
2178     db eval { PRAGMA journal_mode = DELETE }
2179   }
2180   execsql { PRAGMA journal_mode }
2181 } {delete}
2182 do_test pager1-23.2.2 {
2183   file exists test.db-journal
2184 } {0}
2186 do_test pager1-23.3.1 {
2187   execsql {
2188     PRAGMA journal_mode = PERSIST;
2189     INSERT INTO t1 VALUES('Darwin', 'NT');
2190     BEGIN IMMEDIATE;
2191   }
2192   db eval { PRAGMA journal_mode = DELETE }
2193   execsql { PRAGMA journal_mode }
2194 } {delete}
2195 do_test pager1-23.3.2 {
2196   file exists test.db-journal
2197 } {0}
2198 do_test pager1-23.3.3 {
2199   execsql COMMIT
2200 } {}
2202 do_test pager1-23.4.1 {
2203   execsql {
2204     PRAGMA journal_mode = PERSIST;
2205     INSERT INTO t1 VALUES('Adelaide', 'SA');
2206     BEGIN EXCLUSIVE;
2207   }
2208   db eval { PRAGMA journal_mode = DELETE }
2209   execsql { PRAGMA journal_mode }
2210 } {delete}
2211 do_test pager1-23.4.2 {
2212   file exists test.db-journal
2213 } {0}
2214 do_test pager1-23.4.3 {
2215   execsql COMMIT
2216 } {}
2218 do_test pager1-23.5.1 {
2219   faultsim_delete_and_reopen
2220   sqlite3 db :memory:
2221 } {}
2222 foreach {tn mode possible} {
2223   2  off      1
2224   3  memory   1
2225   4  persist  0
2226   5  delete   0
2227   6  wal      0
2228   7  truncate 0
2229 } {
2230   do_test pager1-23.5.$tn.1 {
2231     execsql "PRAGMA journal_mode = off"
2232     execsql "PRAGMA journal_mode = $mode"
2233   } [if $possible {list $mode} {list off}]
2234   do_test pager1-23.5.$tn.2 {
2235     execsql "PRAGMA journal_mode = memory"
2236     execsql "PRAGMA journal_mode = $mode"
2237   } [if $possible {list $mode} {list memory}]
2239 do_test pager1-23.6.1 {
2240   execsql {PRAGMA locking_mode = normal}
2241 } {exclusive}
2242 do_test pager1-23.6.2 {
2243   execsql {PRAGMA locking_mode = exclusive}
2244 } {exclusive}
2245 do_test pager1-23.6.3 {
2246   execsql {PRAGMA locking_mode}
2247 } {exclusive}
2248 do_test pager1-23.6.4 {
2249   execsql {PRAGMA main.locking_mode}
2250 } {exclusive}
2252 #-------------------------------------------------------------------------
2254 do_test pager1-24.1.1 {
2255   faultsim_delete_and_reopen
2256   db func a_string a_string
2257   execsql {
2258     PRAGMA cache_size = 10;
2259     PRAGMA auto_vacuum = FULL;
2260     CREATE TABLE x1(x, y, z, PRIMARY KEY(y, z));
2261     CREATE TABLE x2(x, y, z, PRIMARY KEY(y, z));
2262     INSERT INTO x2 VALUES(a_string(400), a_string(500), a_string(600));
2263     INSERT INTO x2 SELECT a_string(600), a_string(400), a_string(500) FROM x2;
2264     INSERT INTO x2 SELECT a_string(500), a_string(600), a_string(400) FROM x2;
2265     INSERT INTO x2 SELECT a_string(400), a_string(500), a_string(600) FROM x2;
2266     INSERT INTO x2 SELECT a_string(600), a_string(400), a_string(500) FROM x2;
2267     INSERT INTO x2 SELECT a_string(500), a_string(600), a_string(400) FROM x2;
2268     INSERT INTO x2 SELECT a_string(400), a_string(500), a_string(600) FROM x2;
2269     INSERT INTO x1 SELECT * FROM x2;
2270   }
2271 } {}
2272 do_test pager1-24.1.2 {
2273   execsql {
2274     BEGIN;
2275       DELETE FROM x1 WHERE rowid<32;
2276   }
2277   recursive_select 64 x2
2278 } {}
2279 do_test pager1-24.1.3 {
2280   execsql { 
2281       UPDATE x1 SET z = a_string(300) WHERE rowid>40;
2282     COMMIT;
2283     PRAGMA integrity_check;
2284     SELECT count(*) FROM x1;
2285   }
2286 } {ok 33}
2288 do_test pager1-24.1.4 {
2289   execsql {
2290     DELETE FROM x1;
2291     INSERT INTO x1 SELECT * FROM x2;
2292     BEGIN;
2293       DELETE FROM x1 WHERE rowid<32;
2294       UPDATE x1 SET z = a_string(299) WHERE rowid>40;
2295   }
2296   recursive_select 64 x2 {db eval COMMIT}
2297   execsql {
2298     PRAGMA integrity_check;
2299     SELECT count(*) FROM x1;
2300   }
2301 } {ok 33}
2303 do_test pager1-24.1.5 {
2304   execsql {
2305     DELETE FROM x1;
2306     INSERT INTO x1 SELECT * FROM x2;
2307   }
2308   recursive_select 64 x2 { db eval {CREATE TABLE x3(x, y, z)} }
2309   execsql { SELECT * FROM x3 }
2310 } {}
2312 #-------------------------------------------------------------------------
2314 do_test pager1-25-1 {
2315   faultsim_delete_and_reopen
2316   execsql {
2317     BEGIN;
2318       SAVEPOINT abc;
2319         CREATE TABLE t1(a, b);
2320       ROLLBACK TO abc;
2321     COMMIT;
2322   }
2323   db close
2324 } {}
2325 do_test pager1-25-2 {
2326   faultsim_delete_and_reopen
2327   execsql {
2328     SAVEPOINT abc;
2329       CREATE TABLE t1(a, b);
2330     ROLLBACK TO abc;
2331     COMMIT;
2332   }
2333   db close
2334 } {}
2336 #-------------------------------------------------------------------------
2337 # Sector-size tests.
2339 do_test pager1-26.1 {
2340   testvfs tv -default 1
2341   tv sectorsize 4096
2342   faultsim_delete_and_reopen
2343   db func a_string a_string
2344   execsql {
2345     PRAGMA page_size = 512;
2346     CREATE TABLE tbl(a PRIMARY KEY, b UNIQUE);
2347     BEGIN;
2348       INSERT INTO tbl VALUES(a_string(25), a_string(600));
2349       INSERT INTO tbl SELECT a_string(25), a_string(600) FROM tbl;
2350       INSERT INTO tbl SELECT a_string(25), a_string(600) FROM tbl;
2351       INSERT INTO tbl SELECT a_string(25), a_string(600) FROM tbl;
2352       INSERT INTO tbl SELECT a_string(25), a_string(600) FROM tbl;
2353       INSERT INTO tbl SELECT a_string(25), a_string(600) FROM tbl;
2354       INSERT INTO tbl SELECT a_string(25), a_string(600) FROM tbl;
2355       INSERT INTO tbl SELECT a_string(25), a_string(600) FROM tbl;
2356     COMMIT;
2357   }
2358 } {}
2359 do_execsql_test pager1-26.1 {
2360   UPDATE tbl SET b = a_string(550);
2361 } {}
2362 db close
2363 tv delete
2365 #-------------------------------------------------------------------------
2367 do_test pager1.27.1 {
2368   faultsim_delete_and_reopen
2369   sqlite3_pager_refcounts db
2370   execsql {
2371     BEGIN;
2372       CREATE TABLE t1(a, b);
2373   }
2374   sqlite3_pager_refcounts db
2375   execsql COMMIT
2376 } {}
2378 #-------------------------------------------------------------------------
2379 # Test that attempting to open a write-transaction with 
2380 # locking_mode=exclusive in WAL mode fails if there are other clients on 
2381 # the same database.
2383 catch { db close }
2384 ifcapable wal {
2385   do_multiclient_test tn {
2386     do_test pager1-28.$tn.1 {
2387       sql1 { 
2388         PRAGMA journal_mode = WAL;
2389         CREATE TABLE t1(a, b);
2390         INSERT INTO t1 VALUES('a', 'b');
2391       }
2392     } {wal}
2393     do_test pager1-28.$tn.2 { sql2 { SELECT * FROM t1 } } {a b}
2395     do_test pager1-28.$tn.3 { sql1 { PRAGMA locking_mode=exclusive } } {exclusive}
2396     do_test pager1-28.$tn.4 { 
2397       csql1 { BEGIN; INSERT INTO t1 VALUES('c', 'd'); }
2398     } {1 {database is locked}}
2399     code2 { db2 close ; sqlite3 db2 test.db }
2400     do_test pager1-28.$tn.4 { 
2401       sql1 { INSERT INTO t1 VALUES('c', 'd'); COMMIT }
2402     } {}
2403   }
2406 #-------------------------------------------------------------------------
2407 # Normally, when changing from journal_mode=PERSIST to DELETE the pager
2408 # attempts to delete the journal file. However, if it cannot obtain a
2409 # RESERVED lock on the database file, this step is skipped.
2411 do_multiclient_test tn {
2412   do_test pager1-28.$tn.1 {
2413     sql1 { 
2414       PRAGMA journal_mode = PERSIST;
2415       CREATE TABLE t1(a, b);
2416       INSERT INTO t1 VALUES('a', 'b');
2417     }
2418   } {persist}
2419   do_test pager1-28.$tn.2 { file exists test.db-journal } 1
2420   do_test pager1-28.$tn.3 { sql1 { PRAGMA journal_mode = DELETE } } delete
2421   do_test pager1-28.$tn.4 { file exists test.db-journal } 0
2423   do_test pager1-28.$tn.5 {
2424     sql1 { 
2425       PRAGMA journal_mode = PERSIST;
2426       INSERT INTO t1 VALUES('c', 'd');
2427     }
2428   } {persist}
2429   do_test pager1-28.$tn.6 { file exists test.db-journal } 1
2430   do_test pager1-28.$tn.7 {
2431     sql2 { BEGIN; INSERT INTO t1 VALUES('e', 'f'); }
2432   } {}
2433   do_test pager1-28.$tn.8  { file exists test.db-journal } 1
2434   do_test pager1-28.$tn.9  { sql1 { PRAGMA journal_mode = DELETE } } delete
2435   do_test pager1-28.$tn.10 { file exists test.db-journal } 1
2437   do_test pager1-28.$tn.11 { sql2 COMMIT } {}
2438   do_test pager1-28.$tn.12 { file exists test.db-journal } 0
2440   do_test pager1-28-$tn.13 {
2441     code1 { set channel [db incrblob -readonly t1 a 2] }
2442     sql1 {
2443       PRAGMA journal_mode = PERSIST;
2444       INSERT INTO t1 VALUES('g', 'h');
2445     }
2446   } {persist}
2447   do_test pager1-28.$tn.14 { file exists test.db-journal } 1
2448   do_test pager1-28.$tn.15 {
2449     sql2 { BEGIN; INSERT INTO t1 VALUES('e', 'f'); }
2450   } {}
2451   do_test pager1-28.$tn.16 { sql1 { PRAGMA journal_mode = DELETE } } delete
2452   do_test pager1-28.$tn.17 { file exists test.db-journal } 1
2454   do_test pager1-28.$tn.17 { csql2 { COMMIT } } {1 {database is locked}}
2455   do_test pager1-28-$tn.18 { code1 { read $channel } } c
2456   do_test pager1-28-$tn.19 { code1 { close $channel } } {}
2457   do_test pager1-28.$tn.20 { sql2 { COMMIT } } {}
2460 do_test pager1-29.1 {
2461   faultsim_delete_and_reopen
2462   execsql {
2463     PRAGMA page_size = 1024;
2464     PRAGMA auto_vacuum = full;
2465     PRAGMA locking_mode=exclusive;
2466     CREATE TABLE t1(a, b);
2467     INSERT INTO t1 VALUES(1, 2);
2468   }
2469   file size test.db
2470 } [expr 1024*3]
2471 if {[nonzero_reserved_bytes]} {
2472   # VACUUM with size changes is not possible with the codec.
2473   do_test pager1-29.2 {
2474     catchsql {
2475       PRAGMA page_size = 4096;
2476       VACUUM;
2477     }
2478   } {1 {attempt to write a readonly database}}
2479 } else {
2480   do_test pager1-29.2 {
2481     execsql {
2482       PRAGMA page_size = 4096;
2483       VACUUM;
2484     }
2485     file size test.db
2486   } [expr 4096*3]
2489 #-------------------------------------------------------------------------
2490 # Test that if an empty database file (size 0 bytes) is opened in 
2491 # exclusive-locking mode, any journal file is deleted from the file-system
2492 # without being rolled back. And that the RESERVED lock obtained while
2493 # doing this is not released.
2495 do_test pager1-30.1 {
2496   db close
2497   delete_file test.db
2498   delete_file test.db-journal
2499   set fd [open test.db-journal w]
2500   seek $fd [expr 512+1032*2]
2501   puts -nonewline $fd x
2502   close $fd
2504   sqlite3 db test.db
2505   execsql {
2506     PRAGMA locking_mode=EXCLUSIVE;
2507     SELECT count(*) FROM sqlite_master;
2508     PRAGMA lock_status;
2509   }
2510 } {exclusive 0 main reserved temp closed}
2512 #-------------------------------------------------------------------------
2513 # Test that if the "page-size" field in a journal-header is 0, the journal
2514 # file can still be rolled back. This is required for backward compatibility -
2515 # versions of SQLite prior to 3.5.8 always set this field to zero.
2517 if {$tcl_platform(platform)=="unix"} {
2518 do_test pager1-31.1 {
2519   faultsim_delete_and_reopen
2520   execsql {
2521     PRAGMA cache_size = 10;
2522     PRAGMA page_size = 1024;
2523     CREATE TABLE t1(x, y, UNIQUE(x, y));
2524     INSERT INTO t1 VALUES(randomblob(1500), randomblob(1500));
2525     INSERT INTO t1 SELECT randomblob(1500), randomblob(1500) FROM t1;
2526     INSERT INTO t1 SELECT randomblob(1500), randomblob(1500) FROM t1;
2527     INSERT INTO t1 SELECT randomblob(1500), randomblob(1500) FROM t1;
2528     INSERT INTO t1 SELECT randomblob(1500), randomblob(1500) FROM t1;
2529     INSERT INTO t1 SELECT randomblob(1500), randomblob(1500) FROM t1;
2530     INSERT INTO t1 SELECT randomblob(1500), randomblob(1500) FROM t1;
2531     INSERT INTO t1 SELECT randomblob(1500), randomblob(1500) FROM t1;
2532     INSERT INTO t1 SELECT randomblob(1500), randomblob(1500) FROM t1;
2533     INSERT INTO t1 SELECT randomblob(1500), randomblob(1500) FROM t1;
2534     INSERT INTO t1 SELECT randomblob(1500), randomblob(1500) FROM t1;
2535     BEGIN;
2536       UPDATE t1 SET y = randomblob(1499);
2537   }
2538   copy_file test.db test.db2
2539   copy_file test.db-journal test.db2-journal
2540   
2541   hexio_write test.db2-journal 24 00000000
2542   sqlite3 db2 test.db2
2543   execsql { PRAGMA integrity_check } db2
2544 } {ok}
2547 #-------------------------------------------------------------------------
2548 # Test that a database file can be "pre-hinted" to a certain size and that
2549 # subsequent spilling of the pager cache does not result in the database
2550 # file being shrunk.
2552 catch {db close}
2553 forcedelete test.db
2555 do_test pager1-32.1 {
2556   sqlite3 db test.db
2557   execsql {
2558     CREATE TABLE t1(x, y);
2559   }
2560   db close
2561   sqlite3 db test.db
2562   execsql {
2563     BEGIN;
2564     INSERT INTO t1 VALUES(1, randomblob(10000));
2565   }
2566   file_control_chunksize_test db main 1024
2567   file_control_sizehint_test db main 20971520; # 20MB
2568   execsql {
2569     PRAGMA cache_size = 10;
2570     INSERT INTO t1 VALUES(1, randomblob(10000));
2571     INSERT INTO t1 VALUES(2, randomblob(10000));
2572     INSERT INTO t1 SELECT x+2, randomblob(10000) from t1;
2573     INSERT INTO t1 SELECT x+4, randomblob(10000) from t1;
2574     INSERT INTO t1 SELECT x+8, randomblob(10000) from t1;
2575     INSERT INTO t1 SELECT x+16, randomblob(10000) from t1;
2576     SELECT count(*) FROM t1;
2577     COMMIT;
2578   }
2579   db close
2580   file size test.db
2581 } {20971520}
2583 # Cleanup 20MB file left by the previous test.
2584 forcedelete test.db
2586 #-------------------------------------------------------------------------
2587 # Test that if a transaction is committed in journal_mode=DELETE mode,
2588 # and the call to unlink() returns an ENOENT error, the COMMIT does not
2589 # succeed.
2591 if {$::tcl_platform(platform)=="unix"} {
2592   do_test pager1-33.1 {
2593     sqlite3 db test.db
2594     execsql {
2595       CREATE TABLE t1(x);
2596       INSERT INTO t1 VALUES('one');
2597       INSERT INTO t1 VALUES('two');
2598       BEGIN;
2599         INSERT INTO t1 VALUES('three');
2600         INSERT INTO t1 VALUES('four');
2601     }
2602     forcedelete bak-journal
2603     file rename test.db-journal bak-journal
2605     catchsql COMMIT
2606   } {1 {disk I/O error}}
2608   do_test pager1-33.2 {
2609     file rename bak-journal test.db-journal
2610     execsql { SELECT * FROM t1 }
2611   } {one two}
2614 #-------------------------------------------------------------------------
2615 # Test that appending pages to the database file then moving those pages
2616 # to the free-list before the transaction is committed does not cause
2617 # an error.
2619 foreach {tn pragma strsize} {
2620   1 { PRAGMA mmap_size = 0 } 2400
2621   2 { }                       2400
2622   3 { PRAGMA mmap_size = 0 } 4400
2623   4 { }                       4400
2624 } {
2625   reset_db
2626   db func a_string a_string
2627   db eval $pragma
2628   do_execsql_test 34.$tn.1 {
2629     CREATE TABLE t1(a, b);
2630     INSERT INTO t1 VALUES(1, 2);
2631   }
2632   do_execsql_test 34.$tn.2 {
2633     BEGIN;
2634     INSERT INTO t1 VALUES(2, a_string($strsize));
2635     DELETE FROM t1 WHERE oid=2;
2636     COMMIT;
2637     PRAGMA integrity_check;
2638   } {ok}
2641 #-------------------------------------------------------------------------
2643 reset_db
2644 do_test 35 {
2645   sqlite3 db test.db
2647   execsql {
2648     CREATE TABLE t1(x, y);
2649     PRAGMA journal_mode = WAL;
2650     INSERT INTO t1 VALUES(1, 2);
2651   }
2653   execsql {
2654     BEGIN;
2655       CREATE TABLE t2(a, b);
2656   }
2658   hexio_write test.db-shm [expr 16*1024] [string repeat 0055 8192]
2659   catchsql ROLLBACK
2660 } {0 {}}
2662 do_multiclient_test tn {
2663   sql1 {
2664     PRAGMA auto_vacuum = 0;
2665     CREATE TABLE t1(x, y);
2666     INSERT INTO t1 VALUES(1, 2);
2667   }
2669   do_test 36.$tn.1 { 
2670     sql2 { PRAGMA max_page_count = 2 }
2671     list [catch { sql2 { CREATE TABLE t2(x) } } msg] $msg
2672   } {1 {database or disk is full}}
2674   sql1 { PRAGMA checkpoint_fullfsync = 1 }
2675   sql1 { CREATE TABLE t2(x) }
2677   do_test 36.$tn.2 { 
2678     sql2 { INSERT INTO t2 VALUES('xyz') }
2679     list [catch { sql2 { CREATE TABLE t3(x) } } msg] $msg
2680   } {1 {database or disk is full}}
2683 forcedelete test1 test2
2684 foreach {tn uri} {
2685   1   {file:?mode=memory&cache=shared}
2686   2   {file:one?mode=memory&cache=shared}
2687   3   {file:test1?cache=shared}
2688   4   {file:test2?another=parameter&yet=anotherone}
2689 } {
2690   do_test 37.$tn {
2691     catch { db close }
2692     sqlite3_shutdown
2693     sqlite3_config_uri 1
2694     sqlite3 db $uri
2696     db eval {
2697       CREATE TABLE t1(x);
2698       INSERT INTO t1 VALUES(1);
2699       SELECT * FROM t1;
2700     }
2701   } {1}
2703   do_execsql_test 37.$tn.2 {
2704     VACUUM;
2705     SELECT * FROM t1;
2706   } {1}
2708   db close
2709   sqlite3_shutdown
2710   sqlite3_config_uri 0
2713 do_test 38.1 {
2714   catch { db close }
2715   forcedelete test.db
2716   set fd [open test.db w]
2717   puts $fd "hello world"
2718   close $fd
2719   sqlite3 db test.db
2720   catchsql { CREATE TABLE t1(x) }
2721 } {1 {file is not a database}}
2722 do_test 38.2 {
2723   catch { db close }
2724   forcedelete test.db
2725 } {}
2727 do_test 39.1 {
2728   sqlite3 db test.db
2729   execsql {
2730     PRAGMA auto_vacuum = 1;
2731     CREATE TABLE t1(x);
2732     INSERT INTO t1 VALUES('xxx');
2733     INSERT INTO t1 VALUES('two');
2734     INSERT INTO t1 VALUES(randomblob(400));
2735     INSERT INTO t1 VALUES(randomblob(400));
2736     INSERT INTO t1 VALUES(randomblob(400));
2737     INSERT INTO t1 VALUES(randomblob(400));
2738     BEGIN;
2739     UPDATE t1 SET x = 'one' WHERE rowid=1;
2740   }
2741   set ::stmt [sqlite3_prepare db "SELECT * FROM t1 ORDER BY rowid" -1 dummy]
2742   sqlite3_step $::stmt
2743   sqlite3_column_text $::stmt 0
2744 } {one}
2745 do_test 39.2 {
2746   execsql { CREATE TABLE t2(x) }
2747   sqlite3_step $::stmt
2748   sqlite3_column_text $::stmt 0
2749 } {two}
2750 do_test 39.3 {
2751   sqlite3_finalize $::stmt
2752   execsql COMMIT
2753 } {}
2755 do_execsql_test 39.4 {
2756   PRAGMA auto_vacuum = 2;
2757   CREATE TABLE t3(x);
2758   CREATE TABLE t4(x);
2760   DROP TABLE t2;
2761   DROP TABLE t3;
2762   DROP TABLE t4;
2764 do_test 39.5 {
2765   db close
2766   sqlite3 db test.db
2767   execsql {
2768     PRAGMA cache_size = 1;
2769     PRAGMA incremental_vacuum;
2770     PRAGMA integrity_check;
2771   }
2772 } {ok}
2774 do_test 40.1 {
2775   reset_db
2776   execsql {
2777     PRAGMA auto_vacuum = 1;
2778     CREATE TABLE t1(x PRIMARY KEY);
2779     INSERT INTO t1 VALUES(randomblob(1200));
2780     PRAGMA page_count;
2781   }
2782 } {6}
2783 do_test 40.2 {
2784   execsql {
2785     INSERT INTO t1 VALUES(randomblob(1200));
2786     INSERT INTO t1 VALUES(randomblob(1200));
2787     INSERT INTO t1 VALUES(randomblob(1200));
2788   }
2789 } {}
2790 do_test 40.3 {
2791   db close
2792   sqlite3 db test.db
2793   execsql {
2794     PRAGMA cache_size = 1;
2795     CREATE TABLE t2(x);
2796     PRAGMA integrity_check;
2797   }
2798 } {ok}
2800 do_test 41.1 {
2801   reset_db
2802   execsql {
2803     CREATE TABLE t1(x PRIMARY KEY);
2804     INSERT INTO t1 VALUES(randomblob(200));
2805     INSERT INTO t1 SELECT randomblob(200) FROM t1;
2806     INSERT INTO t1 SELECT randomblob(200) FROM t1;
2807     INSERT INTO t1 SELECT randomblob(200) FROM t1;
2808     INSERT INTO t1 SELECT randomblob(200) FROM t1;
2809     INSERT INTO t1 SELECT randomblob(200) FROM t1;
2810     INSERT INTO t1 SELECT randomblob(200) FROM t1;
2811   }
2812 } {}
2813 do_test 41.2 {
2814   testvfs tv -default 1
2815   tv sectorsize 16384;
2816   tv devchar [list]
2817   db close
2818   sqlite3 db test.db
2819   execsql {
2820     PRAGMA cache_size = 1;
2821     DELETE FROM t1 WHERE rowid%4;
2822     PRAGMA integrity_check;
2823   }
2824 } {ok}
2825 db close
2826 tv delete
2828 set pending_prev [sqlite3_test_control_pending_byte 0x1000000]
2829 do_test 42.1 {
2830   reset_db
2831   execsql {
2832     CREATE TABLE t1(x, y);
2833     INSERT INTO t1 VALUES(randomblob(200), randomblob(200));
2834     INSERT INTO t1 SELECT randomblob(200), randomblob(200) FROM t1;
2835     INSERT INTO t1 SELECT randomblob(200), randomblob(200) FROM t1;
2836     INSERT INTO t1 SELECT randomblob(200), randomblob(200) FROM t1;
2837     INSERT INTO t1 SELECT randomblob(200), randomblob(200) FROM t1;
2838     INSERT INTO t1 SELECT randomblob(200), randomblob(200) FROM t1;
2839     INSERT INTO t1 SELECT randomblob(200), randomblob(200) FROM t1;
2840     INSERT INTO t1 SELECT randomblob(200), randomblob(200) FROM t1;
2841     INSERT INTO t1 SELECT randomblob(200), randomblob(200) FROM t1;
2842     INSERT INTO t1 SELECT randomblob(200), randomblob(200) FROM t1;
2843   }
2844   db close
2845   sqlite3_test_control_pending_byte 0x0010000
2846   sqlite3 db test.db
2847   db eval { PRAGMA mmap_size = 0 }
2848   catchsql { SELECT sum(length(y)) FROM t1 }
2849 } {1 {database disk image is malformed}}
2850 do_test 42.2 {
2851   reset_db
2852   execsql {
2853     CREATE TABLE t1(x, y);
2854     INSERT INTO t1 VALUES(randomblob(200), randomblob(200));
2855     INSERT INTO t1 SELECT randomblob(200), randomblob(200) FROM t1;
2856     INSERT INTO t1 SELECT randomblob(200), randomblob(200) FROM t1;
2857     INSERT INTO t1 SELECT randomblob(200), randomblob(200) FROM t1;
2858     INSERT INTO t1 SELECT randomblob(200), randomblob(200) FROM t1;
2859     INSERT INTO t1 SELECT randomblob(200), randomblob(200) FROM t1;
2860     INSERT INTO t1 SELECT randomblob(200), randomblob(200) FROM t1;
2861     INSERT INTO t1 SELECT randomblob(200), randomblob(200) FROM t1;
2862     INSERT INTO t1 SELECT randomblob(200), randomblob(200) FROM t1;
2863   }
2864   db close
2866   testvfs tv -default 1
2867   tv sectorsize 16384;
2868   tv devchar [list]
2869   sqlite3 db test.db -vfs tv
2870   execsql { UPDATE t1 SET x = randomblob(200) }
2871 } {}
2872 db close
2873 tv delete
2874 sqlite3_test_control_pending_byte $pending_prev
2876 do_test 43.1 {
2877   reset_db
2878   execsql {
2879     CREATE TABLE t1(x, y);
2880     INSERT INTO t1 VALUES(1, 2);
2881     CREATE TABLE t2(x, y);
2882     INSERT INTO t2 VALUES(1, 2);
2883     CREATE TABLE t3(x, y);
2884     INSERT INTO t3 VALUES(1, 2);
2885   }
2886   db close
2887   sqlite3 db test.db
2889   db eval { PRAGMA mmap_size = 0 }
2890   db eval { SELECT * FROM t1 }
2891   sqlite3_db_status db CACHE_MISS 0
2892 } {0 2 0}
2894 do_test 43.2 {
2895   db eval { SELECT * FROM t2 }
2896   sqlite3_db_status db CACHE_MISS 1
2897 } {0 3 0}
2899 do_test 43.3 {
2900   db eval { SELECT * FROM t3 }
2901   sqlite3_db_status db CACHE_MISS 0
2902 } {0 1 0}
2904 finish_test