Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(218)

Side by Side Diff: third_party/sqlite/sqlite-src-3170000/test/pager1.test

Issue 2747283002: [sql] Import reference version of SQLite 3.17.. (Closed)
Patch Set: Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 # 2010 June 15
2 #
3 # The author disclaims copyright to this source code. In place of
4 # a legal notice, here is a blessing:
5 #
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.
9 #
10 #***********************************************************************
11 #
12
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
19
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).
22 #
23 do_not_use_codec
24
25 #
26 # pager1-1.*: Test inter-process locking (clients in multiple processes).
27 #
28 # pager1-2.*: Test intra-process locking (multiple clients in this process).
29 #
30 # pager1-3.*: Savepoint related tests.
31 #
32 # pager1-4.*: Hot-journal related tests.
33 #
34 # pager1-5.*: Cases related to multi-file commits.
35 #
36 # pager1-6.*: Cases related to "PRAGMA max_page_count"
37 #
38 # pager1-7.*: Cases specific to "PRAGMA journal_mode=TRUNCATE"
39 #
40 # pager1-8.*: Cases using temporary and in-memory databases.
41 #
42 # pager1-9.*: Tests related to the backup API.
43 #
44 # pager1-10.*: Test that the assumed file-system sector-size is limited to
45 # 64KB.
46 #
47 # pager1-12.*: Tests involving "PRAGMA page_size"
48 #
49 # pager1-13.*: Cases specific to "PRAGMA journal_mode=PERSIST"
50 #
51 # pager1-14.*: Cases specific to "PRAGMA journal_mode=OFF"
52 #
53 # pager1-15.*: Varying sqlite3_vfs.szOsFile
54 #
55 # pager1-16.*: Varying sqlite3_vfs.mxPathname
56 #
57 # pager1-17.*: Tests related to "PRAGMA omit_readlock"
58 # (The omit_readlock pragma has been removed and so have
59 # these tests.)
60 #
61 # pager1-18.*: Test that the pager layer responds correctly if the b-tree
62 # requests an invalid page number (due to db corruption).
63 #
64
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 }
72 }
73
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
79 }
80 db func a_string a_string
81
82 do_multiclient_test tn {
83
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}
96
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}
110
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}}
128
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}
136
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 } } {}
144
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}
157
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}
174
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}
181
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}}
198
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}}
206
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}
215
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
225
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}
234 }
235
236 #-------------------------------------------------------------------------
237 # Savepoint related test cases.
238 #
239 # pager1-3.1.2.*: Force a savepoint rollback to cause the database file
240 # to grow.
241 #
242 # pager1-3.1.3.*: Use a journal created in synchronous=off mode as part
243 # of a savepoint rollback.
244 #
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}
263
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 } {}
278
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}
333
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}
342
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}
353
354 do_execsql_test pager1-3.$tn.6 {
355 SAVEPOINT one;
356 RELEASE one;
357 } {}
358
359 db close
360 catch { tv delete }
361 }
362
363 #-------------------------------------------------------------------------
364 # Hot journal rollback related test cases.
365 #
366 # pager1.4.1.*: Test that the pager module deletes very small invalid
367 # journal files.
368 #
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).
374 #
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).
378 #
379 # pager1.4.4.*: Test hot-journal rollback of journal file with a master
380 # journal pointer generated in various "PRAGMA synchronous"
381 # modes.
382 #
383 # pager1.4.5.*: Test that hot-journal rollback stops if it encounters a
384 # journal-record for which the checksum fails.
385 #
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.
389 #
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.
393 #
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}
407
408 # Set up a [testvfs] to snapshot the file-system just before SQLite
409 # deletes the master-journal to commit a multi-file transaction.
410 #
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.
414 #
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 } {}
447
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}
481 }
482
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 } {}
501
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}
508
509 7 24 511 {1 2 3 4}
510 8 24 513 {1 2 3 4}
511 9 24 131072 {1 2 3 4}
512
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
520 }
521 db close
522
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.
527 #
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
549 }
550
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 }
565
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 }
578
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 } {
647
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 {}
679
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 }
731
732 cd $pwd
733 }
734 db close
735 tv delete
736 forcedelete $dirname
737
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).
741 #
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
749 }
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 {}
764
765 # Check the transaction was committed:
766 #
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}
771
772 # Now try four tests:
773 #
774 # pager1-4.5.3: Restore the file-system. Check that the whole transaction
775 # is rolled back.
776 #
777 # pager1-4.5.4: Restore the file-system. Corrupt the first record in the
778 # journal. Check the transaction is not rolled back.
779 #
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.
783 #
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.
787 #
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}
805
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
814
815 # Snapshot the file-system just before multi-file commit. Save the name
816 # of the master journal file in $::mj_filename.
817 #
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
826 }
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 } {}
844
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}
853
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 {}
874
875 # The file-system now contains:
876 #
877 # * three databases
878 # * three hot-journal files
879 # * two master-journal files.
880 #
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.
885 #
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]
892 ]]
893
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.
898 #
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}
904
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}
915
916 db close
917 tv delete
918
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
926 }
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
946 }
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
956 }
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}
982
983 #-------------------------------------------------------------------------
984 # The following tests deal with multi-file commits.
985 #
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.
989 #
990 # pager1-5.2.*: Multi-file commits with journal_mode=memory.
991 #
992 # pager1-5.3.*: Multi-file commits with journal_mode=memory.
993 #
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.
1001 #
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).
1005 #
1006 #
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 } {}
1041
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}
1060
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 }
1066
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 }
1087
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 }
1118
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
1139
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}
1161
1162
1163 #-------------------------------------------------------------------------
1164 # The following tests work with "PRAGMA max_page_count"
1165 #
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 } {}
1198
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}
1202
1203
1204 #-------------------------------------------------------------------------
1205 # The following tests work with "PRAGMA journal_mode=TRUNCATE" and
1206 # "PRAGMA locking_mode=EXCLUSIVE".
1207 #
1208 # Each test is specified with 5 variables. As follows:
1209 #
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.
1217 #
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 }
1259 }
1260
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}
1282
1283 #-------------------------------------------------------------------------
1284 # The following tests, pager1-8.*, test that the special filenames
1285 # ":memory:" and "" open temporary databases.
1286 #
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}
1304
1305 do_test pager1-8.$tn.2 {
1306 sqlite3 db2 $filename
1307 catchsql { SELECT * FROM x1 } db2
1308 } {1 {no such table: x1}}
1309
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 } {}
1316 }
1317
1318 #-------------------------------------------------------------------------
1319 # The next block of tests - pager1-9.* - deal with interactions between
1320 # the pager and the backup API. Test cases:
1321 #
1322 # pager1-9.1.*: Test that a backup completes successfully even if the
1323 # source db is written to during the backup op.
1324 #
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.
1328 #
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}]
1356
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}
1370
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
1390
1391 do_test pager1-9.3.1 {
1392 testvfs tv -default 1
1393 tv sectorsize 4096
1394 faultsim_delete_and_reopen
1395
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]
1439 }
1440
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
1456
1457 #-------------------------------------------------------------------------
1458 # Test that regardless of the value returned by xSectorSize(), the
1459 # minimum effective sector-size is 512 and the maximum 65536 bytes.
1460 #
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 }
1472
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)]
1487
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 } {}
1498
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}
1512
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
1532 }
1533 db close
1534
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 } {}
1566
1567 db close
1568 tv delete
1569
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}
1588
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}}
1593
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"
1612 #
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
1619
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 }
1627
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
1650 }
1651 db close
1652 tv delete
1653
1654 #-------------------------------------------------------------------------
1655 # Test specal "PRAGMA journal_mode=PERSIST" test cases.
1656 #
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.
1670 #
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.
1674 #
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
1682 }
1683 faultsim_delete_and_reopen
1684 db func a_string a_string
1685
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.
1689 #
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}
1707
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.
1713 #
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}
1719
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
1730 }
1731 }
1732
1733 if {$::tcl_platform(platform)!="windows"} {
1734 # Same test as above. But this time with an index on the table.
1735 #
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
1753 }
1754 }
1755
1756 db close
1757 tv delete
1758
1759 #-------------------------------------------------------------------------
1760 # Test specal "PRAGMA journal_mode=OFF" test cases.
1761 #
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}
1788
1789 #-------------------------------------------------------------------------
1790 # Test opening and closing the pager sub-system with different values
1791 # for the sqlite3_vfs.szOsFile variable.
1792 #
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
1808 }
1809
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.
1813 #
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]
1819 }
1820 sqlite3 db test.db
1821 db close
1822 tv delete
1823
1824 for {set ii [expr $::file_len-5]} {$ii < [expr $::file_len+20]} {incr ii} {
1825 testvfs tv -default 1 -mxpathname $ii
1826
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 }
1836
1837 do_test pager1-16.1.$ii {
1838 list [catch { sqlite3 db test.db } msg] $msg
1839 } $res
1840
1841 catch {db close}
1842 tv delete
1843 }
1844
1845
1846 #-------------------------------------------------------------------------
1847 # Test the pagers response to the b-tree layer requesting illegal page
1848 # numbers:
1849 #
1850 # + The locking page,
1851 # + Page 0,
1852 # + A page with a page number greater than (2^31-1).
1853 #
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.
1856 #
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
1940
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 }
1950
1951 set root [db one "SELECT rootpage FROM sqlite_master"]
1952 db close
1953
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}}
1958 }
1959
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 } {}
1999
2000 #-------------------------------------------------------------------------
2001 # Test a couple of special cases that come up while committing
2002 # transactions:
2003 #
2004 # pager1-20.1.*: Committing an in-memory database transaction when the
2005 # database has not been modified at all.
2006 #
2007 # pager1-20.2.*: As above, but with a normal db in exclusive-locking mode.
2008 #
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.
2012 #
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 } {}
2027
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 } {}
2043
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 } {}
2071 }
2072
2073 #-------------------------------------------------------------------------
2074 # Test that a WAL database may not be opened if:
2075 #
2076 # pager1-21.1.*: The VFS has an iVersion less than 2, or
2077 # pager1-21.2.*: The VFS does not provide xShmXXX() methods.
2078 #
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
2102 }
2103
2104 #-------------------------------------------------------------------------
2105 # Test that a "PRAGMA wal_checkpoint":
2106 #
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.
2109 #
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
2136 }
2137
2138 #-------------------------------------------------------------------------
2139 # Tests for changing journal mode.
2140 #
2141 # pager1-23.1.*: Test that when changing from PERSIST to DELETE mode,
2142 # the journal file is deleted.
2143 #
2144 # pager1-23.2.*: Same test as above, but while a shared lock is held
2145 # on the database file.
2146 #
2147 # pager1-23.3.*: Same test as above, but while a reserved lock is held
2148 # on the database file.
2149 #
2150 # pager1-23.4.*: And, for fun, while holding an exclusive lock.
2151 #
2152 # pager1-23.5.*: Try to set various different journal modes with an
2153 # in-memory database (only MEMORY and OFF should work).
2154 #
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).
2158 #
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}
2171
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}
2185
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 } {}
2201
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 } {}
2217
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}]
2238 }
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}
2251
2252 #-------------------------------------------------------------------------
2253 #
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}
2287
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}
2302
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 } {}
2311
2312 #-------------------------------------------------------------------------
2313 #
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 } {}
2335
2336 #-------------------------------------------------------------------------
2337 # Sector-size tests.
2338 #
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
2364
2365 #-------------------------------------------------------------------------
2366 #
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 } {}
2377
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.
2382 #
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}
2394
2395 do_test pager1-28.$tn.3 { sql1 { PRAGMA locking_mode=exclusive } } {exclusiv e}
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 }
2404 }
2405
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.
2410 #
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
2422
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
2436
2437 do_test pager1-28.$tn.11 { sql2 COMMIT } {}
2438 do_test pager1-28.$tn.12 { file exists test.db-journal } 0
2439
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
2453
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 } } {}
2458 }
2459
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]
2487 }
2488
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.
2494 #
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
2503
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}
2511
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.
2516 #
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}
2545 }
2546
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.
2551 #
2552 catch {db close}
2553 forcedelete test.db
2554
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}
2582
2583 # Cleanup 20MB file left by the previous test.
2584 forcedelete test.db
2585
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.
2590 #
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
2604
2605 catchsql COMMIT
2606 } {1 {disk I/O error}}
2607
2608 do_test pager1-33.2 {
2609 file rename bak-journal test.db-journal
2610 execsql { SELECT * FROM t1 }
2611 } {one two}
2612 }
2613
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.
2618 #
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}
2639 }
2640
2641 #-------------------------------------------------------------------------
2642 #
2643 reset_db
2644 do_test 35 {
2645 sqlite3 db test.db
2646
2647 execsql {
2648 CREATE TABLE t1(x, y);
2649 PRAGMA journal_mode = WAL;
2650 INSERT INTO t1 VALUES(1, 2);
2651 }
2652
2653 execsql {
2654 BEGIN;
2655 CREATE TABLE t2(a, b);
2656 }
2657
2658 hexio_write test.db-shm [expr 16*1024] [string repeat 0055 8192]
2659 catchsql ROLLBACK
2660 } {0 {}}
2661
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 }
2668
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}}
2673
2674 sql1 { PRAGMA checkpoint_fullfsync = 1 }
2675 sql1 { CREATE TABLE t2(x) }
2676
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}}
2681 }
2682
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
2695
2696 db eval {
2697 CREATE TABLE t1(x);
2698 INSERT INTO t1 VALUES(1);
2699 SELECT * FROM t1;
2700 }
2701 } {1}
2702
2703 do_execsql_test 37.$tn.2 {
2704 VACUUM;
2705 SELECT * FROM t1;
2706 } {1}
2707
2708 db close
2709 sqlite3_shutdown
2710 sqlite3_config_uri 0
2711 }
2712
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 encrypted or is not a database}}
2722 do_test 38.2 {
2723 catch { db close }
2724 forcedelete test.db
2725 } {}
2726
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 } {}
2754
2755 do_execsql_test 39.4 {
2756 PRAGMA auto_vacuum = 2;
2757 CREATE TABLE t3(x);
2758 CREATE TABLE t4(x);
2759
2760 DROP TABLE t2;
2761 DROP TABLE t3;
2762 DROP TABLE t4;
2763 }
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}
2773
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}
2799
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
2827
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
2865
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
2875
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
2888
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}
2893
2894 do_test 43.2 {
2895 db eval { SELECT * FROM t2 }
2896 sqlite3_db_status db CACHE_MISS 1
2897 } {0 3 0}
2898
2899 do_test 43.3 {
2900 db eval { SELECT * FROM t3 }
2901 sqlite3_db_status db CACHE_MISS 0
2902 } {0 1 0}
2903
2904 finish_test
OLDNEW
« no previous file with comments | « third_party/sqlite/sqlite-src-3170000/test/ovfl.test ('k') | third_party/sqlite/sqlite-src-3170000/test/pager2.test » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698