/ Hex Artifact Content
Login

Artifact 28709653e83ce9557a983cce251ff02112d5ecca:


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: 7d 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 70 61  } {.  do_test pa
25e0: 67 65 72 31 2d 33 2e 24 74 6e 2e 31 20 7b 0a 20  ger1-3.$tn.1 {. 
25f0: 20 20 20 65 76 61 6c 20 24 74 63 6c 0a 20 20 20     eval $tcl.   
2600: 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65   faultsim_delete
2610: 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 20 20  _and_reopen.    
2620: 64 62 20 66 75 6e 63 20 61 5f 73 74 72 69 6e 67  db func a_string
2630: 20 61 5f 73 74 72 69 6e 67 0a 20 20 20 20 65 78   a_string.    ex
2640: 65 63 73 71 6c 20 24 73 71 6c 0a 20 20 20 20 65  ecsql $sql.    e
2650: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 50  xecsql {.      P
2660: 52 41 47 4d 41 20 61 75 74 6f 5f 76 61 63 75 75  RAGMA auto_vacuu
2670: 6d 20 3d 20 32 3b 0a 20 20 20 20 20 20 50 52 41  m = 2;.      PRA
2680: 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 20 3d  GMA cache_size =
2690: 20 31 30 3b 0a 20 20 20 20 20 20 43 52 45 41 54   10;.      CREAT
26a0: 45 20 54 41 42 4c 45 20 7a 28 78 20 49 4e 54 45  E TABLE z(x INTE
26b0: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  GER PRIMARY KEY,
26c0: 20 79 29 3b 0a 20 20 20 20 20 20 42 45 47 49 4e   y);.      BEGIN
26d0: 3b 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54  ;.        INSERT
26e0: 20 49 4e 54 4f 20 7a 20 56 41 4c 55 45 53 28 4e   INTO z VALUES(N
26f0: 55 4c 4c 2c 20 61 5f 73 74 72 69 6e 67 28 38 30  ULL, a_string(80
2700: 30 29 29 3b 0a 20 20 20 20 20 20 20 20 49 4e 53  0));.        INS
2710: 45 52 54 20 49 4e 54 4f 20 7a 20 53 45 4c 45 43  ERT INTO z SELEC
2720: 54 20 4e 55 4c 4c 2c 20 61 5f 73 74 72 69 6e 67  T NULL, a_string
2730: 28 38 30 30 29 20 46 52 4f 4d 20 7a 3b 20 20 20  (800) FROM z;   
2740: 20 20 2d 2d 20 20 20 32 0a 20 20 20 20 20 20 20    --   2.       
2750: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a 20 53   INSERT INTO z S
2760: 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 61 5f 73 74  ELECT NULL, a_st
2770: 72 69 6e 67 28 38 30 30 29 20 46 52 4f 4d 20 7a  ring(800) FROM z
2780: 3b 20 20 20 20 20 2d 2d 20 20 20 34 0a 20 20 20  ;     --   4.   
2790: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
27a0: 20 7a 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20   z SELECT NULL, 
27b0: 61 5f 73 74 72 69 6e 67 28 38 30 30 29 20 46 52  a_string(800) FR
27c0: 4f 4d 20 7a 3b 20 20 20 20 20 2d 2d 20 20 20 38  OM z;     --   8
27d0: 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20  .        INSERT 
27e0: 49 4e 54 4f 20 7a 20 53 45 4c 45 43 54 20 4e 55  INTO z SELECT NU
27f0: 4c 4c 2c 20 61 5f 73 74 72 69 6e 67 28 38 30 30  LL, a_string(800
2800: 29 20 46 52 4f 4d 20 7a 3b 20 20 20 20 20 2d 2d  ) FROM z;     --
2810: 20 20 31 36 0a 20 20 20 20 20 20 20 20 49 4e 53    16.        INS
2820: 45 52 54 20 49 4e 54 4f 20 7a 20 53 45 4c 45 43  ERT INTO z SELEC
2830: 54 20 4e 55 4c 4c 2c 20 61 5f 73 74 72 69 6e 67  T NULL, a_string
2840: 28 38 30 30 29 20 46 52 4f 4d 20 7a 3b 20 20 20  (800) FROM z;   
2850: 20 20 2d 2d 20 20 33 32 0a 20 20 20 20 20 20 20    --  32.       
2860: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a 20 53   INSERT INTO z S
2870: 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 61 5f 73 74  ELECT NULL, a_st
2880: 72 69 6e 67 28 38 30 30 29 20 46 52 4f 4d 20 7a  ring(800) FROM z
2890: 3b 20 20 20 20 20 2d 2d 20 20 36 34 0a 20 20 20  ;     --  64.   
28a0: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
28b0: 20 7a 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20   z SELECT NULL, 
28c0: 61 5f 73 74 72 69 6e 67 28 38 30 30 29 20 46 52  a_string(800) FR
28d0: 4f 4d 20 7a 3b 20 20 20 20 20 2d 2d 20 31 32 38  OM z;     -- 128
28e0: 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20  .        INSERT 
28f0: 49 4e 54 4f 20 7a 20 53 45 4c 45 43 54 20 4e 55  INTO z SELECT NU
2900: 4c 4c 2c 20 61 5f 73 74 72 69 6e 67 28 38 30 30  LL, a_string(800
2910: 29 20 46 52 4f 4d 20 7a 3b 20 20 20 20 20 2d 2d  ) FROM z;     --
2920: 20 32 35 36 0a 20 20 20 20 20 20 43 4f 4d 4d 49   256.      COMMI
2930: 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 78 65  T;.    }.    exe
2940: 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 61 75  csql { PRAGMA au
2950: 74 6f 5f 76 61 63 75 75 6d 20 7d 0a 20 20 7d 20  to_vacuum }.  } 
2960: 7b 32 7d 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c  {2}.  do_execsql
2970: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 33 2e 24  _test pager1-3.$
2980: 74 6e 2e 32 20 7b 0a 20 20 20 20 42 45 47 49 4e  tn.2 {.    BEGIN
2990: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
29a0: 4e 54 4f 20 7a 20 56 41 4c 55 45 53 28 4e 55 4c  NTO z VALUES(NUL
29b0: 4c 2c 20 61 5f 73 74 72 69 6e 67 28 38 30 30 29  L, a_string(800)
29c0: 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  );.      INSERT 
29d0: 49 4e 54 4f 20 7a 20 56 41 4c 55 45 53 28 4e 55  INTO z VALUES(NU
29e0: 4c 4c 2c 20 61 5f 73 74 72 69 6e 67 28 38 30 30  LL, a_string(800
29f0: 29 29 3b 0a 20 20 20 20 20 20 53 41 56 45 50 4f  ));.      SAVEPO
2a00: 49 4e 54 20 6f 6e 65 3b 0a 20 20 20 20 20 20 20  INT one;.       
2a10: 20 55 50 44 41 54 45 20 7a 20 53 45 54 20 79 20   UPDATE z SET y 
2a20: 3d 20 4e 55 4c 4c 20 57 48 45 52 45 20 78 3e 32  = NULL WHERE x>2
2a30: 35 36 3b 0a 20 20 20 20 20 20 20 20 50 52 41 47  56;.        PRAG
2a40: 4d 41 20 69 6e 63 72 65 6d 65 6e 74 61 6c 5f 76  MA incremental_v
2a50: 61 63 75 75 6d 3b 0a 20 20 20 20 20 20 20 20 53  acuum;.        S
2a60: 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
2a70: 52 4f 4d 20 7a 20 57 48 45 52 45 20 78 20 3c 20  ROM z WHERE x < 
2a80: 31 30 30 3b 0a 20 20 20 20 20 20 52 4f 4c 4c 42  100;.      ROLLB
2a90: 41 43 4b 20 54 4f 20 6f 6e 65 3b 0a 20 20 20 20  ACK TO one;.    
2aa0: 43 4f 4d 4d 49 54 3b 0a 20 20 7d 20 7b 39 39 7d  COMMIT;.  } {99}
2ab0: 0a 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74  ..  do_execsql_t
2ac0: 65 73 74 20 70 61 67 65 72 31 2d 33 2e 24 74 6e  est pager1-3.$tn
2ad0: 2e 33 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a  .3 {.    BEGIN;.
2ae0: 20 20 20 20 20 20 53 41 56 45 50 4f 49 4e 54 20        SAVEPOINT 
2af0: 6f 6e 65 3b 0a 20 20 20 20 20 20 20 20 55 50 44  one;.        UPD
2b00: 41 54 45 20 7a 20 53 45 54 20 79 20 3d 20 79 7c  ATE z SET y = y|
2b10: 7c 78 3b 0a 20 20 20 20 20 20 52 4f 4c 4c 42 41  |x;.      ROLLBA
2b20: 43 4b 20 54 4f 20 6f 6e 65 3b 0a 20 20 20 20 43  CK TO one;.    C
2b30: 4f 4d 4d 49 54 3b 0a 20 20 20 20 53 45 4c 45 43  OMMIT;.    SELEC
2b40: 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
2b50: 7a 3b 0a 20 20 7d 20 7b 32 35 38 7d 0a 0a 20 20  z;.  } {258}..  
2b60: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
2b70: 70 61 67 65 72 31 2d 33 2e 24 74 6e 2e 34 20 7b  pager1-3.$tn.4 {
2b80: 0a 20 20 20 20 53 41 56 45 50 4f 49 4e 54 20 6f  .    SAVEPOINT o
2b90: 6e 65 3b 0a 20 20 20 20 20 20 55 50 44 41 54 45  ne;.      UPDATE
2ba0: 20 7a 20 53 45 54 20 79 20 3d 20 79 7c 7c 78 3b   z SET y = y||x;
2bb0: 0a 20 20 20 20 52 4f 4c 4c 42 41 43 4b 20 54 4f  .    ROLLBACK TO
2bc0: 20 6f 6e 65 3b 0a 20 20 7d 20 7b 7d 0a 20 20 64   one;.  } {}.  d
2bd0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70  o_execsql_test p
2be0: 61 67 65 72 31 2d 33 2e 24 74 6e 2e 35 20 7b 0a  ager1-3.$tn.5 {.
2bf0: 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74      SELECT count
2c00: 28 2a 29 20 46 52 4f 4d 20 7a 3b 0a 20 20 20 20  (*) FROM z;.    
2c10: 52 45 4c 45 41 53 45 20 6f 6e 65 3b 0a 20 20 20  RELEASE one;.   
2c20: 20 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74   PRAGMA integrit
2c30: 79 5f 63 68 65 63 6b 3b 0a 20 20 7d 20 7b 32 35  y_check;.  } {25
2c40: 38 20 6f 6b 7d 0a 0a 20 20 64 62 20 63 6c 6f 73  8 ok}..  db clos
2c50: 65 0a 20 20 63 61 74 63 68 20 7b 20 74 76 20 64  e.  catch { tv d
2c60: 65 6c 65 74 65 20 7d 0a 7d 0a 0a 23 2d 2d 2d 2d  elete }.}..#----
2c70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2c80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2c90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2cb0: 2d 2d 2d 2d 2d 0a 23 20 48 6f 74 20 6a 6f 75 72  -----.# Hot jour
2cc0: 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 72 65 6c  nal rollback rel
2cd0: 61 74 65 64 20 74 65 73 74 20 63 61 73 65 73 2e  ated test cases.
2ce0: 0a 23 0a 23 20 70 61 67 65 72 31 2e 34 2e 31 2e  .#.# pager1.4.1.
2cf0: 2a 3a 20 54 65 73 74 20 74 68 61 74 20 74 68 65  *: Test that the
2d00: 20 70 61 67 65 72 20 6d 6f 64 75 6c 65 20 64 65   pager module de
2d10: 6c 65 74 65 73 20 76 65 72 79 20 73 6d 61 6c 6c  letes very small
2d20: 20 69 6e 76 61 6c 69 64 0a 23 20 20 20 20 20 20   invalid.#      
2d30: 20 20 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c           journal
2d40: 20 66 69 6c 65 73 2e 0a 23 0a 23 20 70 61 67 65   files..#.# page
2d50: 72 31 2e 34 2e 32 2e 2a 3a 20 54 65 73 74 20 74  r1.4.2.*: Test t
2d60: 68 61 74 20 69 66 20 74 68 65 20 6d 61 73 74 65  hat if the maste
2d70: 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65  r journal pointe
2d80: 72 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  r at the end of 
2d90: 61 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20  a.#             
2da0: 20 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69    hot-journal fi
2db0: 6c 65 20 61 70 70 65 61 72 73 20 74 6f 20 62 65  le appears to be
2dc0: 20 63 6f 72 72 75 70 74 20 28 63 68 65 63 6b 73   corrupt (checks
2dd0: 75 6d 20 64 6f 65 73 20 6e 6f 74 0a 23 20 20 20  um does not.#   
2de0: 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6d 70              comp
2df0: 75 74 65 29 20 74 68 65 20 61 73 73 6f 63 69 61  ute) the associa
2e00: 74 65 64 20 6a 6f 75 72 6e 61 6c 20 69 73 20 72  ted journal is r
2e10: 6f 6c 6c 65 64 20 62 61 63 6b 20 28 61 6e 64 20  olled back (and 
2e20: 6e 6f 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  no.#            
2e30: 20 20 20 78 41 63 63 65 73 73 28 29 20 63 61 6c     xAccess() cal
2e40: 6c 20 74 6f 20 63 68 65 63 6b 20 66 6f 72 20 74  l to check for t
2e50: 68 65 20 70 72 65 73 65 6e 63 65 20 6f 66 20 61  he presence of a
2e60: 6e 79 20 6d 61 73 74 65 72 20 0a 23 20 20 20 20  ny master .#    
2e70: 20 20 20 20 20 20 20 20 20 20 20 6a 6f 75 72 6e             journ
2e80: 61 6c 20 66 69 6c 65 20 69 73 20 6d 61 64 65 29  al file is made)
2e90: 2e 0a 23 0a 23 20 70 61 67 65 72 31 2e 34 2e 33  ..#.# pager1.4.3
2ea0: 2e 2a 3a 20 54 65 73 74 20 74 68 61 74 20 74 68  .*: Test that th
2eb0: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61 20  e contents of a 
2ec0: 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 61 72 65 20  hot-journal are 
2ed0: 69 67 6e 6f 72 65 64 20 69 66 20 74 68 65 0a 23  ignored if the.#
2ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
2ef0: 61 67 65 2d 73 69 7a 65 20 6f 72 20 73 65 63 74  age-size or sect
2f00: 6f 72 2d 73 69 7a 65 20 69 6e 20 74 68 65 20 6a  or-size in the j
2f10: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 61 70  ournal header ap
2f20: 70 65 61 72 20 74 6f 0a 23 20 20 20 20 20 20 20  pear to.#       
2f30: 20 20 20 20 20 20 20 20 62 65 20 69 6e 76 61 6c          be inval
2f40: 69 64 20 28 74 6f 6f 20 6c 61 72 67 65 2c 20 74  id (too large, t
2f50: 6f 6f 20 73 6d 61 6c 6c 20 6f 72 20 6e 6f 74 20  oo small or not 
2f60: 61 20 70 6f 77 65 72 20 6f 66 20 32 29 2e 0a 23  a power of 2)..#
2f70: 0a 23 20 70 61 67 65 72 31 2e 34 2e 34 2e 2a 3a  .# pager1.4.4.*:
2f80: 20 54 65 73 74 20 68 6f 74 2d 6a 6f 75 72 6e 61   Test hot-journa
2f90: 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 6a 6f  l rollback of jo
2fa0: 75 72 6e 61 6c 20 66 69 6c 65 20 77 69 74 68 20  urnal file with 
2fb0: 61 20 6d 61 73 74 65 72 0a 23 20 20 20 20 20 20  a master.#      
2fc0: 20 20 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c           journal
2fd0: 20 70 6f 69 6e 74 65 72 20 67 65 6e 65 72 61 74   pointer generat
2fe0: 65 64 20 69 6e 20 76 61 72 69 6f 75 73 20 22 50  ed in various "P
2ff0: 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75  RAGMA synchronou
3000: 73 22 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  s".#            
3010: 20 20 20 6d 6f 64 65 73 2e 0a 23 0a 23 20 70 61     modes..#.# pa
3020: 67 65 72 31 2e 34 2e 35 2e 2a 3a 20 54 65 73 74  ger1.4.5.*: Test
3030: 20 74 68 61 74 20 68 6f 74 2d 6a 6f 75 72 6e 61   that hot-journa
3040: 6c 20 72 6f 6c 6c 62 61 63 6b 20 73 74 6f 70 73  l rollback stops
3050: 20 69 66 20 69 74 20 65 6e 63 6f 75 6e 74 65 72   if it encounter
3060: 73 20 61 0a 23 20 20 20 20 20 20 20 20 20 20 20  s a.#           
3070: 20 20 20 20 6a 6f 75 72 6e 61 6c 2d 72 65 63 6f      journal-reco
3080: 72 64 20 66 6f 72 20 77 68 69 63 68 20 74 68 65  rd for which the
3090: 20 63 68 65 63 6b 73 75 6d 20 66 61 69 6c 73 2e   checksum fails.
30a0: 0a 23 0a 23 20 70 61 67 65 72 31 2e 34 2e 36 2e  .#.# pager1.4.6.
30b0: 2a 3a 20 54 65 73 74 20 74 68 61 74 20 77 68 65  *: Test that whe
30c0: 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61  n rolling back a
30d0: 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 74 68 61   hot-journal tha
30e0: 74 20 63 6f 6e 74 61 69 6e 73 20 61 0a 23 20 20  t contains a.#  
30f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 61 73               mas
3100: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  ter journal poin
3110: 74 65 72 2c 20 74 68 65 20 6d 61 73 74 65 72 20  ter, the master 
3120: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
3130: 64 65 6c 65 74 65 64 0a 23 20 20 20 20 20 20 20  deleted.#       
3140: 20 20 20 20 20 20 20 20 61 66 74 65 72 20 61 6c          after al
3150: 6c 20 74 68 65 20 68 6f 74 2d 6a 6f 75 72 6e 61  l the hot-journa
3160: 6c 73 20 74 68 61 74 20 72 65 66 65 72 20 74 6f  ls that refer to
3170: 20 69 74 20 61 72 65 20 64 65 6c 65 74 65 64 2e   it are deleted.
3180: 0a 23 0a 23 20 70 61 67 65 72 31 2e 34 2e 37 2e  .#.# pager1.4.7.
3190: 2a 3a 20 54 65 73 74 20 74 68 61 74 20 69 66 20  *: Test that if 
31a0: 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69  a hot-journal fi
31b0: 6c 65 20 65 78 69 73 74 73 20 62 75 74 20 61 20  le exists but a 
31c0: 63 6c 69 65 6e 74 20 63 61 6e 0a 23 20 20 20 20  client can.#    
31d0: 20 20 20 20 20 20 20 20 20 20 20 6f 70 65 6e 20             open 
31e0: 69 74 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f  it for reading o
31f0: 6e 6c 79 2c 20 74 68 65 20 64 61 74 61 62 61 73  nly, the databas
3200: 65 20 63 61 6e 6e 6f 74 20 62 65 20 61 63 63 65  e cannot be acce
3210: 73 73 65 64 20 61 6e 64 0a 23 20 20 20 20 20 20  ssed and.#      
3220: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
3230: 43 41 4e 54 4f 50 45 4e 20 69 73 20 72 65 74 75  CANTOPEN is retu
3240: 72 6e 65 64 2e 0a 23 20 0a 64 6f 5f 74 65 73 74  rned..# .do_test
3250: 20 70 61 67 65 72 31 2e 34 2e 31 2e 31 20 7b 0a   pager1.4.1.1 {.
3260: 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74    faultsim_delet
3270: 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65  e_and_reopen.  e
3280: 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 43 52  xecsql { .    CR
3290: 45 41 54 45 20 54 41 42 4c 45 20 78 28 79 2c 20  EATE TABLE x(y, 
32a0: 7a 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  z);.    INSERT I
32b0: 4e 54 4f 20 78 20 56 41 4c 55 45 53 28 31 2c 20  NTO x VALUES(1, 
32c0: 32 29 3b 0a 20 20 7d 0a 20 20 73 65 74 20 66 64  2);.  }.  set fd
32d0: 20 5b 6f 70 65 6e 20 74 65 73 74 2e 64 62 2d 6a   [open test.db-j
32e0: 6f 75 72 6e 61 6c 20 77 5d 0a 20 20 70 75 74 73  ournal w].  puts
32f0: 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 24 66 64 20   -nonewline $fd 
3300: 22 68 65 6c 6c 6f 77 6f 72 6c 64 22 0a 20 20 63  "helloworld".  c
3310: 6c 6f 73 65 20 24 66 64 0a 20 20 66 69 6c 65 20  lose $fd.  file 
3320: 65 78 69 73 74 73 20 74 65 73 74 2e 64 62 2d 6a  exists test.db-j
3330: 6f 75 72 6e 61 6c 0a 7d 20 7b 31 7d 0a 64 6f 5f  ournal.} {1}.do_
3340: 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e 31 2e  test pager1.4.1.
3350: 32 20 7b 20 65 78 65 63 73 71 6c 20 7b 20 53 45  2 { execsql { SE
3360: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 78 20 7d 20  LECT * FROM x } 
3370: 7d 20 7b 31 20 32 7d 0a 64 6f 5f 74 65 73 74 20  } {1 2}.do_test 
3380: 70 61 67 65 72 31 2e 34 2e 31 2e 33 20 7b 20 66  pager1.4.1.3 { f
3390: 69 6c 65 20 65 78 69 73 74 73 20 74 65 73 74 2e  ile exists test.
33a0: 64 62 2d 6a 6f 75 72 6e 61 6c 20 7d 20 7b 30 7d  db-journal } {0}
33b0: 0a 0a 23 20 53 65 74 20 75 70 20 61 20 5b 74 65  ..# Set up a [te
33c0: 73 74 76 66 73 5d 20 74 6f 20 73 6e 61 70 73 68  stvfs] to snapsh
33d0: 6f 74 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  ot the file-syst
33e0: 65 6d 20 6a 75 73 74 20 62 65 66 6f 72 65 20 53  em just before S
33f0: 51 4c 69 74 65 0a 23 20 64 65 6c 65 74 65 73 20  QLite.# deletes 
3400: 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e  the master-journ
3410: 61 6c 20 74 6f 20 63 6f 6d 6d 69 74 20 61 20 6d  al to commit a m
3420: 75 6c 74 69 2d 66 69 6c 65 20 74 72 61 6e 73 61  ulti-file transa
3430: 63 74 69 6f 6e 2e 0a 23 0a 23 20 49 6e 20 73 75  ction..#.# In su
3440: 62 73 65 71 75 65 6e 74 20 74 65 73 74 20 63 61  bsequent test ca
3450: 73 65 73 2c 20 69 6e 76 6f 6b 69 6e 67 20 5b 66  ses, invoking [f
3460: 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f  aultsim_restore_
3470: 61 6e 64 5f 72 65 6f 70 65 6e 5d 20 73 65 74 73  and_reopen] sets
3480: 0a 23 20 75 70 20 74 68 65 20 66 69 6c 65 20 73  .# up the file s
3490: 79 73 74 65 6d 20 74 6f 20 63 6f 6e 74 61 69 6e  ystem to contain
34a0: 20 74 77 6f 20 64 61 74 61 62 61 73 65 73 2c 20   two databases, 
34b0: 74 77 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  two hot-journal 
34c0: 66 69 6c 65 73 20 61 6e 64 0a 23 20 61 20 6d 61  files and.# a ma
34d0: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 2e 0a 23 0a  ster-journal..#.
34e0: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34  do_test pager1.4
34f0: 2e 32 2e 31 20 7b 0a 20 20 74 65 73 74 76 66 73  .2.1 {.  testvfs
3500: 20 74 73 74 76 66 73 20 2d 64 65 66 61 75 6c 74   tstvfs -default
3510: 20 31 0a 20 20 74 73 74 76 66 73 20 66 69 6c 74   1.  tstvfs filt
3520: 65 72 20 78 44 65 6c 65 74 65 0a 20 20 74 73 74  er xDelete.  tst
3530: 76 66 73 20 73 63 72 69 70 74 20 78 44 65 6c 65  vfs script xDele
3540: 74 65 43 61 6c 6c 62 61 63 6b 0a 20 20 70 72 6f  teCallback.  pro
3550: 63 20 78 44 65 6c 65 74 65 43 61 6c 6c 62 61 63  c xDeleteCallbac
3560: 6b 20 7b 6d 65 74 68 6f 64 20 66 69 6c 65 20 61  k {method file a
3570: 72 67 73 7d 20 7b 0a 20 20 20 20 73 65 74 20 66  rgs} {.    set f
3580: 69 6c 65 20 5b 66 69 6c 65 20 74 61 69 6c 20 24  ile [file tail $
3590: 66 69 6c 65 5d 0a 20 20 20 20 69 66 20 7b 20 5b  file].    if { [
35a0: 73 74 72 69 6e 67 20 6d 61 74 63 68 20 2a 6d 6a  string match *mj
35b0: 2a 20 24 66 69 6c 65 5d 20 7d 20 7b 20 66 61 75  * $file] } { fau
35c0: 6c 74 73 69 6d 5f 73 61 76 65 20 7d 0a 20 20 7d  ltsim_save }.  }
35d0: 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65  .  faultsim_dele
35e0: 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20  te_and_reopen.  
35f0: 64 62 20 66 75 6e 63 20 61 5f 73 74 72 69 6e 67  db func a_string
3600: 20 61 5f 73 74 72 69 6e 67 0a 20 20 65 78 65 63   a_string.  exec
3610: 73 71 6c 20 7b 0a 20 20 20 20 41 54 54 41 43 48  sql {.    ATTACH
3620: 20 27 74 65 73 74 2e 64 62 32 27 20 41 53 20 61   'test.db2' AS a
3630: 75 78 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a  ux;.    PRAGMA j
3640: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45  ournal_mode = DE
3650: 4c 45 54 45 3b 0a 20 20 20 20 50 52 41 47 4d 41  LETE;.    PRAGMA
3660: 20 6d 61 69 6e 2e 63 61 63 68 65 5f 73 69 7a 65   main.cache_size
3670: 20 3d 20 31 30 3b 0a 20 20 20 20 50 52 41 47 4d   = 10;.    PRAGM
3680: 41 20 61 75 78 2e 63 61 63 68 65 5f 73 69 7a 65  A aux.cache_size
3690: 20 3d 20 31 30 3b 0a 20 20 20 20 43 52 45 41 54   = 10;.    CREAT
36a0: 45 20 54 41 42 4c 45 20 74 31 28 61 20 55 4e 49  E TABLE t1(a UNI
36b0: 51 55 45 2c 20 62 20 55 4e 49 51 55 45 29 3b 0a  QUE, b UNIQUE);.
36c0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
36d0: 20 61 75 78 2e 74 32 28 61 20 55 4e 49 51 55 45   aux.t2(a UNIQUE
36e0: 2c 20 62 20 55 4e 49 51 55 45 29 3b 0a 20 20 20  , b UNIQUE);.   
36f0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
3700: 56 41 4c 55 45 53 28 61 5f 73 74 72 69 6e 67 28  VALUES(a_string(
3710: 32 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 33  200), a_string(3
3720: 30 30 29 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  00));.    INSERT
3730: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
3740: 61 5f 73 74 72 69 6e 67 28 32 30 30 29 2c 20 61  a_string(200), a
3750: 5f 73 74 72 69 6e 67 28 33 30 30 29 20 46 52 4f  _string(300) FRO
3760: 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54  M t1;.    INSERT
3770: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
3780: 61 5f 73 74 72 69 6e 67 28 32 30 30 29 2c 20 61  a_string(200), a
3790: 5f 73 74 72 69 6e 67 28 33 30 30 29 20 46 52 4f  _string(300) FRO
37a0: 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54  M t1;.    INSERT
37b0: 20 49 4e 54 4f 20 74 32 20 53 45 4c 45 43 54 20   INTO t2 SELECT 
37c0: 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 42  * FROM t1;.    B
37d0: 45 47 49 4e 3b 0a 20 20 20 20 20 20 49 4e 53 45  EGIN;.      INSE
37e0: 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
37f0: 54 20 61 5f 73 74 72 69 6e 67 28 32 30 31 29 2c  T a_string(201),
3800: 20 61 5f 73 74 72 69 6e 67 28 33 30 31 29 20 46   a_string(301) F
3810: 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20 49 4e  ROM t1;.      IN
3820: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
3830: 45 43 54 20 61 5f 73 74 72 69 6e 67 28 32 30 32  ECT a_string(202
3840: 29 2c 20 61 5f 73 74 72 69 6e 67 28 33 30 32 29  ), a_string(302)
3850: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20   FROM t1;.      
3860: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
3870: 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 32  ELECT a_string(2
3880: 30 33 29 2c 20 61 5f 73 74 72 69 6e 67 28 33 30  03), a_string(30
3890: 33 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20  3) FROM t1;.    
38a0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
38b0: 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67   SELECT a_string
38c0: 28 32 30 34 29 2c 20 61 5f 73 74 72 69 6e 67 28  (204), a_string(
38d0: 33 30 34 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20  304) FROM t1;.  
38e0: 20 20 20 20 52 45 50 4c 41 43 45 20 49 4e 54 4f      REPLACE INTO
38f0: 20 74 32 20 53 45 4c 45 43 54 20 2a 20 46 52 4f   t2 SELECT * FRO
3900: 4d 20 74 31 3b 0a 20 20 20 20 43 4f 4d 4d 49 54  M t1;.    COMMIT
3910: 3b 0a 20 20 7d 0a 20 20 64 62 20 63 6c 6f 73 65  ;.  }.  db close
3920: 0a 20 20 74 73 74 76 66 73 20 64 65 6c 65 74 65  .  tstvfs delete
3930: 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 70 61  .} {}.do_test pa
3940: 67 65 72 31 2e 34 2e 32 2e 32 20 7b 0a 20 20 66  ger1.4.2.2 {.  f
3950: 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f  aultsim_restore_
3960: 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65  and_reopen.  exe
3970: 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43  csql {.    SELEC
3980: 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
3990: 74 31 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 69  t1;.    PRAGMA i
39a0: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 3b 0a  ntegrity_check;.
39b0: 20 20 7d 0a 7d 20 7b 34 20 6f 6b 7d 0a 64 6f 5f    }.} {4 ok}.do_
39c0: 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e 32 2e  test pager1.4.2.
39d0: 33 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 72  3 {.  faultsim_r
39e0: 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65  estore_and_reope
39f0: 6e 0a 20 20 66 6f 72 65 61 63 68 20 66 20 5b 67  n.  foreach f [g
3a00: 6c 6f 62 20 74 65 73 74 2e 64 62 2d 6d 6a 2a 5d  lob test.db-mj*]
3a10: 20 7b 20 66 69 6c 65 20 64 65 6c 65 74 65 20 2d   { file delete -
3a20: 66 6f 72 63 65 20 24 66 20 7d 0a 20 20 65 78 65  force $f }.  exe
3a30: 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43  csql {.    SELEC
3a40: 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
3a50: 74 31 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 69  t1;.    PRAGMA i
3a60: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 3b 0a  ntegrity_check;.
3a70: 20 20 7d 0a 7d 20 7b 36 34 20 6f 6b 7d 0a 64 6f    }.} {64 ok}.do
3a80: 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e 32  _test pager1.4.2
3a90: 2e 34 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f  .4 {.  faultsim_
3aa0: 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70  restore_and_reop
3ab0: 65 6e 0a 20 20 68 65 78 69 6f 5f 77 72 69 74 65  en.  hexio_write
3ac0: 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c   test.db-journal
3ad0: 20 5b 65 78 70 72 20 5b 66 69 6c 65 20 73 69 7a   [expr [file siz
3ae0: 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61  e test.db-journa
3af0: 6c 5d 2d 32 30 5d 20 31 32 33 34 35 36 0a 20 20  l]-20] 123456.  
3b00: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45  execsql {.    SE
3b10: 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
3b20: 4f 4d 20 74 31 3b 0a 20 20 20 20 50 52 41 47 4d  OM t1;.    PRAGM
3b30: 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63  A integrity_chec
3b40: 6b 3b 0a 20 20 7d 0a 7d 20 7b 34 20 6f 6b 7d 0a  k;.  }.} {4 ok}.
3b50: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34  do_test pager1.4
3b60: 2e 32 2e 35 20 7b 0a 20 20 66 61 75 6c 74 73 69  .2.5 {.  faultsi
3b70: 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65  m_restore_and_re
3b80: 6f 70 65 6e 0a 20 20 68 65 78 69 6f 5f 77 72 69  open.  hexio_wri
3b90: 74 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e  te test.db-journ
3ba0: 61 6c 20 5b 65 78 70 72 20 5b 66 69 6c 65 20 73  al [expr [file s
3bb0: 69 7a 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72  ize test.db-jour
3bc0: 6e 61 6c 5d 2d 32 30 5d 20 31 32 33 34 35 36 0a  nal]-20] 123456.
3bd0: 20 20 66 6f 72 65 61 63 68 20 66 20 5b 67 6c 6f    foreach f [glo
3be0: 62 20 74 65 73 74 2e 64 62 2d 6d 6a 2a 5d 20 7b  b test.db-mj*] {
3bf0: 20 66 69 6c 65 20 64 65 6c 65 74 65 20 2d 66 6f   file delete -fo
3c00: 72 63 65 20 24 66 20 7d 0a 20 20 65 78 65 63 73  rce $f }.  execs
3c10: 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  ql {.    SELECT 
3c20: 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31  count(*) FROM t1
3c30: 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 69 6e 74  ;.    PRAGMA int
3c40: 65 67 72 69 74 79 5f 63 68 65 63 6b 3b 0a 20 20  egrity_check;.  
3c50: 7d 0a 7d 20 7b 34 20 6f 6b 7d 0a 0a 64 6f 5f 74  }.} {4 ok}..do_t
3c60: 65 73 74 20 70 61 67 65 72 31 2e 34 2e 33 2e 31  est pager1.4.3.1
3c70: 20 7b 0a 20 20 74 65 73 74 76 66 73 20 74 73 74   {.  testvfs tst
3c80: 76 66 73 20 2d 64 65 66 61 75 6c 74 20 31 0a 20  vfs -default 1. 
3c90: 20 74 73 74 76 66 73 20 66 69 6c 74 65 72 20 78   tstvfs filter x
3ca0: 53 79 6e 63 0a 20 20 74 73 74 76 66 73 20 73 63  Sync.  tstvfs sc
3cb0: 72 69 70 74 20 78 53 79 6e 63 43 61 6c 6c 62 61  ript xSyncCallba
3cc0: 63 6b 0a 20 20 70 72 6f 63 20 78 53 79 6e 63 43  ck.  proc xSyncC
3cd0: 61 6c 6c 62 61 63 6b 20 7b 6d 65 74 68 6f 64 20  allback {method 
3ce0: 66 69 6c 65 20 61 72 67 73 7d 20 7b 0a 20 20 20  file args} {.   
3cf0: 20 73 65 74 20 66 69 6c 65 20 5b 66 69 6c 65 20   set file [file 
3d00: 74 61 69 6c 20 24 66 69 6c 65 5d 0a 20 20 20 20  tail $file].    
3d10: 69 66 20 7b 20 30 3d 3d 5b 73 74 72 69 6e 67 20  if { 0==[string 
3d20: 6d 61 74 63 68 20 2a 6a 6f 75 72 6e 61 6c 20 24  match *journal $
3d30: 66 69 6c 65 5d 20 7d 20 7b 20 66 61 75 6c 74 73  file] } { faults
3d40: 69 6d 5f 73 61 76 65 20 7d 0a 20 20 7d 0a 20 20  im_save }.  }.  
3d50: 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f  faultsim_delete_
3d60: 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65  and_reopen.  exe
3d70: 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d  csql {.    PRAGM
3d80: 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d  A journal_mode =
3d90: 20 44 45 4c 45 54 45 3b 0a 20 20 20 20 43 52 45   DELETE;.    CRE
3da0: 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20  ATE TABLE t1(a, 
3db0: 62 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  b);.    INSERT I
3dc0: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c  NTO t1 VALUES(1,
3dd0: 20 32 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   2);.    INSERT 
3de0: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 33  INTO t1 VALUES(3
3df0: 2c 20 34 29 3b 0a 20 20 7d 0a 20 20 64 62 20 63  , 4);.  }.  db c
3e00: 6c 6f 73 65 0a 20 20 74 73 74 76 66 73 20 64 65  lose.  tstvfs de
3e10: 6c 65 74 65 0a 7d 20 7b 7d 0a 0a 66 6f 72 65 61  lete.} {}..forea
3e20: 63 68 20 7b 74 6e 20 6f 66 73 74 20 76 61 6c 75  ch {tn ofst valu
3e30: 65 20 72 65 73 75 6c 74 7d 20 7b 0a 20 20 20 20  e result} {.    
3e40: 20 20 20 20 20 20 32 20 20 20 32 30 20 20 20 20        2   20    
3e50: 33 31 20 20 20 20 20 20 20 7b 31 20 32 20 33 20  31       {1 2 3 
3e60: 34 7d 0a 20 20 20 20 20 20 20 20 20 20 33 20 20  4}.          3  
3e70: 20 32 30 20 20 20 20 33 32 20 20 20 20 20 20 20   20    32       
3e80: 7b 31 20 32 20 33 20 34 7d 0a 20 20 20 20 20 20  {1 2 3 4}.      
3e90: 20 20 20 20 34 20 20 20 32 30 20 20 20 20 33 33      4   20    33
3ea0: 20 20 20 20 20 20 20 7b 31 20 32 20 33 20 34 7d         {1 2 3 4}
3eb0: 0a 20 20 20 20 20 20 20 20 20 20 35 20 20 20 32  .          5   2
3ec0: 30 20 20 20 20 36 35 35 33 36 20 20 20 20 7b 31  0    65536    {1
3ed0: 20 32 20 33 20 34 7d 0a 20 20 20 20 20 20 20 20   2 3 4}.        
3ee0: 20 20 36 20 20 20 32 30 20 20 20 20 31 33 31 30    6   20    1310
3ef0: 37 32 20 20 20 7b 31 20 32 20 33 20 34 7d 0a 0a  72   {1 2 3 4}..
3f00: 20 20 20 20 20 20 20 20 20 20 37 20 20 20 32 34            7   24
3f10: 20 20 20 20 35 31 31 20 20 20 20 20 20 7b 31 20      511      {1 
3f20: 32 20 33 20 34 7d 0a 20 20 20 20 20 20 20 20 20  2 3 4}.         
3f30: 20 38 20 20 20 32 34 20 20 20 20 35 31 33 20 20   8   24    513  
3f40: 20 20 20 20 7b 31 20 32 20 33 20 34 7d 0a 20 20      {1 2 3 4}.  
3f50: 20 20 20 20 20 20 20 20 39 20 20 20 32 34 20 20          9   24  
3f60: 20 20 36 35 35 33 36 20 20 20 20 7b 31 20 32 20    65536    {1 2 
3f70: 33 20 34 7d 0a 0a 20 20 20 20 20 20 20 20 20 31  3 4}..         1
3f80: 30 20 20 20 33 32 20 20 20 20 36 35 35 33 36 20  0   32    65536 
3f90: 20 20 20 7b 31 20 32 7d 0a 7d 20 7b 0a 20 20 64     {1 2}.} {.  d
3fa0: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e  o_test pager1.4.
3fb0: 33 2e 24 74 6e 20 7b 0a 20 20 20 20 66 61 75 6c  3.$tn {.    faul
3fc0: 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64  tsim_restore_and
3fd0: 5f 72 65 6f 70 65 6e 0a 20 20 20 20 68 65 78 69  _reopen.    hexi
3fe0: 6f 5f 77 72 69 74 65 20 74 65 73 74 2e 64 62 2d  o_write test.db-
3ff0: 6a 6f 75 72 6e 61 6c 20 24 6f 66 73 74 20 5b 66  journal $ofst [f
4000: 6f 72 6d 61 74 20 25 2e 38 78 20 24 76 61 6c 75  ormat %.8x $valu
4010: 65 5d 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b  e].    execsql {
4020: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
4030: 31 20 7d 0a 20 20 7d 20 24 72 65 73 75 6c 74 0a  1 }.  } $result.
4040: 7d 0a 64 62 20 63 6c 6f 73 65 0a 0a 23 20 53 65  }.db close..# Se
4050: 74 20 75 70 20 61 20 56 46 53 20 74 68 61 74 20  t up a VFS that 
4060: 73 6e 61 70 73 68 6f 74 73 20 74 68 65 20 66 69  snapshots the fi
4070: 6c 65 2d 73 79 73 74 65 6d 20 6a 75 73 74 20 62  le-system just b
4080: 65 66 6f 72 65 20 61 20 6d 61 73 74 65 72 20 6a  efore a master j
4090: 6f 75 72 6e 61 6c 0a 23 20 66 69 6c 65 20 69 73  ournal.# file is
40a0: 20 64 65 6c 65 74 65 64 20 74 6f 20 63 6f 6d 6d   deleted to comm
40b0: 69 74 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20  it a multi-file 
40c0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 53 70 65  transaction. Spe
40d0: 63 69 66 69 63 61 6c 6c 79 2c 20 74 68 65 0a 23  cifically, the.#
40e0: 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 69 73 20   file-system is 
40f0: 73 61 76 65 64 20 6a 75 73 74 20 62 65 66 6f 72  saved just befor
4100: 65 20 74 68 65 20 78 44 65 6c 65 74 65 28 29 20  e the xDelete() 
4110: 63 61 6c 6c 20 74 6f 20 72 65 6d 6f 76 65 20 74  call to remove t
4120: 68 65 20 0a 23 20 6d 61 73 74 65 72 20 6a 6f 75  he .# master jou
4130: 72 6e 61 6c 20 66 69 6c 65 20 66 72 6f 6d 20 74  rnal file from t
4140: 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e 0a  he file-system..
4150: 23 0a 74 65 73 74 76 66 73 20 74 76 20 2d 64 65  #.testvfs tv -de
4160: 66 61 75 6c 74 20 31 0a 74 76 20 73 63 72 69 70  fault 1.tv scrip
4170: 74 20 63 6f 70 79 5f 6f 6e 5f 6d 6a 5f 64 65 6c  t copy_on_mj_del
4180: 65 74 65 0a 73 65 74 20 3a 3a 6d 6a 5f 66 69 6c  ete.set ::mj_fil
4190: 65 6e 61 6d 65 5f 6c 65 6e 67 74 68 20 30 0a 70  ename_length 0.p
41a0: 72 6f 63 20 63 6f 70 79 5f 6f 6e 5f 6d 6a 5f 64  roc copy_on_mj_d
41b0: 65 6c 65 74 65 20 7b 6d 65 74 68 6f 64 20 66 69  elete {method fi
41c0: 6c 65 6e 61 6d 65 20 61 72 67 73 7d 20 7b 0a 20  lename args} {. 
41d0: 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6d 61 74   if {[string mat
41e0: 63 68 20 2a 6d 6a 2a 20 5b 66 69 6c 65 20 74 61  ch *mj* [file ta
41f0: 69 6c 20 24 66 69 6c 65 6e 61 6d 65 5d 5d 7d 20  il $filename]]} 
4200: 7b 20 0a 20 20 20 20 73 65 74 20 3a 3a 6d 6a 5f  { .    set ::mj_
4210: 66 69 6c 65 6e 61 6d 65 5f 6c 65 6e 67 74 68 20  filename_length 
4220: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
4230: 66 69 6c 65 6e 61 6d 65 5d 0a 20 20 20 20 66 61  filename].    fa
4240: 75 6c 74 73 69 6d 5f 73 61 76 65 20 0a 20 20 7d  ultsim_save .  }
4250: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
4260: 5f 4f 4b 0a 7d 0a 0a 73 65 74 20 70 77 64 20 5b  _OK.}..set pwd [
4270: 70 77 64 5d 0a 66 6f 72 65 61 63 68 20 7b 74 6e  pwd].foreach {tn
4280: 31 20 74 63 6c 7d 20 7b 0a 20 20 31 20 7b 20 73  1 tcl} {.  1 { s
4290: 65 74 20 70 72 65 66 69 78 20 22 74 65 73 74 2e  et prefix "test.
42a0: 64 62 22 20 7d 0a 20 20 32 20 7b 20 0a 20 20 20  db" }.  2 { .   
42b0: 20 23 20 54 68 69 73 20 74 65 73 74 20 64 65 70   # This test dep
42c0: 65 6e 64 73 20 6f 6e 20 74 68 65 20 75 6e 64 65  ends on the unde
42d0: 72 6c 79 69 6e 67 20 56 46 53 20 62 65 69 6e 67  rlying VFS being
42e0: 20 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 70 61   able to open pa
42f0: 74 68 73 0a 20 20 20 20 23 20 35 31 32 20 62 79  ths.    # 512 by
4300: 74 65 73 20 69 6e 20 6c 65 6e 67 74 68 2e 20 54  tes in length. T
4310: 68 65 20 69 64 65 61 20 69 73 20 74 6f 20 63 72  he idea is to cr
4320: 65 61 74 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  eate a hot-journ
4330: 61 6c 20 66 69 6c 65 20 74 68 61 74 0a 20 20 20  al file that.   
4340: 20 23 20 63 6f 6e 74 61 69 6e 73 20 61 20 6d 61   # contains a ma
4350: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69  ster-journal poi
4360: 6e 74 65 72 20 73 6f 20 6c 61 72 67 65 20 74 68  nter so large th
4370: 61 74 20 69 74 20 63 6f 75 6c 64 20 63 6f 6e 74  at it could cont
4380: 61 69 6e 0a 20 20 20 20 23 20 61 20 76 61 6c 69  ain.    # a vali
4390: 64 20 70 61 67 65 20 72 65 63 6f 72 64 20 28 69  d page record (i
43a0: 66 20 74 68 65 20 66 69 6c 65 20 70 61 67 65 2d  f the file page-
43b0: 73 69 7a 65 20 69 73 20 35 31 32 20 62 79 74 65  size is 512 byte
43c0: 73 29 2e 20 53 6f 20 61 73 20 74 6f 0a 20 20 20  s). So as to.   
43d0: 20 23 20 6d 61 6b 65 20 73 75 72 65 20 53 51 4c   # make sure SQL
43e0: 69 74 65 20 64 6f 65 73 6e 27 74 20 67 65 74 20  ite doesn't get 
43f0: 63 6f 6e 66 75 73 65 64 20 62 79 20 74 68 69 73  confused by this
4400: 2e 0a 20 20 20 20 23 0a 20 20 20 20 73 65 74 20  ..    #.    set 
4410: 6e 50 61 64 64 69 6e 67 20 5b 65 78 70 72 20 35  nPadding [expr 5
4420: 31 31 20 2d 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e  11 - $::mj_filen
4430: 61 6d 65 5f 6c 65 6e 67 74 68 5d 0a 0a 20 20 20  ame_length]..   
4440: 20 23 20 57 65 20 63 61 6e 6e 6f 74 20 6a 75 73   # We cannot jus
4450: 74 20 63 72 65 61 74 65 20 61 20 72 65 61 6c 6c  t create a reall
4460: 79 20 6c 6f 6e 67 20 64 61 74 61 62 61 73 65 20  y long database 
4470: 66 69 6c 65 20 6e 61 6d 65 20 74 6f 20 6f 70 65  file name to ope
4480: 6e 2c 20 61 73 0a 20 20 20 20 23 20 4c 69 6e 75  n, as.    # Linu
4490: 78 20 6c 69 6d 69 74 73 20 61 20 73 69 6e 67 6c  x limits a singl
44a0: 65 20 63 6f 6d 70 6f 6e 65 6e 74 20 6f 66 20 61  e component of a
44b0: 20 70 61 74 68 20 74 6f 20 32 35 35 20 62 79 74   path to 255 byt
44c0: 65 73 20 62 79 20 64 65 66 61 75 6c 74 0a 20 20  es by default.  
44d0: 20 20 23 20 28 61 6e 64 20 70 72 65 73 75 6d 61    # (and presuma
44e0: 62 6c 79 20 6f 74 68 65 72 20 73 79 73 74 65 6d  bly other system
44f0: 73 20 68 61 76 65 20 6c 69 6d 69 74 73 20 74 6f  s have limits to
4500: 6f 29 2e 20 53 6f 20 63 72 65 61 74 65 20 61 20  o). So create a 
4510: 64 69 72 65 63 74 6f 72 79 0a 20 20 20 20 23 20  directory.    # 
4520: 68 69 65 72 61 72 63 68 79 20 74 6f 20 77 6f 72  hierarchy to wor
4530: 6b 20 69 6e 2e 0a 20 20 20 20 23 0a 20 20 20 20  k in..    #.    
4540: 73 65 74 20 64 69 72 6e 61 6d 65 20 22 64 31 32  set dirname "d12
4550: 33 34 35 36 37 38 39 30 31 32 33 34 35 36 37 38  3456789012345678
4560: 39 30 31 32 33 34 35 36 37 38 39 30 2f 22 0a 20  901234567890/". 
4570: 20 20 20 73 65 74 20 6e 44 69 72 20 5b 65 78 70     set nDir [exp
4580: 72 20 24 6e 50 61 64 64 69 6e 67 20 2f 20 33 32  r $nPadding / 32
4590: 5d 0a 20 20 20 20 69 66 20 7b 20 24 6e 44 69 72  ].    if { $nDir
45a0: 20 7d 20 7b 0a 20 20 20 20 20 20 73 65 74 20 70   } {.      set p
45b0: 20 5b 73 74 72 69 6e 67 20 72 65 70 65 61 74 20   [string repeat 
45c0: 24 64 69 72 6e 61 6d 65 20 24 6e 44 69 72 5d 0a  $dirname $nDir].
45d0: 20 20 20 20 20 20 66 69 6c 65 20 6d 6b 64 69 72        file mkdir
45e0: 20 24 70 0a 20 20 20 20 20 20 63 64 20 24 70 0a   $p.      cd $p.
45f0: 20 20 20 20 7d 0a 0a 20 20 20 20 73 65 74 20 70      }..    set p
4600: 61 64 64 69 6e 67 20 5b 73 74 72 69 6e 67 20 72  adding [string r
4610: 65 70 65 61 74 20 78 20 5b 65 78 70 72 20 24 6e  epeat x [expr $n
4620: 50 61 64 64 69 6e 67 20 25 33 32 5d 5d 0a 20 20  Padding %32]].  
4630: 20 20 73 65 74 20 70 72 65 66 69 78 20 22 74 65    set prefix "te
4640: 73 74 2e 64 62 24 7b 70 61 64 64 69 6e 67 7d 22  st.db${padding}"
4650: 0a 20 20 7d 0a 7d 20 7b 0a 20 20 65 76 61 6c 20  .  }.} {.  eval 
4660: 24 74 63 6c 0a 20 20 66 6f 72 65 61 63 68 20 7b  $tcl.  foreach {
4670: 74 6e 32 20 73 71 6c 7d 20 7b 0a 20 20 20 20 6f  tn2 sql} {.    o
4680: 20 7b 20 0a 20 20 20 20 20 20 50 52 41 47 4d 41   { .      PRAGMA
4690: 20 6d 61 69 6e 2e 73 79 6e 63 68 72 6f 6e 6f 75   main.synchronou
46a0: 73 3d 4f 46 46 3b 0a 20 20 20 20 20 20 50 52 41  s=OFF;.      PRA
46b0: 47 4d 41 20 61 75 78 2e 73 79 6e 63 68 72 6f 6e  GMA aux.synchron
46c0: 6f 75 73 3d 4f 46 46 3b 0a 20 20 20 20 7d 0a 20  ous=OFF;.    }. 
46d0: 20 20 20 6f 35 31 32 20 7b 20 0a 20 20 20 20 20     o512 { .     
46e0: 20 50 52 41 47 4d 41 20 6d 61 69 6e 2e 73 79 6e   PRAGMA main.syn
46f0: 63 68 72 6f 6e 6f 75 73 3d 4f 46 46 3b 0a 20 20  chronous=OFF;.  
4700: 20 20 20 20 50 52 41 47 4d 41 20 61 75 78 2e 73      PRAGMA aux.s
4710: 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46 46 3b 0a  ynchronous=OFF;.
4720: 20 20 20 20 20 20 50 52 41 47 4d 41 20 6d 61 69        PRAGMA mai
4730: 6e 2e 70 61 67 65 5f 73 69 7a 65 20 3d 20 35 31  n.page_size = 51
4740: 32 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20  2;.      PRAGMA 
4750: 61 75 78 2e 70 61 67 65 5f 73 69 7a 65 20 3d 20  aux.page_size = 
4760: 35 31 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  512;.    }.    n
4770: 20 7b 20 0a 20 20 20 20 20 20 50 52 41 47 4d 41   { .      PRAGMA
4780: 20 6d 61 69 6e 2e 73 79 6e 63 68 72 6f 6e 6f 75   main.synchronou
4790: 73 3d 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 20 20  s=NORMAL;.      
47a0: 50 52 41 47 4d 41 20 61 75 78 2e 73 79 6e 63 68  PRAGMA aux.synch
47b0: 72 6f 6e 6f 75 73 3d 4e 4f 52 4d 41 4c 3b 0a 20  ronous=NORMAL;. 
47c0: 20 20 20 7d 0a 20 20 20 20 66 20 7b 20 0a 20 20     }.    f { .  
47d0: 20 20 20 20 50 52 41 47 4d 41 20 6d 61 69 6e 2e      PRAGMA main.
47e0: 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 46 55 4c 4c  synchronous=FULL
47f0: 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 61  ;.      PRAGMA a
4800: 75 78 2e 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 46  ux.synchronous=F
4810: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b  ULL;.    }.  } {
4820: 0a 0a 20 20 20 20 73 65 74 20 74 6e 20 22 24 7b  ..    set tn "${
4830: 74 6e 31 7d 2e 24 7b 74 6e 32 7d 22 0a 20 20 0a  tn1}.${tn2}".  .
4840: 20 20 20 20 23 20 53 65 74 20 75 70 20 61 20 63      # Set up a c
4850: 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 68 61 76  onnection to hav
4860: 65 20 74 77 6f 20 64 61 74 61 62 61 73 65 73 2c  e two databases,
4870: 20 74 65 73 74 2e 64 62 20 28 6d 61 69 6e 29 20   test.db (main) 
4880: 61 6e 64 20 0a 20 20 20 20 23 20 74 65 73 74 2e  and .    # test.
4890: 64 62 32 20 28 61 75 78 29 2e 20 54 68 65 6e 20  db2 (aux). Then 
48a0: 72 75 6e 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65  run a multi-file
48b0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20   transaction on 
48c0: 74 68 65 6d 2e 20 54 68 65 0a 20 20 20 20 23 20  them. The.    # 
48d0: 56 46 53 20 77 69 6c 6c 20 73 6e 61 70 73 68 6f  VFS will snapsho
48e0: 74 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  t the file-syste
48f0: 6d 20 6a 75 73 74 20 62 65 66 6f 72 65 20 74 68  m just before th
4900: 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  e master-journal
4910: 0a 20 20 20 20 23 20 66 69 6c 65 20 69 73 20 64  .    # file is d
4920: 65 6c 65 74 65 64 20 74 6f 20 63 6f 6d 6d 69 74  eleted to commit
4930: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
4940: 2e 0a 20 20 20 20 23 0a 20 20 20 20 74 76 20 66  ..    #.    tv f
4950: 69 6c 74 65 72 20 78 44 65 6c 65 74 65 0a 20 20  ilter xDelete.  
4960: 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
4970: 2d 34 2e 34 2e 24 74 6e 2e 31 20 7b 0a 20 20 20  -4.4.$tn.1 {.   
4980: 20 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65     faultsim_dele
4990: 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 20 24 70  te_and_reopen $p
49a0: 72 65 66 69 78 0a 20 20 20 20 20 20 65 78 65 63  refix.      exec
49b0: 73 71 6c 20 22 0a 20 20 20 20 20 20 20 20 41 54  sql ".        AT
49c0: 54 41 43 48 20 27 24 7b 70 72 65 66 69 78 7d 32  TACH '${prefix}2
49d0: 27 20 41 53 20 61 75 78 3b 0a 20 20 20 20 20 20  ' AS aux;.      
49e0: 20 20 24 73 71 6c 0a 20 20 20 20 20 20 20 20 43    $sql.        C
49f0: 52 45 41 54 45 20 54 41 42 4c 45 20 61 28 78 29  REATE TABLE a(x)
4a00: 3b 0a 20 20 20 20 20 20 20 20 43 52 45 41 54 45  ;.        CREATE
4a10: 20 54 41 42 4c 45 20 61 75 78 2e 62 28 78 29 3b   TABLE aux.b(x);
4a20: 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20  .        INSERT 
4a30: 49 4e 54 4f 20 61 20 56 41 4c 55 45 53 28 27 64  INTO a VALUES('d
4a40: 6f 75 62 6c 65 2d 79 6f 75 27 29 3b 0a 20 20 20  ouble-you');.   
4a50: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
4a60: 20 61 20 56 41 4c 55 45 53 28 27 77 68 79 27 29   a VALUES('why')
4a70: 3b 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54  ;.        INSERT
4a80: 20 49 4e 54 4f 20 61 20 56 41 4c 55 45 53 28 27   INTO a VALUES('
4a90: 7a 65 64 27 29 3b 0a 20 20 20 20 20 20 20 20 49  zed');.        I
4aa0: 4e 53 45 52 54 20 49 4e 54 4f 20 62 20 56 41 4c  NSERT INTO b VAL
4ab0: 55 45 53 28 27 77 6f 6e 27 29 3b 0a 20 20 20 20  UES('won');.    
4ac0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
4ad0: 62 20 56 41 4c 55 45 53 28 27 74 6f 6f 27 29 3b  b VALUES('too');
4ae0: 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20  .        INSERT 
4af0: 49 4e 54 4f 20 62 20 56 41 4c 55 45 53 28 27 66  INTO b VALUES('f
4b00: 72 65 65 27 29 3b 0a 20 20 20 20 20 20 22 0a 20  ree');.      ". 
4b10: 20 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20       execsql {. 
4b20: 20 20 20 20 20 20 20 42 45 47 49 4e 3b 0a 20 20         BEGIN;.  
4b30: 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49          INSERT I
4b40: 4e 54 4f 20 61 20 53 45 4c 45 43 54 20 2a 20 46  NTO a SELECT * F
4b50: 52 4f 4d 20 62 20 57 48 45 52 45 20 72 6f 77 69  ROM b WHERE rowi
4b60: 64 3c 3d 33 3b 0a 20 20 20 20 20 20 20 20 20 20  d<=3;.          
4b70: 49 4e 53 45 52 54 20 49 4e 54 4f 20 62 20 53 45  INSERT INTO b SE
4b80: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 61 20 57 48  LECT * FROM a WH
4b90: 45 52 45 20 72 6f 77 69 64 3c 3d 33 3b 0a 20 20  ERE rowid<=3;.  
4ba0: 20 20 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20        COMMIT;.  
4bb0: 20 20 20 20 7d 0a 20 20 20 20 7d 20 7b 7d 0a 20      }.    } {}. 
4bc0: 20 20 20 74 76 20 66 69 6c 74 65 72 20 7b 7d 0a     tv filter {}.
4bd0: 20 20 20 20 0a 20 20 20 20 23 20 43 68 65 63 6b      .    # Check
4be0: 20 74 68 61 74 20 74 68 65 20 74 72 61 6e 73 61   that the transa
4bf0: 63 74 69 6f 6e 20 77 61 73 20 63 6f 6d 6d 69 74  ction was commit
4c00: 74 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ted successfully
4c10: 2e 0a 20 20 20 20 23 0a 20 20 20 20 64 6f 5f 65  ..    #.    do_e
4c20: 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65  xecsql_test page
4c30: 72 31 2d 34 2e 34 2e 24 74 6e 2e 32 20 7b 0a 20  r1-4.4.$tn.2 {. 
4c40: 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52       SELECT * FR
4c50: 4f 4d 20 61 0a 20 20 20 20 7d 20 7b 64 6f 75 62  OM a.    } {doub
4c60: 6c 65 2d 79 6f 75 20 77 68 79 20 7a 65 64 20 77  le-you why zed w
4c70: 6f 6e 20 74 6f 6f 20 66 72 65 65 7d 0a 20 20 20  on too free}.   
4c80: 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74   do_execsql_test
4c90: 20 70 61 67 65 72 31 2d 34 2e 34 2e 24 74 6e 2e   pager1-4.4.$tn.
4ca0: 33 20 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54  3 {.      SELECT
4cb0: 20 2a 20 46 52 4f 4d 20 62 0a 20 20 20 20 7d 20   * FROM b.    } 
4cc0: 7b 77 6f 6e 20 74 6f 6f 20 66 72 65 65 20 64 6f  {won too free do
4cd0: 75 62 6c 65 2d 79 6f 75 20 77 68 79 20 7a 65 64  uble-you why zed
4ce0: 7d 0a 20 20 20 20 0a 20 20 20 20 23 20 52 65 73  }.    .    # Res
4cf0: 74 6f 72 65 20 74 68 65 20 66 69 6c 65 2d 73 79  tore the file-sy
4d00: 73 74 65 6d 20 61 6e 64 20 72 65 6f 70 65 6e 20  stem and reopen 
4d10: 74 68 65 20 64 61 74 61 62 61 73 65 73 2e 20 43  the databases. C
4d20: 68 65 63 6b 20 74 68 61 74 20 69 74 20 6e 6f 77  heck that it now
4d30: 0a 20 20 20 20 23 20 61 70 70 65 61 72 73 20 74  .    # appears t
4d40: 68 61 74 20 74 68 65 20 74 72 61 6e 73 61 63 74  hat the transact
4d50: 69 6f 6e 20 77 61 73 20 6e 6f 74 20 63 6f 6d 6d  ion was not comm
4d60: 69 74 74 65 64 20 28 62 65 63 61 75 73 65 20 74  itted (because t
4d70: 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 0a 20  he file-system. 
4d80: 20 20 20 23 20 77 61 73 20 72 65 73 74 6f 72 65     # was restore
4d90: 64 20 74 6f 20 74 68 65 20 73 74 61 74 65 20 77  d to the state w
4da0: 68 65 72 65 20 69 74 20 68 61 64 20 6e 6f 74 20  here it had not 
4db0: 62 65 65 6e 29 2e 0a 20 20 20 20 23 0a 20 20 20  been)..    #.   
4dc0: 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
4dd0: 34 2e 34 2e 24 74 6e 2e 34 20 7b 0a 20 20 20 20  4.4.$tn.4 {.    
4de0: 20 20 66 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f    faultsim_resto
4df0: 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 20 24 70  re_and_reopen $p
4e00: 72 65 66 69 78 0a 20 20 20 20 20 20 65 78 65 63  refix.      exec
4e10: 73 71 6c 20 22 41 54 54 41 43 48 20 27 24 7b 70  sql "ATTACH '${p
4e20: 72 65 66 69 78 7d 32 27 20 41 53 20 61 75 78 22  refix}2' AS aux"
4e30: 0a 20 20 20 20 7d 20 7b 7d 0a 20 20 20 20 64 6f  .    } {}.    do
4e40: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61  _execsql_test pa
4e50: 67 65 72 31 2d 34 2e 34 2e 24 74 6e 2e 35 20 7b  ger1-4.4.$tn.5 {
4e60: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 61 7d  SELECT * FROM a}
4e70: 20 7b 64 6f 75 62 6c 65 2d 79 6f 75 20 77 68 79   {double-you why
4e80: 20 7a 65 64 7d 0a 20 20 20 20 64 6f 5f 65 78 65   zed}.    do_exe
4e90: 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31  csql_test pager1
4ea0: 2d 34 2e 34 2e 24 74 6e 2e 36 20 7b 53 45 4c 45  -4.4.$tn.6 {SELE
4eb0: 43 54 20 2a 20 46 52 4f 4d 20 62 7d 20 7b 77 6f  CT * FROM b} {wo
4ec0: 6e 20 74 6f 6f 20 66 72 65 65 7d 0a 20 20 20 20  n too free}.    
4ed0: 0a 20 20 20 20 23 20 52 65 73 74 6f 72 65 20 74  .    # Restore t
4ee0: 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 61  he file-system a
4ef0: 67 61 69 6e 2e 20 54 68 69 73 20 74 69 6d 65 2c  gain. This time,
4f00: 20 62 65 66 6f 72 65 20 72 65 6f 70 65 6e 69 6e   before reopenin
4f10: 67 20 74 68 65 20 64 61 74 61 62 61 73 65 73 2c  g the databases,
4f20: 0a 20 20 20 20 23 20 64 65 6c 65 74 65 20 74 68  .    # delete th
4f30: 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  e master-journal
4f40: 20 66 69 6c 65 20 66 72 6f 6d 20 74 68 65 20 66   file from the f
4f50: 69 6c 65 2d 73 79 73 74 65 6d 2e 20 49 74 20 6e  ile-system. It n
4f60: 6f 77 20 61 70 70 65 61 72 73 20 74 68 61 74 0a  ow appears that.
4f70: 20 20 20 20 23 20 74 68 65 20 74 72 61 6e 73 61      # the transa
4f80: 63 74 69 6f 6e 20 77 61 73 20 63 6f 6d 6d 69 74  ction was commit
4f90: 74 65 64 20 28 6e 6f 20 6d 61 73 74 65 72 2d 6a  ted (no master-j
4fa0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 3d 3d 20 6e  ournal file == n
4fb0: 6f 20 72 6f 6c 6c 62 61 63 6b 29 2e 0a 20 20 20  o rollback)..   
4fc0: 20 23 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 70   #.    do_test p
4fd0: 61 67 65 72 31 2d 34 2e 34 2e 24 74 6e 2e 37 20  ager1-4.4.$tn.7 
4fe0: 7b 0a 20 20 20 20 20 20 66 61 75 6c 74 73 69 6d  {.      faultsim
4ff0: 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f  _restore_and_reo
5000: 70 65 6e 20 24 70 72 65 66 69 78 0a 20 20 20 20  pen $prefix.    
5010: 20 20 66 6f 72 65 61 63 68 20 66 20 5b 67 6c 6f    foreach f [glo
5020: 62 20 24 7b 70 72 65 66 69 78 7d 2d 6d 6a 2a 5d  b ${prefix}-mj*]
5030: 20 7b 20 66 69 6c 65 20 64 65 6c 65 74 65 20 2d   { file delete -
5040: 66 6f 72 63 65 20 24 66 20 7d 0a 20 20 20 20 20  force $f }.     
5050: 20 65 78 65 63 73 71 6c 20 22 41 54 54 41 43 48   execsql "ATTACH
5060: 20 27 24 7b 70 72 65 66 69 78 7d 32 27 20 41 53   '${prefix}2' AS
5070: 20 61 75 78 22 0a 20 20 20 20 7d 20 7b 7d 0a 20   aux".    } {}. 
5080: 20 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65     do_execsql_te
5090: 73 74 20 70 61 67 65 72 31 2d 34 2e 34 2e 24 74  st pager1-4.4.$t
50a0: 6e 2e 38 20 7b 0a 20 20 20 20 20 20 53 45 4c 45  n.8 {.      SELE
50b0: 43 54 20 2a 20 46 52 4f 4d 20 61 0a 20 20 20 20  CT * FROM a.    
50c0: 7d 20 7b 64 6f 75 62 6c 65 2d 79 6f 75 20 77 68  } {double-you wh
50d0: 79 20 7a 65 64 20 77 6f 6e 20 74 6f 6f 20 66 72  y zed won too fr
50e0: 65 65 7d 0a 20 20 20 20 64 6f 5f 65 78 65 63 73  ee}.    do_execs
50f0: 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 34  ql_test pager1-4
5100: 2e 34 2e 24 74 6e 2e 39 20 7b 0a 20 20 20 20 20  .4.$tn.9 {.     
5110: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 62   SELECT * FROM b
5120: 0a 20 20 20 20 7d 20 7b 77 6f 6e 20 74 6f 6f 20  .    } {won too 
5130: 66 72 65 65 20 64 6f 75 62 6c 65 2d 79 6f 75 20  free double-you 
5140: 77 68 79 20 7a 65 64 7d 0a 20 20 7d 0a 0a 20 20  why zed}.  }..  
5150: 63 64 20 24 70 77 64 0a 7d 0a 64 62 20 63 6c 6f  cd $pwd.}.db clo
5160: 73 65 0a 74 76 20 64 65 6c 65 74 65 0a 66 69 6c  se.tv delete.fil
5170: 65 20 64 65 6c 65 74 65 20 2d 66 6f 72 63 65 20  e delete -force 
5180: 24 64 69 72 6e 61 6d 65 0a 0a 0a 23 20 53 65 74  $dirname...# Set
5190: 20 75 70 20 61 20 56 46 53 20 74 6f 20 6d 61 6b   up a VFS to mak
51a0: 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  e a copy of the 
51b0: 66 69 6c 65 2d 73 79 73 74 65 6d 20 6a 75 73 74  file-system just
51c0: 20 62 65 66 6f 72 65 20 64 65 6c 65 74 69 6e 67   before deleting
51d0: 20 61 0a 23 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   a.# journal fil
51e0: 65 20 74 6f 20 63 6f 6d 6d 69 74 20 61 20 74 72  e to commit a tr
51f0: 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 74  ansaction. The t
5200: 72 61 6e 73 61 63 74 69 6f 6e 20 6d 6f 64 69 66  ransaction modif
5210: 69 65 73 20 65 78 61 63 74 6c 79 0a 23 20 74 77  ies exactly.# tw
5220: 6f 20 64 61 74 61 62 61 73 65 20 70 61 67 65 73  o database pages
5230: 20 28 61 6e 64 20 70 61 67 65 20 31 20 2d 20 74   (and page 1 - t
5240: 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65  he change counte
5250: 72 29 2e 0a 23 0a 74 65 73 74 76 66 73 20 74 76  r)..#.testvfs tv
5260: 20 2d 64 65 66 61 75 6c 74 20 31 0a 74 76 20 73   -default 1.tv s
5270: 65 63 74 6f 72 73 69 7a 65 20 35 31 32 0a 74 76  ectorsize 512.tv
5280: 20 73 63 72 69 70 74 20 63 6f 70 79 5f 6f 6e 5f   script copy_on_
5290: 6a 6f 75 72 6e 61 6c 5f 64 65 6c 65 74 65 0a 74  journal_delete.t
52a0: 76 20 66 69 6c 74 65 72 20 78 44 65 6c 65 74 65  v filter xDelete
52b0: 0a 70 72 6f 63 20 63 6f 70 79 5f 6f 6e 5f 6a 6f  .proc copy_on_jo
52c0: 75 72 6e 61 6c 5f 64 65 6c 65 74 65 20 7b 6d 65  urnal_delete {me
52d0: 74 68 6f 64 20 66 69 6c 65 6e 61 6d 65 20 61 72  thod filename ar
52e0: 67 73 7d 20 7b 0a 20 20 69 66 20 7b 5b 73 74 72  gs} {.  if {[str
52f0: 69 6e 67 20 6d 61 74 63 68 20 2a 6a 6f 75 72 6e  ing match *journ
5300: 61 6c 20 24 66 69 6c 65 6e 61 6d 65 5d 7d 20 66  al $filename]} f
5310: 61 75 6c 74 73 69 6d 5f 73 61 76 65 20 0a 20 20  aultsim_save .  
5320: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
5330: 0a 7d 0a 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65  .}.faultsim_dele
5340: 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 64 6f  te_and_reopen.do
5350: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61  _execsql_test pa
5360: 67 65 72 31 2e 34 2e 35 2e 31 20 7b 0a 20 20 50  ger1.4.5.1 {.  P
5370: 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20  RAGMA page_size 
5380: 3d 20 31 30 32 34 3b 0a 20 20 43 52 45 41 54 45  = 1024;.  CREATE
5390: 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b   TABLE t1(a, b);
53a0: 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  .  CREATE TABLE 
53b0: 74 32 28 61 2c 20 62 29 3b 0a 20 20 49 4e 53 45  t2(a, b);.  INSE
53c0: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
53d0: 53 28 27 49 27 2c 20 27 49 49 27 29 3b 0a 20 20  S('I', 'II');.  
53e0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56  INSERT INTO t2 V
53f0: 41 4c 55 45 53 28 27 49 49 49 27 2c 20 27 49 56  ALUES('III', 'IV
5400: 27 29 3b 0a 20 20 42 45 47 49 4e 3b 0a 20 20 20  ');.  BEGIN;.   
5410: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
5420: 56 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20 20  VALUES(1, 2);.  
5430: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32    INSERT INTO t2
5440: 20 56 41 4c 55 45 53 28 33 2c 20 34 29 3b 0a 20   VALUES(3, 4);. 
5450: 20 43 4f 4d 4d 49 54 3b 0a 7d 20 7b 7d 0a 74 76   COMMIT;.} {}.tv
5460: 20 66 69 6c 74 65 72 20 7b 7d 0a 0a 23 20 43 68   filter {}..# Ch
5470: 65 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74  eck the transact
5480: 69 6f 6e 20 77 61 73 20 63 6f 6d 6d 69 74 74 65  ion was committe
5490: 64 3a 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  d:.#.do_execsql_
54a0: 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e 35 2e  test pager1.4.5.
54b0: 32 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46  2 {.  SELECT * F
54c0: 52 4f 4d 20 74 31 3b 0a 20 20 53 45 4c 45 43 54  ROM t1;.  SELECT
54d0: 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 7d 20 7b 49   * FROM t2;.} {I
54e0: 20 49 49 20 31 20 32 20 49 49 49 20 49 56 20 33   II 1 2 III IV 3
54f0: 20 34 7d 0a 0a 23 20 4e 6f 77 20 74 72 79 20 66   4}..# Now try f
5500: 6f 75 72 20 74 65 73 74 73 3a 0a 23 0a 23 20 20  our tests:.#.#  
5510: 70 61 67 65 72 31 2d 34 2e 35 2e 33 3a 20 52 65  pager1-4.5.3: Re
5520: 73 74 6f 72 65 20 74 68 65 20 66 69 6c 65 2d 73  store the file-s
5530: 79 73 74 65 6d 2e 20 43 68 65 63 6b 20 74 68 61  ystem. Check tha
5540: 74 20 74 68 65 20 77 68 6f 6c 65 20 74 72 61 6e  t the whole tran
5550: 73 61 63 74 69 6f 6e 20 0a 23 20 20 20 20 20 20  saction .#      
5560: 20 20 20 20 20 20 20 20 20 20 69 73 20 72 6f 6c            is rol
5570: 6c 65 64 20 62 61 63 6b 2e 0a 23 0a 23 20 20 70  led back..#.#  p
5580: 61 67 65 72 31 2d 34 2e 35 2e 34 3a 20 52 65 73  ager1-4.5.4: Res
5590: 74 6f 72 65 20 74 68 65 20 66 69 6c 65 2d 73 79  tore the file-sy
55a0: 73 74 65 6d 2e 20 43 6f 72 72 75 70 74 20 74 68  stem. Corrupt th
55b0: 65 20 66 69 72 73 74 20 72 65 63 6f 72 64 20 69  e first record i
55c0: 6e 20 74 68 65 0a 23 20 20 20 20 20 20 20 20 20  n the.#         
55d0: 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 2e 20         journal. 
55e0: 43 68 65 63 6b 20 74 68 65 20 74 72 61 6e 73 61  Check the transa
55f0: 63 74 69 6f 6e 20 69 73 20 6e 6f 74 20 72 6f 6c  ction is not rol
5600: 6c 65 64 20 62 61 63 6b 2e 0a 23 0a 23 20 20 70  led back..#.#  p
5610: 61 67 65 72 31 2d 34 2e 35 2e 35 3a 20 52 65 73  ager1-4.5.5: Res
5620: 74 6f 72 65 20 74 68 65 20 66 69 6c 65 2d 73 79  tore the file-sy
5630: 73 74 65 6d 2e 20 43 6f 72 72 75 70 74 20 74 68  stem. Corrupt th
5640: 65 20 73 65 63 6f 6e 64 20 72 65 63 6f 72 64 20  e second record 
5650: 69 6e 20 74 68 65 0a 23 20 20 20 20 20 20 20 20  in the.#        
5660: 20 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 2e          journal.
5670: 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   Check that the 
5680: 66 69 72 73 74 20 72 65 63 6f 72 64 20 69 6e 20  first record in 
5690: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
56a0: 69 73 20 0a 23 20 20 20 20 20 20 20 20 20 20 20  is .#           
56b0: 20 20 20 20 20 70 6c 61 79 65 64 20 62 61 63 6b       played back
56c0: 2c 20 62 75 74 20 6e 6f 74 20 74 68 65 20 73 65  , but not the se
56d0: 63 6f 6e 64 2e 0a 23 0a 23 20 20 70 61 67 65 72  cond..#.#  pager
56e0: 31 2d 34 2e 35 2e 36 3a 20 52 65 73 74 6f 72 65  1-4.5.6: Restore
56f0: 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
5700: 2e 20 54 72 79 20 74 6f 20 6f 70 65 6e 20 74 68  . Try to open th
5710: 65 20 64 61 74 61 62 61 73 65 20 77 69 74 68 20  e database with 
5720: 61 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20  a.#             
5730: 20 20 20 72 65 61 64 6f 6e 6c 79 20 63 6f 6e 6e     readonly conn
5740: 65 63 74 69 6f 6e 2e 20 54 68 69 73 20 73 68 6f  ection. This sho
5750: 75 6c 64 20 66 61 69 6c 2c 20 61 73 20 61 20 72  uld fail, as a r
5760: 65 61 64 2d 6f 6e 6c 79 0a 23 20 20 20 20 20 20  ead-only.#      
5770: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 6e 65 63            connec
5780: 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 72 6f 6c 6c  tion cannot roll
5790: 20 62 61 63 6b 20 74 68 65 20 64 61 74 61 62 61   back the databa
57a0: 73 65 20 66 69 6c 65 2e 0a 23 0a 66 61 75 6c 74  se file..#.fault
57b0: 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f  sim_restore_and_
57c0: 72 65 6f 70 65 6e 0a 64 6f 5f 65 78 65 63 73 71  reopen.do_execsq
57d0: 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e  l_test pager1.4.
57e0: 35 2e 33 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a  5.3 {.  SELECT *
57f0: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 53 45 4c 45   FROM t1;.  SELE
5800: 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 7d 20  CT * FROM t2;.} 
5810: 7b 49 20 49 49 20 49 49 49 20 49 56 7d 0a 66 61  {I II III IV}.fa
5820: 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61  ultsim_restore_a
5830: 6e 64 5f 72 65 6f 70 65 6e 0a 68 65 78 69 6f 5f  nd_reopen.hexio_
5840: 77 72 69 74 65 20 74 65 73 74 2e 64 62 2d 6a 6f  write test.db-jo
5850: 75 72 6e 61 6c 20 5b 65 78 70 72 20 35 31 32 2b  urnal [expr 512+
5860: 34 2b 31 30 32 34 20 2d 20 32 30 32 5d 20 30 31  4+1024 - 202] 01
5870: 32 33 34 35 36 37 38 39 41 42 43 44 45 46 0a 64  23456789ABCDEF.d
5880: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70  o_execsql_test p
5890: 61 67 65 72 31 2e 34 2e 35 2e 34 20 7b 0a 20 20  ager1.4.5.4 {.  
58a0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
58b0: 3b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  ;.  SELECT * FRO
58c0: 4d 20 74 32 3b 0a 7d 20 7b 49 20 49 49 20 31 20  M t2;.} {I II 1 
58d0: 32 20 49 49 49 20 49 56 20 33 20 34 7d 0a 66 61  2 III IV 3 4}.fa
58e0: 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61  ultsim_restore_a
58f0: 6e 64 5f 72 65 6f 70 65 6e 0a 68 65 78 69 6f 5f  nd_reopen.hexio_
5900: 77 72 69 74 65 20 74 65 73 74 2e 64 62 2d 6a 6f  write test.db-jo
5910: 75 72 6e 61 6c 20 5b 65 78 70 72 20 35 31 32 2b  urnal [expr 512+
5920: 34 2b 31 30 32 34 2b 34 2b 34 2b 31 30 32 34 20  4+1024+4+4+1024 
5930: 2d 20 32 30 32 5d 20 30 31 32 33 34 35 36 37 38  - 202] 012345678
5940: 39 41 42 43 44 45 46 0a 64 6f 5f 65 78 65 63 73  9ABCDEF.do_execs
5950: 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34  ql_test pager1.4
5960: 2e 35 2e 35 20 7b 0a 20 20 53 45 4c 45 43 54 20  .5.5 {.  SELECT 
5970: 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 53 45 4c  * FROM t1;.  SEL
5980: 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 7d  ECT * FROM t2;.}
5990: 20 7b 49 20 49 49 20 49 49 49 20 49 56 20 33 20   {I II III IV 3 
59a0: 34 7d 0a 0a 66 61 75 6c 74 73 69 6d 5f 72 65 73  4}..faultsim_res
59b0: 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a  tore_and_reopen.
59c0: 64 62 20 63 6c 6f 73 65 0a 73 71 6c 69 74 65 33  db close.sqlite3
59d0: 20 64 62 20 74 65 73 74 2e 64 62 20 2d 72 65 61   db test.db -rea
59e0: 64 6f 6e 6c 79 20 31 0a 64 6f 5f 63 61 74 63 68  donly 1.do_catch
59f0: 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2e  sql_test pager1.
5a00: 34 2e 35 2e 36 20 7b 0a 20 20 53 45 4c 45 43 54  4.5.6 {.  SELECT
5a10: 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 53 45   * FROM t1;.  SE
5a20: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a  LECT * FROM t2;.
5a30: 7d 20 7b 31 20 7b 64 69 73 6b 20 49 2f 4f 20 65  } {1 {disk I/O e
5a40: 72 72 6f 72 7d 7d 0a 64 62 20 63 6c 6f 73 65 0a  rror}}.db close.
5a50: 0a 23 20 53 6e 61 70 73 68 6f 74 20 74 68 65 20  .# Snapshot the 
5a60: 66 69 6c 65 2d 73 79 73 74 65 6d 20 6a 75 73 74  file-system just
5a70: 20 62 65 66 6f 72 65 20 6d 75 6c 74 69 2d 66 69   before multi-fi
5a80: 6c 65 20 63 6f 6d 6d 69 74 2e 20 53 61 76 65 20  le commit. Save 
5a90: 74 68 65 20 6e 61 6d 65 0a 23 20 6f 66 20 74 68  the name.# of th
5aa0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
5ab0: 20 66 69 6c 65 20 69 6e 20 24 3a 3a 6d 6a 5f 66   file in $::mj_f
5ac0: 69 6c 65 6e 61 6d 65 2e 0a 23 0a 74 76 20 73 63  ilename..#.tv sc
5ad0: 72 69 70 74 20 63 6f 70 79 5f 6f 6e 5f 6d 6a 5f  ript copy_on_mj_
5ae0: 64 65 6c 65 74 65 0a 74 76 20 66 69 6c 74 65 72  delete.tv filter
5af0: 20 78 44 65 6c 65 74 65 0a 70 72 6f 63 20 63 6f   xDelete.proc co
5b00: 70 79 5f 6f 6e 5f 6d 6a 5f 64 65 6c 65 74 65 20  py_on_mj_delete 
5b10: 7b 6d 65 74 68 6f 64 20 66 69 6c 65 6e 61 6d 65  {method filename
5b20: 20 61 72 67 73 7d 20 7b 0a 20 20 69 66 20 7b 5b   args} {.  if {[
5b30: 73 74 72 69 6e 67 20 6d 61 74 63 68 20 2a 6d 6a  string match *mj
5b40: 2a 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 66 69  * [file tail $fi
5b50: 6c 65 6e 61 6d 65 5d 5d 7d 20 7b 20 0a 20 20 20  lename]]} { .   
5b60: 20 73 65 74 20 3a 3a 6d 6a 5f 66 69 6c 65 6e 61   set ::mj_filena
5b70: 6d 65 20 24 66 69 6c 65 6e 61 6d 65 0a 20 20 20  me $filename.   
5b80: 20 66 61 75 6c 74 73 69 6d 5f 73 61 76 65 20 0a   faultsim_save .
5b90: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
5ba0: 49 54 45 5f 4f 4b 0a 7d 0a 64 6f 5f 74 65 73 74  ITE_OK.}.do_test
5bb0: 20 70 61 67 65 72 31 2e 34 2e 36 2e 31 20 7b 0a   pager1.4.6.1 {.
5bc0: 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74    faultsim_delet
5bd0: 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65  e_and_reopen.  e
5be0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 41 54 54  xecsql {.    ATT
5bf0: 41 43 48 20 27 74 65 73 74 2e 64 62 32 27 20 41  ACH 'test.db2' A
5c00: 53 20 74 77 6f 3b 0a 20 20 20 20 43 52 45 41 54  S two;.    CREAT
5c10: 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29  E TABLE t1(a, b)
5c20: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
5c30: 4c 45 20 74 77 6f 2e 74 32 28 61 2c 20 62 29 3b  LE two.t2(a, b);
5c40: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
5c50: 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20 27 74   t1 VALUES(1, 't
5c60: 31 2e 31 27 29 3b 0a 20 20 20 20 49 4e 53 45 52  1.1');.    INSER
5c70: 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53  T INTO t2 VALUES
5c80: 28 31 2c 20 27 74 32 2e 31 27 29 3b 0a 20 20 20  (1, 't2.1');.   
5c90: 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 55 50   BEGIN;.      UP
5ca0: 44 41 54 45 20 74 31 20 53 45 54 20 62 20 3d 20  DATE t1 SET b = 
5cb0: 27 74 31 2e 32 27 3b 0a 20 20 20 20 20 20 55 50  't1.2';.      UP
5cc0: 44 41 54 45 20 74 32 20 53 45 54 20 62 20 3d 20  DATE t2 SET b = 
5cd0: 27 74 32 2e 32 27 3b 0a 20 20 20 20 43 4f 4d 4d  't2.2';.    COMM
5ce0: 49 54 3b 0a 20 20 7d 0a 20 20 74 76 20 66 69 6c  IT;.  }.  tv fil
5cf0: 74 65 72 20 7b 7d 0a 20 20 64 62 20 63 6c 6f 73  ter {}.  db clos
5d00: 65 0a 7d 20 7b 7d 0a 0a 66 61 75 6c 74 73 69 6d  e.} {}..faultsim
5d10: 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f  _restore_and_reo
5d20: 70 65 6e 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  pen.do_execsql_t
5d30: 65 73 74 20 70 61 67 65 72 31 2e 34 2e 36 2e 32  est pager1.4.6.2
5d40: 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d   { SELECT * FROM
5d50: 20 74 31 20 7d 20 20 20 20 20 20 20 20 20 20 20   t1 }           
5d60: 7b 31 20 74 31 2e 31 7d 0a 64 6f 5f 74 65 73 74  {1 t1.1}.do_test
5d70: 20 20 20 20 20 20 20 20 20 70 61 67 65 72 31 2e           pager1.
5d80: 34 2e 36 2e 33 20 7b 20 66 69 6c 65 20 65 78 69  4.6.3 { file exi
5d90: 73 74 73 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61  sts $::mj_filena
5da0: 6d 65 20 7d 20 7b 31 7d 0a 64 6f 5f 65 78 65 63  me } {1}.do_exec
5db0: 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2e  sql_test pager1.
5dc0: 34 2e 36 2e 34 20 7b 0a 20 20 41 54 54 41 43 48  4.6.4 {.  ATTACH
5dd0: 20 27 74 65 73 74 2e 64 62 32 27 20 41 53 20 74   'test.db2' AS t
5de0: 77 6f 3b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46  wo;.  SELECT * F
5df0: 52 4f 4d 20 74 32 3b 0a 7d 20 7b 31 20 74 32 2e  ROM t2;.} {1 t2.
5e00: 31 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  1}.do_test pager
5e10: 31 2e 34 2e 36 2e 35 20 7b 20 66 69 6c 65 20 65  1.4.6.5 { file e
5e20: 78 69 73 74 73 20 24 3a 3a 6d 6a 5f 66 69 6c 65  xists $::mj_file
5e30: 6e 61 6d 65 20 7d 20 7b 30 7d 0a 0a 66 61 75 6c  name } {0}..faul
5e40: 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64  tsim_restore_and
5e50: 5f 72 65 6f 70 65 6e 0a 64 62 20 63 6c 6f 73 65  _reopen.db close
5e60: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2e  .do_test pager1.
5e70: 34 2e 36 2e 38 20 7b 0a 20 20 73 65 74 20 3a 3a  4.6.8 {.  set ::
5e80: 6d 6a 5f 66 69 6c 65 6e 61 6d 65 31 20 24 3a 3a  mj_filename1 $::
5e90: 6d 6a 5f 66 69 6c 65 6e 61 6d 65 0a 20 20 74 76  mj_filename.  tv
5ea0: 20 66 69 6c 74 65 72 20 78 44 65 6c 65 74 65 0a   filter xDelete.
5eb0: 20 20 73 71 6c 69 74 65 33 20 64 62 20 74 65 73    sqlite3 db tes
5ec0: 74 2e 64 62 32 0a 20 20 65 78 65 63 73 71 6c 20  t.db2.  execsql 
5ed0: 7b 0a 20 20 20 20 41 54 54 41 43 48 20 27 74 65  {.    ATTACH 'te
5ee0: 73 74 2e 64 62 33 27 20 41 53 20 74 68 72 65 65  st.db3' AS three
5ef0: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
5f00: 4c 45 20 74 68 72 65 65 2e 74 33 28 61 2c 20 62  LE three.t3(a, b
5f10: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
5f20: 54 4f 20 74 33 20 56 41 4c 55 45 53 28 31 2c 20  TO t3 VALUES(1, 
5f30: 27 74 33 2e 31 27 29 3b 0a 20 20 20 20 42 45 47  't3.1');.    BEG
5f40: 49 4e 3b 0a 20 20 20 20 20 20 55 50 44 41 54 45  IN;.      UPDATE
5f50: 20 74 32 20 53 45 54 20 62 20 3d 20 27 74 32 2e   t2 SET b = 't2.
5f60: 33 27 3b 0a 20 20 20 20 20 20 55 50 44 41 54 45  3';.      UPDATE
5f70: 20 74 33 20 53 45 54 20 62 20 3d 20 27 74 33 2e   t3 SET b = 't3.
5f80: 33 27 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a  3';.    COMMIT;.
5f90: 20 20 7d 0a 20 20 65 78 70 72 20 7b 24 3a 3a 6d    }.  expr {$::m
5fa0: 6a 5f 66 69 6c 65 6e 61 6d 65 31 20 21 3d 20 24  j_filename1 != $
5fb0: 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 7d 0a 7d  ::mj_filename}.}
5fc0: 20 7b 31 7d 0a 66 61 75 6c 74 73 69 6d 5f 72 65   {1}.faultsim_re
5fd0: 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e  store_and_reopen
5fe0: 0a 74 76 20 66 69 6c 74 65 72 20 7b 7d 0a 0a 23  .tv filter {}..#
5ff0: 20 54 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   The file-system
6000: 20 6e 6f 77 20 63 6f 6e 74 61 69 6e 73 3a 0a 23   now contains:.#
6010: 0a 23 20 20 20 2a 20 74 68 72 65 65 20 64 61 74  .#   * three dat
6020: 61 62 61 73 65 73 0a 23 20 20 20 2a 20 74 68 72  abases.#   * thr
6030: 65 65 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66  ee hot-journal f
6040: 69 6c 65 73 0a 23 20 20 20 2a 20 74 77 6f 20 6d  iles.#   * two m
6050: 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69  aster-journal fi
6060: 6c 65 73 2e 0a 23 0a 23 20 54 68 65 20 68 6f 74  les..#.# The hot
6070: 2d 6a 6f 75 72 6e 61 6c 73 20 61 73 73 6f 63 69  -journals associ
6080: 61 74 65 64 20 77 69 74 68 20 74 65 73 74 2e 64  ated with test.d
6090: 62 32 20 61 6e 64 20 74 65 73 74 2e 64 62 33 20  b2 and test.db3 
60a0: 70 6f 69 6e 74 20 74 6f 0a 23 20 6d 61 73 74 65  point to.# maste
60b0: 72 20 6a 6f 75 72 6e 61 6c 20 24 3a 3a 6d 6a 5f  r journal $::mj_
60c0: 66 69 6c 65 6e 61 6d 65 2e 20 54 68 65 20 68 6f  filename. The ho
60d0: 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61  t-journal file a
60e0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a 23  ssociated with.#
60f0: 20 74 65 73 74 2e 64 62 20 70 6f 69 6e 74 73 20   test.db points 
6100: 74 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  to master journa
6110: 6c 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65  l $::mj_filename
6120: 31 2e 20 53 6f 20 72 65 61 64 69 6e 67 20 66 72  1. So reading fr
6130: 6f 6d 0a 23 20 74 65 73 74 2e 64 62 20 73 68 6f  om.# test.db sho
6140: 75 6c 64 20 64 65 6c 65 74 65 20 24 3a 3a 6d 6a  uld delete $::mj
6150: 5f 66 69 6c 65 6e 61 6d 65 31 2e 0a 23 0a 64 6f  _filename1..#.do
6160: 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e 36  _test pager1.4.6
6170: 2e 39 20 7b 0a 20 20 6c 73 6f 72 74 20 5b 67 6c  .9 {.  lsort [gl
6180: 6f 62 20 74 65 73 74 2e 64 62 2a 5d 0a 7d 20 5b  ob test.db*].} [
6190: 6c 73 6f 72 74 20 5b 6c 69 73 74 20 20 20 20 20  lsort [list     
61a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
61b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
61c0: 20 20 20 20 20 20 5c 0a 20 20 74 65 73 74 2e 64        \.  test.d
61d0: 62 20 74 65 73 74 2e 64 62 32 20 74 65 73 74 2e  b test.db2 test.
61e0: 64 62 33 20 20 20 20 20 20 20 20 20 20 20 20 20  db3             
61f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6200: 20 5c 0a 20 20 74 65 73 74 2e 64 62 2d 6a 6f 75   \.  test.db-jou
6210: 72 6e 61 6c 20 74 65 73 74 2e 64 62 32 2d 6a 6f  rnal test.db2-jo
6220: 75 72 6e 61 6c 20 74 65 73 74 2e 64 62 33 2d 6a  urnal test.db3-j
6230: 6f 75 72 6e 61 6c 20 20 20 20 20 20 5c 0a 20 20  ournal      \.  
6240: 5b 66 69 6c 65 20 74 61 69 6c 20 24 3a 3a 6d 6a  [file tail $::mj
6250: 5f 66 69 6c 65 6e 61 6d 65 5d 20 5b 66 69 6c 65  _filename] [file
6260: 20 74 61 69 6c 20 24 3a 3a 6d 6a 5f 66 69 6c 65   tail $::mj_file
6270: 6e 61 6d 65 31 5d 0a 5d 5d 0a 0a 23 20 54 68 65  name1].]]..# The
6280: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
6290: 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 31 20  $::mj_filename1 
62a0: 63 6f 6e 74 61 69 6e 73 20 70 6f 69 6e 74 65 72  contains pointer
62b0: 73 20 74 6f 20 74 65 73 74 2e 64 62 20 61 6e 64  s to test.db and
62c0: 20 0a 23 20 74 65 73 74 2e 64 62 32 2e 20 48 6f   .# test.db2. Ho
62d0: 77 65 76 65 72 20 74 68 65 20 68 6f 74 2d 6a 6f  wever the hot-jo
62e0: 75 72 6e 61 6c 20 61 73 73 6f 63 69 61 74 65 64  urnal associated
62f0: 20 77 69 74 68 20 74 65 73 74 2e 64 62 32 20 70   with test.db2 p
6300: 6f 69 6e 74 73 20 74 6f 0a 23 20 61 20 64 69 66  oints to.# a dif
6310: 66 65 72 65 6e 74 20 6d 61 73 74 65 72 2d 6a 6f  ferent master-jo
6320: 75 72 6e 61 6c 2e 20 54 68 65 72 65 66 6f 72 65  urnal. Therefore
6330: 2c 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 74  , reading from t
6340: 65 73 74 2e 64 62 20 6f 6e 6c 79 20 73 68 6f 75  est.db only shou
6350: 6c 64 0a 23 20 62 65 20 65 6e 6f 75 67 68 20 74  ld.# be enough t
6360: 6f 20 63 61 75 73 65 20 53 51 4c 69 74 65 20 74  o cause SQLite t
6370: 6f 20 64 65 6c 65 74 65 20 24 3a 3a 6d 6a 5f 66  o delete $::mj_f
6380: 69 6c 65 6e 61 6d 65 31 2e 0a 23 0a 64 6f 5f 74  ilename1..#.do_t
6390: 65 73 74 20 20 20 20 20 20 20 20 20 70 61 67 65  est         page
63a0: 72 31 2e 34 2e 36 2e 31 30 20 7b 20 66 69 6c 65  r1.4.6.10 { file
63b0: 20 65 78 69 73 74 73 20 24 3a 3a 6d 6a 5f 66 69   exists $::mj_fi
63c0: 6c 65 6e 61 6d 65 20 20 7d 20 7b 31 7d 0a 64 6f  lename  } {1}.do
63d0: 5f 74 65 73 74 20 20 20 20 20 20 20 20 20 70 61  _test         pa
63e0: 67 65 72 31 2e 34 2e 36 2e 31 31 20 7b 20 66 69  ger1.4.6.11 { fi
63f0: 6c 65 20 65 78 69 73 74 73 20 24 3a 3a 6d 6a 5f  le exists $::mj_
6400: 66 69 6c 65 6e 61 6d 65 31 20 7d 20 7b 31 7d 0a  filename1 } {1}.
6410: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
6420: 70 61 67 65 72 31 2e 34 2e 36 2e 31 32 20 7b 20  pager1.4.6.12 { 
6430: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
6440: 20 7d 20 7b 31 20 74 31 2e 31 7d 0a 64 6f 5f 74   } {1 t1.1}.do_t
6450: 65 73 74 20 20 20 20 20 20 20 20 20 70 61 67 65  est         page
6460: 72 31 2e 34 2e 36 2e 31 33 20 7b 20 66 69 6c 65  r1.4.6.13 { file
6470: 20 65 78 69 73 74 73 20 24 3a 3a 6d 6a 5f 66 69   exists $::mj_fi
6480: 6c 65 6e 61 6d 65 20 20 7d 20 7b 31 7d 0a 64 6f  lename  } {1}.do
6490: 5f 74 65 73 74 20 20 20 20 20 20 20 20 20 70 61  _test         pa
64a0: 67 65 72 31 2e 34 2e 36 2e 31 34 20 7b 20 66 69  ger1.4.6.14 { fi
64b0: 6c 65 20 65 78 69 73 74 73 20 24 3a 3a 6d 6a 5f  le exists $::mj_
64c0: 66 69 6c 65 6e 61 6d 65 31 20 7d 20 7b 30 7d 0a  filename1 } {0}.
64d0: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
64e0: 20 70 61 67 65 72 31 2e 34 2e 36 2e 31 32 20 7b   pager1.4.6.12 {
64f0: 0a 20 20 41 54 54 41 43 48 20 27 74 65 73 74 2e  .  ATTACH 'test.
6500: 64 62 32 27 20 41 53 20 74 77 6f 3b 0a 20 20 53  db2' AS two;.  S
6510: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b  ELECT * FROM t2;
6520: 0a 7d 20 7b 31 20 74 32 2e 31 7d 0a 64 6f 5f 74  .} {1 t2.1}.do_t
6530: 65 73 74 20 20 20 20 20 20 20 20 20 70 61 67 65  est         page
6540: 72 31 2e 34 2e 36 2e 31 33 20 7b 20 66 69 6c 65  r1.4.6.13 { file
6550: 20 65 78 69 73 74 73 20 24 3a 3a 6d 6a 5f 66 69   exists $::mj_fi
6560: 6c 65 6e 61 6d 65 20 7d 20 20 7b 31 7d 0a 64 6f  lename }  {1}.do
6570: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61  _execsql_test pa
6580: 67 65 72 31 2e 34 2e 36 2e 31 34 20 7b 0a 20 20  ger1.4.6.14 {.  
6590: 41 54 54 41 43 48 20 27 74 65 73 74 2e 64 62 33  ATTACH 'test.db3
65a0: 27 20 41 53 20 74 68 72 65 65 3b 0a 20 20 53 45  ' AS three;.  SE
65b0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 33 3b 0a  LECT * FROM t3;.
65c0: 7d 20 7b 31 20 74 33 2e 31 7d 0a 64 6f 5f 74 65  } {1 t3.1}.do_te
65d0: 73 74 20 20 20 20 20 20 20 20 20 70 61 67 65 72  st         pager
65e0: 31 2e 34 2e 36 2e 31 35 20 7b 20 66 69 6c 65 20  1.4.6.15 { file 
65f0: 65 78 69 73 74 73 20 24 3a 3a 6d 6a 5f 66 69 6c  exists $::mj_fil
6600: 65 6e 61 6d 65 20 7d 20 20 7b 30 7d 0a 0a 64 62  ename }  {0}..db
6610: 20 63 6c 6f 73 65 0a 74 76 20 64 65 6c 65 74 65   close.tv delete
6620: 0a 0a 74 65 73 74 76 66 73 20 74 76 20 2d 64 65  ..testvfs tv -de
6630: 66 61 75 6c 74 20 31 0a 74 76 20 73 65 63 74 6f  fault 1.tv secto
6640: 72 73 69 7a 65 20 35 31 32 0a 74 76 20 73 63 72  rsize 512.tv scr
6650: 69 70 74 20 63 6f 70 79 5f 6f 6e 5f 6a 6f 75 72  ipt copy_on_jour
6660: 6e 61 6c 5f 64 65 6c 65 74 65 0a 74 76 20 66 69  nal_delete.tv fi
6670: 6c 74 65 72 20 78 44 65 6c 65 74 65 0a 70 72 6f  lter xDelete.pro
6680: 63 20 63 6f 70 79 5f 6f 6e 5f 6a 6f 75 72 6e 61  c copy_on_journa
6690: 6c 5f 64 65 6c 65 74 65 20 7b 6d 65 74 68 6f 64  l_delete {method
66a0: 20 66 69 6c 65 6e 61 6d 65 20 61 72 67 73 7d 20   filename args} 
66b0: 7b 0a 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20  {.  if {[string 
66c0: 6d 61 74 63 68 20 2a 6a 6f 75 72 6e 61 6c 20 24  match *journal $
66d0: 66 69 6c 65 6e 61 6d 65 5d 7d 20 66 61 75 6c 74  filename]} fault
66e0: 73 69 6d 5f 73 61 76 65 20 0a 20 20 72 65 74 75  sim_save .  retu
66f0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 7d 0a 66  rn SQLITE_OK.}.f
6700: 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61  aultsim_delete_a
6710: 6e 64 5f 72 65 6f 70 65 6e 0a 64 6f 5f 65 78 65  nd_reopen.do_exe
6720: 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31  csql_test pager1
6730: 2e 34 2e 37 2e 31 20 7b 0a 20 20 43 52 45 41 54  .4.7.1 {.  CREAT
6740: 45 20 54 41 42 4c 45 20 74 31 28 78 20 50 52 49  E TABLE t1(x PRI
6750: 4d 41 52 59 20 4b 45 59 2c 20 79 29 3b 0a 20 20  MARY KEY, y);.  
6760: 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 31 20  CREATE INDEX i1 
6770: 4f 4e 20 74 31 28 79 29 3b 0a 20 20 49 4e 53 45  ON t1(y);.  INSE
6780: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
6790: 53 28 27 49 27 2c 20 20 20 27 6f 6e 65 27 29 3b  S('I',   'one');
67a0: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  .  INSERT INTO t
67b0: 31 20 56 41 4c 55 45 53 28 27 49 49 27 2c 20 20  1 VALUES('II',  
67c0: 27 66 6f 75 72 27 29 3b 0a 20 20 49 4e 53 45 52  'four');.  INSER
67d0: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
67e0: 28 27 49 49 49 27 2c 20 27 6e 69 6e 65 27 29 3b  ('III', 'nine');
67f0: 0a 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 49 4e  .  BEGIN;.    IN
6800: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
6810: 55 45 53 28 27 49 56 27 2c 20 27 73 69 78 74 65  UES('IV', 'sixte
6820: 65 6e 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  en');.    INSERT
6830: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
6840: 27 56 27 20 2c 20 27 74 77 65 6e 74 79 66 69 76  'V' , 'twentyfiv
6850: 65 27 29 3b 0a 20 20 43 4f 4d 4d 49 54 3b 0a 7d  e');.  COMMIT;.}
6860: 20 7b 7d 0a 74 76 20 66 69 6c 74 65 72 20 7b 7d   {}.tv filter {}
6870: 0a 64 62 20 63 6c 6f 73 65 0a 74 76 20 64 65 6c  .db close.tv del
6880: 65 74 65 20 0a 64 6f 5f 74 65 73 74 20 70 61 67  ete .do_test pag
6890: 65 72 31 2e 34 2e 37 2e 32 20 7b 0a 20 20 66 61  er1.4.7.2 {.  fa
68a0: 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61  ultsim_restore_a
68b0: 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 63 61 74 63  nd_reopen.  catc
68c0: 68 20 7b 66 69 6c 65 20 61 74 74 72 69 62 75 74  h {file attribut
68d0: 65 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e  es test.db-journ
68e0: 61 6c 20 2d 70 65 72 6d 69 73 73 69 6f 6e 73 20  al -permissions 
68f0: 72 2d 2d 2d 2d 2d 2d 2d 2d 7d 0a 20 20 63 61 74  r--------}.  cat
6900: 63 68 20 7b 66 69 6c 65 20 61 74 74 72 69 62 75  ch {file attribu
6910: 74 65 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72  tes test.db-jour
6920: 6e 61 6c 20 2d 72 65 61 64 6f 6e 6c 79 20 31 7d  nal -readonly 1}
6930: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20 53 45  .  catchsql { SE
6940: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d  LECT * FROM t1 }
6950: 0a 7d 20 7b 31 20 7b 75 6e 61 62 6c 65 20 74 6f  .} {1 {unable to
6960: 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 66   open database f
6970: 69 6c 65 7d 7d 0a 64 6f 5f 74 65 73 74 20 70 61  ile}}.do_test pa
6980: 67 65 72 31 2e 34 2e 37 2e 33 20 7b 0a 20 20 64  ger1.4.7.3 {.  d
6990: 62 20 63 6c 6f 73 65 0a 20 20 63 61 74 63 68 20  b close.  catch 
69a0: 7b 66 69 6c 65 20 61 74 74 72 69 62 75 74 65 73  {file attributes
69b0: 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c   test.db-journal
69c0: 20 2d 70 65 72 6d 69 73 73 69 6f 6e 73 20 72 77   -permissions rw
69d0: 2d 72 77 2d 72 77 2d 7d 0a 20 20 63 61 74 63 68  -rw-rw-}.  catch
69e0: 20 7b 66 69 6c 65 20 61 74 74 72 69 62 75 74 65   {file attribute
69f0: 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61  s test.db-journa
6a00: 6c 20 2d 72 65 61 64 6f 6e 6c 79 20 30 7d 0a 20  l -readonly 0}. 
6a10: 20 66 69 6c 65 20 64 65 6c 65 74 65 20 74 65 73   file delete tes
6a20: 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 20 20 66  t.db-journal.  f
6a30: 69 6c 65 20 65 78 69 73 74 73 20 74 65 73 74 2e  ile exists test.
6a40: 64 62 2d 6a 6f 75 72 6e 61 6c 0a 7d 20 7b 30 7d  db-journal.} {0}
6a50: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
6a60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6a70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6a80: 2d 2d 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 0a 23 20 54  ------------.# T
6aa0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73  he following tes
6ab0: 74 73 20 64 65 61 6c 20 77 69 74 68 20 6d 75 6c  ts deal with mul
6ac0: 74 69 2d 66 69 6c 65 20 63 6f 6d 6d 69 74 73 2e  ti-file commits.
6ad0: 0a 23 0a 23 20 70 61 67 65 72 31 2d 35 2e 31 2e  .#.# pager1-5.1.
6ae0: 2a 3a 20 54 68 65 20 63 61 73 65 20 77 68 65 72  *: The case wher
6af0: 65 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 63  e a multi-file c
6b00: 61 6e 6e 6f 74 20 62 65 20 63 6f 6d 6d 69 74 74  annot be committ
6b10: 65 64 20 62 65 63 61 75 73 65 0a 23 20 20 20 20  ed because.#    
6b20: 20 20 20 20 20 20 20 20 20 20 20 61 6e 6f 74 68             anoth
6b30: 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73  er connection is
6b40: 20 68 6f 6c 64 69 6e 67 20 61 20 53 48 41 52 45   holding a SHARE
6b50: 44 20 6c 6f 63 6b 20 6f 6e 20 6f 6e 65 20 6f 66  D lock on one of
6b60: 20 74 68 65 0a 23 20 20 20 20 20 20 20 20 20 20   the.#          
6b70: 20 20 20 20 20 66 69 6c 65 73 2e 20 41 66 74 65       files. Afte
6b80: 72 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63  r the SHARED loc
6b90: 6b 20 69 73 20 72 65 6d 6f 76 65 64 2c 20 74 68  k is removed, th
6ba0: 65 20 43 4f 4d 4d 49 54 20 73 75 63 63 65 65 64  e COMMIT succeed
6bb0: 73 2e 0a 23 0a 23 20 70 61 67 65 72 31 2d 35 2e  s..#.# pager1-5.
6bc0: 32 2e 2a 3a 20 4d 75 6c 74 69 2d 66 69 6c 65 20  2.*: Multi-file 
6bd0: 63 6f 6d 6d 69 74 73 20 77 69 74 68 20 6a 6f 75  commits with jou
6be0: 72 6e 61 6c 5f 6d 6f 64 65 3d 6d 65 6d 6f 72 79  rnal_mode=memory
6bf0: 2e 0a 23 0a 23 20 70 61 67 65 72 31 2d 35 2e 33  ..#.# pager1-5.3
6c00: 2e 2a 3a 20 4d 75 6c 74 69 2d 66 69 6c 65 20 63  .*: Multi-file c
6c10: 6f 6d 6d 69 74 73 20 77 69 74 68 20 6a 6f 75 72  ommits with jour
6c20: 6e 61 6c 5f 6d 6f 64 65 3d 6d 65 6d 6f 72 79 2e  nal_mode=memory.
6c30: 0a 23 0a 23 20 70 61 67 65 72 31 2d 35 2e 34 2e  .#.# pager1-5.4.
6c40: 2a 3a 20 43 68 65 63 6b 20 74 68 61 74 20 77 69  *: Check that wi
6c50: 74 68 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 6e  th synchronous=n
6c60: 6f 72 6d 61 6c 2c 20 74 68 65 20 6d 61 73 74 65  ormal, the maste
6c70: 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 23  r-journal file.#
6c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
6c90: 61 6d 65 20 69 73 20 61 64 64 65 64 20 74 6f 20  ame is added to 
6ca0: 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  a journal file i
6cb0: 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72  mmediately after
6cc0: 20 74 68 65 20 6c 61 73 74 0a 23 20 20 20 20 20   the last.#     
6cd0: 20 20 20 20 20 20 20 20 20 20 6a 6f 75 72 6e 61            journa
6ce0: 6c 20 72 65 63 6f 72 64 2e 20 42 75 74 20 77 69  l record. But wi
6cf0: 74 68 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 66  th synchronous=f
6d00: 75 6c 6c 2c 20 65 78 74 72 61 20 75 6e 75 73 65  ull, extra unuse
6d10: 64 20 73 70 61 63 65 0a 23 20 20 20 20 20 20 20  d space.#       
6d20: 20 20 20 20 20 20 20 20 69 73 20 61 6c 6c 6f 63          is alloc
6d30: 61 74 65 64 20 62 65 74 77 65 65 6e 20 74 68 65  ated between the
6d40: 20 6c 61 73 74 20 6a 6f 75 72 6e 61 6c 20 72 65   last journal re
6d50: 63 6f 72 64 20 61 6e 64 20 74 68 65 20 0a 23 20  cord and the .# 
6d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 61                ma
6d70: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster-journal fil
6d80: 65 20 6e 61 6d 65 20 73 6f 20 74 68 61 74 20 74  e name so that t
6d90: 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  he master-journa
6da0: 6c 20 66 69 6c 65 0a 23 20 20 20 20 20 20 20 20  l file.#        
6db0: 20 20 20 20 20 20 20 6e 61 6d 65 20 64 6f 65 73         name does
6dc0: 20 6e 6f 74 20 6c 69 65 20 6f 6e 20 74 68 65 20   not lie on the 
6dd0: 73 61 6d 65 20 73 65 63 74 6f 72 20 61 73 20 74  same sector as t
6de0: 68 65 20 6c 61 73 74 20 6a 6f 75 72 6e 61 6c 20  he last journal 
6df0: 66 69 6c 65 0a 23 20 20 20 20 20 20 20 20 20 20  file.#          
6e00: 20 20 20 20 20 72 65 63 6f 72 64 2e 0a 23 0a 23       record..#.#
6e10: 20 70 61 67 65 72 31 2d 35 2e 35 2e 2a 3a 20 43   pager1-5.5.*: C
6e20: 68 65 63 6b 20 74 68 61 74 20 69 6e 20 6a 6f 75  heck that in jou
6e30: 72 6e 61 6c 5f 6d 6f 64 65 3d 50 45 52 53 49 53  rnal_mode=PERSIS
6e40: 54 20 6d 6f 64 65 2c 20 61 20 6a 6f 75 72 6e 61  T mode, a journa
6e50: 6c 20 66 69 6c 65 20 69 73 0a 23 20 20 20 20 20  l file is.#     
6e60: 20 20 20 20 20 20 20 20 20 20 74 72 75 6e 63 61            trunca
6e70: 74 65 64 20 74 6f 20 7a 65 72 6f 20 62 79 74 65  ted to zero byte
6e80: 73 20 77 68 65 6e 20 61 20 6d 75 6c 74 69 2d 66  s when a multi-f
6e90: 69 6c 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ile transaction 
6ea0: 69 73 20 0a 23 20 20 20 20 20 20 20 20 20 20 20  is .#           
6eb0: 20 20 20 20 63 6f 6d 6d 69 74 74 65 64 20 28 69      committed (i
6ec0: 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20 66 69  nstead of the fi
6ed0: 72 73 74 20 63 6f 75 70 6c 65 20 6f 66 20 62 79  rst couple of by
6ee0: 74 65 73 20 62 65 69 6e 67 20 7a 65 72 6f 65 64  tes being zeroed
6ef0: 29 2e 0a 23 0a 23 0a 64 6f 5f 74 65 73 74 20 70  )..#.#.do_test p
6f00: 61 67 65 72 31 2d 35 2e 31 2e 31 20 7b 0a 20 20  ager1-5.1.1 {.  
6f10: 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f  faultsim_delete_
6f20: 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65  and_reopen.  exe
6f30: 63 73 71 6c 20 7b 0a 20 20 20 20 41 54 54 41 43  csql {.    ATTAC
6f40: 48 20 27 74 65 73 74 2e 64 62 32 27 20 41 53 20  H 'test.db2' AS 
6f50: 61 75 78 3b 0a 20 20 20 20 43 52 45 41 54 45 20  aux;.    CREATE 
6f60: 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a  TABLE t1(a, b);.
6f70: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
6f80: 20 61 75 78 2e 74 32 28 61 2c 20 62 29 3b 0a 20   aux.t2(a, b);. 
6f90: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
6fa0: 31 20 56 41 4c 55 45 53 28 31 37 2c 20 27 4c 65  1 VALUES(17, 'Le
6fb0: 6e 69 6e 27 29 3b 0a 20 20 20 20 49 4e 53 45 52  nin');.    INSER
6fc0: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
6fd0: 28 32 32 2c 20 27 53 74 61 6c 69 6e 27 29 3b 0a  (22, 'Stalin');.
6fe0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
6ff0: 74 31 20 56 41 4c 55 45 53 28 35 33 2c 20 27 4b  t1 VALUES(53, 'K
7000: 68 72 75 73 68 63 68 65 76 27 29 3b 0a 20 20 7d  hrushchev');.  }
7010: 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 70 61  .} {}.do_test pa
7020: 67 65 72 31 2d 35 2e 31 2e 32 20 7b 0a 20 20 65  ger1-5.1.2 {.  e
7030: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42 45 47  xecsql {.    BEG
7040: 49 4e 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  IN;.      INSERT
7050: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
7060: 36 34 2c 20 27 42 72 65 7a 68 6e 65 76 27 29 3b  64, 'Brezhnev');
7070: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
7080: 54 4f 20 74 32 20 53 45 4c 45 43 54 20 2a 20 46  TO t2 SELECT * F
7090: 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a 20 20 73 71  ROM t1;.  }.  sq
70a0: 6c 69 74 65 33 20 64 62 32 20 74 65 73 74 2e 64  lite3 db2 test.d
70b0: 62 32 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  b2.  execsql {. 
70c0: 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20     BEGIN;.      
70d0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32  SELECT * FROM t2
70e0: 3b 0a 20 20 7d 20 64 62 32 0a 7d 20 7b 7d 0a 64  ;.  } db2.} {}.d
70f0: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 35 2e  o_test pager1-5.
7100: 31 2e 33 20 7b 0a 20 20 63 61 74 63 68 73 71 6c  1.3 {.  catchsql
7110: 20 43 4f 4d 4d 49 54 0a 7d 20 7b 31 20 7b 64 61   COMMIT.} {1 {da
7120: 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64  tabase is locked
7130: 7d 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  }}.do_test pager
7140: 31 2d 35 2e 31 2e 34 20 7b 0a 20 20 65 78 65 63  1-5.1.4 {.  exec
7150: 73 71 6c 20 43 4f 4d 4d 49 54 20 64 62 32 0a 20  sql COMMIT db2. 
7160: 20 65 78 65 63 73 71 6c 20 43 4f 4d 4d 49 54 0a   execsql COMMIT.
7170: 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45    execsql { SELE
7180: 43 54 20 2a 20 46 52 4f 4d 20 74 32 20 7d 20 64  CT * FROM t2 } d
7190: 62 32 0a 7d 20 7b 31 37 20 4c 65 6e 69 6e 20 32  b2.} {17 Lenin 2
71a0: 32 20 53 74 61 6c 69 6e 20 35 33 20 4b 68 72 75  2 Stalin 53 Khru
71b0: 73 68 63 68 65 76 20 36 34 20 42 72 65 7a 68 6e  shchev 64 Brezhn
71c0: 65 76 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  ev}.do_test page
71d0: 72 31 2d 35 2e 31 2e 35 20 7b 0a 20 20 64 62 32  r1-5.1.5 {.  db2
71e0: 20 63 6c 6f 73 65 0a 7d 20 7b 7d 0a 0a 64 6f 5f   close.} {}..do_
71f0: 74 65 73 74 20 70 61 67 65 72 31 2d 35 2e 32 2e  test pager1-5.2.
7200: 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  1 {.  execsql {.
7210: 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e      PRAGMA journ
7220: 61 6c 5f 6d 6f 64 65 20 3d 20 6d 65 6d 6f 72 79  al_mode = memory
7230: 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20  ;.    BEGIN;.   
7240: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
7250: 31 20 56 41 4c 55 45 53 28 38 34 2c 20 27 41 6e  1 VALUES(84, 'An
7260: 64 72 6f 70 6f 76 27 29 3b 0a 20 20 20 20 20 20  dropov');.      
7270: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56  INSERT INTO t2 V
7280: 41 4c 55 45 53 28 38 34 2c 20 27 41 6e 64 72 6f  ALUES(84, 'Andro
7290: 70 6f 76 27 29 3b 0a 20 20 20 20 43 4f 4d 4d 49  pov');.    COMMI
72a0: 54 3b 0a 20 20 7d 0a 7d 20 7b 6d 65 6d 6f 72 79  T;.  }.} {memory
72b0: 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  }.do_test pager1
72c0: 2d 35 2e 33 2e 31 20 7b 0a 20 20 65 78 65 63 73  -5.3.1 {.  execs
72d0: 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20  ql {.    PRAGMA 
72e0: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 6f  journal_mode = o
72f0: 66 66 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20  ff;.    BEGIN;. 
7300: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
7310: 20 74 31 20 56 41 4c 55 45 53 28 38 35 2c 20 27   t1 VALUES(85, '
7320: 47 6f 72 62 61 63 68 65 76 27 29 3b 0a 20 20 20  Gorbachev');.   
7330: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
7340: 32 20 56 41 4c 55 45 53 28 38 35 2c 20 27 47 6f  2 VALUES(85, 'Go
7350: 72 62 61 63 68 65 76 27 29 3b 0a 20 20 20 20 43  rbachev');.    C
7360: 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 7d 20 7b 6f 66  OMMIT;.  }.} {of
7370: 66 7d 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  f}..do_test page
7380: 72 31 2d 35 2e 34 2e 31 20 7b 0a 20 20 64 62 20  r1-5.4.1 {.  db 
7390: 63 6c 6f 73 65 0a 20 20 74 65 73 74 76 66 73 20  close.  testvfs 
73a0: 74 76 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20  tv.  sqlite3 db 
73b0: 74 65 73 74 2e 64 62 20 2d 76 66 73 20 74 76 0a  test.db -vfs tv.
73c0: 20 20 65 78 65 63 73 71 6c 20 7b 20 41 54 54 41    execsql { ATTA
73d0: 43 48 20 27 74 65 73 74 2e 64 62 32 27 20 41 53  CH 'test.db2' AS
73e0: 20 61 75 78 20 7d 0a 0a 20 20 74 76 20 66 69 6c   aux }..  tv fil
73f0: 74 65 72 20 78 44 65 6c 65 74 65 0a 20 20 74 76  ter xDelete.  tv
7400: 20 73 63 72 69 70 74 20 6d 61 78 5f 6a 6f 75 72   script max_jour
7410: 6e 61 6c 5f 73 69 7a 65 0a 20 20 74 76 20 73 65  nal_size.  tv se
7420: 63 74 6f 72 73 69 7a 65 20 35 31 32 0a 20 20 73  ctorsize 512.  s
7430: 65 74 20 3a 3a 6d 61 78 5f 6a 6f 75 72 6e 61 6c  et ::max_journal
7440: 20 30 0a 20 20 70 72 6f 63 20 6d 61 78 5f 6a 6f   0.  proc max_jo
7450: 75 72 6e 61 6c 5f 73 69 7a 65 20 7b 6d 65 74 68  urnal_size {meth
7460: 6f 64 20 61 72 67 73 7d 20 7b 0a 20 20 20 20 73  od args} {.    s
7470: 65 74 20 73 7a 20 30 0a 20 20 20 20 63 61 74 63  et sz 0.    catc
7480: 68 20 7b 20 73 65 74 20 73 7a 20 5b 66 69 6c 65  h { set sz [file
7490: 20 73 69 7a 65 20 74 65 73 74 2e 64 62 2d 6a 6f   size test.db-jo
74a0: 75 72 6e 61 6c 5d 20 7d 0a 20 20 20 20 69 66 20  urnal] }.    if 
74b0: 7b 24 73 7a 20 3e 20 24 3a 3a 6d 61 78 5f 6a 6f  {$sz > $::max_jo
74c0: 75 72 6e 61 6c 7d 20 7b 0a 20 20 20 20 20 20 73  urnal} {.      s
74d0: 65 74 20 3a 3a 6d 61 78 5f 6a 6f 75 72 6e 61 6c  et ::max_journal
74e0: 20 24 73 7a 0a 20 20 20 20 7d 0a 20 20 20 20 72   $sz.    }.    r
74f0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a  eturn SQLITE_OK.
7500: 20 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a    }.  execsql {.
7510: 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e      PRAGMA journ
7520: 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c 45 54 45  al_mode = DELETE
7530: 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 73 79 6e  ;.    PRAGMA syn
7540: 63 68 72 6f 6e 6f 75 73 20 3d 20 4e 4f 52 4d 41  chronous = NORMA
7550: 4c 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20  L;.    BEGIN;.  
7560: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
7570: 74 31 20 56 41 4c 55 45 53 28 38 35 2c 20 27 47  t1 VALUES(85, 'G
7580: 6f 72 62 61 63 68 65 76 27 29 3b 0a 20 20 20 20  orbachev');.    
7590: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32    INSERT INTO t2
75a0: 20 56 41 4c 55 45 53 28 38 35 2c 20 27 47 6f 72   VALUES(85, 'Gor
75b0: 62 61 63 68 65 76 27 29 3b 0a 20 20 20 20 43 4f  bachev');.    CO
75c0: 4d 4d 49 54 3b 0a 20 20 7d 0a 20 20 73 65 74 20  MMIT;.  }.  set 
75d0: 3a 3a 6d 61 78 5f 6a 6f 75 72 6e 61 6c 0a 7d 20  ::max_journal.} 
75e0: 5b 65 78 70 72 20 32 36 31 35 2b 5b 73 74 72 69  [expr 2615+[stri
75f0: 6e 67 20 6c 65 6e 67 74 68 20 5b 70 77 64 5d 5d  ng length [pwd]]
7600: 5d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  ].do_test pager1
7610: 2d 35 2e 34 2e 32 20 7b 0a 20 20 73 65 74 20 3a  -5.4.2 {.  set :
7620: 3a 6d 61 78 5f 6a 6f 75 72 6e 61 6c 20 30 0a 20  :max_journal 0. 
7630: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50   execsql {.    P
7640: 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75  RAGMA synchronou
7650: 73 20 3d 20 66 75 6c 6c 3b 0a 20 20 20 20 42 45  s = full;.    BE
7660: 47 49 4e 3b 0a 20 20 20 20 20 20 44 45 4c 45 54  GIN;.      DELET
7670: 45 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  E FROM t1 WHERE 
7680: 62 20 3d 20 27 4c 65 6e 69 6e 27 3b 0a 20 20 20  b = 'Lenin';.   
7690: 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74     DELETE FROM t
76a0: 32 20 57 48 45 52 45 20 62 20 3d 20 27 4c 65 6e  2 WHERE b = 'Len
76b0: 69 6e 27 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b  in';.    COMMIT;
76c0: 0a 20 20 7d 0a 20 20 73 65 74 20 3a 3a 6d 61 78  .  }.  set ::max
76d0: 5f 6a 6f 75 72 6e 61 6c 0a 7d 20 5b 65 78 70 72  _journal.} [expr
76e0: 20 33 31 31 31 2b 5b 73 74 72 69 6e 67 20 6c 65   3111+[string le
76f0: 6e 67 74 68 20 5b 70 77 64 5d 5d 5d 0a 64 62 20  ngth [pwd]]].db 
7700: 63 6c 6f 73 65 0a 74 76 20 64 65 6c 65 74 65 0a  close.tv delete.
7710: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
7720: 35 2e 35 2e 31 20 7b 0a 20 20 73 71 6c 69 74 65  5.5.1 {.  sqlite
7730: 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20 65  3 db test.db.  e
7740: 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 41 54  xecsql { .    AT
7750: 54 41 43 48 20 27 74 65 73 74 2e 64 62 32 27 20  TACH 'test.db2' 
7760: 41 53 20 61 75 78 3b 0a 20 20 20 20 50 52 41 47  AS aux;.    PRAG
7770: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  MA journal_mode 
7780: 3d 20 50 45 52 53 49 53 54 3b 0a 20 20 20 20 43  = PERSIST;.    C
7790: 52 45 41 54 45 20 54 41 42 4c 45 20 74 33 28 61  REATE TABLE t3(a
77a0: 2c 20 62 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  , b);.    INSERT
77b0: 20 49 4e 54 4f 20 74 33 20 53 45 4c 45 43 54 20   INTO t3 SELECT 
77c0: 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29  randomblob(1500)
77d0: 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30  , randomblob(150
77e0: 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20  0) FROM t1;.    
77f0: 55 50 44 41 54 45 20 74 33 20 53 45 54 20 62 20  UPDATE t3 SET b 
7800: 3d 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30  = randomblob(150
7810: 30 29 3b 0a 20 20 7d 0a 20 20 65 78 70 72 20 5b  0);.  }.  expr [
7820: 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64  file size test.d
7830: 62 2d 6a 6f 75 72 6e 61 6c 5d 20 3e 20 31 35 30  b-journal] > 150
7840: 30 30 0a 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73 74  00.} {1}.do_test
7850: 20 70 61 67 65 72 31 2d 35 2e 35 2e 32 20 7b 0a   pager1-5.5.2 {.
7860: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
7870: 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f  PRAGMA synchrono
7880: 75 73 20 3d 20 66 75 6c 6c 3b 0a 20 20 20 20 42  us = full;.    B
7890: 45 47 49 4e 3b 0a 20 20 20 20 20 20 44 45 4c 45  EGIN;.      DELE
78a0: 54 45 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45  TE FROM t1 WHERE
78b0: 20 62 20 3d 20 27 53 74 61 6c 69 6e 27 3b 0a 20   b = 'Stalin';. 
78c0: 20 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d       DELETE FROM
78d0: 20 74 32 20 57 48 45 52 45 20 62 20 3d 20 27 53   t2 WHERE b = 'S
78e0: 74 61 6c 69 6e 27 3b 0a 20 20 20 20 43 4f 4d 4d  talin';.    COMM
78f0: 49 54 3b 0a 20 20 7d 0a 20 20 66 69 6c 65 20 73  IT;.  }.  file s
7900: 69 7a 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72  ize test.db-jour
7910: 6e 61 6c 0a 7d 20 7b 30 7d 0a 0a 0a 23 2d 2d 2d  nal.} {0}...#---
7920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7960: 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 65 20 66 6f 6c  ------.# The fol
7970: 6c 6f 77 69 6e 67 20 74 65 73 74 73 20 77 6f 72  lowing tests wor
7980: 6b 20 77 69 74 68 20 22 50 52 41 47 4d 41 20 6d  k with "PRAGMA m
7990: 61 78 5f 70 61 67 65 5f 63 6f 75 6e 74 22 0a 23  ax_page_count".#
79a0: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
79b0: 36 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d  6.1 {.  faultsim
79c0: 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70  _delete_and_reop
79d0: 65 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  en.  execsql {. 
79e0: 20 20 20 50 52 41 47 4d 41 20 6d 61 78 5f 70 61     PRAGMA max_pa
79f0: 67 65 5f 63 6f 75 6e 74 20 3d 20 31 30 3b 0a 20  ge_count = 10;. 
7a00: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
7a10: 74 32 28 61 2c 20 62 29 3b 0a 20 20 20 20 43 52  t2(a, b);.    CR
7a20: 45 41 54 45 20 54 41 42 4c 45 20 74 33 28 61 2c  EATE TABLE t3(a,
7a30: 20 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20   b);.    CREATE 
7a40: 54 41 42 4c 45 20 74 34 28 61 2c 20 62 29 3b 0a  TABLE t4(a, b);.
7a50: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
7a60: 20 74 35 28 61 2c 20 62 29 3b 0a 20 20 20 20 43   t5(a, b);.    C
7a70: 52 45 41 54 45 20 54 41 42 4c 45 20 74 36 28 61  REATE TABLE t6(a
7a80: 2c 20 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45  , b);.    CREATE
7a90: 20 54 41 42 4c 45 20 74 37 28 61 2c 20 62 29 3b   TABLE t7(a, b);
7aa0: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
7ab0: 45 20 74 38 28 61 2c 20 62 29 3b 0a 20 20 20 20  E t8(a, b);.    
7ac0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 39 28  CREATE TABLE t9(
7ad0: 61 2c 20 62 29 3b 0a 20 20 20 20 43 52 45 41 54  a, b);.    CREAT
7ae0: 45 20 54 41 42 4c 45 20 74 31 30 28 61 2c 20 62  E TABLE t10(a, b
7af0: 29 3b 0a 20 20 7d 0a 7d 20 7b 31 30 7d 0a 64 6f  );.  }.} {10}.do
7b00: 5f 63 61 74 63 68 73 71 6c 5f 74 65 73 74 20 70  _catchsql_test p
7b10: 61 67 65 72 31 2d 36 2e 32 20 7b 0a 20 20 43 52  ager1-6.2 {.  CR
7b20: 45 41 54 45 20 54 41 42 4c 45 20 74 31 31 28 61  EATE TABLE t11(a
7b30: 2c 20 62 29 0a 7d 20 7b 31 20 7b 64 61 74 61 62  , b).} {1 {datab
7b40: 61 73 65 20 6f 72 20 64 69 73 6b 20 69 73 20 66  ase or disk is f
7b50: 75 6c 6c 7d 7d 0a 64 6f 5f 65 78 65 63 73 71 6c  ull}}.do_execsql
7b60: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 36 2e 34  _test pager1-6.4
7b70: 20 7b 20 50 52 41 47 4d 41 20 6d 61 78 5f 70 61   { PRAGMA max_pa
7b80: 67 65 5f 63 6f 75 6e 74 20 20 20 20 20 20 7d 20  ge_count      } 
7b90: 7b 31 30 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  {10}.do_execsql_
7ba0: 74 65 73 74 20 70 61 67 65 72 31 2d 36 2e 35 20  test pager1-6.5 
7bb0: 7b 20 50 52 41 47 4d 41 20 6d 61 78 5f 70 61 67  { PRAGMA max_pag
7bc0: 65 5f 63 6f 75 6e 74 20 3d 20 31 35 20 7d 20 7b  e_count = 15 } {
7bd0: 31 35 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  15}.do_execsql_t
7be0: 65 73 74 20 70 61 67 65 72 31 2d 36 2e 36 20 7b  est pager1-6.6 {
7bf0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
7c00: 31 28 61 2c 20 62 29 20 20 20 20 20 7d 20 7b 7d  1(a, b)     } {}
7c10: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
7c20: 20 70 61 67 65 72 31 2d 36 2e 37 20 7b 0a 20 20   pager1-6.7 {.  
7c30: 42 45 47 49 4e 3b 0a 20 20 20 20 49 4e 53 45 52  BEGIN;.    INSER
7c40: 54 20 49 4e 54 4f 20 74 31 31 20 56 41 4c 55 45  T INTO t11 VALUE
7c50: 53 28 31 2c 20 32 29 3b 0a 20 20 20 20 50 52 41  S(1, 2);.    PRA
7c60: 47 4d 41 20 6d 61 78 5f 70 61 67 65 5f 63 6f 75  GMA max_page_cou
7c70: 6e 74 20 3d 20 31 33 3b 0a 7d 20 7b 31 33 7d 0a  nt = 13;.} {13}.
7c80: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
7c90: 70 61 67 65 72 31 2d 36 2e 38 20 7b 0a 20 20 20  pager1-6.8 {.   
7ca0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 31   INSERT INTO t11
7cb0: 20 56 41 4c 55 45 53 28 33 2c 20 34 29 3b 0a 20   VALUES(3, 4);. 
7cc0: 20 20 20 50 52 41 47 4d 41 20 6d 61 78 5f 70 61     PRAGMA max_pa
7cd0: 67 65 5f 63 6f 75 6e 74 20 3d 20 31 30 3b 0a 7d  ge_count = 10;.}
7ce0: 20 7b 31 31 7d 0a 64 6f 5f 65 78 65 63 73 71 6c   {11}.do_execsql
7cf0: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 36 2e 39  _test pager1-6.9
7d00: 20 7b 20 43 4f 4d 4d 49 54 20 7d 20 7b 7d 0a 0a   { COMMIT } {}..
7d10: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
7d20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7d40: 2d 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 0a 23 20 54 68  -----------.# Th
7d60: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74  e following test
7d70: 73 20 77 6f 72 6b 20 77 69 74 68 20 22 50 52 41  s work with "PRA
7d80: 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
7d90: 3d 54 52 55 4e 43 41 54 45 22 20 61 6e 64 0a 23  =TRUNCATE" and.#
7da0: 20 22 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67   "PRAGMA locking
7db0: 5f 6d 6f 64 65 3d 45 58 43 4c 55 53 49 56 45 22  _mode=EXCLUSIVE"
7dc0: 2e 0a 23 0a 23 20 45 61 63 68 20 74 65 73 74 20  ..#.# Each test 
7dd0: 69 73 20 73 70 65 63 69 66 69 65 64 20 77 69 74  is specified wit
7de0: 68 20 35 20 76 61 72 69 61 62 6c 65 73 2e 20 41  h 5 variables. A
7df0: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 23 0a 23 20 20  s follows:.#.#  
7e00: 20 24 74 6e 3a 20 20 54 65 73 74 20 4e 75 6d 62   $tn:  Test Numb
7e10: 65 72 2e 20 55 73 65 64 20 61 73 20 70 61 72 74  er. Used as part
7e20: 20 6f 66 20 74 68 65 20 5b 64 6f 5f 74 65 73 74   of the [do_test
7e30: 5d 20 74 65 73 74 20 6e 61 6d 65 73 2e 0a 23 20  ] test names..# 
7e40: 20 20 24 73 71 6c 3a 20 53 51 4c 20 74 6f 20 65    $sql: SQL to e
7e50: 78 65 63 75 74 65 2e 0a 23 20 20 20 24 72 65 73  xecute..#   $res
7e60: 3a 20 45 78 70 65 63 74 65 64 20 72 65 73 75 6c  : Expected resul
7e70: 74 20 6f 66 20 65 78 65 63 75 74 69 6e 67 20 24  t of executing $
7e80: 73 71 6c 2e 0a 23 20 20 20 24 6a 73 3a 20 20 54  sql..#   $js:  T
7e90: 68 65 20 65 78 70 65 63 74 65 64 20 73 69 7a 65  he expected size
7ea0: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
7eb0: 66 69 6c 65 2c 20 69 6e 20 62 79 74 65 73 2c 20  file, in bytes, 
7ec0: 61 66 74 65 72 20 65 78 65 63 75 74 69 6e 67 0a  after executing.
7ed0: 23 20 20 20 20 20 20 20 20 20 74 68 65 20 53 51  #         the SQ
7ee0: 4c 20 73 63 72 69 70 74 2e 20 4f 72 20 2d 31 20  L script. Or -1 
7ef0: 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  if the journal i
7f00: 73 20 6e 6f 74 20 65 78 70 65 63 74 65 64 20 74  s not expected t
7f10: 6f 20 65 78 69 73 74 2e 0a 23 20 20 20 24 77 73  o exist..#   $ws
7f20: 3a 20 20 54 68 65 20 65 78 70 65 63 74 65 64 20  :  The expected 
7f30: 73 69 7a 65 20 6f 66 20 74 68 65 20 57 41 4c 20  size of the WAL 
7f40: 66 69 6c 65 2c 20 69 6e 20 62 79 74 65 73 2c 20  file, in bytes, 
7f50: 61 66 74 65 72 20 65 78 65 63 75 74 69 6e 67 0a  after executing.
7f60: 23 20 20 20 20 20 20 20 20 20 74 68 65 20 53 51  #         the SQ
7f70: 4c 20 73 63 72 69 70 74 2e 20 4f 72 20 2d 31 20  L script. Or -1 
7f80: 69 66 20 74 68 65 20 57 41 4c 20 69 73 20 6e 6f  if the WAL is no
7f90: 74 20 65 78 70 65 63 74 65 64 20 74 6f 20 65 78  t expected to ex
7fa0: 69 73 74 2e 0a 23 0a 69 66 63 61 70 61 62 6c 65  ist..#.ifcapable
7fb0: 20 77 61 6c 20 7b 0a 20 20 66 61 75 6c 74 73 69   wal {.  faultsi
7fc0: 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f  m_delete_and_reo
7fd0: 70 65 6e 0a 20 20 66 6f 72 65 61 63 68 20 7b 74  pen.  foreach {t
7fe0: 6e 20 73 71 6c 20 72 65 73 20 6a 73 20 77 73 7d  n sql res js ws}
7ff0: 20 5b 73 75 62 73 74 20 7b 0a 20 20 0a 20 20 20   [subst {.  .   
8000: 20 31 20 20 7b 0a 20 20 20 20 20 20 43 52 45 41   1  {.      CREA
8010: 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62  TE TABLE t1(a, b
8020: 29 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20  );.      PRAGMA 
8030: 61 75 74 6f 5f 76 61 63 75 75 6d 3d 4f 46 46 3b  auto_vacuum=OFF;
8040: 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 73 79  .      PRAGMA sy
8050: 6e 63 68 72 6f 6e 6f 75 73 3d 4e 4f 52 4d 41 4c  nchronous=NORMAL
8060: 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 70  ;.      PRAGMA p
8070: 61 67 65 5f 73 69 7a 65 3d 31 30 32 34 3b 0a 20  age_size=1024;. 
8080: 20 20 20 20 20 50 52 41 47 4d 41 20 6c 6f 63 6b       PRAGMA lock
8090: 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55 53 49  ing_mode=EXCLUSI
80a0: 56 45 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41  VE;.      PRAGMA
80b0: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 54 52   journal_mode=TR
80c0: 55 4e 43 41 54 45 3b 0a 20 20 20 20 20 20 49 4e  UNCATE;.      IN
80d0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
80e0: 55 45 53 28 31 2c 20 32 29 3b 0a 20 20 20 20 7d  UES(1, 2);.    }
80f0: 20 7b 65 78 63 6c 75 73 69 76 65 20 74 72 75 6e   {exclusive trun
8100: 63 61 74 65 7d 20 30 20 2d 31 0a 20 20 0a 20 20  cate} 0 -1.  .  
8110: 20 20 32 20 20 7b 0a 20 20 20 20 20 20 42 45 47    2  {.      BEG
8120: 49 4e 20 49 4d 4d 45 44 49 41 54 45 3b 0a 20 20  IN IMMEDIATE;.  
8130: 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46        SELECT * F
8140: 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20 43 4f  ROM t1;.      CO
8150: 4d 4d 49 54 3b 0a 20 20 20 20 7d 20 7b 31 20 32  MMIT;.    } {1 2
8160: 7d 20 30 20 2d 31 0a 20 20 0a 20 20 20 20 33 20  } 0 -1.  .    3 
8170: 20 7b 0a 20 20 20 20 20 20 42 45 47 49 4e 3b 0a   {.      BEGIN;.
8180: 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a          SELECT *
8190: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20   FROM t1;.      
81a0: 43 4f 4d 4d 49 54 3b 0a 20 20 20 20 7d 20 7b 31  COMMIT;.    } {1
81b0: 20 32 7d 20 30 20 2d 31 0a 20 20 0a 20 20 20 20   2} 0 -1.  .    
81c0: 34 20 20 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72  4  { PRAGMA jour
81d0: 6e 61 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c 20 7d  nal_mode = WAL }
81e0: 20 20 20 20 77 61 6c 20 20 20 20 2d 31 20 2d 31      wal    -1 -1
81f0: 0a 20 20 20 20 35 20 20 7b 20 49 4e 53 45 52 54  .    5  { INSERT
8200: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
8210: 33 2c 20 34 29 20 7d 20 20 7b 7d 20 20 20 20 20  3, 4) }  {}     
8220: 2d 31 20 5b 77 61 6c 5f 66 69 6c 65 5f 73 69 7a  -1 [wal_file_siz
8230: 65 20 31 20 31 30 32 34 5d 0a 20 20 20 20 36 20  e 1 1024].    6 
8240: 20 7b 20 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e   { PRAGMA lockin
8250: 67 5f 6d 6f 64 65 20 3d 20 4e 4f 52 4d 41 4c 20  g_mode = NORMAL 
8260: 7d 20 6e 6f 72 6d 61 6c 20 2d 31 20 5b 77 61 6c  } normal -1 [wal
8270: 5f 66 69 6c 65 5f 73 69 7a 65 20 31 20 31 30 32  _file_size 1 102
8280: 34 5d 0a 20 20 20 20 37 20 20 7b 20 49 4e 53 45  4].    7  { INSE
8290: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
82a0: 53 28 35 2c 20 36 29 3b 20 7d 20 7b 7d 20 20 20  S(5, 6); } {}   
82b0: 20 20 2d 31 20 5b 77 61 6c 5f 66 69 6c 65 5f 73    -1 [wal_file_s
82c0: 69 7a 65 20 32 20 31 30 32 34 5d 0a 20 20 0a 20  ize 2 1024].  . 
82d0: 20 20 20 38 20 20 7b 20 50 52 41 47 4d 41 20 6a     8  { PRAGMA j
82e0: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 54 52  ournal_mode = TR
82f0: 55 4e 43 41 54 45 20 7d 20 74 72 75 6e 63 61 74  UNCATE } truncat
8300: 65 20 20 20 20 20 20 20 20 20 20 30 20 2d 31 0a  e          0 -1.
8310: 20 20 20 20 39 20 20 7b 20 49 4e 53 45 52 54 20      9  { INSERT 
8320: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 37  INTO t1 VALUES(7
8330: 2c 20 38 29 20 7d 20 20 20 20 7b 7d 20 20 20 20  , 8) }    {}    
8340: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 2d 31              0 -1
8350: 0a 20 20 20 20 31 30 20 7b 20 53 45 4c 45 43 54  .    10 { SELECT
8360: 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 20 20 20   * FROM t1 }    
8370: 20 20 20 20 20 20 20 20 20 20 20 7b 31 20 32 20             {1 2 
8380: 33 20 34 20 35 20 36 20 37 20 38 7d 20 30 20 2d  3 4 5 6 7 8} 0 -
8390: 31 0a 20 20 0a 20 20 7d 5d 20 7b 0a 20 20 20 20  1.  .  }] {.    
83a0: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
83b0: 70 61 67 65 72 31 2d 37 2e 31 2e 24 74 6e 2e 31  pager1-7.1.$tn.1
83c0: 20 24 73 71 6c 20 24 72 65 73 0a 20 20 20 20 63   $sql $res.    c
83d0: 61 74 63 68 20 7b 20 73 65 74 20 4a 20 2d 31 20  atch { set J -1 
83e0: 3b 20 73 65 74 20 4a 20 5b 66 69 6c 65 20 73 69  ; set J [file si
83f0: 7a 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e  ze test.db-journ
8400: 61 6c 5d 20 7d 0a 20 20 20 20 63 61 74 63 68 20  al] }.    catch 
8410: 7b 20 73 65 74 20 57 20 2d 31 20 3b 20 73 65 74  { set W -1 ; set
8420: 20 57 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65   W [file size te
8430: 73 74 2e 64 62 2d 77 61 6c 5d 20 7d 0a 20 20 20  st.db-wal] }.   
8440: 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
8450: 37 2e 31 2e 24 74 6e 2e 32 20 7b 20 6c 69 73 74  7.1.$tn.2 { list
8460: 20 24 4a 20 24 57 20 7d 20 5b 6c 69 73 74 20 24   $J $W } [list $
8470: 6a 73 20 24 77 73 5d 0a 20 20 7d 0a 7d 0a 0a 23  js $ws].  }.}..#
8480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
84a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
84b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
84c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 65 20  ---------.# The 
84d0: 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74 73 2c  following tests,
84e0: 20 70 61 67 65 72 31 2d 38 2e 2a 2c 20 74 65 73   pager1-8.*, tes
84f0: 74 20 74 68 61 74 20 74 68 65 20 73 70 65 63 69  t that the speci
8500: 61 6c 20 66 69 6c 65 6e 61 6d 65 73 20 0a 23 20  al filenames .# 
8510: 22 3a 6d 65 6d 6f 72 79 3a 22 20 61 6e 64 20 22  ":memory:" and "
8520: 22 20 6f 70 65 6e 20 74 65 6d 70 6f 72 61 72 79  " open temporary
8530: 20 64 61 74 61 62 61 73 65 73 2e 0a 23 0a 66 6f   databases..#.fo
8540: 72 65 61 63 68 20 7b 74 6e 20 66 69 6c 65 6e 61  reach {tn filena
8550: 6d 65 7d 20 7b 0a 20 20 31 20 3a 6d 65 6d 6f 72  me} {.  1 :memor
8560: 79 3a 0a 20 20 32 20 22 22 0a 7d 20 7b 0a 20 20  y:.  2 "".} {.  
8570: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 38  do_test pager1-8
8580: 2e 24 74 6e 2e 31 20 7b 0a 20 20 20 20 66 61 75  .$tn.1 {.    fau
8590: 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64  ltsim_delete_and
85a0: 5f 72 65 6f 70 65 6e 0a 20 20 20 20 64 62 20 63  _reopen.    db c
85b0: 6c 6f 73 65 0a 20 20 20 20 73 71 6c 69 74 65 33  lose.    sqlite3
85c0: 20 64 62 20 24 66 69 6c 65 6e 61 6d 65 0a 20 20   db $filename.  
85d0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
85e0: 20 20 50 52 41 47 4d 41 20 61 75 74 6f 5f 76 61    PRAGMA auto_va
85f0: 63 75 75 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20  cuum = 1;.      
8600: 43 52 45 41 54 45 20 54 41 42 4c 45 20 78 31 28  CREATE TABLE x1(
8610: 78 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  x);.      INSERT
8620: 20 49 4e 54 4f 20 78 31 20 56 41 4c 55 45 53 28   INTO x1 VALUES(
8630: 27 43 68 61 72 6c 65 73 27 29 3b 0a 20 20 20 20  'Charles');.    
8640: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 31    INSERT INTO x1
8650: 20 56 41 4c 55 45 53 28 27 4a 61 6d 65 73 27 29   VALUES('James')
8660: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
8670: 4e 54 4f 20 78 31 20 56 41 4c 55 45 53 28 27 4d  NTO x1 VALUES('M
8680: 61 72 79 27 29 3b 0a 20 20 20 20 20 20 53 45 4c  ary');.      SEL
8690: 45 43 54 20 2a 20 46 52 4f 4d 20 78 31 3b 0a 20  ECT * FROM x1;. 
86a0: 20 20 20 7d 0a 20 20 7d 20 7b 43 68 61 72 6c 65     }.  } {Charle
86b0: 73 20 4a 61 6d 65 73 20 4d 61 72 79 7d 0a 0a 20  s James Mary}.. 
86c0: 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
86d0: 38 2e 24 74 6e 2e 32 20 7b 0a 20 20 20 20 73 71  8.$tn.2 {.    sq
86e0: 6c 69 74 65 33 20 64 62 32 20 24 66 69 6c 65 6e  lite3 db2 $filen
86f0: 61 6d 65 0a 20 20 20 20 63 61 74 63 68 73 71 6c  ame.    catchsql
8700: 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d   { SELECT * FROM
8710: 20 78 31 20 7d 20 64 62 32 0a 20 20 7d 20 7b 31   x1 } db2.  } {1
8720: 20 7b 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a   {no such table:
8730: 20 78 31 7d 7d 0a 0a 20 20 64 6f 5f 65 78 65 63   x1}}..  do_exec
8740: 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d  sql_test pager1-
8750: 38 2e 24 74 6e 2e 33 20 7b 0a 20 20 20 20 42 45  8.$tn.3 {.    BE
8760: 47 49 4e 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  GIN;.      INSER
8770: 54 20 49 4e 54 4f 20 78 31 20 56 41 4c 55 45 53  T INTO x1 VALUES
8780: 28 27 57 69 6c 6c 69 61 6d 27 29 3b 0a 20 20 20  ('William');.   
8790: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78     INSERT INTO x
87a0: 31 20 56 41 4c 55 45 53 28 27 41 6e 6e 65 27 29  1 VALUES('Anne')
87b0: 3b 0a 20 20 20 20 52 4f 4c 4c 42 41 43 4b 3b 0a  ;.    ROLLBACK;.
87c0: 20 20 7d 20 7b 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d    } {}.}..#-----
87d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
87e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
87f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8810: 2d 2d 2d 2d 0a 23 20 54 68 65 20 6e 65 78 74 20  ----.# The next 
8820: 62 6c 6f 63 6b 20 6f 66 20 74 65 73 74 73 20 2d  block of tests -
8830: 20 70 61 67 65 72 31 2d 39 2e 2a 20 2d 20 64 65   pager1-9.* - de
8840: 61 6c 20 77 69 74 68 20 69 6e 74 65 72 61 63 74  al with interact
8850: 69 6f 6e 73 20 62 65 74 77 65 65 6e 0a 23 20 74  ions between.# t
8860: 68 65 20 70 61 67 65 72 20 61 6e 64 20 74 68 65  he pager and the
8870: 20 62 61 63 6b 75 70 20 41 50 49 2e 20 54 65 73   backup API. Tes
8880: 74 20 63 61 73 65 73 3a 0a 23 0a 23 20 20 20 70  t cases:.#.#   p
8890: 61 67 65 72 31 2d 39 2e 31 2e 2a 3a 20 54 65 73  ager1-9.1.*: Tes
88a0: 74 20 74 68 61 74 20 61 20 62 61 63 6b 75 70 20  t that a backup 
88b0: 63 6f 6d 70 6c 65 74 65 73 20 73 75 63 63 65 73  completes succes
88c0: 73 66 75 6c 6c 79 20 65 76 65 6e 20 69 66 20 74  sfully even if t
88d0: 68 65 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  he.#            
88e0: 20 20 20 20 20 73 6f 75 72 63 65 20 64 62 20 69       source db i
88f0: 73 20 77 72 69 74 74 65 6e 20 74 6f 20 64 75 72  s written to dur
8900: 69 6e 67 20 74 68 65 20 62 61 63 6b 75 70 20 6f  ing the backup o
8910: 70 2e 0a 23 0a 23 20 20 20 70 61 67 65 72 31 2d  p..#.#   pager1-
8920: 39 2e 32 2e 2a 3a 20 54 65 73 74 20 74 68 61 74  9.2.*: Test that
8930: 20 61 20 62 61 63 6b 75 70 20 63 6f 6d 70 6c 65   a backup comple
8940: 74 65 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79  tes successfully
8950: 20 65 76 65 6e 20 69 66 20 74 68 65 0a 23 20 20   even if the.#  
8960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
8970: 6f 75 72 63 65 20 64 62 20 69 73 20 77 72 69 74  ource db is writ
8980: 74 65 6e 20 74 6f 20 61 6e 64 20 74 68 65 6e 20  ten to and then 
8990: 72 6f 6c 6c 65 64 20 62 61 63 6b 20 64 75 72 69  rolled back duri
89a0: 6e 67 20 61 20 0a 23 20 20 20 20 20 20 20 20 20  ng a .#         
89b0: 20 20 20 20 20 20 20 20 62 61 63 6b 75 70 20 6f          backup o
89c0: 70 65 72 61 74 69 6f 6e 2e 0a 23 0a 64 6f 5f 74  peration..#.do_t
89d0: 65 73 74 20 70 61 67 65 72 31 2d 39 2e 30 2e 31  est pager1-9.0.1
89e0: 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65   {.  faultsim_de
89f0: 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a  lete_and_reopen.
8a00: 20 20 64 62 20 66 75 6e 63 20 61 5f 73 74 72 69    db func a_stri
8a10: 6e 67 20 61 5f 73 74 72 69 6e 67 0a 20 20 65 78  ng a_string.  ex
8a20: 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47  ecsql {.    PRAG
8a30: 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 20 3d 20  MA cache_size = 
8a40: 31 30 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20  10;.    BEGIN;. 
8a50: 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c       CREATE TABL
8a60: 45 20 61 62 28 61 2c 20 62 2c 20 55 4e 49 51 55  E ab(a, b, UNIQU
8a70: 45 28 61 2c 20 62 29 29 3b 0a 20 20 20 20 20 20  E(a, b));.      
8a80: 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 20 56  INSERT INTO ab V
8a90: 41 4c 55 45 53 28 20 61 5f 73 74 72 69 6e 67 28  ALUES( a_string(
8aa0: 32 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 33  200), a_string(3
8ab0: 30 30 29 20 29 3b 0a 20 20 20 20 20 20 49 4e 53  00) );.      INS
8ac0: 45 52 54 20 49 4e 54 4f 20 61 62 20 53 45 4c 45  ERT INTO ab SELE
8ad0: 43 54 20 61 5f 73 74 72 69 6e 67 28 32 30 30 29  CT a_string(200)
8ae0: 2c 20 61 5f 73 74 72 69 6e 67 28 33 30 30 29 20  , a_string(300) 
8af0: 46 52 4f 4d 20 61 62 3b 0a 20 20 20 20 20 20 49  FROM ab;.      I
8b00: 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 20 53 45  NSERT INTO ab SE
8b10: 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 32 30  LECT a_string(20
8b20: 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 33 30 30  0), a_string(300
8b30: 29 20 46 52 4f 4d 20 61 62 3b 0a 20 20 20 20 20  ) FROM ab;.     
8b40: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 20   INSERT INTO ab 
8b50: 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28  SELECT a_string(
8b60: 32 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 33  200), a_string(3
8b70: 30 30 29 20 46 52 4f 4d 20 61 62 3b 0a 20 20 20  00) FROM ab;.   
8b80: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61     INSERT INTO a
8b90: 62 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e  b SELECT a_strin
8ba0: 67 28 32 30 30 29 2c 20 61 5f 73 74 72 69 6e 67  g(200), a_string
8bb0: 28 33 30 30 29 20 46 52 4f 4d 20 61 62 3b 0a 20  (300) FROM ab;. 
8bc0: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
8bd0: 20 61 62 20 53 45 4c 45 43 54 20 61 5f 73 74 72   ab SELECT a_str
8be0: 69 6e 67 28 32 30 30 29 2c 20 61 5f 73 74 72 69  ing(200), a_stri
8bf0: 6e 67 28 33 30 30 29 20 46 52 4f 4d 20 61 62 3b  ng(300) FROM ab;
8c00: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
8c10: 54 4f 20 61 62 20 53 45 4c 45 43 54 20 61 5f 73  TO ab SELECT a_s
8c20: 74 72 69 6e 67 28 32 30 30 29 2c 20 61 5f 73 74  tring(200), a_st
8c30: 72 69 6e 67 28 33 30 30 29 20 46 52 4f 4d 20 61  ring(300) FROM a
8c40: 62 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  b;.      INSERT 
8c50: 49 4e 54 4f 20 61 62 20 53 45 4c 45 43 54 20 61  INTO ab SELECT a
8c60: 5f 73 74 72 69 6e 67 28 32 30 30 29 2c 20 61 5f  _string(200), a_
8c70: 73 74 72 69 6e 67 28 33 30 30 29 20 46 52 4f 4d  string(300) FROM
8c80: 20 61 62 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b   ab;.    COMMIT;
8c90: 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73  .  }.} {}.do_tes
8ca0: 74 20 70 61 67 65 72 31 2d 39 2e 30 2e 32 20 7b  t pager1-9.0.2 {
8cb0: 0a 20 20 73 71 6c 69 74 65 33 20 64 62 32 20 74  .  sqlite3 db2 t
8cc0: 65 73 74 2e 64 62 32 0a 20 20 64 62 32 20 65 76  est.db2.  db2 ev
8cd0: 61 6c 20 7b 20 50 52 41 47 4d 41 20 63 61 63 68  al { PRAGMA cach
8ce0: 65 5f 73 69 7a 65 20 3d 20 31 30 20 7d 0a 20 20  e_size = 10 }.  
8cf0: 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 42  sqlite3_backup B
8d00: 20 64 62 32 20 6d 61 69 6e 20 64 62 20 6d 61 69   db2 main db mai
8d10: 6e 0a 20 20 6c 69 73 74 20 5b 42 20 73 74 65 70  n.  list [B step
8d20: 20 31 30 30 30 30 5d 20 5b 42 20 66 69 6e 69 73   10000] [B finis
8d30: 68 5d 0a 7d 20 7b 53 51 4c 49 54 45 5f 44 4f 4e  h].} {SQLITE_DON
8d40: 45 20 53 51 4c 49 54 45 5f 4f 4b 7d 0a 64 6f 5f  E SQLITE_OK}.do_
8d50: 74 65 73 74 20 70 61 67 65 72 31 2d 39 2e 30 2e  test pager1-9.0.
8d60: 33 20 7b 0a 20 64 62 20 6f 6e 65 20 7b 53 45 4c  3 {. db one {SEL
8d70: 45 43 54 20 6d 64 35 73 75 6d 28 61 2c 20 62 29  ECT md5sum(a, b)
8d80: 20 46 52 4f 4d 20 61 62 7d 0a 7d 20 5b 64 62 32   FROM ab}.} [db2
8d90: 20 6f 6e 65 20 7b 53 45 4c 45 43 54 20 6d 64 35   one {SELECT md5
8da0: 73 75 6d 28 61 2c 20 62 29 20 46 52 4f 4d 20 61  sum(a, b) FROM a
8db0: 62 7d 5d 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67  b}]..do_test pag
8dc0: 65 72 31 2d 39 2e 31 2e 31 20 7b 0a 20 20 65 78  er1-9.1.1 {.  ex
8dd0: 65 63 73 71 6c 20 7b 20 55 50 44 41 54 45 20 61  ecsql { UPDATE a
8de0: 62 20 53 45 54 20 61 20 3d 20 61 5f 73 74 72 69  b SET a = a_stri
8df0: 6e 67 28 32 30 31 29 20 7d 0a 20 20 73 71 6c 69  ng(201) }.  sqli
8e00: 74 65 33 5f 62 61 63 6b 75 70 20 42 20 64 62 32  te3_backup B db2
8e10: 20 6d 61 69 6e 20 64 62 20 6d 61 69 6e 0a 20 20   main db main.  
8e20: 42 20 73 74 65 70 20 33 30 0a 7d 20 7b 53 51 4c  B step 30.} {SQL
8e30: 49 54 45 5f 4f 4b 7d 0a 64 6f 5f 74 65 73 74 20  ITE_OK}.do_test 
8e40: 70 61 67 65 72 31 2d 39 2e 31 2e 32 20 7b 0a 20  pager1-9.1.2 {. 
8e50: 20 65 78 65 63 73 71 6c 20 7b 20 55 50 44 41 54   execsql { UPDAT
8e60: 45 20 61 62 20 53 45 54 20 62 20 3d 20 61 5f 73  E ab SET b = a_s
8e70: 74 72 69 6e 67 28 33 30 31 29 20 7d 0a 20 20 6c  tring(301) }.  l
8e80: 69 73 74 20 5b 42 20 73 74 65 70 20 31 30 30 30  ist [B step 1000
8e90: 30 5d 20 5b 42 20 66 69 6e 69 73 68 5d 0a 7d 20  0] [B finish].} 
8ea0: 7b 53 51 4c 49 54 45 5f 44 4f 4e 45 20 53 51 4c  {SQLITE_DONE SQL
8eb0: 49 54 45 5f 4f 4b 7d 0a 64 6f 5f 74 65 73 74 20  ITE_OK}.do_test 
8ec0: 70 61 67 65 72 31 2d 39 2e 31 2e 33 20 7b 0a 20  pager1-9.1.3 {. 
8ed0: 64 62 20 6f 6e 65 20 7b 53 45 4c 45 43 54 20 6d  db one {SELECT m
8ee0: 64 35 73 75 6d 28 61 2c 20 62 29 20 46 52 4f 4d  d5sum(a, b) FROM
8ef0: 20 61 62 7d 0a 7d 20 5b 64 62 32 20 6f 6e 65 20   ab}.} [db2 one 
8f00: 7b 53 45 4c 45 43 54 20 6d 64 35 73 75 6d 28 61  {SELECT md5sum(a
8f10: 2c 20 62 29 20 46 52 4f 4d 20 61 62 7d 5d 0a 64  , b) FROM ab}].d
8f20: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 39 2e  o_test pager1-9.
8f30: 31 2e 34 20 7b 20 65 78 65 63 73 71 6c 20 7b 20  1.4 { execsql { 
8f40: 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
8f50: 46 52 4f 4d 20 61 62 20 7d 20 7d 20 7b 31 32 38  FROM ab } } {128
8f60: 7d 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  }..do_test pager
8f70: 31 2d 39 2e 32 2e 31 20 7b 0a 20 20 65 78 65 63  1-9.2.1 {.  exec
8f80: 73 71 6c 20 7b 20 55 50 44 41 54 45 20 61 62 20  sql { UPDATE ab 
8f90: 53 45 54 20 61 20 3d 20 61 5f 73 74 72 69 6e 67  SET a = a_string
8fa0: 28 32 30 32 29 20 7d 0a 20 20 73 71 6c 69 74 65  (202) }.  sqlite
8fb0: 33 5f 62 61 63 6b 75 70 20 42 20 64 62 32 20 6d  3_backup B db2 m
8fc0: 61 69 6e 20 64 62 20 6d 61 69 6e 0a 20 20 42 20  ain db main.  B 
8fd0: 73 74 65 70 20 33 30 0a 7d 20 7b 53 51 4c 49 54  step 30.} {SQLIT
8fe0: 45 5f 4f 4b 7d 0a 64 6f 5f 74 65 73 74 20 70 61  E_OK}.do_test pa
8ff0: 67 65 72 31 2d 39 2e 32 2e 32 20 7b 0a 20 20 65  ger1-9.2.2 {.  e
9000: 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 42 45  xecsql { .    BE
9010: 47 49 4e 3b 0a 20 20 20 20 20 20 55 50 44 41 54  GIN;.      UPDAT
9020: 45 20 61 62 20 53 45 54 20 62 20 3d 20 61 5f 73  E ab SET b = a_s
9030: 74 72 69 6e 67 28 33 30 31 29 3b 0a 20 20 20 20  tring(301);.    
9040: 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 7d 0a 20 20  ROLLBACK;.  }.  
9050: 6c 69 73 74 20 5b 42 20 73 74 65 70 20 31 30 30  list [B step 100
9060: 30 30 5d 20 5b 42 20 66 69 6e 69 73 68 5d 0a 7d  00] [B finish].}
9070: 20 7b 53 51 4c 49 54 45 5f 44 4f 4e 45 20 53 51   {SQLITE_DONE SQ
9080: 4c 49 54 45 5f 4f 4b 7d 0a 64 6f 5f 74 65 73 74  LITE_OK}.do_test
9090: 20 70 61 67 65 72 31 2d 39 2e 32 2e 33 20 7b 0a   pager1-9.2.3 {.
90a0: 20 64 62 20 6f 6e 65 20 7b 53 45 4c 45 43 54 20   db one {SELECT 
90b0: 6d 64 35 73 75 6d 28 61 2c 20 62 29 20 46 52 4f  md5sum(a, b) FRO
90c0: 4d 20 61 62 7d 0a 7d 20 5b 64 62 32 20 6f 6e 65  M ab}.} [db2 one
90d0: 20 7b 53 45 4c 45 43 54 20 6d 64 35 73 75 6d 28   {SELECT md5sum(
90e0: 61 2c 20 62 29 20 46 52 4f 4d 20 61 62 7d 5d 0a  a, b) FROM ab}].
90f0: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 39  do_test pager1-9
9100: 2e 32 2e 34 20 7b 20 65 78 65 63 73 71 6c 20 7b  .2.4 { execsql {
9110: 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29   SELECT count(*)
9120: 20 46 52 4f 4d 20 61 62 20 7d 20 7d 20 7b 31 32   FROM ab } } {12
9130: 38 7d 0a 64 62 20 63 6c 6f 73 65 0a 64 62 32 20  8}.db close.db2 
9140: 63 6c 6f 73 65 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  close..#--------
9150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9190: 2d 0a 23 20 54 65 73 74 20 74 68 61 74 20 72 65  -.# Test that re
91a0: 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20  gardless of the 
91b0: 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  value returned b
91c0: 79 20 78 53 65 63 74 6f 72 53 69 7a 65 28 29 2c  y xSectorSize(),
91d0: 20 74 68 65 0a 23 20 6d 69 6e 69 6d 75 6d 20 65   the.# minimum e
91e0: 66 66 65 63 74 69 76 65 20 73 65 63 74 6f 72 2d  ffective sector-
91f0: 73 69 7a 65 20 69 73 20 35 31 32 20 61 6e 64 20  size is 512 and 
9200: 74 68 65 20 6d 61 78 69 6d 75 6d 20 36 35 35 33  the maximum 6553
9210: 36 20 62 79 74 65 73 2e 0a 23 0a 74 65 73 74 76  6 bytes..#.testv
9220: 66 73 20 74 76 20 2d 64 65 66 61 75 6c 74 20 31  fs tv -default 1
9230: 0a 66 6f 72 65 61 63 68 20 73 65 63 74 6f 72 73  .foreach sectors
9240: 69 7a 65 20 7b 0a 20 20 20 20 33 32 20 20 20 36  ize {.    32   6
9250: 34 20 20 20 31 32 38 20 20 20 32 35 36 20 20 20  4   128   256   
9260: 35 31 32 20 20 20 31 30 32 34 20 20 20 32 30 34  512   1024   204
9270: 38 20 0a 20 20 20 20 34 30 39 36 20 38 31 39 32  8 .    4096 8192
9280: 20 31 36 33 38 34 20 33 32 37 36 38 20 36 35 35   16384 32768 655
9290: 33 36 20 31 33 31 30 37 32 20 32 36 32 31 34 34  36 131072 262144
92a0: 0a 7d 20 7b 0a 20 20 74 76 20 73 65 63 74 6f 72  .} {.  tv sector
92b0: 73 69 7a 65 20 24 73 65 63 74 6f 72 73 69 7a 65  size $sectorsize
92c0: 0a 20 20 73 65 74 20 65 66 66 20 24 73 65 63 74  .  set eff $sect
92d0: 6f 72 73 69 7a 65 0a 20 20 69 66 20 7b 24 73 65  orsize.  if {$se
92e0: 63 74 6f 72 73 69 7a 65 20 3c 20 35 31 32 7d 20  ctorsize < 512} 
92f0: 20 20 7b 20 73 65 74 20 65 66 66 20 35 31 32 20    { set eff 512 
9300: 7d 0a 20 20 69 66 20 7b 24 73 65 63 74 6f 72 73  }.  if {$sectors
9310: 69 7a 65 20 3e 20 36 35 35 33 36 7d 20 7b 20 73  ize > 65536} { s
9320: 65 74 20 65 66 66 20 36 35 35 33 36 20 7d 0a 0a  et eff 65536 }..
9330: 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
9340: 2d 31 30 2e 24 73 65 63 74 6f 72 73 69 7a 65 20  -10.$sectorsize 
9350: 7b 0a 20 20 20 20 66 61 75 6c 74 73 69 6d 5f 64  {.    faultsim_d
9360: 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e  elete_and_reopen
9370: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  .    execsql {. 
9380: 20 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72       PRAGMA jour
9390: 6e 61 6c 5f 6d 6f 64 65 20 3d 20 50 45 52 53 49  nal_mode = PERSI
93a0: 53 54 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41  ST;.      PRAGMA
93b0: 20 70 61 67 65 5f 73 69 7a 65 20 3d 20 31 30 32   page_size = 102
93c0: 34 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45 20  4;.      CREATE 
93d0: 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a  TABLE t1(a, b);.
93e0: 20 20 20 20 7d 0a 20 20 20 20 66 69 6c 65 20 73      }.    file s
93f0: 69 7a 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72  ize test.db-jour
9400: 6e 61 6c 0a 20 20 7d 20 5b 65 78 70 72 20 24 73  nal.  } [expr $s
9410: 65 63 74 6f 72 73 69 7a 65 20 3e 20 36 35 35 33  ectorsize > 6553
9420: 36 20 3f 20 36 35 35 33 36 20 3a 20 24 73 65 63  6 ? 65536 : $sec
9430: 74 6f 72 73 69 7a 65 5d 0a 7d 0a 64 62 20 63 6c  torsize].}.db cl
9440: 6f 73 65 0a 74 76 20 64 65 6c 65 74 65 0a 0a 74  ose.tv delete..t
9450: 65 73 74 76 66 73 20 74 76 20 2d 64 65 66 61 75  estvfs tv -defau
9460: 6c 74 20 31 0a 66 61 75 6c 74 73 69 6d 5f 64 65  lt 1.faultsim_de
9470: 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a  lete_and_reopen.
9480: 64 62 20 66 75 6e 63 20 61 5f 73 74 72 69 6e 67  db func a_string
9490: 20 61 5f 73 74 72 69 6e 67 0a 64 6f 5f 65 78 65   a_string.do_exe
94a0: 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31  csql_test pager1
94b0: 2d 31 31 2e 31 20 7b 0a 20 20 50 52 41 47 4d 41  -11.1 {.  PRAGMA
94c0: 20 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 31 30   cache_size = 10
94d0: 3b 0a 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 43  ;.  BEGIN;.    C
94e0: 52 45 41 54 45 20 54 41 42 4c 45 20 7a 7a 28 74  REATE TABLE zz(t
94f0: 6f 70 20 50 52 49 4d 41 52 59 20 4b 45 59 29 3b  op PRIMARY KEY);
9500: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
9510: 20 7a 7a 20 56 41 4c 55 45 53 28 61 5f 73 74 72   zz VALUES(a_str
9520: 69 6e 67 28 32 32 32 29 29 3b 0a 20 20 20 20 49  ing(222));.    I
9530: 4e 53 45 52 54 20 49 4e 54 4f 20 7a 7a 20 53 45  NSERT INTO zz SE
9540: 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 28 53  LECT a_string((S
9550: 45 4c 45 43 54 20 32 32 32 2b 6d 61 78 28 72 6f  ELECT 222+max(ro
9560: 77 69 64 29 20 46 52 4f 4d 20 7a 7a 29 29 20 46  wid) FROM zz)) F
9570: 52 4f 4d 20 7a 7a 3b 0a 20 20 20 20 49 4e 53 45  ROM zz;.    INSE
9580: 52 54 20 49 4e 54 4f 20 7a 7a 20 53 45 4c 45 43  RT INTO zz SELEC
9590: 54 20 61 5f 73 74 72 69 6e 67 28 28 53 45 4c 45  T a_string((SELE
95a0: 43 54 20 32 32 32 2b 6d 61 78 28 72 6f 77 69 64  CT 222+max(rowid
95b0: 29 20 46 52 4f 4d 20 7a 7a 29 29 20 46 52 4f 4d  ) FROM zz)) FROM
95c0: 20 7a 7a 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   zz;.    INSERT 
95d0: 49 4e 54 4f 20 7a 7a 20 53 45 4c 45 43 54 20 61  INTO zz SELECT a
95e0: 5f 73 74 72 69 6e 67 28 28 53 45 4c 45 43 54 20  _string((SELECT 
95f0: 32 32 32 2b 6d 61 78 28 72 6f 77 69 64 29 20 46  222+max(rowid) F
9600: 52 4f 4d 20 7a 7a 29 29 20 46 52 4f 4d 20 7a 7a  ROM zz)) FROM zz
9610: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
9620: 4f 20 7a 7a 20 53 45 4c 45 43 54 20 61 5f 73 74  O zz SELECT a_st
9630: 72 69 6e 67 28 28 53 45 4c 45 43 54 20 32 32 32  ring((SELECT 222
9640: 2b 6d 61 78 28 72 6f 77 69 64 29 20 46 52 4f 4d  +max(rowid) FROM
9650: 20 7a 7a 29 29 20 46 52 4f 4d 20 7a 7a 3b 0a 20   zz)) FROM zz;. 
9660: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a     INSERT INTO z
9670: 7a 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e  z SELECT a_strin
9680: 67 28 28 53 45 4c 45 43 54 20 32 32 32 2b 6d 61  g((SELECT 222+ma
9690: 78 28 72 6f 77 69 64 29 20 46 52 4f 4d 20 7a 7a  x(rowid) FROM zz
96a0: 29 29 20 46 52 4f 4d 20 7a 7a 3b 0a 20 20 43 4f  )) FROM zz;.  CO
96b0: 4d 4d 49 54 3b 0a 20 20 42 45 47 49 4e 3b 0a 20  MMIT;.  BEGIN;. 
96c0: 20 20 20 55 50 44 41 54 45 20 7a 7a 20 53 45 54     UPDATE zz SET
96d0: 20 74 6f 70 20 3d 20 61 5f 73 74 72 69 6e 67 28   top = a_string(
96e0: 33 34 35 29 3b 0a 7d 20 7b 7d 0a 0a 70 72 6f 63  345);.} {}..proc
96f0: 20 6c 6f 63 6b 6f 75 74 20 7b 6d 65 74 68 6f 64   lockout {method
9700: 20 61 72 67 73 7d 20 7b 20 72 65 74 75 72 6e 20   args} { return 
9710: 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 7d 0a 74  SQLITE_IOERR }.t
9720: 76 20 73 63 72 69 70 74 20 6c 6f 63 6b 6f 75 74  v script lockout
9730: 0a 74 76 20 66 69 6c 74 65 72 20 7b 78 57 72 69  .tv filter {xWri
9740: 74 65 20 78 54 72 75 6e 63 61 74 65 20 78 53 79  te xTruncate xSy
9750: 6e 63 7d 0a 64 6f 5f 63 61 74 63 68 73 71 6c 5f  nc}.do_catchsql_
9760: 74 65 73 74 20 70 61 67 65 72 31 2d 31 31 2e 32  test pager1-11.2
9770: 20 7b 20 43 4f 4d 4d 49 54 20 7d 20 7b 31 20 7b   { COMMIT } {1 {
9780: 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 7d 7d  disk I/O error}}
9790: 0a 0a 74 76 20 73 63 72 69 70 74 20 7b 7d 0a 64  ..tv script {}.d
97a0: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 31  o_test pager1-11
97b0: 2e 33 20 7b 0a 20 20 73 71 6c 69 74 65 33 20 64  .3 {.  sqlite3 d
97c0: 62 32 20 74 65 73 74 2e 64 62 0a 20 20 65 78 65  b2 test.db.  exe
97d0: 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d  csql {.    PRAGM
97e0: 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d  A journal_mode =
97f0: 20 54 52 55 4e 43 41 54 45 3b 0a 20 20 20 20 50   TRUNCATE;.    P
9800: 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f  RAGMA integrity_
9810: 63 68 65 63 6b 3b 0a 20 20 7d 20 64 62 32 0a 7d  check;.  } db2.}
9820: 20 7b 74 72 75 6e 63 61 74 65 20 6f 6b 7d 0a 64   {truncate ok}.d
9830: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 31  o_test pager1-11
9840: 2e 34 20 7b 0a 20 20 64 62 32 20 63 6c 6f 73 65  .4 {.  db2 close
9850: 0a 20 20 66 69 6c 65 20 73 69 7a 65 20 74 65 73  .  file size tes
9860: 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 7d 20 7b  t.db-journal.} {
9870: 30 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  0}.do_execsql_te
9880: 73 74 20 70 61 67 65 72 31 2d 31 31 2e 35 20 7b  st pager1-11.5 {
9890: 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29   SELECT count(*)
98a0: 20 46 52 4f 4d 20 7a 7a 20 7d 20 7b 33 32 7d 0a   FROM zz } {32}.
98b0: 64 62 20 63 6c 6f 73 65 0a 74 76 20 64 65 6c 65  db close.tv dele
98c0: 74 65 0a 20 20 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  te.  .#---------
98d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
98e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
98f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9910: 0a 23 20 54 65 73 74 20 22 50 52 41 47 4d 41 20  .# Test "PRAGMA 
9920: 70 61 67 65 5f 73 69 7a 65 22 0a 23 0a 66 6f 72  page_size".#.for
9930: 65 61 63 68 20 70 61 67 65 73 69 7a 65 20 7b 0a  each pagesize {.
9940: 20 20 20 20 35 31 32 20 20 20 31 30 32 34 20 20      512   1024  
9950: 20 32 30 34 38 20 34 30 39 36 20 38 31 39 32 20   2048 4096 8192 
9960: 31 36 33 38 34 20 33 32 37 36 38 20 0a 7d 20 7b  16384 32768 .} {
9970: 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65  .  faultsim_dele
9980: 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 0a 20  te_and_reopen.. 
9990: 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
99a0: 31 32 2e 24 70 61 67 65 73 69 7a 65 2e 31 20 7b  12.$pagesize.1 {
99b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 20 64 62 32  .    sqlite3 db2
99c0: 20 74 65 73 74 2e 64 62 0a 20 20 20 20 65 78 65   test.db.    exe
99d0: 63 73 71 6c 20 22 0a 20 20 20 20 20 20 50 52 41  csql ".      PRA
99e0: 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20  GMA page_size = 
99f0: 24 70 61 67 65 73 69 7a 65 3b 0a 20 20 20 20 20  $pagesize;.     
9a00: 20 43 52 45 41 54 45 20 56 49 45 57 20 76 20 41   CREATE VIEW v A
9a10: 53 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  S SELECT * FROM 
9a20: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 3b 0a 20  sqlite_master;. 
9a30: 20 20 20 22 20 64 62 32 0a 20 20 20 20 66 69 6c     " db2.    fil
9a40: 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 0a 20  e size test.db. 
9a50: 20 7d 20 24 70 61 67 65 73 69 7a 65 0a 20 20 64   } $pagesize.  d
9a60: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 32  o_test pager1-12
9a70: 2e 24 70 61 67 65 73 69 7a 65 2e 32 20 7b 0a 20  .$pagesize.2 {. 
9a80: 20 20 20 73 71 6c 69 74 65 33 20 64 62 32 20 74     sqlite3 db2 t
9a90: 65 73 74 2e 64 62 0a 20 20 20 20 65 78 65 63 73  est.db.    execs
9aa0: 71 6c 20 7b 20 0a 20 20 20 20 20 20 53 45 4c 45  ql { .      SELE
9ab0: 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
9ac0: 20 76 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41   v;.      PRAGMA
9ad0: 20 6d 61 69 6e 2e 70 61 67 65 5f 73 69 7a 65 3b   main.page_size;
9ae0: 0a 20 20 20 20 7d 20 64 62 32 0a 20 20 7d 20 5b  .    } db2.  } [
9af0: 6c 69 73 74 20 31 20 24 70 61 67 65 73 69 7a 65  list 1 $pagesize
9b00: 5d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65  ].  do_test page
9b10: 72 31 2d 31 32 2e 24 70 61 67 65 73 69 7a 65 2e  r1-12.$pagesize.
9b20: 33 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20  3 {.    execsql 
9b30: 7b 20 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20  { .      SELECT 
9b40: 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 76 3b  count(*) FROM v;
9b50: 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 6d 61  .      PRAGMA ma
9b60: 69 6e 2e 70 61 67 65 5f 73 69 7a 65 3b 0a 20 20  in.page_size;.  
9b70: 20 20 7d 0a 20 20 7d 20 5b 6c 69 73 74 20 31 20    }.  } [list 1 
9b80: 24 70 61 67 65 73 69 7a 65 5d 0a 20 20 64 62 32  $pagesize].  db2
9b90: 20 63 6c 6f 73 65 0a 7d 0a 0a 23 2d 2d 2d 2d 2d   close.}..#-----
9ba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9bb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9bc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9bd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9be0: 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 73 70 65 63  ----.# Test spec
9bf0: 61 6c 20 22 50 52 41 47 4d 41 20 6a 6f 75 72 6e  al "PRAGMA journ
9c00: 61 6c 5f 6d 6f 64 65 3d 50 45 52 53 49 53 54 22  al_mode=PERSIST"
9c10: 20 74 65 73 74 20 63 61 73 65 73 2e 0a 23 0a 23   test cases..#.#
9c20: 20 70 61 67 65 72 31 2d 31 33 2e 31 2e 2a 3a 20   pager1-13.1.*: 
9c30: 54 68 69 73 20 74 65 73 74 73 20 61 20 73 70 65  This tests a spe
9c40: 63 69 61 6c 20 63 61 73 65 20 65 6e 63 6f 75 6e  cial case encoun
9c50: 74 65 72 65 64 20 69 6e 20 70 65 72 73 69 73 74  tered in persist
9c60: 65 6e 74 20 0a 23 20 20 20 20 20 20 20 20 20 20  ent .#          
9c70: 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 6d 6f        journal mo
9c80: 64 65 3a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e  de: If the journ
9c90: 61 6c 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  al associated wi
9ca0: 74 68 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  th a transaction
9cb0: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
9cc0: 20 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61    is smaller tha
9cd0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
9ce0: 6c 65 20 28 62 65 63 61 75 73 65 20 61 20 70 72  le (because a pr
9cf0: 65 76 69 6f 75 73 20 0a 23 20 20 20 20 20 20 20  evious .#       
9d00: 20 20 20 20 20 20 20 20 20 74 72 61 6e 73 61 63           transac
9d10: 74 69 6f 6e 20 6c 65 66 74 20 61 20 76 65 72 79  tion left a very
9d20: 20 6c 61 72 67 65 20 6e 6f 6e 2d 68 6f 74 20 6a   large non-hot j
9d30: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 74  ournal file in t
9d40: 68 65 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  he.#            
9d50: 20 20 20 20 66 69 6c 65 2d 73 79 73 74 65 6d 29      file-system)
9d60: 2c 20 74 68 65 6e 20 53 51 4c 69 74 65 20 68 61  , then SQLite ha
9d70: 73 20 74 6f 20 62 65 20 63 61 72 65 66 75 6c 20  s to be careful 
9d80: 74 68 61 74 20 74 68 65 72 65 20 69 73 0a 23 20  that there is.# 
9d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
9da0: 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 2d 68 65 61  ot a journal-hea
9db0: 64 65 72 20 6c 65 66 74 20 6f 76 65 72 20 66 72  der left over fr
9dc0: 6f 6d 20 61 20 70 72 65 76 69 6f 75 73 20 74 72  om a previous tr
9dd0: 61 6e 73 61 63 74 69 6f 6e 0a 23 20 20 20 20 20  ansaction.#     
9de0: 20 20 20 20 20 20 20 20 20 20 20 69 6d 6d 65 64             immed
9df0: 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67  iately following
9e00: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e   the journal con
9e10: 74 65 6e 74 20 6a 75 73 74 20 77 72 69 74 74 65  tent just writte
9e20: 6e 2e 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  n..#            
9e30: 20 20 20 20 49 66 20 74 68 65 72 65 20 69 73 2c      If there is,
9e40: 20 61 6e 64 20 74 68 65 20 70 72 6f 63 65 73 73   and the process
9e50: 20 63 72 61 73 68 65 73 20 73 6f 20 74 68 61 74   crashes so that
9e60: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 23 20 20   the journal.#  
9e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 65                be
9e80: 63 6f 6d 65 73 20 61 20 68 6f 74 2d 6a 6f 75 72  comes a hot-jour
9e90: 6e 61 6c 20 61 6e 64 20 6d 75 73 74 20 62 65 20  nal and must be 
9ea0: 72 6f 6c 6c 65 64 20 62 61 63 6b 20 62 79 20 61  rolled back by a
9eb0: 6e 6f 74 68 65 72 0a 23 20 20 20 20 20 20 20 20  nother.#        
9ec0: 20 20 20 20 20 20 20 20 70 72 6f 63 65 73 73 2c          process,
9ed0: 20 74 68 65 72 65 20 69 73 20 61 20 64 61 6e 67   there is a dang
9ee0: 65 72 20 74 68 61 74 20 74 68 65 20 6f 74 68 65  er that the othe
9ef0: 72 20 70 72 6f 63 65 73 73 20 6d 61 79 20 72 6f  r process may ro
9f00: 6c 6c 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  ll.#            
9f10: 20 20 20 20 62 61 63 6b 20 74 68 65 20 61 62 6f      back the abo
9f20: 72 74 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e  rted transaction
9f30: 2c 20 74 68 65 6e 20 63 6f 6e 74 69 6e 75 65 20  , then continue 
9f40: 63 6f 70 79 69 6e 67 20 64 61 74 61 0a 23 20 20  copying data.#  
9f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 72                fr
9f60: 6f 6d 20 61 6e 20 6f 6c 64 65 72 20 74 72 61 6e  om an older tran
9f70: 73 61 63 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65  saction from the
9f80: 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68   remainder of th
9f90: 65 20 6a 6f 75 72 6e 61 6c 2e 0a 23 20 20 20 20  e journal..#    
9fa0: 20 20 20 20 20 20 20 20 20 20 20 20 53 65 65 20              See 
9fb0: 74 68 65 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  the syncJournal(
9fc0: 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 64  ) function for d
9fd0: 65 74 61 69 6c 73 2e 0a 23 0a 23 20 70 61 67 65  etails..#.# page
9fe0: 72 31 2d 31 33 2e 32 2e 2a 3a 20 53 61 6d 65 20  r1-13.2.*: Same 
9ff0: 74 65 73 74 20 61 73 20 74 68 65 20 70 72 65 76  test as the prev
a000: 69 6f 75 73 2e 20 54 68 69 73 20 74 69 6d 65 2c  ious. This time,
a010: 20 74 68 72 6f 77 20 61 6e 20 69 6e 64 65 78 20   throw an index 
a020: 69 6e 74 6f 0a 23 20 20 20 20 20 20 20 20 20 20  into.#          
a030: 20 20 20 20 20 20 74 68 65 20 6d 69 78 20 74 6f        the mix to
a040: 20 6d 61 6b 65 20 74 68 65 20 69 6e 74 65 67 72   make the integr
a050: 69 74 79 2d 63 68 65 63 6b 20 6d 6f 72 65 20 6c  ity-check more l
a060: 69 6b 65 6c 79 20 74 6f 20 63 61 74 63 68 0a 23  ikely to catch.#
a070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a080: 65 72 72 6f 72 73 2e 0a 23 0a 74 65 73 74 76 66  errors..#.testvf
a090: 73 20 74 76 20 2d 64 65 66 61 75 6c 74 20 31 0a  s tv -default 1.
a0a0: 74 76 20 73 63 72 69 70 74 20 78 53 79 6e 63 43  tv script xSyncC
a0b0: 62 0a 74 76 20 66 69 6c 74 65 72 20 78 53 79 6e  b.tv filter xSyn
a0c0: 63 0a 70 72 6f 63 20 78 53 79 6e 63 43 62 20 7b  c.proc xSyncCb {
a0d0: 6d 65 74 68 6f 64 20 66 69 6c 65 6e 61 6d 65 20  method filename 
a0e0: 61 72 67 73 7d 20 7b 0a 20 20 73 65 74 20 74 20  args} {.  set t 
a0f0: 5b 66 69 6c 65 20 74 61 69 6c 20 24 66 69 6c 65  [file tail $file
a100: 6e 61 6d 65 5d 0a 20 20 69 66 20 7b 24 74 20 3d  name].  if {$t =
a110: 3d 20 22 74 65 73 74 2e 64 62 22 7d 20 66 61 75  = "test.db"} fau
a120: 6c 74 73 69 6d 5f 73 61 76 65 0a 20 20 72 65 74  ltsim_save.  ret
a130: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 7d 0a  urn SQLITE_OK.}.
a140: 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f  faultsim_delete_
a150: 61 6e 64 5f 72 65 6f 70 65 6e 0a 64 62 20 66 75  and_reopen.db fu
a160: 6e 63 20 61 5f 73 74 72 69 6e 67 20 61 5f 73 74  nc a_string a_st
a170: 72 69 6e 67 0a 0a 23 20 54 68 65 20 55 50 44 41  ring..# The UPDA
a180: 54 45 20 73 74 61 74 65 6d 65 6e 74 20 61 74 20  TE statement at 
a190: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 69 73 20  the end of this 
a1a0: 74 65 73 74 20 63 61 73 65 20 63 72 65 61 74 65  test case create
a1b0: 73 20 61 20 72 65 61 6c 6c 79 20 62 69 67 0a 23  s a really big.#
a1c0: 20 6a 6f 75 72 6e 61 6c 2e 20 53 69 6e 63 65 20   journal. Since 
a1d0: 74 68 65 20 63 61 63 68 65 2d 73 69 7a 65 20 69  the cache-size i
a1e0: 73 20 6f 6e 6c 79 20 31 30 20 70 61 67 65 73 2c  s only 10 pages,
a1f0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e   the journal con
a200: 74 61 69 6e 73 20 0a 23 20 66 72 65 71 75 65 6e  tains .# frequen
a210: 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
a220: 73 2e 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  s..#.do_execsql_
a230: 74 65 73 74 20 70 61 67 65 72 31 2d 31 33 2e 31  test pager1-13.1
a240: 2e 31 20 7b 0a 20 20 50 52 41 47 4d 41 20 70 61  .1 {.  PRAGMA pa
a250: 67 65 5f 73 69 7a 65 20 3d 20 31 30 32 34 3b 0a  ge_size = 1024;.
a260: 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c    PRAGMA journal
a270: 5f 6d 6f 64 65 20 3d 20 50 45 52 53 49 53 54 3b  _mode = PERSIST;
a280: 0a 20 20 50 52 41 47 4d 41 20 63 61 63 68 65 5f  .  PRAGMA cache_
a290: 73 69 7a 65 20 3d 20 31 30 3b 0a 20 20 42 45 47  size = 10;.  BEG
a2a0: 49 4e 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  IN;.    CREATE T
a2b0: 41 42 4c 45 20 74 31 28 61 20 49 4e 54 45 47 45  ABLE t1(a INTEGE
a2c0: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62  R PRIMARY KEY, b
a2d0: 20 42 4c 4f 42 29 3b 0a 20 20 20 20 49 4e 53 45   BLOB);.    INSE
a2e0: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
a2f0: 53 28 4e 55 4c 4c 2c 20 61 5f 73 74 72 69 6e 67  S(NULL, a_string
a300: 28 34 30 30 29 29 3b 0a 20 20 20 20 49 4e 53 45  (400));.    INSE
a310: 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
a320: 54 20 4e 55 4c 4c 2c 20 61 5f 73 74 72 69 6e 67  T NULL, a_string
a330: 28 34 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20  (400) FROM t1;  
a340: 20 20 20 20 20 20 20 20 2f 2a 20 20 20 32 20 2a          /*   2 *
a350: 2f 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  /.    INSERT INT
a360: 4f 20 74 31 20 53 45 4c 45 43 54 20 4e 55 4c 4c  O t1 SELECT NULL
a370: 2c 20 61 5f 73 74 72 69 6e 67 28 34 30 30 29 20  , a_string(400) 
a380: 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 20  FROM t1;        
a390: 20 20 2f 2a 20 20 20 34 20 2a 2f 0a 20 20 20 20    /*   4 */.    
a3a0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
a3b0: 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 61 5f 73 74  ELECT NULL, a_st
a3c0: 72 69 6e 67 28 34 30 30 29 20 46 52 4f 4d 20 74  ring(400) FROM t
a3d0: 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20  1;          /*  
a3e0: 20 38 20 2a 2f 0a 20 20 20 20 49 4e 53 45 52 54   8 */.    INSERT
a3f0: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
a400: 4e 55 4c 4c 2c 20 61 5f 73 74 72 69 6e 67 28 34  NULL, a_string(4
a410: 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20  00) FROM t1;    
a420: 20 20 20 20 20 20 2f 2a 20 20 31 36 20 2a 2f 0a        /*  16 */.
a430: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
a440: 74 31 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20  t1 SELECT NULL, 
a450: 61 5f 73 74 72 69 6e 67 28 34 30 30 29 20 46 52  a_string(400) FR
a460: 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 20 20 20  OM t1;          
a470: 2f 2a 20 20 33 32 20 2a 2f 0a 20 20 20 20 49 4e  /*  32 */.    IN
a480: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
a490: 45 43 54 20 4e 55 4c 4c 2c 20 61 5f 73 74 72 69  ECT NULL, a_stri
a4a0: 6e 67 28 34 30 30 29 20 46 52 4f 4d 20 74 31 3b  ng(400) FROM t1;
a4b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20 36 34            /*  64
a4c0: 20 2a 2f 0a 20 20 20 20 49 4e 53 45 52 54 20 49   */.    INSERT I
a4d0: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 4e 55  NTO t1 SELECT NU
a4e0: 4c 4c 2c 20 61 5f 73 74 72 69 6e 67 28 34 30 30  LL, a_string(400
a4f0: 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20  ) FROM t1;      
a500: 20 20 20 20 2f 2a 20 31 32 38 20 2a 2f 0a 20 20      /* 128 */.  
a510: 43 4f 4d 4d 49 54 3b 0a 20 20 55 50 44 41 54 45  COMMIT;.  UPDATE
a520: 20 74 31 20 53 45 54 20 62 20 3d 20 61 5f 73 74   t1 SET b = a_st
a530: 72 69 6e 67 28 34 30 30 29 3b 0a 7d 20 7b 70 65  ring(400);.} {pe
a540: 72 73 69 73 74 7d 0a 0a 23 20 52 75 6e 20 74 72  rsist}..# Run tr
a550: 61 6e 73 61 63 74 69 6f 6e 73 20 6f 66 20 69 6e  ansactions of in
a560: 63 72 65 61 73 69 6e 67 20 73 69 7a 65 73 2e 20  creasing sizes. 
a570: 45 76 65 6e 74 75 61 6c 6c 79 2c 20 6f 6e 65 20  Eventually, one 
a580: 28 6f 72 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  (or more than on
a590: 65 29 0a 23 20 6f 66 20 74 68 65 73 65 20 77 69  e).# of these wi
a5a0: 6c 6c 20 77 72 69 74 65 20 6a 75 73 74 20 65 6e  ll write just en
a5b0: 6f 75 67 68 20 63 6f 6e 74 65 6e 74 20 74 68 61  ough content tha
a5c0: 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 6f 6c 64  t one of the old
a5d0: 20 68 65 61 64 65 72 73 20 63 72 65 61 74 65 64   headers created
a5e0: 20 0a 23 20 62 79 20 74 68 65 20 74 72 61 6e 73   .# by the trans
a5f0: 61 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 62 6c  action in the bl
a600: 6f 63 6b 20 61 62 6f 76 65 20 6c 69 65 73 20 69  ock above lies i
a610: 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72  mmediately after
a620: 20 74 68 65 20 63 6f 6e 74 65 6e 74 0a 23 20 6a   the content.# j
a630: 6f 75 72 6e 61 6c 6c 65 64 20 62 79 20 74 68 65  ournalled by the
a640: 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
a650: 74 69 6f 6e 2e 0a 23 0a 66 6f 72 20 7b 73 65 74  tion..#.for {set
a660: 20 6e 55 70 20 31 7d 20 7b 24 6e 55 70 3c 36 34   nUp 1} {$nUp<64
a670: 7d 20 7b 69 6e 63 72 20 6e 55 70 7d 20 7b 0a 20  } {incr nUp} {. 
a680: 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74   do_execsql_test
a690: 20 70 61 67 65 72 31 2d 31 33 2e 31 2e 32 2e 24   pager1-13.1.2.$
a6a0: 6e 55 70 2e 31 20 7b 20 0a 20 20 20 20 55 50 44  nUp.1 { .    UPD
a6b0: 41 54 45 20 74 31 20 53 45 54 20 62 20 3d 20 61  ATE t1 SET b = a
a6c0: 5f 73 74 72 69 6e 67 28 33 39 39 29 20 57 48 45  _string(399) WHE
a6d0: 52 45 20 61 20 3c 3d 20 24 6e 55 70 0a 20 20 7d  RE a <= $nUp.  }
a6e0: 20 7b 7d 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c   {}.  do_execsql
a6f0: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 33 2e  _test pager1-13.
a700: 31 2e 32 2e 24 6e 55 70 2e 32 20 7b 20 50 52 41  1.2.$nUp.2 { PRA
a710: 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68  GMA integrity_ch
a720: 65 63 6b 20 7d 20 7b 6f 6b 7d 20 0a 0a 20 20 23  eck } {ok} ..  #
a730: 20 54 72 79 20 74 6f 20 61 63 63 65 73 73 20 74   Try to access t
a740: 68 65 20 73 6e 61 70 73 68 6f 74 20 6f 66 20 74  he snapshot of t
a750: 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e 0a  he file-system..
a760: 20 20 23 0a 20 20 73 71 6c 69 74 65 33 20 64 62    #.  sqlite3 db
a770: 32 20 73 76 5f 74 65 73 74 2e 64 62 0a 20 20 64  2 sv_test.db.  d
a780: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 33  o_test pager1-13
a790: 2e 31 2e 32 2e 24 6e 55 70 2e 33 20 7b 0a 20 20  .1.2.$nUp.3 {.  
a7a0: 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45    execsql { SELE
a7b0: 43 54 20 73 75 6d 28 6c 65 6e 67 74 68 28 62 29  CT sum(length(b)
a7c0: 29 20 46 52 4f 4d 20 74 31 20 7d 20 64 62 32 0a  ) FROM t1 } db2.
a7d0: 20 20 7d 20 5b 65 78 70 72 20 7b 31 32 38 2a 34    } [expr {128*4
a7e0: 30 30 20 2d 20 28 24 6e 55 70 2d 31 29 7d 5d 0a  00 - ($nUp-1)}].
a7f0: 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
a800: 2d 31 33 2e 31 2e 32 2e 24 6e 55 70 2e 34 20 7b  -13.1.2.$nUp.4 {
a810: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 50  .    execsql { P
a820: 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f  RAGMA integrity_
a830: 63 68 65 63 6b 20 7d 20 64 62 32 0a 20 20 7d 20  check } db2.  } 
a840: 7b 6f 6b 7d 0a 20 20 64 62 32 20 63 6c 6f 73 65  {ok}.  db2 close
a850: 0a 7d 0a 0a 23 20 53 61 6d 65 20 74 65 73 74 20  .}..# Same test 
a860: 61 73 20 61 62 6f 76 65 2e 20 42 75 74 20 74 68  as above. But th
a870: 69 73 20 74 69 6d 65 20 77 69 74 68 20 61 6e 20  is time with an 
a880: 69 6e 64 65 78 20 6f 6e 20 74 68 65 20 74 61 62  index on the tab
a890: 6c 65 2e 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c  le..#.do_execsql
a8a0: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 33 2e  _test pager1-13.
a8b0: 32 2e 31 20 7b 0a 20 20 43 52 45 41 54 45 20 49  2.1 {.  CREATE I
a8c0: 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28 62 29  NDEX i1 ON t1(b)
a8d0: 3b 0a 20 20 55 50 44 41 54 45 20 74 31 20 53 45  ;.  UPDATE t1 SE
a8e0: 54 20 62 20 3d 20 61 5f 73 74 72 69 6e 67 28 34  T b = a_string(4
a8f0: 30 30 29 3b 0a 7d 20 7b 7d 0a 66 6f 72 20 7b 73  00);.} {}.for {s
a900: 65 74 20 6e 55 70 20 31 7d 20 7b 24 6e 55 70 3c  et nUp 1} {$nUp<
a910: 36 34 7d 20 7b 69 6e 63 72 20 6e 55 70 7d 20 7b  64} {incr nUp} {
a920: 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  .  do_execsql_te
a930: 73 74 20 70 61 67 65 72 31 2d 31 33 2e 32 2e 32  st pager1-13.2.2
a940: 2e 24 6e 55 70 2e 31 20 7b 20 0a 20 20 20 20 55  .$nUp.1 { .    U
a950: 50 44 41 54 45 20 74 31 20 53 45 54 20 62 20 3d  PDATE t1 SET b =
a960: 20 61 5f 73 74 72 69 6e 67 28 33 39 39 29 20 57   a_string(399) W
a970: 48 45 52 45 20 61 20 3c 3d 20 24 6e 55 70 0a 20  HERE a <= $nUp. 
a980: 20 7d 20 7b 7d 0a 20 20 64 6f 5f 65 78 65 63 73   } {}.  do_execs
a990: 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31  ql_test pager1-1
a9a0: 33 2e 32 2e 32 2e 24 6e 55 70 2e 32 20 7b 20 50  3.2.2.$nUp.2 { P
a9b0: 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f  RAGMA integrity_
a9c0: 63 68 65 63 6b 20 7d 20 7b 6f 6b 7d 20 0a 20 20  check } {ok} .  
a9d0: 73 71 6c 69 74 65 33 20 64 62 32 20 73 76 5f 74  sqlite3 db2 sv_t
a9e0: 65 73 74 2e 64 62 0a 20 20 64 6f 5f 74 65 73 74  est.db.  do_test
a9f0: 20 70 61 67 65 72 31 2d 31 33 2e 32 2e 32 2e 24   pager1-13.2.2.$
aa00: 6e 55 70 2e 33 20 7b 0a 20 20 20 20 65 78 65 63  nUp.3 {.    exec
aa10: 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 73 75 6d  sql { SELECT sum
aa20: 28 6c 65 6e 67 74 68 28 62 29 29 20 46 52 4f 4d  (length(b)) FROM
aa30: 20 74 31 20 7d 20 64 62 32 0a 20 20 7d 20 5b 65   t1 } db2.  } [e
aa40: 78 70 72 20 7b 31 32 38 2a 34 30 30 20 2d 20 28  xpr {128*400 - (
aa50: 24 6e 55 70 2d 31 29 7d 5d 0a 20 20 64 6f 5f 74  $nUp-1)}].  do_t
aa60: 65 73 74 20 70 61 67 65 72 31 2d 31 33 2e 32 2e  est pager1-13.2.
aa70: 32 2e 24 6e 55 70 2e 34 20 7b 0a 20 20 20 20 65  2.$nUp.4 {.    e
aa80: 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20  xecsql { PRAGMA 
aa90: 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20  integrity_check 
aaa0: 7d 20 64 62 32 0a 20 20 7d 20 7b 6f 6b 7d 0a 20  } db2.  } {ok}. 
aab0: 20 64 62 32 20 63 6c 6f 73 65 0a 7d 0a 0a 64 62   db2 close.}..db
aac0: 20 63 6c 6f 73 65 0a 74 76 20 64 65 6c 65 74 65   close.tv delete
aad0: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
aae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
aaf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ab00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ab10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54  ------------.# T
ab20: 65 73 74 20 73 70 65 63 61 6c 20 22 50 52 41 47  est specal "PRAG
ab30: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  MA journal_mode=
ab40: 4f 46 46 22 20 74 65 73 74 20 63 61 73 65 73 2e  OFF" test cases.
ab50: 0a 23 0a 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65  .#.faultsim_dele
ab60: 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 64 6f  te_and_reopen.do
ab70: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61  _execsql_test pa
ab80: 67 65 72 31 2d 31 34 2e 31 2e 31 20 7b 0a 20 20  ger1-14.1.1 {.  
ab90: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
aba0: 6f 64 65 20 3d 20 4f 46 46 3b 0a 20 20 43 52 45  ode = OFF;.  CRE
abb0: 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20  ATE TABLE t1(a, 
abc0: 62 29 3b 0a 20 20 42 45 47 49 4e 3b 0a 20 20 20  b);.  BEGIN;.   
abd0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
abe0: 56 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20 20  VALUES(1, 2);.  
abf0: 43 4f 4d 4d 49 54 3b 0a 20 20 53 45 4c 45 43 54  COMMIT;.  SELECT
ac00: 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 7d 20 7b 6f   * FROM t1;.} {o
ac10: 66 66 20 31 20 32 7d 0a 64 6f 5f 63 61 74 63 68  ff 1 2}.do_catch
ac20: 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d  sql_test pager1-
ac30: 31 34 2e 31 2e 32 20 7b 0a 20 20 42 45 47 49 4e  14.1.2 {.  BEGIN
ac40: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
ac50: 4f 20 74 31 20 56 41 4c 55 45 53 28 33 2c 20 34  O t1 VALUES(3, 4
ac60: 29 3b 0a 20 20 52 4f 4c 4c 42 41 43 4b 3b 0a 7d  );.  ROLLBACK;.}
ac70: 20 7b 30 20 7b 7d 7d 0a 64 6f 5f 65 78 65 63 73   {0 {}}.do_execs
ac80: 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31  ql_test pager1-1
ac90: 34 2e 31 2e 33 20 7b 0a 20 20 53 45 4c 45 43 54  4.1.3 {.  SELECT
aca0: 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 7d 20 7b 31   * FROM t1;.} {1
acb0: 20 32 20 33 20 34 7d 0a 64 6f 5f 63 61 74 63 68   2 3 4}.do_catch
acc0: 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d  sql_test pager1-
acd0: 31 34 2e 31 2e 34 20 7b 0a 20 20 42 45 47 49 4e  14.1.4 {.  BEGIN
ace0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
acf0: 4f 20 74 31 28 72 6f 77 69 64 2c 20 61 2c 20 62  O t1(rowid, a, b
ad00: 29 20 53 45 4c 45 43 54 20 61 2b 33 2c 20 62 2c  ) SELECT a+3, b,
ad10: 20 62 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20   b FROM t1;.    
ad20: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 28 72  INSERT INTO t1(r
ad30: 6f 77 69 64 2c 20 61 2c 20 62 29 20 53 45 4c 45  owid, a, b) SELE
ad40: 43 54 20 61 2b 33 2c 20 62 2c 20 62 20 46 52 4f  CT a+3, b, b FRO
ad50: 4d 20 74 31 3b 0a 7d 20 7b 31 20 7b 50 52 49 4d  M t1;.} {1 {PRIM
ad60: 41 52 59 20 4b 45 59 20 6d 75 73 74 20 62 65 20  ARY KEY must be 
ad70: 75 6e 69 71 75 65 7d 7d 0a 64 6f 5f 65 78 65 63  unique}}.do_exec
ad80: 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d  sql_test pager1-
ad90: 31 34 2e 31 2e 35 20 7b 0a 20 20 43 4f 4d 4d 49  14.1.5 {.  COMMI
ada0: 54 3b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52  T;.  SELECT * FR
adb0: 4f 4d 20 74 31 3b 0a 7d 20 7b 31 20 32 20 33 20  OM t1;.} {1 2 3 
adc0: 34 20 32 20 32 20 34 20 34 7d 0a 0a 23 2d 2d 2d  4 2 2 4 4}..#---
add0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ade0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
adf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ae00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ae10: 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 6f 70  ------.# Test op
ae20: 65 6e 69 6e 67 20 61 6e 64 20 63 6c 6f 73 69 6e  ening and closin
ae30: 67 20 74 68 65 20 70 61 67 65 72 20 73 75 62 2d  g the pager sub-
ae40: 73 79 73 74 65 6d 20 77 69 74 68 20 64 69 66 66  system with diff
ae50: 65 72 65 6e 74 20 76 61 6c 75 65 73 0a 23 20 66  erent values.# f
ae60: 6f 72 20 74 68 65 20 73 71 6c 69 74 65 33 5f 76  or the sqlite3_v
ae70: 66 73 2e 73 7a 4f 73 46 69 6c 65 20 76 61 72 69  fs.szOsFile vari
ae80: 61 62 6c 65 2e 0a 23 0a 66 61 75 6c 74 73 69 6d  able..#.faultsim
ae90: 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70  _delete_and_reop
aea0: 65 6e 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  en.do_execsql_te
aeb0: 73 74 20 70 61 67 65 72 31 2d 31 35 2e 30 20 7b  st pager1-15.0 {
aec0: 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  .  CREATE TABLE 
aed0: 74 78 28 79 2c 20 7a 29 3b 0a 20 20 49 4e 53 45  tx(y, z);.  INSE
aee0: 52 54 20 49 4e 54 4f 20 74 78 20 56 41 4c 55 45  RT INTO tx VALUE
aef0: 53 28 27 41 79 75 74 74 68 61 79 61 27 2c 20 27  S('Ayutthaya', '
af00: 42 65 69 6a 69 6e 67 27 29 3b 0a 20 20 49 4e 53  Beijing');.  INS
af10: 45 52 54 20 49 4e 54 4f 20 74 78 20 56 41 4c 55  ERT INTO tx VALU
af20: 45 53 28 27 4c 6f 6e 64 6f 6e 27 2c 20 27 54 6f  ES('London', 'To
af30: 6b 79 6f 27 29 3b 0a 7d 20 7b 7d 0a 64 62 20 63  kyo');.} {}.db c
af40: 6c 6f 73 65 0a 66 6f 72 20 7b 73 65 74 20 69 20  lose.for {set i 
af50: 30 7d 20 7b 24 69 3c 35 31 33 7d 20 7b 69 6e 63  0} {$i<513} {inc
af60: 72 20 69 20 33 7d 20 7b 0a 20 20 74 65 73 74 76  r i 3} {.  testv
af70: 66 73 20 74 76 20 2d 64 65 66 61 75 6c 74 20 31  fs tv -default 1
af80: 20 2d 73 7a 6f 73 66 69 6c 65 20 24 69 0a 20 20   -szosfile $i.  
af90: 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e  sqlite3 db test.
afa0: 64 62 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f  db.  do_execsql_
afb0: 74 65 73 74 20 70 61 67 65 72 31 2d 31 35 2e 24  test pager1-15.$
afc0: 69 2e 31 20 7b 0a 20 20 20 20 53 45 4c 45 43 54  i.1 {.    SELECT
afd0: 20 2a 20 46 52 4f 4d 20 74 78 3b 0a 20 20 7d 20   * FROM tx;.  } 
afe0: 7b 41 79 75 74 74 68 61 79 61 20 42 65 69 6a 69  {Ayutthaya Beiji
aff0: 6e 67 20 4c 6f 6e 64 6f 6e 20 54 6f 6b 79 6f 7d  ng London Tokyo}
b000: 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 74 76  .  db close.  tv
b010: 20 64 65 6c 65 74 65 0a 7d 0a 0a 23 2d 2d 2d 2d   delete.}..#----
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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b060: 2d 2d 2d 2d 2d 0a 23 20 43 68 65 63 6b 20 74 68  -----.# Check th
b070: 61 74 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73  at it is not pos
b080: 73 69 62 6c 65 20 74 6f 20 6f 70 65 6e 20 61 20  sible to open a 
b090: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 66  database file if
b0a0: 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 0a 23   the full path.#
b0b0: 20 74 6f 20 74 68 65 20 61 73 73 6f 63 69 61 74   to the associat
b0c0: 65 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ed journal file 
b0d0: 77 69 6c 6c 20 62 65 20 6c 6f 6e 67 65 72 20 74  will be longer t
b0e0: 68 61 6e 20 73 71 6c 69 74 65 33 5f 76 66 73 2e  han sqlite3_vfs.
b0f0: 6d 78 50 61 74 68 6e 61 6d 65 2e 0a 23 0a 74 65  mxPathname..#.te
b100: 73 74 76 66 73 20 74 76 20 2d 64 65 66 61 75 6c  stvfs tv -defaul
b110: 74 20 31 0a 74 76 20 73 63 72 69 70 74 20 78 4f  t 1.tv script xO
b120: 70 65 6e 43 62 0a 74 76 20 66 69 6c 74 65 72 20  penCb.tv filter 
b130: 78 4f 70 65 6e 0a 70 72 6f 63 20 78 4f 70 65 6e  xOpen.proc xOpen
b140: 43 62 20 7b 6d 65 74 68 6f 64 20 66 69 6c 65 6e  Cb {method filen
b150: 61 6d 65 7d 20 7b 0a 20 20 73 65 74 20 3a 3a 66  ame} {.  set ::f
b160: 69 6c 65 5f 6c 65 6e 20 5b 73 74 72 69 6e 67 20  ile_len [string 
b170: 6c 65 6e 67 74 68 20 24 66 69 6c 65 6e 61 6d 65  length $filename
b180: 5d 0a 7d 0a 73 71 6c 69 74 65 33 20 64 62 20 74  ].}.sqlite3 db t
b190: 65 73 74 2e 64 62 0a 64 62 20 63 6c 6f 73 65 0a  est.db.db close.
b1a0: 74 76 20 64 65 6c 65 74 65 0a 0a 66 6f 72 20 7b  tv delete..for {
b1b0: 73 65 74 20 69 69 20 5b 65 78 70 72 20 24 3a 3a  set ii [expr $::
b1c0: 66 69 6c 65 5f 6c 65 6e 2d 35 5d 7d 20 7b 24 69  file_len-5]} {$i
b1d0: 69 20 3c 20 5b 65 78 70 72 20 24 3a 3a 66 69 6c  i < [expr $::fil
b1e0: 65 5f 6c 65 6e 2b 32 30 5d 7d 20 7b 69 6e 63 72  e_len+20]} {incr
b1f0: 20 69 69 7d 20 7b 0a 20 20 74 65 73 74 76 66 73   ii} {.  testvfs
b200: 20 74 76 20 2d 64 65 66 61 75 6c 74 20 31 20 2d   tv -default 1 -
b210: 6d 78 70 61 74 68 6e 61 6d 65 20 24 69 69 0a 0a  mxpathname $ii..
b220: 20 20 23 20 54 68 65 20 6c 65 6e 67 74 68 20 6f    # The length o
b230: 66 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 20  f the full path 
b240: 74 6f 20 66 69 6c 65 20 22 74 65 73 74 2e 64 62  to file "test.db
b250: 2d 6a 6f 75 72 6e 61 6c 22 20 69 73 20 28 24 3a  -journal" is ($:
b260: 3a 66 69 6c 65 5f 6c 65 6e 2b 38 29 2e 0a 20 20  :file_len+8)..  
b270: 23 20 49 66 20 74 68 65 20 63 6f 6e 66 69 67 75  # If the configu
b280: 72 65 64 20 73 71 6c 69 74 65 33 5f 76 66 73 2e  red sqlite3_vfs.
b290: 6d 78 50 61 74 68 6e 61 6d 65 20 76 61 6c 75 65  mxPathname value
b2a0: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72   greater than or
b2b0: 20 65 71 75 61 6c 20 74 6f 0a 20 20 23 20 74 68   equal to.  # th
b2c0: 69 73 2c 20 74 68 65 6e 20 74 68 65 20 66 69 6c  is, then the fil
b2d0: 65 20 63 61 6e 20 62 65 20 6f 70 65 6e 65 64 2e  e can be opened.
b2e0: 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 63   Otherwise, it c
b2f0: 61 6e 6e 6f 74 2e 0a 20 20 23 0a 20 20 69 66 20  annot..  #.  if 
b300: 7b 24 69 69 20 3e 3d 20 5b 65 78 70 72 20 24 3a  {$ii >= [expr $:
b310: 3a 66 69 6c 65 5f 6c 65 6e 2b 38 5d 7d 20 7b 0a  :file_len+8]} {.
b320: 20 20 20 20 73 65 74 20 72 65 73 20 7b 30 20 7b      set res {0 {
b330: 7d 7d 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  }}.  } else {.  
b340: 20 20 73 65 74 20 72 65 73 20 7b 31 20 7b 75 6e    set res {1 {un
b350: 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 64 61 74  able to open dat
b360: 61 62 61 73 65 20 66 69 6c 65 7d 7d 0a 20 20 7d  abase file}}.  }
b370: 0a 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65  ..  do_test page
b380: 72 31 2d 31 36 2e 31 2e 24 69 69 20 7b 0a 20 20  r1-16.1.$ii {.  
b390: 20 20 6c 69 73 74 20 5b 63 61 74 63 68 20 7b 20    list [catch { 
b3a0: 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e  sqlite3 db test.
b3b0: 64 62 20 7d 20 6d 73 67 5d 20 24 6d 73 67 0a 20  db } msg] $msg. 
b3c0: 20 7d 20 24 72 65 73 0a 0a 20 20 63 61 74 63 68   } $res..  catch
b3d0: 20 7b 64 62 20 63 6c 6f 73 65 7d 0a 20 20 74 76   {db close}.  tv
b3e0: 20 64 65 6c 65 74 65 0a 7d 0a 0a 23 2d 2d 2d 2d   delete.}..#----
b3f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b430: 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 22 50 52  -----.# Test "PR
b440: 41 47 4d 41 20 6f 6d 69 74 5f 72 65 61 64 6c 6f  AGMA omit_readlo
b450: 63 6b 22 2e 20 0a 23 0a 23 20 20 20 70 61 67 65  ck". .#.#   page
b460: 72 31 2d 31 37 2e 24 74 6e 2e 31 2e 2a 3a 20 54  r1-17.$tn.1.*: T
b470: 65 73 74 20 74 68 61 74 20 69 66 20 61 20 73 65  est that if a se
b480: 63 6f 6e 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  cond connection 
b490: 68 61 73 20 61 6e 20 6f 70 65 6e 20 0a 23 20 20  has an open .#  
b4a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b4b0: 20 20 20 20 72 65 61 64 2d 74 72 61 6e 73 61 63      read-transac
b4c0: 74 69 6f 6e 2c 20 69 74 20 69 73 20 6e 6f 74 20  tion, it is not 
b4d0: 75 73 75 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65  usually possible
b4e0: 20 74 6f 20 77 72 69 74 65 20 0a 23 20 20 20 20   to write .#    
b4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b500: 20 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a    the database..
b510: 23 0a 23 20 20 20 70 61 67 65 72 31 2d 31 37 2e  #.#   pager1-17.
b520: 24 74 6e 2e 32 2e 2a 3a 20 54 65 73 74 20 74 68  $tn.2.*: Test th
b530: 61 74 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64  at if the second
b540: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 61 73 20   connection was 
b550: 6f 70 65 6e 65 64 20 77 69 74 68 0a 23 20 20 20  opened with.#   
b560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b570: 20 20 20 74 68 65 20 53 51 4c 49 54 45 5f 4f 50     the SQLITE_OP
b580: 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 66 6c 61 67  EN_READONLY flag
b590: 2c 20 61 6e 64 20 0a 23 20 20 20 20 20 20 20 20  , and .#        
b5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 50                "P
b5b0: 52 41 47 4d 41 20 6f 6d 69 74 5f 72 65 61 64 6c  RAGMA omit_readl
b5c0: 6f 63 6b 20 3d 20 31 22 20 69 73 20 65 78 65 63  ock = 1" is exec
b5d0: 75 74 65 64 20 62 65 66 6f 72 65 20 61 74 74 61  uted before atta
b5e0: 63 68 69 6e 67 0a 23 20 20 20 20 20 20 20 20 20  ching.#         
b5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68 65               the
b600: 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 6f 70   database and op
b610: 65 6e 69 6e 67 20 61 20 72 65 61 64 2d 74 72 61  ening a read-tra
b620: 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 69 74 2c 20  nsaction on it, 
b630: 69 74 20 69 73 0a 23 20 20 20 20 20 20 20 20 20  it is.#         
b640: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 6f 73               pos
b650: 73 69 62 6c 65 20 74 6f 20 77 72 69 74 65 20 74  sible to write t
b660: 68 65 20 64 62 2e 0a 23 0a 23 20 20 20 70 61 67  he db..#.#   pag
b670: 65 72 31 2d 31 37 2e 24 74 6e 2e 33 2e 2a 3a 20  er1-17.$tn.3.*: 
b680: 54 65 73 74 20 74 68 61 74 20 69 66 20 74 68 65  Test that if the
b690: 20 73 65 63 6f 6e 64 20 63 6f 6e 6e 65 63 74 69   second connecti
b6a0: 6f 6e 20 77 61 73 20 2a 6e 6f 74 2a 20 6f 70 65  on was *not* ope
b6b0: 6e 65 64 20 77 69 74 68 0a 23 20 20 20 20 20 20  ned with.#      
b6c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b6d0: 74 68 65 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  the SQLITE_OPEN_
b6e0: 52 45 41 44 4f 4e 4c 59 20 66 6c 61 67 2c 20 65  READONLY flag, e
b6f0: 78 65 63 75 74 69 6e 67 20 0a 23 20 20 20 20 20  xecuting .#     
b700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b710: 20 22 50 52 41 47 4d 41 20 6f 6d 69 74 5f 72 65   "PRAGMA omit_re
b720: 61 64 6c 6f 63 6b 20 3d 20 31 22 20 68 61 73 20  adlock = 1" has 
b730: 6e 6f 20 65 66 66 65 63 74 2e 0a 23 0a 64 6f 5f  no effect..#.do_
b740: 6d 75 6c 74 69 63 6c 69 65 6e 74 5f 74 65 73 74  multiclient_test
b750: 20 74 6e 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20   tn {.  do_test 
b760: 70 61 67 65 72 31 2d 31 37 2e 24 74 6e 2e 31 2e  pager1-17.$tn.1.
b770: 31 20 7b 0a 20 20 20 20 73 71 6c 31 20 7b 20 0a  1 {.    sql1 { .
b780: 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42        CREATE TAB
b790: 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20  LE t1(a, b);.   
b7a0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
b7b0: 31 20 56 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a  1 VALUES(1, 2);.
b7c0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 32 20 7b      }.    sql2 {
b7d0: 0a 20 20 20 20 20 20 42 45 47 49 4e 3b 0a 20 20  .      BEGIN;.  
b7e0: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
b7f0: 4d 20 74 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 20  M t1;.    }.  } 
b800: 7b 31 20 32 7d 0a 20 20 64 6f 5f 74 65 73 74 20  {1 2}.  do_test 
b810: 70 61 67 65 72 31 2d 31 37 2e 24 74 6e 2e 31 2e  pager1-17.$tn.1.
b820: 32 20 7b 0a 20 20 20 20 63 73 71 6c 31 20 7b 20  2 {.    csql1 { 
b830: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
b840: 41 4c 55 45 53 28 33 2c 20 34 29 20 7d 0a 20 20  ALUES(3, 4) }.  
b850: 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20 69  } {1 {database i
b860: 73 20 6c 6f 63 6b 65 64 7d 7d 0a 20 20 64 6f 5f  s locked}}.  do_
b870: 74 65 73 74 20 70 61 67 65 72 31 2d 31 37 2e 24  test pager1-17.$
b880: 74 6e 2e 31 2e 33 20 7b 0a 20 20 20 20 73 71 6c  tn.1.3 {.    sql
b890: 32 20 7b 20 43 4f 4d 4d 49 54 20 7d 0a 20 20 20  2 { COMMIT }.   
b8a0: 20 73 71 6c 31 20 7b 20 49 4e 53 45 52 54 20 49   sql1 { INSERT I
b8b0: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 33 2c  NTO t1 VALUES(3,
b8c0: 20 34 29 20 7d 0a 20 20 7d 20 7b 7d 0a 0a 20 20   4) }.  } {}..  
b8d0: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31  do_test pager1-1
b8e0: 37 2e 24 74 6e 2e 32 2e 31 20 7b 0a 20 20 20 20  7.$tn.2.1 {.    
b8f0: 63 6f 64 65 32 20 7b 0a 20 20 20 20 20 20 64 62  code2 {.      db
b900: 32 20 63 6c 6f 73 65 0a 20 20 20 20 20 20 73 71  2 close.      sq
b910: 6c 69 74 65 33 20 64 62 32 20 3a 6d 65 6d 6f 72  lite3 db2 :memor
b920: 79 3a 20 2d 72 65 61 64 6f 6e 6c 79 20 31 0a 20  y: -readonly 1. 
b930: 20 20 20 7d 0a 20 20 20 20 73 71 6c 32 20 7b 20     }.    sql2 { 
b940: 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 6f 6d  .      PRAGMA om
b950: 69 74 5f 72 65 61 64 6c 6f 63 6b 20 3d 20 31 3b  it_readlock = 1;
b960: 0a 20 20 20 20 20 20 41 54 54 41 43 48 20 27 74  .      ATTACH 't
b970: 65 73 74 2e 64 62 27 20 41 53 20 74 77 6f 3b 0a  est.db' AS two;.
b980: 20 20 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20        BEGIN;.   
b990: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
b9a0: 20 74 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b   t1;.    }.  } {
b9b0: 31 20 32 20 33 20 34 7d 0a 20 20 64 6f 5f 74 65  1 2 3 4}.  do_te
b9c0: 73 74 20 70 61 67 65 72 31 2d 31 37 2e 24 74 6e  st pager1-17.$tn
b9d0: 2e 32 2e 32 20 7b 20 73 71 6c 31 20 22 49 4e 53  .2.2 { sql1 "INS
b9e0: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
b9f0: 45 53 28 35 2c 20 36 29 22 20 7d 20 7b 7d 0a 20  ES(5, 6)" } {}. 
ba00: 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
ba10: 31 37 2e 24 74 6e 2e 32 2e 33 20 7b 20 73 71 6c  17.$tn.2.3 { sql
ba20: 32 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  2 "SELECT * FROM
ba30: 20 74 31 22 20 7d 20 20 20 20 20 20 20 20 20 20   t1" }          
ba40: 20 20 7b 31 20 32 20 33 20 34 7d 0a 20 20 64 6f    {1 2 3 4}.  do
ba50: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 37 2e  _test pager1-17.
ba60: 24 74 6e 2e 32 2e 34 20 7b 20 73 71 6c 32 20 22  $tn.2.4 { sql2 "
ba70: 43 4f 4d 4d 49 54 20 3b 20 53 45 4c 45 43 54 20  COMMIT ; SELECT 
ba80: 2a 20 46 52 4f 4d 20 74 31 22 20 7d 20 20 20 7b  * FROM t1" }   {
ba90: 31 20 32 20 33 20 34 20 35 20 36 7d 0a 0a 20 20  1 2 3 4 5 6}..  
baa0: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31  do_test pager1-1
bab0: 37 2e 24 74 6e 2e 33 2e 31 20 7b 0a 20 20 20 20  7.$tn.3.1 {.    
bac0: 63 6f 64 65 32 20 7b 0a 20 20 20 20 20 20 64 62  code2 {.      db
bad0: 32 20 63 6c 6f 73 65 0a 20 20 20 20 20 20 73 71  2 close.      sq
bae0: 6c 69 74 65 33 20 64 62 32 20 3a 6d 65 6d 6f 72  lite3 db2 :memor
baf0: 79 3a 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  y:.    }.    sql
bb00: 32 20 7b 20 0a 20 20 20 20 20 20 50 52 41 47 4d  2 { .      PRAGM
bb10: 41 20 6f 6d 69 74 5f 72 65 61 64 6c 6f 63 6b 20  A omit_readlock 
bb20: 3d 20 31 3b 0a 20 20 20 20 20 20 41 54 54 41 43  = 1;.      ATTAC
bb30: 48 20 27 74 65 73 74 2e 64 62 27 20 41 53 20 74  H 'test.db' AS t
bb40: 77 6f 3b 0a 20 20 20 20 20 20 42 45 47 49 4e 3b  wo;.      BEGIN;
bb50: 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20  .      SELECT * 
bb60: 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 7d 0a 20  FROM t1;.    }. 
bb70: 20 7d 20 7b 31 20 32 20 33 20 34 20 35 20 36 7d   } {1 2 3 4 5 6}
bb80: 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72  .  do_test pager
bb90: 31 2d 31 37 2e 24 74 6e 2e 33 2e 32 20 7b 0a 20  1-17.$tn.3.2 {. 
bba0: 20 20 20 63 73 71 6c 31 20 7b 20 49 4e 53 45 52     csql1 { INSER
bbb0: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
bbc0: 28 33 2c 20 34 29 20 7d 0a 20 20 7d 20 7b 31 20  (3, 4) }.  } {1 
bbd0: 7b 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63  {database is loc
bbe0: 6b 65 64 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20  ked}}.  do_test 
bbf0: 70 61 67 65 72 31 2d 31 37 2e 24 74 6e 2e 33 2e  pager1-17.$tn.3.
bc00: 33 20 7b 20 73 71 6c 32 20 43 4f 4d 4d 49 54 20  3 { sql2 COMMIT 
bc10: 7d 20 7b 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d  } {}.}..#-------
bc20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bc30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bc40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bc50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bc60: 2d 2d 0a 23 20 54 65 73 74 20 74 68 65 20 70 61  --.# Test the pa
bc70: 67 65 72 73 20 72 65 73 70 6f 6e 73 65 20 74 6f  gers response to
bc80: 20 74 68 65 20 62 2d 74 72 65 65 20 6c 61 79 65   the b-tree laye
bc90: 72 20 72 65 71 75 65 73 74 69 6e 67 20 69 6c 6c  r requesting ill
bca0: 65 67 61 6c 20 70 61 67 65 20 0a 23 20 6e 75 6d  egal page .# num
bcb0: 62 65 72 73 3a 0a 23 0a 23 20 20 20 2b 20 54 68  bers:.#.#   + Th
bcc0: 65 20 6c 6f 63 6b 69 6e 67 20 70 61 67 65 2c 0a  e locking page,.
bcd0: 23 20 20 20 2b 20 50 61 67 65 20 30 2c 0a 23 20  #   + Page 0,.# 
bce0: 20 20 2b 20 41 20 70 61 67 65 20 77 69 74 68 20    + A page with 
bcf0: 61 20 70 61 67 65 20 6e 75 6d 62 65 72 20 67 72  a page number gr
bd00: 65 61 74 65 72 20 74 68 61 6e 20 28 32 5e 33 31  eater than (2^31
bd10: 2d 31 29 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 70  -1)..#.do_test p
bd20: 61 67 65 72 31 2d 31 38 2e 31 20 7b 0a 20 20 66  ager1-18.1 {.  f
bd30: 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61  aultsim_delete_a
bd40: 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 64 62 20 66  nd_reopen.  db f
bd50: 75 6e 63 20 61 5f 73 74 72 69 6e 67 20 61 5f 73  unc a_string a_s
bd60: 74 72 69 6e 67 0a 20 20 65 78 65 63 73 71 6c 20  tring.  execsql 
bd70: 7b 20 0a 20 20 20 20 50 52 41 47 4d 41 20 70 61  { .    PRAGMA pa
bd80: 67 65 5f 73 69 7a 65 20 3d 20 31 30 32 34 3b 0a  ge_size = 1024;.
bd90: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
bda0: 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 49   t1(a, b);.    I
bdb0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
bdc0: 4c 55 45 53 28 61 5f 73 74 72 69 6e 67 28 35 30  LUES(a_string(50
bdd0: 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 32 30 30  0), a_string(200
bde0: 29 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ));.    INSERT I
bdf0: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f  NTO t1 SELECT a_
be00: 73 74 72 69 6e 67 28 35 30 30 29 2c 20 61 5f 73  string(500), a_s
be10: 74 72 69 6e 67 28 32 30 30 29 20 46 52 4f 4d 20  tring(200) FROM 
be20: 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  t1;.    INSERT I
be30: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f  NTO t1 SELECT a_
be40: 73 74 72 69 6e 67 28 35 30 30 29 2c 20 61 5f 73  string(500), a_s
be50: 74 72 69 6e 67 28 32 30 30 29 20 46 52 4f 4d 20  tring(200) FROM 
be60: 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  t1;.    INSERT I
be70: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f  NTO t1 SELECT a_
be80: 73 74 72 69 6e 67 28 35 30 30 29 2c 20 61 5f 73  string(500), a_s
be90: 74 72 69 6e 67 28 32 30 30 29 20 46 52 4f 4d 20  tring(200) FROM 
bea0: 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  t1;.    INSERT I
beb0: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f  NTO t1 SELECT a_
bec0: 73 74 72 69 6e 67 28 35 30 30 29 2c 20 61 5f 73  string(500), a_s
bed0: 74 72 69 6e 67 28 32 30 30 29 20 46 52 4f 4d 20  tring(200) FROM 
bee0: 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  t1;.    INSERT I
bef0: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f  NTO t1 SELECT a_
bf00: 73 74 72 69 6e 67 28 35 30 30 29 2c 20 61 5f 73  string(500), a_s
bf10: 74 72 69 6e 67 28 32 30 30 29 20 46 52 4f 4d 20  tring(200) FROM 
bf20: 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  t1;.    INSERT I
bf30: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f  NTO t1 SELECT a_
bf40: 73 74 72 69 6e 67 28 35 30 30 29 2c 20 61 5f 73  string(500), a_s
bf50: 74 72 69 6e 67 28 32 30 30 29 20 46 52 4f 4d 20  tring(200) FROM 
bf60: 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  t1;.    INSERT I
bf70: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f  NTO t1 SELECT a_
bf80: 73 74 72 69 6e 67 28 35 30 30 29 2c 20 61 5f 73  string(500), a_s
bf90: 74 72 69 6e 67 28 32 30 30 29 20 46 52 4f 4d 20  tring(200) FROM 
bfa0: 74 31 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f  t1;.  }.} {}.do_
bfb0: 74 65 73 74 20 70 61 67 65 72 31 2d 31 38 2e 32  test pager1-18.2
bfc0: 20 7b 0a 20 20 73 65 74 20 72 6f 6f 74 20 5b 64   {.  set root [d
bfd0: 62 20 6f 6e 65 20 22 53 45 4c 45 43 54 20 72 6f  b one "SELECT ro
bfe0: 6f 74 70 61 67 65 20 46 52 4f 4d 20 73 71 6c 69  otpage FROM sqli
bff0: 74 65 5f 6d 61 73 74 65 72 22 5d 0a 20 20 73 65  te_master"].  se
c000: 74 20 6c 6f 63 6b 69 6e 67 70 61 67 65 20 5b 65  t lockingpage [e
c010: 78 70 72 20 28 30 78 31 30 30 30 30 2f 31 30 32  xpr (0x10000/102
c020: 34 29 20 2b 20 31 5d 0a 20 20 65 78 65 63 73 71  4) + 1].  execsq
c030: 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 77  l {.    PRAGMA w
c040: 72 69 74 61 62 6c 65 5f 73 63 68 65 6d 61 20 3d  ritable_schema =
c050: 20 31 3b 0a 20 20 20 20 55 50 44 41 54 45 20 73   1;.    UPDATE s
c060: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 53 45 54  qlite_master SET
c070: 20 72 6f 6f 74 70 61 67 65 20 3d 20 24 6c 6f 63   rootpage = $loc
c080: 6b 69 6e 67 70 61 67 65 3b 0a 20 20 7d 0a 20 20  kingpage;.  }.  
c090: 73 71 6c 69 74 65 33 20 64 62 32 20 74 65 73 74  sqlite3 db2 test
c0a0: 2e 64 62 0a 20 20 63 61 74 63 68 73 71 6c 20 7b  .db.  catchsql {
c0b0: 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29   SELECT count(*)
c0c0: 20 46 52 4f 4d 20 74 31 20 7d 20 64 62 32 0a 7d   FROM t1 } db2.}
c0d0: 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20 64 69   {1 {database di
c0e0: 73 6b 20 69 6d 61 67 65 20 69 73 20 6d 61 6c 66  sk image is malf
c0f0: 6f 72 6d 65 64 7d 7d 0a 64 62 32 20 63 6c 6f 73  ormed}}.db2 clos
c100: 65 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  e.do_test pager1
c110: 2d 31 38 2e 33 20 7b 0a 20 20 65 78 65 63 73 71  -18.3 {.  execsq
c120: 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54  l {.    CREATE T
c130: 41 42 4c 45 20 74 32 28 78 29 3b 0a 20 20 20 20  ABLE t2(x);.    
c140: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56  INSERT INTO t2 V
c150: 41 4c 55 45 53 28 61 5f 73 74 72 69 6e 67 28 35  ALUES(a_string(5
c160: 30 30 30 29 29 3b 0a 20 20 7d 0a 20 20 73 65 74  000));.  }.  set
c170: 20 70 67 6e 6f 20 5b 65 78 70 72 20 28 5b 66 69   pgno [expr ([fi
c180: 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 5d  le size test.db]
c190: 20 2f 20 31 30 32 34 29 2d 32 5d 0a 20 20 68 65   / 1024)-2].  he
c1a0: 78 69 6f 5f 77 72 69 74 65 20 74 65 73 74 2e 64  xio_write test.d
c1b0: 62 20 5b 65 78 70 72 20 28 24 70 67 6e 6f 2d 31  b [expr ($pgno-1
c1c0: 29 2a 31 30 32 34 5d 20 30 30 30 30 30 30 30 30  )*1024] 00000000
c1d0: 0a 20 20 73 71 6c 69 74 65 33 20 64 62 32 20 74  .  sqlite3 db2 t
c1e0: 65 73 74 2e 64 62 0a 20 20 63 61 74 63 68 73 71  est.db.  catchsq
c1f0: 6c 20 7b 20 53 45 4c 45 43 54 20 6c 65 6e 67 74  l { SELECT lengt
c200: 68 28 78 29 20 46 52 4f 4d 20 74 32 20 7d 20 64  h(x) FROM t2 } d
c210: 62 32 0a 7d 20 7b 31 20 7b 64 61 74 61 62 61 73  b2.} {1 {databas
c220: 65 20 64 69 73 6b 20 69 6d 61 67 65 20 69 73 20  e disk image is 
c230: 6d 61 6c 66 6f 72 6d 65 64 7d 7d 0a 64 62 32 20  malformed}}.db2 
c240: 63 6c 6f 73 65 0a 64 6f 5f 74 65 73 74 20 70 61  close.do_test pa
c250: 67 65 72 31 2d 31 38 2e 34 20 7b 0a 20 20 68 65  ger1-18.4 {.  he
c260: 78 69 6f 5f 77 72 69 74 65 20 74 65 73 74 2e 64  xio_write test.d
c270: 62 20 5b 65 78 70 72 20 28 24 70 67 6e 6f 2d 31  b [expr ($pgno-1
c280: 29 2a 31 30 32 34 5d 20 39 30 30 30 30 30 30 30  )*1024] 90000000
c290: 0a 20 20 73 71 6c 69 74 65 33 20 64 62 32 20 74  .  sqlite3 db2 t
c2a0: 65 73 74 2e 64 62 0a 20 20 63 61 74 63 68 73 71  est.db.  catchsq
c2b0: 6c 20 7b 20 53 45 4c 45 43 54 20 6c 65 6e 67 74  l { SELECT lengt
c2c0: 68 28 78 29 20 46 52 4f 4d 20 74 32 20 7d 20 64  h(x) FROM t2 } d
c2d0: 62 32 0a 7d 20 7b 31 20 7b 64 61 74 61 62 61 73  b2.} {1 {databas
c2e0: 65 20 64 69 73 6b 20 69 6d 61 67 65 20 69 73 20  e disk image is 
c2f0: 6d 61 6c 66 6f 72 6d 65 64 7d 7d 0a 64 62 32 20  malformed}}.db2 
c300: 63 6c 6f 73 65 0a 64 6f 5f 74 65 73 74 20 70 61  close.do_test pa
c310: 67 65 72 31 2d 31 38 2e 35 20 7b 0a 20 20 73 71  ger1-18.5 {.  sq
c320: 6c 69 74 65 33 20 64 62 20 22 22 0a 20 20 65 78  lite3 db "".  ex
c330: 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41  ecsql {.    CREA
c340: 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62  TE TABLE t1(a, b
c350: 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  );.    CREATE TA
c360: 42 4c 45 20 74 32 28 61 2c 20 62 29 3b 0a 20 20  BLE t2(a, b);.  
c370: 20 20 50 52 41 47 4d 41 20 77 72 69 74 61 62 6c    PRAGMA writabl
c380: 65 5f 73 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20  e_schema = 1;.  
c390: 20 20 55 50 44 41 54 45 20 73 71 6c 69 74 65 5f    UPDATE sqlite_
c3a0: 6d 61 73 74 65 72 20 53 45 54 20 72 6f 6f 74 70  master SET rootp
c3b0: 61 67 65 3d 35 20 57 48 45 52 45 20 74 62 6c 5f  age=5 WHERE tbl_
c3c0: 6e 61 6d 65 20 3d 20 27 74 31 27 3b 0a 20 20 20  name = 't1';.   
c3d0: 20 50 52 41 47 4d 41 20 77 72 69 74 61 62 6c 65   PRAGMA writable
c3e0: 5f 73 63 68 65 6d 61 20 3d 20 30 3b 0a 20 20 20  _schema = 0;.   
c3f0: 20 41 4c 54 45 52 20 54 41 42 4c 45 20 74 31 20   ALTER TABLE t1 
c400: 52 45 4e 41 4d 45 20 54 4f 20 78 31 3b 0a 20 20  RENAME TO x1;.  
c410: 7d 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20 53  }.  catchsql { S
c420: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 78 31 20  ELECT * FROM x1 
c430: 7d 0a 7d 20 7b 7d 0a 64 62 20 63 6c 6f 73 65 0a  }.} {}.db close.
c440: 0a 66 69 6e 69 73 68 5f 74 65 73 74 0a 0a        .finish_test..