0000: 23 20 32 30 31 30 20 4a 75 6e 65 20 31 35 0a 23 # 2010 June 15.#
0010: 0a 23 20 54 68 65 20 61 75 74 68 6f 72 20 64 69 .# The author di
0020: 73 63 6c 61 69 6d 73 20 63 6f 70 79 72 69 67 68 sclaims copyrigh
0030: 74 20 74 6f 20 74 68 69 73 20 73 6f 75 72 63 65 t to this source
0040: 20 63 6f 64 65 2e 20 20 49 6e 20 70 6c 61 63 65 code. In place
0050: 20 6f 66 0a 23 20 61 20 6c 65 67 61 6c 20 6e 6f of.# a legal no
0060: 74 69 63 65 2c 20 68 65 72 65 20 69 73 20 61 20 tice, here is a
0070: 62 6c 65 73 73 69 6e 67 3a 0a 23 0a 23 20 20 20 blessing:.#.#
0080: 20 4d 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 May you do good
0090: 20 61 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 23 and not evil..#
00a0: 20 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 May you find
00b0: 20 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 forgiveness for
00c0: 20 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f yourself and fo
00d0: 72 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 23 20 rgive others..#
00e0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 May you share
00f0: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 freely, never t
0100: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 aking more than
0110: 79 6f 75 20 67 69 76 65 2e 0a 23 0a 23 2a 2a 2a you give..#.#***
0120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0160: 2a 2a 2a 2a 0a 23 0a 0a 73 65 74 20 74 65 73 74 ****.#..set test
0170: 64 69 72 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d dir [file dirnam
0180: 65 20 24 61 72 67 76 30 5d 0a 73 6f 75 72 63 65 e $argv0].source
0190: 20 24 74 65 73 74 64 69 72 2f 74 65 73 74 65 72 $testdir/tester
01a0: 2e 74 63 6c 0a 73 6f 75 72 63 65 20 24 74 65 73 .tcl.source $tes
01b0: 74 64 69 72 2f 6c 6f 63 6b 5f 63 6f 6d 6d 6f 6e tdir/lock_common
01c0: 2e 74 63 6c 0a 73 6f 75 72 63 65 20 24 74 65 73 .tcl.source $tes
01d0: 74 64 69 72 2f 6d 61 6c 6c 6f 63 5f 63 6f 6d 6d tdir/malloc_comm
01e0: 6f 6e 2e 74 63 6c 0a 73 6f 75 72 63 65 20 24 74 on.tcl.source $t
01f0: 65 73 74 64 69 72 2f 77 61 6c 5f 63 6f 6d 6d 6f estdir/wal_commo
0200: 6e 2e 74 63 6c 0a 20 0a 23 20 44 6f 20 6e 6f 74 n.tcl. .# Do not
0210: 20 75 73 65 20 61 20 63 6f 64 65 63 20 66 6f 72 use a codec for
0220: 20 74 65 73 74 73 20 69 6e 20 74 68 69 73 20 66 tests in this f
0230: 69 6c 65 2c 20 61 73 20 74 68 65 20 64 61 74 61 ile, as the data
0240: 62 61 73 65 20 66 69 6c 65 20 69 73 0a 23 20 6d base file is.# m
0250: 61 6e 69 70 75 6c 61 74 65 64 20 64 69 72 65 63 anipulated direc
0260: 74 6c 79 20 75 73 69 6e 67 20 74 63 6c 20 73 63 tly using tcl sc
0270: 72 69 70 74 73 20 28 75 73 69 6e 67 20 74 68 65 ripts (using the
0280: 20 5b 68 65 78 69 6f 5f 77 72 69 74 65 5d 20 63 [hexio_write] c
0290: 6f 6d 6d 61 6e 64 29 2e 0a 23 0a 64 6f 5f 6e 6f ommand)..#.do_no
02a0: 74 5f 75 73 65 5f 63 6f 64 65 63 0a 0a 23 0a 23 t_use_codec..#.#
02b0: 20 70 61 67 65 72 31 2d 31 2e 2a 3a 20 54 65 73 pager1-1.*: Tes
02c0: 74 20 69 6e 74 65 72 2d 70 72 6f 63 65 73 73 20 t inter-process
02d0: 6c 6f 63 6b 69 6e 67 20 28 63 6c 69 65 6e 74 73 locking (clients
02e0: 20 69 6e 20 6d 75 6c 74 69 70 6c 65 20 70 72 6f in multiple pro
02f0: 63 65 73 73 65 73 29 2e 0a 23 0a 23 20 70 61 67 cesses)..#.# pag
0300: 65 72 31 2d 32 2e 2a 3a 20 54 65 73 74 20 69 6e er1-2.*: Test in
0310: 74 72 61 2d 70 72 6f 63 65 73 73 20 6c 6f 63 6b tra-process lock
0320: 69 6e 67 20 28 6d 75 6c 74 69 70 6c 65 20 63 6c ing (multiple cl
0330: 69 65 6e 74 73 20 69 6e 20 74 68 69 73 20 70 72 ients in this pr
0340: 6f 63 65 73 73 29 2e 0a 23 0a 23 20 70 61 67 65 ocess)..#.# page
0350: 72 31 2d 33 2e 2a 3a 20 53 61 76 65 70 6f 69 6e r1-3.*: Savepoin
0360: 74 20 72 65 6c 61 74 65 64 20 74 65 73 74 73 2e t related tests.
0370: 0a 23 0a 23 20 70 61 67 65 72 31 2d 34 2e 2a 3a .#.# pager1-4.*:
0380: 20 48 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 65 6c Hot-journal rel
0390: 61 74 65 64 20 74 65 73 74 73 2e 0a 23 0a 23 20 ated tests..#.#
03a0: 70 61 67 65 72 31 2d 35 2e 2a 3a 20 43 61 73 65 pager1-5.*: Case
03b0: 73 20 72 65 6c 61 74 65 64 20 74 6f 20 6d 75 6c s related to mul
03c0: 74 69 2d 66 69 6c 65 20 63 6f 6d 6d 69 74 73 2e ti-file commits.
03d0: 0a 23 0a 23 20 70 61 67 65 72 31 2d 36 2e 2a 3a .#.# pager1-6.*:
03e0: 20 43 61 73 65 73 20 72 65 6c 61 74 65 64 20 74 Cases related t
03f0: 6f 20 22 50 52 41 47 4d 41 20 6d 61 78 5f 70 61 o "PRAGMA max_pa
0400: 67 65 5f 63 6f 75 6e 74 22 0a 23 0a 23 20 70 61 ge_count".#.# pa
0410: 67 65 72 31 2d 37 2e 2a 3a 20 43 61 73 65 73 20 ger1-7.*: Cases
0420: 73 70 65 63 69 66 69 63 20 74 6f 20 22 50 52 41 specific to "PRA
0430: 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 GMA journal_mode
0440: 3d 54 52 55 4e 43 41 54 45 22 0a 23 0a 23 20 70 =TRUNCATE".#.# p
0450: 61 67 65 72 31 2d 38 2e 2a 3a 20 43 61 73 65 73 ager1-8.*: Cases
0460: 20 75 73 69 6e 67 20 74 65 6d 70 6f 72 61 72 79 using temporary
0470: 20 61 6e 64 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 and in-memory d
0480: 61 74 61 62 61 73 65 73 2e 0a 23 0a 23 20 70 61 atabases..#.# pa
0490: 67 65 72 31 2d 39 2e 2a 3a 20 54 65 73 74 73 20 ger1-9.*: Tests
04a0: 72 65 6c 61 74 65 64 20 74 6f 20 74 68 65 20 62 related to the b
04b0: 61 63 6b 75 70 20 41 50 49 2e 0a 23 0a 23 20 70 ackup API..#.# p
04c0: 61 67 65 72 31 2d 31 30 2e 2a 3a 20 54 65 73 74 ager1-10.*: Test
04d0: 20 74 68 61 74 20 74 68 65 20 61 73 73 75 6d 65 that the assume
04e0: 64 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73 65 d file-system se
04f0: 63 74 6f 72 2d 73 69 7a 65 20 69 73 20 6c 69 6d ctor-size is lim
0500: 69 74 65 64 20 74 6f 0a 23 20 20 20 20 20 20 20 ited to.#
0510: 20 20 20 20 20 20 20 36 34 4b 42 2e 0a 23 0a 23 64KB..#.#
0520: 20 70 61 67 65 72 31 2d 31 32 2e 2a 3a 20 54 65 pager1-12.*: Te
0530: 73 74 73 20 69 6e 76 6f 6c 76 69 6e 67 20 22 50 sts involving "P
0540: 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 22 RAGMA page_size"
0550: 0a 23 0a 23 20 70 61 67 65 72 31 2d 31 33 2e 2a .#.# pager1-13.*
0560: 3a 20 43 61 73 65 73 20 73 70 65 63 69 66 69 63 : Cases specific
0570: 20 74 6f 20 22 50 52 41 47 4d 41 20 6a 6f 75 72 to "PRAGMA jour
0580: 6e 61 6c 5f 6d 6f 64 65 3d 50 45 52 53 49 53 54 nal_mode=PERSIST
0590: 22 0a 23 0a 23 20 70 61 67 65 72 31 2d 31 34 2e ".#.# pager1-14.
05a0: 2a 3a 20 43 61 73 65 73 20 73 70 65 63 69 66 69 *: Cases specifi
05b0: 63 20 74 6f 20 22 50 52 41 47 4d 41 20 6a 6f 75 c to "PRAGMA jou
05c0: 72 6e 61 6c 5f 6d 6f 64 65 3d 4f 46 46 22 0a 23 rnal_mode=OFF".#
05d0: 0a 23 20 70 61 67 65 72 31 2d 31 35 2e 2a 3a 20 .# pager1-15.*:
05e0: 56 61 72 79 69 6e 67 20 73 71 6c 69 74 65 33 5f Varying sqlite3_
05f0: 76 66 73 2e 73 7a 4f 73 46 69 6c 65 0a 23 0a 23 vfs.szOsFile.#.#
0600: 20 70 61 67 65 72 31 2d 31 36 2e 2a 3a 20 56 61 pager1-16.*: Va
0610: 72 79 69 6e 67 20 73 71 6c 69 74 65 33 5f 76 66 rying sqlite3_vf
0620: 73 2e 6d 78 50 61 74 68 6e 61 6d 65 0a 23 0a 23 s.mxPathname.#.#
0630: 20 70 61 67 65 72 31 2d 31 37 2e 2a 3a 20 54 65 pager1-17.*: Te
0640: 73 74 73 20 72 65 6c 61 74 65 64 20 74 6f 20 22 sts related to "
0650: 50 52 41 47 4d 41 20 6f 6d 69 74 5f 72 65 61 64 PRAGMA omit_read
0660: 6c 6f 63 6b 22 0a 23 0a 23 20 70 61 67 65 72 31 lock".#.# pager1
0670: 2d 31 38 2e 2a 3a 20 54 65 73 74 20 74 68 61 74 -18.*: Test that
0680: 20 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72 the pager layer
0690: 20 72 65 73 70 6f 6e 64 73 20 63 6f 72 72 65 63 responds correc
06a0: 74 6c 79 20 69 66 20 74 68 65 20 62 2d 74 72 65 tly if the b-tre
06b0: 65 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 e.#
06c0: 20 72 65 71 75 65 73 74 73 20 61 6e 20 69 6e 76 requests an inv
06d0: 61 6c 69 64 20 70 61 67 65 20 6e 75 6d 62 65 72 alid page number
06e0: 20 28 64 75 65 20 74 6f 20 64 62 20 63 6f 72 72 (due to db corr
06f0: 75 70 74 69 6f 6e 29 2e 0a 23 0a 0a 73 65 74 20 uption)..#..set
0700: 61 5f 73 74 72 69 6e 67 5f 63 6f 75 6e 74 65 72 a_string_counter
0710: 20 31 0a 70 72 6f 63 20 61 5f 73 74 72 69 6e 67 1.proc a_string
0720: 20 7b 6e 7d 20 7b 0a 20 20 67 6c 6f 62 61 6c 20 {n} {. global
0730: 61 5f 73 74 72 69 6e 67 5f 63 6f 75 6e 74 65 72 a_string_counter
0740: 0a 20 20 69 6e 63 72 20 61 5f 73 74 72 69 6e 67 . incr a_string
0750: 5f 63 6f 75 6e 74 65 72 0a 20 20 73 74 72 69 6e _counter. strin
0760: 67 20 72 61 6e 67 65 20 5b 73 74 72 69 6e 67 20 g range [string
0770: 72 65 70 65 61 74 20 22 24 7b 61 5f 73 74 72 69 repeat "${a_stri
0780: 6e 67 5f 63 6f 75 6e 74 65 72 7d 2e 22 20 24 6e ng_counter}." $n
0790: 5d 20 31 20 24 6e 0a 7d 0a 64 62 20 66 75 6e 63 ] 1 $n.}.db func
07a0: 20 61 5f 73 74 72 69 6e 67 20 61 5f 73 74 72 69 a_string a_stri
07b0: 6e 67 0a 0a 64 6f 5f 6d 75 6c 74 69 63 6c 69 65 ng..do_multiclie
07c0: 6e 74 5f 74 65 73 74 20 74 6e 20 7b 0a 0a 20 20 nt_test tn {..
07d0: 23 20 43 72 65 61 74 65 20 61 6e 64 20 70 6f 70 # Create and pop
07e0: 75 6c 61 74 65 20 61 20 64 61 74 61 62 61 73 65 ulate a database
07f0: 20 74 61 62 6c 65 20 75 73 69 6e 67 20 63 6f 6e table using con
0800: 6e 65 63 74 69 6f 6e 20 5b 64 62 5d 2e 20 43 68 nection [db]. Ch
0810: 65 63 6b 20 0a 20 20 23 20 74 68 61 74 20 63 6f eck . # that co
0820: 6e 6e 65 63 74 69 6f 6e 73 20 5b 64 62 32 5d 20 nnections [db2]
0830: 61 6e 64 20 5b 64 62 33 5d 20 63 61 6e 20 73 65 and [db3] can se
0840: 65 20 74 68 65 20 73 63 68 65 6d 61 20 61 6e 64 e the schema and
0850: 20 63 6f 6e 74 65 6e 74 2e 0a 20 20 23 0a 20 20 content.. #.
0860: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24 do_test pager1-$
0870: 74 6e 2e 31 20 7b 0a 20 20 20 20 73 71 6c 31 20 tn.1 {. sql1
0880: 7b 0a 20 20 20 20 20 20 43 52 45 41 54 45 20 54 {. CREATE T
0890: 41 42 4c 45 20 74 31 28 61 20 50 52 49 4d 41 52 ABLE t1(a PRIMAR
08a0: 59 20 4b 45 59 2c 20 62 29 3b 0a 20 20 20 20 20 Y KEY, b);.
08b0: 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 31 CREATE INDEX i1
08c0: 20 4f 4e 20 74 31 28 62 29 3b 0a 20 20 20 20 20 ON t1(b);.
08d0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 INSERT INTO t1
08e0: 56 41 4c 55 45 53 28 31 2c 20 27 6f 6e 65 27 29 VALUES(1, 'one')
08f0: 3b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 ; INSERT INTO t1
0900: 20 56 41 4c 55 45 53 28 32 2c 20 27 74 77 6f 27 VALUES(2, 'two'
0910: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 7d 0a );. }. } {}.
0920: 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 do_test pager1
0930: 2d 24 74 6e 2e 32 20 7b 20 73 71 6c 32 20 7b 20 -$tn.2 { sql2 {
0940: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 SELECT * FROM t1
0950: 20 7d 20 7d 20 7b 31 20 6f 6e 65 20 32 20 74 77 } } {1 one 2 tw
0960: 6f 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 o}. do_test pag
0970: 65 72 31 2d 24 74 6e 2e 33 20 7b 20 73 71 6c 33 er1-$tn.3 { sql3
0980: 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d { SELECT * FROM
0990: 20 74 31 20 7d 20 7d 20 7b 31 20 6f 6e 65 20 32 t1 } } {1 one 2
09a0: 20 74 77 6f 7d 0a 0a 20 20 23 20 4f 70 65 6e 20 two}.. # Open
09b0: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e a transaction an
09c0: 64 20 61 64 64 20 61 20 72 6f 77 20 75 73 69 6e d add a row usin
09d0: 67 20 5b 64 62 5d 2e 20 54 68 69 73 20 70 75 74 g [db]. This put
09e0: 73 20 5b 64 62 5d 20 69 6e 0a 20 20 23 20 52 45 s [db] in. # RE
09f0: 53 45 52 56 45 44 20 73 74 61 74 65 2e 20 43 68 SERVED state. Ch
0a00: 65 63 6b 20 74 68 61 74 20 63 6f 6e 6e 65 63 74 eck that connect
0a10: 69 6f 6e 73 20 5b 64 62 32 5d 20 61 6e 64 20 5b ions [db2] and [
0a20: 64 62 33 5d 20 63 61 6e 20 73 74 69 6c 6c 0a 20 db3] can still.
0a30: 20 23 20 72 65 61 64 20 74 68 65 20 64 61 74 61 # read the data
0a40: 62 61 73 65 20 63 6f 6e 74 65 6e 74 20 61 73 20 base content as
0a50: 69 74 20 77 61 73 20 62 65 66 6f 72 65 20 74 68 it was before th
0a60: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 e transaction wa
0a70: 73 0a 20 20 23 20 6f 70 65 6e 65 64 2e 20 5b 64 s. # opened. [d
0a80: 62 5d 20 73 68 6f 75 6c 64 20 73 65 65 20 74 68 b] should see th
0a90: 65 20 69 6e 73 65 72 74 65 64 20 72 6f 77 2e 0a e inserted row..
0aa0: 20 20 23 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 #. do_test pa
0ab0: 67 65 72 31 2d 24 74 6e 2e 34 20 7b 0a 20 20 20 ger1-$tn.4 {.
0ac0: 20 73 71 6c 31 20 7b 0a 20 20 20 20 20 20 42 45 sql1 {. BE
0ad0: 47 49 4e 3b 0a 20 20 20 20 20 20 20 20 49 4e 53 GIN;. INS
0ae0: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 ERT INTO t1 VALU
0af0: 45 53 28 33 2c 20 27 74 68 72 65 65 27 29 3b 0a ES(3, 'three');.
0b00: 20 20 20 20 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64 }. } {}. d
0b10: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24 74 o_test pager1-$t
0b20: 6e 2e 35 20 7b 20 73 71 6c 32 20 7b 20 53 45 4c n.5 { sql2 { SEL
0b30: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 ECT * FROM t1 }
0b40: 7d 20 7b 31 20 6f 6e 65 20 32 20 74 77 6f 7d 0a } {1 one 2 two}.
0b50: 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 do_test pager1
0b60: 2d 24 74 6e 2e 37 20 7b 20 73 71 6c 31 20 7b 20 -$tn.7 { sql1 {
0b70: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 SELECT * FROM t1
0b80: 20 7d 20 7d 20 7b 31 20 6f 6e 65 20 32 20 74 77 } } {1 one 2 tw
0b90: 6f 20 33 20 74 68 72 65 65 7d 0a 0a 20 20 23 20 o 3 three}.. #
0ba0: 5b 64 62 5d 20 73 74 69 6c 6c 20 68 61 73 20 61 [db] still has a
0bb0: 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61 n open write tra
0bc0: 6e 73 61 63 74 69 6f 6e 2e 20 43 68 65 63 6b 20 nsaction. Check
0bd0: 74 68 61 74 20 74 68 69 73 20 70 72 65 76 65 6e that this preven
0be0: 74 73 0a 20 20 23 20 6f 74 68 65 72 20 63 6f 6e ts. # other con
0bf0: 6e 65 63 74 69 6f 6e 73 20 28 73 70 65 63 69 66 nections (specif
0c00: 69 63 61 6c 6c 79 20 5b 64 62 32 5d 29 20 66 72 ically [db2]) fr
0c10: 6f 6d 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 om writing to th
0c20: 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 23 0a e database.. #.
0c30: 20 20 23 20 45 76 65 6e 20 69 66 20 5b 64 62 32 # Even if [db2
0c40: 5d 20 6f 70 65 6e 73 20 61 20 74 72 61 6e 73 61 ] opens a transa
0c50: 63 74 69 6f 6e 20 66 69 72 73 74 2c 20 69 74 20 ction first, it
0c60: 6d 61 79 20 6e 6f 74 20 77 72 69 74 65 20 74 6f may not write to
0c70: 20 74 68 65 0a 20 20 23 20 64 61 74 61 62 61 73 the. # databas
0c80: 65 2e 20 41 66 74 65 72 20 74 68 65 20 61 74 74 e. After the att
0c90: 65 6d 70 74 20 74 6f 20 77 72 69 74 65 20 74 68 empt to write th
0ca0: 65 20 64 62 20 77 69 74 68 69 6e 20 61 20 74 72 e db within a tr
0cb0: 61 6e 73 61 63 74 69 6f 6e 2c 20 0a 20 20 23 20 ansaction, . #
0cc0: 5b 64 62 32 5d 20 69 73 20 6c 65 66 74 20 77 69 [db2] is left wi
0cd0: 74 68 20 61 6e 20 6f 70 65 6e 20 74 72 61 6e 73 th an open trans
0ce0: 61 63 74 69 6f 6e 2c 20 62 75 74 20 6e 6f 74 20 action, but not
0cf0: 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 0a 20 a read-lock on.
0d00: 20 23 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 # the main data
0d10: 62 61 73 65 2e 20 53 6f 20 69 74 20 64 6f 65 73 base. So it does
0d20: 20 6e 6f 74 20 70 72 65 76 65 6e 74 20 5b 64 62 not prevent [db
0d30: 5d 20 66 72 6f 6d 20 63 6f 6d 6d 69 74 74 69 6e ] from committin
0d40: 67 2e 0a 20 20 23 0a 20 20 64 6f 5f 74 65 73 74 g.. #. do_test
0d50: 20 70 61 67 65 72 31 2d 24 74 6e 2e 38 20 7b 20 pager1-$tn.8 {
0d60: 0a 20 20 20 20 63 73 71 6c 32 20 7b 20 55 50 44 . csql2 { UPD
0d70: 41 54 45 20 74 31 20 53 45 54 20 61 20 3d 20 61 ATE t1 SET a = a
0d80: 20 2b 20 31 30 20 7d 0a 20 20 7d 20 7b 31 20 7b + 10 }. } {1 {
0d90: 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b database is lock
0da0: 65 64 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 ed}}. do_test p
0db0: 61 67 65 72 31 2d 24 74 6e 2e 39 20 7b 20 0a 20 ager1-$tn.9 { .
0dc0: 20 20 20 63 73 71 6c 32 20 7b 20 0a 20 20 20 20 csql2 { .
0dd0: 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 55 BEGIN;. U
0de0: 50 44 41 54 45 20 74 31 20 53 45 54 20 61 20 3d PDATE t1 SET a =
0df0: 20 61 20 2b 20 31 30 3b 0a 20 20 20 20 7d 0a 20 a + 10;. }.
0e00: 20 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20 } {1 {database
0e10: 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 0a 20 20 23 is locked}}.. #
0e20: 20 48 61 76 65 20 5b 64 62 5d 20 63 6f 6d 6d 69 Have [db] commi
0e30: 74 20 69 74 73 20 74 72 61 6e 73 61 63 74 69 6f t its transactio
0e40: 6e 73 2e 20 43 68 65 63 6b 20 74 68 65 20 6f 74 ns. Check the ot
0e50: 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 her connections
0e60: 63 61 6e 0a 20 20 23 20 6e 6f 77 20 73 65 65 20 can. # now see
0e70: 74 68 65 20 6e 65 77 20 64 61 74 61 62 61 73 65 the new database
0e80: 20 63 6f 6e 74 65 6e 74 2e 0a 20 20 23 0a 20 20 content.. #.
0e90: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24 do_test pager1-$
0ea0: 74 6e 2e 31 30 20 7b 20 73 71 6c 31 20 7b 20 43 tn.10 { sql1 { C
0eb0: 4f 4d 4d 49 54 20 7d 20 7d 20 7b 7d 0a 20 20 64 OMMIT } } {}. d
0ec0: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24 74 o_test pager1-$t
0ed0: 6e 2e 31 31 20 7b 20 73 71 6c 31 20 7b 20 53 45 n.11 { sql1 { SE
0ee0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d LECT * FROM t1 }
0ef0: 20 7d 20 7b 31 20 6f 6e 65 20 32 20 74 77 6f 20 } {1 one 2 two
0f00: 33 20 74 68 72 65 65 7d 0a 20 20 64 6f 5f 74 65 3 three}. do_te
0f10: 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 31 32 st pager1-$tn.12
0f20: 20 7b 20 73 71 6c 32 20 7b 20 53 45 4c 45 43 54 { sql2 { SELECT
0f30: 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7d 20 7b * FROM t1 } } {
0f40: 31 20 6f 6e 65 20 32 20 74 77 6f 20 33 20 74 68 1 one 2 two 3 th
0f50: 72 65 65 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 ree}. do_test p
0f60: 61 67 65 72 31 2d 24 74 6e 2e 31 33 20 7b 20 73 ager1-$tn.13 { s
0f70: 71 6c 33 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 ql3 { SELECT * F
0f80: 52 4f 4d 20 74 31 20 7d 20 7d 20 7b 31 20 6f 6e ROM t1 } } {1 on
0f90: 65 20 32 20 74 77 6f 20 33 20 74 68 72 65 65 7d e 2 two 3 three}
0fa0: 0a 0a 20 20 23 20 43 68 65 63 6b 20 74 68 61 74 .. # Check that
0fb0: 2c 20 61 73 20 6e 6f 74 65 64 20 61 62 6f 76 65 , as noted above
0fc0: 2c 20 5b 64 62 32 5d 20 72 65 61 6c 6c 79 20 64 , [db2] really d
0fd0: 69 64 20 6b 65 65 70 20 61 6e 20 6f 70 65 6e 20 id keep an open
0fe0: 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 23 20 transaction. #
0ff0: 61 66 74 65 72 20 74 68 65 20 61 74 74 65 6d 70 after the attemp
1000: 74 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 64 t to write the d
1010: 61 74 61 62 61 73 65 20 66 61 69 6c 65 64 2e 0a atabase failed..
1020: 20 20 23 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 #. do_test pa
1030: 67 65 72 31 2d 24 74 6e 2e 31 34 20 7b 20 0a 20 ger1-$tn.14 { .
1040: 20 20 20 63 73 71 6c 32 20 7b 20 42 45 47 49 4e csql2 { BEGIN
1050: 20 7d 20 0a 20 20 7d 20 7b 31 20 7b 63 61 6e 6e } . } {1 {cann
1060: 6f 74 20 73 74 61 72 74 20 61 20 74 72 61 6e 73 ot start a trans
1070: 61 63 74 69 6f 6e 20 77 69 74 68 69 6e 20 61 20 action within a
1080: 74 72 61 6e 73 61 63 74 69 6f 6e 7d 7d 0a 20 20 transaction}}.
1090: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24 do_test pager1-$
10a0: 74 6e 2e 31 35 20 7b 20 73 71 6c 32 20 7b 20 52 tn.15 { sql2 { R
10b0: 4f 4c 4c 42 41 43 4b 20 7d 20 7d 20 7b 7d 0a 0a OLLBACK } } {}..
10c0: 20 20 23 20 48 61 76 65 20 5b 64 62 32 5d 20 6f # Have [db2] o
10d0: 70 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f pen a transactio
10e0: 6e 20 61 6e 64 20 74 61 6b 65 20 61 20 72 65 61 n and take a rea
10f0: 64 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 d-lock on the da
1100: 74 61 62 61 73 65 2e 0a 20 20 23 20 43 68 65 63 tabase.. # Chec
1110: 6b 20 74 68 61 74 20 74 68 69 73 20 70 72 65 76 k that this prev
1120: 65 6e 74 73 20 5b 64 62 5d 20 66 72 6f 6d 20 77 ents [db] from w
1130: 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61 riting to the da
1140: 74 61 62 61 73 65 20 28 6f 75 74 73 69 64 65 0a tabase (outside.
1150: 20 20 23 20 6f 66 20 61 6e 79 20 74 72 61 6e 73 # of any trans
1160: 61 63 74 69 6f 6e 29 2e 20 41 66 74 65 72 20 74 action). After t
1170: 68 69 73 20 66 61 69 6c 73 2c 20 63 68 65 63 6b his fails, check
1180: 20 74 68 61 74 20 5b 64 62 33 5d 20 63 61 6e 20 that [db3] can
1190: 72 65 61 64 0a 20 20 23 20 74 68 65 20 64 62 20 read. # the db
11a0: 28 73 68 6f 77 69 6e 67 20 74 68 61 74 20 5b 64 (showing that [d
11b0: 62 5d 20 64 69 64 20 6e 6f 74 20 74 61 6b 65 20 b] did not take
11c0: 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 65 a PENDING lock e
11d0: 74 63 2e 29 0a 20 20 23 0a 20 20 64 6f 5f 74 65 tc.). #. do_te
11e0: 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 31 35 st pager1-$tn.15
11f0: 20 7b 20 0a 20 20 20 20 73 71 6c 32 20 7b 20 42 { . sql2 { B
1200: 45 47 49 4e 3b 20 53 45 4c 45 43 54 20 2a 20 46 EGIN; SELECT * F
1210: 52 4f 4d 20 74 31 3b 20 7d 0a 20 20 7d 20 7b 31 ROM t1; }. } {1
1220: 20 6f 6e 65 20 32 20 74 77 6f 20 33 20 74 68 72 one 2 two 3 thr
1230: 65 65 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 ee}. do_test pa
1240: 67 65 72 31 2d 24 74 6e 2e 31 36 20 7b 20 0a 20 ger1-$tn.16 { .
1250: 20 20 20 63 73 71 6c 31 20 7b 20 55 50 44 41 54 csql1 { UPDAT
1260: 45 20 74 31 20 53 45 54 20 61 20 3d 20 61 20 2b E t1 SET a = a +
1270: 20 31 30 20 7d 0a 20 20 7d 20 7b 31 20 7b 64 61 10 }. } {1 {da
1280: 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 tabase is locked
1290: 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 }}. do_test pag
12a0: 65 72 31 2d 24 74 6e 2e 31 37 20 7b 20 73 71 6c er1-$tn.17 { sql
12b0: 33 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 3 { SELECT * FRO
12c0: 4d 20 74 31 20 7d 20 7d 20 7b 31 20 6f 6e 65 20 M t1 } } {1 one
12d0: 32 20 74 77 6f 20 33 20 74 68 72 65 65 7d 0a 0a 2 two 3 three}..
12e0: 20 20 23 20 54 68 69 73 20 74 69 6d 65 2c 20 68 # This time, h
12f0: 61 76 65 20 5b 64 62 5d 20 6f 70 65 6e 20 61 20 ave [db] open a
1300: 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65 66 6f transaction befo
1310: 72 65 20 77 72 69 74 69 6e 67 20 74 68 65 20 64 re writing the d
1320: 61 74 61 62 61 73 65 2e 0a 20 20 23 20 54 68 69 atabase.. # Thi
1330: 73 20 77 6f 72 6b 73 20 2d 20 5b 64 62 5d 20 67 s works - [db] g
1340: 65 74 73 20 61 20 52 45 53 45 52 56 45 44 20 6c ets a RESERVED l
1350: 6f 63 6b 20 77 68 69 63 68 20 64 6f 65 73 20 6e ock which does n
1360: 6f 74 20 63 6f 6e 66 6c 69 63 74 20 77 69 74 68 ot conflict with
1370: 0a 20 20 23 20 74 68 65 20 53 48 41 52 45 44 20 . # the SHARED
1380: 6c 6f 63 6b 20 5b 64 62 32 5d 20 69 73 20 68 6f lock [db2] is ho
1390: 6c 64 69 6e 67 2e 0a 20 20 23 0a 20 20 64 6f 5f lding.. #. do_
13a0: 74 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e test pager1-$tn.
13b0: 31 38 20 7b 20 0a 20 20 20 20 73 71 6c 31 20 7b 18 { . sql1 {
13c0: 20 0a 20 20 20 20 20 20 42 45 47 49 4e 3b 20 20 . BEGIN;
13d0: 0a 20 20 20 20 20 20 55 50 44 41 54 45 20 74 31 . UPDATE t1
13e0: 20 53 45 54 20 61 20 3d 20 61 20 2b 20 31 30 3b SET a = a + 10;
13f0: 20 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 7d 0a 20 . }. } {}.
1400: 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d do_test pager1-
1410: 24 74 6e 2d 31 39 20 7b 20 0a 20 20 20 20 73 71 $tn-19 { . sq
1420: 6c 31 20 7b 20 50 52 41 47 4d 41 20 6c 6f 63 6b l1 { PRAGMA lock
1430: 5f 73 74 61 74 75 73 20 7d 20 0a 20 20 7d 20 7b _status } . } {
1440: 6d 61 69 6e 20 72 65 73 65 72 76 65 64 20 74 65 main reserved te
1450: 6d 70 20 63 6c 6f 73 65 64 7d 0a 20 20 64 6f 5f mp closed}. do_
1460: 74 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2d test pager1-$tn-
1470: 32 30 20 7b 20 0a 20 20 20 20 73 71 6c 32 20 7b 20 { . sql2 {
1480: 20 50 52 41 47 4d 41 20 6c 6f 63 6b 5f 73 74 61 PRAGMA lock_sta
1490: 74 75 73 20 7d 20 0a 20 20 7d 20 7b 6d 61 69 6e tus } . } {main
14a0: 20 73 68 61 72 65 64 20 74 65 6d 70 20 63 6c 6f shared temp clo
14b0: 73 65 64 7d 0a 0a 20 20 23 20 43 68 65 63 6b 20 sed}.. # Check
14c0: 74 68 61 74 20 61 6c 6c 20 63 6f 6e 6e 65 63 74 that all connect
14d0: 69 6f 6e 73 20 63 61 6e 20 73 74 69 6c 6c 20 72 ions can still r
14e0: 65 61 64 20 74 68 65 20 64 61 74 61 62 61 73 65 ead the database
14f0: 2e 20 4f 6e 6c 79 20 5b 64 62 5d 20 73 65 65 73 . Only [db] sees
1500: 0a 20 20 23 20 74 68 65 20 75 70 64 61 74 65 64 . # the updated
1510: 20 63 6f 6e 74 65 6e 74 20 28 61 73 20 74 68 65 content (as the
1520: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 transaction has
1530: 20 6e 6f 74 20 62 65 65 6e 20 63 6f 6d 6d 69 74 not been commit
1540: 74 65 64 20 79 65 74 29 2e 0a 20 20 23 0a 20 20 ted yet).. #.
1550: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24 do_test pager1-$
1560: 74 6e 2e 32 31 20 7b 20 73 71 6c 31 20 7b 20 53 tn.21 { sql1 { S
1570: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 ELECT * FROM t1
1580: 7d 20 7d 20 7b 31 31 20 6f 6e 65 20 31 32 20 74 } } {11 one 12 t
1590: 77 6f 20 31 33 20 74 68 72 65 65 7d 0a 20 20 64 wo 13 three}. d
15a0: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24 74 o_test pager1-$t
15b0: 6e 2e 32 32 20 7b 20 73 71 6c 32 20 7b 20 53 45 n.22 { sql2 { SE
15c0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d LECT * FROM t1 }
15d0: 20 7d 20 7b 31 20 6f 6e 65 20 32 20 74 77 6f 20 } {1 one 2 two
15e0: 33 20 74 68 72 65 65 7d 0a 20 20 64 6f 5f 74 65 3 three}. do_te
15f0: 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 32 33 st pager1-$tn.23
1600: 20 7b 20 73 71 6c 33 20 7b 20 53 45 4c 45 43 54 { sql3 { SELECT
1610: 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7d 20 7b * FROM t1 } } {
1620: 31 20 6f 6e 65 20 32 20 74 77 6f 20 33 20 74 68 1 one 2 two 3 th
1630: 72 65 65 7d 0a 0a 20 20 23 20 42 65 63 61 75 73 ree}.. # Becaus
1640: 65 20 5b 64 62 32 5d 20 73 74 69 6c 6c 20 68 61 e [db2] still ha
1650: 73 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63 s the SHARED loc
1660: 6b 2c 20 5b 64 62 5d 20 69 73 20 75 6e 61 62 6c k, [db] is unabl
1670: 65 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65 0a e to commit the.
1680: 20 20 23 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e # transaction.
1690: 20 49 66 20 69 74 20 74 72 69 65 73 2c 20 61 6e If it tries, an
16a0: 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e error is return
16b0: 65 64 20 61 6e 64 20 74 68 65 20 63 6f 6e 6e 65 ed and the conne
16c0: 63 74 69 6f 6e 20 0a 20 20 23 20 75 70 67 72 61 ction . # upgra
16d0: 64 65 73 20 74 6f 20 61 20 50 45 4e 44 49 4e 47 des to a PENDING
16e0: 20 6c 6f 63 6b 2e 0a 20 20 23 0a 20 20 23 20 4f lock.. #. # O
16f0: 6e 63 65 20 74 68 69 73 20 68 61 70 70 65 6e 73 nce this happens
1700: 2c 20 5b 64 62 5d 20 63 61 6e 20 72 65 61 64 20 , [db] can read
1710: 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 the database and
1720: 20 73 65 65 20 74 68 65 20 6e 65 77 20 63 6f 6e see the new con
1730: 74 65 6e 74 2c 0a 20 20 23 20 5b 64 62 32 5d 20 tent,. # [db2]
1740: 28 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 53 (still holding S
1750: 48 41 52 45 44 29 20 63 61 6e 20 73 74 69 6c 6c HARED) can still
1760: 20 72 65 61 64 20 74 68 65 20 6f 6c 64 20 63 6f read the old co
1770: 6e 74 65 6e 74 2c 20 62 75 74 20 5b 64 62 33 5d ntent, but [db3]
1780: 0a 20 20 23 20 28 6e 6f 74 20 68 6f 6c 64 69 6e . # (not holdin
1790: 67 20 61 6e 79 20 6c 6f 63 6b 29 20 69 73 20 70 g any lock) is p
17a0: 72 65 76 65 6e 74 65 64 20 62 79 20 5b 64 62 5d revented by [db]
17b0: 27 73 20 50 45 4e 44 49 4e 47 20 66 72 6f 6d 20 's PENDING from
17c0: 72 65 61 64 69 6e 67 0a 20 20 23 20 74 68 65 20 reading. # the
17d0: 64 61 74 61 62 61 73 65 2e 0a 20 20 23 0a 20 20 database.. #.
17e0: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24 do_test pager1-$
17f0: 74 6e 2e 32 34 20 7b 20 63 73 71 6c 31 20 7b 20 tn.24 { csql1 {
1800: 43 4f 4d 4d 49 54 20 7d 20 7d 20 7b 31 20 7b 64 COMMIT } } {1 {d
1810: 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 atabase is locke
1820: 64 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 d}}. do_test pa
1830: 67 65 72 31 2d 24 74 6e 2d 32 35 20 7b 20 0a 20 ger1-$tn-25 { .
1840: 20 20 20 73 71 6c 31 20 7b 20 50 52 41 47 4d 41 sql1 { PRAGMA
1850: 20 6c 6f 63 6b 5f 73 74 61 74 75 73 20 7d 20 0a lock_status } .
1860: 20 20 7d 20 7b 6d 61 69 6e 20 70 65 6e 64 69 6e } {main pendin
1870: 67 20 74 65 6d 70 20 63 6c 6f 73 65 64 7d 0a 20 g temp closed}.
1880: 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d do_test pager1-
1890: 24 74 6e 2e 32 36 20 7b 20 73 71 6c 31 20 7b 20 $tn.26 { sql1 {
18a0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 SELECT * FROM t1
18b0: 20 20 7d 20 7d 20 7b 31 31 20 6f 6e 65 20 31 32 } } {11 one 12
18c0: 20 74 77 6f 20 31 33 20 74 68 72 65 65 7d 0a 20 two 13 three}.
18d0: 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d do_test pager1-
18e0: 24 74 6e 2e 32 37 20 7b 20 73 71 6c 32 20 7b 20 $tn.27 { sql2 {
18f0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 SELECT * FROM t1
1900: 20 20 7d 20 7d 20 7b 31 20 6f 6e 65 20 32 20 74 } } {1 one 2 t
1910: 77 6f 20 33 20 74 68 72 65 65 7d 0a 20 20 64 6f wo 3 three}. do
1920: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e _test pager1-$tn
1930: 2e 32 38 20 7b 20 63 73 71 6c 33 20 7b 20 53 45 .28 { csql3 { SE
1940: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d LECT * FROM t1 }
1950: 20 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20 } {1 {database
1960: 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 0a 20 20 23 is locked}}.. #
1970: 20 48 61 76 65 20 5b 64 62 32 5d 20 63 6f 6d 6d Have [db2] comm
1980: 69 74 20 69 74 73 20 72 65 61 64 20 74 72 61 6e it its read tran
1990: 73 61 63 74 69 6f 6e 2c 20 72 65 6c 65 61 73 69 saction, releasi
19a0: 6e 67 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f ng the SHARED lo
19b0: 63 6b 20 69 74 0a 20 20 23 20 69 73 20 68 6f 6c ck it. # is hol
19c0: 64 69 6e 67 2e 20 4e 6f 77 2c 20 6e 65 69 74 68 ding. Now, neith
19d0: 65 72 20 5b 64 62 32 5d 20 6e 6f 72 20 5b 64 62 er [db2] nor [db
19e0: 33 5d 20 6d 61 79 20 72 65 61 64 20 74 68 65 20 3] may read the
19f0: 64 61 74 61 62 61 73 65 20 28 61 73 20 5b 64 62 database (as [db
1a00: 5d 0a 20 20 23 20 69 73 20 73 74 69 6c 6c 20 68 ]. # is still h
1a10: 6f 6c 64 69 6e 67 20 61 20 50 45 4e 44 49 4e 47 olding a PENDING
1a20: 29 2e 0a 20 20 23 0a 20 20 64 6f 5f 74 65 73 74 ).. #. do_test
1a30: 20 70 61 67 65 72 31 2d 24 74 6e 2e 32 39 20 7b pager1-$tn.29 {
1a40: 20 73 71 6c 32 20 7b 20 43 4f 4d 4d 49 54 20 7d sql2 { COMMIT }
1a50: 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74 20 } {}. do_test
1a60: 70 61 67 65 72 31 2d 24 74 6e 2e 33 30 20 7b 20 pager1-$tn.30 {
1a70: 63 73 71 6c 32 20 7b 20 53 45 4c 45 43 54 20 2a csql2 { SELECT *
1a80: 20 46 52 4f 4d 20 74 31 20 7d 20 7d 20 7b 31 20 FROM t1 } } {1
1a90: 7b 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63 {database is loc
1aa0: 6b 65 64 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20 ked}}. do_test
1ab0: 70 61 67 65 72 31 2d 24 74 6e 2e 33 31 20 7b 20 pager1-$tn.31 {
1ac0: 63 73 71 6c 33 20 7b 20 53 45 4c 45 43 54 20 2a csql3 { SELECT *
1ad0: 20 46 52 4f 4d 20 74 31 20 7d 20 7d 20 7b 31 20 FROM t1 } } {1
1ae0: 7b 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63 {database is loc
1af0: 6b 65 64 7d 7d 0a 0a 20 20 23 20 5b 64 62 5d 20 ked}}.. # [db]
1b00: 69 73 20 6e 6f 77 20 61 62 6c 65 20 74 6f 20 63 is now able to c
1b10: 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61 ommit the transa
1b20: 63 74 69 6f 6e 2e 20 4f 6e 63 65 20 74 68 65 20 ction. Once the
1b30: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 0a transaction is .
1b40: 20 20 23 20 63 6f 6d 6d 69 74 74 65 64 2c 20 61 # committed, a
1b50: 6c 6c 20 74 68 72 65 65 20 63 6f 6e 6e 65 63 74 ll three connect
1b60: 69 6f 6e 73 20 63 61 6e 20 72 65 61 64 20 74 68 ions can read th
1b70: 65 20 6e 65 77 20 63 6f 6e 74 65 6e 74 2e 0a 20 e new content..
1b80: 20 23 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 #. do_test pag
1b90: 65 72 31 2d 24 74 6e 2e 32 35 20 7b 20 73 71 6c er1-$tn.25 { sql
1ba0: 31 20 7b 20 55 50 44 41 54 45 20 74 31 20 53 45 1 { UPDATE t1 SE
1bb0: 54 20 61 20 3d 20 61 2b 31 30 20 7d 20 7d 20 7b T a = a+10 } } {
1bc0: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 }. do_test page
1bd0: 72 31 2d 24 74 6e 2e 32 36 20 7b 20 73 71 6c 31 r1-$tn.26 { sql1
1be0: 20 7b 20 43 4f 4d 4d 49 54 20 7d 20 7d 20 7b 7d { COMMIT } } {}
1bf0: 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 . do_test pager
1c00: 31 2d 24 74 6e 2e 32 37 20 7b 20 73 71 6c 31 20 1-$tn.27 { sql1
1c10: 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 { SELECT * FROM
1c20: 74 31 20 7d 20 7d 20 7b 32 31 20 6f 6e 65 20 32 t1 } } {21 one 2
1c30: 32 20 74 77 6f 20 32 33 20 74 68 72 65 65 7d 0a 2 two 23 three}.
1c40: 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 do_test pager1
1c50: 2d 24 74 6e 2e 32 37 20 7b 20 73 71 6c 32 20 7b -$tn.27 { sql2 {
1c60: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 SELECT * FROM t
1c70: 31 20 7d 20 7d 20 7b 32 31 20 6f 6e 65 20 32 32 1 } } {21 one 22
1c80: 20 74 77 6f 20 32 33 20 74 68 72 65 65 7d 0a 20 two 23 three}.
1c90: 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d do_test pager1-
1ca0: 24 74 6e 2e 32 38 20 7b 20 73 71 6c 33 20 7b 20 $tn.28 { sql3 {
1cb0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 SELECT * FROM t1
1cc0: 20 7d 20 7d 20 7b 32 31 20 6f 6e 65 20 32 32 20 } } {21 one 22
1cd0: 74 77 6f 20 32 33 20 74 68 72 65 65 7d 0a 0a 20 two 23 three}..
1ce0: 20 23 20 49 6e 73 74 61 6c 6c 20 61 20 62 75 73 # Install a bus
1cf0: 79 2d 68 61 6e 64 6c 65 72 20 66 6f 72 20 63 6f y-handler for co
1d00: 6e 6e 65 63 74 69 6f 6e 20 5b 64 62 5d 2e 0a 20 nnection [db]..
1d10: 20 23 0a 20 20 73 65 74 20 3a 3a 6e 62 75 73 79 #. set ::nbusy
1d20: 20 5b 6c 69 73 74 5d 0a 20 20 70 72 6f 63 20 62 [list]. proc b
1d30: 75 73 79 20 7b 6e 7d 20 7b 0a 20 20 20 20 6c 61 usy {n} {. la
1d40: 70 70 65 6e 64 20 3a 3a 6e 62 75 73 79 20 24 6e ppend ::nbusy $n
1d50: 0a 20 20 20 20 69 66 20 7b 24 6e 3e 35 7d 20 7b . if {$n>5} {
1d60: 20 73 71 6c 32 20 43 4f 4d 4d 49 54 20 7d 0a 20 sql2 COMMIT }.
1d70: 20 20 20 72 65 74 75 72 6e 20 30 0a 20 20 7d 0a return 0. }.
1d80: 20 20 64 62 20 62 75 73 79 20 62 75 73 79 0a 0a db busy busy..
1d90: 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 do_test pager1
1da0: 2d 24 74 6e 2e 32 39 20 7b 20 0a 20 20 20 20 73 -$tn.29 { . s
1db0: 71 6c 31 20 7b 20 42 45 47 49 4e 20 3b 20 49 4e ql1 { BEGIN ; IN
1dc0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c SERT INTO t1 VAL
1dd0: 55 45 53 28 27 78 27 2c 20 27 79 27 29 20 7d 20 UES('x', 'y') }
1de0: 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 . } {}. do_tes
1df0: 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 33 30 20 t pager1-$tn.30
1e00: 7b 20 0a 20 20 20 20 73 71 6c 32 20 7b 20 42 45 { . sql2 { BE
1e10: 47 49 4e 20 3b 20 53 45 4c 45 43 54 20 2a 20 46 GIN ; SELECT * F
1e20: 52 4f 4d 20 74 31 20 7d 20 0a 20 20 7d 20 7b 32 ROM t1 } . } {2
1e30: 31 20 6f 6e 65 20 32 32 20 74 77 6f 20 32 33 20 1 one 22 two 23
1e40: 74 68 72 65 65 7d 0a 20 20 64 6f 5f 74 65 73 74 three}. do_test
1e50: 20 70 61 67 65 72 31 2d 24 74 6e 2e 33 31 20 7b pager1-$tn.31 {
1e60: 20 73 71 6c 31 20 43 4f 4d 4d 49 54 20 7d 20 7b sql1 COMMIT } {
1e70: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 }. do_test page
1e80: 72 31 2d 24 74 6e 2e 33 32 20 7b 20 73 65 74 20 r1-$tn.32 { set
1e90: 3a 3a 6e 62 75 73 79 20 7d 20 7b 30 20 31 20 32 ::nbusy } {0 1 2
1ea0: 20 33 20 34 20 35 20 36 7d 0a 7d 0a 0a 23 2d 2d 3 4 5 6}.}..#--
1eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1ef0: 2d 2d 2d 2d 2d 2d 2d 0a 23 20 53 61 76 65 70 6f -------.# Savepo
1f00: 69 6e 74 20 72 65 6c 61 74 65 64 20 74 65 73 74 int related test
1f10: 20 63 61 73 65 73 2e 0a 23 0a 23 20 70 61 67 65 cases..#.# page
1f20: 72 31 2d 33 2e 31 2e 32 2e 2a 3a 20 46 6f 72 63 r1-3.1.2.*: Forc
1f30: 65 20 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f e a savepoint ro
1f40: 6c 6c 62 61 63 6b 20 74 6f 20 63 61 75 73 65 20 llback to cause
1f50: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c the database fil
1f60: 65 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 e.#
1f70: 20 20 20 20 74 6f 20 67 72 6f 77 2e 0a 23 0a 23 to grow..#.#
1f80: 20 70 61 67 65 72 31 2d 33 2e 31 2e 33 2e 2a 3a pager1-3.1.3.*:
1f90: 20 55 73 65 20 61 20 6a 6f 75 72 6e 61 6c 20 63 Use a journal c
1fa0: 72 65 61 74 65 64 20 69 6e 20 73 79 6e 63 68 72 reated in synchr
1fb0: 6f 6e 6f 75 73 3d 6f 66 66 20 6d 6f 64 65 20 61 onous=off mode a
1fc0: 73 20 70 61 72 74 0a 23 20 20 20 20 20 20 20 20 s part.#
1fd0: 20 20 20 20 20 20 20 20 20 6f 66 20 61 20 73 61 of a sa
1fe0: 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b vepoint rollback
1ff0: 2e 0a 23 20 0a 64 6f 5f 74 65 73 74 20 70 61 67 ..# .do_test pag
2000: 65 72 31 2d 33 2e 31 2e 31 20 7b 0a 20 20 66 61 er1-3.1.1 {. fa
2010: 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e ultsim_delete_an
2020: 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65 63 73 d_reopen. execs
2030: 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 ql {. CREATE
2040: 54 41 42 4c 45 20 74 31 28 61 20 50 52 49 4d 41 TABLE t1(a PRIMA
2050: 52 59 20 4b 45 59 2c 20 62 29 3b 0a 20 20 20 20 RY KEY, b);.
2060: 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 6f 75 CREATE TABLE cou
2070: 6e 74 65 72 28 0a 20 20 20 20 20 20 69 20 43 48 nter(. i CH
2080: 45 43 4b 20 28 69 3c 35 29 2c 20 0a 20 20 20 20 ECK (i<5), .
2090: 20 20 75 20 43 48 45 43 4b 20 28 75 3c 31 30 29 u CHECK (u<10)
20a0: 0a 20 20 20 20 29 3b 0a 20 20 20 20 49 4e 53 45 . );. INSE
20b0: 52 54 20 49 4e 54 4f 20 63 6f 75 6e 74 65 72 20 RT INTO counter
20c0: 56 41 4c 55 45 53 28 30 2c 20 30 29 3b 0a 20 20 VALUES(0, 0);.
20d0: 20 20 43 52 45 41 54 45 20 54 52 49 47 47 45 52 CREATE TRIGGER
20e0: 20 74 72 31 20 41 46 54 45 52 20 49 4e 53 45 52 tr1 AFTER INSER
20f0: 54 20 4f 4e 20 74 31 20 42 45 47 49 4e 0a 20 20 T ON t1 BEGIN.
2100: 20 20 20 20 55 50 44 41 54 45 20 63 6f 75 6e 74 UPDATE count
2110: 65 72 20 53 45 54 20 69 20 3d 20 69 2b 31 3b 0a er SET i = i+1;.
2120: 20 20 20 20 45 4e 44 3b 0a 20 20 20 20 43 52 45 END;. CRE
2130: 41 54 45 20 54 52 49 47 47 45 52 20 74 72 32 20 ATE TRIGGER tr2
2140: 41 46 54 45 52 20 55 50 44 41 54 45 20 4f 4e 20 AFTER UPDATE ON
2150: 74 31 20 42 45 47 49 4e 0a 20 20 20 20 20 20 55 t1 BEGIN. U
2160: 50 44 41 54 45 20 63 6f 75 6e 74 65 72 20 53 45 PDATE counter SE
2170: 54 20 75 20 3d 20 75 2b 31 3b 0a 20 20 20 20 45 T u = u+1;. E
2180: 4e 44 3b 0a 20 20 7d 0a 20 20 65 78 65 63 73 71 ND;. }. execsq
2190: 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f l { SELECT * FRO
21a0: 4d 20 63 6f 75 6e 74 65 72 20 7d 0a 7d 20 7b 30 M counter }.} {0
21b0: 20 30 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 0}..do_execsql_
21c0: 74 65 73 74 20 70 61 67 65 72 31 2d 33 2e 31 2e test pager1-3.1.
21d0: 32 20 7b 0a 20 20 50 52 41 47 4d 41 20 63 61 63 2 {. PRAGMA cac
21e0: 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b 0a 20 20 he_size = 10;.
21f0: 42 45 47 49 4e 3b 0a 20 20 20 20 49 4e 53 45 52 BEGIN;. INSER
2200: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 T INTO t1 VALUES
2210: 28 31 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 (1, randomblob(1
2220: 35 30 30 29 29 3b 0a 20 20 20 20 49 4e 53 45 52 500));. INSER
2230: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 T INTO t1 VALUES
2240: 28 32 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 (2, randomblob(1
2250: 35 30 30 29 29 3b 0a 20 20 20 20 49 4e 53 45 52 500));. INSER
2260: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 T INTO t1 VALUES
2270: 28 33 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 (3, randomblob(1
2280: 35 30 30 29 29 3b 0a 20 20 20 20 53 45 4c 45 43 500));. SELEC
2290: 54 20 2a 20 46 52 4f 4d 20 63 6f 75 6e 74 65 72 T * FROM counter
22a0: 3b 0a 7d 20 7b 33 20 30 7d 0a 64 6f 5f 63 61 74 ;.} {3 0}.do_cat
22b0: 63 68 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 chsql_test pager
22c0: 31 2d 33 2e 31 2e 33 20 7b 0a 20 20 20 20 49 4e 1-3.1.3 {. IN
22d0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c SERT INTO t1 SEL
22e0: 45 43 54 20 61 2b 33 2c 20 72 61 6e 64 6f 6d 62 ECT a+3, randomb
22f0: 6c 6f 62 28 31 35 30 30 29 20 46 52 4f 4d 20 74 lob(1500) FROM t
2300: 31 0a 7d 20 7b 31 20 7b 63 6f 6e 73 74 72 61 69 1.} {1 {constrai
2310: 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f 65 nt failed}}.do_e
2320: 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 xecsql_test page
2330: 72 31 2d 33 2e 34 20 7b 20 53 45 4c 45 43 54 20 r1-3.4 { SELECT
2340: 2a 20 46 52 4f 4d 20 63 6f 75 6e 74 65 72 20 7d * FROM counter }
2350: 20 7b 33 20 30 7d 0a 64 6f 5f 65 78 65 63 73 71 {3 0}.do_execsq
2360: 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 33 2e l_test pager1-3.
2370: 35 20 7b 20 53 45 4c 45 43 54 20 61 20 46 52 4f 5 { SELECT a FRO
2380: 4d 20 74 31 20 7d 20 7b 31 20 32 20 33 7d 0a 64 M t1 } {1 2 3}.d
2390: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 o_execsql_test p
23a0: 61 67 65 72 31 2d 33 2e 36 20 7b 20 43 4f 4d 4d ager1-3.6 { COMM
23b0: 49 54 20 7d 20 7b 7d 0a 0a 66 6f 72 65 61 63 68 IT } {}..foreach
23c0: 20 7b 74 6e 20 73 71 6c 20 74 63 6c 7d 20 7b 0a {tn sql tcl} {.
23d0: 20 20 37 20 20 7b 20 50 52 41 47 4d 41 20 73 79 7 { PRAGMA sy
23e0: 6e 63 68 72 6f 6e 6f 75 73 20 3d 20 4e 4f 52 4d nchronous = NORM
23f0: 41 4c 20 3b 20 50 52 41 47 4d 41 20 74 65 6d 70 AL ; PRAGMA temp
2400: 5f 73 74 6f 72 65 20 3d 20 30 20 7d 20 7b 0a 20 _store = 0 } {.
2410: 20 20 20 74 65 73 74 76 66 73 20 74 76 20 2d 64 testvfs tv -d
2420: 65 66 61 75 6c 74 20 31 0a 20 20 20 20 74 76 20 efault 1. tv
2430: 64 65 76 63 68 61 72 20 73 61 66 65 5f 61 70 70 devchar safe_app
2440: 65 6e 64 0a 20 20 7d 0a 20 20 38 20 20 7b 20 50 end. }. 8 { P
2450: 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75 RAGMA synchronou
2460: 73 20 3d 20 4e 4f 52 4d 41 4c 20 3b 20 50 52 41 s = NORMAL ; PRA
2470: 47 4d 41 20 74 65 6d 70 5f 73 74 6f 72 65 20 3d GMA temp_store =
2480: 20 32 20 7d 20 7b 0a 20 20 20 20 74 65 73 74 76 2 } {. testv
2490: 66 73 20 74 76 20 2d 64 65 66 61 75 6c 74 20 31 fs tv -default 1
24a0: 0a 20 20 20 20 74 76 20 64 65 76 63 68 61 72 20 . tv devchar
24b0: 73 65 71 75 65 6e 74 69 61 6c 0a 20 20 7d 0a 20 sequential. }.
24c0: 20 39 20 20 7b 20 50 52 41 47 4d 41 20 73 79 6e 9 { PRAGMA syn
24d0: 63 68 72 6f 6e 6f 75 73 20 3d 20 46 55 4c 4c 20 chronous = FULL
24e0: 7d 20 7b 20 7d 0a 20 20 31 30 20 7b 20 50 52 41 } { }. 10 { PRA
24f0: 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 GMA synchronous
2500: 3d 20 4e 4f 52 4d 41 4c 20 7d 20 7b 20 7d 0a 20 = NORMAL } { }.
2510: 20 31 31 20 7b 20 50 52 41 47 4d 41 20 73 79 6e 11 { PRAGMA syn
2520: 63 68 72 6f 6e 6f 75 73 20 3d 20 4f 46 46 20 7d chronous = OFF }
2530: 20 7b 20 7d 0a 20 20 31 32 20 7b 20 50 52 41 47 { }. 12 { PRAG
2540: 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 3d MA synchronous =
2550: 20 46 55 4c 4c 20 3b 20 50 52 41 47 4d 41 20 66 FULL ; PRAGMA f
2560: 75 6c 6c 66 73 79 6e 63 20 3d 20 31 20 7d 20 7b ullfsync = 1 } {
2570: 20 7d 0a 20 20 31 33 20 7b 20 50 52 41 47 4d 41 }. 13 { PRAGMA
2580: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 3d 20 46 synchronous = F
2590: 55 4c 4c 20 7d 20 7b 0a 20 20 20 20 74 65 73 74 ULL } {. test
25a0: 76 66 73 20 74 76 20 2d 64 65 66 61 75 6c 74 20 vfs tv -default
25b0: 31 0a 20 20 20 20 74 76 20 64 65 76 63 68 61 72 1. tv devchar
25c0: 20 73 65 71 75 65 6e 74 69 61 6c 0a 20 20 7d 0a sequential. }.
25d0: 20 20 31 34 20 7b 20 50 52 41 47 4d 41 20 6c 6f 14 { PRAGMA lo
25e0: 63 6b 69 6e 67 5f 6d 6f 64 65 20 3d 20 45 58 43 cking_mode = EXC
25f0: 4c 55 53 49 56 45 20 7d 20 7b 0a 20 20 7d 0a 7d LUSIVE } {. }.}
2600: 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 {. do_test pag
2610: 65 72 31 2d 33 2e 24 74 6e 2e 31 20 7b 0a 20 20 er1-3.$tn.1 {.
2620: 20 20 65 76 61 6c 20 24 74 63 6c 0a 20 20 20 20 eval $tcl.
2630: 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f faultsim_delete_
2640: 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 20 20 64 and_reopen. d
2650: 62 20 66 75 6e 63 20 61 5f 73 74 72 69 6e 67 20 b func a_string
2660: 61 5f 73 74 72 69 6e 67 0a 20 20 20 20 65 78 65 a_string. exe
2670: 63 73 71 6c 20 24 73 71 6c 0a 20 20 20 20 65 78 csql $sql. ex
2680: 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 50 52 ecsql {. PR
2690: 41 47 4d 41 20 61 75 74 6f 5f 76 61 63 75 75 6d AGMA auto_vacuum
26a0: 20 3d 20 32 3b 0a 20 20 20 20 20 20 50 52 41 47 = 2;. PRAG
26b0: 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 MA cache_size =
26c0: 31 30 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45 10;. CREATE
26d0: 20 54 41 42 4c 45 20 7a 28 78 20 49 4e 54 45 47 TABLE z(x INTEG
26e0: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 ER PRIMARY KEY,
26f0: 79 29 3b 0a 20 20 20 20 20 20 42 45 47 49 4e 3b y);. BEGIN;
2700: 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 . INSERT
2710: 49 4e 54 4f 20 7a 20 56 41 4c 55 45 53 28 4e 55 INTO z VALUES(NU
2720: 4c 4c 2c 20 61 5f 73 74 72 69 6e 67 28 38 30 30 LL, a_string(800
2730: 29 29 3b 0a 20 20 20 20 20 20 20 20 49 4e 53 45 ));. INSE
2740: 52 54 20 49 4e 54 4f 20 7a 20 53 45 4c 45 43 54 RT INTO z SELECT
2750: 20 4e 55 4c 4c 2c 20 61 5f 73 74 72 69 6e 67 28 NULL, a_string(
2760: 38 30 30 29 20 46 52 4f 4d 20 7a 3b 20 20 20 20 800) FROM z;
2770: 20 2d 2d 20 20 20 32 0a 20 20 20 20 20 20 20 20 -- 2.
2780: 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a 20 53 45 INSERT INTO z SE
2790: 4c 45 43 54 20 4e 55 4c 4c 2c 20 61 5f 73 74 72 LECT NULL, a_str
27a0: 69 6e 67 28 38 30 30 29 20 46 52 4f 4d 20 7a 3b ing(800) FROM z;
27b0: 20 20 20 20 20 2d 2d 20 20 20 34 0a 20 20 20 20 -- 4.
27c0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 INSERT INTO
27d0: 7a 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 61 z SELECT NULL, a
27e0: 5f 73 74 72 69 6e 67 28 38 30 30 29 20 46 52 4f _string(800) FRO
27f0: 4d 20 7a 3b 20 20 20 20 20 2d 2d 20 20 20 38 0a M z; -- 8.
2800: 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 INSERT I
2810: 4e 54 4f 20 7a 20 53 45 4c 45 43 54 20 4e 55 4c NTO z SELECT NUL
2820: 4c 2c 20 61 5f 73 74 72 69 6e 67 28 38 30 30 29 L, a_string(800)
2830: 20 46 52 4f 4d 20 7a 3b 20 20 20 20 20 2d 2d 20 FROM z; --
2840: 20 31 36 0a 20 20 20 20 20 20 20 20 49 4e 53 45 16. INSE
2850: 52 54 20 49 4e 54 4f 20 7a 20 53 45 4c 45 43 54 RT INTO z SELECT
2860: 20 4e 55 4c 4c 2c 20 61 5f 73 74 72 69 6e 67 28 NULL, a_string(
2870: 38 30 30 29 20 46 52 4f 4d 20 7a 3b 20 20 20 20 800) FROM z;
2880: 20 2d 2d 20 20 33 32 0a 20 20 20 20 20 20 20 20 -- 32.
2890: 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a 20 53 45 INSERT INTO z SE
28a0: 4c 45 43 54 20 4e 55 4c 4c 2c 20 61 5f 73 74 72 LECT NULL, a_str
28b0: 69 6e 67 28 38 30 30 29 20 46 52 4f 4d 20 7a 3b ing(800) FROM z;
28c0: 20 20 20 20 20 2d 2d 20 20 36 34 0a 20 20 20 20 -- 64.
28d0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 INSERT INTO
28e0: 7a 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 61 z SELECT NULL, a
28f0: 5f 73 74 72 69 6e 67 28 38 30 30 29 20 46 52 4f _string(800) FRO
2900: 4d 20 7a 3b 20 20 20 20 20 2d 2d 20 31 32 38 0a M z; -- 128.
2910: 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 INSERT I
2920: 4e 54 4f 20 7a 20 53 45 4c 45 43 54 20 4e 55 4c NTO z SELECT NUL
2930: 4c 2c 20 61 5f 73 74 72 69 6e 67 28 38 30 30 29 L, a_string(800)
2940: 20 46 52 4f 4d 20 7a 3b 20 20 20 20 20 2d 2d 20 FROM z; --
2950: 32 35 36 0a 20 20 20 20 20 20 43 4f 4d 4d 49 54 256. COMMIT
2960: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 78 65 63 ;. }. exec
2970: 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 61 75 74 sql { PRAGMA aut
2980: 6f 5f 76 61 63 75 75 6d 20 7d 0a 20 20 7d 20 7b o_vacuum }. } {
2990: 32 7d 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 2}. do_execsql_
29a0: 74 65 73 74 20 70 61 67 65 72 31 2d 33 2e 24 74 test pager1-3.$t
29b0: 6e 2e 32 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b n.2 {. BEGIN;
29c0: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e . INSERT IN
29d0: 54 4f 20 7a 20 56 41 4c 55 45 53 28 4e 55 4c 4c TO z VALUES(NULL
29e0: 2c 20 61 5f 73 74 72 69 6e 67 28 38 30 30 29 29 , a_string(800))
29f0: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 ;. INSERT I
2a00: 4e 54 4f 20 7a 20 56 41 4c 55 45 53 28 4e 55 4c NTO z VALUES(NUL
2a10: 4c 2c 20 61 5f 73 74 72 69 6e 67 28 38 30 30 29 L, a_string(800)
2a20: 29 3b 0a 20 20 20 20 20 20 53 41 56 45 50 4f 49 );. SAVEPOI
2a30: 4e 54 20 6f 6e 65 3b 0a 20 20 20 20 20 20 20 20 NT one;.
2a40: 55 50 44 41 54 45 20 7a 20 53 45 54 20 79 20 3d UPDATE z SET y =
2a50: 20 4e 55 4c 4c 20 57 48 45 52 45 20 78 3e 32 35 NULL WHERE x>25
2a60: 36 3b 0a 20 20 20 20 20 20 20 20 50 52 41 47 4d 6;. PRAGM
2a70: 41 20 69 6e 63 72 65 6d 65 6e 74 61 6c 5f 76 61 A incremental_va
2a80: 63 75 75 6d 3b 0a 20 20 20 20 20 20 20 20 53 45 cuum;. SE
2a90: 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 LECT count(*) FR
2aa0: 4f 4d 20 7a 20 57 48 45 52 45 20 78 20 3c 20 31 OM z WHERE x < 1
2ab0: 30 30 3b 0a 20 20 20 20 20 20 52 4f 4c 4c 42 41 00;. ROLLBA
2ac0: 43 4b 20 54 4f 20 6f 6e 65 3b 0a 20 20 20 20 43 CK TO one;. C
2ad0: 4f 4d 4d 49 54 3b 0a 20 20 7d 20 7b 39 39 7d 0a OMMIT;. } {99}.
2ae0: 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 . do_execsql_te
2af0: 73 74 20 70 61 67 65 72 31 2d 33 2e 24 74 6e 2e st pager1-3.$tn.
2b00: 33 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 3 {. BEGIN;.
2b10: 20 20 20 20 20 53 41 56 45 50 4f 49 4e 54 20 6f SAVEPOINT o
2b20: 6e 65 3b 0a 20 20 20 20 20 20 20 20 55 50 44 41 ne;. UPDA
2b30: 54 45 20 7a 20 53 45 54 20 79 20 3d 20 79 7c 7c TE z SET y = y||
2b40: 78 3b 0a 20 20 20 20 20 20 52 4f 4c 4c 42 41 43 x;. ROLLBAC
2b50: 4b 20 54 4f 20 6f 6e 65 3b 0a 20 20 20 20 43 4f K TO one;. CO
2b60: 4d 4d 49 54 3b 0a 20 20 20 20 53 45 4c 45 43 54 MMIT;. SELECT
2b70: 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 7a count(*) FROM z
2b80: 3b 0a 20 20 7d 20 7b 32 35 38 7d 0a 0a 20 20 64 ;. } {258}.. d
2b90: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 o_execsql_test p
2ba0: 61 67 65 72 31 2d 33 2e 24 74 6e 2e 34 20 7b 0a ager1-3.$tn.4 {.
2bb0: 20 20 20 20 53 41 56 45 50 4f 49 4e 54 20 6f 6e SAVEPOINT on
2bc0: 65 3b 0a 20 20 20 20 20 20 55 50 44 41 54 45 20 e;. UPDATE
2bd0: 7a 20 53 45 54 20 79 20 3d 20 79 7c 7c 78 3b 0a z SET y = y||x;.
2be0: 20 20 20 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 ROLLBACK TO
2bf0: 6f 6e 65 3b 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f one;. } {}. do
2c00: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 _execsql_test pa
2c10: 67 65 72 31 2d 33 2e 24 74 6e 2e 35 20 7b 0a 20 ger1-3.$tn.5 {.
2c20: 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 SELECT count(
2c30: 2a 29 20 46 52 4f 4d 20 7a 3b 0a 20 20 20 20 52 *) FROM z;. R
2c40: 45 4c 45 41 53 45 20 6f 6e 65 3b 0a 20 20 20 20 ELEASE one;.
2c50: 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79 PRAGMA integrity
2c60: 5f 63 68 65 63 6b 3b 0a 20 20 7d 20 7b 32 35 38 _check;. } {258
2c70: 20 6f 6b 7d 0a 0a 20 20 64 62 20 63 6c 6f 73 65 ok}.. db close
2c80: 0a 20 20 63 61 74 63 68 20 7b 20 74 76 20 64 65 . catch { tv de
2c90: 6c 65 74 65 20 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d lete }.}..#-----
2ca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2cd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2ce0: 2d 2d 2d 2d 0a 23 20 48 6f 74 20 6a 6f 75 72 6e ----.# Hot journ
2cf0: 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 72 65 6c 61 al rollback rela
2d00: 74 65 64 20 74 65 73 74 20 63 61 73 65 73 2e 0a ted test cases..
2d10: 23 0a 23 20 70 61 67 65 72 31 2e 34 2e 31 2e 2a #.# pager1.4.1.*
2d20: 3a 20 54 65 73 74 20 74 68 61 74 20 74 68 65 20 : Test that the
2d30: 70 61 67 65 72 20 6d 6f 64 75 6c 65 20 64 65 6c pager module del
2d40: 65 74 65 73 20 76 65 72 79 20 73 6d 61 6c 6c 20 etes very small
2d50: 69 6e 76 61 6c 69 64 0a 23 20 20 20 20 20 20 20 invalid.#
2d60: 20 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 journal
2d70: 66 69 6c 65 73 2e 0a 23 0a 23 20 70 61 67 65 72 files..#.# pager
2d80: 31 2e 34 2e 32 2e 2a 3a 20 54 65 73 74 20 74 68 1.4.2.*: Test th
2d90: 61 74 20 69 66 20 74 68 65 20 6d 61 73 74 65 72 at if the master
2da0: 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 journal pointer
2db0: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 at the end of a
2dc0: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .#
2dd0: 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c hot-journal fil
2de0: 65 20 61 70 70 65 61 72 73 20 74 6f 20 62 65 20 e appears to be
2df0: 63 6f 72 72 75 70 74 20 28 63 68 65 63 6b 73 75 corrupt (checksu
2e00: 6d 20 64 6f 65 73 20 6e 6f 74 0a 23 20 20 20 20 m does not.#
2e10: 20 20 20 20 20 20 20 20 20 20 20 63 6f 6d 70 75 compu
2e20: 74 65 29 20 74 68 65 20 61 73 73 6f 63 69 61 74 te) the associat
2e30: 65 64 20 6a 6f 75 72 6e 61 6c 20 69 73 20 72 6f ed journal is ro
2e40: 6c 6c 65 64 20 62 61 63 6b 20 28 61 6e 64 20 6e lled back (and n
2e50: 6f 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 o.#
2e60: 20 20 78 41 63 63 65 73 73 28 29 20 63 61 6c 6c xAccess() call
2e70: 20 74 6f 20 63 68 65 63 6b 20 66 6f 72 20 74 68 to check for th
2e80: 65 20 70 72 65 73 65 6e 63 65 20 6f 66 20 61 6e e presence of an
2e90: 79 20 6d 61 73 74 65 72 20 0a 23 20 20 20 20 20 y master .#
2ea0: 20 20 20 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 journa
2eb0: 6c 20 66 69 6c 65 20 69 73 20 6d 61 64 65 29 2e l file is made).
2ec0: 0a 23 0a 23 20 70 61 67 65 72 31 2e 34 2e 33 2e .#.# pager1.4.3.
2ed0: 2a 3a 20 54 65 73 74 20 74 68 61 74 20 74 68 65 *: Test that the
2ee0: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61 20 68 contents of a h
2ef0: 6f 74 2d 6a 6f 75 72 6e 61 6c 20 61 72 65 20 69 ot-journal are i
2f00: 67 6e 6f 72 65 64 20 69 66 20 74 68 65 0a 23 20 gnored if the.#
2f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61 pa
2f20: 67 65 2d 73 69 7a 65 20 6f 72 20 73 65 63 74 6f ge-size or secto
2f30: 72 2d 73 69 7a 65 20 69 6e 20 74 68 65 20 6a 6f r-size in the jo
2f40: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 61 70 70 urnal header app
2f50: 65 61 72 20 74 6f 0a 23 20 20 20 20 20 20 20 20 ear to.#
2f60: 20 20 20 20 20 20 20 62 65 20 69 6e 76 61 6c 69 be invali
2f70: 64 20 28 74 6f 6f 20 6c 61 72 67 65 2c 20 74 6f d (too large, to
2f80: 6f 20 73 6d 61 6c 6c 20 6f 72 20 6e 6f 74 20 61 o small or not a
2f90: 20 70 6f 77 65 72 20 6f 66 20 32 29 2e 0a 23 0a power of 2)..#.
2fa0: 23 20 70 61 67 65 72 31 2e 34 2e 34 2e 2a 3a 20 # pager1.4.4.*:
2fb0: 54 65 73 74 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c Test hot-journal
2fc0: 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 6a 6f 75 rollback of jou
2fd0: 72 6e 61 6c 20 66 69 6c 65 20 77 69 74 68 20 61 rnal file with a
2fe0: 20 6d 61 73 74 65 72 0a 23 20 20 20 20 20 20 20 master.#
2ff0: 20 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 journal
3000: 70 6f 69 6e 74 65 72 20 67 65 6e 65 72 61 74 65 pointer generate
3010: 64 20 69 6e 20 76 61 72 69 6f 75 73 20 22 50 52 d in various "PR
3020: 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73 AGMA synchronous
3030: 22 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 ".#
3040: 20 20 6d 6f 64 65 73 2e 0a 23 0a 23 20 70 61 67 modes..#.# pag
3050: 65 72 31 2e 34 2e 35 2e 2a 3a 20 54 65 73 74 20 er1.4.5.*: Test
3060: 74 68 61 74 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c that hot-journal
3070: 20 72 6f 6c 6c 62 61 63 6b 20 73 74 6f 70 73 20 rollback stops
3080: 69 66 20 69 74 20 65 6e 63 6f 75 6e 74 65 72 73 if it encounters
3090: 20 61 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 a.#
30a0: 20 20 20 6a 6f 75 72 6e 61 6c 2d 72 65 63 6f 72 journal-recor
30b0: 64 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 d for which the
30c0: 63 68 65 63 6b 73 75 6d 20 66 61 69 6c 73 2e 0a checksum fails..
30d0: 23 0a 23 20 70 61 67 65 72 31 2e 34 2e 36 2e 2a #.# pager1.4.6.*
30e0: 3a 20 54 65 73 74 20 74 68 61 74 20 77 68 65 6e : Test that when
30f0: 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 rolling back a
3100: 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 74 68 61 74 hot-journal that
3110: 20 63 6f 6e 74 61 69 6e 73 20 61 0a 23 20 20 20 contains a.#
3120: 20 20 20 20 20 20 20 20 20 20 20 20 6d 61 73 74 mast
3130: 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 er journal point
3140: 65 72 2c 20 74 68 65 20 6d 61 73 74 65 72 20 6a er, the master j
3150: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 64 ournal file is d
3160: 65 6c 65 74 65 64 0a 23 20 20 20 20 20 20 20 20 eleted.#
3170: 20 20 20 20 20 20 20 61 66 74 65 72 20 61 6c 6c after all
3180: 20 74 68 65 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c the hot-journal
3190: 73 20 74 68 61 74 20 72 65 66 65 72 20 74 6f 20 s that refer to
31a0: 69 74 20 61 72 65 20 64 65 6c 65 74 65 64 2e 0a it are deleted..
31b0: 23 0a 23 20 70 61 67 65 72 31 2e 34 2e 37 2e 2a #.# pager1.4.7.*
31c0: 3a 20 54 65 73 74 20 74 68 61 74 20 69 66 20 61 : Test that if a
31d0: 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c hot-journal fil
31e0: 65 20 65 78 69 73 74 73 20 62 75 74 20 61 20 63 e exists but a c
31f0: 6c 69 65 6e 74 20 63 61 6e 0a 23 20 20 20 20 20 lient can.#
3200: 20 20 20 20 20 20 20 20 20 20 6f 70 65 6e 20 69 open i
3210: 74 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f 6e t for reading on
3220: 6c 79 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 ly, the database
3230: 20 63 61 6e 6e 6f 74 20 62 65 20 61 63 63 65 73 cannot be acces
3240: 73 65 64 20 61 6e 64 0a 23 20 20 20 20 20 20 20 sed and.#
3250: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 43 SQLITE_C
3260: 41 4e 54 4f 50 45 4e 20 69 73 20 72 65 74 75 72 ANTOPEN is retur
3270: 6e 65 64 2e 0a 23 20 0a 64 6f 5f 74 65 73 74 20 ned..# .do_test
3280: 70 61 67 65 72 31 2e 34 2e 31 2e 31 20 7b 0a 20 pager1.4.1.1 {.
3290: 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 faultsim_delete
32a0: 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78 _and_reopen. ex
32b0: 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 43 52 45 ecsql { . CRE
32c0: 41 54 45 20 54 41 42 4c 45 20 78 28 79 2c 20 7a ATE TABLE x(y, z
32d0: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e );. INSERT IN
32e0: 54 4f 20 78 20 56 41 4c 55 45 53 28 31 2c 20 32 TO x VALUES(1, 2
32f0: 29 3b 0a 20 20 7d 0a 20 20 73 65 74 20 66 64 20 );. }. set fd
3300: 5b 6f 70 65 6e 20 74 65 73 74 2e 64 62 2d 6a 6f [open test.db-jo
3310: 75 72 6e 61 6c 20 77 5d 0a 20 20 70 75 74 73 20 urnal w]. puts
3320: 2d 6e 6f 6e 65 77 6c 69 6e 65 20 24 66 64 20 22 -nonewline $fd "
3330: 68 65 6c 6c 6f 77 6f 72 6c 64 22 0a 20 20 63 6c helloworld". cl
3340: 6f 73 65 20 24 66 64 0a 20 20 66 69 6c 65 20 65 ose $fd. file e
3350: 78 69 73 74 73 20 74 65 73 74 2e 64 62 2d 6a 6f xists test.db-jo
3360: 75 72 6e 61 6c 0a 7d 20 7b 31 7d 0a 64 6f 5f 74 urnal.} {1}.do_t
3370: 65 73 74 20 70 61 67 65 72 31 2e 34 2e 31 2e 32 est pager1.4.1.2
3380: 20 7b 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c { execsql { SEL
3390: 45 43 54 20 2a 20 46 52 4f 4d 20 78 20 7d 20 7d ECT * FROM x } }
33a0: 20 7b 31 20 32 7d 0a 64 6f 5f 74 65 73 74 20 70 {1 2}.do_test p
33b0: 61 67 65 72 31 2e 34 2e 31 2e 33 20 7b 20 66 69 ager1.4.1.3 { fi
33c0: 6c 65 20 65 78 69 73 74 73 20 74 65 73 74 2e 64 le exists test.d
33d0: 62 2d 6a 6f 75 72 6e 61 6c 20 7d 20 7b 30 7d 0a b-journal } {0}.
33e0: 0a 23 20 53 65 74 20 75 70 20 61 20 5b 74 65 73 .# Set up a [tes
33f0: 74 76 66 73 5d 20 74 6f 20 73 6e 61 70 73 68 6f tvfs] to snapsho
3400: 74 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 t the file-syste
3410: 6d 20 6a 75 73 74 20 62 65 66 6f 72 65 20 53 51 m just before SQ
3420: 4c 69 74 65 0a 23 20 64 65 6c 65 74 65 73 20 74 Lite.# deletes t
3430: 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 he master-journa
3440: 6c 20 74 6f 20 63 6f 6d 6d 69 74 20 61 20 6d 75 l to commit a mu
3450: 6c 74 69 2d 66 69 6c 65 20 74 72 61 6e 73 61 63 lti-file transac
3460: 74 69 6f 6e 2e 0a 23 0a 23 20 49 6e 20 73 75 62 tion..#.# In sub
3470: 73 65 71 75 65 6e 74 20 74 65 73 74 20 63 61 73 sequent test cas
3480: 65 73 2c 20 69 6e 76 6f 6b 69 6e 67 20 5b 66 61 es, invoking [fa
3490: 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61 ultsim_restore_a
34a0: 6e 64 5f 72 65 6f 70 65 6e 5d 20 73 65 74 73 0a nd_reopen] sets.
34b0: 23 20 75 70 20 74 68 65 20 66 69 6c 65 20 73 79 # up the file sy
34c0: 73 74 65 6d 20 74 6f 20 63 6f 6e 74 61 69 6e 20 stem to contain
34d0: 74 77 6f 20 64 61 74 61 62 61 73 65 73 2c 20 74 two databases, t
34e0: 77 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 wo hot-journal f
34f0: 69 6c 65 73 20 61 6e 64 0a 23 20 61 20 6d 61 73 iles and.# a mas
3500: 74 65 72 2d 6a 6f 75 72 6e 61 6c 2e 0a 23 0a 64 ter-journal..#.d
3510: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e o_test pager1.4.
3520: 32 2e 31 20 7b 0a 20 20 74 65 73 74 76 66 73 20 2.1 {. testvfs
3530: 74 73 74 76 66 73 20 2d 64 65 66 61 75 6c 74 20 tstvfs -default
3540: 31 0a 20 20 74 73 74 76 66 73 20 66 69 6c 74 65 1. tstvfs filte
3550: 72 20 78 44 65 6c 65 74 65 0a 20 20 74 73 74 76 r xDelete. tstv
3560: 66 73 20 73 63 72 69 70 74 20 78 44 65 6c 65 74 fs script xDelet
3570: 65 43 61 6c 6c 62 61 63 6b 0a 20 20 70 72 6f 63 eCallback. proc
3580: 20 78 44 65 6c 65 74 65 43 61 6c 6c 62 61 63 6b xDeleteCallback
3590: 20 7b 6d 65 74 68 6f 64 20 66 69 6c 65 20 61 72 {method file ar
35a0: 67 73 7d 20 7b 0a 20 20 20 20 73 65 74 20 66 69 gs} {. set fi
35b0: 6c 65 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 66 le [file tail $f
35c0: 69 6c 65 5d 0a 20 20 20 20 69 66 20 7b 20 5b 73 ile]. if { [s
35d0: 74 72 69 6e 67 20 6d 61 74 63 68 20 2a 6d 6a 2a tring match *mj*
35e0: 20 24 66 69 6c 65 5d 20 7d 20 7b 20 66 61 75 6c $file] } { faul
35f0: 74 73 69 6d 5f 73 61 76 65 20 7d 0a 20 20 7d 0a tsim_save }. }.
3600: 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 faultsim_delet
3610: 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 64 e_and_reopen. d
3620: 62 20 66 75 6e 63 20 61 5f 73 74 72 69 6e 67 20 b func a_string
3630: 61 5f 73 74 72 69 6e 67 0a 20 20 65 78 65 63 73 a_string. execs
3640: 71 6c 20 7b 0a 20 20 20 20 41 54 54 41 43 48 20 ql {. ATTACH
3650: 27 74 65 73 74 2e 64 62 32 27 20 41 53 20 61 75 'test.db2' AS au
3660: 78 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f x;. PRAGMA jo
3670: 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c urnal_mode = DEL
3680: 45 54 45 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 ETE;. PRAGMA
3690: 6d 61 69 6e 2e 63 61 63 68 65 5f 73 69 7a 65 20 main.cache_size
36a0: 3d 20 31 30 3b 0a 20 20 20 20 50 52 41 47 4d 41 = 10;. PRAGMA
36b0: 20 61 75 78 2e 63 61 63 68 65 5f 73 69 7a 65 20 aux.cache_size
36c0: 3d 20 31 30 3b 0a 20 20 20 20 43 52 45 41 54 45 = 10;. CREATE
36d0: 20 54 41 42 4c 45 20 74 31 28 61 20 55 4e 49 51 TABLE t1(a UNIQ
36e0: 55 45 2c 20 62 20 55 4e 49 51 55 45 29 3b 0a 20 UE, b UNIQUE);.
36f0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 CREATE TABLE
3700: 61 75 78 2e 74 32 28 61 20 55 4e 49 51 55 45 2c aux.t2(a UNIQUE,
3710: 20 62 20 55 4e 49 51 55 45 29 3b 0a 20 20 20 20 b UNIQUE);.
3720: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 INSERT INTO t1 V
3730: 41 4c 55 45 53 28 61 5f 73 74 72 69 6e 67 28 32 ALUES(a_string(2
3740: 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 33 30 00), a_string(30
3750: 30 29 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 0));. INSERT
3760: 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61 INTO t1 SELECT a
3770: 5f 73 74 72 69 6e 67 28 32 30 30 29 2c 20 61 5f _string(200), a_
3780: 73 74 72 69 6e 67 28 33 30 30 29 20 46 52 4f 4d string(300) FROM
3790: 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 t1;. INSERT
37a0: 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61 INTO t1 SELECT a
37b0: 5f 73 74 72 69 6e 67 28 32 30 30 29 2c 20 61 5f _string(200), a_
37c0: 73 74 72 69 6e 67 28 33 30 30 29 20 46 52 4f 4d string(300) FROM
37d0: 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 t1;. INSERT
37e0: 49 4e 54 4f 20 74 32 20 53 45 4c 45 43 54 20 2a INTO t2 SELECT *
37f0: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 42 45 FROM t1;. BE
3800: 47 49 4e 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 GIN;. INSER
3810: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 T INTO t1 SELECT
3820: 20 61 5f 73 74 72 69 6e 67 28 32 30 31 29 2c 20 a_string(201),
3830: 61 5f 73 74 72 69 6e 67 28 33 30 31 29 20 46 52 a_string(301) FR
3840: 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20 49 4e 53 OM t1;. INS
3850: 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 ERT INTO t1 SELE
3860: 43 54 20 61 5f 73 74 72 69 6e 67 28 32 30 32 29 CT a_string(202)
3870: 2c 20 61 5f 73 74 72 69 6e 67 28 33 30 32 29 20 , a_string(302)
3880: 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20 49 FROM t1;. I
3890: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 NSERT INTO t1 SE
38a0: 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 32 30 LECT a_string(20
38b0: 33 29 2c 20 61 5f 73 74 72 69 6e 67 28 33 30 33 3), a_string(303
38c0: 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20 ) FROM t1;.
38d0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 INSERT INTO t1
38e0: 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 SELECT a_string(
38f0: 32 30 34 29 2c 20 61 5f 73 74 72 69 6e 67 28 33 204), a_string(3
3900: 30 34 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 04) FROM t1;.
3910: 20 20 20 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 REPLACE INTO
3920: 74 32 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d t2 SELECT * FROM
3930: 20 74 31 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b t1;. COMMIT;
3940: 0a 20 20 7d 0a 20 20 64 62 20 63 6c 6f 73 65 0a . }. db close.
3950: 20 20 74 73 74 76 66 73 20 64 65 6c 65 74 65 0a tstvfs delete.
3960: 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 } {}.do_test pag
3970: 65 72 31 2e 34 2e 32 2e 32 20 7b 0a 20 20 66 61 er1.4.2.2 {. fa
3980: 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61 ultsim_restore_a
3990: 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65 63 nd_reopen. exec
39a0: 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 sql {. SELECT
39b0: 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 count(*) FROM t
39c0: 31 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 69 6e 1;. PRAGMA in
39d0: 74 65 67 72 69 74 79 5f 63 68 65 63 6b 3b 0a 20 tegrity_check;.
39e0: 20 7d 0a 7d 20 7b 34 20 6f 6b 7d 0a 64 6f 5f 74 }.} {4 ok}.do_t
39f0: 65 73 74 20 70 61 67 65 72 31 2e 34 2e 32 2e 33 est pager1.4.2.3
3a00: 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 72 65 {. faultsim_re
3a10: 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e store_and_reopen
3a20: 0a 20 20 66 6f 72 65 61 63 68 20 66 20 5b 67 6c . foreach f [gl
3a30: 6f 62 20 74 65 73 74 2e 64 62 2d 6d 6a 2a 5d 20 ob test.db-mj*]
3a40: 7b 20 66 69 6c 65 20 64 65 6c 65 74 65 20 2d 66 { file delete -f
3a50: 6f 72 63 65 20 24 66 20 7d 0a 20 20 65 78 65 63 orce $f }. exec
3a60: 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 sql {. SELECT
3a70: 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 count(*) FROM t
3a80: 31 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 69 6e 1;. PRAGMA in
3a90: 74 65 67 72 69 74 79 5f 63 68 65 63 6b 3b 0a 20 tegrity_check;.
3aa0: 20 7d 0a 7d 20 7b 36 34 20 6f 6b 7d 0a 64 6f 5f }.} {64 ok}.do_
3ab0: 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e 32 2e test pager1.4.2.
3ac0: 34 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 72 4 {. faultsim_r
3ad0: 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65 estore_and_reope
3ae0: 6e 0a 20 20 68 65 78 69 6f 5f 77 72 69 74 65 20 n. hexio_write
3af0: 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 test.db-journal
3b00: 5b 65 78 70 72 20 5b 66 69 6c 65 20 73 69 7a 65 [expr [file size
3b10: 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c test.db-journal
3b20: 5d 2d 32 30 5d 20 31 32 33 34 35 36 0a 20 20 65 ]-20] 123456. e
3b30: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c xecsql {. SEL
3b40: 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f ECT count(*) FRO
3b50: 4d 20 74 31 3b 0a 20 20 20 20 50 52 41 47 4d 41 M t1;. PRAGMA
3b60: 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b integrity_check
3b70: 3b 0a 20 20 7d 0a 7d 20 7b 34 20 6f 6b 7d 0a 64 ;. }.} {4 ok}.d
3b80: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e o_test pager1.4.
3b90: 32 2e 35 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 2.5 {. faultsim
3ba0: 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f _restore_and_reo
3bb0: 70 65 6e 0a 20 20 68 65 78 69 6f 5f 77 72 69 74 pen. hexio_writ
3bc0: 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 e test.db-journa
3bd0: 6c 20 5b 65 78 70 72 20 5b 66 69 6c 65 20 73 69 l [expr [file si
3be0: 7a 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e ze test.db-journ
3bf0: 61 6c 5d 2d 32 30 5d 20 31 32 33 34 35 36 0a 20 al]-20] 123456.
3c00: 20 66 6f 72 65 61 63 68 20 66 20 5b 67 6c 6f 62 foreach f [glob
3c10: 20 74 65 73 74 2e 64 62 2d 6d 6a 2a 5d 20 7b 20 test.db-mj*] {
3c20: 66 69 6c 65 20 64 65 6c 65 74 65 20 2d 66 6f 72 file delete -for
3c30: 63 65 20 24 66 20 7d 0a 20 20 65 78 65 63 73 71 ce $f }. execsq
3c40: 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 63 l {. SELECT c
3c50: 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31 3b ount(*) FROM t1;
3c60: 0a 20 20 20 20 50 52 41 47 4d 41 20 69 6e 74 65 . PRAGMA inte
3c70: 67 72 69 74 79 5f 63 68 65 63 6b 3b 0a 20 20 7d grity_check;. }
3c80: 0a 7d 20 7b 34 20 6f 6b 7d 0a 0a 64 6f 5f 74 65 .} {4 ok}..do_te
3c90: 73 74 20 70 61 67 65 72 31 2e 34 2e 33 2e 31 20 st pager1.4.3.1
3ca0: 7b 0a 20 20 74 65 73 74 76 66 73 20 74 73 74 76 {. testvfs tstv
3cb0: 66 73 20 2d 64 65 66 61 75 6c 74 20 31 0a 20 20 fs -default 1.
3cc0: 74 73 74 76 66 73 20 66 69 6c 74 65 72 20 78 53 tstvfs filter xS
3cd0: 79 6e 63 0a 20 20 74 73 74 76 66 73 20 73 63 72 ync. tstvfs scr
3ce0: 69 70 74 20 78 53 79 6e 63 43 61 6c 6c 62 61 63 ipt xSyncCallbac
3cf0: 6b 0a 20 20 70 72 6f 63 20 78 53 79 6e 63 43 61 k. proc xSyncCa
3d00: 6c 6c 62 61 63 6b 20 7b 6d 65 74 68 6f 64 20 66 llback {method f
3d10: 69 6c 65 20 61 72 67 73 7d 20 7b 0a 20 20 20 20 ile args} {.
3d20: 73 65 74 20 66 69 6c 65 20 5b 66 69 6c 65 20 74 set file [file t
3d30: 61 69 6c 20 24 66 69 6c 65 5d 0a 20 20 20 20 69 ail $file]. i
3d40: 66 20 7b 20 30 3d 3d 5b 73 74 72 69 6e 67 20 6d f { 0==[string m
3d50: 61 74 63 68 20 2a 6a 6f 75 72 6e 61 6c 20 24 66 atch *journal $f
3d60: 69 6c 65 5d 20 7d 20 7b 20 66 61 75 6c 74 73 69 ile] } { faultsi
3d70: 6d 5f 73 61 76 65 20 7d 0a 20 20 7d 0a 20 20 66 m_save }. }. f
3d80: 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 aultsim_delete_a
3d90: 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65 63 nd_reopen. exec
3da0: 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 sql {. PRAGMA
3db0: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 journal_mode =
3dc0: 44 45 4c 45 54 45 3b 0a 20 20 20 20 43 52 45 41 DELETE;. CREA
3dd0: 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 TE TABLE t1(a, b
3de0: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e );. INSERT IN
3df0: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20 TO t1 VALUES(1,
3e00: 32 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 2);. INSERT I
3e10: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 33 2c NTO t1 VALUES(3,
3e20: 20 34 29 3b 0a 20 20 7d 0a 20 20 64 62 20 63 6c 4);. }. db cl
3e30: 6f 73 65 0a 20 20 74 73 74 76 66 73 20 64 65 6c ose. tstvfs del
3e40: 65 74 65 0a 7d 20 7b 7d 0a 0a 66 6f 72 65 61 63 ete.} {}..foreac
3e50: 68 20 7b 74 6e 20 6f 66 73 74 20 76 61 6c 75 65 h {tn ofst value
3e60: 20 72 65 73 75 6c 74 7d 20 7b 0a 20 20 20 20 20 result} {.
3e70: 20 20 20 20 20 32 20 20 20 32 30 20 20 20 20 33 2 20 3
3e80: 31 20 20 20 20 20 20 20 7b 31 20 32 20 33 20 34 1 {1 2 3 4
3e90: 7d 0a 20 20 20 20 20 20 20 20 20 20 33 20 20 20 }. 3
3ea0: 32 30 20 20 20 20 33 32 20 20 20 20 20 20 20 7b 20 32 {
3eb0: 31 20 32 20 33 20 34 7d 0a 20 20 20 20 20 20 20 1 2 3 4}.
3ec0: 20 20 20 34 20 20 20 32 30 20 20 20 20 33 33 20 4 20 33
3ed0: 20 20 20 20 20 20 7b 31 20 32 20 33 20 34 7d 0a {1 2 3 4}.
3ee0: 20 20 20 20 20 20 20 20 20 20 35 20 20 20 32 30 5 20
3ef0: 20 20 20 20 36 35 35 33 36 20 20 20 20 7b 31 20 65536 {1
3f00: 32 20 33 20 34 7d 0a 20 20 20 20 20 20 20 20 20 2 3 4}.
3f10: 20 36 20 20 20 32 30 20 20 20 20 31 33 31 30 37 6 20 13107
3f20: 32 20 20 20 7b 31 20 32 20 33 20 34 7d 0a 0a 20 2 {1 2 3 4}..
3f30: 20 20 20 20 20 20 20 20 20 37 20 20 20 32 34 20 7 24
3f40: 20 20 20 35 31 31 20 20 20 20 20 20 7b 31 20 32 511 {1 2
3f50: 20 33 20 34 7d 0a 20 20 20 20 20 20 20 20 20 20 3 4}.
3f60: 38 20 20 20 32 34 20 20 20 20 35 31 33 20 20 20 8 24 513
3f70: 20 20 20 7b 31 20 32 20 33 20 34 7d 0a 20 20 20 {1 2 3 4}.
3f80: 20 20 20 20 20 20 20 39 20 20 20 32 34 20 20 20 9 24
3f90: 20 36 35 35 33 36 20 20 20 20 7b 31 20 32 20 33 65536 {1 2 3
3fa0: 20 34 7d 0a 0a 20 20 20 20 20 20 20 20 20 31 30 4}.. 10
3fb0: 20 20 20 33 32 20 20 20 20 36 35 35 33 36 20 20 32 65536
3fc0: 20 20 7b 31 20 32 7d 0a 7d 20 7b 0a 20 20 64 6f {1 2}.} {. do
3fd0: 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e 33 _test pager1.4.3
3fe0: 2e 24 74 6e 20 7b 0a 20 20 20 20 66 61 75 6c 74 .$tn {. fault
3ff0: 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f sim_restore_and_
4000: 72 65 6f 70 65 6e 0a 20 20 20 20 68 65 78 69 6f reopen. hexio
4010: 5f 77 72 69 74 65 20 74 65 73 74 2e 64 62 2d 6a _write test.db-j
4020: 6f 75 72 6e 61 6c 20 24 6f 66 73 74 20 5b 66 6f ournal $ofst [fo
4030: 72 6d 61 74 20 25 2e 38 78 20 24 76 61 6c 75 65 rmat %.8x $value
4040: 5d 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 ]. execsql {
4050: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 SELECT * FROM t1
4060: 20 7d 0a 20 20 7d 20 24 72 65 73 75 6c 74 0a 7d }. } $result.}
4070: 0a 64 62 20 63 6c 6f 73 65 0a 0a 23 20 53 65 74 .db close..# Set
4080: 20 75 70 20 61 20 56 46 53 20 74 68 61 74 20 73 up a VFS that s
4090: 6e 61 70 73 68 6f 74 73 20 74 68 65 20 66 69 6c napshots the fil
40a0: 65 2d 73 79 73 74 65 6d 20 6a 75 73 74 20 62 65 e-system just be
40b0: 66 6f 72 65 20 61 20 6d 61 73 74 65 72 20 6a 6f fore a master jo
40c0: 75 72 6e 61 6c 0a 23 20 66 69 6c 65 20 69 73 20 urnal.# file is
40d0: 64 65 6c 65 74 65 64 20 74 6f 20 63 6f 6d 6d 69 deleted to commi
40e0: 74 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 74 t a multi-file t
40f0: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 53 70 65 63 ransaction. Spec
4100: 69 66 69 63 61 6c 6c 79 2c 20 74 68 65 0a 23 20 ifically, the.#
4110: 66 69 6c 65 2d 73 79 73 74 65 6d 20 69 73 20 73 file-system is s
4120: 61 76 65 64 20 6a 75 73 74 20 62 65 66 6f 72 65 aved just before
4130: 20 74 68 65 20 78 44 65 6c 65 74 65 28 29 20 63 the xDelete() c
4140: 61 6c 6c 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 all to remove th
4150: 65 20 0a 23 20 6d 61 73 74 65 72 20 6a 6f 75 72 e .# master jour
4160: 6e 61 6c 20 66 69 6c 65 20 66 72 6f 6d 20 74 68 nal file from th
4170: 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e 0a 23 e file-system..#
4180: 0a 74 65 73 74 76 66 73 20 74 76 20 2d 64 65 66 .testvfs tv -def
4190: 61 75 6c 74 20 31 0a 74 76 20 73 63 72 69 70 74 ault 1.tv script
41a0: 20 63 6f 70 79 5f 6f 6e 5f 6d 6a 5f 64 65 6c 65 copy_on_mj_dele
41b0: 74 65 0a 73 65 74 20 3a 3a 6d 6a 5f 66 69 6c 65 te.set ::mj_file
41c0: 6e 61 6d 65 5f 6c 65 6e 67 74 68 20 30 0a 70 72 name_length 0.pr
41d0: 6f 63 20 63 6f 70 79 5f 6f 6e 5f 6d 6a 5f 64 65 oc copy_on_mj_de
41e0: 6c 65 74 65 20 7b 6d 65 74 68 6f 64 20 66 69 6c lete {method fil
41f0: 65 6e 61 6d 65 20 61 72 67 73 7d 20 7b 0a 20 20 ename args} {.
4200: 69 66 20 7b 5b 73 74 72 69 6e 67 20 6d 61 74 63 if {[string matc
4210: 68 20 2a 6d 6a 2a 20 5b 66 69 6c 65 20 74 61 69 h *mj* [file tai
4220: 6c 20 24 66 69 6c 65 6e 61 6d 65 5d 5d 7d 20 7b l $filename]]} {
4230: 20 0a 20 20 20 20 73 65 74 20 3a 3a 6d 6a 5f 66 . set ::mj_f
4240: 69 6c 65 6e 61 6d 65 5f 6c 65 6e 67 74 68 20 5b ilename_length [
4250: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 66 string length $f
4260: 69 6c 65 6e 61 6d 65 5d 0a 20 20 20 20 66 61 75 ilename]. fau
4270: 6c 74 73 69 6d 5f 73 61 76 65 20 0a 20 20 7d 0a ltsim_save . }.
4280: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f return SQLITE_
4290: 4f 4b 0a 7d 0a 0a 73 65 74 20 70 77 64 20 5b 70 OK.}..set pwd [p
42a0: 77 64 5d 0a 66 6f 72 65 61 63 68 20 7b 74 6e 31 wd].foreach {tn1
42b0: 20 74 63 6c 7d 20 7b 0a 20 20 31 20 7b 20 73 65 tcl} {. 1 { se
42c0: 74 20 70 72 65 66 69 78 20 22 74 65 73 74 2e 64 t prefix "test.d
42d0: 62 22 20 7d 0a 20 20 32 20 7b 20 0a 20 20 20 20 b" }. 2 { .
42e0: 23 20 54 68 69 73 20 74 65 73 74 20 64 65 70 65 # This test depe
42f0: 6e 64 73 20 6f 6e 20 74 68 65 20 75 6e 64 65 72 nds on the under
4300: 6c 79 69 6e 67 20 56 46 53 20 62 65 69 6e 67 20 lying VFS being
4310: 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 70 61 74 able to open pat
4320: 68 73 0a 20 20 20 20 23 20 35 31 32 20 62 79 74 hs. # 512 byt
4330: 65 73 20 69 6e 20 6c 65 6e 67 74 68 2e 20 54 68 es in length. Th
4340: 65 20 69 64 65 61 20 69 73 20 74 6f 20 63 72 65 e idea is to cre
4350: 61 74 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 ate a hot-journa
4360: 6c 20 66 69 6c 65 20 74 68 61 74 0a 20 20 20 20 l file that.
4370: 23 20 63 6f 6e 74 61 69 6e 73 20 61 20 6d 61 73 # contains a mas
4380: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e ter-journal poin
4390: 74 65 72 20 73 6f 20 6c 61 72 67 65 20 74 68 61 ter so large tha
43a0: 74 20 69 74 20 63 6f 75 6c 64 20 63 6f 6e 74 61 t it could conta
43b0: 69 6e 0a 20 20 20 20 23 20 61 20 76 61 6c 69 64 in. # a valid
43c0: 20 70 61 67 65 20 72 65 63 6f 72 64 20 28 69 66 page record (if
43d0: 20 74 68 65 20 66 69 6c 65 20 70 61 67 65 2d 73 the file page-s
43e0: 69 7a 65 20 69 73 20 35 31 32 20 62 79 74 65 73 ize is 512 bytes
43f0: 29 2e 20 53 6f 20 61 73 20 74 6f 0a 20 20 20 20 ). So as to.
4400: 23 20 6d 61 6b 65 20 73 75 72 65 20 53 51 4c 69 # make sure SQLi
4410: 74 65 20 64 6f 65 73 6e 27 74 20 67 65 74 20 63 te doesn't get c
4420: 6f 6e 66 75 73 65 64 20 62 79 20 74 68 69 73 2e onfused by this.
4430: 0a 20 20 20 20 23 0a 20 20 20 20 73 65 74 20 6e . #. set n
4440: 50 61 64 64 69 6e 67 20 5b 65 78 70 72 20 35 31 Padding [expr 51
4450: 31 20 2d 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 1 - $::mj_filena
4460: 6d 65 5f 6c 65 6e 67 74 68 5d 0a 0a 20 20 20 20 me_length]..
4470: 23 20 57 65 20 63 61 6e 6e 6f 74 20 6a 75 73 74 # We cannot just
4480: 20 63 72 65 61 74 65 20 61 20 72 65 61 6c 6c 79 create a really
4490: 20 6c 6f 6e 67 20 64 61 74 61 62 61 73 65 20 66 long database f
44a0: 69 6c 65 20 6e 61 6d 65 20 74 6f 20 6f 70 65 6e ile name to open
44b0: 2c 20 61 73 0a 20 20 20 20 23 20 4c 69 6e 75 78 , as. # Linux
44c0: 20 6c 69 6d 69 74 73 20 61 20 73 69 6e 67 6c 65 limits a single
44d0: 20 63 6f 6d 70 6f 6e 65 6e 74 20 6f 66 20 61 20 component of a
44e0: 70 61 74 68 20 74 6f 20 32 35 35 20 62 79 74 65 path to 255 byte
44f0: 73 20 62 79 20 64 65 66 61 75 6c 74 0a 20 20 20 s by default.
4500: 20 23 20 28 61 6e 64 20 70 72 65 73 75 6d 61 62 # (and presumab
4510: 6c 79 20 6f 74 68 65 72 20 73 79 73 74 65 6d 73 ly other systems
4520: 20 68 61 76 65 20 6c 69 6d 69 74 73 20 74 6f 6f have limits too
4530: 29 2e 20 53 6f 20 63 72 65 61 74 65 20 61 20 64 ). So create a d
4540: 69 72 65 63 74 6f 72 79 0a 20 20 20 20 23 20 68 irectory. # h
4550: 69 65 72 61 72 63 68 79 20 74 6f 20 77 6f 72 6b ierarchy to work
4560: 20 69 6e 2e 0a 20 20 20 20 23 0a 20 20 20 20 73 in.. #. s
4570: 65 74 20 64 69 72 6e 61 6d 65 20 22 64 31 32 33 et dirname "d123
4580: 34 35 36 37 38 39 30 31 32 33 34 35 36 37 38 39 4567890123456789
4590: 30 31 32 33 34 35 36 37 38 39 30 2f 22 0a 20 20 01234567890/".
45a0: 20 20 73 65 74 20 6e 44 69 72 20 5b 65 78 70 72 set nDir [expr
45b0: 20 24 6e 50 61 64 64 69 6e 67 20 2f 20 33 32 5d $nPadding / 32]
45c0: 0a 20 20 20 20 69 66 20 7b 20 24 6e 44 69 72 20 . if { $nDir
45d0: 7d 20 7b 0a 20 20 20 20 20 20 73 65 74 20 70 20 } {. set p
45e0: 5b 73 74 72 69 6e 67 20 72 65 70 65 61 74 20 24 [string repeat $
45f0: 64 69 72 6e 61 6d 65 20 24 6e 44 69 72 5d 0a 20 dirname $nDir].
4600: 20 20 20 20 20 66 69 6c 65 20 6d 6b 64 69 72 20 file mkdir
4610: 24 70 0a 20 20 20 20 20 20 63 64 20 24 70 0a 20 $p. cd $p.
4620: 20 20 20 7d 0a 0a 20 20 20 20 73 65 74 20 70 61 }.. set pa
4630: 64 64 69 6e 67 20 5b 73 74 72 69 6e 67 20 72 65 dding [string re
4640: 70 65 61 74 20 78 20 5b 65 78 70 72 20 24 6e 50 peat x [expr $nP
4650: 61 64 64 69 6e 67 20 25 33 32 5d 5d 0a 20 20 20 adding %32]].
4660: 20 73 65 74 20 70 72 65 66 69 78 20 22 74 65 73 set prefix "tes
4670: 74 2e 64 62 24 7b 70 61 64 64 69 6e 67 7d 22 0a t.db${padding}".
4680: 20 20 7d 0a 7d 20 7b 0a 20 20 65 76 61 6c 20 24 }.} {. eval $
4690: 74 63 6c 0a 20 20 66 6f 72 65 61 63 68 20 7b 74 tcl. foreach {t
46a0: 6e 32 20 73 71 6c 7d 20 7b 0a 20 20 20 20 6f 20 n2 sql} {. o
46b0: 7b 20 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 { . PRAGMA
46c0: 6d 61 69 6e 2e 73 79 6e 63 68 72 6f 6e 6f 75 73 main.synchronous
46d0: 3d 4f 46 46 3b 0a 20 20 20 20 20 20 50 52 41 47 =OFF;. PRAG
46e0: 4d 41 20 61 75 78 2e 73 79 6e 63 68 72 6f 6e 6f MA aux.synchrono
46f0: 75 73 3d 4f 46 46 3b 0a 20 20 20 20 7d 0a 20 20 us=OFF;. }.
4700: 20 20 6f 35 31 32 20 7b 20 0a 20 20 20 20 20 20 o512 { .
4710: 50 52 41 47 4d 41 20 6d 61 69 6e 2e 73 79 6e 63 PRAGMA main.sync
4720: 68 72 6f 6e 6f 75 73 3d 4f 46 46 3b 0a 20 20 20 hronous=OFF;.
4730: 20 20 20 50 52 41 47 4d 41 20 61 75 78 2e 73 79 PRAGMA aux.sy
4740: 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46 46 3b 0a 20 nchronous=OFF;.
4750: 20 20 20 20 20 50 52 41 47 4d 41 20 6d 61 69 6e PRAGMA main
4760: 2e 70 61 67 65 5f 73 69 7a 65 20 3d 20 35 31 32 .page_size = 512
4770: 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 61 ;. PRAGMA a
4780: 75 78 2e 70 61 67 65 5f 73 69 7a 65 20 3d 20 35 ux.page_size = 5
4790: 31 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 20 12;. }. n
47a0: 7b 20 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 { . PRAGMA
47b0: 6d 61 69 6e 2e 73 79 6e 63 68 72 6f 6e 6f 75 73 main.synchronous
47c0: 3d 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 20 20 50 =NORMAL;. P
47d0: 52 41 47 4d 41 20 61 75 78 2e 73 79 6e 63 68 72 RAGMA aux.synchr
47e0: 6f 6e 6f 75 73 3d 4e 4f 52 4d 41 4c 3b 0a 20 20 onous=NORMAL;.
47f0: 20 20 7d 0a 20 20 20 20 66 20 7b 20 0a 20 20 20 }. f { .
4800: 20 20 20 50 52 41 47 4d 41 20 6d 61 69 6e 2e 73 PRAGMA main.s
4810: 79 6e 63 68 72 6f 6e 6f 75 73 3d 46 55 4c 4c 3b ynchronous=FULL;
4820: 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 61 75 . PRAGMA au
4830: 78 2e 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 46 55 x.synchronous=FU
4840: 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 0a LL;. }. } {.
4850: 0a 20 20 20 20 73 65 74 20 74 6e 20 22 24 7b 74 . set tn "${t
4860: 6e 31 7d 2e 24 7b 74 6e 32 7d 22 0a 20 20 0a 20 n1}.${tn2}". .
4870: 20 20 20 23 20 53 65 74 20 75 70 20 61 20 63 6f # Set up a co
4880: 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 68 61 76 65 nnection to have
4890: 20 74 77 6f 20 64 61 74 61 62 61 73 65 73 2c 20 two databases,
48a0: 74 65 73 74 2e 64 62 20 28 6d 61 69 6e 29 20 61 test.db (main) a
48b0: 6e 64 20 0a 20 20 20 20 23 20 74 65 73 74 2e 64 nd . # test.d
48c0: 62 32 20 28 61 75 78 29 2e 20 54 68 65 6e 20 72 b2 (aux). Then r
48d0: 75 6e 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 un a multi-file
48e0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 transaction on t
48f0: 68 65 6d 2e 20 54 68 65 0a 20 20 20 20 23 20 56 hem. The. # V
4900: 46 53 20 77 69 6c 6c 20 73 6e 61 70 73 68 6f 74 FS will snapshot
4910: 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d the file-system
4920: 20 6a 75 73 74 20 62 65 66 6f 72 65 20 74 68 65 just before the
4930: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 0a master-journal.
4940: 20 20 20 20 23 20 66 69 6c 65 20 69 73 20 64 65 # file is de
4950: 6c 65 74 65 64 20 74 6f 20 63 6f 6d 6d 69 74 20 leted to commit
4960: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e the transaction.
4970: 0a 20 20 20 20 23 0a 20 20 20 20 74 76 20 66 69 . #. tv fi
4980: 6c 74 65 72 20 78 44 65 6c 65 74 65 0a 20 20 20 lter xDelete.
4990: 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d do_test pager1-
49a0: 34 2e 34 2e 24 74 6e 2e 31 20 7b 0a 20 20 20 20 4.4.$tn.1 {.
49b0: 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 faultsim_delet
49c0: 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 20 24 70 72 e_and_reopen $pr
49d0: 65 66 69 78 0a 20 20 20 20 20 20 65 78 65 63 73 efix. execs
49e0: 71 6c 20 22 0a 20 20 20 20 20 20 20 20 41 54 54 ql ". ATT
49f0: 41 43 48 20 27 24 7b 70 72 65 66 69 78 7d 32 27 ACH '${prefix}2'
4a00: 20 41 53 20 61 75 78 3b 0a 20 20 20 20 20 20 20 AS aux;.
4a10: 20 24 73 71 6c 0a 20 20 20 20 20 20 20 20 43 52 $sql. CR
4a20: 45 41 54 45 20 54 41 42 4c 45 20 61 28 78 29 3b EATE TABLE a(x);
4a30: 0a 20 20 20 20 20 20 20 20 43 52 45 41 54 45 20 . CREATE
4a40: 54 41 42 4c 45 20 61 75 78 2e 62 28 78 29 3b 0a TABLE aux.b(x);.
4a50: 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 INSERT I
4a60: 4e 54 4f 20 61 20 56 41 4c 55 45 53 28 27 64 6f NTO a VALUES('do
4a70: 75 62 6c 65 2d 79 6f 75 27 29 3b 0a 20 20 20 20 uble-you');.
4a80: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 INSERT INTO
4a90: 61 20 56 41 4c 55 45 53 28 27 77 68 79 27 29 3b a VALUES('why');
4aa0: 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 . INSERT
4ab0: 49 4e 54 4f 20 61 20 56 41 4c 55 45 53 28 27 7a INTO a VALUES('z
4ac0: 65 64 27 29 3b 0a 20 20 20 20 20 20 20 20 49 4e ed');. IN
4ad0: 53 45 52 54 20 49 4e 54 4f 20 62 20 56 41 4c 55 SERT INTO b VALU
4ae0: 45 53 28 27 77 6f 6e 27 29 3b 0a 20 20 20 20 20 ES('won');.
4af0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 62 INSERT INTO b
4b00: 20 56 41 4c 55 45 53 28 27 74 6f 6f 27 29 3b 0a VALUES('too');.
4b10: 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 INSERT I
4b20: 4e 54 4f 20 62 20 56 41 4c 55 45 53 28 27 66 72 NTO b VALUES('fr
4b30: 65 65 27 29 3b 0a 20 20 20 20 20 20 22 0a 20 20 ee');. ".
4b40: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 execsql {.
4b50: 20 20 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 BEGIN;.
4b60: 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e INSERT IN
4b70: 54 4f 20 61 20 53 45 4c 45 43 54 20 2a 20 46 52 TO a SELECT * FR
4b80: 4f 4d 20 62 20 57 48 45 52 45 20 72 6f 77 69 64 OM b WHERE rowid
4b90: 3c 3d 33 3b 0a 20 20 20 20 20 20 20 20 20 20 49 <=3;. I
4ba0: 4e 53 45 52 54 20 49 4e 54 4f 20 62 20 53 45 4c NSERT INTO b SEL
4bb0: 45 43 54 20 2a 20 46 52 4f 4d 20 61 20 57 48 45 ECT * FROM a WHE
4bc0: 52 45 20 72 6f 77 69 64 3c 3d 33 3b 0a 20 20 20 RE rowid<=3;.
4bd0: 20 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 20 COMMIT;.
4be0: 20 20 20 7d 0a 20 20 20 20 7d 20 7b 7d 0a 20 20 }. } {}.
4bf0: 20 20 74 76 20 66 69 6c 74 65 72 20 7b 7d 0a 20 tv filter {}.
4c00: 20 20 20 0a 20 20 20 20 23 20 43 68 65 63 6b 20 . # Check
4c10: 74 68 61 74 20 74 68 65 20 74 72 61 6e 73 61 63 that the transac
4c20: 74 69 6f 6e 20 77 61 73 20 63 6f 6d 6d 69 74 74 tion was committ
4c30: 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e ed successfully.
4c40: 0a 20 20 20 20 23 0a 20 20 20 20 64 6f 5f 65 78 . #. do_ex
4c50: 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 ecsql_test pager
4c60: 31 2d 34 2e 34 2e 24 74 6e 2e 32 20 7b 0a 20 20 1-4.4.$tn.2 {.
4c70: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f SELECT * FRO
4c80: 4d 20 61 0a 20 20 20 20 7d 20 7b 64 6f 75 62 6c M a. } {doubl
4c90: 65 2d 79 6f 75 20 77 68 79 20 7a 65 64 20 77 6f e-you why zed wo
4ca0: 6e 20 74 6f 6f 20 66 72 65 65 7d 0a 20 20 20 20 n too free}.
4cb0: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 do_execsql_test
4cc0: 70 61 67 65 72 31 2d 34 2e 34 2e 24 74 6e 2e 33 pager1-4.4.$tn.3
4cd0: 20 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 {. SELECT
4ce0: 2a 20 46 52 4f 4d 20 62 0a 20 20 20 20 7d 20 7b * FROM b. } {
4cf0: 77 6f 6e 20 74 6f 6f 20 66 72 65 65 20 64 6f 75 won too free dou
4d00: 62 6c 65 2d 79 6f 75 20 77 68 79 20 7a 65 64 7d ble-you why zed}
4d10: 0a 20 20 20 20 0a 20 20 20 20 23 20 52 65 73 74 . . # Rest
4d20: 6f 72 65 20 74 68 65 20 66 69 6c 65 2d 73 79 73 ore the file-sys
4d30: 74 65 6d 20 61 6e 64 20 72 65 6f 70 65 6e 20 74 tem and reopen t
4d40: 68 65 20 64 61 74 61 62 61 73 65 73 2e 20 43 68 he databases. Ch
4d50: 65 63 6b 20 74 68 61 74 20 69 74 20 6e 6f 77 0a eck that it now.
4d60: 20 20 20 20 23 20 61 70 70 65 61 72 73 20 74 68 # appears th
4d70: 61 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 at the transacti
4d80: 6f 6e 20 77 61 73 20 6e 6f 74 20 63 6f 6d 6d 69 on was not commi
4d90: 74 74 65 64 20 28 62 65 63 61 75 73 65 20 74 68 tted (because th
4da0: 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 0a 20 20 e file-system.
4db0: 20 20 23 20 77 61 73 20 72 65 73 74 6f 72 65 64 # was restored
4dc0: 20 74 6f 20 74 68 65 20 73 74 61 74 65 20 77 68 to the state wh
4dd0: 65 72 65 20 69 74 20 68 61 64 20 6e 6f 74 20 62 ere it had not b
4de0: 65 65 6e 29 2e 0a 20 20 20 20 23 0a 20 20 20 20 een).. #.
4df0: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 34 do_test pager1-4
4e00: 2e 34 2e 24 74 6e 2e 34 20 7b 0a 20 20 20 20 20 .4.$tn.4 {.
4e10: 20 66 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72 faultsim_restor
4e20: 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 20 24 70 72 e_and_reopen $pr
4e30: 65 66 69 78 0a 20 20 20 20 20 20 65 78 65 63 73 efix. execs
4e40: 71 6c 20 22 41 54 54 41 43 48 20 27 24 7b 70 72 ql "ATTACH '${pr
4e50: 65 66 69 78 7d 32 27 20 41 53 20 61 75 78 22 0a efix}2' AS aux".
4e60: 20 20 20 20 7d 20 7b 7d 0a 20 20 20 20 64 6f 5f } {}. do_
4e70: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 execsql_test pag
4e80: 65 72 31 2d 34 2e 34 2e 24 74 6e 2e 35 20 7b 53 er1-4.4.$tn.5 {S
4e90: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 61 7d 20 ELECT * FROM a}
4ea0: 7b 64 6f 75 62 6c 65 2d 79 6f 75 20 77 68 79 20 {double-you why
4eb0: 7a 65 64 7d 0a 20 20 20 20 64 6f 5f 65 78 65 63 zed}. do_exec
4ec0: 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d sql_test pager1-
4ed0: 34 2e 34 2e 24 74 6e 2e 36 20 7b 53 45 4c 45 43 4.4.$tn.6 {SELEC
4ee0: 54 20 2a 20 46 52 4f 4d 20 62 7d 20 7b 77 6f 6e T * FROM b} {won
4ef0: 20 74 6f 6f 20 66 72 65 65 7d 0a 20 20 20 20 0a too free}. .
4f00: 20 20 20 20 23 20 52 65 73 74 6f 72 65 20 74 68 # Restore th
4f10: 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 61 67 e file-system ag
4f20: 61 69 6e 2e 20 54 68 69 73 20 74 69 6d 65 2c 20 ain. This time,
4f30: 62 65 66 6f 72 65 20 72 65 6f 70 65 6e 69 6e 67 before reopening
4f40: 20 74 68 65 20 64 61 74 61 62 61 73 65 73 2c 0a the databases,.
4f50: 20 20 20 20 23 20 64 65 6c 65 74 65 20 74 68 65 # delete the
4f60: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 master-journal
4f70: 66 69 6c 65 20 66 72 6f 6d 20 74 68 65 20 66 69 file from the fi
4f80: 6c 65 2d 73 79 73 74 65 6d 2e 20 49 74 20 6e 6f le-system. It no
4f90: 77 20 61 70 70 65 61 72 73 20 74 68 61 74 0a 20 w appears that.
4fa0: 20 20 20 23 20 74 68 65 20 74 72 61 6e 73 61 63 # the transac
4fb0: 74 69 6f 6e 20 77 61 73 20 63 6f 6d 6d 69 74 74 tion was committ
4fc0: 65 64 20 28 6e 6f 20 6d 61 73 74 65 72 2d 6a 6f ed (no master-jo
4fd0: 75 72 6e 61 6c 20 66 69 6c 65 20 3d 3d 20 6e 6f urnal file == no
4fe0: 20 72 6f 6c 6c 62 61 63 6b 29 2e 0a 20 20 20 20 rollback)..
4ff0: 23 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 70 61 #. do_test pa
5000: 67 65 72 31 2d 34 2e 34 2e 24 74 6e 2e 37 20 7b ger1-4.4.$tn.7 {
5010: 0a 20 20 20 20 20 20 66 61 75 6c 74 73 69 6d 5f . faultsim_
5020: 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 restore_and_reop
5030: 65 6e 20 24 70 72 65 66 69 78 0a 20 20 20 20 20 en $prefix.
5040: 20 66 6f 72 65 61 63 68 20 66 20 5b 67 6c 6f 62 foreach f [glob
5050: 20 24 7b 70 72 65 66 69 78 7d 2d 6d 6a 2a 5d 20 ${prefix}-mj*]
5060: 7b 20 66 69 6c 65 20 64 65 6c 65 74 65 20 2d 66 { file delete -f
5070: 6f 72 63 65 20 24 66 20 7d 0a 20 20 20 20 20 20 orce $f }.
5080: 65 78 65 63 73 71 6c 20 22 41 54 54 41 43 48 20 execsql "ATTACH
5090: 27 24 7b 70 72 65 66 69 78 7d 32 27 20 41 53 20 '${prefix}2' AS
50a0: 61 75 78 22 0a 20 20 20 20 7d 20 7b 7d 0a 20 20 aux". } {}.
50b0: 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 do_execsql_tes
50c0: 74 20 70 61 67 65 72 31 2d 34 2e 34 2e 24 74 6e t pager1-4.4.$tn
50d0: 2e 38 20 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 .8 {. SELEC
50e0: 54 20 2a 20 46 52 4f 4d 20 61 0a 20 20 20 20 7d T * FROM a. }
50f0: 20 7b 64 6f 75 62 6c 65 2d 79 6f 75 20 77 68 79 {double-you why
5100: 20 7a 65 64 20 77 6f 6e 20 74 6f 6f 20 66 72 65 zed won too fre
5110: 65 7d 0a 20 20 20 20 64 6f 5f 65 78 65 63 73 71 e}. do_execsq
5120: 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 34 2e l_test pager1-4.
5130: 34 2e 24 74 6e 2e 39 20 7b 0a 20 20 20 20 20 20 4.$tn.9 {.
5140: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 62 0a SELECT * FROM b.
5150: 20 20 20 20 7d 20 7b 77 6f 6e 20 74 6f 6f 20 66 } {won too f
5160: 72 65 65 20 64 6f 75 62 6c 65 2d 79 6f 75 20 77 ree double-you w
5170: 68 79 20 7a 65 64 7d 0a 20 20 7d 0a 0a 20 20 63 hy zed}. }.. c
5180: 64 20 24 70 77 64 0a 7d 0a 64 62 20 63 6c 6f 73 d $pwd.}.db clos
5190: 65 0a 74 76 20 64 65 6c 65 74 65 0a 66 69 6c 65 e.tv delete.file
51a0: 20 64 65 6c 65 74 65 20 2d 66 6f 72 63 65 20 24 delete -force $
51b0: 64 69 72 6e 61 6d 65 0a 0a 0a 23 20 53 65 74 20 dirname...# Set
51c0: 75 70 20 61 20 56 46 53 20 74 6f 20 6d 61 6b 65 up a VFS to make
51d0: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 66 a copy of the f
51e0: 69 6c 65 2d 73 79 73 74 65 6d 20 6a 75 73 74 20 ile-system just
51f0: 62 65 66 6f 72 65 20 64 65 6c 65 74 69 6e 67 20 before deleting
5200: 61 0a 23 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 a.# journal file
5210: 20 74 6f 20 63 6f 6d 6d 69 74 20 61 20 74 72 61 to commit a tra
5220: 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 74 72 nsaction. The tr
5230: 61 6e 73 61 63 74 69 6f 6e 20 6d 6f 64 69 66 69 ansaction modifi
5240: 65 73 20 65 78 61 63 74 6c 79 0a 23 20 74 77 6f es exactly.# two
5250: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 73 20 database pages
5260: 28 61 6e 64 20 70 61 67 65 20 31 20 2d 20 74 68 (and page 1 - th
5270: 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 e change counter
5280: 29 2e 0a 23 0a 74 65 73 74 76 66 73 20 74 76 20 )..#.testvfs tv
5290: 2d 64 65 66 61 75 6c 74 20 31 0a 74 76 20 73 65 -default 1.tv se
52a0: 63 74 6f 72 73 69 7a 65 20 35 31 32 0a 74 76 20 ctorsize 512.tv
52b0: 73 63 72 69 70 74 20 63 6f 70 79 5f 6f 6e 5f 6a script copy_on_j
52c0: 6f 75 72 6e 61 6c 5f 64 65 6c 65 74 65 0a 74 76 ournal_delete.tv
52d0: 20 66 69 6c 74 65 72 20 78 44 65 6c 65 74 65 0a filter xDelete.
52e0: 70 72 6f 63 20 63 6f 70 79 5f 6f 6e 5f 6a 6f 75 proc copy_on_jou
52f0: 72 6e 61 6c 5f 64 65 6c 65 74 65 20 7b 6d 65 74 rnal_delete {met
5300: 68 6f 64 20 66 69 6c 65 6e 61 6d 65 20 61 72 67 hod filename arg
5310: 73 7d 20 7b 0a 20 20 69 66 20 7b 5b 73 74 72 69 s} {. if {[stri
5320: 6e 67 20 6d 61 74 63 68 20 2a 6a 6f 75 72 6e 61 ng match *journa
5330: 6c 20 24 66 69 6c 65 6e 61 6d 65 5d 7d 20 66 61 l $filename]} fa
5340: 75 6c 74 73 69 6d 5f 73 61 76 65 20 0a 20 20 72 ultsim_save . r
5350: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a eturn SQLITE_OK.
5360: 7d 0a 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 }.faultsim_delet
5370: 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 64 6f 5f e_and_reopen.do_
5380: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 execsql_test pag
5390: 65 72 31 2e 34 2e 35 2e 31 20 7b 0a 20 20 50 52 er1.4.5.1 {. PR
53a0: 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d AGMA page_size =
53b0: 20 31 30 32 34 3b 0a 20 20 43 52 45 41 54 45 20 1024;. CREATE
53c0: 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a TABLE t1(a, b);.
53d0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 CREATE TABLE t
53e0: 32 28 61 2c 20 62 29 3b 0a 20 20 49 4e 53 45 52 2(a, b);. INSER
53f0: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 T INTO t1 VALUES
5400: 28 27 49 27 2c 20 27 49 49 27 29 3b 0a 20 20 49 ('I', 'II');. I
5410: 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 NSERT INTO t2 VA
5420: 4c 55 45 53 28 27 49 49 49 27 2c 20 27 49 56 27 LUES('III', 'IV'
5430: 29 3b 0a 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 );. BEGIN;.
5440: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 INSERT INTO t1 V
5450: 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20 20 20 ALUES(1, 2);.
5460: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 INSERT INTO t2
5470: 56 41 4c 55 45 53 28 33 2c 20 34 29 3b 0a 20 20 VALUES(3, 4);.
5480: 43 4f 4d 4d 49 54 3b 0a 7d 20 7b 7d 0a 74 76 20 COMMIT;.} {}.tv
5490: 66 69 6c 74 65 72 20 7b 7d 0a 0a 23 20 43 68 65 filter {}..# Che
54a0: 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 ck the transacti
54b0: 6f 6e 20 77 61 73 20 63 6f 6d 6d 69 74 74 65 64 on was committed
54c0: 3a 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 :.#.do_execsql_t
54d0: 65 73 74 20 70 61 67 65 72 31 2e 34 2e 35 2e 32 est pager1.4.5.2
54e0: 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 {. SELECT * FR
54f0: 4f 4d 20 74 31 3b 0a 20 20 53 45 4c 45 43 54 20 OM t1;. SELECT
5500: 2a 20 46 52 4f 4d 20 74 32 3b 0a 7d 20 7b 49 20 * FROM t2;.} {I
5510: 49 49 20 31 20 32 20 49 49 49 20 49 56 20 33 20 II 1 2 III IV 3
5520: 34 7d 0a 0a 23 20 4e 6f 77 20 74 72 79 20 66 6f 4}..# Now try fo
5530: 75 72 20 74 65 73 74 73 3a 0a 23 0a 23 20 20 70 ur tests:.#.# p
5540: 61 67 65 72 31 2d 34 2e 35 2e 33 3a 20 52 65 73 ager1-4.5.3: Res
5550: 74 6f 72 65 20 74 68 65 20 66 69 6c 65 2d 73 79 tore the file-sy
5560: 73 74 65 6d 2e 20 43 68 65 63 6b 20 74 68 61 74 stem. Check that
5570: 20 74 68 65 20 77 68 6f 6c 65 20 74 72 61 6e 73 the whole trans
5580: 61 63 74 69 6f 6e 20 0a 23 20 20 20 20 20 20 20 action .#
5590: 20 20 20 20 20 20 20 20 20 69 73 20 72 6f 6c 6c is roll
55a0: 65 64 20 62 61 63 6b 2e 0a 23 0a 23 20 20 70 61 ed back..#.# pa
55b0: 67 65 72 31 2d 34 2e 35 2e 34 3a 20 52 65 73 74 ger1-4.5.4: Rest
55c0: 6f 72 65 20 74 68 65 20 66 69 6c 65 2d 73 79 73 ore the file-sys
55d0: 74 65 6d 2e 20 43 6f 72 72 75 70 74 20 74 68 65 tem. Corrupt the
55e0: 20 66 69 72 73 74 20 72 65 63 6f 72 64 20 69 6e first record in
55f0: 20 74 68 65 0a 23 20 20 20 20 20 20 20 20 20 20 the.#
5600: 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 2e 20 43 journal. C
5610: 68 65 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63 heck the transac
5620: 74 69 6f 6e 20 69 73 20 6e 6f 74 20 72 6f 6c 6c tion is not roll
5630: 65 64 20 62 61 63 6b 2e 0a 23 0a 23 20 20 70 61 ed back..#.# pa
5640: 67 65 72 31 2d 34 2e 35 2e 35 3a 20 52 65 73 74 ger1-4.5.5: Rest
5650: 6f 72 65 20 74 68 65 20 66 69 6c 65 2d 73 79 73 ore the file-sys
5660: 74 65 6d 2e 20 43 6f 72 72 75 70 74 20 74 68 65 tem. Corrupt the
5670: 20 73 65 63 6f 6e 64 20 72 65 63 6f 72 64 20 69 second record i
5680: 6e 20 74 68 65 0a 23 20 20 20 20 20 20 20 20 20 n the.#
5690: 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 2e 20 journal.
56a0: 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 66 Check that the f
56b0: 69 72 73 74 20 72 65 63 6f 72 64 20 69 6e 20 74 irst record in t
56c0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 he transaction i
56d0: 73 20 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 s .#
56e0: 20 20 20 20 70 6c 61 79 65 64 20 62 61 63 6b 2c played back,
56f0: 20 62 75 74 20 6e 6f 74 20 74 68 65 20 73 65 63 but not the sec
5700: 6f 6e 64 2e 0a 23 0a 23 20 20 70 61 67 65 72 31 ond..#.# pager1
5710: 2d 34 2e 35 2e 36 3a 20 52 65 73 74 6f 72 65 20 -4.5.6: Restore
5720: 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e the file-system.
5730: 20 54 72 79 20 74 6f 20 6f 70 65 6e 20 74 68 65 Try to open the
5740: 20 64 61 74 61 62 61 73 65 20 77 69 74 68 20 61 database with a
5750: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .#
5760: 20 20 72 65 61 64 6f 6e 6c 79 20 63 6f 6e 6e 65 readonly conne
5770: 63 74 69 6f 6e 2e 20 54 68 69 73 20 73 68 6f 75 ction. This shou
5780: 6c 64 20 66 61 69 6c 2c 20 61 73 20 61 20 72 65 ld fail, as a re
5790: 61 64 2d 6f 6e 6c 79 0a 23 20 20 20 20 20 20 20 ad-only.#
57a0: 20 20 20 20 20 20 20 20 20 63 6f 6e 6e 65 63 74 connect
57b0: 69 6f 6e 20 63 61 6e 6e 6f 74 20 72 6f 6c 6c 20 ion cannot roll
57c0: 62 61 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 back the databas
57d0: 65 20 66 69 6c 65 2e 0a 23 0a 66 61 75 6c 74 73 e file..#.faults
57e0: 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72 im_restore_and_r
57f0: 65 6f 70 65 6e 0a 64 6f 5f 65 78 65 63 73 71 6c eopen.do_execsql
5800: 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e 35 _test pager1.4.5
5810: 2e 33 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20 .3 {. SELECT *
5820: 46 52 4f 4d 20 74 31 3b 0a 20 20 53 45 4c 45 43 FROM t1;. SELEC
5830: 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 7d 20 7b T * FROM t2;.} {
5840: 49 20 49 49 20 49 49 49 20 49 56 7d 0a 66 61 75 I II III IV}.fau
5850: 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e ltsim_restore_an
5860: 64 5f 72 65 6f 70 65 6e 0a 68 65 78 69 6f 5f 77 d_reopen.hexio_w
5870: 72 69 74 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75 rite test.db-jou
5880: 72 6e 61 6c 20 5b 65 78 70 72 20 35 31 32 2b 34 rnal [expr 512+4
5890: 2b 31 30 32 34 20 2d 20 32 30 32 5d 20 30 31 32 +1024 - 202] 012
58a0: 33 34 35 36 37 38 39 41 42 43 44 45 46 0a 64 6f 3456789ABCDEF.do
58b0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 _execsql_test pa
58c0: 67 65 72 31 2e 34 2e 35 2e 34 20 7b 0a 20 20 53 ger1.4.5.4 {. S
58d0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b ELECT * FROM t1;
58e0: 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d . SELECT * FROM
58f0: 20 74 32 3b 0a 7d 20 7b 49 20 49 49 20 31 20 32 t2;.} {I II 1 2
5900: 20 49 49 49 20 49 56 20 33 20 34 7d 0a 66 61 75 III IV 3 4}.fau
5910: 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e ltsim_restore_an
5920: 64 5f 72 65 6f 70 65 6e 0a 68 65 78 69 6f 5f 77 d_reopen.hexio_w
5930: 72 69 74 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75 rite test.db-jou
5940: 72 6e 61 6c 20 5b 65 78 70 72 20 35 31 32 2b 34 rnal [expr 512+4
5950: 2b 31 30 32 34 2b 34 2b 34 2b 31 30 32 34 20 2d +1024+4+4+1024 -
5960: 20 32 30 32 5d 20 30 31 32 33 34 35 36 37 38 39 202] 0123456789
5970: 41 42 43 44 45 46 0a 64 6f 5f 65 78 65 63 73 71 ABCDEF.do_execsq
5980: 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e l_test pager1.4.
5990: 35 2e 35 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a 5.5 {. SELECT *
59a0: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 53 45 4c 45 FROM t1;. SELE
59b0: 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 7d 20 CT * FROM t2;.}
59c0: 7b 49 20 49 49 20 49 49 49 20 49 56 20 33 20 34 {I II III IV 3 4
59d0: 7d 0a 0a 66 61 75 6c 74 73 69 6d 5f 72 65 73 74 }..faultsim_rest
59e0: 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 64 ore_and_reopen.d
59f0: 62 20 63 6c 6f 73 65 0a 73 71 6c 69 74 65 33 20 b close.sqlite3
5a00: 64 62 20 74 65 73 74 2e 64 62 20 2d 72 65 61 64 db test.db -read
5a10: 6f 6e 6c 79 20 31 0a 64 6f 5f 63 61 74 63 68 73 only 1.do_catchs
5a20: 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34 ql_test pager1.4
5a30: 2e 35 2e 36 20 7b 0a 20 20 53 45 4c 45 43 54 20 .5.6 {. SELECT
5a40: 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 53 45 4c * FROM t1;. SEL
5a50: 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 7d ECT * FROM t2;.}
5a60: 20 7b 31 20 7b 64 69 73 6b 20 49 2f 4f 20 65 72 {1 {disk I/O er
5a70: 72 6f 72 7d 7d 0a 64 62 20 63 6c 6f 73 65 0a 0a ror}}.db close..
5a80: 23 20 53 6e 61 70 73 68 6f 74 20 74 68 65 20 66 # Snapshot the f
5a90: 69 6c 65 2d 73 79 73 74 65 6d 20 6a 75 73 74 20 ile-system just
5aa0: 62 65 66 6f 72 65 20 6d 75 6c 74 69 2d 66 69 6c before multi-fil
5ab0: 65 20 63 6f 6d 6d 69 74 2e 20 53 61 76 65 20 74 e commit. Save t
5ac0: 68 65 20 6e 61 6d 65 0a 23 20 6f 66 20 74 68 65 he name.# of the
5ad0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 master journal
5ae0: 66 69 6c 65 20 69 6e 20 24 3a 3a 6d 6a 5f 66 69 file in $::mj_fi
5af0: 6c 65 6e 61 6d 65 2e 0a 23 0a 74 76 20 73 63 72 lename..#.tv scr
5b00: 69 70 74 20 63 6f 70 79 5f 6f 6e 5f 6d 6a 5f 64 ipt copy_on_mj_d
5b10: 65 6c 65 74 65 0a 74 76 20 66 69 6c 74 65 72 20 elete.tv filter
5b20: 78 44 65 6c 65 74 65 0a 70 72 6f 63 20 63 6f 70 xDelete.proc cop
5b30: 79 5f 6f 6e 5f 6d 6a 5f 64 65 6c 65 74 65 20 7b y_on_mj_delete {
5b40: 6d 65 74 68 6f 64 20 66 69 6c 65 6e 61 6d 65 20 method filename
5b50: 61 72 67 73 7d 20 7b 0a 20 20 69 66 20 7b 5b 73 args} {. if {[s
5b60: 74 72 69 6e 67 20 6d 61 74 63 68 20 2a 6d 6a 2a tring match *mj*
5b70: 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 66 69 6c [file tail $fil
5b80: 65 6e 61 6d 65 5d 5d 7d 20 7b 20 0a 20 20 20 20 ename]]} { .
5b90: 73 65 74 20 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d set ::mj_filenam
5ba0: 65 20 24 66 69 6c 65 6e 61 6d 65 0a 20 20 20 20 e $filename.
5bb0: 66 61 75 6c 74 73 69 6d 5f 73 61 76 65 20 0a 20 faultsim_save .
5bc0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 }. return SQLI
5bd0: 54 45 5f 4f 4b 0a 7d 0a 64 6f 5f 74 65 73 74 20 TE_OK.}.do_test
5be0: 70 61 67 65 72 31 2e 34 2e 36 2e 31 20 7b 0a 20 pager1.4.6.1 {.
5bf0: 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 faultsim_delete
5c00: 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78 _and_reopen. ex
5c10: 65 63 73 71 6c 20 7b 0a 20 20 20 20 41 54 54 41 ecsql {. ATTA
5c20: 43 48 20 27 74 65 73 74 2e 64 62 32 27 20 41 53 CH 'test.db2' AS
5c30: 20 74 77 6f 3b 0a 20 20 20 20 43 52 45 41 54 45 two;. CREATE
5c40: 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b TABLE t1(a, b);
5c50: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c . CREATE TABL
5c60: 45 20 74 77 6f 2e 74 32 28 61 2c 20 62 29 3b 0a E two.t2(a, b);.
5c70: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 INSERT INTO
5c80: 74 31 20 56 41 4c 55 45 53 28 31 2c 20 27 74 31 t1 VALUES(1, 't1
5c90: 2e 31 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 .1');. INSERT
5ca0: 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 INTO t2 VALUES(
5cb0: 31 2c 20 27 74 32 2e 31 27 29 3b 0a 20 20 20 20 1, 't2.1');.
5cc0: 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 55 50 44 BEGIN;. UPD
5cd0: 41 54 45 20 74 31 20 53 45 54 20 62 20 3d 20 27 ATE t1 SET b = '
5ce0: 74 31 2e 32 27 3b 0a 20 20 20 20 20 20 55 50 44 t1.2';. UPD
5cf0: 41 54 45 20 74 32 20 53 45 54 20 62 20 3d 20 27 ATE t2 SET b = '
5d00: 74 32 2e 32 27 3b 0a 20 20 20 20 43 4f 4d 4d 49 t2.2';. COMMI
5d10: 54 3b 0a 20 20 7d 0a 20 20 74 76 20 66 69 6c 74 T;. }. tv filt
5d20: 65 72 20 7b 7d 0a 20 20 64 62 20 63 6c 6f 73 65 er {}. db close
5d30: 0a 7d 20 7b 7d 0a 0a 66 61 75 6c 74 73 69 6d 5f .} {}..faultsim_
5d40: 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 restore_and_reop
5d50: 65 6e 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 en.do_execsql_te
5d60: 73 74 20 70 61 67 65 72 31 2e 34 2e 36 2e 32 20 st pager1.4.6.2
5d70: 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 { SELECT * FROM
5d80: 74 31 20 7d 20 20 20 20 20 20 20 20 20 20 20 7b t1 } {
5d90: 31 20 74 31 2e 31 7d 0a 64 6f 5f 74 65 73 74 20 1 t1.1}.do_test
5da0: 20 20 20 20 20 20 20 20 70 61 67 65 72 31 2e 34 pager1.4
5db0: 2e 36 2e 33 20 7b 20 66 69 6c 65 20 65 78 69 73 .6.3 { file exis
5dc0: 74 73 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d ts $::mj_filenam
5dd0: 65 20 7d 20 7b 31 7d 0a 64 6f 5f 65 78 65 63 73 e } {1}.do_execs
5de0: 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34 ql_test pager1.4
5df0: 2e 36 2e 34 20 7b 0a 20 20 41 54 54 41 43 48 20 .6.4 {. ATTACH
5e00: 27 74 65 73 74 2e 64 62 32 27 20 41 53 20 74 77 'test.db2' AS tw
5e10: 6f 3b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 o;. SELECT * FR
5e20: 4f 4d 20 74 32 3b 0a 7d 20 7b 31 20 74 32 2e 31 OM t2;.} {1 t2.1
5e30: 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 }.do_test pager1
5e40: 2e 34 2e 36 2e 35 20 7b 20 66 69 6c 65 20 65 78 .4.6.5 { file ex
5e50: 69 73 74 73 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e ists $::mj_filen
5e60: 61 6d 65 20 7d 20 7b 30 7d 0a 0a 66 61 75 6c 74 ame } {0}..fault
5e70: 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f sim_restore_and_
5e80: 72 65 6f 70 65 6e 0a 64 62 20 63 6c 6f 73 65 0a reopen.db close.
5e90: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34 do_test pager1.4
5ea0: 2e 36 2e 38 20 7b 0a 20 20 73 65 74 20 3a 3a 6d .6.8 {. set ::m
5eb0: 6a 5f 66 69 6c 65 6e 61 6d 65 31 20 24 3a 3a 6d j_filename1 $::m
5ec0: 6a 5f 66 69 6c 65 6e 61 6d 65 0a 20 20 74 76 20 j_filename. tv
5ed0: 66 69 6c 74 65 72 20 78 44 65 6c 65 74 65 0a 20 filter xDelete.
5ee0: 20 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 sqlite3 db test
5ef0: 2e 64 62 32 0a 20 20 65 78 65 63 73 71 6c 20 7b .db2. execsql {
5f00: 0a 20 20 20 20 41 54 54 41 43 48 20 27 74 65 73 . ATTACH 'tes
5f10: 74 2e 64 62 33 27 20 41 53 20 74 68 72 65 65 3b t.db3' AS three;
5f20: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c . CREATE TABL
5f30: 45 20 74 68 72 65 65 2e 74 33 28 61 2c 20 62 29 E three.t3(a, b)
5f40: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 ;. INSERT INT
5f50: 4f 20 74 33 20 56 41 4c 55 45 53 28 31 2c 20 27 O t3 VALUES(1, '
5f60: 74 33 2e 31 27 29 3b 0a 20 20 20 20 42 45 47 49 t3.1');. BEGI
5f70: 4e 3b 0a 20 20 20 20 20 20 55 50 44 41 54 45 20 N;. UPDATE
5f80: 74 32 20 53 45 54 20 62 20 3d 20 27 74 32 2e 33 t2 SET b = 't2.3
5f90: 27 3b 0a 20 20 20 20 20 20 55 50 44 41 54 45 20 ';. UPDATE
5fa0: 74 33 20 53 45 54 20 62 20 3d 20 27 74 33 2e 33 t3 SET b = 't3.3
5fb0: 27 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 ';. COMMIT;.
5fc0: 20 7d 0a 20 20 65 78 70 72 20 7b 24 3a 3a 6d 6a }. expr {$::mj
5fd0: 5f 66 69 6c 65 6e 61 6d 65 31 20 21 3d 20 24 3a _filename1 != $:
5fe0: 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 7d 0a 7d 20 :mj_filename}.}
5ff0: 7b 31 7d 0a 66 61 75 6c 74 73 69 6d 5f 72 65 73 {1}.faultsim_res
6000: 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a tore_and_reopen.
6010: 74 76 20 66 69 6c 74 65 72 20 7b 7d 0a 0a 23 20 tv filter {}..#
6020: 54 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 The file-system
6030: 6e 6f 77 20 63 6f 6e 74 61 69 6e 73 3a 0a 23 0a now contains:.#.
6040: 23 20 20 20 2a 20 74 68 72 65 65 20 64 61 74 61 # * three data
6050: 62 61 73 65 73 0a 23 20 20 20 2a 20 74 68 72 65 bases.# * thre
6060: 65 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 e hot-journal fi
6070: 6c 65 73 0a 23 20 20 20 2a 20 74 77 6f 20 6d 61 les.# * two ma
6080: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c ster-journal fil
6090: 65 73 2e 0a 23 0a 23 20 54 68 65 20 68 6f 74 2d es..#.# The hot-
60a0: 6a 6f 75 72 6e 61 6c 73 20 61 73 73 6f 63 69 61 journals associa
60b0: 74 65 64 20 77 69 74 68 20 74 65 73 74 2e 64 62 ted with test.db
60c0: 32 20 61 6e 64 20 74 65 73 74 2e 64 62 33 20 70 2 and test.db3 p
60d0: 6f 69 6e 74 20 74 6f 0a 23 20 6d 61 73 74 65 72 oint to.# master
60e0: 20 6a 6f 75 72 6e 61 6c 20 24 3a 3a 6d 6a 5f 66 journal $::mj_f
60f0: 69 6c 65 6e 61 6d 65 2e 20 54 68 65 20 68 6f 74 ilename. The hot
6100: 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 73 -journal file as
6110: 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a 23 20 sociated with.#
6120: 74 65 73 74 2e 64 62 20 70 6f 69 6e 74 73 20 74 test.db points t
6130: 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c o master journal
6140: 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 31 $::mj_filename1
6150: 2e 20 53 6f 20 72 65 61 64 69 6e 67 20 66 72 6f . So reading fro
6160: 6d 0a 23 20 74 65 73 74 2e 64 62 20 73 68 6f 75 m.# test.db shou
6170: 6c 64 20 64 65 6c 65 74 65 20 24 3a 3a 6d 6a 5f ld delete $::mj_
6180: 66 69 6c 65 6e 61 6d 65 31 2e 0a 23 0a 64 6f 5f filename1..#.do_
6190: 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e 36 2e test pager1.4.6.
61a0: 39 20 7b 0a 20 20 6c 73 6f 72 74 20 5b 67 6c 6f 9 {. lsort [glo
61b0: 62 20 74 65 73 74 2e 64 62 2a 5d 0a 7d 20 5b 6c b test.db*].} [l
61c0: 73 6f 72 74 20 5b 6c 69 73 74 20 20 20 20 20 20 sort [list
61d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
61e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
61f0: 20 20 20 20 20 5c 0a 20 20 74 65 73 74 2e 64 62 \. test.db
6200: 20 74 65 73 74 2e 64 62 32 20 74 65 73 74 2e 64 test.db2 test.d
6210: 62 33 20 20 20 20 20 20 20 20 20 20 20 20 20 20 b3
6220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
6230: 5c 0a 20 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 \. test.db-jour
6240: 6e 61 6c 20 74 65 73 74 2e 64 62 32 2d 6a 6f 75 nal test.db2-jou
6250: 72 6e 61 6c 20 74 65 73 74 2e 64 62 33 2d 6a 6f rnal test.db3-jo
6260: 75 72 6e 61 6c 20 20 20 20 20 20 5c 0a 20 20 5b urnal \. [
6270: 66 69 6c 65 20 74 61 69 6c 20 24 3a 3a 6d 6a 5f file tail $::mj_
6280: 66 69 6c 65 6e 61 6d 65 5d 20 5b 66 69 6c 65 20 filename] [file
6290: 74 61 69 6c 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e tail $::mj_filen
62a0: 61 6d 65 31 5d 0a 5d 5d 0a 0a 23 20 54 68 65 20 ame1].]]..# The
62b0: 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 24 master-journal $
62c0: 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 31 20 63 ::mj_filename1 c
62d0: 6f 6e 74 61 69 6e 73 20 70 6f 69 6e 74 65 72 73 ontains pointers
62e0: 20 74 6f 20 74 65 73 74 2e 64 62 20 61 6e 64 20 to test.db and
62f0: 0a 23 20 74 65 73 74 2e 64 62 32 2e 20 48 6f 77 .# test.db2. How
6300: 65 76 65 72 20 74 68 65 20 68 6f 74 2d 6a 6f 75 ever the hot-jou
6310: 72 6e 61 6c 20 61 73 73 6f 63 69 61 74 65 64 20 rnal associated
6320: 77 69 74 68 20 74 65 73 74 2e 64 62 32 20 70 6f with test.db2 po
6330: 69 6e 74 73 20 74 6f 0a 23 20 61 20 64 69 66 66 ints to.# a diff
6340: 65 72 65 6e 74 20 6d 61 73 74 65 72 2d 6a 6f 75 erent master-jou
6350: 72 6e 61 6c 2e 20 54 68 65 72 65 66 6f 72 65 2c rnal. Therefore,
6360: 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 74 65 reading from te
6370: 73 74 2e 64 62 20 6f 6e 6c 79 20 73 68 6f 75 6c st.db only shoul
6380: 64 0a 23 20 62 65 20 65 6e 6f 75 67 68 20 74 6f d.# be enough to
6390: 20 63 61 75 73 65 20 53 51 4c 69 74 65 20 74 6f cause SQLite to
63a0: 20 64 65 6c 65 74 65 20 24 3a 3a 6d 6a 5f 66 69 delete $::mj_fi
63b0: 6c 65 6e 61 6d 65 31 2e 0a 23 0a 64 6f 5f 74 65 lename1..#.do_te
63c0: 73 74 20 20 20 20 20 20 20 20 20 70 61 67 65 72 st pager
63d0: 31 2e 34 2e 36 2e 31 30 20 7b 20 66 69 6c 65 20 1.4.6.10 { file
63e0: 65 78 69 73 74 73 20 24 3a 3a 6d 6a 5f 66 69 6c exists $::mj_fil
63f0: 65 6e 61 6d 65 20 20 7d 20 7b 31 7d 0a 64 6f 5f ename } {1}.do_
6400: 74 65 73 74 20 20 20 20 20 20 20 20 20 70 61 67 test pag
6410: 65 72 31 2e 34 2e 36 2e 31 31 20 7b 20 66 69 6c er1.4.6.11 { fil
6420: 65 20 65 78 69 73 74 73 20 24 3a 3a 6d 6a 5f 66 e exists $::mj_f
6430: 69 6c 65 6e 61 6d 65 31 20 7d 20 7b 31 7d 0a 64 ilename1 } {1}.d
6440: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 o_execsql_test p
6450: 61 67 65 72 31 2e 34 2e 36 2e 31 32 20 7b 20 53 ager1.4.6.12 { S
6460: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 ELECT * FROM t1
6470: 7d 20 7b 31 20 74 31 2e 31 7d 0a 64 6f 5f 74 65 } {1 t1.1}.do_te
6480: 73 74 20 20 20 20 20 20 20 20 20 70 61 67 65 72 st pager
6490: 31 2e 34 2e 36 2e 31 33 20 7b 20 66 69 6c 65 20 1.4.6.13 { file
64a0: 65 78 69 73 74 73 20 24 3a 3a 6d 6a 5f 66 69 6c exists $::mj_fil
64b0: 65 6e 61 6d 65 20 20 7d 20 7b 31 7d 0a 64 6f 5f ename } {1}.do_
64c0: 74 65 73 74 20 20 20 20 20 20 20 20 20 70 61 67 test pag
64d0: 65 72 31 2e 34 2e 36 2e 31 34 20 7b 20 66 69 6c er1.4.6.14 { fil
64e0: 65 20 65 78 69 73 74 73 20 24 3a 3a 6d 6a 5f 66 e exists $::mj_f
64f0: 69 6c 65 6e 61 6d 65 31 20 7d 20 7b 30 7d 0a 0a ilename1 } {0}..
6500: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 do_execsql_test
6510: 70 61 67 65 72 31 2e 34 2e 36 2e 31 32 20 7b 0a pager1.4.6.12 {.
6520: 20 20 41 54 54 41 43 48 20 27 74 65 73 74 2e 64 ATTACH 'test.d
6530: 62 32 27 20 41 53 20 74 77 6f 3b 0a 20 20 53 45 b2' AS two;. SE
6540: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a LECT * FROM t2;.
6550: 7d 20 7b 31 20 74 32 2e 31 7d 0a 64 6f 5f 74 65 } {1 t2.1}.do_te
6560: 73 74 20 20 20 20 20 20 20 20 20 70 61 67 65 72 st pager
6570: 31 2e 34 2e 36 2e 31 33 20 7b 20 66 69 6c 65 20 1.4.6.13 { file
6580: 65 78 69 73 74 73 20 24 3a 3a 6d 6a 5f 66 69 6c exists $::mj_fil
6590: 65 6e 61 6d 65 20 7d 20 20 7b 31 7d 0a 64 6f 5f ename } {1}.do_
65a0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 execsql_test pag
65b0: 65 72 31 2e 34 2e 36 2e 31 34 20 7b 0a 20 20 41 er1.4.6.14 {. A
65c0: 54 54 41 43 48 20 27 74 65 73 74 2e 64 62 33 27 TTACH 'test.db3'
65d0: 20 41 53 20 74 68 72 65 65 3b 0a 20 20 53 45 4c AS three;. SEL
65e0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 33 3b 0a 7d ECT * FROM t3;.}
65f0: 20 7b 31 20 74 33 2e 31 7d 0a 64 6f 5f 74 65 73 {1 t3.1}.do_tes
6600: 74 20 20 20 20 20 20 20 20 20 70 61 67 65 72 31 t pager1
6610: 2e 34 2e 36 2e 31 35 20 7b 20 66 69 6c 65 20 65 .4.6.15 { file e
6620: 78 69 73 74 73 20 24 3a 3a 6d 6a 5f 66 69 6c 65 xists $::mj_file
6630: 6e 61 6d 65 20 7d 20 20 7b 30 7d 0a 0a 64 62 20 name } {0}..db
6640: 63 6c 6f 73 65 0a 74 76 20 64 65 6c 65 74 65 0a close.tv delete.
6650: 0a 74 65 73 74 76 66 73 20 74 76 20 2d 64 65 66 .testvfs tv -def
6660: 61 75 6c 74 20 31 0a 74 76 20 73 65 63 74 6f 72 ault 1.tv sector
6670: 73 69 7a 65 20 35 31 32 0a 74 76 20 73 63 72 69 size 512.tv scri
6680: 70 74 20 63 6f 70 79 5f 6f 6e 5f 6a 6f 75 72 6e pt copy_on_journ
6690: 61 6c 5f 64 65 6c 65 74 65 0a 74 76 20 66 69 6c al_delete.tv fil
66a0: 74 65 72 20 78 44 65 6c 65 74 65 0a 70 72 6f 63 ter xDelete.proc
66b0: 20 63 6f 70 79 5f 6f 6e 5f 6a 6f 75 72 6e 61 6c copy_on_journal
66c0: 5f 64 65 6c 65 74 65 20 7b 6d 65 74 68 6f 64 20 _delete {method
66d0: 66 69 6c 65 6e 61 6d 65 20 61 72 67 73 7d 20 7b filename args} {
66e0: 0a 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6d . if {[string m
66f0: 61 74 63 68 20 2a 6a 6f 75 72 6e 61 6c 20 24 66 atch *journal $f
6700: 69 6c 65 6e 61 6d 65 5d 7d 20 66 61 75 6c 74 73 ilename]} faults
6710: 69 6d 5f 73 61 76 65 20 0a 20 20 72 65 74 75 72 im_save . retur
6720: 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 7d 0a 66 61 n SQLITE_OK.}.fa
6730: 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e ultsim_delete_an
6740: 64 5f 72 65 6f 70 65 6e 0a 64 6f 5f 65 78 65 63 d_reopen.do_exec
6750: 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2e sql_test pager1.
6760: 34 2e 37 2e 31 20 7b 0a 20 20 43 52 45 41 54 45 4.7.1 {. CREATE
6770: 20 54 41 42 4c 45 20 74 31 28 78 20 50 52 49 4d TABLE t1(x PRIM
6780: 41 52 59 20 4b 45 59 2c 20 79 29 3b 0a 20 20 43 ARY KEY, y);. C
6790: 52 45 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f REATE INDEX i1 O
67a0: 4e 20 74 31 28 79 29 3b 0a 20 20 49 4e 53 45 52 N t1(y);. INSER
67b0: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 T INTO t1 VALUES
67c0: 28 27 49 27 2c 20 20 20 27 6f 6e 65 27 29 3b 0a ('I', 'one');.
67d0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 INSERT INTO t1
67e0: 20 56 41 4c 55 45 53 28 27 49 49 27 2c 20 20 27 VALUES('II', '
67f0: 66 6f 75 72 27 29 3b 0a 20 20 49 4e 53 45 52 54 four');. INSERT
6800: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 INTO t1 VALUES(
6810: 27 49 49 49 27 2c 20 27 6e 69 6e 65 27 29 3b 0a 'III', 'nine');.
6820: 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 49 4e 53 BEGIN;. INS
6830: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 ERT INTO t1 VALU
6840: 45 53 28 27 49 56 27 2c 20 27 73 69 78 74 65 65 ES('IV', 'sixtee
6850: 6e 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 n');. INSERT
6860: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27 INTO t1 VALUES('
6870: 56 27 20 2c 20 27 74 77 65 6e 74 79 66 69 76 65 V' , 'twentyfive
6880: 27 29 3b 0a 20 20 43 4f 4d 4d 49 54 3b 0a 7d 20 ');. COMMIT;.}
6890: 7b 7d 0a 74 76 20 66 69 6c 74 65 72 20 7b 7d 0a {}.tv filter {}.
68a0: 64 62 20 63 6c 6f 73 65 0a 74 76 20 64 65 6c 65 db close.tv dele
68b0: 74 65 20 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 te .do_test page
68c0: 72 31 2e 34 2e 37 2e 32 20 7b 0a 20 20 66 61 75 r1.4.7.2 {. fau
68d0: 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e ltsim_restore_an
68e0: 64 5f 72 65 6f 70 65 6e 0a 20 20 63 61 74 63 68 d_reopen. catch
68f0: 20 7b 66 69 6c 65 20 61 74 74 72 69 62 75 74 65 {file attribute
6900: 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 s test.db-journa
6910: 6c 20 2d 70 65 72 6d 69 73 73 69 6f 6e 73 20 72 l -permissions r
6920: 2d 2d 2d 2d 2d 2d 2d 2d 7d 0a 20 20 63 61 74 63 --------}. catc
6930: 68 20 7b 66 69 6c 65 20 61 74 74 72 69 62 75 74 h {file attribut
6940: 65 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e es test.db-journ
6950: 61 6c 20 2d 72 65 61 64 6f 6e 6c 79 20 31 7d 0a al -readonly 1}.
6960: 20 20 63 61 74 63 68 73 71 6c 20 7b 20 53 45 4c catchsql { SEL
6970: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 0a ECT * FROM t1 }.
6980: 7d 20 7b 31 20 7b 75 6e 61 62 6c 65 20 74 6f 20 } {1 {unable to
6990: 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 66 69 open database fi
69a0: 6c 65 7d 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 le}}.do_test pag
69b0: 65 72 31 2e 34 2e 37 2e 33 20 7b 0a 20 20 64 62 er1.4.7.3 {. db
69c0: 20 63 6c 6f 73 65 0a 20 20 63 61 74 63 68 20 7b close. catch {
69d0: 66 69 6c 65 20 61 74 74 72 69 62 75 74 65 73 20 file attributes
69e0: 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 test.db-journal
69f0: 2d 70 65 72 6d 69 73 73 69 6f 6e 73 20 72 77 2d -permissions rw-
6a00: 72 77 2d 72 77 2d 7d 0a 20 20 63 61 74 63 68 20 rw-rw-}. catch
6a10: 7b 66 69 6c 65 20 61 74 74 72 69 62 75 74 65 73 {file attributes
6a20: 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c test.db-journal
6a30: 20 2d 72 65 61 64 6f 6e 6c 79 20 30 7d 0a 20 20 -readonly 0}.
6a40: 66 69 6c 65 20 64 65 6c 65 74 65 20 74 65 73 74 file delete test
6a50: 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 20 20 66 69 .db-journal. fi
6a60: 6c 65 20 65 78 69 73 74 73 20 74 65 73 74 2e 64 le exists test.d
6a70: 62 2d 6a 6f 75 72 6e 61 6c 0a 7d 20 7b 30 7d 0a b-journal.} {0}.
6a80: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d .#--------------
6a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 -----------.# Th
6ad0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74 e following test
6ae0: 73 20 64 65 61 6c 20 77 69 74 68 20 6d 75 6c 74 s deal with mult
6af0: 69 2d 66 69 6c 65 20 63 6f 6d 6d 69 74 73 2e 0a i-file commits..
6b00: 23 0a 23 20 70 61 67 65 72 31 2d 35 2e 31 2e 2a #.# pager1-5.1.*
6b10: 3a 20 54 68 65 20 63 61 73 65 20 77 68 65 72 65 : The case where
6b20: 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 63 61 a multi-file ca
6b30: 6e 6e 6f 74 20 62 65 20 63 6f 6d 6d 69 74 74 65 nnot be committe
6b40: 64 20 62 65 63 61 75 73 65 0a 23 20 20 20 20 20 d because.#
6b50: 20 20 20 20 20 20 20 20 20 20 61 6e 6f 74 68 65 anothe
6b60: 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 r connection is
6b70: 68 6f 6c 64 69 6e 67 20 61 20 53 48 41 52 45 44 holding a SHARED
6b80: 20 6c 6f 63 6b 20 6f 6e 20 6f 6e 65 20 6f 66 20 lock on one of
6b90: 74 68 65 0a 23 20 20 20 20 20 20 20 20 20 20 20 the.#
6ba0: 20 20 20 20 66 69 6c 65 73 2e 20 41 66 74 65 72 files. After
6bb0: 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b the SHARED lock
6bc0: 20 69 73 20 72 65 6d 6f 76 65 64 2c 20 74 68 65 is removed, the
6bd0: 20 43 4f 4d 4d 49 54 20 73 75 63 63 65 65 64 73 COMMIT succeeds
6be0: 2e 0a 23 0a 23 20 70 61 67 65 72 31 2d 35 2e 32 ..#.# pager1-5.2
6bf0: 2e 2a 3a 20 4d 75 6c 74 69 2d 66 69 6c 65 20 63 .*: Multi-file c
6c00: 6f 6d 6d 69 74 73 20 77 69 74 68 20 6a 6f 75 72 ommits with jour
6c10: 6e 61 6c 5f 6d 6f 64 65 3d 6d 65 6d 6f 72 79 2e nal_mode=memory.
6c20: 0a 23 0a 23 20 70 61 67 65 72 31 2d 35 2e 33 2e .#.# pager1-5.3.
6c30: 2a 3a 20 4d 75 6c 74 69 2d 66 69 6c 65 20 63 6f *: Multi-file co
6c40: 6d 6d 69 74 73 20 77 69 74 68 20 6a 6f 75 72 6e mmits with journ
6c50: 61 6c 5f 6d 6f 64 65 3d 6d 65 6d 6f 72 79 2e 0a al_mode=memory..
6c60: 23 0a 23 20 70 61 67 65 72 31 2d 35 2e 34 2e 2a #.# pager1-5.4.*
6c70: 3a 20 43 68 65 63 6b 20 74 68 61 74 20 77 69 74 : Check that wit
6c80: 68 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 6e 6f h synchronous=no
6c90: 72 6d 61 6c 2c 20 74 68 65 20 6d 61 73 74 65 72 rmal, the master
6ca0: 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 23 20 -journal file.#
6cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 61 na
6cc0: 6d 65 20 69 73 20 61 64 64 65 64 20 74 6f 20 61 me is added to a
6cd0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6d journal file im
6ce0: 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 mediately after
6cf0: 74 68 65 20 6c 61 73 74 0a 23 20 20 20 20 20 20 the last.#
6d00: 20 20 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c journal
6d10: 20 72 65 63 6f 72 64 2e 20 42 75 74 20 77 69 74 record. But wit
6d20: 68 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 66 75 h synchronous=fu
6d30: 6c 6c 2c 20 65 78 74 72 61 20 75 6e 75 73 65 64 ll, extra unused
6d40: 20 73 70 61 63 65 0a 23 20 20 20 20 20 20 20 20 space.#
6d50: 20 20 20 20 20 20 20 69 73 20 61 6c 6c 6f 63 61 is alloca
6d60: 74 65 64 20 62 65 74 77 65 65 6e 20 74 68 65 20 ted between the
6d70: 6c 61 73 74 20 6a 6f 75 72 6e 61 6c 20 72 65 63 last journal rec
6d80: 6f 72 64 20 61 6e 64 20 74 68 65 20 0a 23 20 20 ord and the .#
6d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 61 73 mas
6da0: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 ter-journal file
6db0: 20 6e 61 6d 65 20 73 6f 20 74 68 61 74 20 74 68 name so that th
6dc0: 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c e master-journal
6dd0: 20 66 69 6c 65 0a 23 20 20 20 20 20 20 20 20 20 file.#
6de0: 20 20 20 20 20 20 6e 61 6d 65 20 64 6f 65 73 20 name does
6df0: 6e 6f 74 20 6c 69 65 20 6f 6e 20 74 68 65 20 73 not lie on the s
6e00: 61 6d 65 20 73 65 63 74 6f 72 20 61 73 20 74 68 ame sector as th
6e10: 65 20 6c 61 73 74 20 6a 6f 75 72 6e 61 6c 20 66 e last journal f
6e20: 69 6c 65 0a 23 20 20 20 20 20 20 20 20 20 20 20 ile.#
6e30: 20 20 20 20 72 65 63 6f 72 64 2e 0a 23 0a 23 20 record..#.#
6e40: 70 61 67 65 72 31 2d 35 2e 35 2e 2a 3a 20 43 68 pager1-5.5.*: Ch
6e50: 65 63 6b 20 74 68 61 74 20 69 6e 20 6a 6f 75 72 eck that in jour
6e60: 6e 61 6c 5f 6d 6f 64 65 3d 50 45 52 53 49 53 54 nal_mode=PERSIST
6e70: 20 6d 6f 64 65 2c 20 61 20 6a 6f 75 72 6e 61 6c mode, a journal
6e80: 20 66 69 6c 65 20 69 73 0a 23 20 20 20 20 20 20 file is.#
6e90: 20 20 20 20 20 20 20 20 20 74 72 75 6e 63 61 74 truncat
6ea0: 65 64 20 74 6f 20 7a 65 72 6f 20 62 79 74 65 73 ed to zero bytes
6eb0: 20 77 68 65 6e 20 61 20 6d 75 6c 74 69 2d 66 69 when a multi-fi
6ec0: 6c 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 le transaction i
6ed0: 73 20 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 s .#
6ee0: 20 20 20 63 6f 6d 6d 69 74 74 65 64 20 28 69 6e committed (in
6ef0: 73 74 65 61 64 20 6f 66 20 74 68 65 20 66 69 72 stead of the fir
6f00: 73 74 20 63 6f 75 70 6c 65 20 6f 66 20 62 79 74 st couple of byt
6f10: 65 73 20 62 65 69 6e 67 20 7a 65 72 6f 65 64 29 es being zeroed)
6f20: 2e 0a 23 0a 23 0a 64 6f 5f 74 65 73 74 20 70 61 ..#.#.do_test pa
6f30: 67 65 72 31 2d 35 2e 31 2e 31 20 7b 0a 20 20 66 ger1-5.1.1 {. f
6f40: 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 aultsim_delete_a
6f50: 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65 63 nd_reopen. exec
6f60: 73 71 6c 20 7b 0a 20 20 20 20 41 54 54 41 43 48 sql {. ATTACH
6f70: 20 27 74 65 73 74 2e 64 62 32 27 20 41 53 20 61 'test.db2' AS a
6f80: 75 78 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 ux;. CREATE T
6f90: 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 ABLE t1(a, b);.
6fa0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 CREATE TABLE
6fb0: 61 75 78 2e 74 32 28 61 2c 20 62 29 3b 0a 20 20 aux.t2(a, b);.
6fc0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 INSERT INTO t1
6fd0: 20 56 41 4c 55 45 53 28 31 37 2c 20 27 4c 65 6e VALUES(17, 'Len
6fe0: 69 6e 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 in');. INSERT
6ff0: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 INTO t1 VALUES(
7000: 32 32 2c 20 27 53 74 61 6c 69 6e 27 29 3b 0a 20 22, 'Stalin');.
7010: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 INSERT INTO t
7020: 31 20 56 41 4c 55 45 53 28 35 33 2c 20 27 4b 68 1 VALUES(53, 'Kh
7030: 72 75 73 68 63 68 65 76 27 29 3b 0a 20 20 7d 0a rushchev');. }.
7040: 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 } {}.do_test pag
7050: 65 72 31 2d 35 2e 31 2e 32 20 7b 0a 20 20 65 78 er1-5.1.2 {. ex
7060: 65 63 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 ecsql {. BEGI
7070: 4e 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 N;. INSERT
7080: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 36 INTO t1 VALUES(6
7090: 34 2c 20 27 42 72 65 7a 68 6e 65 76 27 29 3b 0a 4, 'Brezhnev');.
70a0: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 INSERT INT
70b0: 4f 20 74 32 20 53 45 4c 45 43 54 20 2a 20 46 52 O t2 SELECT * FR
70c0: 4f 4d 20 74 31 3b 0a 20 20 7d 0a 20 20 73 71 6c OM t1;. }. sql
70d0: 69 74 65 33 20 64 62 32 20 74 65 73 74 2e 64 62 ite3 db2 test.db
70e0: 32 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 2. execsql {.
70f0: 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 53 BEGIN;. S
7100: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b ELECT * FROM t2;
7110: 0a 20 20 7d 20 64 62 32 0a 7d 20 7b 7d 0a 64 6f . } db2.} {}.do
7120: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 35 2e 31 _test pager1-5.1
7130: 2e 33 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 .3 {. catchsql
7140: 43 4f 4d 4d 49 54 0a 7d 20 7b 31 20 7b 64 61 74 COMMIT.} {1 {dat
7150: 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 7d abase is locked}
7160: 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 }.do_test pager1
7170: 2d 35 2e 31 2e 34 20 7b 0a 20 20 65 78 65 63 73 -5.1.4 {. execs
7180: 71 6c 20 43 4f 4d 4d 49 54 20 64 62 32 0a 20 20 ql COMMIT db2.
7190: 65 78 65 63 73 71 6c 20 43 4f 4d 4d 49 54 0a 20 execsql COMMIT.
71a0: 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 execsql { SELEC
71b0: 54 20 2a 20 46 52 4f 4d 20 74 32 20 7d 20 64 62 T * FROM t2 } db
71c0: 32 0a 7d 20 7b 31 37 20 4c 65 6e 69 6e 20 32 32 2.} {17 Lenin 22
71d0: 20 53 74 61 6c 69 6e 20 35 33 20 4b 68 72 75 73 Stalin 53 Khrus
71e0: 68 63 68 65 76 20 36 34 20 42 72 65 7a 68 6e 65 hchev 64 Brezhne
71f0: 76 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 v}.do_test pager
7200: 31 2d 35 2e 31 2e 35 20 7b 0a 20 20 64 62 32 20 1-5.1.5 {. db2
7210: 63 6c 6f 73 65 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74 close.} {}..do_t
7220: 65 73 74 20 70 61 67 65 72 31 2d 35 2e 32 2e 31 est pager1-5.2.1
7230: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 {. execsql {.
7240: 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 PRAGMA journa
7250: 6c 5f 6d 6f 64 65 20 3d 20 6d 65 6d 6f 72 79 3b l_mode = memory;
7260: 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 . BEGIN;.
7270: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 INSERT INTO t1
7280: 20 56 41 4c 55 45 53 28 38 34 2c 20 27 41 6e 64 VALUES(84, 'And
7290: 72 6f 70 6f 76 27 29 3b 0a 20 20 20 20 20 20 49 ropov');. I
72a0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 NSERT INTO t2 VA
72b0: 4c 55 45 53 28 38 34 2c 20 27 41 6e 64 72 6f 70 LUES(84, 'Androp
72c0: 6f 76 27 29 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 ov');. COMMIT
72d0: 3b 0a 20 20 7d 0a 7d 20 7b 6d 65 6d 6f 72 79 7d ;. }.} {memory}
72e0: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d .do_test pager1-
72f0: 35 2e 33 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 5.3.1 {. execsq
7300: 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a l {. PRAGMA j
7310: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 6f 66 ournal_mode = of
7320: 66 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 f;. BEGIN;.
7330: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 INSERT INTO
7340: 74 31 20 56 41 4c 55 45 53 28 38 35 2c 20 27 47 t1 VALUES(85, 'G
7350: 6f 72 62 61 63 68 65 76 27 29 3b 0a 20 20 20 20 orbachev');.
7360: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 INSERT INTO t2
7370: 20 56 41 4c 55 45 53 28 38 35 2c 20 27 47 6f 72 VALUES(85, 'Gor
7380: 62 61 63 68 65 76 27 29 3b 0a 20 20 20 20 43 4f bachev');. CO
7390: 4d 4d 49 54 3b 0a 20 20 7d 0a 7d 20 7b 6f 66 66 MMIT;. }.} {off
73a0: 7d 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 }..do_test pager
73b0: 31 2d 35 2e 34 2e 31 20 7b 0a 20 20 64 62 20 63 1-5.4.1 {. db c
73c0: 6c 6f 73 65 0a 20 20 74 65 73 74 76 66 73 20 74 lose. testvfs t
73d0: 76 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 74 v. sqlite3 db t
73e0: 65 73 74 2e 64 62 20 2d 76 66 73 20 74 76 0a 20 est.db -vfs tv.
73f0: 20 65 78 65 63 73 71 6c 20 7b 20 41 54 54 41 43 execsql { ATTAC
7400: 48 20 27 74 65 73 74 2e 64 62 32 27 20 41 53 20 H 'test.db2' AS
7410: 61 75 78 20 7d 0a 0a 20 20 74 76 20 66 69 6c 74 aux }.. tv filt
7420: 65 72 20 78 44 65 6c 65 74 65 0a 20 20 74 76 20 er xDelete. tv
7430: 73 63 72 69 70 74 20 6d 61 78 5f 6a 6f 75 72 6e script max_journ
7440: 61 6c 5f 73 69 7a 65 0a 20 20 74 76 20 73 65 63 al_size. tv sec
7450: 74 6f 72 73 69 7a 65 20 35 31 32 0a 20 20 73 65 torsize 512. se
7460: 74 20 3a 3a 6d 61 78 5f 6a 6f 75 72 6e 61 6c 20 t ::max_journal
7470: 30 0a 20 20 70 72 6f 63 20 6d 61 78 5f 6a 6f 75 0. proc max_jou
7480: 72 6e 61 6c 5f 73 69 7a 65 20 7b 6d 65 74 68 6f rnal_size {metho
7490: 64 20 61 72 67 73 7d 20 7b 0a 20 20 20 20 73 65 d args} {. se
74a0: 74 20 73 7a 20 30 0a 20 20 20 20 63 61 74 63 68 t sz 0. catch
74b0: 20 7b 20 73 65 74 20 73 7a 20 5b 66 69 6c 65 20 { set sz [file
74c0: 73 69 7a 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75 size test.db-jou
74d0: 72 6e 61 6c 5d 20 7d 0a 20 20 20 20 69 66 20 7b rnal] }. if {
74e0: 24 73 7a 20 3e 20 24 3a 3a 6d 61 78 5f 6a 6f 75 $sz > $::max_jou
74f0: 72 6e 61 6c 7d 20 7b 0a 20 20 20 20 20 20 73 65 rnal} {. se
7500: 74 20 3a 3a 6d 61 78 5f 6a 6f 75 72 6e 61 6c 20 t ::max_journal
7510: 24 73 7a 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 $sz. }. re
7520: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 turn SQLITE_OK.
7530: 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 }. execsql {.
7540: 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 PRAGMA journa
7550: 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c 45 54 45 3b l_mode = DELETE;
7560: 0a 20 20 20 20 50 52 41 47 4d 41 20 73 79 6e 63 . PRAGMA sync
7570: 68 72 6f 6e 6f 75 73 20 3d 20 4e 4f 52 4d 41 4c hronous = NORMAL
7580: 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 ;. BEGIN;.
7590: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 INSERT INTO t
75a0: 31 20 56 41 4c 55 45 53 28 38 35 2c 20 27 47 6f 1 VALUES(85, 'Go
75b0: 72 62 61 63 68 65 76 27 29 3b 0a 20 20 20 20 20 rbachev');.
75c0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 INSERT INTO t2
75d0: 56 41 4c 55 45 53 28 38 35 2c 20 27 47 6f 72 62 VALUES(85, 'Gorb
75e0: 61 63 68 65 76 27 29 3b 0a 20 20 20 20 43 4f 4d achev');. COM
75f0: 4d 49 54 3b 0a 20 20 7d 0a 20 20 73 65 74 20 3a MIT;. }. set :
7600: 3a 6d 61 78 5f 6a 6f 75 72 6e 61 6c 0a 7d 20 5b :max_journal.} [
7610: 65 78 70 72 20 32 36 31 35 2b 5b 73 74 72 69 6e expr 2615+[strin
7620: 67 20 6c 65 6e 67 74 68 20 5b 70 77 64 5d 5d 5d g length [pwd]]]
7630: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d .do_test pager1-
7640: 35 2e 34 2e 32 20 7b 0a 20 20 73 65 74 20 3a 3a 5.4.2 {. set ::
7650: 6d 61 78 5f 6a 6f 75 72 6e 61 6c 20 30 0a 20 20 max_journal 0.
7660: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 execsql {. PR
7670: 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73 AGMA synchronous
7680: 20 3d 20 66 75 6c 6c 3b 0a 20 20 20 20 42 45 47 = full;. BEG
7690: 49 4e 3b 0a 20 20 20 20 20 20 44 45 4c 45 54 45 IN;. DELETE
76a0: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 62 FROM t1 WHERE b
76b0: 20 3d 20 27 4c 65 6e 69 6e 27 3b 0a 20 20 20 20 = 'Lenin';.
76c0: 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 32 DELETE FROM t2
76d0: 20 57 48 45 52 45 20 62 20 3d 20 27 4c 65 6e 69 WHERE b = 'Leni
76e0: 6e 27 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a n';. COMMIT;.
76f0: 20 20 7d 0a 20 20 73 65 74 20 3a 3a 6d 61 78 5f }. set ::max_
7700: 6a 6f 75 72 6e 61 6c 0a 7d 20 5b 65 78 70 72 20 journal.} [expr
7710: 33 31 31 31 2b 5b 73 74 72 69 6e 67 20 6c 65 6e 3111+[string len
7720: 67 74 68 20 5b 70 77 64 5d 5d 5d 0a 64 62 20 63 gth [pwd]]].db c
7730: 6c 6f 73 65 0a 74 76 20 64 65 6c 65 74 65 0a 0a lose.tv delete..
7740: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 35 do_test pager1-5
7750: 2e 35 2e 31 20 7b 0a 20 20 73 71 6c 69 74 65 33 .5.1 {. sqlite3
7760: 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20 65 78 db test.db. ex
7770: 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 41 54 54 ecsql { . ATT
7780: 41 43 48 20 27 74 65 73 74 2e 64 62 32 27 20 41 ACH 'test.db2' A
7790: 53 20 61 75 78 3b 0a 20 20 20 20 50 52 41 47 4d S aux;. PRAGM
77a0: 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d A journal_mode =
77b0: 20 50 45 52 53 49 53 54 3b 0a 20 20 20 20 43 52 PERSIST;. CR
77c0: 45 41 54 45 20 54 41 42 4c 45 20 74 33 28 61 2c EATE TABLE t3(a,
77d0: 20 62 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 b);. INSERT
77e0: 49 4e 54 4f 20 74 33 20 53 45 4c 45 43 54 20 72 INTO t3 SELECT r
77f0: 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 2c andomblob(1500),
7800: 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 randomblob(1500
7810: 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 55 ) FROM t1;. U
7820: 50 44 41 54 45 20 74 33 20 53 45 54 20 62 20 3d PDATE t3 SET b =
7830: 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 randomblob(1500
7840: 29 3b 0a 20 20 7d 0a 20 20 65 78 70 72 20 5b 66 );. }. expr [f
7850: 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 ile size test.db
7860: 2d 6a 6f 75 72 6e 61 6c 5d 20 3e 20 31 35 30 30 -journal] > 1500
7870: 30 0a 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73 74 20 0.} {1}.do_test
7880: 70 61 67 65 72 31 2d 35 2e 35 2e 32 20 7b 0a 20 pager1-5.5.2 {.
7890: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 execsql {. P
78a0: 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75 RAGMA synchronou
78b0: 73 20 3d 20 66 75 6c 6c 3b 0a 20 20 20 20 42 45 s = full;. BE
78c0: 47 49 4e 3b 0a 20 20 20 20 20 20 44 45 4c 45 54 GIN;. DELET
78d0: 45 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 E FROM t1 WHERE
78e0: 62 20 3d 20 27 53 74 61 6c 69 6e 27 3b 0a 20 20 b = 'Stalin';.
78f0: 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 DELETE FROM
7900: 74 32 20 57 48 45 52 45 20 62 20 3d 20 27 53 74 t2 WHERE b = 'St
7910: 61 6c 69 6e 27 3b 0a 20 20 20 20 43 4f 4d 4d 49 alin';. COMMI
7920: 54 3b 0a 20 20 7d 0a 20 20 66 69 6c 65 20 73 69 T;. }. file si
7930: 7a 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e ze test.db-journ
7940: 61 6c 0a 7d 20 7b 30 7d 0a 0a 0a 23 2d 2d 2d 2d al.} {0}...#----
7950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7990: 2d 2d 2d 2d 2d 0a 23 20 54 68 65 20 66 6f 6c 6c -----.# The foll
79a0: 6f 77 69 6e 67 20 74 65 73 74 73 20 77 6f 72 6b owing tests work
79b0: 20 77 69 74 68 20 22 50 52 41 47 4d 41 20 6d 61 with "PRAGMA ma
79c0: 78 5f 70 61 67 65 5f 63 6f 75 6e 74 22 0a 23 0a x_page_count".#.
79d0: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 36 do_test pager1-6
79e0: 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f .1 {. faultsim_
79f0: 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 delete_and_reope
7a00: 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 n. execsql {.
7a10: 20 20 50 52 41 47 4d 41 20 6d 61 78 5f 70 61 67 PRAGMA max_pag
7a20: 65 5f 63 6f 75 6e 74 20 3d 20 31 30 3b 0a 20 20 e_count = 10;.
7a30: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 CREATE TABLE t
7a40: 32 28 61 2c 20 62 29 3b 0a 20 20 20 20 43 52 45 2(a, b);. CRE
7a50: 41 54 45 20 54 41 42 4c 45 20 74 33 28 61 2c 20 ATE TABLE t3(a,
7a60: 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 b);. CREATE T
7a70: 41 42 4c 45 20 74 34 28 61 2c 20 62 29 3b 0a 20 ABLE t4(a, b);.
7a80: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 CREATE TABLE
7a90: 74 35 28 61 2c 20 62 29 3b 0a 20 20 20 20 43 52 t5(a, b);. CR
7aa0: 45 41 54 45 20 54 41 42 4c 45 20 74 36 28 61 2c EATE TABLE t6(a,
7ab0: 20 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 b);. CREATE
7ac0: 54 41 42 4c 45 20 74 37 28 61 2c 20 62 29 3b 0a TABLE t7(a, b);.
7ad0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 CREATE TABLE
7ae0: 20 74 38 28 61 2c 20 62 29 3b 0a 20 20 20 20 43 t8(a, b);. C
7af0: 52 45 41 54 45 20 54 41 42 4c 45 20 74 39 28 61 REATE TABLE t9(a
7b00: 2c 20 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45 , b);. CREATE
7b10: 20 54 41 42 4c 45 20 74 31 30 28 61 2c 20 62 29 TABLE t10(a, b)
7b20: 3b 0a 20 20 7d 0a 7d 20 7b 31 30 7d 0a 64 6f 5f ;. }.} {10}.do_
7b30: 63 61 74 63 68 73 71 6c 5f 74 65 73 74 20 70 61 catchsql_test pa
7b40: 67 65 72 31 2d 36 2e 32 20 7b 0a 20 20 43 52 45 ger1-6.2 {. CRE
7b50: 41 54 45 20 54 41 42 4c 45 20 74 31 31 28 61 2c ATE TABLE t11(a,
7b60: 20 62 29 0a 7d 20 7b 31 20 7b 64 61 74 61 62 61 b).} {1 {databa
7b70: 73 65 20 6f 72 20 64 69 73 6b 20 69 73 20 66 75 se or disk is fu
7b80: 6c 6c 7d 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f ll}}.do_execsql_
7b90: 74 65 73 74 20 70 61 67 65 72 31 2d 36 2e 34 20 test pager1-6.4
7ba0: 7b 20 50 52 41 47 4d 41 20 6d 61 78 5f 70 61 67 { PRAGMA max_pag
7bb0: 65 5f 63 6f 75 6e 74 20 20 20 20 20 20 7d 20 7b e_count } {
7bc0: 31 30 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 10}.do_execsql_t
7bd0: 65 73 74 20 70 61 67 65 72 31 2d 36 2e 35 20 7b est pager1-6.5 {
7be0: 20 50 52 41 47 4d 41 20 6d 61 78 5f 70 61 67 65 PRAGMA max_page
7bf0: 5f 63 6f 75 6e 74 20 3d 20 31 35 20 7d 20 7b 31 _count = 15 } {1
7c00: 35 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 5}.do_execsql_te
7c10: 73 74 20 70 61 67 65 72 31 2d 36 2e 36 20 7b 20 st pager1-6.6 {
7c20: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 31 CREATE TABLE t11
7c30: 28 61 2c 20 62 29 20 20 20 20 20 7d 20 7b 7d 0a (a, b) } {}.
7c40: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 do_execsql_test
7c50: 70 61 67 65 72 31 2d 36 2e 37 20 7b 0a 20 20 42 pager1-6.7 {. B
7c60: 45 47 49 4e 3b 0a 20 20 20 20 49 4e 53 45 52 54 EGIN;. INSERT
7c70: 20 49 4e 54 4f 20 74 31 31 20 56 41 4c 55 45 53 INTO t11 VALUES
7c80: 28 31 2c 20 32 29 3b 0a 20 20 20 20 50 52 41 47 (1, 2);. PRAG
7c90: 4d 41 20 6d 61 78 5f 70 61 67 65 5f 63 6f 75 6e MA max_page_coun
7ca0: 74 20 3d 20 31 33 3b 0a 7d 20 7b 31 33 7d 0a 64 t = 13;.} {13}.d
7cb0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 o_execsql_test p
7cc0: 61 67 65 72 31 2d 36 2e 38 20 7b 0a 20 20 20 20 ager1-6.8 {.
7cd0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 31 20 INSERT INTO t11
7ce0: 56 41 4c 55 45 53 28 33 2c 20 34 29 3b 0a 20 20 VALUES(3, 4);.
7cf0: 20 20 50 52 41 47 4d 41 20 6d 61 78 5f 70 61 67 PRAGMA max_pag
7d00: 65 5f 63 6f 75 6e 74 20 3d 20 31 30 3b 0a 7d 20 e_count = 10;.}
7d10: 7b 31 31 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f {11}.do_execsql_
7d20: 74 65 73 74 20 70 61 67 65 72 31 2d 36 2e 39 20 test pager1-6.9
7d30: 7b 20 43 4f 4d 4d 49 54 20 7d 20 7b 7d 0a 0a 0a { COMMIT } {}...
7d40: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d #---------------
7d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7d70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 65 ----------.# The
7d90: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74 73 following tests
7da0: 20 77 6f 72 6b 20 77 69 74 68 20 22 50 52 41 47 work with "PRAG
7db0: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d MA journal_mode=
7dc0: 54 52 55 4e 43 41 54 45 22 20 61 6e 64 0a 23 20 TRUNCATE" and.#
7dd0: 22 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f "PRAGMA locking_
7de0: 6d 6f 64 65 3d 45 58 43 4c 55 53 49 56 45 22 2e mode=EXCLUSIVE".
7df0: 0a 23 0a 23 20 45 61 63 68 20 74 65 73 74 20 69 .#.# Each test i
7e00: 73 20 73 70 65 63 69 66 69 65 64 20 77 69 74 68 s specified with
7e10: 20 35 20 76 61 72 69 61 62 6c 65 73 2e 20 41 73 5 variables. As
7e20: 20 66 6f 6c 6c 6f 77 73 3a 0a 23 0a 23 20 20 20 follows:.#.#
7e30: 24 74 6e 3a 20 20 54 65 73 74 20 4e 75 6d 62 65 $tn: Test Numbe
7e40: 72 2e 20 55 73 65 64 20 61 73 20 70 61 72 74 20 r. Used as part
7e50: 6f 66 20 74 68 65 20 5b 64 6f 5f 74 65 73 74 5d of the [do_test]
7e60: 20 74 65 73 74 20 6e 61 6d 65 73 2e 0a 23 20 20 test names..#
7e70: 20 24 73 71 6c 3a 20 53 51 4c 20 74 6f 20 65 78 $sql: SQL to ex
7e80: 65 63 75 74 65 2e 0a 23 20 20 20 24 72 65 73 3a ecute..# $res:
7e90: 20 45 78 70 65 63 74 65 64 20 72 65 73 75 6c 74 Expected result
7ea0: 20 6f 66 20 65 78 65 63 75 74 69 6e 67 20 24 73 of executing $s
7eb0: 71 6c 2e 0a 23 20 20 20 24 6a 73 3a 20 20 54 68 ql..# $js: Th
7ec0: 65 20 65 78 70 65 63 74 65 64 20 73 69 7a 65 20 e expected size
7ed0: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 of the journal f
7ee0: 69 6c 65 2c 20 69 6e 20 62 79 74 65 73 2c 20 61 ile, in bytes, a
7ef0: 66 74 65 72 20 65 78 65 63 75 74 69 6e 67 0a 23 fter executing.#
7f00: 20 20 20 20 20 20 20 20 20 74 68 65 20 53 51 4c the SQL
7f10: 20 73 63 72 69 70 74 2e 20 4f 72 20 2d 31 20 69 script. Or -1 i
7f20: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 f the journal is
7f30: 20 6e 6f 74 20 65 78 70 65 63 74 65 64 20 74 6f not expected to
7f40: 20 65 78 69 73 74 2e 0a 23 20 20 20 24 77 73 3a exist..# $ws:
7f50: 20 20 54 68 65 20 65 78 70 65 63 74 65 64 20 73 The expected s
7f60: 69 7a 65 20 6f 66 20 74 68 65 20 57 41 4c 20 66 ize of the WAL f
7f70: 69 6c 65 2c 20 69 6e 20 62 79 74 65 73 2c 20 61 ile, in bytes, a
7f80: 66 74 65 72 20 65 78 65 63 75 74 69 6e 67 0a 23 fter executing.#
7f90: 20 20 20 20 20 20 20 20 20 74 68 65 20 53 51 4c the SQL
7fa0: 20 73 63 72 69 70 74 2e 20 4f 72 20 2d 31 20 69 script. Or -1 i
7fb0: 66 20 74 68 65 20 57 41 4c 20 69 73 20 6e 6f 74 f the WAL is not
7fc0: 20 65 78 70 65 63 74 65 64 20 74 6f 20 65 78 69 expected to exi
7fd0: 73 74 2e 0a 23 0a 69 66 63 61 70 61 62 6c 65 20 st..#.ifcapable
7fe0: 77 61 6c 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d wal {. faultsim
7ff0: 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 _delete_and_reop
8000: 65 6e 0a 20 20 66 6f 72 65 61 63 68 20 7b 74 6e en. foreach {tn
8010: 20 73 71 6c 20 72 65 73 20 6a 73 20 77 73 7d 20 sql res js ws}
8020: 5b 73 75 62 73 74 20 7b 0a 20 20 0a 20 20 20 20 [subst {. .
8030: 31 20 20 7b 0a 20 20 20 20 20 20 43 52 45 41 54 1 {. CREAT
8040: 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 E TABLE t1(a, b)
8050: 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 61 ;. PRAGMA a
8060: 75 74 6f 5f 76 61 63 75 75 6d 3d 4f 46 46 3b 0a uto_vacuum=OFF;.
8070: 20 20 20 20 20 20 50 52 41 47 4d 41 20 73 79 6e PRAGMA syn
8080: 63 68 72 6f 6e 6f 75 73 3d 4e 4f 52 4d 41 4c 3b chronous=NORMAL;
8090: 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 70 61 . PRAGMA pa
80a0: 67 65 5f 73 69 7a 65 3d 31 30 32 34 3b 0a 20 20 ge_size=1024;.
80b0: 20 20 20 20 50 52 41 47 4d 41 20 6c 6f 63 6b 69 PRAGMA locki
80c0: 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55 53 49 56 ng_mode=EXCLUSIV
80d0: 45 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 E;. PRAGMA
80e0: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 54 52 55 journal_mode=TRU
80f0: 4e 43 41 54 45 3b 0a 20 20 20 20 20 20 49 4e 53 NCATE;. INS
8100: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 ERT INTO t1 VALU
8110: 45 53 28 31 2c 20 32 29 3b 0a 20 20 20 20 7d 20 ES(1, 2);. }
8120: 7b 65 78 63 6c 75 73 69 76 65 20 74 72 75 6e 63 {exclusive trunc
8130: 61 74 65 7d 20 30 20 2d 31 0a 20 20 0a 20 20 20 ate} 0 -1. .
8140: 20 32 20 20 7b 0a 20 20 20 20 20 20 42 45 47 49 2 {. BEGI
8150: 4e 20 49 4d 4d 45 44 49 41 54 45 3b 0a 20 20 20 N IMMEDIATE;.
8160: 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 SELECT * FR
8170: 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20 43 4f 4d OM t1;. COM
8180: 4d 49 54 3b 0a 20 20 20 20 7d 20 7b 31 20 32 7d MIT;. } {1 2}
8190: 20 30 20 2d 31 0a 20 20 0a 20 20 20 20 33 20 20 0 -1. . 3
81a0: 7b 0a 20 20 20 20 20 20 42 45 47 49 4e 3b 0a 20 {. BEGIN;.
81b0: 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 SELECT *
81c0: 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20 43 FROM t1;. C
81d0: 4f 4d 4d 49 54 3b 0a 20 20 20 20 7d 20 7b 31 20 OMMIT;. } {1
81e0: 32 7d 20 30 20 2d 31 0a 20 20 0a 20 20 20 20 34 2} 0 -1. . 4
81f0: 20 20 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e { PRAGMA journ
8200: 61 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c 20 7d 20 al_mode = WAL }
8210: 20 20 20 77 61 6c 20 20 20 20 2d 31 20 2d 31 0a wal -1 -1.
8220: 20 20 20 20 35 20 20 7b 20 49 4e 53 45 52 54 20 5 { INSERT
8230: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 33 INTO t1 VALUES(3
8240: 2c 20 34 29 20 7d 20 20 7b 7d 20 20 20 20 20 2d , 4) } {} -
8250: 31 20 5b 77 61 6c 5f 66 69 6c 65 5f 73 69 7a 65 1 [wal_file_size
8260: 20 31 20 31 30 32 34 5d 0a 20 20 20 20 36 20 20 1 1024]. 6
8270: 7b 20 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67 { PRAGMA locking
8280: 5f 6d 6f 64 65 20 3d 20 4e 4f 52 4d 41 4c 20 7d _mode = NORMAL }
8290: 20 6e 6f 72 6d 61 6c 20 2d 31 20 5b 77 61 6c 5f normal -1 [wal_
82a0: 66 69 6c 65 5f 73 69 7a 65 20 31 20 31 30 32 34 file_size 1 1024
82b0: 5d 0a 20 20 20 20 37 20 20 7b 20 49 4e 53 45 52 ]. 7 { INSER
82c0: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 T INTO t1 VALUES
82d0: 28 35 2c 20 36 29 3b 20 7d 20 7b 7d 20 20 20 20 (5, 6); } {}
82e0: 20 2d 31 20 5b 77 61 6c 5f 66 69 6c 65 5f 73 69 -1 [wal_file_si
82f0: 7a 65 20 32 20 31 30 32 34 5d 0a 20 20 0a 20 20 ze 2 1024]. .
8300: 20 20 38 20 20 7b 20 50 52 41 47 4d 41 20 6a 6f 8 { PRAGMA jo
8310: 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 54 52 55 urnal_mode = TRU
8320: 4e 43 41 54 45 20 7d 20 74 72 75 6e 63 61 74 65 NCATE } truncate
8330: 20 20 20 20 20 20 20 20 20 20 30 20 2d 31 0a 20 0 -1.
8340: 20 20 20 39 20 20 7b 20 49 4e 53 45 52 54 20 49 9 { INSERT I
8350: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 37 2c NTO t1 VALUES(7,
8360: 20 38 29 20 7d 20 20 20 20 7b 7d 20 20 20 20 20 8) } {}
8370: 20 20 20 20 20 20 20 20 20 20 20 30 20 2d 31 0a 0 -1.
8380: 20 20 20 20 31 30 20 7b 20 53 45 4c 45 43 54 20 10 { SELECT
8390: 2a 20 46 52 4f 4d 20 74 31 20 7d 20 20 20 20 20 * FROM t1 }
83a0: 20 20 20 20 20 20 20 20 20 20 7b 31 20 32 20 33 {1 2 3
83b0: 20 34 20 35 20 36 20 37 20 38 7d 20 30 20 2d 31 4 5 6 7 8} 0 -1
83c0: 0a 20 20 0a 20 20 7d 5d 20 7b 0a 20 20 20 20 64 . . }] {. d
83d0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 o_execsql_test p
83e0: 61 67 65 72 31 2d 37 2e 31 2e 24 74 6e 2e 31 20 ager1-7.1.$tn.1
83f0: 24 73 71 6c 20 24 72 65 73 0a 20 20 20 20 63 61 $sql $res. ca
8400: 74 63 68 20 7b 20 73 65 74 20 4a 20 2d 31 20 3b tch { set J -1 ;
8410: 20 73 65 74 20 4a 20 5b 66 69 6c 65 20 73 69 7a set J [file siz
8420: 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 e test.db-journa
8430: 6c 5d 20 7d 0a 20 20 20 20 63 61 74 63 68 20 7b l] }. catch {
8440: 20 73 65 74 20 57 20 2d 31 20 3b 20 73 65 74 20 set W -1 ; set
8450: 57 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73 W [file size tes
8460: 74 2e 64 62 2d 77 61 6c 5d 20 7d 0a 20 20 20 20 t.db-wal] }.
8470: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 37 do_test pager1-7
8480: 2e 31 2e 24 74 6e 2e 32 20 7b 20 6c 69 73 74 20 .1.$tn.2 { list
8490: 24 4a 20 24 57 20 7d 20 5b 6c 69 73 74 20 24 6a $J $W } [list $j
84a0: 73 20 24 77 73 5d 0a 20 20 7d 0a 7d 0a 0a 64 6f s $ws]. }.}..do
84b0: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 37 2e 32 _test pager1-7.2
84c0: 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f .1 {. faultsim_
84d0: 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 delete_and_reope
84e0: 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 n. execsql {.
84f0: 20 20 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67 PRAGMA locking
8500: 5f 6d 6f 64 65 20 3d 20 45 58 43 4c 55 53 49 56 _mode = EXCLUSIV
8510: 45 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 E;. CREATE TA
8520: 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 BLE t1(a, b);.
8530: 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 50 BEGIN;. P
8540: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f RAGMA journal_mo
8550: 64 65 20 3d 20 64 65 6c 65 74 65 3b 0a 20 20 20 de = delete;.
8560: 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 PRAGMA journa
8570: 6c 5f 6d 6f 64 65 20 3d 20 74 72 75 6e 63 61 74 l_mode = truncat
8580: 65 3b 0a 20 20 7d 0a 7d 20 7b 65 78 63 6c 75 73 e;. }.} {exclus
8590: 69 76 65 20 64 65 6c 65 74 65 20 74 72 75 6e 63 ive delete trunc
85a0: 61 74 65 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 ate}.do_test pag
85b0: 65 72 31 2d 37 2e 32 2e 32 20 7b 0a 20 20 65 78 er1-7.2.2 {. ex
85c0: 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 ecsql { INSERT I
85d0: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c NTO t1 VALUES(1,
85e0: 20 32 29 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 2) }. execsql
85f0: 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c { PRAGMA journal
8600: 5f 6d 6f 64 65 20 3d 20 70 65 72 73 69 73 74 20 _mode = persist
8610: 7d 0a 7d 20 7b 74 72 75 6e 63 61 74 65 7d 0a 64 }.} {truncate}.d
8620: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 37 2e o_test pager1-7.
8630: 32 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 2.3 {. execsql
8640: 7b 20 43 4f 4d 4d 49 54 20 7d 0a 20 20 65 78 65 { COMMIT }. exe
8650: 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d csql {. PRAGM
8660: 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d A journal_mode =
8670: 20 70 65 72 73 69 73 74 3b 0a 20 20 20 20 50 52 persist;. PR
8680: 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 73 69 7a AGMA journal_siz
8690: 65 5f 6c 69 6d 69 74 3b 0a 20 20 7d 0a 7d 20 7b e_limit;. }.} {
86a0: 70 65 72 73 69 73 74 20 2d 31 7d 0a 0a 23 2d 2d persist -1}..#--
86b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
86c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
86d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
86e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
86f0: 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 65 20 66 6f -------.# The fo
8700: 6c 6c 6f 77 69 6e 67 20 74 65 73 74 73 2c 20 70 llowing tests, p
8710: 61 67 65 72 31 2d 38 2e 2a 2c 20 74 65 73 74 20 ager1-8.*, test
8720: 74 68 61 74 20 74 68 65 20 73 70 65 63 69 61 6c that the special
8730: 20 66 69 6c 65 6e 61 6d 65 73 20 0a 23 20 22 3a filenames .# ":
8740: 6d 65 6d 6f 72 79 3a 22 20 61 6e 64 20 22 22 20 memory:" and ""
8750: 6f 70 65 6e 20 74 65 6d 70 6f 72 61 72 79 20 64 open temporary d
8760: 61 74 61 62 61 73 65 73 2e 0a 23 0a 66 6f 72 65 atabases..#.fore
8770: 61 63 68 20 7b 74 6e 20 66 69 6c 65 6e 61 6d 65 ach {tn filename
8780: 7d 20 7b 0a 20 20 31 20 3a 6d 65 6d 6f 72 79 3a } {. 1 :memory:
8790: 0a 20 20 32 20 22 22 0a 7d 20 7b 0a 20 20 64 6f . 2 "".} {. do
87a0: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 38 2e 24 _test pager1-8.$
87b0: 74 6e 2e 31 20 7b 0a 20 20 20 20 66 61 75 6c 74 tn.1 {. fault
87c0: 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 sim_delete_and_r
87d0: 65 6f 70 65 6e 0a 20 20 20 20 64 62 20 63 6c 6f eopen. db clo
87e0: 73 65 0a 20 20 20 20 73 71 6c 69 74 65 33 20 64 se. sqlite3 d
87f0: 62 20 24 66 69 6c 65 6e 61 6d 65 0a 20 20 20 20 b $filename.
8800: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 execsql {.
8810: 50 52 41 47 4d 41 20 61 75 74 6f 5f 76 61 63 75 PRAGMA auto_vacu
8820: 75 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 43 52 um = 1;. CR
8830: 45 41 54 45 20 54 41 42 4c 45 20 78 31 28 78 29 EATE TABLE x1(x)
8840: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 ;. INSERT I
8850: 4e 54 4f 20 78 31 20 56 41 4c 55 45 53 28 27 43 NTO x1 VALUES('C
8860: 68 61 72 6c 65 73 27 29 3b 0a 20 20 20 20 20 20 harles');.
8870: 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 31 20 56 INSERT INTO x1 V
8880: 41 4c 55 45 53 28 27 4a 61 6d 65 73 27 29 3b 0a ALUES('James');.
8890: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 INSERT INT
88a0: 4f 20 78 31 20 56 41 4c 55 45 53 28 27 4d 61 72 O x1 VALUES('Mar
88b0: 79 27 29 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 y');. SELEC
88c0: 54 20 2a 20 46 52 4f 4d 20 78 31 3b 0a 20 20 20 T * FROM x1;.
88d0: 20 7d 0a 20 20 7d 20 7b 43 68 61 72 6c 65 73 20 }. } {Charles
88e0: 4a 61 6d 65 73 20 4d 61 72 79 7d 0a 0a 20 20 64 James Mary}.. d
88f0: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 38 2e o_test pager1-8.
8900: 24 74 6e 2e 32 20 7b 0a 20 20 20 20 73 71 6c 69 $tn.2 {. sqli
8910: 74 65 33 20 64 62 32 20 24 66 69 6c 65 6e 61 6d te3 db2 $filenam
8920: 65 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b e. catchsql {
8930: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 78 SELECT * FROM x
8940: 31 20 7d 20 64 62 32 0a 20 20 7d 20 7b 31 20 7b 1 } db2. } {1 {
8950: 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20 78 no such table: x
8960: 31 7d 7d 0a 0a 20 20 64 6f 5f 65 78 65 63 73 71 1}}.. do_execsq
8970: 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 38 2e l_test pager1-8.
8980: 24 74 6e 2e 33 20 7b 0a 20 20 20 20 42 45 47 49 $tn.3 {. BEGI
8990: 4e 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 N;. INSERT
89a0: 49 4e 54 4f 20 78 31 20 56 41 4c 55 45 53 28 27 INTO x1 VALUES('
89b0: 57 69 6c 6c 69 61 6d 27 29 3b 0a 20 20 20 20 20 William');.
89c0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 31 20 INSERT INTO x1
89d0: 56 41 4c 55 45 53 28 27 41 6e 6e 65 27 29 3b 0a VALUES('Anne');.
89e0: 20 20 20 20 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 ROLLBACK;.
89f0: 7d 20 7b 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d } {}.}..#-------
8a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8a10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8a20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8a40: 2d 2d 0a 23 20 54 68 65 20 6e 65 78 74 20 62 6c --.# The next bl
8a50: 6f 63 6b 20 6f 66 20 74 65 73 74 73 20 2d 20 70 ock of tests - p
8a60: 61 67 65 72 31 2d 39 2e 2a 20 2d 20 64 65 61 6c ager1-9.* - deal
8a70: 20 77 69 74 68 20 69 6e 74 65 72 61 63 74 69 6f with interactio
8a80: 6e 73 20 62 65 74 77 65 65 6e 0a 23 20 74 68 65 ns between.# the
8a90: 20 70 61 67 65 72 20 61 6e 64 20 74 68 65 20 62 pager and the b
8aa0: 61 63 6b 75 70 20 41 50 49 2e 20 54 65 73 74 20 ackup API. Test
8ab0: 63 61 73 65 73 3a 0a 23 0a 23 20 20 20 70 61 67 cases:.#.# pag
8ac0: 65 72 31 2d 39 2e 31 2e 2a 3a 20 54 65 73 74 20 er1-9.1.*: Test
8ad0: 74 68 61 74 20 61 20 62 61 63 6b 75 70 20 63 6f that a backup co
8ae0: 6d 70 6c 65 74 65 73 20 73 75 63 63 65 73 73 66 mpletes successf
8af0: 75 6c 6c 79 20 65 76 65 6e 20 69 66 20 74 68 65 ully even if the
8b00: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .#
8b10: 20 20 20 73 6f 75 72 63 65 20 64 62 20 69 73 20 source db is
8b20: 77 72 69 74 74 65 6e 20 74 6f 20 64 75 72 69 6e written to durin
8b30: 67 20 74 68 65 20 62 61 63 6b 75 70 20 6f 70 2e g the backup op.
8b40: 0a 23 0a 23 20 20 20 70 61 67 65 72 31 2d 39 2e .#.# pager1-9.
8b50: 32 2e 2a 3a 20 54 65 73 74 20 74 68 61 74 20 61 2.*: Test that a
8b60: 20 62 61 63 6b 75 70 20 63 6f 6d 70 6c 65 74 65 backup complete
8b70: 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 65 s successfully e
8b80: 76 65 6e 20 69 66 20 74 68 65 0a 23 20 20 20 20 ven if the.#
8b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 6f 75 sou
8ba0: 72 63 65 20 64 62 20 69 73 20 77 72 69 74 74 65 rce db is writte
8bb0: 6e 20 74 6f 20 61 6e 64 20 74 68 65 6e 20 72 6f n to and then ro
8bc0: 6c 6c 65 64 20 62 61 63 6b 20 64 75 72 69 6e 67 lled back during
8bd0: 20 61 20 0a 23 20 20 20 20 20 20 20 20 20 20 20 a .#
8be0: 20 20 20 20 20 20 62 61 63 6b 75 70 20 6f 70 65 backup ope
8bf0: 72 61 74 69 6f 6e 2e 0a 23 0a 64 6f 5f 74 65 73 ration..#.do_tes
8c00: 74 20 70 61 67 65 72 31 2d 39 2e 30 2e 31 20 7b t pager1-9.0.1 {
8c10: 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 . faultsim_dele
8c20: 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 te_and_reopen.
8c30: 64 62 20 66 75 6e 63 20 61 5f 73 74 72 69 6e 67 db func a_string
8c40: 20 61 5f 73 74 72 69 6e 67 0a 20 20 65 78 65 63 a_string. exec
8c50: 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 sql {. PRAGMA
8c60: 20 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 31 30 cache_size = 10
8c70: 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 ;. BEGIN;.
8c80: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 CREATE TABLE
8c90: 61 62 28 61 2c 20 62 2c 20 55 4e 49 51 55 45 28 ab(a, b, UNIQUE(
8ca0: 61 2c 20 62 29 29 3b 0a 20 20 20 20 20 20 49 4e a, b));. IN
8cb0: 53 45 52 54 20 49 4e 54 4f 20 61 62 20 56 41 4c SERT INTO ab VAL
8cc0: 55 45 53 28 20 61 5f 73 74 72 69 6e 67 28 32 30 UES( a_string(20
8cd0: 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 33 30 30 0), a_string(300
8ce0: 29 20 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 ) );. INSER
8cf0: 54 20 49 4e 54 4f 20 61 62 20 53 45 4c 45 43 54 T INTO ab SELECT
8d00: 20 61 5f 73 74 72 69 6e 67 28 32 30 30 29 2c 20 a_string(200),
8d10: 61 5f 73 74 72 69 6e 67 28 33 30 30 29 20 46 52 a_string(300) FR
8d20: 4f 4d 20 61 62 3b 0a 20 20 20 20 20 20 49 4e 53 OM ab;. INS
8d30: 45 52 54 20 49 4e 54 4f 20 61 62 20 53 45 4c 45 ERT INTO ab SELE
8d40: 43 54 20 61 5f 73 74 72 69 6e 67 28 32 30 30 29 CT a_string(200)
8d50: 2c 20 61 5f 73 74 72 69 6e 67 28 33 30 30 29 20 , a_string(300)
8d60: 46 52 4f 4d 20 61 62 3b 0a 20 20 20 20 20 20 49 FROM ab;. I
8d70: 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 20 53 45 NSERT INTO ab SE
8d80: 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 32 30 LECT a_string(20
8d90: 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 33 30 30 0), a_string(300
8da0: 29 20 46 52 4f 4d 20 61 62 3b 0a 20 20 20 20 20 ) FROM ab;.
8db0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 20 INSERT INTO ab
8dc0: 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 SELECT a_string(
8dd0: 32 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 33 200), a_string(3
8de0: 30 30 29 20 46 52 4f 4d 20 61 62 3b 0a 20 20 20 00) FROM ab;.
8df0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 INSERT INTO a
8e00: 62 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e b SELECT a_strin
8e10: 67 28 32 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 g(200), a_string
8e20: 28 33 30 30 29 20 46 52 4f 4d 20 61 62 3b 0a 20 (300) FROM ab;.
8e30: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f INSERT INTO
8e40: 20 61 62 20 53 45 4c 45 43 54 20 61 5f 73 74 72 ab SELECT a_str
8e50: 69 6e 67 28 32 30 30 29 2c 20 61 5f 73 74 72 69 ing(200), a_stri
8e60: 6e 67 28 33 30 30 29 20 46 52 4f 4d 20 61 62 3b ng(300) FROM ab;
8e70: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e . INSERT IN
8e80: 54 4f 20 61 62 20 53 45 4c 45 43 54 20 61 5f 73 TO ab SELECT a_s
8e90: 74 72 69 6e 67 28 32 30 30 29 2c 20 61 5f 73 74 tring(200), a_st
8ea0: 72 69 6e 67 28 33 30 30 29 20 46 52 4f 4d 20 61 ring(300) FROM a
8eb0: 62 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 b;. COMMIT;.
8ec0: 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 }.} {}.do_test
8ed0: 70 61 67 65 72 31 2d 39 2e 30 2e 32 20 7b 0a 20 pager1-9.0.2 {.
8ee0: 20 73 71 6c 69 74 65 33 20 64 62 32 20 74 65 73 sqlite3 db2 tes
8ef0: 74 2e 64 62 32 0a 20 20 64 62 32 20 65 76 61 6c t.db2. db2 eval
8f00: 20 7b 20 50 52 41 47 4d 41 20 63 61 63 68 65 5f { PRAGMA cache_
8f10: 73 69 7a 65 20 3d 20 31 30 20 7d 0a 20 20 73 71 size = 10 }. sq
8f20: 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 42 20 64 lite3_backup B d
8f30: 62 32 20 6d 61 69 6e 20 64 62 20 6d 61 69 6e 0a b2 main db main.
8f40: 20 20 6c 69 73 74 20 5b 42 20 73 74 65 70 20 31 list [B step 1
8f50: 30 30 30 30 5d 20 5b 42 20 66 69 6e 69 73 68 5d 0000] [B finish]
8f60: 0a 7d 20 7b 53 51 4c 49 54 45 5f 44 4f 4e 45 20 .} {SQLITE_DONE
8f70: 53 51 4c 49 54 45 5f 4f 4b 7d 0a 64 6f 5f 74 65 SQLITE_OK}.do_te
8f80: 73 74 20 70 61 67 65 72 31 2d 39 2e 30 2e 33 20 st pager1-9.0.3
8f90: 7b 0a 20 64 62 20 6f 6e 65 20 7b 53 45 4c 45 43 {. db one {SELEC
8fa0: 54 20 6d 64 35 73 75 6d 28 61 2c 20 62 29 20 46 T md5sum(a, b) F
8fb0: 52 4f 4d 20 61 62 7d 0a 7d 20 5b 64 62 32 20 6f ROM ab}.} [db2 o
8fc0: 6e 65 20 7b 53 45 4c 45 43 54 20 6d 64 35 73 75 ne {SELECT md5su
8fd0: 6d 28 61 2c 20 62 29 20 46 52 4f 4d 20 61 62 7d m(a, b) FROM ab}
8fe0: 5d 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 ]..do_test pager
8ff0: 31 2d 39 2e 31 2e 31 20 7b 0a 20 20 65 78 65 63 1-9.1.1 {. exec
9000: 73 71 6c 20 7b 20 55 50 44 41 54 45 20 61 62 20 sql { UPDATE ab
9010: 53 45 54 20 61 20 3d 20 61 5f 73 74 72 69 6e 67 SET a = a_string
9020: 28 32 30 31 29 20 7d 0a 20 20 73 71 6c 69 74 65 (201) }. sqlite
9030: 33 5f 62 61 63 6b 75 70 20 42 20 64 62 32 20 6d 3_backup B db2 m
9040: 61 69 6e 20 64 62 20 6d 61 69 6e 0a 20 20 42 20 ain db main. B
9050: 73 74 65 70 20 33 30 0a 7d 20 7b 53 51 4c 49 54 step 30.} {SQLIT
9060: 45 5f 4f 4b 7d 0a 64 6f 5f 74 65 73 74 20 70 61 E_OK}.do_test pa
9070: 67 65 72 31 2d 39 2e 31 2e 32 20 7b 0a 20 20 65 ger1-9.1.2 {. e
9080: 78 65 63 73 71 6c 20 7b 20 55 50 44 41 54 45 20 xecsql { UPDATE
9090: 61 62 20 53 45 54 20 62 20 3d 20 61 5f 73 74 72 ab SET b = a_str
90a0: 69 6e 67 28 33 30 31 29 20 7d 0a 20 20 6c 69 73 ing(301) }. lis
90b0: 74 20 5b 42 20 73 74 65 70 20 31 30 30 30 30 5d t [B step 10000]
90c0: 20 5b 42 20 66 69 6e 69 73 68 5d 0a 7d 20 7b 53 [B finish].} {S
90d0: 51 4c 49 54 45 5f 44 4f 4e 45 20 53 51 4c 49 54 QLITE_DONE SQLIT
90e0: 45 5f 4f 4b 7d 0a 64 6f 5f 74 65 73 74 20 70 61 E_OK}.do_test pa
90f0: 67 65 72 31 2d 39 2e 31 2e 33 20 7b 0a 20 64 62 ger1-9.1.3 {. db
9100: 20 6f 6e 65 20 7b 53 45 4c 45 43 54 20 6d 64 35 one {SELECT md5
9110: 73 75 6d 28 61 2c 20 62 29 20 46 52 4f 4d 20 61 sum(a, b) FROM a
9120: 62 7d 0a 7d 20 5b 64 62 32 20 6f 6e 65 20 7b 53 b}.} [db2 one {S
9130: 45 4c 45 43 54 20 6d 64 35 73 75 6d 28 61 2c 20 ELECT md5sum(a,
9140: 62 29 20 46 52 4f 4d 20 61 62 7d 5d 0a 64 6f 5f b) FROM ab}].do_
9150: 74 65 73 74 20 70 61 67 65 72 31 2d 39 2e 31 2e test pager1-9.1.
9160: 34 20 7b 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4 { execsql { SE
9170: 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 LECT count(*) FR
9180: 4f 4d 20 61 62 20 7d 20 7d 20 7b 31 32 38 7d 0a OM ab } } {128}.
9190: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d .do_test pager1-
91a0: 39 2e 32 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 9.2.1 {. execsq
91b0: 6c 20 7b 20 55 50 44 41 54 45 20 61 62 20 53 45 l { UPDATE ab SE
91c0: 54 20 61 20 3d 20 61 5f 73 74 72 69 6e 67 28 32 T a = a_string(2
91d0: 30 32 29 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 02) }. sqlite3_
91e0: 62 61 63 6b 75 70 20 42 20 64 62 32 20 6d 61 69 backup B db2 mai
91f0: 6e 20 64 62 20 6d 61 69 6e 0a 20 20 42 20 73 74 n db main. B st
9200: 65 70 20 33 30 0a 7d 20 7b 53 51 4c 49 54 45 5f ep 30.} {SQLITE_
9210: 4f 4b 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 OK}.do_test page
9220: 72 31 2d 39 2e 32 2e 32 20 7b 0a 20 20 65 78 65 r1-9.2.2 {. exe
9230: 63 73 71 6c 20 7b 20 0a 20 20 20 20 42 45 47 49 csql { . BEGI
9240: 4e 3b 0a 20 20 20 20 20 20 55 50 44 41 54 45 20 N;. UPDATE
9250: 61 62 20 53 45 54 20 62 20 3d 20 61 5f 73 74 72 ab SET b = a_str
9260: 69 6e 67 28 33 30 31 29 3b 0a 20 20 20 20 52 4f ing(301);. RO
9270: 4c 4c 42 41 43 4b 3b 0a 20 20 7d 0a 20 20 6c 69 LLBACK;. }. li
9280: 73 74 20 5b 42 20 73 74 65 70 20 31 30 30 30 30 st [B step 10000
9290: 5d 20 5b 42 20 66 69 6e 69 73 68 5d 0a 7d 20 7b ] [B finish].} {
92a0: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 53 51 4c 49 SQLITE_DONE SQLI
92b0: 54 45 5f 4f 4b 7d 0a 64 6f 5f 74 65 73 74 20 70 TE_OK}.do_test p
92c0: 61 67 65 72 31 2d 39 2e 32 2e 33 20 7b 0a 20 64 ager1-9.2.3 {. d
92d0: 62 20 6f 6e 65 20 7b 53 45 4c 45 43 54 20 6d 64 b one {SELECT md
92e0: 35 73 75 6d 28 61 2c 20 62 29 20 46 52 4f 4d 20 5sum(a, b) FROM
92f0: 61 62 7d 0a 7d 20 5b 64 62 32 20 6f 6e 65 20 7b ab}.} [db2 one {
9300: 53 45 4c 45 43 54 20 6d 64 35 73 75 6d 28 61 2c SELECT md5sum(a,
9310: 20 62 29 20 46 52 4f 4d 20 61 62 7d 5d 0a 64 6f b) FROM ab}].do
9320: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 39 2e 32 _test pager1-9.2
9330: 2e 34 20 7b 20 65 78 65 63 73 71 6c 20 7b 20 53 .4 { execsql { S
9340: 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 ELECT count(*) F
9350: 52 4f 4d 20 61 62 20 7d 20 7d 20 7b 31 32 38 7d ROM ab } } {128}
9360: 0a 64 62 20 63 6c 6f 73 65 0a 64 62 32 20 63 6c .db close.db2 cl
9370: 6f 73 65 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ose..#----------
9380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
93a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
93b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
93c0: 23 20 54 65 73 74 20 74 68 61 74 20 72 65 67 61 # Test that rega
93d0: 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 76 61 rdless of the va
93e0: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 lue returned by
93f0: 78 53 65 63 74 6f 72 53 69 7a 65 28 29 2c 20 74 xSectorSize(), t
9400: 68 65 0a 23 20 6d 69 6e 69 6d 75 6d 20 65 66 66 he.# minimum eff
9410: 65 63 74 69 76 65 20 73 65 63 74 6f 72 2d 73 69 ective sector-si
9420: 7a 65 20 69 73 20 35 31 32 20 61 6e 64 20 74 68 ze is 512 and th
9430: 65 20 6d 61 78 69 6d 75 6d 20 36 35 35 33 36 20 e maximum 65536
9440: 62 79 74 65 73 2e 0a 23 0a 74 65 73 74 76 66 73 bytes..#.testvfs
9450: 20 74 76 20 2d 64 65 66 61 75 6c 74 20 31 0a 66 tv -default 1.f
9460: 6f 72 65 61 63 68 20 73 65 63 74 6f 72 73 69 7a oreach sectorsiz
9470: 65 20 7b 0a 20 20 20 20 33 32 20 20 20 36 34 20 e {. 32 64
9480: 20 20 31 32 38 20 20 20 32 35 36 20 20 20 35 31 128 256 51
9490: 32 20 20 20 31 30 32 34 20 20 20 32 30 34 38 20 2 1024 2048
94a0: 0a 20 20 20 20 34 30 39 36 20 38 31 39 32 20 31 . 4096 8192 1
94b0: 36 33 38 34 20 33 32 37 36 38 20 36 35 35 33 36 6384 32768 65536
94c0: 20 31 33 31 30 37 32 20 32 36 32 31 34 34 0a 7d 131072 262144.}
94d0: 20 7b 0a 20 20 74 76 20 73 65 63 74 6f 72 73 69 {. tv sectorsi
94e0: 7a 65 20 24 73 65 63 74 6f 72 73 69 7a 65 0a 20 ze $sectorsize.
94f0: 20 73 65 74 20 65 66 66 20 24 73 65 63 74 6f 72 set eff $sector
9500: 73 69 7a 65 0a 20 20 69 66 20 7b 24 73 65 63 74 size. if {$sect
9510: 6f 72 73 69 7a 65 20 3c 20 35 31 32 7d 20 20 20 orsize < 512}
9520: 7b 20 73 65 74 20 65 66 66 20 35 31 32 20 7d 0a { set eff 512 }.
9530: 20 20 69 66 20 7b 24 73 65 63 74 6f 72 73 69 7a if {$sectorsiz
9540: 65 20 3e 20 36 35 35 33 36 7d 20 7b 20 73 65 74 e > 65536} { set
9550: 20 65 66 66 20 36 35 35 33 36 20 7d 0a 0a 20 20 eff 65536 }..
9560: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 do_test pager1-1
9570: 30 2e 24 73 65 63 74 6f 72 73 69 7a 65 20 7b 0a 0.$sectorsize {.
9580: 20 20 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c faultsim_del
9590: 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 ete_and_reopen.
95a0: 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 execsql {.
95b0: 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 PRAGMA journa
95c0: 6c 5f 6d 6f 64 65 20 3d 20 50 45 52 53 49 53 54 l_mode = PERSIST
95d0: 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 70 ;. PRAGMA p
95e0: 61 67 65 5f 73 69 7a 65 20 3d 20 31 30 32 34 3b age_size = 1024;
95f0: 0a 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41 . CREATE TA
9600: 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 BLE t1(a, b);.
9610: 20 20 7d 0a 20 20 20 20 66 69 6c 65 20 73 69 7a }. file siz
9620: 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 e test.db-journa
9630: 6c 0a 20 20 7d 20 5b 65 78 70 72 20 24 73 65 63 l. } [expr $sec
9640: 74 6f 72 73 69 7a 65 20 3e 20 36 35 35 33 36 20 torsize > 65536
9650: 3f 20 36 35 35 33 36 20 3a 20 24 73 65 63 74 6f ? 65536 : $secto
9660: 72 73 69 7a 65 5d 0a 7d 0a 64 62 20 63 6c 6f 73 rsize].}.db clos
9670: 65 0a 74 76 20 64 65 6c 65 74 65 0a 0a 74 65 73 e.tv delete..tes
9680: 74 76 66 73 20 74 76 20 2d 64 65 66 61 75 6c 74 tvfs tv -default
9690: 20 31 0a 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 1.faultsim_dele
96a0: 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 64 62 te_and_reopen.db
96b0: 20 66 75 6e 63 20 61 5f 73 74 72 69 6e 67 20 61 func a_string a
96c0: 5f 73 74 72 69 6e 67 0a 64 6f 5f 65 78 65 63 73 _string.do_execs
96d0: 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 ql_test pager1-1
96e0: 31 2e 31 20 7b 0a 20 20 50 52 41 47 4d 41 20 63 1.1 {. PRAGMA c
96f0: 61 63 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b 0a ache_size = 10;.
9700: 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 43 52 45 BEGIN;. CRE
9710: 41 54 45 20 54 41 42 4c 45 20 7a 7a 28 74 6f 70 ATE TABLE zz(top
9720: 20 50 52 49 4d 41 52 59 20 4b 45 59 29 3b 0a 20 PRIMARY KEY);.
9730: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a INSERT INTO z
9740: 7a 20 56 41 4c 55 45 53 28 61 5f 73 74 72 69 6e z VALUES(a_strin
9750: 67 28 32 32 32 29 29 3b 0a 20 20 20 20 49 4e 53 g(222));. INS
9760: 45 52 54 20 49 4e 54 4f 20 7a 7a 20 53 45 4c 45 ERT INTO zz SELE
9770: 43 54 20 61 5f 73 74 72 69 6e 67 28 28 53 45 4c CT a_string((SEL
9780: 45 43 54 20 32 32 32 2b 6d 61 78 28 72 6f 77 69 ECT 222+max(rowi
9790: 64 29 20 46 52 4f 4d 20 7a 7a 29 29 20 46 52 4f d) FROM zz)) FRO
97a0: 4d 20 7a 7a 3b 0a 20 20 20 20 49 4e 53 45 52 54 M zz;. INSERT
97b0: 20 49 4e 54 4f 20 7a 7a 20 53 45 4c 45 43 54 20 INTO zz SELECT
97c0: 61 5f 73 74 72 69 6e 67 28 28 53 45 4c 45 43 54 a_string((SELECT
97d0: 20 32 32 32 2b 6d 61 78 28 72 6f 77 69 64 29 20 222+max(rowid)
97e0: 46 52 4f 4d 20 7a 7a 29 29 20 46 52 4f 4d 20 7a FROM zz)) FROM z
97f0: 7a 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e z;. INSERT IN
9800: 54 4f 20 7a 7a 20 53 45 4c 45 43 54 20 61 5f 73 TO zz SELECT a_s
9810: 74 72 69 6e 67 28 28 53 45 4c 45 43 54 20 32 32 tring((SELECT 22
9820: 32 2b 6d 61 78 28 72 6f 77 69 64 29 20 46 52 4f 2+max(rowid) FRO
9830: 4d 20 7a 7a 29 29 20 46 52 4f 4d 20 7a 7a 3b 0a M zz)) FROM zz;.
9840: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 INSERT INTO
9850: 7a 7a 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 zz SELECT a_stri
9860: 6e 67 28 28 53 45 4c 45 43 54 20 32 32 32 2b 6d ng((SELECT 222+m
9870: 61 78 28 72 6f 77 69 64 29 20 46 52 4f 4d 20 7a ax(rowid) FROM z
9880: 7a 29 29 20 46 52 4f 4d 20 7a 7a 3b 0a 20 20 20 z)) FROM zz;.
9890: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a 7a 20 INSERT INTO zz
98a0: 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 SELECT a_string(
98b0: 28 53 45 4c 45 43 54 20 32 32 32 2b 6d 61 78 28 (SELECT 222+max(
98c0: 72 6f 77 69 64 29 20 46 52 4f 4d 20 7a 7a 29 29 rowid) FROM zz))
98d0: 20 46 52 4f 4d 20 7a 7a 3b 0a 20 20 43 4f 4d 4d FROM zz;. COMM
98e0: 49 54 3b 0a 20 20 42 45 47 49 4e 3b 0a 20 20 20 IT;. BEGIN;.
98f0: 20 55 50 44 41 54 45 20 7a 7a 20 53 45 54 20 74 UPDATE zz SET t
9900: 6f 70 20 3d 20 61 5f 73 74 72 69 6e 67 28 33 34 op = a_string(34
9910: 35 29 3b 0a 7d 20 7b 7d 0a 0a 70 72 6f 63 20 6c 5);.} {}..proc l
9920: 6f 63 6b 6f 75 74 20 7b 6d 65 74 68 6f 64 20 61 ockout {method a
9930: 72 67 73 7d 20 7b 20 72 65 74 75 72 6e 20 53 51 rgs} { return SQ
9940: 4c 49 54 45 5f 49 4f 45 52 52 20 7d 0a 74 76 20 LITE_IOERR }.tv
9950: 73 63 72 69 70 74 20 6c 6f 63 6b 6f 75 74 0a 74 script lockout.t
9960: 76 20 66 69 6c 74 65 72 20 7b 78 57 72 69 74 65 v filter {xWrite
9970: 20 78 54 72 75 6e 63 61 74 65 20 78 53 79 6e 63 xTruncate xSync
9980: 7d 0a 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74 65 }.do_catchsql_te
9990: 73 74 20 70 61 67 65 72 31 2d 31 31 2e 32 20 7b st pager1-11.2 {
99a0: 20 43 4f 4d 4d 49 54 20 7d 20 7b 31 20 7b 64 69 COMMIT } {1 {di
99b0: 73 6b 20 49 2f 4f 20 65 72 72 6f 72 7d 7d 0a 0a sk I/O error}}..
99c0: 74 76 20 73 63 72 69 70 74 20 7b 7d 0a 64 6f 5f tv script {}.do_
99d0: 74 65 73 74 20 70 61 67 65 72 31 2d 31 31 2e 33 test pager1-11.3
99e0: 20 7b 0a 20 20 73 71 6c 69 74 65 33 20 64 62 32 {. sqlite3 db2
99f0: 20 74 65 73 74 2e 64 62 0a 20 20 65 78 65 63 73 test.db. execs
9a00: 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 ql {. PRAGMA
9a10: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 54 journal_mode = T
9a20: 52 55 4e 43 41 54 45 3b 0a 20 20 20 20 50 52 41 RUNCATE;. PRA
9a30: 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 GMA integrity_ch
9a40: 65 63 6b 3b 0a 20 20 7d 20 64 62 32 0a 7d 20 7b eck;. } db2.} {
9a50: 74 72 75 6e 63 61 74 65 20 6f 6b 7d 0a 64 6f 5f truncate ok}.do_
9a60: 74 65 73 74 20 70 61 67 65 72 31 2d 31 31 2e 34 test pager1-11.4
9a70: 20 7b 0a 20 20 64 62 32 20 63 6c 6f 73 65 0a 20 {. db2 close.
9a80: 20 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e file size test.
9a90: 64 62 2d 6a 6f 75 72 6e 61 6c 0a 7d 20 7b 30 7d db-journal.} {0}
9aa0: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 .do_execsql_test
9ab0: 20 70 61 67 65 72 31 2d 31 31 2e 35 20 7b 20 53 pager1-11.5 { S
9ac0: 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 ELECT count(*) F
9ad0: 52 4f 4d 20 7a 7a 20 7d 20 7b 33 32 7d 0a 64 62 ROM zz } {32}.db
9ae0: 20 63 6c 6f 73 65 0a 74 76 20 64 65 6c 65 74 65 close.tv delete
9af0: 0a 20 20 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . .#-----------
9b00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9b10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 --------------.#
9b40: 20 54 65 73 74 20 22 50 52 41 47 4d 41 20 70 61 Test "PRAGMA pa
9b50: 67 65 5f 73 69 7a 65 22 0a 23 0a 66 6f 72 65 61 ge_size".#.forea
9b60: 63 68 20 70 61 67 65 73 69 7a 65 20 7b 0a 20 20 ch pagesize {.
9b70: 20 20 35 31 32 20 20 20 31 30 32 34 20 20 20 32 512 1024 2
9b80: 30 34 38 20 34 30 39 36 20 38 31 39 32 20 31 36 048 4096 8192 16
9b90: 33 38 34 20 33 32 37 36 38 20 0a 7d 20 7b 0a 20 384 32768 .} {.
9ba0: 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 faultsim_delete
9bb0: 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 0a 20 20 64 _and_reopen.. d
9bc0: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 32 o_test pager1-12
9bd0: 2e 24 70 61 67 65 73 69 7a 65 2e 31 20 7b 0a 20 .$pagesize.1 {.
9be0: 20 20 20 73 71 6c 69 74 65 33 20 64 62 32 20 74 sqlite3 db2 t
9bf0: 65 73 74 2e 64 62 0a 20 20 20 20 65 78 65 63 73 est.db. execs
9c00: 71 6c 20 22 0a 20 20 20 20 20 20 50 52 41 47 4d ql ". PRAGM
9c10: 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20 24 70 A page_size = $p
9c20: 61 67 65 73 69 7a 65 3b 0a 20 20 20 20 20 20 43 agesize;. C
9c30: 52 45 41 54 45 20 56 49 45 57 20 76 20 41 53 20 REATE VIEW v AS
9c40: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 71 SELECT * FROM sq
9c50: 6c 69 74 65 5f 6d 61 73 74 65 72 3b 0a 20 20 20 lite_master;.
9c60: 20 22 20 64 62 32 0a 20 20 20 20 66 69 6c 65 20 " db2. file
9c70: 73 69 7a 65 20 74 65 73 74 2e 64 62 0a 20 20 7d size test.db. }
9c80: 20 24 70 61 67 65 73 69 7a 65 0a 20 20 64 6f 5f $pagesize. do_
9c90: 74 65 73 74 20 70 61 67 65 72 31 2d 31 32 2e 24 test pager1-12.$
9ca0: 70 61 67 65 73 69 7a 65 2e 32 20 7b 0a 20 20 20 pagesize.2 {.
9cb0: 20 73 71 6c 69 74 65 33 20 64 62 32 20 74 65 73 sqlite3 db2 tes
9cc0: 74 2e 64 62 0a 20 20 20 20 65 78 65 63 73 71 6c t.db. execsql
9cd0: 20 7b 20 0a 20 20 20 20 20 20 53 45 4c 45 43 54 { . SELECT
9ce0: 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 76 count(*) FROM v
9cf0: 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 6d ;. PRAGMA m
9d00: 61 69 6e 2e 70 61 67 65 5f 73 69 7a 65 3b 0a 20 ain.page_size;.
9d10: 20 20 20 7d 20 64 62 32 0a 20 20 7d 20 5b 6c 69 } db2. } [li
9d20: 73 74 20 31 20 24 70 61 67 65 73 69 7a 65 5d 0a st 1 $pagesize].
9d30: 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 do_test pager1
9d40: 2d 31 32 2e 24 70 61 67 65 73 69 7a 65 2e 33 20 -12.$pagesize.3
9d50: 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 {. execsql {
9d60: 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 63 6f . SELECT co
9d70: 75 6e 74 28 2a 29 20 46 52 4f 4d 20 76 3b 0a 20 unt(*) FROM v;.
9d80: 20 20 20 20 20 50 52 41 47 4d 41 20 6d 61 69 6e PRAGMA main
9d90: 2e 70 61 67 65 5f 73 69 7a 65 3b 0a 20 20 20 20 .page_size;.
9da0: 7d 0a 20 20 7d 20 5b 6c 69 73 74 20 31 20 24 70 }. } [list 1 $p
9db0: 61 67 65 73 69 7a 65 5d 0a 20 20 64 62 32 20 63 agesize]. db2 c
9dc0: 6c 6f 73 65 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d lose.}..#-------
9dd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9de0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9df0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9e10: 2d 2d 0a 23 20 54 65 73 74 20 73 70 65 63 61 6c --.# Test specal
9e20: 20 22 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c "PRAGMA journal
9e30: 5f 6d 6f 64 65 3d 50 45 52 53 49 53 54 22 20 74 _mode=PERSIST" t
9e40: 65 73 74 20 63 61 73 65 73 2e 0a 23 0a 23 20 70 est cases..#.# p
9e50: 61 67 65 72 31 2d 31 33 2e 31 2e 2a 3a 20 54 68 ager1-13.1.*: Th
9e60: 69 73 20 74 65 73 74 73 20 61 20 73 70 65 63 69 is tests a speci
9e70: 61 6c 20 63 61 73 65 20 65 6e 63 6f 75 6e 74 65 al case encounte
9e80: 72 65 64 20 69 6e 20 70 65 72 73 69 73 74 65 6e red in persisten
9e90: 74 20 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 t .#
9ea0: 20 20 20 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 journal mode
9eb0: 3a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c : If the journal
9ec0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 associated with
9ed0: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 23 a transaction.#
9ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
9ef0: 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 is smaller than
9f00: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 the journal file
9f10: 20 28 62 65 63 61 75 73 65 20 61 20 70 72 65 76 (because a prev
9f20: 69 6f 75 73 20 0a 23 20 20 20 20 20 20 20 20 20 ious .#
9f30: 20 20 20 20 20 20 20 74 72 61 6e 73 61 63 74 69 transacti
9f40: 6f 6e 20 6c 65 66 74 20 61 20 76 65 72 79 20 6c on left a very l
9f50: 61 72 67 65 20 6e 6f 6e 2d 68 6f 74 20 6a 6f 75 arge non-hot jou
9f60: 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 74 68 65 rnal file in the
9f70: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .#
9f80: 20 20 66 69 6c 65 2d 73 79 73 74 65 6d 29 2c 20 file-system),
9f90: 74 68 65 6e 20 53 51 4c 69 74 65 20 68 61 73 20 then SQLite has
9fa0: 74 6f 20 62 65 20 63 61 72 65 66 75 6c 20 74 68 to be careful th
9fb0: 61 74 20 74 68 65 72 65 20 69 73 0a 23 20 20 20 at there is.#
9fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 6f 74 not
9fd0: 20 61 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 a journal-heade
9fe0: 72 20 6c 65 66 74 20 6f 76 65 72 20 66 72 6f 6d r left over from
9ff0: 20 61 20 70 72 65 76 69 6f 75 73 20 74 72 61 6e a previous tran
a000: 73 61 63 74 69 6f 6e 0a 23 20 20 20 20 20 20 20 saction.#
a010: 20 20 20 20 20 20 20 20 20 69 6d 6d 65 64 69 61 immedia
a020: 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 tely following t
a030: 68 65 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74 65 he journal conte
a040: 6e 74 20 6a 75 73 74 20 77 72 69 74 74 65 6e 2e nt just written.
a050: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .#
a060: 20 20 49 66 20 74 68 65 72 65 20 69 73 2c 20 61 If there is, a
a070: 6e 64 20 74 68 65 20 70 72 6f 63 65 73 73 20 63 nd the process c
a080: 72 61 73 68 65 73 20 73 6f 20 74 68 61 74 20 74 rashes so that t
a090: 68 65 20 6a 6f 75 72 6e 61 6c 0a 23 20 20 20 20 he journal.#
a0a0: 20 20 20 20 20 20 20 20 20 20 20 20 62 65 63 6f beco
a0b0: 6d 65 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 mes a hot-journa
a0c0: 6c 20 61 6e 64 20 6d 75 73 74 20 62 65 20 72 6f l and must be ro
a0d0: 6c 6c 65 64 20 62 61 63 6b 20 62 79 20 61 6e 6f lled back by ano
a0e0: 74 68 65 72 0a 23 20 20 20 20 20 20 20 20 20 20 ther.#
a0f0: 20 20 20 20 20 20 70 72 6f 63 65 73 73 2c 20 74 process, t
a100: 68 65 72 65 20 69 73 20 61 20 64 61 6e 67 65 72 here is a danger
a110: 20 74 68 61 74 20 74 68 65 20 6f 74 68 65 72 20 that the other
a120: 70 72 6f 63 65 73 73 20 6d 61 79 20 72 6f 6c 6c process may roll
a130: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .#
a140: 20 20 62 61 63 6b 20 74 68 65 20 61 62 6f 72 74 back the abort
a150: 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 ed transaction,
a160: 74 68 65 6e 20 63 6f 6e 74 69 6e 75 65 20 63 6f then continue co
a170: 70 79 69 6e 67 20 64 61 74 61 0a 23 20 20 20 20 pying data.#
a180: 20 20 20 20 20 20 20 20 20 20 20 20 66 72 6f 6d from
a190: 20 61 6e 20 6f 6c 64 65 72 20 74 72 61 6e 73 61 an older transa
a1a0: 63 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 72 ction from the r
a1b0: 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 65 20 emainder of the
a1c0: 6a 6f 75 72 6e 61 6c 2e 0a 23 20 20 20 20 20 20 journal..#
a1d0: 20 20 20 20 20 20 20 20 20 20 53 65 65 20 74 68 See th
a1e0: 65 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 29 20 e syncJournal()
a1f0: 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 64 65 74 function for det
a200: 61 69 6c 73 2e 0a 23 0a 23 20 70 61 67 65 72 31 ails..#.# pager1
a210: 2d 31 33 2e 32 2e 2a 3a 20 53 61 6d 65 20 74 65 -13.2.*: Same te
a220: 73 74 20 61 73 20 74 68 65 20 70 72 65 76 69 6f st as the previo
a230: 75 73 2e 20 54 68 69 73 20 74 69 6d 65 2c 20 74 us. This time, t
a240: 68 72 6f 77 20 61 6e 20 69 6e 64 65 78 20 69 6e hrow an index in
a250: 74 6f 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 to.#
a260: 20 20 20 20 74 68 65 20 6d 69 78 20 74 6f 20 6d the mix to m
a270: 61 6b 65 20 74 68 65 20 69 6e 74 65 67 72 69 74 ake the integrit
a280: 79 2d 63 68 65 63 6b 20 6d 6f 72 65 20 6c 69 6b y-check more lik
a290: 65 6c 79 20 74 6f 20 63 61 74 63 68 0a 23 20 20 ely to catch.#
a2a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 72 er
a2b0: 72 6f 72 73 2e 0a 23 0a 74 65 73 74 76 66 73 20 rors..#.testvfs
a2c0: 74 76 20 2d 64 65 66 61 75 6c 74 20 31 0a 74 76 tv -default 1.tv
a2d0: 20 73 63 72 69 70 74 20 78 53 79 6e 63 43 62 0a script xSyncCb.
a2e0: 74 76 20 66 69 6c 74 65 72 20 78 53 79 6e 63 0a tv filter xSync.
a2f0: 70 72 6f 63 20 78 53 79 6e 63 43 62 20 7b 6d 65 proc xSyncCb {me
a300: 74 68 6f 64 20 66 69 6c 65 6e 61 6d 65 20 61 72 thod filename ar
a310: 67 73 7d 20 7b 0a 20 20 73 65 74 20 74 20 5b 66 gs} {. set t [f
a320: 69 6c 65 20 74 61 69 6c 20 24 66 69 6c 65 6e 61 ile tail $filena
a330: 6d 65 5d 0a 20 20 69 66 20 7b 24 74 20 3d 3d 20 me]. if {$t ==
a340: 22 74 65 73 74 2e 64 62 22 7d 20 66 61 75 6c 74 "test.db"} fault
a350: 73 69 6d 5f 73 61 76 65 0a 20 20 72 65 74 75 72 sim_save. retur
a360: 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 7d 0a 66 61 n SQLITE_OK.}.fa
a370: 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e ultsim_delete_an
a380: 64 5f 72 65 6f 70 65 6e 0a 64 62 20 66 75 6e 63 d_reopen.db func
a390: 20 61 5f 73 74 72 69 6e 67 20 61 5f 73 74 72 69 a_string a_stri
a3a0: 6e 67 0a 0a 23 20 54 68 65 20 55 50 44 41 54 45 ng..# The UPDATE
a3b0: 20 73 74 61 74 65 6d 65 6e 74 20 61 74 20 74 68 statement at th
a3c0: 65 20 65 6e 64 20 6f 66 20 74 68 69 73 20 74 65 e end of this te
a3d0: 73 74 20 63 61 73 65 20 63 72 65 61 74 65 73 20 st case creates
a3e0: 61 20 72 65 61 6c 6c 79 20 62 69 67 0a 23 20 6a a really big.# j
a3f0: 6f 75 72 6e 61 6c 2e 20 53 69 6e 63 65 20 74 68 ournal. Since th
a400: 65 20 63 61 63 68 65 2d 73 69 7a 65 20 69 73 20 e cache-size is
a410: 6f 6e 6c 79 20 31 30 20 70 61 67 65 73 2c 20 74 only 10 pages, t
a420: 68 65 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74 61 he journal conta
a430: 69 6e 73 20 0a 23 20 66 72 65 71 75 65 6e 74 20 ins .# frequent
a440: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 73 2e journal headers.
a450: 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 .#.do_execsql_te
a460: 73 74 20 70 61 67 65 72 31 2d 31 33 2e 31 2e 31 st pager1-13.1.1
a470: 20 7b 0a 20 20 50 52 41 47 4d 41 20 70 61 67 65 {. PRAGMA page
a480: 5f 73 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20 _size = 1024;.
a490: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d PRAGMA journal_m
a4a0: 6f 64 65 20 3d 20 50 45 52 53 49 53 54 3b 0a 20 ode = PERSIST;.
a4b0: 20 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69 PRAGMA cache_si
a4c0: 7a 65 20 3d 20 31 30 3b 0a 20 20 42 45 47 49 4e ze = 10;. BEGIN
a4d0: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 ;. CREATE TAB
a4e0: 4c 45 20 74 31 28 61 20 49 4e 54 45 47 45 52 20 LE t1(a INTEGER
a4f0: 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 20 42 PRIMARY KEY, b B
a500: 4c 4f 42 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 LOB);. INSERT
a510: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 INTO t1 VALUES(
a520: 4e 55 4c 4c 2c 20 61 5f 73 74 72 69 6e 67 28 34 NULL, a_string(4
a530: 30 30 29 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 00));. INSERT
a540: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 INTO t1 SELECT
a550: 4e 55 4c 4c 2c 20 61 5f 73 74 72 69 6e 67 28 34 NULL, a_string(4
a560: 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 00) FROM t1;
a570: 20 20 20 20 20 20 2f 2a 20 20 20 32 20 2a 2f 0a /* 2 */.
a580: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 INSERT INTO
a590: 74 31 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 t1 SELECT NULL,
a5a0: 61 5f 73 74 72 69 6e 67 28 34 30 30 29 20 46 52 a_string(400) FR
a5b0: 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 20 20 20 OM t1;
a5c0: 2f 2a 20 20 20 34 20 2a 2f 0a 20 20 20 20 49 4e /* 4 */. IN
a5d0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c SERT INTO t1 SEL
a5e0: 45 43 54 20 4e 55 4c 4c 2c 20 61 5f 73 74 72 69 ECT NULL, a_stri
a5f0: 6e 67 28 34 30 30 29 20 46 52 4f 4d 20 74 31 3b ng(400) FROM t1;
a600: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20 38 /* 8
a610: 20 2a 2f 0a 20 20 20 20 49 4e 53 45 52 54 20 49 */. INSERT I
a620: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 4e 55 NTO t1 SELECT NU
a630: 4c 4c 2c 20 61 5f 73 74 72 69 6e 67 28 34 30 30 LL, a_string(400
a640: 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 ) FROM t1;
a650: 20 20 20 20 2f 2a 20 20 31 36 20 2a 2f 0a 20 20 /* 16 */.
a660: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 INSERT INTO t1
a670: 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 61 5f SELECT NULL, a_
a680: 73 74 72 69 6e 67 28 34 30 30 29 20 46 52 4f 4d string(400) FROM
a690: 20 74 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a t1; /*
a6a0: 20 20 33 32 20 2a 2f 0a 20 20 20 20 49 4e 53 45 32 */. INSE
a6b0: 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 RT INTO t1 SELEC
a6c0: 54 20 4e 55 4c 4c 2c 20 61 5f 73 74 72 69 6e 67 T NULL, a_string
a6d0: 28 34 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 (400) FROM t1;
a6e0: 20 20 20 20 20 20 20 20 2f 2a 20 20 36 34 20 2a /* 64 *
a6f0: 2f 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 /. INSERT INT
a700: 4f 20 74 31 20 53 45 4c 45 43 54 20 4e 55 4c 4c O t1 SELECT NULL
a710: 2c 20 61 5f 73 74 72 69 6e 67 28 34 30 30 29 20 , a_string(400)
a720: 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 20 FROM t1;
a730: 20 20 2f 2a 20 31 32 38 20 2a 2f 0a 20 20 43 4f /* 128 */. CO
a740: 4d 4d 49 54 3b 0a 20 20 55 50 44 41 54 45 20 74 MMIT;. UPDATE t
a750: 31 20 53 45 54 20 62 20 3d 20 61 5f 73 74 72 69 1 SET b = a_stri
a760: 6e 67 28 34 30 30 29 3b 0a 7d 20 7b 70 65 72 73 ng(400);.} {pers
a770: 69 73 74 7d 0a 0a 23 20 52 75 6e 20 74 72 61 6e ist}..# Run tran
a780: 73 61 63 74 69 6f 6e 73 20 6f 66 20 69 6e 63 72 sactions of incr
a790: 65 61 73 69 6e 67 20 73 69 7a 65 73 2e 20 45 76 easing sizes. Ev
a7a0: 65 6e 74 75 61 6c 6c 79 2c 20 6f 6e 65 20 28 6f entually, one (o
a7b0: 72 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 29 r more than one)
a7c0: 0a 23 20 6f 66 20 74 68 65 73 65 20 77 69 6c 6c .# of these will
a7d0: 20 77 72 69 74 65 20 6a 75 73 74 20 65 6e 6f 75 write just enou
a7e0: 67 68 20 63 6f 6e 74 65 6e 74 20 74 68 61 74 20 gh content that
a7f0: 6f 6e 65 20 6f 66 20 74 68 65 20 6f 6c 64 20 68 one of the old h
a800: 65 61 64 65 72 73 20 63 72 65 61 74 65 64 20 0a eaders created .
a810: 23 20 62 79 20 74 68 65 20 74 72 61 6e 73 61 63 # by the transac
a820: 74 69 6f 6e 20 69 6e 20 74 68 65 20 62 6c 6f 63 tion in the bloc
a830: 6b 20 61 62 6f 76 65 20 6c 69 65 73 20 69 6d 6d k above lies imm
a840: 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 74 ediately after t
a850: 68 65 20 63 6f 6e 74 65 6e 74 0a 23 20 6a 6f 75 he content.# jou
a860: 72 6e 61 6c 6c 65 64 20 62 79 20 74 68 65 20 63 rnalled by the c
a870: 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 urrent transacti
a880: 6f 6e 2e 0a 23 0a 66 6f 72 20 7b 73 65 74 20 6e on..#.for {set n
a890: 55 70 20 31 7d 20 7b 24 6e 55 70 3c 36 34 7d 20 Up 1} {$nUp<64}
a8a0: 7b 69 6e 63 72 20 6e 55 70 7d 20 7b 0a 20 20 64 {incr nUp} {. d
a8b0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 o_execsql_test p
a8c0: 61 67 65 72 31 2d 31 33 2e 31 2e 32 2e 24 6e 55 ager1-13.1.2.$nU
a8d0: 70 2e 31 20 7b 20 0a 20 20 20 20 55 50 44 41 54 p.1 { . UPDAT
a8e0: 45 20 74 31 20 53 45 54 20 62 20 3d 20 61 5f 73 E t1 SET b = a_s
a8f0: 74 72 69 6e 67 28 33 39 39 29 20 57 48 45 52 45 tring(399) WHERE
a900: 20 61 20 3c 3d 20 24 6e 55 70 0a 20 20 7d 20 7b a <= $nUp. } {
a910: 7d 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 }. do_execsql_t
a920: 65 73 74 20 70 61 67 65 72 31 2d 31 33 2e 31 2e est pager1-13.1.
a930: 32 2e 24 6e 55 70 2e 32 20 7b 20 50 52 41 47 4d 2.$nUp.2 { PRAGM
a940: 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 A integrity_chec
a950: 6b 20 7d 20 7b 6f 6b 7d 20 0a 0a 20 20 23 20 54 k } {ok} .. # T
a960: 72 79 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 ry to access the
a970: 20 73 6e 61 70 73 68 6f 74 20 6f 66 20 74 68 65 snapshot of the
a980: 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e 0a 20 20 file-system..
a990: 23 0a 20 20 73 71 6c 69 74 65 33 20 64 62 32 20 #. sqlite3 db2
a9a0: 73 76 5f 74 65 73 74 2e 64 62 0a 20 20 64 6f 5f sv_test.db. do_
a9b0: 74 65 73 74 20 70 61 67 65 72 31 2d 31 33 2e 31 test pager1-13.1
a9c0: 2e 32 2e 24 6e 55 70 2e 33 20 7b 0a 20 20 20 20 .2.$nUp.3 {.
a9d0: 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 execsql { SELECT
a9e0: 20 73 75 6d 28 6c 65 6e 67 74 68 28 62 29 29 20 sum(length(b))
a9f0: 46 52 4f 4d 20 74 31 20 7d 20 64 62 32 0a 20 20 FROM t1 } db2.
aa00: 7d 20 5b 65 78 70 72 20 7b 31 32 38 2a 34 30 30 } [expr {128*400
aa10: 20 2d 20 28 24 6e 55 70 2d 31 29 7d 5d 0a 20 20 - ($nUp-1)}].
aa20: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 do_test pager1-1
aa30: 33 2e 31 2e 32 2e 24 6e 55 70 2e 34 20 7b 0a 20 3.1.2.$nUp.4 {.
aa40: 20 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41 execsql { PRA
aa50: 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 GMA integrity_ch
aa60: 65 63 6b 20 7d 20 64 62 32 0a 20 20 7d 20 7b 6f eck } db2. } {o
aa70: 6b 7d 0a 20 20 64 62 32 20 63 6c 6f 73 65 0a 7d k}. db2 close.}
aa80: 0a 0a 23 20 53 61 6d 65 20 74 65 73 74 20 61 73 ..# Same test as
aa90: 20 61 62 6f 76 65 2e 20 42 75 74 20 74 68 69 73 above. But this
aaa0: 20 74 69 6d 65 20 77 69 74 68 20 61 6e 20 69 6e time with an in
aab0: 64 65 78 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 dex on the table
aac0: 2e 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 ..#.do_execsql_t
aad0: 65 73 74 20 70 61 67 65 72 31 2d 31 33 2e 32 2e est pager1-13.2.
aae0: 31 20 7b 0a 20 20 43 52 45 41 54 45 20 49 4e 44 1 {. CREATE IND
aaf0: 45 58 20 69 31 20 4f 4e 20 74 31 28 62 29 3b 0a EX i1 ON t1(b);.
ab00: 20 20 55 50 44 41 54 45 20 74 31 20 53 45 54 20 UPDATE t1 SET
ab10: 62 20 3d 20 61 5f 73 74 72 69 6e 67 28 34 30 30 b = a_string(400
ab20: 29 3b 0a 7d 20 7b 7d 0a 66 6f 72 20 7b 73 65 74 );.} {}.for {set
ab30: 20 6e 55 70 20 31 7d 20 7b 24 6e 55 70 3c 36 34 nUp 1} {$nUp<64
ab40: 7d 20 7b 69 6e 63 72 20 6e 55 70 7d 20 7b 0a 20 } {incr nUp} {.
ab50: 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 do_execsql_test
ab60: 20 70 61 67 65 72 31 2d 31 33 2e 32 2e 32 2e 24 pager1-13.2.2.$
ab70: 6e 55 70 2e 31 20 7b 20 0a 20 20 20 20 55 50 44 nUp.1 { . UPD
ab80: 41 54 45 20 74 31 20 53 45 54 20 62 20 3d 20 61 ATE t1 SET b = a
ab90: 5f 73 74 72 69 6e 67 28 33 39 39 29 20 57 48 45 _string(399) WHE
aba0: 52 45 20 61 20 3c 3d 20 24 6e 55 70 0a 20 20 7d RE a <= $nUp. }
abb0: 20 7b 7d 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c {}. do_execsql
abc0: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 33 2e _test pager1-13.
abd0: 32 2e 32 2e 24 6e 55 70 2e 32 20 7b 20 50 52 41 2.2.$nUp.2 { PRA
abe0: 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 GMA integrity_ch
abf0: 65 63 6b 20 7d 20 7b 6f 6b 7d 20 0a 20 20 73 71 eck } {ok} . sq
ac00: 6c 69 74 65 33 20 64 62 32 20 73 76 5f 74 65 73 lite3 db2 sv_tes
ac10: 74 2e 64 62 0a 20 20 64 6f 5f 74 65 73 74 20 70 t.db. do_test p
ac20: 61 67 65 72 31 2d 31 33 2e 32 2e 32 2e 24 6e 55 ager1-13.2.2.$nU
ac30: 70 2e 33 20 7b 0a 20 20 20 20 65 78 65 63 73 71 p.3 {. execsq
ac40: 6c 20 7b 20 53 45 4c 45 43 54 20 73 75 6d 28 6c l { SELECT sum(l
ac50: 65 6e 67 74 68 28 62 29 29 20 46 52 4f 4d 20 74 ength(b)) FROM t
ac60: 31 20 7d 20 64 62 32 0a 20 20 7d 20 5b 65 78 70 1 } db2. } [exp
ac70: 72 20 7b 31 32 38 2a 34 30 30 20 2d 20 28 24 6e r {128*400 - ($n
ac80: 55 70 2d 31 29 7d 5d 0a 20 20 64 6f 5f 74 65 73 Up-1)}]. do_tes
ac90: 74 20 70 61 67 65 72 31 2d 31 33 2e 32 2e 32 2e t pager1-13.2.2.
aca0: 24 6e 55 70 2e 34 20 7b 0a 20 20 20 20 65 78 65 $nUp.4 {. exe
acb0: 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 69 6e csql { PRAGMA in
acc0: 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 7d 20 tegrity_check }
acd0: 64 62 32 0a 20 20 7d 20 7b 6f 6b 7d 0a 20 20 64 db2. } {ok}. d
ace0: 62 32 20 63 6c 6f 73 65 0a 7d 0a 0a 64 62 20 63 b2 close.}..db c
acf0: 6c 6f 73 65 0a 74 76 20 64 65 6c 65 74 65 0a 0a lose.tv delete..
ad00: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d #---------------
ad10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ad20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ad30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ad40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 ----------.# Tes
ad50: 74 20 73 70 65 63 61 6c 20 22 50 52 41 47 4d 41 t specal "PRAGMA
ad60: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 4f 46 journal_mode=OF
ad70: 46 22 20 74 65 73 74 20 63 61 73 65 73 2e 0a 23 F" test cases..#
ad80: 0a 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 .faultsim_delete
ad90: 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 64 6f 5f 65 _and_reopen.do_e
ada0: 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 xecsql_test page
adb0: 72 31 2d 31 34 2e 31 2e 31 20 7b 0a 20 20 50 52 r1-14.1.1 {. PR
adc0: 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 AGMA journal_mod
add0: 65 20 3d 20 4f 46 46 3b 0a 20 20 43 52 45 41 54 e = OFF;. CREAT
ade0: 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 E TABLE t1(a, b)
adf0: 3b 0a 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 49 ;. BEGIN;. I
ae00: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 NSERT INTO t1 VA
ae10: 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20 20 43 4f LUES(1, 2);. CO
ae20: 4d 4d 49 54 3b 0a 20 20 53 45 4c 45 43 54 20 2a MMIT;. SELECT *
ae30: 20 46 52 4f 4d 20 74 31 3b 0a 7d 20 7b 6f 66 66 FROM t1;.} {off
ae40: 20 31 20 32 7d 0a 64 6f 5f 63 61 74 63 68 73 71 1 2}.do_catchsq
ae50: 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 34 l_test pager1-14
ae60: 2e 31 2e 32 20 7b 0a 20 20 42 45 47 49 4e 3b 0a .1.2 {. BEGIN;.
ae70: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 INSERT INTO
ae80: 74 31 20 56 41 4c 55 45 53 28 33 2c 20 34 29 3b t1 VALUES(3, 4);
ae90: 0a 20 20 52 4f 4c 4c 42 41 43 4b 3b 0a 7d 20 7b . ROLLBACK;.} {
aea0: 30 20 7b 7d 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 0 {}}.do_execsql
aeb0: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 34 2e _test pager1-14.
aec0: 31 2e 33 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a 1.3 {. SELECT *
aed0: 20 46 52 4f 4d 20 74 31 3b 0a 7d 20 7b 31 20 32 FROM t1;.} {1 2
aee0: 20 33 20 34 7d 0a 64 6f 5f 63 61 74 63 68 73 71 3 4}.do_catchsq
aef0: 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 34 l_test pager1-14
af00: 2e 31 2e 34 20 7b 0a 20 20 42 45 47 49 4e 3b 0a .1.4 {. BEGIN;.
af10: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 INSERT INTO
af20: 74 31 28 72 6f 77 69 64 2c 20 61 2c 20 62 29 20 t1(rowid, a, b)
af30: 53 45 4c 45 43 54 20 61 2b 33 2c 20 62 2c 20 62 SELECT a+3, b, b
af40: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e FROM t1;. IN
af50: 53 45 52 54 20 49 4e 54 4f 20 74 31 28 72 6f 77 SERT INTO t1(row
af60: 69 64 2c 20 61 2c 20 62 29 20 53 45 4c 45 43 54 id, a, b) SELECT
af70: 20 61 2b 33 2c 20 62 2c 20 62 20 46 52 4f 4d 20 a+3, b, b FROM
af80: 74 31 3b 0a 7d 20 7b 31 20 7b 50 52 49 4d 41 52 t1;.} {1 {PRIMAR
af90: 59 20 4b 45 59 20 6d 75 73 74 20 62 65 20 75 6e Y KEY must be un
afa0: 69 71 75 65 7d 7d 0a 64 6f 5f 65 78 65 63 73 71 ique}}.do_execsq
afb0: 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 34 l_test pager1-14
afc0: 2e 31 2e 35 20 7b 0a 20 20 43 4f 4d 4d 49 54 3b .1.5 {. COMMIT;
afd0: 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d . SELECT * FROM
afe0: 20 74 31 3b 0a 7d 20 7b 31 20 32 20 33 20 34 20 t1;.} {1 2 3 4
aff0: 32 20 32 20 34 20 34 7d 0a 0a 23 2d 2d 2d 2d 2d 2 2 4 4}..#-----
b000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b040: 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 6f 70 65 6e ----.# Test open
b050: 69 6e 67 20 61 6e 64 20 63 6c 6f 73 69 6e 67 20 ing and closing
b060: 74 68 65 20 70 61 67 65 72 20 73 75 62 2d 73 79 the pager sub-sy
b070: 73 74 65 6d 20 77 69 74 68 20 64 69 66 66 65 72 stem with differ
b080: 65 6e 74 20 76 61 6c 75 65 73 0a 23 20 66 6f 72 ent values.# for
b090: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 76 66 73 the sqlite3_vfs
b0a0: 2e 73 7a 4f 73 46 69 6c 65 20 76 61 72 69 61 62 .szOsFile variab
b0b0: 6c 65 2e 0a 23 0a 66 61 75 6c 74 73 69 6d 5f 64 le..#.faultsim_d
b0c0: 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e elete_and_reopen
b0d0: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 .do_execsql_test
b0e0: 20 70 61 67 65 72 31 2d 31 35 2e 30 20 7b 0a 20 pager1-15.0 {.
b0f0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 78 CREATE TABLE tx
b100: 28 79 2c 20 7a 29 3b 0a 20 20 49 4e 53 45 52 54 (y, z);. INSERT
b110: 20 49 4e 54 4f 20 74 78 20 56 41 4c 55 45 53 28 INTO tx VALUES(
b120: 27 41 79 75 74 74 68 61 79 61 27 2c 20 27 42 65 'Ayutthaya', 'Be
b130: 69 6a 69 6e 67 27 29 3b 0a 20 20 49 4e 53 45 52 ijing');. INSER
b140: 54 20 49 4e 54 4f 20 74 78 20 56 41 4c 55 45 53 T INTO tx VALUES
b150: 28 27 4c 6f 6e 64 6f 6e 27 2c 20 27 54 6f 6b 79 ('London', 'Toky
b160: 6f 27 29 3b 0a 7d 20 7b 7d 0a 64 62 20 63 6c 6f o');.} {}.db clo
b170: 73 65 0a 66 6f 72 20 7b 73 65 74 20 69 20 30 7d se.for {set i 0}
b180: 20 7b 24 69 3c 35 31 33 7d 20 7b 69 6e 63 72 20 {$i<513} {incr
b190: 69 20 33 7d 20 7b 0a 20 20 74 65 73 74 76 66 73 i 3} {. testvfs
b1a0: 20 74 76 20 2d 64 65 66 61 75 6c 74 20 31 20 2d tv -default 1 -
b1b0: 73 7a 6f 73 66 69 6c 65 20 24 69 0a 20 20 73 71 szosfile $i. sq
b1c0: 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 lite3 db test.db
b1d0: 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 . do_execsql_te
b1e0: 73 74 20 70 61 67 65 72 31 2d 31 35 2e 24 69 2e st pager1-15.$i.
b1f0: 31 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 1 {. SELECT *
b200: 20 46 52 4f 4d 20 74 78 3b 0a 20 20 7d 20 7b 41 FROM tx;. } {A
b210: 79 75 74 74 68 61 79 61 20 42 65 69 6a 69 6e 67 yutthaya Beijing
b220: 20 4c 6f 6e 64 6f 6e 20 54 6f 6b 79 6f 7d 0a 20 London Tokyo}.
b230: 20 64 62 20 63 6c 6f 73 65 0a 20 20 74 76 20 64 db close. tv d
b240: 65 6c 65 74 65 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d elete.}..#------
b250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b290: 2d 2d 2d 0a 23 20 43 68 65 63 6b 20 74 68 61 74 ---.# Check that
b2a0: 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 it is not possi
b2b0: 62 6c 65 20 74 6f 20 6f 70 65 6e 20 61 20 64 61 ble to open a da
b2c0: 74 61 62 61 73 65 20 66 69 6c 65 20 69 66 20 74 tabase file if t
b2d0: 68 65 20 66 75 6c 6c 20 70 61 74 68 0a 23 20 74 he full path.# t
b2e0: 6f 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 o the associated
b2f0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69 journal file wi
b300: 6c 6c 20 62 65 20 6c 6f 6e 67 65 72 20 74 68 61 ll be longer tha
b310: 6e 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78 n sqlite3_vfs.mx
b320: 50 61 74 68 6e 61 6d 65 2e 0a 23 0a 74 65 73 74 Pathname..#.test
b330: 76 66 73 20 74 76 20 2d 64 65 66 61 75 6c 74 20 vfs tv -default
b340: 31 0a 74 76 20 73 63 72 69 70 74 20 78 4f 70 65 1.tv script xOpe
b350: 6e 43 62 0a 74 76 20 66 69 6c 74 65 72 20 78 4f nCb.tv filter xO
b360: 70 65 6e 0a 70 72 6f 63 20 78 4f 70 65 6e 43 62 pen.proc xOpenCb
b370: 20 7b 6d 65 74 68 6f 64 20 66 69 6c 65 6e 61 6d {method filenam
b380: 65 7d 20 7b 0a 20 20 73 65 74 20 3a 3a 66 69 6c e} {. set ::fil
b390: 65 5f 6c 65 6e 20 5b 73 74 72 69 6e 67 20 6c 65 e_len [string le
b3a0: 6e 67 74 68 20 24 66 69 6c 65 6e 61 6d 65 5d 0a ngth $filename].
b3b0: 7d 0a 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 }.sqlite3 db tes
b3c0: 74 2e 64 62 0a 64 62 20 63 6c 6f 73 65 0a 74 76 t.db.db close.tv
b3d0: 20 64 65 6c 65 74 65 0a 0a 66 6f 72 20 7b 73 65 delete..for {se
b3e0: 74 20 69 69 20 5b 65 78 70 72 20 24 3a 3a 66 69 t ii [expr $::fi
b3f0: 6c 65 5f 6c 65 6e 2d 35 5d 7d 20 7b 24 69 69 20 le_len-5]} {$ii
b400: 3c 20 5b 65 78 70 72 20 24 3a 3a 66 69 6c 65 5f < [expr $::file_
b410: 6c 65 6e 2b 32 30 5d 7d 20 7b 69 6e 63 72 20 69 len+20]} {incr i
b420: 69 7d 20 7b 0a 20 20 74 65 73 74 76 66 73 20 74 i} {. testvfs t
b430: 76 20 2d 64 65 66 61 75 6c 74 20 31 20 2d 6d 78 v -default 1 -mx
b440: 70 61 74 68 6e 61 6d 65 20 24 69 69 0a 0a 20 20 pathname $ii..
b450: 23 20 54 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 # The length of
b460: 74 68 65 20 66 75 6c 6c 20 70 61 74 68 20 74 6f the full path to
b470: 20 66 69 6c 65 20 22 74 65 73 74 2e 64 62 2d 6a file "test.db-j
b480: 6f 75 72 6e 61 6c 22 20 69 73 20 28 24 3a 3a 66 ournal" is ($::f
b490: 69 6c 65 5f 6c 65 6e 2b 38 29 2e 0a 20 20 23 20 ile_len+8).. #
b4a0: 49 66 20 74 68 65 20 63 6f 6e 66 69 67 75 72 65 If the configure
b4b0: 64 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78 d sqlite3_vfs.mx
b4c0: 50 61 74 68 6e 61 6d 65 20 76 61 6c 75 65 20 67 Pathname value g
b4d0: 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 reater than or e
b4e0: 71 75 61 6c 20 74 6f 0a 20 20 23 20 74 68 69 73 qual to. # this
b4f0: 2c 20 74 68 65 6e 20 74 68 65 20 66 69 6c 65 20 , then the file
b500: 63 61 6e 20 62 65 20 6f 70 65 6e 65 64 2e 20 4f can be opened. O
b510: 74 68 65 72 77 69 73 65 2c 20 69 74 20 63 61 6e therwise, it can
b520: 6e 6f 74 2e 0a 20 20 23 0a 20 20 69 66 20 7b 24 not.. #. if {$
b530: 69 69 20 3e 3d 20 5b 65 78 70 72 20 24 3a 3a 66 ii >= [expr $::f
b540: 69 6c 65 5f 6c 65 6e 2b 38 5d 7d 20 7b 0a 20 20 ile_len+8]} {.
b550: 20 20 73 65 74 20 72 65 73 20 7b 30 20 7b 7d 7d set res {0 {}}
b560: 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 . } else {.
b570: 73 65 74 20 72 65 73 20 7b 31 20 7b 75 6e 61 62 set res {1 {unab
b580: 6c 65 20 74 6f 20 6f 70 65 6e 20 64 61 74 61 62 le to open datab
b590: 61 73 65 20 66 69 6c 65 7d 7d 0a 20 20 7d 0a 0a ase file}}. }..
b5a0: 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 do_test pager1
b5b0: 2d 31 36 2e 31 2e 24 69 69 20 7b 0a 20 20 20 20 -16.1.$ii {.
b5c0: 6c 69 73 74 20 5b 63 61 74 63 68 20 7b 20 73 71 list [catch { sq
b5d0: 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 lite3 db test.db
b5e0: 20 7d 20 6d 73 67 5d 20 24 6d 73 67 0a 20 20 7d } msg] $msg. }
b5f0: 20 24 72 65 73 0a 0a 20 20 63 61 74 63 68 20 7b $res.. catch {
b600: 64 62 20 63 6c 6f 73 65 7d 0a 20 20 74 76 20 64 db close}. tv d
b610: 65 6c 65 74 65 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d elete.}..#------
b620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b660: 2d 2d 2d 0a 23 20 54 65 73 74 20 22 50 52 41 47 ---.# Test "PRAG
b670: 4d 41 20 6f 6d 69 74 5f 72 65 61 64 6c 6f 63 6b MA omit_readlock
b680: 22 2e 20 0a 23 0a 23 20 20 20 70 61 67 65 72 31 ". .#.# pager1
b690: 2d 31 37 2e 24 74 6e 2e 31 2e 2a 3a 20 54 65 73 -17.$tn.1.*: Tes
b6a0: 74 20 74 68 61 74 20 69 66 20 61 20 73 65 63 6f t that if a seco
b6b0: 6e 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 nd connection ha
b6c0: 73 20 61 6e 20 6f 70 65 6e 20 0a 23 20 20 20 20 s an open .#
b6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
b6e0: 20 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 read-transacti
b6f0: 6f 6e 2c 20 69 74 20 69 73 20 6e 6f 74 20 75 73 on, it is not us
b700: 75 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 20 74 ually possible t
b710: 6f 20 77 72 69 74 65 20 0a 23 20 20 20 20 20 20 o write .#
b720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
b730: 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 23 0a the database..#.
b740: 23 20 20 20 70 61 67 65 72 31 2d 31 37 2e 24 74 # pager1-17.$t
b750: 6e 2e 32 2e 2a 3a 20 54 65 73 74 20 74 68 61 74 n.2.*: Test that
b760: 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20 63 if the second c
b770: 6f 6e 6e 65 63 74 69 6f 6e 20 77 61 73 20 6f 70 onnection was op
b780: 65 6e 65 64 20 77 69 74 68 0a 23 20 20 20 20 20 ened with.#
b790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
b7a0: 20 74 68 65 20 53 51 4c 49 54 45 5f 4f 50 45 4e the SQLITE_OPEN
b7b0: 5f 52 45 41 44 4f 4e 4c 59 20 66 6c 61 67 2c 20 _READONLY flag,
b7c0: 61 6e 64 20 0a 23 20 20 20 20 20 20 20 20 20 20 and .#
b7d0: 20 20 20 20 20 20 20 20 20 20 20 20 22 50 52 41 "PRA
b7e0: 47 4d 41 20 6f 6d 69 74 5f 72 65 61 64 6c 6f 63 GMA omit_readloc
b7f0: 6b 20 3d 20 31 22 20 69 73 20 65 78 65 63 75 74 k = 1" is execut
b800: 65 64 20 62 65 66 6f 72 65 20 61 74 74 61 63 68 ed before attach
b810: 69 6e 67 0a 23 20 20 20 20 20 20 20 20 20 20 20 ing.#
b820: 20 20 20 20 20 20 20 20 20 20 20 74 68 65 20 64 the d
b830: 61 74 61 62 61 73 65 20 61 6e 64 20 6f 70 65 6e atabase and open
b840: 69 6e 67 20 61 20 72 65 61 64 2d 74 72 61 6e 73 ing a read-trans
b850: 61 63 74 69 6f 6e 20 6f 6e 20 69 74 2c 20 69 74 action on it, it
b860: 20 69 73 0a 23 20 20 20 20 20 20 20 20 20 20 20 is.#
b870: 20 20 20 20 20 20 20 20 20 20 20 70 6f 73 73 69 possi
b880: 62 6c 65 20 74 6f 20 77 72 69 74 65 20 74 68 65 ble to write the
b890: 20 64 62 2e 0a 23 0a 23 20 20 20 70 61 67 65 72 db..#.# pager
b8a0: 31 2d 31 37 2e 24 74 6e 2e 33 2e 2a 3a 20 54 65 1-17.$tn.3.*: Te
b8b0: 73 74 20 74 68 61 74 20 69 66 20 74 68 65 20 73 st that if the s
b8c0: 65 63 6f 6e 64 20 63 6f 6e 6e 65 63 74 69 6f 6e econd connection
b8d0: 20 77 61 73 20 2a 6e 6f 74 2a 20 6f 70 65 6e 65 was *not* opene
b8e0: 64 20 77 69 74 68 0a 23 20 20 20 20 20 20 20 20 d with.#
b8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68 th
b900: 65 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 e SQLITE_OPEN_RE
b910: 41 44 4f 4e 4c 59 20 66 6c 61 67 2c 20 65 78 65 ADONLY flag, exe
b920: 63 75 74 69 6e 67 20 0a 23 20 20 20 20 20 20 20 cuting .#
b930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 "
b940: 50 52 41 47 4d 41 20 6f 6d 69 74 5f 72 65 61 64 PRAGMA omit_read
b950: 6c 6f 63 6b 20 3d 20 31 22 20 68 61 73 20 6e 6f lock = 1" has no
b960: 20 65 66 66 65 63 74 2e 0a 23 0a 64 6f 5f 6d 75 effect..#.do_mu
b970: 6c 74 69 63 6c 69 65 6e 74 5f 74 65 73 74 20 74 lticlient_test t
b980: 6e 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 n {. do_test pa
b990: 67 65 72 31 2d 31 37 2e 24 74 6e 2e 31 2e 31 20 ger1-17.$tn.1.1
b9a0: 7b 0a 20 20 20 20 73 71 6c 31 20 7b 20 0a 20 20 {. sql1 { .
b9b0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 CREATE TABLE
b9c0: 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 20 t1(a, b);.
b9d0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 INSERT INTO t1
b9e0: 56 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20 20 VALUES(1, 2);.
b9f0: 20 20 7d 0a 20 20 20 20 73 71 6c 32 20 7b 0a 20 }. sql2 {.
ba00: 20 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 BEGIN;.
ba10: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 SELECT * FROM
ba20: 74 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 31 t1;. }. } {1
ba30: 20 32 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 2}. do_test pa
ba40: 67 65 72 31 2d 31 37 2e 24 74 6e 2e 31 2e 32 20 ger1-17.$tn.1.2
ba50: 7b 0a 20 20 20 20 63 73 71 6c 31 20 7b 20 49 4e {. csql1 { IN
ba60: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c SERT INTO t1 VAL
ba70: 55 45 53 28 33 2c 20 34 29 20 7d 0a 20 20 7d 20 UES(3, 4) }. }
ba80: 7b 31 20 7b 64 61 74 61 62 61 73 65 20 69 73 20 {1 {database is
ba90: 6c 6f 63 6b 65 64 7d 7d 0a 20 20 64 6f 5f 74 65 locked}}. do_te
baa0: 73 74 20 70 61 67 65 72 31 2d 31 37 2e 24 74 6e st pager1-17.$tn
bab0: 2e 31 2e 33 20 7b 0a 20 20 20 20 73 71 6c 32 20 .1.3 {. sql2
bac0: 7b 20 43 4f 4d 4d 49 54 20 7d 0a 20 20 20 20 73 { COMMIT }. s
bad0: 71 6c 31 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 ql1 { INSERT INT
bae0: 4f 20 74 31 20 56 41 4c 55 45 53 28 33 2c 20 34 O t1 VALUES(3, 4
baf0: 29 20 7d 0a 20 20 7d 20 7b 7d 0a 0a 20 20 64 6f ) }. } {}.. do
bb00: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 37 2e _test pager1-17.
bb10: 24 74 6e 2e 32 2e 31 20 7b 0a 20 20 20 20 63 6f $tn.2.1 {. co
bb20: 64 65 32 20 7b 0a 20 20 20 20 20 20 64 62 32 20 de2 {. db2
bb30: 63 6c 6f 73 65 0a 20 20 20 20 20 20 73 71 6c 69 close. sqli
bb40: 74 65 33 20 64 62 32 20 3a 6d 65 6d 6f 72 79 3a te3 db2 :memory:
bb50: 20 2d 72 65 61 64 6f 6e 6c 79 20 31 0a 20 20 20 -readonly 1.
bb60: 20 7d 0a 20 20 20 20 73 71 6c 32 20 7b 20 0a 20 }. sql2 { .
bb70: 20 20 20 20 20 50 52 41 47 4d 41 20 6f 6d 69 74 PRAGMA omit
bb80: 5f 72 65 61 64 6c 6f 63 6b 20 3d 20 31 3b 0a 20 _readlock = 1;.
bb90: 20 20 20 20 20 41 54 54 41 43 48 20 27 74 65 73 ATTACH 'tes
bba0: 74 2e 64 62 27 20 41 53 20 74 77 6f 3b 0a 20 20 t.db' AS two;.
bbb0: 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 BEGIN;.
bbc0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 SELECT * FROM t
bbd0: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 31 20 1;. }. } {1
bbe0: 32 20 33 20 34 7d 0a 20 20 64 6f 5f 74 65 73 74 2 3 4}. do_test
bbf0: 20 70 61 67 65 72 31 2d 31 37 2e 24 74 6e 2e 32 pager1-17.$tn.2
bc00: 2e 32 20 7b 20 73 71 6c 31 20 22 49 4e 53 45 52 .2 { sql1 "INSER
bc10: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 T INTO t1 VALUES
bc20: 28 35 2c 20 36 29 22 20 7d 20 7b 7d 0a 20 20 64 (5, 6)" } {}. d
bc30: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 37 o_test pager1-17
bc40: 2e 24 74 6e 2e 32 2e 33 20 7b 20 73 71 6c 32 20 .$tn.2.3 { sql2
bc50: 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 "SELECT * FROM t
bc60: 31 22 20 7d 20 20 20 20 20 20 20 20 20 20 20 20 1" }
bc70: 7b 31 20 32 20 33 20 34 7d 0a 20 20 64 6f 5f 74 {1 2 3 4}. do_t
bc80: 65 73 74 20 70 61 67 65 72 31 2d 31 37 2e 24 74 est pager1-17.$t
bc90: 6e 2e 32 2e 34 20 7b 20 73 71 6c 32 20 22 43 4f n.2.4 { sql2 "CO
bca0: 4d 4d 49 54 20 3b 20 53 45 4c 45 43 54 20 2a 20 MMIT ; SELECT *
bcb0: 46 52 4f 4d 20 74 31 22 20 7d 20 20 20 7b 31 20 FROM t1" } {1
bcc0: 32 20 33 20 34 20 35 20 36 7d 0a 0a 20 20 64 6f 2 3 4 5 6}.. do
bcd0: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 37 2e _test pager1-17.
bce0: 24 74 6e 2e 33 2e 31 20 7b 0a 20 20 20 20 63 6f $tn.3.1 {. co
bcf0: 64 65 32 20 7b 0a 20 20 20 20 20 20 64 62 32 20 de2 {. db2
bd00: 63 6c 6f 73 65 0a 20 20 20 20 20 20 73 71 6c 69 close. sqli
bd10: 74 65 33 20 64 62 32 20 3a 6d 65 6d 6f 72 79 3a te3 db2 :memory:
bd20: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 32 20 . }. sql2
bd30: 7b 20 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 { . PRAGMA
bd40: 6f 6d 69 74 5f 72 65 61 64 6c 6f 63 6b 20 3d 20 omit_readlock =
bd50: 31 3b 0a 20 20 20 20 20 20 41 54 54 41 43 48 20 1;. ATTACH
bd60: 27 74 65 73 74 2e 64 62 27 20 41 53 20 74 77 6f 'test.db' AS two
bd70: 3b 0a 20 20 20 20 20 20 42 45 47 49 4e 3b 0a 20 ;. BEGIN;.
bd80: 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 SELECT * FR
bd90: 4f 4d 20 74 31 3b 0a 20 20 20 20 7d 0a 20 20 7d OM t1;. }. }
bda0: 20 7b 31 20 32 20 33 20 34 20 35 20 36 7d 0a 20 {1 2 3 4 5 6}.
bdb0: 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d do_test pager1-
bdc0: 31 37 2e 24 74 6e 2e 33 2e 32 20 7b 0a 20 20 20 17.$tn.3.2 {.
bdd0: 20 63 73 71 6c 31 20 7b 20 49 4e 53 45 52 54 20 csql1 { INSERT
bde0: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 33 INTO t1 VALUES(3
bdf0: 2c 20 34 29 20 7d 0a 20 20 7d 20 7b 31 20 7b 64 , 4) }. } {1 {d
be00: 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 atabase is locke
be10: 64 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 d}}. do_test pa
be20: 67 65 72 31 2d 31 37 2e 24 74 6e 2e 33 2e 33 20 ger1-17.$tn.3.3
be30: 7b 20 73 71 6c 32 20 43 4f 4d 4d 49 54 20 7d 20 { sql2 COMMIT }
be40: 7b 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d {}.}..#---------
be50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
be60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
be70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
be80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
be90: 0a 23 20 54 65 73 74 20 74 68 65 20 70 61 67 65 .# Test the page
bea0: 72 73 20 72 65 73 70 6f 6e 73 65 20 74 6f 20 74 rs response to t
beb0: 68 65 20 62 2d 74 72 65 65 20 6c 61 79 65 72 20 he b-tree layer
bec0: 72 65 71 75 65 73 74 69 6e 67 20 69 6c 6c 65 67 requesting illeg
bed0: 61 6c 20 70 61 67 65 20 0a 23 20 6e 75 6d 62 65 al page .# numbe
bee0: 72 73 3a 0a 23 0a 23 20 20 20 2b 20 54 68 65 20 rs:.#.# + The
bef0: 6c 6f 63 6b 69 6e 67 20 70 61 67 65 2c 0a 23 20 locking page,.#
bf00: 20 20 2b 20 50 61 67 65 20 30 2c 0a 23 20 20 20 + Page 0,.#
bf10: 2b 20 41 20 70 61 67 65 20 77 69 74 68 20 61 20 + A page with a
bf20: 70 61 67 65 20 6e 75 6d 62 65 72 20 67 72 65 61 page number grea
bf30: 74 65 72 20 74 68 61 6e 20 28 32 5e 33 31 2d 31 ter than (2^31-1
bf40: 29 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 70 61 67 )..#.do_test pag
bf50: 65 72 31 2d 31 38 2e 31 20 7b 0a 20 20 66 61 75 er1-18.1 {. fau
bf60: 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 ltsim_delete_and
bf70: 5f 72 65 6f 70 65 6e 0a 20 20 64 62 20 66 75 6e _reopen. db fun
bf80: 63 20 61 5f 73 74 72 69 6e 67 20 61 5f 73 74 72 c a_string a_str
bf90: 69 6e 67 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 ing. execsql {
bfa0: 0a 20 20 20 20 50 52 41 47 4d 41 20 70 61 67 65 . PRAGMA page
bfb0: 5f 73 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20 _size = 1024;.
bfc0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 CREATE TABLE t
bfd0: 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 49 4e 53 1(a, b);. INS
bfe0: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 ERT INTO t1 VALU
bff0: 45 53 28 61 5f 73 74 72 69 6e 67 28 35 30 30 29 ES(a_string(500)
c000: 2c 20 61 5f 73 74 72 69 6e 67 28 32 30 30 29 29 , a_string(200))
c010: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 ;. INSERT INT
c020: 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74 O t1 SELECT a_st
c030: 72 69 6e 67 28 35 30 30 29 2c 20 61 5f 73 74 72 ring(500), a_str
c040: 69 6e 67 28 32 30 30 29 20 46 52 4f 4d 20 74 31 ing(200) FROM t1
c050: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 ;. INSERT INT
c060: 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74 O t1 SELECT a_st
c070: 72 69 6e 67 28 35 30 30 29 2c 20 61 5f 73 74 72 ring(500), a_str
c080: 69 6e 67 28 32 30 30 29 20 46 52 4f 4d 20 74 31 ing(200) FROM t1
c090: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 ;. INSERT INT
c0a0: 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74 O t1 SELECT a_st
c0b0: 72 69 6e 67 28 35 30 30 29 2c 20 61 5f 73 74 72 ring(500), a_str
c0c0: 69 6e 67 28 32 30 30 29 20 46 52 4f 4d 20 74 31 ing(200) FROM t1
c0d0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 ;. INSERT INT
c0e0: 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74 O t1 SELECT a_st
c0f0: 72 69 6e 67 28 35 30 30 29 2c 20 61 5f 73 74 72 ring(500), a_str
c100: 69 6e 67 28 32 30 30 29 20 46 52 4f 4d 20 74 31 ing(200) FROM t1
c110: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 ;. INSERT INT
c120: 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74 O t1 SELECT a_st
c130: 72 69 6e 67 28 35 30 30 29 2c 20 61 5f 73 74 72 ring(500), a_str
c140: 69 6e 67 28 32 30 30 29 20 46 52 4f 4d 20 74 31 ing(200) FROM t1
c150: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 ;. INSERT INT
c160: 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74 O t1 SELECT a_st
c170: 72 69 6e 67 28 35 30 30 29 2c 20 61 5f 73 74 72 ring(500), a_str
c180: 69 6e 67 28 32 30 30 29 20 46 52 4f 4d 20 74 31 ing(200) FROM t1
c190: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 ;. INSERT INT
c1a0: 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74 O t1 SELECT a_st
c1b0: 72 69 6e 67 28 35 30 30 29 2c 20 61 5f 73 74 72 ring(500), a_str
c1c0: 69 6e 67 28 32 30 30 29 20 46 52 4f 4d 20 74 31 ing(200) FROM t1
c1d0: 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 ;. }.} {}.do_te
c1e0: 73 74 20 70 61 67 65 72 31 2d 31 38 2e 32 20 7b st pager1-18.2 {
c1f0: 0a 20 20 73 65 74 20 72 6f 6f 74 20 5b 64 62 20 . set root [db
c200: 6f 6e 65 20 22 53 45 4c 45 43 54 20 72 6f 6f 74 one "SELECT root
c210: 70 61 67 65 20 46 52 4f 4d 20 73 71 6c 69 74 65 page FROM sqlite
c220: 5f 6d 61 73 74 65 72 22 5d 0a 20 20 73 65 74 20 _master"]. set
c230: 6c 6f 63 6b 69 6e 67 70 61 67 65 20 5b 65 78 70 lockingpage [exp
c240: 72 20 28 30 78 31 30 30 30 30 2f 31 30 32 34 29 r (0x10000/1024)
c250: 20 2b 20 31 5d 0a 20 20 65 78 65 63 73 71 6c 20 + 1]. execsql
c260: 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 77 72 69 {. PRAGMA wri
c270: 74 61 62 6c 65 5f 73 63 68 65 6d 61 20 3d 20 31 table_schema = 1
c280: 3b 0a 20 20 20 20 55 50 44 41 54 45 20 73 71 6c ;. UPDATE sql
c290: 69 74 65 5f 6d 61 73 74 65 72 20 53 45 54 20 72 ite_master SET r
c2a0: 6f 6f 74 70 61 67 65 20 3d 20 24 6c 6f 63 6b 69 ootpage = $locki
c2b0: 6e 67 70 61 67 65 3b 0a 20 20 7d 0a 20 20 73 71 ngpage;. }. sq
c2c0: 6c 69 74 65 33 20 64 62 32 20 74 65 73 74 2e 64 lite3 db2 test.d
c2d0: 62 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20 53 b. catchsql { S
c2e0: 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 ELECT count(*) F
c2f0: 52 4f 4d 20 74 31 20 7d 20 64 62 32 0a 7d 20 7b ROM t1 } db2.} {
c300: 31 20 7b 64 61 74 61 62 61 73 65 20 64 69 73 6b 1 {database disk
c310: 20 69 6d 61 67 65 20 69 73 20 6d 61 6c 66 6f 72 image is malfor
c320: 6d 65 64 7d 7d 0a 64 62 32 20 63 6c 6f 73 65 0a med}}.db2 close.
c330: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 do_test pager1-1
c340: 38 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 8.3 {. execsql
c350: 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 {. CREATE TAB
c360: 4c 45 20 74 32 28 78 29 3b 0a 20 20 20 20 49 4e LE t2(x);. IN
c370: 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c SERT INTO t2 VAL
c380: 55 45 53 28 61 5f 73 74 72 69 6e 67 28 35 30 30 UES(a_string(500
c390: 30 29 29 3b 0a 20 20 7d 0a 20 20 73 65 74 20 70 0));. }. set p
c3a0: 67 6e 6f 20 5b 65 78 70 72 20 28 5b 66 69 6c 65 gno [expr ([file
c3b0: 20 73 69 7a 65 20 74 65 73 74 2e 64 62 5d 20 2f size test.db] /
c3c0: 20 31 30 32 34 29 2d 32 5d 0a 20 20 68 65 78 69 1024)-2]. hexi
c3d0: 6f 5f 77 72 69 74 65 20 74 65 73 74 2e 64 62 20 o_write test.db
c3e0: 5b 65 78 70 72 20 28 24 70 67 6e 6f 2d 31 29 2a [expr ($pgno-1)*
c3f0: 31 30 32 34 5d 20 30 30 30 30 30 30 30 30 0a 20 1024] 00000000.
c400: 20 73 71 6c 69 74 65 33 20 64 62 32 20 74 65 73 sqlite3 db2 tes
c410: 74 2e 64 62 0a 20 20 63 61 74 63 68 73 71 6c 20 t.db. catchsql
c420: 7b 20 53 45 4c 45 43 54 20 6c 65 6e 67 74 68 28 { SELECT length(
c430: 78 29 20 46 52 4f 4d 20 74 32 20 7d 20 64 62 32 x) FROM t2 } db2
c440: 0a 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20 .} {1 {database
c450: 64 69 73 6b 20 69 6d 61 67 65 20 69 73 20 6d 61 disk image is ma
c460: 6c 66 6f 72 6d 65 64 7d 7d 0a 64 62 32 20 63 6c lformed}}.db2 cl
c470: 6f 73 65 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 ose.do_test page
c480: 72 31 2d 31 38 2e 34 20 7b 0a 20 20 68 65 78 69 r1-18.4 {. hexi
c490: 6f 5f 77 72 69 74 65 20 74 65 73 74 2e 64 62 20 o_write test.db
c4a0: 5b 65 78 70 72 20 28 24 70 67 6e 6f 2d 31 29 2a [expr ($pgno-1)*
c4b0: 31 30 32 34 5d 20 39 30 30 30 30 30 30 30 0a 20 1024] 90000000.
c4c0: 20 73 71 6c 69 74 65 33 20 64 62 32 20 74 65 73 sqlite3 db2 tes
c4d0: 74 2e 64 62 0a 20 20 63 61 74 63 68 73 71 6c 20 t.db. catchsql
c4e0: 7b 20 53 45 4c 45 43 54 20 6c 65 6e 67 74 68 28 { SELECT length(
c4f0: 78 29 20 46 52 4f 4d 20 74 32 20 7d 20 64 62 32 x) FROM t2 } db2
c500: 0a 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20 .} {1 {database
c510: 64 69 73 6b 20 69 6d 61 67 65 20 69 73 20 6d 61 disk image is ma
c520: 6c 66 6f 72 6d 65 64 7d 7d 0a 64 62 32 20 63 6c lformed}}.db2 cl
c530: 6f 73 65 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 ose.do_test page
c540: 72 31 2d 31 38 2e 35 20 7b 0a 20 20 73 71 6c 69 r1-18.5 {. sqli
c550: 74 65 33 20 64 62 20 22 22 0a 20 20 65 78 65 63 te3 db "". exec
c560: 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 sql {. CREATE
c570: 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b TABLE t1(a, b);
c580: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c . CREATE TABL
c590: 45 20 74 32 28 61 2c 20 62 29 3b 0a 20 20 20 20 E t2(a, b);.
c5a0: 50 52 41 47 4d 41 20 77 72 69 74 61 62 6c 65 5f PRAGMA writable_
c5b0: 73 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20 schema = 1;.
c5c0: 55 50 44 41 54 45 20 73 71 6c 69 74 65 5f 6d 61 UPDATE sqlite_ma
c5d0: 73 74 65 72 20 53 45 54 20 72 6f 6f 74 70 61 67 ster SET rootpag
c5e0: 65 3d 35 20 57 48 45 52 45 20 74 62 6c 5f 6e 61 e=5 WHERE tbl_na
c5f0: 6d 65 20 3d 20 27 74 31 27 3b 0a 20 20 20 20 50 me = 't1';. P
c600: 52 41 47 4d 41 20 77 72 69 74 61 62 6c 65 5f 73 RAGMA writable_s
c610: 63 68 65 6d 61 20 3d 20 30 3b 0a 20 20 20 20 41 chema = 0;. A
c620: 4c 54 45 52 20 54 41 42 4c 45 20 74 31 20 52 45 LTER TABLE t1 RE
c630: 4e 41 4d 45 20 54 4f 20 78 31 3b 0a 20 20 7d 0a NAME TO x1;. }.
c640: 20 20 63 61 74 63 68 73 71 6c 20 7b 20 53 45 4c catchsql { SEL
c650: 45 43 54 20 2a 20 46 52 4f 4d 20 78 31 20 7d 0a ECT * FROM x1 }.
c660: 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20 64 } {1 {database d
c670: 69 73 6b 20 69 6d 61 67 65 20 69 73 20 6d 61 6c isk image is mal
c680: 66 6f 72 6d 65 64 7d 7d 0a 64 62 20 63 6c 6f 73 formed}}.db clos
c690: 65 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 e..do_test pager
c6a0: 31 2d 31 38 2e 36 20 7b 0a 20 20 66 61 75 6c 74 1-18.6 {. fault
c6b0: 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 sim_delete_and_r
c6c0: 65 6f 70 65 6e 0a 20 20 64 62 20 66 75 6e 63 20 eopen. db func
c6d0: 61 5f 73 74 72 69 6e 67 20 61 5f 73 74 72 69 6e a_string a_strin
c6e0: 67 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 g. execsql {.
c6f0: 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 PRAGMA page_si
c700: 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20 20 20 43 ze = 1024;. C
c710: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 78 REATE TABLE t1(x
c720: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e );. INSERT IN
c730: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 61 5f 73 TO t1 VALUES(a_s
c740: 74 72 69 6e 67 28 38 30 30 29 29 3b 0a 20 20 20 tring(800));.
c750: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 INSERT INTO t1
c760: 56 41 4c 55 45 53 28 61 5f 73 74 72 69 6e 67 28 VALUES(a_string(
c770: 38 30 30 29 29 3b 0a 20 20 7d 0a 0a 20 20 73 65 800));. }.. se
c780: 74 20 72 6f 6f 74 20 5b 64 62 20 6f 6e 65 20 22 t root [db one "
c790: 53 45 4c 45 43 54 20 72 6f 6f 74 70 61 67 65 20 SELECT rootpage
c7a0: 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 FROM sqlite_mast
c7b0: 65 72 22 5d 0a 20 20 64 62 20 63 6c 6f 73 65 0a er"]. db close.
c7c0: 0a 20 20 68 65 78 69 6f 5f 77 72 69 74 65 20 74 . hexio_write t
c7d0: 65 73 74 2e 64 62 20 5b 65 78 70 72 20 28 24 72 est.db [expr ($r
c7e0: 6f 6f 74 2d 31 29 2a 31 30 32 34 20 2b 20 38 5d oot-1)*1024 + 8]
c7f0: 20 30 30 30 30 30 30 30 30 0a 20 20 73 71 6c 69 00000000. sqli
c800: 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20 te3 db test.db.
c810: 20 63 61 74 63 68 73 71 6c 20 7b 20 53 45 4c 45 catchsql { SELE
c820: 43 54 20 6c 65 6e 67 74 68 28 78 29 20 46 52 4f CT length(x) FRO
c830: 4d 20 74 31 20 7d 0a 7d 20 7b 31 20 7b 64 61 74 M t1 }.} {1 {dat
c840: 61 62 61 73 65 20 64 69 73 6b 20 69 6d 61 67 65 abase disk image
c850: 20 69 73 20 6d 61 6c 66 6f 72 6d 65 64 7d 7d 0a is malformed}}.
c860: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d .do_test pager1-
c870: 31 39 2e 31 20 7b 0a 20 20 73 71 6c 69 74 65 33 19.1 {. sqlite3
c880: 20 64 62 20 22 22 0a 20 20 64 62 20 66 75 6e 63 db "". db func
c890: 20 61 5f 73 74 72 69 6e 67 20 61 5f 73 74 72 69 a_string a_stri
c8a0: 6e 67 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 ng. execsql {.
c8b0: 20 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73 PRAGMA page_s
c8c0: 69 7a 65 20 3d 20 35 31 32 3b 0a 20 20 20 20 50 ize = 512;. P
c8d0: 52 41 47 4d 41 20 61 75 74 6f 5f 76 61 63 75 75 RAGMA auto_vacuu
c8e0: 6d 20 3d 20 31 3b 0a 20 20 20 20 43 52 45 41 54 m = 1;. CREAT
c8f0: 45 20 54 41 42 4c 45 20 74 31 28 61 61 2c 20 61 E TABLE t1(aa, a
c900: 62 2c 20 61 63 2c 20 61 64 2c 20 61 65 2c 20 61 b, ac, ad, ae, a
c910: 66 2c 20 61 67 2c 20 61 68 2c 20 61 69 2c 20 61 f, ag, ah, ai, a
c920: 6a 2c 20 61 6b 2c 20 61 6c 2c 20 61 6d 2c 20 61 j, ak, al, am, a
c930: 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 n,.
c940: 20 20 20 20 20 20 20 62 61 2c 20 62 62 2c 20 62 ba, bb, b
c950: 63 2c 20 62 64 2c 20 62 65 2c 20 62 66 2c 20 62 c, bd, be, bf, b
c960: 67 2c 20 62 68 2c 20 62 69 2c 20 62 6a 2c 20 62 g, bh, bi, bj, b
c970: 6b 2c 20 62 6c 2c 20 62 6d 2c 20 62 6e 2c 0a 20 k, bl, bm, bn,.
c980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
c990: 20 20 20 63 61 2c 20 63 62 2c 20 63 63 2c 20 63 ca, cb, cc, c
c9a0: 64 2c 20 63 65 2c 20 63 66 2c 20 63 67 2c 20 63 d, ce, cf, cg, c
c9b0: 68 2c 20 63 69 2c 20 63 6a 2c 20 63 6b 2c 20 63 h, ci, cj, ck, c
c9c0: 6c 2c 20 63 6d 2c 20 63 6e 2c 0a 20 20 20 20 20 l, cm, cn,.
c9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 d
c9e0: 61 2c 20 64 62 2c 20 64 63 2c 20 64 64 2c 20 64 a, db, dc, dd, d
c9f0: 65 2c 20 64 66 2c 20 64 67 2c 20 64 68 2c 20 64 e, df, dg, dh, d
ca00: 69 2c 20 64 6a 2c 20 64 6b 2c 20 64 6c 2c 20 64 i, dj, dk, dl, d
ca10: 6d 2c 20 64 6e 2c 0a 20 20 20 20 20 20 20 20 20 m, dn,.
ca20: 20 20 20 20 20 20 20 20 20 20 20 65 61 2c 20 65 ea, e
ca30: 62 2c 20 65 63 2c 20 65 64 2c 20 65 65 2c 20 65 b, ec, ed, ee, e
ca40: 66 2c 20 65 67 2c 20 65 68 2c 20 65 69 2c 20 65 f, eg, eh, ei, e
ca50: 6a 2c 20 65 6b 2c 20 65 6c 2c 20 65 6d 2c 20 65 j, ek, el, em, e
ca60: 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 n,.
ca70: 20 20 20 20 20 20 20 66 61 2c 20 66 62 2c 20 66 fa, fb, f
ca80: 63 2c 20 66 64 2c 20 66 65 2c 20 66 66 2c 20 66 c, fd, fe, ff, f
ca90: 67 2c 20 66 68 2c 20 66 69 2c 20 66 6a 2c 20 66 g, fh, fi, fj, f
caa0: 6b 2c 20 66 6c 2c 20 66 6d 2c 20 66 6e 2c 0a 20 k, fl, fm, fn,.
cab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
cac0: 20 20 20 67 61 2c 20 67 62 2c 20 67 63 2c 20 67 ga, gb, gc, g
cad0: 64 2c 20 67 65 2c 20 67 66 2c 20 67 67 2c 20 67 d, ge, gf, gg, g
cae0: 68 2c 20 67 69 2c 20 67 6a 2c 20 67 6b 2c 20 67 h, gi, gj, gk, g
caf0: 6c 2c 20 67 6d 2c 20 67 6e 2c 0a 20 20 20 20 20 l, gm, gn,.
cb00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 68 h
cb10: 61 2c 20 68 62 2c 20 68 63 2c 20 68 64 2c 20 68 a, hb, hc, hd, h
cb20: 65 2c 20 68 66 2c 20 68 67 2c 20 68 68 2c 20 68 e, hf, hg, hh, h
cb30: 69 2c 20 68 6a 2c 20 68 6b 2c 20 68 6c 2c 20 68 i, hj, hk, hl, h
cb40: 6d 2c 20 68 6e 2c 0a 20 20 20 20 20 20 20 20 20 m, hn,.
cb50: 20 20 20 20 20 20 20 20 20 20 20 69 61 2c 20 69 ia, i
cb60: 62 2c 20 69 63 2c 20 69 64 2c 20 69 65 2c 20 69 b, ic, id, ie, i
cb70: 66 2c 20 69 67 2c 20 69 68 2c 20 69 69 2c 20 69 f, ig, ih, ii, i
cb80: 6a 2c 20 69 6b 2c 20 69 6c 2c 20 69 6d 2c 20 69 j, ik, il, im, i
cb90: 78 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 x,.
cba0: 20 20 20 20 20 20 20 6a 61 2c 20 6a 62 2c 20 6a ja, jb, j
cbb0: 63 2c 20 6a 64 2c 20 6a 65 2c 20 6a 66 2c 20 6a c, jd, je, jf, j
cbc0: 67 2c 20 6a 68 2c 20 6a 69 2c 20 6a 6a 2c 20 6a g, jh, ji, jj, j
cbd0: 6b 2c 20 6a 6c 2c 20 6a 6d 2c 20 6a 6e 2c 0a 20 k, jl, jm, jn,.
cbe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
cbf0: 20 20 20 6b 61 2c 20 6b 62 2c 20 6b 63 2c 20 6b ka, kb, kc, k
cc00: 64 2c 20 6b 65 2c 20 6b 66 2c 20 6b 67 2c 20 6b d, ke, kf, kg, k
cc10: 68 2c 20 6b 69 2c 20 6b 6a 2c 20 6b 6b 2c 20 6b h, ki, kj, kk, k
cc20: 6c 2c 20 6b 6d 2c 20 6b 6e 2c 0a 20 20 20 20 20 l, km, kn,.
cc30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c l
cc40: 61 2c 20 6c 62 2c 20 6c 63 2c 20 6c 64 2c 20 6c a, lb, lc, ld, l
cc50: 65 2c 20 6c 66 2c 20 6c 67 2c 20 6c 68 2c 20 6c e, lf, lg, lh, l
cc60: 69 2c 20 6c 6a 2c 20 6c 6b 2c 20 6c 6c 2c 20 6c i, lj, lk, ll, l
cc70: 6d 2c 20 6c 6e 2c 0a 20 20 20 20 20 20 20 20 20 m, ln,.
cc80: 20 20 20 20 20 20 20 20 20 20 20 6d 61 2c 20 6d ma, m
cc90: 62 2c 20 6d 63 2c 20 6d 64 2c 20 6d 65 2c 20 6d b, mc, md, me, m
cca0: 66 2c 20 6d 67 2c 20 6d 68 2c 20 6d 69 2c 20 6d f, mg, mh, mi, m
ccb0: 6a 2c 20 6d 6b 2c 20 6d 6c 2c 20 6d 6d 2c 20 6d j, mk, ml, mm, m
ccc0: 6e 0a 20 20 20 20 29 3b 0a 20 20 20 20 43 52 45 n. );. CRE
ccd0: 41 54 45 20 54 41 42 4c 45 20 74 32 28 61 61 2c ATE TABLE t2(aa,
cce0: 20 61 62 2c 20 61 63 2c 20 61 64 2c 20 61 65 2c ab, ac, ad, ae,
ccf0: 20 61 66 2c 20 61 67 2c 20 61 68 2c 20 61 69 2c af, ag, ah, ai,
cd00: 20 61 6a 2c 20 61 6b 2c 20 61 6c 2c 20 61 6d 2c aj, ak, al, am,
cd10: 20 61 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 an,.
cd20: 20 20 20 20 20 20 20 20 20 62 61 2c 20 62 62 2c ba, bb,
cd30: 20 62 63 2c 20 62 64 2c 20 62 65 2c 20 62 66 2c bc, bd, be, bf,
cd40: 20 62 67 2c 20 62 68 2c 20 62 69 2c 20 62 6a 2c bg, bh, bi, bj,
cd50: 20 62 6b 2c 20 62 6c 2c 20 62 6d 2c 20 62 6e 2c bk, bl, bm, bn,
cd60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
cd70: 20 20 20 20 20 63 61 2c 20 63 62 2c 20 63 63 2c ca, cb, cc,
cd80: 20 63 64 2c 20 63 65 2c 20 63 66 2c 20 63 67 2c cd, ce, cf, cg,
cd90: 20 63 68 2c 20 63 69 2c 20 63 6a 2c 20 63 6b 2c ch, ci, cj, ck,
cda0: 20 63 6c 2c 20 63 6d 2c 20 63 6e 2c 0a 20 20 20 cl, cm, cn,.
cdb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
cdc0: 20 64 61 2c 20 64 62 2c 20 64 63 2c 20 64 64 2c da, db, dc, dd,
cdd0: 20 64 65 2c 20 64 66 2c 20 64 67 2c 20 64 68 2c de, df, dg, dh,
cde0: 20 64 69 2c 20 64 6a 2c 20 64 6b 2c 20 64 6c 2c di, dj, dk, dl,
cdf0: 20 64 6d 2c 20 64 6e 2c 0a 20 20 20 20 20 20 20 dm, dn,.
ce00: 20 20 20 20 20 20 20 20 20 20 20 20 20 65 61 2c ea,
ce10: 20 65 62 2c 20 65 63 2c 20 65 64 2c 20 65 65 2c eb, ec, ed, ee,
ce20: 20 65 66 2c 20 65 67 2c 20 65 68 2c 20 65 69 2c ef, eg, eh, ei,
ce30: 20 65 6a 2c 20 65 6b 2c 20 65 6c 2c 20 65 6d 2c ej, ek, el, em,
ce40: 20 65 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 en,.
ce50: 20 20 20 20 20 20 20 20 20 66 61 2c 20 66 62 2c fa, fb,
ce60: 20 66 63 2c 20 66 64 2c 20 66 65 2c 20 66 66 2c fc, fd, fe, ff,
ce70: 20 66 67 2c 20 66 68 2c 20 66 69 2c 20 66 6a 2c fg, fh, fi, fj,
ce80: 20 66 6b 2c 20 66 6c 2c 20 66 6d 2c 20 66 6e 2c fk, fl, fm, fn,
ce90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
cea0: 20 20 20 20 20 67 61 2c 20 67 62 2c 20 67 63 2c ga, gb, gc,
ceb0: 20 67 64 2c 20 67 65 2c 20 67 66 2c 20 67 67 2c gd, ge, gf, gg,
cec0: 20 67 68 2c 20 67 69 2c 20 67 6a 2c 20 67 6b 2c gh, gi, gj, gk,
ced0: 20 67 6c 2c 20 67 6d 2c 20 67 6e 2c 0a 20 20 20 gl, gm, gn,.
cee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
cef0: 20 68 61 2c 20 68 62 2c 20 68 63 2c 20 68 64 2c ha, hb, hc, hd,
cf00: 20 68 65 2c 20 68 66 2c 20 68 67 2c 20 68 68 2c he, hf, hg, hh,
cf10: 20 68 69 2c 20 68 6a 2c 20 68 6b 2c 20 68 6c 2c hi, hj, hk, hl,
cf20: 20 68 6d 2c 20 68 6e 2c 0a 20 20 20 20 20 20 20 hm, hn,.
cf30: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 61 2c ia,
cf40: 20 69 62 2c 20 69 63 2c 20 69 64 2c 20 69 65 2c ib, ic, id, ie,
cf50: 20 69 66 2c 20 69 67 2c 20 69 68 2c 20 69 69 2c if, ig, ih, ii,
cf60: 20 69 6a 2c 20 69 6b 2c 20 69 6c 2c 20 69 6d 2c ij, ik, il, im,
cf70: 20 69 78 2c 0a 20 20 20 20 20 20 20 20 20 20 20 ix,.
cf80: 20 20 20 20 20 20 20 20 20 6a 61 2c 20 6a 62 2c ja, jb,
cf90: 20 6a 63 2c 20 6a 64 2c 20 6a 65 2c 20 6a 66 2c jc, jd, je, jf,
cfa0: 20 6a 67 2c 20 6a 68 2c 20 6a 69 2c 20 6a 6a 2c jg, jh, ji, jj,
cfb0: 20 6a 6b 2c 20 6a 6c 2c 20 6a 6d 2c 20 6a 6e 2c jk, jl, jm, jn,
cfc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
cfd0: 20 20 20 20 20 6b 61 2c 20 6b 62 2c 20 6b 63 2c ka, kb, kc,
cfe0: 20 6b 64 2c 20 6b 65 2c 20 6b 66 2c 20 6b 67 2c kd, ke, kf, kg,
cff0: 20 6b 68 2c 20 6b 69 2c 20 6b 6a 2c 20 6b 6b 2c kh, ki, kj, kk,
d000: 20 6b 6c 2c 20 6b 6d 2c 20 6b 6e 2c 0a 20 20 20 kl, km, kn,.
d010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
d020: 20 6c 61 2c 20 6c 62 2c 20 6c 63 2c 20 6c 64 2c la, lb, lc, ld,
d030: 20 6c 65 2c 20 6c 66 2c 20 6c 67 2c 20 6c 68 2c le, lf, lg, lh,
d040: 20 6c 69 2c 20 6c 6a 2c 20 6c 6b 2c 20 6c 6c 2c li, lj, lk, ll,
d050: 20 6c 6d 2c 20 6c 6e 2c 0a 20 20 20 20 20 20 20 lm, ln,.
d060: 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 61 2c ma,
d070: 20 6d 62 2c 20 6d 63 2c 20 6d 64 2c 20 6d 65 2c mb, mc, md, me,
d080: 20 6d 66 2c 20 6d 67 2c 20 6d 68 2c 20 6d 69 2c mf, mg, mh, mi,
d090: 20 6d 6a 2c 20 6d 6b 2c 20 6d 6c 2c 20 6d 6d 2c mj, mk, ml, mm,
d0a0: 20 6d 6e 0a 20 20 20 20 29 3b 0a 20 20 20 20 49 mn. );. I
d0b0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 28 61 61 NSERT INTO t1(aa
d0c0: 29 20 56 41 4c 55 45 53 28 20 61 5f 73 74 72 69 ) VALUES( a_stri
d0d0: 6e 67 28 31 30 30 30 30 30 29 20 29 3b 0a 20 20 ng(100000) );.
d0e0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 INSERT INTO t2
d0f0: 28 61 61 29 20 56 41 4c 55 45 53 28 20 61 5f 73 (aa) VALUES( a_s
d100: 74 72 69 6e 67 28 31 30 30 30 30 30 29 20 29 3b tring(100000) );
d110: 0a 20 20 20 20 56 41 43 55 55 4d 3b 0a 20 20 7d . VACUUM;. }
d120: 0a 7d 20 7b 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d .} {}..#--------
d130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d170: 2d 0a 23 20 54 65 73 74 20 61 20 63 6f 75 70 6c -.# Test a coupl
d180: 65 20 6f 66 20 73 70 65 63 69 61 6c 20 63 61 73 e of special cas
d190: 65 73 20 74 68 61 74 20 63 6f 6d 65 20 75 70 20 es that come up
d1a0: 77 68 69 6c 65 20 63 6f 6d 6d 69 74 74 69 6e 67 while committing
d1b0: 20 0a 23 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 .# transactions
d1c0: 3a 0a 23 0a 23 20 20 20 70 61 67 65 72 31 2d 32 :.#.# pager1-2
d1d0: 30 2e 31 2e 2a 3a 20 43 6f 6d 6d 69 74 74 69 6e 0.1.*: Committin
d1e0: 67 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 g an in-memory d
d1f0: 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 atabase transact
d200: 69 6f 6e 20 77 68 65 6e 20 74 68 65 20 0a 23 20 ion when the .#
d210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
d220: 20 64 61 74 61 62 61 73 65 20 68 61 73 20 6e 6f database has no
d230: 74 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 t been modified
d240: 61 74 20 61 6c 6c 2e 0a 23 0a 23 20 20 20 70 61 at all..#.# pa
d250: 67 65 72 31 2d 32 30 2e 32 2e 2a 3a 20 41 73 20 ger1-20.2.*: As
d260: 61 62 6f 76 65 2c 20 62 75 74 20 77 69 74 68 20 above, but with
d270: 61 20 6e 6f 72 6d 61 6c 20 64 62 20 69 6e 20 65 a normal db in e
d280: 78 63 6c 75 73 69 76 65 2d 6c 6f 63 6b 69 6e 67 xclusive-locking
d290: 20 6d 6f 64 65 2e 0a 23 0a 23 20 20 20 70 61 67 mode..#.# pag
d2a0: 65 72 31 2d 32 30 2e 33 2e 2a 3a 20 43 6f 6d 6d er1-20.3.*: Comm
d2b0: 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63 itting a transac
d2c0: 74 69 6f 6e 20 69 6e 20 57 41 4c 20 6d 6f 64 65 tion in WAL mode
d2d0: 20 77 68 65 72 65 20 74 68 65 20 64 61 74 61 62 where the datab
d2e0: 61 73 65 20 68 61 73 0a 23 20 20 20 20 20 20 20 ase has.#
d2f0: 20 20 20 20 20 20 20 20 20 20 20 62 65 65 6e 20 been
d300: 6d 6f 64 69 66 69 65 64 2c 20 62 75 74 20 61 6c modified, but al
d310: 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 68 61 l dirty pages ha
d320: 76 65 20 62 65 65 6e 20 66 6c 75 73 68 65 64 20 ve been flushed
d330: 74 6f 20 0a 23 20 20 20 20 20 20 20 20 20 20 20 to .#
d340: 20 20 20 20 20 20 20 64 69 73 6b 20 62 65 66 6f disk befo
d350: 72 65 20 74 68 65 20 63 6f 6d 6d 69 74 2e 0a 23 re the commit..#
d360: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d .do_test pager1-
d370: 32 30 2e 31 2e 31 20 7b 0a 20 20 63 61 74 63 68 20.1.1 {. catch
d380: 20 7b 64 62 20 63 6c 6f 73 65 7d 0a 20 20 73 71 {db close}. sq
d390: 6c 69 74 65 33 20 64 62 20 3a 6d 65 6d 6f 72 79 lite3 db :memory
d3a0: 3a 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 :. execsql {.
d3b0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 6f CREATE TABLE o
d3c0: 6e 65 28 74 77 6f 2c 20 74 68 72 65 65 29 3b 0a ne(two, three);.
d3d0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 INSERT INTO
d3e0: 6f 6e 65 20 56 41 4c 55 45 53 28 27 61 27 2c 20 one VALUES('a',
d3f0: 27 62 27 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 'b');. }.} {}.d
d400: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 30 o_test pager1-20
d410: 2e 31 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c .1.2 {. execsql
d420: 20 7b 0a 20 20 20 20 42 45 47 49 4e 20 45 58 43 {. BEGIN EXC
d430: 4c 55 53 49 56 45 3b 0a 20 20 20 20 43 4f 4d 4d LUSIVE;. COMM
d440: 49 54 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 64 6f IT;. }.} {}..do
d450: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 30 2e _test pager1-20.
d460: 32 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 2.1 {. faultsim
d470: 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 _delete_and_reop
d480: 65 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 en. execsql {.
d490: 20 20 20 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e PRAGMA lockin
d4a0: 67 5f 6d 6f 64 65 20 3d 20 65 78 63 6c 75 73 69 g_mode = exclusi
d4b0: 76 65 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a ve;. PRAGMA j
d4c0: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 70 65 ournal_mode = pe
d4d0: 72 73 69 73 74 3b 0a 20 20 20 20 43 52 45 41 54 rsist;. CREAT
d4e0: 45 20 54 41 42 4c 45 20 6f 6e 65 28 74 77 6f 2c E TABLE one(two,
d4f0: 20 74 68 72 65 65 29 3b 0a 20 20 20 20 49 4e 53 three);. INS
d500: 45 52 54 20 49 4e 54 4f 20 6f 6e 65 20 56 41 4c ERT INTO one VAL
d510: 55 45 53 28 27 61 27 2c 20 27 62 27 29 3b 0a 20 UES('a', 'b');.
d520: 20 7d 0a 7d 20 7b 65 78 63 6c 75 73 69 76 65 20 }.} {exclusive
d530: 70 65 72 73 69 73 74 7d 0a 64 6f 5f 74 65 73 74 persist}.do_test
d540: 20 70 61 67 65 72 31 2d 32 30 2e 32 2e 32 20 7b pager1-20.2.2 {
d550: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 . execsql {.
d560: 20 42 45 47 49 4e 20 45 58 43 4c 55 53 49 56 45 BEGIN EXCLUSIVE
d570: 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 ;. COMMIT;.
d580: 7d 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74 20 }.} {}..do_test
d590: 70 61 67 65 72 31 2d 32 30 2e 33 2e 31 20 7b 0a pager1-20.3.1 {.
d5a0: 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 faultsim_delet
d5b0: 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 64 e_and_reopen. d
d5c0: 62 20 66 75 6e 63 20 61 5f 73 74 72 69 6e 67 20 b func a_string
d5d0: 61 5f 73 74 72 69 6e 67 0a 20 20 65 78 65 63 73 a_string. execs
d5e0: 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 ql {. PRAGMA
d5f0: 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b cache_size = 10;
d600: 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 . PRAGMA jour
d610: 6e 61 6c 5f 6d 6f 64 65 20 3d 20 77 61 6c 3b 0a nal_mode = wal;.
d620: 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 BEGIN;.
d630: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 CREATE TABLE t1
d640: 28 78 29 3b 0a 20 20 20 20 20 20 43 52 45 41 54 (x);. CREAT
d650: 45 20 54 41 42 4c 45 20 74 32 28 79 29 3b 0a 20 E TABLE t2(y);.
d660: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f INSERT INTO
d670: 20 74 31 20 56 41 4c 55 45 53 28 61 5f 73 74 72 t1 VALUES(a_str
d680: 69 6e 67 28 38 30 30 29 29 3b 0a 20 20 20 20 20 ing(800));.
d690: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 INSERT INTO t1
d6a0: 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 SELECT a_string(
d6b0: 38 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 800) FROM t1;
d6c0: 20 20 20 20 20 20 2f 2a 20 20 20 32 20 2a 2f 0a /* 2 */.
d6d0: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 INSERT INT
d6e0: 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74 O t1 SELECT a_st
d6f0: 72 69 6e 67 28 38 30 30 29 20 46 52 4f 4d 20 74 ring(800) FROM t
d700: 31 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20 1; /*
d710: 34 20 2a 2f 0a 20 20 20 20 20 20 49 4e 53 45 52 4 */. INSER
d720: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 T INTO t1 SELECT
d730: 20 61 5f 73 74 72 69 6e 67 28 38 30 30 29 20 46 a_string(800) F
d740: 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 20 20 ROM t1;
d750: 2f 2a 20 20 20 38 20 2a 2f 0a 20 20 20 20 20 20 /* 8 */.
d760: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 INSERT INTO t1 S
d770: 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 38 ELECT a_string(8
d780: 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 00) FROM t1;
d790: 20 20 20 20 20 2f 2a 20 20 31 36 20 2a 2f 0a 20 /* 16 */.
d7a0: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f INSERT INTO
d7b0: 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74 72 t1 SELECT a_str
d7c0: 69 6e 67 28 38 30 30 29 20 46 52 4f 4d 20 74 31 ing(800) FROM t1
d7d0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 20 33 32 ; /* 32
d7e0: 20 2a 2f 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a */. COMMIT;.
d7f0: 20 20 7d 0a 7d 20 7b 77 61 6c 7d 0a 64 6f 5f 74 }.} {wal}.do_t
d800: 65 73 74 20 70 61 67 65 72 31 2d 32 30 2e 33 2e est pager1-20.3.
d810: 32 20 7b 0a 20 20 70 72 6f 63 20 72 65 63 75 72 2 {. proc recur
d820: 73 69 76 65 5f 73 65 6c 65 63 74 20 7b 69 64 7d sive_select {id}
d830: 20 7b 0a 20 20 20 20 64 62 20 65 76 61 6c 20 7b {. db eval {
d840: 53 45 4c 45 43 54 20 72 6f 77 69 64 2c 20 78 20 SELECT rowid, x
d850: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 72 6f FROM t1 WHERE ro
d860: 77 69 64 20 3d 20 28 24 69 64 2d 31 29 7d 20 7b wid = ($id-1)} {
d870: 0a 20 20 20 20 20 20 72 65 63 75 72 73 69 76 65 . recursive
d880: 5f 73 65 6c 65 63 74 20 24 72 6f 77 69 64 0a 20 _select $rowid.
d890: 20 20 20 7d 0a 20 20 7d 0a 20 20 65 78 65 63 73 }. }. execs
d8a0: 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a ql {. BEGIN;.
d8b0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 INSERT INTO
d8c0: 74 32 20 56 41 4c 55 45 53 28 27 78 78 78 78 27 t2 VALUES('xxxx'
d8d0: 29 3b 0a 20 20 7d 0a 20 20 72 65 63 75 72 73 69 );. }. recursi
d8e0: 76 65 5f 73 65 6c 65 63 74 20 33 32 0a 20 20 65 ve_select 32. e
d8f0: 78 65 63 73 71 6c 20 43 4f 4d 4d 49 54 0a 7d 20 xecsql COMMIT.}
d900: 7b 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d {}..#-----------
d910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 --------------.#
d950: 20 54 65 73 74 20 74 68 61 74 20 61 20 57 41 4c Test that a WAL
d960: 20 64 61 74 61 62 61 73 65 20 6d 61 79 20 6e 6f database may no
d970: 74 20 62 65 20 6f 70 65 6e 65 64 20 69 66 3a 0a t be opened if:.
d980: 23 0a 23 20 20 20 70 61 67 65 72 31 2d 32 31 2e #.# pager1-21.
d990: 31 2e 2a 3a 20 54 68 65 20 56 46 53 20 68 61 73 1.*: The VFS has
d9a0: 20 61 6e 20 69 56 65 72 73 69 6f 6e 20 6c 65 73 an iVersion les
d9b0: 73 20 74 68 61 6e 20 32 2c 20 6f 72 0a 23 20 20 s than 2, or.#
d9c0: 20 70 61 67 65 72 31 2d 32 31 2e 32 2e 2a 3a 20 pager1-21.2.*:
d9d0: 54 68 65 20 56 46 53 20 64 6f 65 73 20 6e 6f 74 The VFS does not
d9e0: 20 70 72 6f 76 69 64 65 20 78 53 68 6d 58 58 58 provide xShmXXX
d9f0: 28 29 20 6d 65 74 68 6f 64 73 2e 0a 23 0a 64 6f () methods..#.do
da00: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 31 2e _test pager1-21.
da10: 30 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 0 {. faultsim_d
da20: 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e elete_and_reopen
da30: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 . execsql {.
da40: 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f PRAGMA journal_
da50: 6d 6f 64 65 20 3d 20 57 41 4c 3b 0a 20 20 20 20 mode = WAL;.
da60: 43 52 45 41 54 45 20 54 41 42 4c 45 20 6b 6f 28 CREATE TABLE ko(
da70: 63 20 44 45 46 41 55 4c 54 20 27 61 62 63 27 2c c DEFAULT 'abc',
da80: 20 62 20 44 45 46 41 55 4c 54 20 27 64 65 66 27 b DEFAULT 'def'
da90: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e );. INSERT IN
daa0: 54 4f 20 6b 6f 20 44 45 46 41 55 4c 54 20 56 41 TO ko DEFAULT VA
dab0: 4c 55 45 53 3b 0a 20 20 7d 0a 7d 20 7b 77 61 6c LUES;. }.} {wal
dac0: 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 }.do_test pager1
dad0: 2d 32 31 2e 31 20 7b 0a 20 20 74 65 73 74 76 66 -21.1 {. testvf
dae0: 73 20 74 76 20 2d 6e 6f 73 68 6d 20 31 0a 20 20 s tv -noshm 1.
daf0: 73 71 6c 69 74 65 33 20 64 62 32 20 74 65 73 74 sqlite3 db2 test
db00: 2e 64 62 20 2d 76 66 73 20 74 76 0a 20 20 63 61 .db -vfs tv. ca
db10: 74 63 68 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 tchsql { SELECT
db20: 2a 20 46 52 4f 4d 20 6b 6f 20 7d 20 64 62 32 0a * FROM ko } db2.
db30: 7d 20 7b 31 20 7b 75 6e 61 62 6c 65 20 74 6f 20 } {1 {unable to
db40: 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 66 69 open database fi
db50: 6c 65 7d 7d 0a 64 62 32 20 63 6c 6f 73 65 0a 74 le}}.db2 close.t
db60: 76 20 64 65 6c 65 74 65 0a 64 6f 5f 74 65 73 74 v delete.do_test
db70: 20 70 61 67 65 72 31 2d 32 31 2e 32 20 7b 0a 62 pager1-21.2 {.b
db80: 72 65 61 6b 70 6f 69 6e 74 0a 20 20 74 65 73 74 reakpoint. test
db90: 76 66 73 20 74 76 20 2d 69 76 65 72 73 69 6f 6e vfs tv -iversion
dba0: 20 31 0a 20 20 73 71 6c 69 74 65 33 20 64 62 32 1. sqlite3 db2
dbb0: 20 74 65 73 74 2e 64 62 20 2d 76 66 73 20 74 76 test.db -vfs tv
dbc0: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20 53 45 . catchsql { SE
dbd0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6b 6f 20 7d LECT * FROM ko }
dbe0: 20 64 62 32 0a 7d 20 7b 31 20 7b 75 6e 61 62 6c db2.} {1 {unabl
dbf0: 65 20 74 6f 20 6f 70 65 6e 20 64 61 74 61 62 61 e to open databa
dc00: 73 65 20 66 69 6c 65 7d 7d 0a 64 62 32 20 63 6c se file}}.db2 cl
dc10: 6f 73 65 0a 74 76 20 64 65 6c 65 74 65 0a 0a 23 ose.tv delete..#
dc20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
dc30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
dc40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
dc50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
dc60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 ---------.# Test
dc70: 20 74 68 61 74 20 61 20 22 50 52 41 47 4d 41 20 that a "PRAGMA
dc80: 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 22 3a wal_checkpoint":
dc90: 0a 23 0a 23 20 20 20 70 61 67 65 72 31 2d 32 32 .#.# pager1-22
dca0: 2e 31 2e 2a 3a 20 69 73 20 61 20 6e 6f 2d 6f 70 .1.*: is a no-op
dcb0: 20 6f 6e 20 61 20 6e 6f 6e 2d 57 41 4c 20 64 62 on a non-WAL db
dcc0: 2c 20 61 6e 64 0a 23 20 20 20 70 61 67 65 72 31 , and.# pager1
dcd0: 2d 32 32 2e 32 2e 2a 3a 20 64 6f 65 73 20 6e 6f -22.2.*: does no
dce0: 74 20 63 61 75 73 65 20 78 53 79 6e 63 20 63 61 t cause xSync ca
dcf0: 6c 6c 73 20 77 69 74 68 20 61 20 73 79 6e 63 68 lls with a synch
dd00: 72 6f 6e 6f 75 73 3d 6f 66 66 20 64 62 2e 0a 23 ronous=off db..#
dd10: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d .do_test pager1-
dd20: 32 32 2e 31 2e 31 20 7b 0a 20 20 66 61 75 6c 74 22.1.1 {. fault
dd30: 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 sim_delete_and_r
dd40: 65 6f 70 65 6e 0a 20 20 65 78 65 63 73 71 6c 20 eopen. execsql
dd50: 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 {. CREATE TAB
dd60: 4c 45 20 6b 6f 28 63 20 44 45 46 41 55 4c 54 20 LE ko(c DEFAULT
dd70: 27 61 62 63 27 2c 20 62 20 44 45 46 41 55 4c 54 'abc', b DEFAULT
dd80: 20 27 64 65 66 27 29 3b 0a 20 20 20 20 49 4e 53 'def');. INS
dd90: 45 52 54 20 49 4e 54 4f 20 6b 6f 20 44 45 46 41 ERT INTO ko DEFA
dda0: 55 4c 54 20 56 41 4c 55 45 53 3b 0a 20 20 7d 0a ULT VALUES;. }.
ddb0: 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 execsql { PRAG
ddc0: 4d 41 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e MA wal_checkpoin
ddd0: 74 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 t }.} {}.do_test
dde0: 20 70 61 67 65 72 31 2d 32 32 2e 32 2e 31 20 7b pager1-22.2.1 {
ddf0: 0a 20 20 74 65 73 74 76 66 73 20 74 76 20 2d 64 . testvfs tv -d
de00: 65 66 61 75 6c 74 20 31 0a 20 20 74 76 20 66 69 efault 1. tv fi
de10: 6c 74 65 72 20 78 53 79 6e 63 0a 20 20 74 76 20 lter xSync. tv
de20: 73 63 72 69 70 74 20 78 53 79 6e 63 43 62 0a 20 script xSyncCb.
de30: 20 70 72 6f 63 20 78 53 79 6e 63 43 62 20 7b 61 proc xSyncCb {a
de40: 72 67 73 7d 20 7b 69 6e 63 72 20 3a 3a 73 79 6e rgs} {incr ::syn
de50: 63 63 6f 75 6e 74 7d 0a 20 20 73 65 74 20 3a 3a ccount}. set ::
de60: 73 79 6e 63 63 6f 75 6e 74 20 30 0a 20 20 73 71 synccount 0. sq
de70: 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 lite3 db test.db
de80: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 . execsql {.
de90: 20 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e PRAGMA synchron
dea0: 6f 75 73 20 3d 20 6f 66 66 3b 0a 20 20 20 20 50 ous = off;. P
deb0: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f RAGMA journal_mo
dec0: 64 65 20 3d 20 57 41 4c 3b 0a 20 20 20 20 49 4e de = WAL;. IN
ded0: 53 45 52 54 20 49 4e 54 4f 20 6b 6f 20 44 45 46 SERT INTO ko DEF
dee0: 41 55 4c 54 20 56 41 4c 55 45 53 3b 0a 20 20 7d AULT VALUES;. }
def0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41 . execsql { PRA
df00: 47 4d 41 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 GMA wal_checkpoi
df10: 6e 74 20 7d 0a 20 20 73 65 74 20 73 79 6e 63 63 nt }. set syncc
df20: 6f 75 6e 74 0a 7d 20 7b 30 7d 0a 64 62 20 63 6c ount.} {0}.db cl
df30: 6f 73 65 0a 74 76 20 64 65 6c 65 74 65 0a 0a 23 ose.tv delete..#
df40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
df50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
df60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
df70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
df80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 ---------.# Test
df90: 73 20 66 6f 72 20 63 68 61 6e 67 69 6e 67 20 6a s for changing j
dfa0: 6f 75 72 6e 61 6c 20 6d 6f 64 65 2e 0a 23 0a 23 ournal mode..#.#
dfb0: 20 20 20 70 61 67 65 72 31 2d 32 33 2e 31 2e 2a pager1-23.1.*
dfc0: 3a 20 54 65 73 74 20 74 68 61 74 20 77 68 65 6e : Test that when
dfd0: 20 63 68 61 6e 67 69 6e 67 20 66 72 6f 6d 20 50 changing from P
dfe0: 45 52 53 49 53 54 20 74 6f 20 44 45 4c 45 54 45 ERSIST to DELETE
dff0: 20 6d 6f 64 65 2c 0a 23 20 20 20 20 20 20 20 20 mode,.#
e000: 20 20 20 20 20 20 20 20 20 20 74 68 65 20 6a 6f the jo
e010: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 64 65 urnal file is de
e020: 6c 65 74 65 64 2e 0a 23 0a 23 20 20 20 70 61 67 leted..#.# pag
e030: 65 72 31 2d 32 33 2e 32 2e 2a 3a 20 53 61 6d 65 er1-23.2.*: Same
e040: 20 74 65 73 74 20 61 73 20 61 62 6f 76 65 2c 20 test as above,
e050: 62 75 74 20 77 68 69 6c 65 20 61 20 73 68 61 72 but while a shar
e060: 65 64 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 0a ed lock is held.
e070: 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 #
e080: 20 20 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 on the databa
e090: 73 65 20 66 69 6c 65 2e 0a 23 0a 23 20 20 20 70 se file..#.# p
e0a0: 61 67 65 72 31 2d 32 33 2e 33 2e 2a 3a 20 53 61 ager1-23.3.*: Sa
e0b0: 6d 65 20 74 65 73 74 20 61 73 20 61 62 6f 76 65 me test as above
e0c0: 2c 20 62 75 74 20 77 68 69 6c 65 20 61 20 72 65 , but while a re
e0d0: 73 65 72 76 65 64 20 6c 6f 63 6b 20 69 73 20 68 served lock is h
e0e0: 65 6c 64 0a 23 20 20 20 20 20 20 20 20 20 20 20 eld.#
e0f0: 20 20 20 20 20 20 20 6f 6e 20 74 68 65 20 64 61 on the da
e100: 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 23 0a 23 tabase file..#.#
e110: 20 20 20 70 61 67 65 72 31 2d 32 33 2e 34 2e 2a pager1-23.4.*
e120: 3a 20 41 6e 64 2c 20 66 6f 72 20 66 75 6e 2c 20 : And, for fun,
e130: 77 68 69 6c 65 20 68 6f 6c 64 69 6e 67 20 61 6e while holding an
e140: 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e exclusive lock.
e150: 0a 23 0a 23 20 20 20 70 61 67 65 72 31 2d 32 33 .#.# pager1-23
e160: 2e 35 2e 2a 3a 20 54 72 79 20 74 6f 20 73 65 74 .5.*: Try to set
e170: 20 76 61 72 69 6f 75 73 20 64 69 66 66 65 72 65 various differe
e180: 6e 74 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 73 nt journal modes
e190: 20 77 69 74 68 20 61 6e 0a 23 20 20 20 20 20 20 with an.#
e1a0: 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 2d 6d in-m
e1b0: 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 28 emory database (
e1c0: 6f 6e 6c 79 20 4d 45 4d 4f 52 59 20 61 6e 64 20 only MEMORY and
e1d0: 4f 46 46 20 73 68 6f 75 6c 64 20 77 6f 72 6b 29 OFF should work)
e1e0: 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 ..#.do_test page
e1f0: 72 31 2d 32 33 2e 31 2e 31 20 7b 0a 20 20 66 61 r1-23.1.1 {. fa
e200: 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e ultsim_delete_an
e210: 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65 63 73 d_reopen. execs
e220: 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 ql {. PRAGMA
e230: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 50 journal_mode = P
e240: 45 52 53 49 53 54 3b 0a 20 20 20 20 43 52 45 41 ERSIST;. CREA
e250: 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 TE TABLE t1(a, b
e260: 29 3b 0a 20 20 7d 0a 20 20 66 69 6c 65 20 65 78 );. }. file ex
e270: 69 73 74 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 ists test.db-jou
e280: 72 6e 61 6c 0a 7d 20 7b 31 7d 0a 64 6f 5f 74 65 rnal.} {1}.do_te
e290: 73 74 20 70 61 67 65 72 31 2d 32 33 2e 31 2e 32 st pager1-23.1.2
e2a0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 50 {. execsql { P
e2b0: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f RAGMA journal_mo
e2c0: 64 65 20 3d 20 44 45 4c 45 54 45 20 7d 0a 20 20 de = DELETE }.
e2d0: 66 69 6c 65 20 65 78 69 73 74 73 20 74 65 73 74 file exists test
e2e0: 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 7d 20 7b 30 .db-journal.} {0
e2f0: 7d 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 }..do_test pager
e300: 31 2d 32 33 2e 32 2e 31 20 7b 0a 20 20 65 78 65 1-23.2.1 {. exe
e310: 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d csql {. PRAGM
e320: 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d A journal_mode =
e330: 20 50 45 52 53 49 53 54 3b 0a 20 20 20 20 49 4e PERSIST;. IN
e340: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c SERT INTO t1 VAL
e350: 55 45 53 28 27 43 61 6e 62 65 72 72 61 27 2c 20 UES('Canberra',
e360: 27 41 43 54 27 29 3b 0a 20 20 7d 0a 20 20 64 62 'ACT');. }. db
e370: 20 65 76 61 6c 20 7b 20 53 45 4c 45 43 54 20 2a eval { SELECT *
e380: 20 46 52 4f 4d 20 74 31 20 7d 20 7b 0a 20 20 20 FROM t1 } {.
e390: 20 64 62 20 65 76 61 6c 20 7b 20 50 52 41 47 4d db eval { PRAGM
e3a0: 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d A journal_mode =
e3b0: 20 44 45 4c 45 54 45 20 7d 0a 20 20 7d 0a 20 20 DELETE }. }.
e3c0: 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 execsql { PRAGMA
e3d0: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 7d 0a journal_mode }.
e3e0: 7d 20 7b 64 65 6c 65 74 65 7d 0a 64 6f 5f 74 65 } {delete}.do_te
e3f0: 73 74 20 70 61 67 65 72 31 2d 32 33 2e 32 2e 32 st pager1-23.2.2
e400: 20 7b 0a 20 20 66 69 6c 65 20 65 78 69 73 74 73 {. file exists
e410: 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c test.db-journal
e420: 0a 7d 20 7b 30 7d 0a 0a 64 6f 5f 74 65 73 74 20 .} {0}..do_test
e430: 70 61 67 65 72 31 2d 32 33 2e 33 2e 31 20 7b 0a pager1-23.3.1 {.
e440: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 execsql {.
e450: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d PRAGMA journal_m
e460: 6f 64 65 20 3d 20 50 45 52 53 49 53 54 3b 0a 20 ode = PERSIST;.
e470: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 INSERT INTO t
e480: 31 20 56 41 4c 55 45 53 28 27 44 61 72 77 69 6e 1 VALUES('Darwin
e490: 27 2c 20 27 4e 54 27 29 3b 0a 20 20 20 20 42 45 ', 'NT');. BE
e4a0: 47 49 4e 20 49 4d 4d 45 44 49 41 54 45 3b 0a 20 GIN IMMEDIATE;.
e4b0: 20 7d 0a 20 20 64 62 20 65 76 61 6c 20 7b 20 50 }. db eval { P
e4c0: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f RAGMA journal_mo
e4d0: 64 65 20 3d 20 44 45 4c 45 54 45 20 7d 0a 20 20 de = DELETE }.
e4e0: 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 execsql { PRAGMA
e4f0: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 7d 0a journal_mode }.
e500: 7d 20 7b 64 65 6c 65 74 65 7d 0a 64 6f 5f 74 65 } {delete}.do_te
e510: 73 74 20 70 61 67 65 72 31 2d 32 33 2e 33 2e 32 st pager1-23.3.2
e520: 20 7b 0a 20 20 66 69 6c 65 20 65 78 69 73 74 73 {. file exists
e530: 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c test.db-journal
e540: 0a 7d 20 7b 30 7d 0a 64 6f 5f 74 65 73 74 20 70 .} {0}.do_test p
e550: 61 67 65 72 31 2d 32 33 2e 33 2e 33 20 7b 0a 20 ager1-23.3.3 {.
e560: 20 65 78 65 63 73 71 6c 20 43 4f 4d 4d 49 54 0a execsql COMMIT.
e570: 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74 20 70 61 } {}..do_test pa
e580: 67 65 72 31 2d 32 33 2e 34 2e 31 20 7b 0a 20 20 ger1-23.4.1 {.
e590: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 execsql {. PR
e5a0: 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 AGMA journal_mod
e5b0: 65 20 3d 20 50 45 52 53 49 53 54 3b 0a 20 20 20 e = PERSIST;.
e5c0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 INSERT INTO t1
e5d0: 56 41 4c 55 45 53 28 27 41 64 65 6c 61 69 64 65 VALUES('Adelaide
e5e0: 27 2c 20 27 53 41 27 29 3b 0a 20 20 20 20 42 45 ', 'SA');. BE
e5f0: 47 49 4e 20 45 58 43 4c 55 53 49 56 45 3b 0a 20 GIN EXCLUSIVE;.
e600: 20 7d 0a 20 20 64 62 20 65 76 61 6c 20 7b 20 50 }. db eval { P
e610: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f RAGMA journal_mo
e620: 64 65 20 3d 20 44 45 4c 45 54 45 20 7d 0a 20 20 de = DELETE }.
e630: 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 execsql { PRAGMA
e640: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 7d 0a journal_mode }.
e650: 7d 20 7b 64 65 6c 65 74 65 7d 0a 64 6f 5f 74 65 } {delete}.do_te
e660: 73 74 20 70 61 67 65 72 31 2d 32 33 2e 34 2e 32 st pager1-23.4.2
e670: 20 7b 0a 20 20 66 69 6c 65 20 65 78 69 73 74 73 {. file exists
e680: 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c test.db-journal
e690: 0a 7d 20 7b 30 7d 0a 64 6f 5f 74 65 73 74 20 70 .} {0}.do_test p
e6a0: 61 67 65 72 31 2d 32 33 2e 34 2e 33 20 7b 0a 20 ager1-23.4.3 {.
e6b0: 20 65 78 65 63 73 71 6c 20 43 4f 4d 4d 49 54 0a execsql COMMIT.
e6c0: 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74 20 70 61 } {}..do_test pa
e6d0: 67 65 72 31 2d 32 33 2e 35 2e 31 20 7b 0a 20 20 ger1-23.5.1 {.
e6e0: 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f faultsim_delete_
e6f0: 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 73 71 6c and_reopen. sql
e700: 69 74 65 33 20 64 62 20 3a 6d 65 6d 6f 72 79 3a ite3 db :memory:
e710: 0a 7d 20 7b 7d 0a 66 6f 72 65 61 63 68 20 7b 74 .} {}.foreach {t
e720: 6e 20 6d 6f 64 65 20 70 6f 73 73 69 62 6c 65 7d n mode possible}
e730: 20 7b 0a 20 20 32 20 20 6f 66 66 20 20 20 20 20 {. 2 off
e740: 20 31 0a 20 20 33 20 20 6d 65 6d 6f 72 79 20 20 1. 3 memory
e750: 20 31 0a 20 20 34 20 20 70 65 72 73 69 73 74 20 1. 4 persist
e760: 20 30 0a 20 20 35 20 20 64 65 6c 65 74 65 20 20 0. 5 delete
e770: 20 30 0a 20 20 36 20 20 77 61 6c 20 20 20 20 20 0. 6 wal
e780: 20 30 0a 20 20 37 20 20 74 72 75 6e 63 61 74 65 0. 7 truncate
e790: 20 30 0a 7d 20 7b 0a 20 20 64 6f 5f 74 65 73 74 0.} {. do_test
e7a0: 20 70 61 67 65 72 31 2d 32 33 2e 35 2e 24 74 6e pager1-23.5.$tn
e7b0: 2e 31 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c .1 {. execsql
e7c0: 20 22 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c "PRAGMA journal
e7d0: 5f 6d 6f 64 65 20 3d 20 6f 66 66 22 0a 20 20 20 _mode = off".
e7e0: 20 65 78 65 63 73 71 6c 20 22 50 52 41 47 4d 41 execsql "PRAGMA
e7f0: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 journal_mode =
e800: 24 6d 6f 64 65 22 0a 20 20 7d 20 5b 69 66 20 24 $mode". } [if $
e810: 70 6f 73 73 69 62 6c 65 20 7b 6c 69 73 74 20 24 possible {list $
e820: 6d 6f 64 65 7d 20 7b 6c 69 73 74 20 6f 66 66 7d mode} {list off}
e830: 5d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 ]. do_test page
e840: 72 31 2d 32 33 2e 35 2e 24 74 6e 2e 32 20 7b 0a r1-23.5.$tn.2 {.
e850: 20 20 20 20 65 78 65 63 73 71 6c 20 22 50 52 41 execsql "PRA
e860: 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 GMA journal_mode
e870: 20 3d 20 6d 65 6d 6f 72 79 22 0a 20 20 20 20 65 = memory". e
e880: 78 65 63 73 71 6c 20 22 50 52 41 47 4d 41 20 6a xecsql "PRAGMA j
e890: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 24 6d ournal_mode = $m
e8a0: 6f 64 65 22 0a 20 20 7d 20 5b 69 66 20 24 70 6f ode". } [if $po
e8b0: 73 73 69 62 6c 65 20 7b 6c 69 73 74 20 24 6d 6f ssible {list $mo
e8c0: 64 65 7d 20 7b 6c 69 73 74 20 6d 65 6d 6f 72 79 de} {list memory
e8d0: 7d 5d 0a 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 }].}.do_test pag
e8e0: 65 72 31 2d 32 33 2e 38 2e 31 20 7b 0a 20 20 65 er1-23.8.1 {. e
e8f0: 78 65 63 73 71 6c 20 7b 50 52 41 47 4d 41 20 6c xecsql {PRAGMA l
e900: 6f 63 6b 69 6e 67 5f 6d 6f 64 65 20 3d 20 6e 6f ocking_mode = no
e910: 72 6d 61 6c 7d 0a 7d 20 7b 65 78 63 6c 75 73 69 rmal}.} {exclusi
e920: 76 65 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 ve}.do_test page
e930: 72 31 2d 32 33 2e 38 2e 32 20 7b 0a 20 20 65 78 r1-23.8.2 {. ex
e940: 65 63 73 71 6c 20 7b 50 52 41 47 4d 41 20 6c 6f ecsql {PRAGMA lo
e950: 63 6b 69 6e 67 5f 6d 6f 64 65 20 3d 20 65 78 63 cking_mode = exc
e960: 6c 75 73 69 76 65 7d 0a 7d 20 7b 65 78 63 6c 75 lusive}.} {exclu
e970: 73 69 76 65 7d 0a 64 6f 5f 74 65 73 74 20 70 61 sive}.do_test pa
e980: 67 65 72 31 2d 32 33 2e 38 2e 33 20 7b 0a 20 20 ger1-23.8.3 {.
e990: 65 78 65 63 73 71 6c 20 7b 50 52 41 47 4d 41 20 execsql {PRAGMA
e9a0: 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 7d 0a 7d 20 locking_mode}.}
e9b0: 7b 65 78 63 6c 75 73 69 76 65 7d 0a 64 6f 5f 74 {exclusive}.do_t
e9c0: 65 73 74 20 70 61 67 65 72 31 2d 32 33 2e 38 2e est pager1-23.8.
e9d0: 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 50 4 {. execsql {P
e9e0: 52 41 47 4d 41 20 6d 61 69 6e 2e 6c 6f 63 6b 69 RAGMA main.locki
e9f0: 6e 67 5f 6d 6f 64 65 7d 0a 7d 20 7b 65 78 63 6c ng_mode}.} {excl
ea00: 75 73 69 76 65 7d 0a 0a 0a 66 69 6e 69 73 68 5f usive}...finish_
ea10: 74 65 73 74 0a 0a test..