/ Hex Artifact Content
Login

Artifact f00c701b29a37a08f084a0183b4901a3a57e6673:


0000: 23 20 32 30 31 30 20 4a 75 6e 65 20 31 35 0a 23  # 2010 June 15.#
0010: 0a 23 20 54 68 65 20 61 75 74 68 6f 72 20 64 69  .# The author di
0020: 73 63 6c 61 69 6d 73 20 63 6f 70 79 72 69 67 68  sclaims copyrigh
0030: 74 20 74 6f 20 74 68 69 73 20 73 6f 75 72 63 65  t to this source
0040: 20 63 6f 64 65 2e 20 20 49 6e 20 70 6c 61 63 65   code.  In place
0050: 20 6f 66 0a 23 20 61 20 6c 65 67 61 6c 20 6e 6f   of.# a legal no
0060: 74 69 63 65 2c 20 68 65 72 65 20 69 73 20 61 20  tice, here is a 
0070: 62 6c 65 73 73 69 6e 67 3a 0a 23 0a 23 20 20 20  blessing:.#.#   
0080: 20 4d 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64   May you do good
0090: 20 61 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 23   and not evil..#
00a0: 20 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64      May you find
00b0: 20 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72   forgiveness for
00c0: 20 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f   yourself and fo
00d0: 72 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 23 20  rgive others..# 
00e0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
00f0: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0100: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0110: 79 6f 75 20 67 69 76 65 2e 0a 23 0a 23 2a 2a 2a  you give..#.#***
0120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 0a 23 0a 0a 73 65 74 20 74 65 73 74  ****.#..set test
0170: 64 69 72 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d  dir [file dirnam
0180: 65 20 24 61 72 67 76 30 5d 0a 73 6f 75 72 63 65  e $argv0].source
0190: 20 24 74 65 73 74 64 69 72 2f 74 65 73 74 65 72   $testdir/tester
01a0: 2e 74 63 6c 0a 73 6f 75 72 63 65 20 24 74 65 73  .tcl.source $tes
01b0: 74 64 69 72 2f 6c 6f 63 6b 5f 63 6f 6d 6d 6f 6e  tdir/lock_common
01c0: 2e 74 63 6c 0a 73 6f 75 72 63 65 20 24 74 65 73  .tcl.source $tes
01d0: 74 64 69 72 2f 6d 61 6c 6c 6f 63 5f 63 6f 6d 6d  tdir/malloc_comm
01e0: 6f 6e 2e 74 63 6c 0a 73 6f 75 72 63 65 20 24 74  on.tcl.source $t
01f0: 65 73 74 64 69 72 2f 77 61 6c 5f 63 6f 6d 6d 6f  estdir/wal_commo
0200: 6e 2e 74 63 6c 0a 20 0a 23 20 44 6f 20 6e 6f 74  n.tcl. .# Do not
0210: 20 75 73 65 20 61 20 63 6f 64 65 63 20 66 6f 72   use a codec for
0220: 20 74 65 73 74 73 20 69 6e 20 74 68 69 73 20 66   tests in this f
0230: 69 6c 65 2c 20 61 73 20 74 68 65 20 64 61 74 61  ile, as the data
0240: 62 61 73 65 20 66 69 6c 65 20 69 73 0a 23 20 6d  base file is.# m
0250: 61 6e 69 70 75 6c 61 74 65 64 20 64 69 72 65 63  anipulated direc
0260: 74 6c 79 20 75 73 69 6e 67 20 74 63 6c 20 73 63  tly using tcl sc
0270: 72 69 70 74 73 20 28 75 73 69 6e 67 20 74 68 65  ripts (using the
0280: 20 5b 68 65 78 69 6f 5f 77 72 69 74 65 5d 20 63   [hexio_write] c
0290: 6f 6d 6d 61 6e 64 29 2e 0a 23 0a 64 6f 5f 6e 6f  ommand)..#.do_no
02a0: 74 5f 75 73 65 5f 63 6f 64 65 63 0a 0a 23 0a 23  t_use_codec..#.#
02b0: 20 70 61 67 65 72 31 2d 31 2e 2a 3a 20 54 65 73   pager1-1.*: Tes
02c0: 74 20 69 6e 74 65 72 2d 70 72 6f 63 65 73 73 20  t inter-process 
02d0: 6c 6f 63 6b 69 6e 67 20 28 63 6c 69 65 6e 74 73  locking (clients
02e0: 20 69 6e 20 6d 75 6c 74 69 70 6c 65 20 70 72 6f   in multiple pro
02f0: 63 65 73 73 65 73 29 2e 0a 23 0a 23 20 70 61 67  cesses)..#.# pag
0300: 65 72 31 2d 32 2e 2a 3a 20 54 65 73 74 20 69 6e  er1-2.*: Test in
0310: 74 72 61 2d 70 72 6f 63 65 73 73 20 6c 6f 63 6b  tra-process lock
0320: 69 6e 67 20 28 6d 75 6c 74 69 70 6c 65 20 63 6c  ing (multiple cl
0330: 69 65 6e 74 73 20 69 6e 20 74 68 69 73 20 70 72  ients in this pr
0340: 6f 63 65 73 73 29 2e 0a 23 0a 23 20 70 61 67 65  ocess)..#.# page
0350: 72 31 2d 33 2e 2a 3a 20 53 61 76 65 70 6f 69 6e  r1-3.*: Savepoin
0360: 74 20 72 65 6c 61 74 65 64 20 74 65 73 74 73 2e  t related tests.
0370: 0a 23 0a 23 20 70 61 67 65 72 31 2d 34 2e 2a 3a  .#.# pager1-4.*:
0380: 20 48 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 65 6c   Hot-journal rel
0390: 61 74 65 64 20 74 65 73 74 73 2e 0a 23 0a 23 20  ated tests..#.# 
03a0: 70 61 67 65 72 31 2d 35 2e 2a 3a 20 43 61 73 65  pager1-5.*: Case
03b0: 73 20 72 65 6c 61 74 65 64 20 74 6f 20 6d 75 6c  s related to mul
03c0: 74 69 2d 66 69 6c 65 20 63 6f 6d 6d 69 74 73 2e  ti-file commits.
03d0: 0a 23 0a 23 20 70 61 67 65 72 31 2d 36 2e 2a 3a  .#.# pager1-6.*:
03e0: 20 43 61 73 65 73 20 72 65 6c 61 74 65 64 20 74   Cases related t
03f0: 6f 20 22 50 52 41 47 4d 41 20 6d 61 78 5f 70 61  o "PRAGMA max_pa
0400: 67 65 5f 63 6f 75 6e 74 22 0a 23 0a 23 20 70 61  ge_count".#.# pa
0410: 67 65 72 31 2d 37 2e 2a 3a 20 43 61 73 65 73 20  ger1-7.*: Cases 
0420: 73 70 65 63 69 66 69 63 20 74 6f 20 22 50 52 41  specific to "PRA
0430: 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
0440: 3d 54 52 55 4e 43 41 54 45 22 0a 23 0a 23 20 70  =TRUNCATE".#.# p
0450: 61 67 65 72 31 2d 38 2e 2a 3a 20 43 61 73 65 73  ager1-8.*: Cases
0460: 20 75 73 69 6e 67 20 74 65 6d 70 6f 72 61 72 79   using temporary
0470: 20 61 6e 64 20 69 6e 2d 6d 65 6d 6f 72 79 20 64   and in-memory d
0480: 61 74 61 62 61 73 65 73 2e 0a 23 0a 23 20 70 61  atabases..#.# pa
0490: 67 65 72 31 2d 39 2e 2a 3a 20 54 65 73 74 73 20  ger1-9.*: Tests 
04a0: 72 65 6c 61 74 65 64 20 74 6f 20 74 68 65 20 62  related to the b
04b0: 61 63 6b 75 70 20 41 50 49 2e 0a 23 0a 23 20 70  ackup API..#.# p
04c0: 61 67 65 72 31 2d 31 30 2e 2a 3a 20 54 65 73 74  ager1-10.*: Test
04d0: 20 74 68 61 74 20 74 68 65 20 61 73 73 75 6d 65   that the assume
04e0: 64 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73 65  d file-system se
04f0: 63 74 6f 72 2d 73 69 7a 65 20 69 73 20 6c 69 6d  ctor-size is lim
0500: 69 74 65 64 20 74 6f 0a 23 20 20 20 20 20 20 20  ited to.#       
0510: 20 20 20 20 20 20 20 36 34 4b 42 2e 0a 23 0a 23         64KB..#.#
0520: 20 70 61 67 65 72 31 2d 31 32 2e 2a 3a 20 54 65   pager1-12.*: Te
0530: 73 74 73 20 69 6e 76 6f 6c 76 69 6e 67 20 22 50  sts involving "P
0540: 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 22  RAGMA page_size"
0550: 0a 23 0a 23 20 70 61 67 65 72 31 2d 31 33 2e 2a  .#.# pager1-13.*
0560: 3a 20 43 61 73 65 73 20 73 70 65 63 69 66 69 63  : Cases specific
0570: 20 74 6f 20 22 50 52 41 47 4d 41 20 6a 6f 75 72   to "PRAGMA jour
0580: 6e 61 6c 5f 6d 6f 64 65 3d 50 45 52 53 49 53 54  nal_mode=PERSIST
0590: 22 0a 23 0a 23 20 70 61 67 65 72 31 2d 31 34 2e  ".#.# pager1-14.
05a0: 2a 3a 20 43 61 73 65 73 20 73 70 65 63 69 66 69  *: Cases specifi
05b0: 63 20 74 6f 20 22 50 52 41 47 4d 41 20 6a 6f 75  c to "PRAGMA jou
05c0: 72 6e 61 6c 5f 6d 6f 64 65 3d 4f 46 46 22 0a 23  rnal_mode=OFF".#
05d0: 0a 23 20 70 61 67 65 72 31 2d 31 35 2e 2a 3a 20  .# pager1-15.*: 
05e0: 56 61 72 79 69 6e 67 20 73 71 6c 69 74 65 33 5f  Varying sqlite3_
05f0: 76 66 73 2e 73 7a 4f 73 46 69 6c 65 0a 23 0a 23  vfs.szOsFile.#.#
0600: 20 70 61 67 65 72 31 2d 31 36 2e 2a 3a 20 56 61   pager1-16.*: Va
0610: 72 79 69 6e 67 20 73 71 6c 69 74 65 33 5f 76 66  rying sqlite3_vf
0620: 73 2e 6d 78 50 61 74 68 6e 61 6d 65 0a 23 0a 23  s.mxPathname.#.#
0630: 20 70 61 67 65 72 31 2d 31 37 2e 2a 3a 20 54 65   pager1-17.*: Te
0640: 73 74 73 20 72 65 6c 61 74 65 64 20 74 6f 20 22  sts related to "
0650: 50 52 41 47 4d 41 20 6f 6d 69 74 5f 72 65 61 64  PRAGMA omit_read
0660: 6c 6f 63 6b 22 0a 23 0a 23 20 70 61 67 65 72 31  lock".#.# pager1
0670: 2d 31 38 2e 2a 3a 20 54 65 73 74 20 74 68 61 74  -18.*: Test that
0680: 20 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72   the pager layer
0690: 20 72 65 73 70 6f 6e 64 73 20 63 6f 72 72 65 63   responds correc
06a0: 74 6c 79 20 69 66 20 74 68 65 20 62 2d 74 72 65  tly if the b-tre
06b0: 65 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20  e.#             
06c0: 20 72 65 71 75 65 73 74 73 20 61 6e 20 69 6e 76   requests an inv
06d0: 61 6c 69 64 20 70 61 67 65 20 6e 75 6d 62 65 72  alid page number
06e0: 20 28 64 75 65 20 74 6f 20 64 62 20 63 6f 72 72   (due to db corr
06f0: 75 70 74 69 6f 6e 29 2e 0a 23 0a 0a 73 65 74 20  uption)..#..set 
0700: 61 5f 73 74 72 69 6e 67 5f 63 6f 75 6e 74 65 72  a_string_counter
0710: 20 31 0a 70 72 6f 63 20 61 5f 73 74 72 69 6e 67   1.proc a_string
0720: 20 7b 6e 7d 20 7b 0a 20 20 67 6c 6f 62 61 6c 20   {n} {.  global 
0730: 61 5f 73 74 72 69 6e 67 5f 63 6f 75 6e 74 65 72  a_string_counter
0740: 0a 20 20 69 6e 63 72 20 61 5f 73 74 72 69 6e 67  .  incr a_string
0750: 5f 63 6f 75 6e 74 65 72 0a 20 20 73 74 72 69 6e  _counter.  strin
0760: 67 20 72 61 6e 67 65 20 5b 73 74 72 69 6e 67 20  g range [string 
0770: 72 65 70 65 61 74 20 22 24 7b 61 5f 73 74 72 69  repeat "${a_stri
0780: 6e 67 5f 63 6f 75 6e 74 65 72 7d 2e 22 20 24 6e  ng_counter}." $n
0790: 5d 20 31 20 24 6e 0a 7d 0a 64 62 20 66 75 6e 63  ] 1 $n.}.db func
07a0: 20 61 5f 73 74 72 69 6e 67 20 61 5f 73 74 72 69   a_string a_stri
07b0: 6e 67 0a 0a 64 6f 5f 6d 75 6c 74 69 63 6c 69 65  ng..do_multiclie
07c0: 6e 74 5f 74 65 73 74 20 74 6e 20 7b 0a 0a 20 20  nt_test tn {..  
07d0: 23 20 43 72 65 61 74 65 20 61 6e 64 20 70 6f 70  # Create and pop
07e0: 75 6c 61 74 65 20 61 20 64 61 74 61 62 61 73 65  ulate a database
07f0: 20 74 61 62 6c 65 20 75 73 69 6e 67 20 63 6f 6e   table using con
0800: 6e 65 63 74 69 6f 6e 20 5b 64 62 5d 2e 20 43 68  nection [db]. Ch
0810: 65 63 6b 20 0a 20 20 23 20 74 68 61 74 20 63 6f  eck .  # that co
0820: 6e 6e 65 63 74 69 6f 6e 73 20 5b 64 62 32 5d 20  nnections [db2] 
0830: 61 6e 64 20 5b 64 62 33 5d 20 63 61 6e 20 73 65  and [db3] can se
0840: 65 20 74 68 65 20 73 63 68 65 6d 61 20 61 6e 64  e the schema and
0850: 20 63 6f 6e 74 65 6e 74 2e 0a 20 20 23 0a 20 20   content..  #.  
0860: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24  do_test pager1-$
0870: 74 6e 2e 31 20 7b 0a 20 20 20 20 73 71 6c 31 20  tn.1 {.    sql1 
0880: 7b 0a 20 20 20 20 20 20 43 52 45 41 54 45 20 54  {.      CREATE T
0890: 41 42 4c 45 20 74 31 28 61 20 50 52 49 4d 41 52  ABLE t1(a PRIMAR
08a0: 59 20 4b 45 59 2c 20 62 29 3b 0a 20 20 20 20 20  Y KEY, b);.     
08b0: 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 31   CREATE INDEX i1
08c0: 20 4f 4e 20 74 31 28 62 29 3b 0a 20 20 20 20 20   ON t1(b);.     
08d0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
08e0: 56 41 4c 55 45 53 28 31 2c 20 27 6f 6e 65 27 29  VALUES(1, 'one')
08f0: 3b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31  ; INSERT INTO t1
0900: 20 56 41 4c 55 45 53 28 32 2c 20 27 74 77 6f 27   VALUES(2, 'two'
0910: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 7d 0a  );.    }.  } {}.
0920: 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
0930: 2d 24 74 6e 2e 32 20 7b 20 73 71 6c 32 20 7b 20  -$tn.2 { sql2 { 
0940: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
0950: 20 7d 20 7d 20 7b 31 20 6f 6e 65 20 32 20 74 77   } } {1 one 2 tw
0960: 6f 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67  o}.  do_test pag
0970: 65 72 31 2d 24 74 6e 2e 33 20 7b 20 73 71 6c 33  er1-$tn.3 { sql3
0980: 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d   { SELECT * FROM
0990: 20 74 31 20 7d 20 7d 20 7b 31 20 6f 6e 65 20 32   t1 } } {1 one 2
09a0: 20 74 77 6f 7d 0a 0a 20 20 23 20 4f 70 65 6e 20   two}..  # Open 
09b0: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e  a transaction an
09c0: 64 20 61 64 64 20 61 20 72 6f 77 20 75 73 69 6e  d add a row usin
09d0: 67 20 5b 64 62 5d 2e 20 54 68 69 73 20 70 75 74  g [db]. This put
09e0: 73 20 5b 64 62 5d 20 69 6e 0a 20 20 23 20 52 45  s [db] in.  # RE
09f0: 53 45 52 56 45 44 20 73 74 61 74 65 2e 20 43 68  SERVED state. Ch
0a00: 65 63 6b 20 74 68 61 74 20 63 6f 6e 6e 65 63 74  eck that connect
0a10: 69 6f 6e 73 20 5b 64 62 32 5d 20 61 6e 64 20 5b  ions [db2] and [
0a20: 64 62 33 5d 20 63 61 6e 20 73 74 69 6c 6c 0a 20  db3] can still. 
0a30: 20 23 20 72 65 61 64 20 74 68 65 20 64 61 74 61   # read the data
0a40: 62 61 73 65 20 63 6f 6e 74 65 6e 74 20 61 73 20  base content as 
0a50: 69 74 20 77 61 73 20 62 65 66 6f 72 65 20 74 68  it was before th
0a60: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  e transaction wa
0a70: 73 0a 20 20 23 20 6f 70 65 6e 65 64 2e 20 5b 64  s.  # opened. [d
0a80: 62 5d 20 73 68 6f 75 6c 64 20 73 65 65 20 74 68  b] should see th
0a90: 65 20 69 6e 73 65 72 74 65 64 20 72 6f 77 2e 0a  e inserted row..
0aa0: 20 20 23 0a 20 20 64 6f 5f 74 65 73 74 20 70 61    #.  do_test pa
0ab0: 67 65 72 31 2d 24 74 6e 2e 34 20 7b 0a 20 20 20  ger1-$tn.4 {.   
0ac0: 20 73 71 6c 31 20 7b 0a 20 20 20 20 20 20 42 45   sql1 {.      BE
0ad0: 47 49 4e 3b 0a 20 20 20 20 20 20 20 20 49 4e 53  GIN;.        INS
0ae0: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
0af0: 45 53 28 33 2c 20 27 74 68 72 65 65 27 29 3b 0a  ES(3, 'three');.
0b00: 20 20 20 20 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64      }.  } {}.  d
0b10: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24 74  o_test pager1-$t
0b20: 6e 2e 35 20 7b 20 73 71 6c 32 20 7b 20 53 45 4c  n.5 { sql2 { SEL
0b30: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20  ECT * FROM t1 } 
0b40: 7d 20 7b 31 20 6f 6e 65 20 32 20 74 77 6f 7d 0a  } {1 one 2 two}.
0b50: 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
0b60: 2d 24 74 6e 2e 37 20 7b 20 73 71 6c 31 20 7b 20  -$tn.7 { sql1 { 
0b70: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
0b80: 20 7d 20 7d 20 7b 31 20 6f 6e 65 20 32 20 74 77   } } {1 one 2 tw
0b90: 6f 20 33 20 74 68 72 65 65 7d 0a 0a 20 20 23 20  o 3 three}..  # 
0ba0: 5b 64 62 5d 20 73 74 69 6c 6c 20 68 61 73 20 61  [db] still has a
0bb0: 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61  n open write tra
0bc0: 6e 73 61 63 74 69 6f 6e 2e 20 43 68 65 63 6b 20  nsaction. Check 
0bd0: 74 68 61 74 20 74 68 69 73 20 70 72 65 76 65 6e  that this preven
0be0: 74 73 0a 20 20 23 20 6f 74 68 65 72 20 63 6f 6e  ts.  # other con
0bf0: 6e 65 63 74 69 6f 6e 73 20 28 73 70 65 63 69 66  nections (specif
0c00: 69 63 61 6c 6c 79 20 5b 64 62 32 5d 29 20 66 72  ically [db2]) fr
0c10: 6f 6d 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68  om writing to th
0c20: 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 23 0a  e database..  #.
0c30: 20 20 23 20 45 76 65 6e 20 69 66 20 5b 64 62 32    # Even if [db2
0c40: 5d 20 6f 70 65 6e 73 20 61 20 74 72 61 6e 73 61  ] opens a transa
0c50: 63 74 69 6f 6e 20 66 69 72 73 74 2c 20 69 74 20  ction first, it 
0c60: 6d 61 79 20 6e 6f 74 20 77 72 69 74 65 20 74 6f  may not write to
0c70: 20 74 68 65 0a 20 20 23 20 64 61 74 61 62 61 73   the.  # databas
0c80: 65 2e 20 41 66 74 65 72 20 74 68 65 20 61 74 74  e. After the att
0c90: 65 6d 70 74 20 74 6f 20 77 72 69 74 65 20 74 68  empt to write th
0ca0: 65 20 64 62 20 77 69 74 68 69 6e 20 61 20 74 72  e db within a tr
0cb0: 61 6e 73 61 63 74 69 6f 6e 2c 20 0a 20 20 23 20  ansaction, .  # 
0cc0: 5b 64 62 32 5d 20 69 73 20 6c 65 66 74 20 77 69  [db2] is left wi
0cd0: 74 68 20 61 6e 20 6f 70 65 6e 20 74 72 61 6e 73  th an open trans
0ce0: 61 63 74 69 6f 6e 2c 20 62 75 74 20 6e 6f 74 20  action, but not 
0cf0: 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 0a 20  a read-lock on. 
0d00: 20 23 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61   # the main data
0d10: 62 61 73 65 2e 20 53 6f 20 69 74 20 64 6f 65 73  base. So it does
0d20: 20 6e 6f 74 20 70 72 65 76 65 6e 74 20 5b 64 62   not prevent [db
0d30: 5d 20 66 72 6f 6d 20 63 6f 6d 6d 69 74 74 69 6e  ] from committin
0d40: 67 2e 0a 20 20 23 0a 20 20 64 6f 5f 74 65 73 74  g..  #.  do_test
0d50: 20 70 61 67 65 72 31 2d 24 74 6e 2e 38 20 7b 20   pager1-$tn.8 { 
0d60: 0a 20 20 20 20 63 73 71 6c 32 20 7b 20 55 50 44  .    csql2 { UPD
0d70: 41 54 45 20 74 31 20 53 45 54 20 61 20 3d 20 61  ATE t1 SET a = a
0d80: 20 2b 20 31 30 20 7d 0a 20 20 7d 20 7b 31 20 7b   + 10 }.  } {1 {
0d90: 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b  database is lock
0da0: 65 64 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70  ed}}.  do_test p
0db0: 61 67 65 72 31 2d 24 74 6e 2e 39 20 7b 20 0a 20  ager1-$tn.9 { . 
0dc0: 20 20 20 63 73 71 6c 32 20 7b 20 0a 20 20 20 20     csql2 { .    
0dd0: 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 55    BEGIN;.      U
0de0: 50 44 41 54 45 20 74 31 20 53 45 54 20 61 20 3d  PDATE t1 SET a =
0df0: 20 61 20 2b 20 31 30 3b 0a 20 20 20 20 7d 0a 20   a + 10;.    }. 
0e00: 20 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20   } {1 {database 
0e10: 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 0a 20 20 23  is locked}}..  #
0e20: 20 48 61 76 65 20 5b 64 62 5d 20 63 6f 6d 6d 69   Have [db] commi
0e30: 74 20 69 74 73 20 74 72 61 6e 73 61 63 74 69 6f  t its transactio
0e40: 6e 73 2e 20 43 68 65 63 6b 20 74 68 65 20 6f 74  ns. Check the ot
0e50: 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  her connections 
0e60: 63 61 6e 0a 20 20 23 20 6e 6f 77 20 73 65 65 20  can.  # now see 
0e70: 74 68 65 20 6e 65 77 20 64 61 74 61 62 61 73 65  the new database
0e80: 20 63 6f 6e 74 65 6e 74 2e 0a 20 20 23 0a 20 20   content..  #.  
0e90: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24  do_test pager1-$
0ea0: 74 6e 2e 31 30 20 7b 20 73 71 6c 31 20 7b 20 43  tn.10 { sql1 { C
0eb0: 4f 4d 4d 49 54 20 7d 20 7d 20 7b 7d 0a 20 20 64  OMMIT } } {}.  d
0ec0: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24 74  o_test pager1-$t
0ed0: 6e 2e 31 31 20 7b 20 73 71 6c 31 20 7b 20 53 45  n.11 { sql1 { SE
0ee0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d  LECT * FROM t1 }
0ef0: 20 7d 20 7b 31 20 6f 6e 65 20 32 20 74 77 6f 20   } {1 one 2 two 
0f00: 33 20 74 68 72 65 65 7d 0a 20 20 64 6f 5f 74 65  3 three}.  do_te
0f10: 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 31 32  st pager1-$tn.12
0f20: 20 7b 20 73 71 6c 32 20 7b 20 53 45 4c 45 43 54   { sql2 { SELECT
0f30: 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7d 20 7b   * FROM t1 } } {
0f40: 31 20 6f 6e 65 20 32 20 74 77 6f 20 33 20 74 68  1 one 2 two 3 th
0f50: 72 65 65 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70  ree}.  do_test p
0f60: 61 67 65 72 31 2d 24 74 6e 2e 31 33 20 7b 20 73  ager1-$tn.13 { s
0f70: 71 6c 33 20 7b 20 53 45 4c 45 43 54 20 2a 20 46  ql3 { SELECT * F
0f80: 52 4f 4d 20 74 31 20 7d 20 7d 20 7b 31 20 6f 6e  ROM t1 } } {1 on
0f90: 65 20 32 20 74 77 6f 20 33 20 74 68 72 65 65 7d  e 2 two 3 three}
0fa0: 0a 0a 20 20 23 20 43 68 65 63 6b 20 74 68 61 74  ..  # Check that
0fb0: 2c 20 61 73 20 6e 6f 74 65 64 20 61 62 6f 76 65  , as noted above
0fc0: 2c 20 5b 64 62 32 5d 20 72 65 61 6c 6c 79 20 64  , [db2] really d
0fd0: 69 64 20 6b 65 65 70 20 61 6e 20 6f 70 65 6e 20  id keep an open 
0fe0: 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 23 20  transaction.  # 
0ff0: 61 66 74 65 72 20 74 68 65 20 61 74 74 65 6d 70  after the attemp
1000: 74 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 64  t to write the d
1010: 61 74 61 62 61 73 65 20 66 61 69 6c 65 64 2e 0a  atabase failed..
1020: 20 20 23 0a 20 20 64 6f 5f 74 65 73 74 20 70 61    #.  do_test pa
1030: 67 65 72 31 2d 24 74 6e 2e 31 34 20 7b 20 0a 20  ger1-$tn.14 { . 
1040: 20 20 20 63 73 71 6c 32 20 7b 20 42 45 47 49 4e     csql2 { BEGIN
1050: 20 7d 20 0a 20 20 7d 20 7b 31 20 7b 63 61 6e 6e   } .  } {1 {cann
1060: 6f 74 20 73 74 61 72 74 20 61 20 74 72 61 6e 73  ot start a trans
1070: 61 63 74 69 6f 6e 20 77 69 74 68 69 6e 20 61 20  action within a 
1080: 74 72 61 6e 73 61 63 74 69 6f 6e 7d 7d 0a 20 20  transaction}}.  
1090: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24  do_test pager1-$
10a0: 74 6e 2e 31 35 20 7b 20 73 71 6c 32 20 7b 20 52  tn.15 { sql2 { R
10b0: 4f 4c 4c 42 41 43 4b 20 7d 20 7d 20 7b 7d 0a 0a  OLLBACK } } {}..
10c0: 20 20 23 20 48 61 76 65 20 5b 64 62 32 5d 20 6f    # Have [db2] o
10d0: 70 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f  pen a transactio
10e0: 6e 20 61 6e 64 20 74 61 6b 65 20 61 20 72 65 61  n and take a rea
10f0: 64 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  d-lock on the da
1100: 74 61 62 61 73 65 2e 0a 20 20 23 20 43 68 65 63  tabase..  # Chec
1110: 6b 20 74 68 61 74 20 74 68 69 73 20 70 72 65 76  k that this prev
1120: 65 6e 74 73 20 5b 64 62 5d 20 66 72 6f 6d 20 77  ents [db] from w
1130: 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61  riting to the da
1140: 74 61 62 61 73 65 20 28 6f 75 74 73 69 64 65 0a  tabase (outside.
1150: 20 20 23 20 6f 66 20 61 6e 79 20 74 72 61 6e 73    # of any trans
1160: 61 63 74 69 6f 6e 29 2e 20 41 66 74 65 72 20 74  action). After t
1170: 68 69 73 20 66 61 69 6c 73 2c 20 63 68 65 63 6b  his fails, check
1180: 20 74 68 61 74 20 5b 64 62 33 5d 20 63 61 6e 20   that [db3] can 
1190: 72 65 61 64 0a 20 20 23 20 74 68 65 20 64 62 20  read.  # the db 
11a0: 28 73 68 6f 77 69 6e 67 20 74 68 61 74 20 5b 64  (showing that [d
11b0: 62 5d 20 64 69 64 20 6e 6f 74 20 74 61 6b 65 20  b] did not take 
11c0: 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 65  a PENDING lock e
11d0: 74 63 2e 29 0a 20 20 23 0a 20 20 64 6f 5f 74 65  tc.).  #.  do_te
11e0: 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 31 35  st pager1-$tn.15
11f0: 20 7b 20 0a 20 20 20 20 73 71 6c 32 20 7b 20 42   { .    sql2 { B
1200: 45 47 49 4e 3b 20 53 45 4c 45 43 54 20 2a 20 46  EGIN; SELECT * F
1210: 52 4f 4d 20 74 31 3b 20 7d 0a 20 20 7d 20 7b 31  ROM t1; }.  } {1
1220: 20 6f 6e 65 20 32 20 74 77 6f 20 33 20 74 68 72   one 2 two 3 thr
1230: 65 65 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61  ee}.  do_test pa
1240: 67 65 72 31 2d 24 74 6e 2e 31 36 20 7b 20 0a 20  ger1-$tn.16 { . 
1250: 20 20 20 63 73 71 6c 31 20 7b 20 55 50 44 41 54     csql1 { UPDAT
1260: 45 20 74 31 20 53 45 54 20 61 20 3d 20 61 20 2b  E t1 SET a = a +
1270: 20 31 30 20 7d 0a 20 20 7d 20 7b 31 20 7b 64 61   10 }.  } {1 {da
1280: 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64  tabase is locked
1290: 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67  }}.  do_test pag
12a0: 65 72 31 2d 24 74 6e 2e 31 37 20 7b 20 73 71 6c  er1-$tn.17 { sql
12b0: 33 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  3 { SELECT * FRO
12c0: 4d 20 74 31 20 7d 20 7d 20 7b 31 20 6f 6e 65 20  M t1 } } {1 one 
12d0: 32 20 74 77 6f 20 33 20 74 68 72 65 65 7d 0a 0a  2 two 3 three}..
12e0: 20 20 23 20 54 68 69 73 20 74 69 6d 65 2c 20 68    # This time, h
12f0: 61 76 65 20 5b 64 62 5d 20 6f 70 65 6e 20 61 20  ave [db] open a 
1300: 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65 66 6f  transaction befo
1310: 72 65 20 77 72 69 74 69 6e 67 20 74 68 65 20 64  re writing the d
1320: 61 74 61 62 61 73 65 2e 0a 20 20 23 20 54 68 69  atabase..  # Thi
1330: 73 20 77 6f 72 6b 73 20 2d 20 5b 64 62 5d 20 67  s works - [db] g
1340: 65 74 73 20 61 20 52 45 53 45 52 56 45 44 20 6c  ets a RESERVED l
1350: 6f 63 6b 20 77 68 69 63 68 20 64 6f 65 73 20 6e  ock which does n
1360: 6f 74 20 63 6f 6e 66 6c 69 63 74 20 77 69 74 68  ot conflict with
1370: 0a 20 20 23 20 74 68 65 20 53 48 41 52 45 44 20  .  # the SHARED 
1380: 6c 6f 63 6b 20 5b 64 62 32 5d 20 69 73 20 68 6f  lock [db2] is ho
1390: 6c 64 69 6e 67 2e 0a 20 20 23 0a 20 20 64 6f 5f  lding..  #.  do_
13a0: 74 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e  test pager1-$tn.
13b0: 31 38 20 7b 20 0a 20 20 20 20 73 71 6c 31 20 7b  18 { .    sql1 {
13c0: 20 0a 20 20 20 20 20 20 42 45 47 49 4e 3b 20 20   .      BEGIN;  
13d0: 0a 20 20 20 20 20 20 55 50 44 41 54 45 20 74 31  .      UPDATE t1
13e0: 20 53 45 54 20 61 20 3d 20 61 20 2b 20 31 30 3b   SET a = a + 10;
13f0: 20 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 7d 0a 20   .    }.  } {}. 
1400: 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
1410: 24 74 6e 2d 31 39 20 7b 20 0a 20 20 20 20 73 71  $tn-19 { .    sq
1420: 6c 31 20 7b 20 50 52 41 47 4d 41 20 6c 6f 63 6b  l1 { PRAGMA lock
1430: 5f 73 74 61 74 75 73 20 7d 20 0a 20 20 7d 20 7b  _status } .  } {
1440: 6d 61 69 6e 20 72 65 73 65 72 76 65 64 20 74 65  main reserved te
1450: 6d 70 20 63 6c 6f 73 65 64 7d 0a 20 20 64 6f 5f  mp closed}.  do_
1460: 74 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2d  test pager1-$tn-
1470: 32 30 20 7b 20 0a 20 20 20 20 73 71 6c 32 20 7b  20 { .    sql2 {
1480: 20 50 52 41 47 4d 41 20 6c 6f 63 6b 5f 73 74 61   PRAGMA lock_sta
1490: 74 75 73 20 7d 20 0a 20 20 7d 20 7b 6d 61 69 6e  tus } .  } {main
14a0: 20 73 68 61 72 65 64 20 74 65 6d 70 20 63 6c 6f   shared temp clo
14b0: 73 65 64 7d 0a 0a 20 20 23 20 43 68 65 63 6b 20  sed}..  # Check 
14c0: 74 68 61 74 20 61 6c 6c 20 63 6f 6e 6e 65 63 74  that all connect
14d0: 69 6f 6e 73 20 63 61 6e 20 73 74 69 6c 6c 20 72  ions can still r
14e0: 65 61 64 20 74 68 65 20 64 61 74 61 62 61 73 65  ead the database
14f0: 2e 20 4f 6e 6c 79 20 5b 64 62 5d 20 73 65 65 73  . Only [db] sees
1500: 0a 20 20 23 20 74 68 65 20 75 70 64 61 74 65 64  .  # the updated
1510: 20 63 6f 6e 74 65 6e 74 20 28 61 73 20 74 68 65   content (as the
1520: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73   transaction has
1530: 20 6e 6f 74 20 62 65 65 6e 20 63 6f 6d 6d 69 74   not been commit
1540: 74 65 64 20 79 65 74 29 2e 0a 20 20 23 0a 20 20  ted yet)..  #.  
1550: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24  do_test pager1-$
1560: 74 6e 2e 32 31 20 7b 20 73 71 6c 31 20 7b 20 53  tn.21 { sql1 { S
1570: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
1580: 7d 20 7d 20 7b 31 31 20 6f 6e 65 20 31 32 20 74  } } {11 one 12 t
1590: 77 6f 20 31 33 20 74 68 72 65 65 7d 0a 20 20 64  wo 13 three}.  d
15a0: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24 74  o_test pager1-$t
15b0: 6e 2e 32 32 20 7b 20 73 71 6c 32 20 7b 20 53 45  n.22 { sql2 { SE
15c0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d  LECT * FROM t1 }
15d0: 20 7d 20 7b 31 20 6f 6e 65 20 32 20 74 77 6f 20   } {1 one 2 two 
15e0: 33 20 74 68 72 65 65 7d 0a 20 20 64 6f 5f 74 65  3 three}.  do_te
15f0: 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 32 33  st pager1-$tn.23
1600: 20 7b 20 73 71 6c 33 20 7b 20 53 45 4c 45 43 54   { sql3 { SELECT
1610: 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7d 20 7b   * FROM t1 } } {
1620: 31 20 6f 6e 65 20 32 20 74 77 6f 20 33 20 74 68  1 one 2 two 3 th
1630: 72 65 65 7d 0a 0a 20 20 23 20 42 65 63 61 75 73  ree}..  # Becaus
1640: 65 20 5b 64 62 32 5d 20 73 74 69 6c 6c 20 68 61  e [db2] still ha
1650: 73 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63  s the SHARED loc
1660: 6b 2c 20 5b 64 62 5d 20 69 73 20 75 6e 61 62 6c  k, [db] is unabl
1670: 65 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65 0a  e to commit the.
1680: 20 20 23 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e    # transaction.
1690: 20 49 66 20 69 74 20 74 72 69 65 73 2c 20 61 6e   If it tries, an
16a0: 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
16b0: 65 64 20 61 6e 64 20 74 68 65 20 63 6f 6e 6e 65  ed and the conne
16c0: 63 74 69 6f 6e 20 0a 20 20 23 20 75 70 67 72 61  ction .  # upgra
16d0: 64 65 73 20 74 6f 20 61 20 50 45 4e 44 49 4e 47  des to a PENDING
16e0: 20 6c 6f 63 6b 2e 0a 20 20 23 0a 20 20 23 20 4f   lock..  #.  # O
16f0: 6e 63 65 20 74 68 69 73 20 68 61 70 70 65 6e 73  nce this happens
1700: 2c 20 5b 64 62 5d 20 63 61 6e 20 72 65 61 64 20  , [db] can read 
1710: 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6e 64  the database and
1720: 20 73 65 65 20 74 68 65 20 6e 65 77 20 63 6f 6e   see the new con
1730: 74 65 6e 74 2c 0a 20 20 23 20 5b 64 62 32 5d 20  tent,.  # [db2] 
1740: 28 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 53  (still holding S
1750: 48 41 52 45 44 29 20 63 61 6e 20 73 74 69 6c 6c  HARED) can still
1760: 20 72 65 61 64 20 74 68 65 20 6f 6c 64 20 63 6f   read the old co
1770: 6e 74 65 6e 74 2c 20 62 75 74 20 5b 64 62 33 5d  ntent, but [db3]
1780: 0a 20 20 23 20 28 6e 6f 74 20 68 6f 6c 64 69 6e  .  # (not holdin
1790: 67 20 61 6e 79 20 6c 6f 63 6b 29 20 69 73 20 70  g any lock) is p
17a0: 72 65 76 65 6e 74 65 64 20 62 79 20 5b 64 62 5d  revented by [db]
17b0: 27 73 20 50 45 4e 44 49 4e 47 20 66 72 6f 6d 20  's PENDING from 
17c0: 72 65 61 64 69 6e 67 0a 20 20 23 20 74 68 65 20  reading.  # the 
17d0: 64 61 74 61 62 61 73 65 2e 0a 20 20 23 0a 20 20  database..  #.  
17e0: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24  do_test pager1-$
17f0: 74 6e 2e 32 34 20 7b 20 63 73 71 6c 31 20 7b 20  tn.24 { csql1 { 
1800: 43 4f 4d 4d 49 54 20 7d 20 7d 20 7b 31 20 7b 64  COMMIT } } {1 {d
1810: 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65  atabase is locke
1820: 64 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61  d}}.  do_test pa
1830: 67 65 72 31 2d 24 74 6e 2d 32 35 20 7b 20 0a 20  ger1-$tn-25 { . 
1840: 20 20 20 73 71 6c 31 20 7b 20 50 52 41 47 4d 41     sql1 { PRAGMA
1850: 20 6c 6f 63 6b 5f 73 74 61 74 75 73 20 7d 20 0a   lock_status } .
1860: 20 20 7d 20 7b 6d 61 69 6e 20 70 65 6e 64 69 6e    } {main pendin
1870: 67 20 74 65 6d 70 20 63 6c 6f 73 65 64 7d 0a 20  g temp closed}. 
1880: 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
1890: 24 74 6e 2e 32 36 20 7b 20 73 71 6c 31 20 7b 20  $tn.26 { sql1 { 
18a0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
18b0: 20 20 7d 20 7d 20 7b 31 31 20 6f 6e 65 20 31 32    } } {11 one 12
18c0: 20 74 77 6f 20 31 33 20 74 68 72 65 65 7d 0a 20   two 13 three}. 
18d0: 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
18e0: 24 74 6e 2e 32 37 20 7b 20 73 71 6c 32 20 7b 20  $tn.27 { sql2 { 
18f0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
1900: 20 20 7d 20 7d 20 7b 31 20 6f 6e 65 20 32 20 74    } } {1 one 2 t
1910: 77 6f 20 33 20 74 68 72 65 65 7d 0a 20 20 64 6f  wo 3 three}.  do
1920: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e  _test pager1-$tn
1930: 2e 32 38 20 7b 20 63 73 71 6c 33 20 7b 20 53 45  .28 { csql3 { SE
1940: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d  LECT * FROM t1 }
1950: 20 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20   } {1 {database 
1960: 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 0a 20 20 23  is locked}}..  #
1970: 20 48 61 76 65 20 5b 64 62 32 5d 20 63 6f 6d 6d   Have [db2] comm
1980: 69 74 20 69 74 73 20 72 65 61 64 20 74 72 61 6e  it its read tran
1990: 73 61 63 74 69 6f 6e 2c 20 72 65 6c 65 61 73 69  saction, releasi
19a0: 6e 67 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f  ng the SHARED lo
19b0: 63 6b 20 69 74 0a 20 20 23 20 69 73 20 68 6f 6c  ck it.  # is hol
19c0: 64 69 6e 67 2e 20 4e 6f 77 2c 20 6e 65 69 74 68  ding. Now, neith
19d0: 65 72 20 5b 64 62 32 5d 20 6e 6f 72 20 5b 64 62  er [db2] nor [db
19e0: 33 5d 20 6d 61 79 20 72 65 61 64 20 74 68 65 20  3] may read the 
19f0: 64 61 74 61 62 61 73 65 20 28 61 73 20 5b 64 62  database (as [db
1a00: 5d 0a 20 20 23 20 69 73 20 73 74 69 6c 6c 20 68  ].  # is still h
1a10: 6f 6c 64 69 6e 67 20 61 20 50 45 4e 44 49 4e 47  olding a PENDING
1a20: 29 2e 0a 20 20 23 0a 20 20 64 6f 5f 74 65 73 74  )..  #.  do_test
1a30: 20 70 61 67 65 72 31 2d 24 74 6e 2e 32 39 20 7b   pager1-$tn.29 {
1a40: 20 73 71 6c 32 20 7b 20 43 4f 4d 4d 49 54 20 7d   sql2 { COMMIT }
1a50: 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74 20   } {}.  do_test 
1a60: 70 61 67 65 72 31 2d 24 74 6e 2e 33 30 20 7b 20  pager1-$tn.30 { 
1a70: 63 73 71 6c 32 20 7b 20 53 45 4c 45 43 54 20 2a  csql2 { SELECT *
1a80: 20 46 52 4f 4d 20 74 31 20 7d 20 7d 20 7b 31 20   FROM t1 } } {1 
1a90: 7b 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63  {database is loc
1aa0: 6b 65 64 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20  ked}}.  do_test 
1ab0: 70 61 67 65 72 31 2d 24 74 6e 2e 33 31 20 7b 20  pager1-$tn.31 { 
1ac0: 63 73 71 6c 33 20 7b 20 53 45 4c 45 43 54 20 2a  csql3 { SELECT *
1ad0: 20 46 52 4f 4d 20 74 31 20 7d 20 7d 20 7b 31 20   FROM t1 } } {1 
1ae0: 7b 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63  {database is loc
1af0: 6b 65 64 7d 7d 0a 0a 20 20 23 20 5b 64 62 5d 20  ked}}..  # [db] 
1b00: 69 73 20 6e 6f 77 20 61 62 6c 65 20 74 6f 20 63  is now able to c
1b10: 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61  ommit the transa
1b20: 63 74 69 6f 6e 2e 20 4f 6e 63 65 20 74 68 65 20  ction. Once the 
1b30: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 0a  transaction is .
1b40: 20 20 23 20 63 6f 6d 6d 69 74 74 65 64 2c 20 61    # committed, a
1b50: 6c 6c 20 74 68 72 65 65 20 63 6f 6e 6e 65 63 74  ll three connect
1b60: 69 6f 6e 73 20 63 61 6e 20 72 65 61 64 20 74 68  ions can read th
1b70: 65 20 6e 65 77 20 63 6f 6e 74 65 6e 74 2e 0a 20  e new content.. 
1b80: 20 23 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67   #.  do_test pag
1b90: 65 72 31 2d 24 74 6e 2e 32 35 20 7b 20 73 71 6c  er1-$tn.25 { sql
1ba0: 31 20 7b 20 55 50 44 41 54 45 20 74 31 20 53 45  1 { UPDATE t1 SE
1bb0: 54 20 61 20 3d 20 61 2b 31 30 20 7d 20 7d 20 7b  T a = a+10 } } {
1bc0: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65  }.  do_test page
1bd0: 72 31 2d 24 74 6e 2e 32 36 20 7b 20 73 71 6c 31  r1-$tn.26 { sql1
1be0: 20 7b 20 43 4f 4d 4d 49 54 20 7d 20 7d 20 7b 7d   { COMMIT } } {}
1bf0: 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72  .  do_test pager
1c00: 31 2d 24 74 6e 2e 32 37 20 7b 20 73 71 6c 31 20  1-$tn.27 { sql1 
1c10: 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  { SELECT * FROM 
1c20: 74 31 20 7d 20 7d 20 7b 32 31 20 6f 6e 65 20 32  t1 } } {21 one 2
1c30: 32 20 74 77 6f 20 32 33 20 74 68 72 65 65 7d 0a  2 two 23 three}.
1c40: 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
1c50: 2d 24 74 6e 2e 32 37 20 7b 20 73 71 6c 32 20 7b  -$tn.27 { sql2 {
1c60: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
1c70: 31 20 7d 20 7d 20 7b 32 31 20 6f 6e 65 20 32 32  1 } } {21 one 22
1c80: 20 74 77 6f 20 32 33 20 74 68 72 65 65 7d 0a 20   two 23 three}. 
1c90: 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
1ca0: 24 74 6e 2e 32 38 20 7b 20 73 71 6c 33 20 7b 20  $tn.28 { sql3 { 
1cb0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
1cc0: 20 7d 20 7d 20 7b 32 31 20 6f 6e 65 20 32 32 20   } } {21 one 22 
1cd0: 74 77 6f 20 32 33 20 74 68 72 65 65 7d 0a 0a 20  two 23 three}.. 
1ce0: 20 23 20 49 6e 73 74 61 6c 6c 20 61 20 62 75 73   # Install a bus
1cf0: 79 2d 68 61 6e 64 6c 65 72 20 66 6f 72 20 63 6f  y-handler for co
1d00: 6e 6e 65 63 74 69 6f 6e 20 5b 64 62 5d 2e 0a 20  nnection [db].. 
1d10: 20 23 0a 20 20 73 65 74 20 3a 3a 6e 62 75 73 79   #.  set ::nbusy
1d20: 20 5b 6c 69 73 74 5d 0a 20 20 70 72 6f 63 20 62   [list].  proc b
1d30: 75 73 79 20 7b 6e 7d 20 7b 0a 20 20 20 20 6c 61  usy {n} {.    la
1d40: 70 70 65 6e 64 20 3a 3a 6e 62 75 73 79 20 24 6e  ppend ::nbusy $n
1d50: 0a 20 20 20 20 69 66 20 7b 24 6e 3e 35 7d 20 7b  .    if {$n>5} {
1d60: 20 73 71 6c 32 20 43 4f 4d 4d 49 54 20 7d 0a 20   sql2 COMMIT }. 
1d70: 20 20 20 72 65 74 75 72 6e 20 30 0a 20 20 7d 0a     return 0.  }.
1d80: 20 20 64 62 20 62 75 73 79 20 62 75 73 79 0a 0a    db busy busy..
1d90: 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
1da0: 2d 24 74 6e 2e 32 39 20 7b 20 0a 20 20 20 20 73  -$tn.29 { .    s
1db0: 71 6c 31 20 7b 20 42 45 47 49 4e 20 3b 20 49 4e  ql1 { BEGIN ; IN
1dc0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
1dd0: 55 45 53 28 27 78 27 2c 20 27 79 27 29 20 7d 20  UES('x', 'y') } 
1de0: 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73  .  } {}.  do_tes
1df0: 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 33 30 20  t pager1-$tn.30 
1e00: 7b 20 0a 20 20 20 20 73 71 6c 32 20 7b 20 42 45  { .    sql2 { BE
1e10: 47 49 4e 20 3b 20 53 45 4c 45 43 54 20 2a 20 46  GIN ; SELECT * F
1e20: 52 4f 4d 20 74 31 20 7d 20 0a 20 20 7d 20 7b 32  ROM t1 } .  } {2
1e30: 31 20 6f 6e 65 20 32 32 20 74 77 6f 20 32 33 20  1 one 22 two 23 
1e40: 74 68 72 65 65 7d 0a 20 20 64 6f 5f 74 65 73 74  three}.  do_test
1e50: 20 70 61 67 65 72 31 2d 24 74 6e 2e 33 31 20 7b   pager1-$tn.31 {
1e60: 20 73 71 6c 31 20 43 4f 4d 4d 49 54 20 7d 20 7b   sql1 COMMIT } {
1e70: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65  }.  do_test page
1e80: 72 31 2d 24 74 6e 2e 33 32 20 7b 20 73 65 74 20  r1-$tn.32 { set 
1e90: 3a 3a 6e 62 75 73 79 20 7d 20 7b 30 20 31 20 32  ::nbusy } {0 1 2
1ea0: 20 33 20 34 20 35 20 36 7d 0a 7d 0a 0a 23 2d 2d   3 4 5 6}.}..#--
1eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1ef0: 2d 2d 2d 2d 2d 2d 2d 0a 23 20 53 61 76 65 70 6f  -------.# Savepo
1f00: 69 6e 74 20 72 65 6c 61 74 65 64 20 74 65 73 74  int related test
1f10: 20 63 61 73 65 73 2e 0a 23 0a 23 20 70 61 67 65   cases..#.# page
1f20: 72 31 2d 33 2e 31 2e 32 2e 2a 3a 20 46 6f 72 63  r1-3.1.2.*: Forc
1f30: 65 20 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f  e a savepoint ro
1f40: 6c 6c 62 61 63 6b 20 74 6f 20 63 61 75 73 65 20  llback to cause 
1f50: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1f60: 65 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20  e.#             
1f70: 20 20 20 20 74 6f 20 67 72 6f 77 2e 0a 23 0a 23      to grow..#.#
1f80: 20 70 61 67 65 72 31 2d 33 2e 31 2e 33 2e 2a 3a   pager1-3.1.3.*:
1f90: 20 55 73 65 20 61 20 6a 6f 75 72 6e 61 6c 20 63   Use a journal c
1fa0: 72 65 61 74 65 64 20 69 6e 20 73 79 6e 63 68 72  reated in synchr
1fb0: 6f 6e 6f 75 73 3d 6f 66 66 20 6d 6f 64 65 20 61  onous=off mode a
1fc0: 73 20 70 61 72 74 0a 23 20 20 20 20 20 20 20 20  s part.#        
1fd0: 20 20 20 20 20 20 20 20 20 6f 66 20 61 20 73 61           of a sa
1fe0: 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b  vepoint rollback
1ff0: 2e 0a 23 20 0a 64 6f 5f 74 65 73 74 20 70 61 67  ..# .do_test pag
2000: 65 72 31 2d 33 2e 31 2e 31 20 7b 0a 20 20 66 61  er1-3.1.1 {.  fa
2010: 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e  ultsim_delete_an
2020: 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65 63 73  d_reopen.  execs
2030: 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20  ql {.    CREATE 
2040: 54 41 42 4c 45 20 74 31 28 61 20 50 52 49 4d 41  TABLE t1(a PRIMA
2050: 52 59 20 4b 45 59 2c 20 62 29 3b 0a 20 20 20 20  RY KEY, b);.    
2060: 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 6f 75  CREATE TABLE cou
2070: 6e 74 65 72 28 0a 20 20 20 20 20 20 69 20 43 48  nter(.      i CH
2080: 45 43 4b 20 28 69 3c 35 29 2c 20 0a 20 20 20 20  ECK (i<5), .    
2090: 20 20 75 20 43 48 45 43 4b 20 28 75 3c 31 30 29    u CHECK (u<10)
20a0: 0a 20 20 20 20 29 3b 0a 20 20 20 20 49 4e 53 45  .    );.    INSE
20b0: 52 54 20 49 4e 54 4f 20 63 6f 75 6e 74 65 72 20  RT INTO counter 
20c0: 56 41 4c 55 45 53 28 30 2c 20 30 29 3b 0a 20 20  VALUES(0, 0);.  
20d0: 20 20 43 52 45 41 54 45 20 54 52 49 47 47 45 52    CREATE TRIGGER
20e0: 20 74 72 31 20 41 46 54 45 52 20 49 4e 53 45 52   tr1 AFTER INSER
20f0: 54 20 4f 4e 20 74 31 20 42 45 47 49 4e 0a 20 20  T ON t1 BEGIN.  
2100: 20 20 20 20 55 50 44 41 54 45 20 63 6f 75 6e 74      UPDATE count
2110: 65 72 20 53 45 54 20 69 20 3d 20 69 2b 31 3b 0a  er SET i = i+1;.
2120: 20 20 20 20 45 4e 44 3b 0a 20 20 20 20 43 52 45      END;.    CRE
2130: 41 54 45 20 54 52 49 47 47 45 52 20 74 72 32 20  ATE TRIGGER tr2 
2140: 41 46 54 45 52 20 55 50 44 41 54 45 20 4f 4e 20  AFTER UPDATE ON 
2150: 74 31 20 42 45 47 49 4e 0a 20 20 20 20 20 20 55  t1 BEGIN.      U
2160: 50 44 41 54 45 20 63 6f 75 6e 74 65 72 20 53 45  PDATE counter SE
2170: 54 20 75 20 3d 20 75 2b 31 3b 0a 20 20 20 20 45  T u = u+1;.    E
2180: 4e 44 3b 0a 20 20 7d 0a 20 20 65 78 65 63 73 71  ND;.  }.  execsq
2190: 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  l { SELECT * FRO
21a0: 4d 20 63 6f 75 6e 74 65 72 20 7d 0a 7d 20 7b 30  M counter }.} {0
21b0: 20 30 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f   0}..do_execsql_
21c0: 74 65 73 74 20 70 61 67 65 72 31 2d 33 2e 31 2e  test pager1-3.1.
21d0: 32 20 7b 0a 20 20 50 52 41 47 4d 41 20 63 61 63  2 {.  PRAGMA cac
21e0: 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b 0a 20 20  he_size = 10;.  
21f0: 42 45 47 49 4e 3b 0a 20 20 20 20 49 4e 53 45 52  BEGIN;.    INSER
2200: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
2210: 28 31 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31  (1, randomblob(1
2220: 35 30 30 29 29 3b 0a 20 20 20 20 49 4e 53 45 52  500));.    INSER
2230: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
2240: 28 32 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31  (2, randomblob(1
2250: 35 30 30 29 29 3b 0a 20 20 20 20 49 4e 53 45 52  500));.    INSER
2260: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
2270: 28 33 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31  (3, randomblob(1
2280: 35 30 30 29 29 3b 0a 20 20 20 20 53 45 4c 45 43  500));.    SELEC
2290: 54 20 2a 20 46 52 4f 4d 20 63 6f 75 6e 74 65 72  T * FROM counter
22a0: 3b 0a 7d 20 7b 33 20 30 7d 0a 64 6f 5f 63 61 74  ;.} {3 0}.do_cat
22b0: 63 68 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72  chsql_test pager
22c0: 31 2d 33 2e 31 2e 33 20 7b 0a 20 20 20 20 49 4e  1-3.1.3 {.    IN
22d0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
22e0: 45 43 54 20 61 2b 33 2c 20 72 61 6e 64 6f 6d 62  ECT a+3, randomb
22f0: 6c 6f 62 28 31 35 30 30 29 20 46 52 4f 4d 20 74  lob(1500) FROM t
2300: 31 0a 7d 20 7b 31 20 7b 63 6f 6e 73 74 72 61 69  1.} {1 {constrai
2310: 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f 65  nt failed}}.do_e
2320: 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65  xecsql_test page
2330: 72 31 2d 33 2e 34 20 7b 20 53 45 4c 45 43 54 20  r1-3.4 { SELECT 
2340: 2a 20 46 52 4f 4d 20 63 6f 75 6e 74 65 72 20 7d  * FROM counter }
2350: 20 7b 33 20 30 7d 0a 64 6f 5f 65 78 65 63 73 71   {3 0}.do_execsq
2360: 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 33 2e  l_test pager1-3.
2370: 35 20 7b 20 53 45 4c 45 43 54 20 61 20 46 52 4f  5 { SELECT a FRO
2380: 4d 20 74 31 20 7d 20 7b 31 20 32 20 33 7d 0a 64  M t1 } {1 2 3}.d
2390: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70  o_execsql_test p
23a0: 61 67 65 72 31 2d 33 2e 36 20 7b 20 43 4f 4d 4d  ager1-3.6 { COMM
23b0: 49 54 20 7d 20 7b 7d 0a 0a 66 6f 72 65 61 63 68  IT } {}..foreach
23c0: 20 7b 74 6e 20 73 71 6c 20 74 63 6c 7d 20 7b 0a   {tn sql tcl} {.
23d0: 20 20 37 20 20 7b 20 50 52 41 47 4d 41 20 73 79    7  { PRAGMA sy
23e0: 6e 63 68 72 6f 6e 6f 75 73 20 3d 20 4e 4f 52 4d  nchronous = NORM
23f0: 41 4c 20 3b 20 50 52 41 47 4d 41 20 74 65 6d 70  AL ; PRAGMA temp
2400: 5f 73 74 6f 72 65 20 3d 20 30 20 7d 20 7b 0a 20  _store = 0 } {. 
2410: 20 20 20 74 65 73 74 76 66 73 20 74 76 20 2d 64     testvfs tv -d
2420: 65 66 61 75 6c 74 20 31 0a 20 20 20 20 74 76 20  efault 1.    tv 
2430: 64 65 76 63 68 61 72 20 73 61 66 65 5f 61 70 70  devchar safe_app
2440: 65 6e 64 0a 20 20 7d 0a 20 20 38 20 20 7b 20 50  end.  }.  8  { P
2450: 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75  RAGMA synchronou
2460: 73 20 3d 20 4e 4f 52 4d 41 4c 20 3b 20 50 52 41  s = NORMAL ; PRA
2470: 47 4d 41 20 74 65 6d 70 5f 73 74 6f 72 65 20 3d  GMA temp_store =
2480: 20 32 20 7d 20 7b 0a 20 20 20 20 74 65 73 74 76   2 } {.    testv
2490: 66 73 20 74 76 20 2d 64 65 66 61 75 6c 74 20 31  fs tv -default 1
24a0: 0a 20 20 20 20 74 76 20 64 65 76 63 68 61 72 20  .    tv devchar 
24b0: 73 65 71 75 65 6e 74 69 61 6c 0a 20 20 7d 0a 20  sequential.  }. 
24c0: 20 39 20 20 7b 20 50 52 41 47 4d 41 20 73 79 6e   9  { PRAGMA syn
24d0: 63 68 72 6f 6e 6f 75 73 20 3d 20 46 55 4c 4c 20  chronous = FULL 
24e0: 7d 20 7b 20 7d 0a 20 20 31 30 20 7b 20 50 52 41  } { }.  10 { PRA
24f0: 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20  GMA synchronous 
2500: 3d 20 4e 4f 52 4d 41 4c 20 7d 20 7b 20 7d 0a 20  = NORMAL } { }. 
2510: 20 31 31 20 7b 20 50 52 41 47 4d 41 20 73 79 6e   11 { PRAGMA syn
2520: 63 68 72 6f 6e 6f 75 73 20 3d 20 4f 46 46 20 7d  chronous = OFF }
2530: 20 7b 20 7d 0a 20 20 31 32 20 7b 20 50 52 41 47   { }.  12 { PRAG
2540: 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 3d  MA synchronous =
2550: 20 46 55 4c 4c 20 3b 20 50 52 41 47 4d 41 20 66   FULL ; PRAGMA f
2560: 75 6c 6c 66 73 79 6e 63 20 3d 20 31 20 7d 20 7b  ullfsync = 1 } {
2570: 20 7d 0a 20 20 31 33 20 7b 20 50 52 41 47 4d 41   }.  13 { PRAGMA
2580: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 3d 20 46   synchronous = F
2590: 55 4c 4c 20 7d 20 7b 0a 20 20 20 20 74 65 73 74  ULL } {.    test
25a0: 76 66 73 20 74 76 20 2d 64 65 66 61 75 6c 74 20  vfs tv -default 
25b0: 31 0a 20 20 20 20 74 76 20 64 65 76 63 68 61 72  1.    tv devchar
25c0: 20 73 65 71 75 65 6e 74 69 61 6c 0a 20 20 7d 0a   sequential.  }.
25d0: 20 20 31 34 20 7b 20 50 52 41 47 4d 41 20 6c 6f    14 { PRAGMA lo
25e0: 63 6b 69 6e 67 5f 6d 6f 64 65 20 3d 20 45 58 43  cking_mode = EXC
25f0: 4c 55 53 49 56 45 20 7d 20 7b 0a 20 20 7d 0a 7d  LUSIVE } {.  }.}
2600: 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67   {.  do_test pag
2610: 65 72 31 2d 33 2e 24 74 6e 2e 31 20 7b 0a 20 20  er1-3.$tn.1 {.  
2620: 20 20 65 76 61 6c 20 24 74 63 6c 0a 20 20 20 20    eval $tcl.    
2630: 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f  faultsim_delete_
2640: 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 20 20 64  and_reopen.    d
2650: 62 20 66 75 6e 63 20 61 5f 73 74 72 69 6e 67 20  b func a_string 
2660: 61 5f 73 74 72 69 6e 67 0a 20 20 20 20 65 78 65  a_string.    exe
2670: 63 73 71 6c 20 24 73 71 6c 0a 20 20 20 20 65 78  csql $sql.    ex
2680: 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 50 52  ecsql {.      PR
2690: 41 47 4d 41 20 61 75 74 6f 5f 76 61 63 75 75 6d  AGMA auto_vacuum
26a0: 20 3d 20 32 3b 0a 20 20 20 20 20 20 50 52 41 47   = 2;.      PRAG
26b0: 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 20 3d 20  MA cache_size = 
26c0: 31 30 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45  10;.      CREATE
26d0: 20 54 41 42 4c 45 20 7a 28 78 20 49 4e 54 45 47   TABLE z(x INTEG
26e0: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  ER PRIMARY KEY, 
26f0: 79 29 3b 0a 20 20 20 20 20 20 42 45 47 49 4e 3b  y);.      BEGIN;
2700: 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20  .        INSERT 
2710: 49 4e 54 4f 20 7a 20 56 41 4c 55 45 53 28 4e 55  INTO z VALUES(NU
2720: 4c 4c 2c 20 61 5f 73 74 72 69 6e 67 28 38 30 30  LL, a_string(800
2730: 29 29 3b 0a 20 20 20 20 20 20 20 20 49 4e 53 45  ));.        INSE
2740: 52 54 20 49 4e 54 4f 20 7a 20 53 45 4c 45 43 54  RT INTO z SELECT
2750: 20 4e 55 4c 4c 2c 20 61 5f 73 74 72 69 6e 67 28   NULL, a_string(
2760: 38 30 30 29 20 46 52 4f 4d 20 7a 3b 20 20 20 20  800) FROM z;    
2770: 20 2d 2d 20 20 20 32 0a 20 20 20 20 20 20 20 20   --   2.        
2780: 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a 20 53 45  INSERT INTO z SE
2790: 4c 45 43 54 20 4e 55 4c 4c 2c 20 61 5f 73 74 72  LECT NULL, a_str
27a0: 69 6e 67 28 38 30 30 29 20 46 52 4f 4d 20 7a 3b  ing(800) FROM z;
27b0: 20 20 20 20 20 2d 2d 20 20 20 34 0a 20 20 20 20       --   4.    
27c0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
27d0: 7a 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 61  z SELECT NULL, a
27e0: 5f 73 74 72 69 6e 67 28 38 30 30 29 20 46 52 4f  _string(800) FRO
27f0: 4d 20 7a 3b 20 20 20 20 20 2d 2d 20 20 20 38 0a  M z;     --   8.
2800: 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49          INSERT I
2810: 4e 54 4f 20 7a 20 53 45 4c 45 43 54 20 4e 55 4c  NTO z SELECT NUL
2820: 4c 2c 20 61 5f 73 74 72 69 6e 67 28 38 30 30 29  L, a_string(800)
2830: 20 46 52 4f 4d 20 7a 3b 20 20 20 20 20 2d 2d 20   FROM z;     -- 
2840: 20 31 36 0a 20 20 20 20 20 20 20 20 49 4e 53 45   16.        INSE
2850: 52 54 20 49 4e 54 4f 20 7a 20 53 45 4c 45 43 54  RT INTO z SELECT
2860: 20 4e 55 4c 4c 2c 20 61 5f 73 74 72 69 6e 67 28   NULL, a_string(
2870: 38 30 30 29 20 46 52 4f 4d 20 7a 3b 20 20 20 20  800) FROM z;    
2880: 20 2d 2d 20 20 33 32 0a 20 20 20 20 20 20 20 20   --  32.        
2890: 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a 20 53 45  INSERT INTO z SE
28a0: 4c 45 43 54 20 4e 55 4c 4c 2c 20 61 5f 73 74 72  LECT NULL, a_str
28b0: 69 6e 67 28 38 30 30 29 20 46 52 4f 4d 20 7a 3b  ing(800) FROM z;
28c0: 20 20 20 20 20 2d 2d 20 20 36 34 0a 20 20 20 20       --  64.    
28d0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
28e0: 7a 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 61  z SELECT NULL, a
28f0: 5f 73 74 72 69 6e 67 28 38 30 30 29 20 46 52 4f  _string(800) FRO
2900: 4d 20 7a 3b 20 20 20 20 20 2d 2d 20 31 32 38 0a  M z;     -- 128.
2910: 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49          INSERT I
2920: 4e 54 4f 20 7a 20 53 45 4c 45 43 54 20 4e 55 4c  NTO z SELECT NUL
2930: 4c 2c 20 61 5f 73 74 72 69 6e 67 28 38 30 30 29  L, a_string(800)
2940: 20 46 52 4f 4d 20 7a 3b 20 20 20 20 20 2d 2d 20   FROM z;     -- 
2950: 32 35 36 0a 20 20 20 20 20 20 43 4f 4d 4d 49 54  256.      COMMIT
2960: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 78 65 63  ;.    }.    exec
2970: 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 61 75 74  sql { PRAGMA aut
2980: 6f 5f 76 61 63 75 75 6d 20 7d 0a 20 20 7d 20 7b  o_vacuum }.  } {
2990: 32 7d 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f  2}.  do_execsql_
29a0: 74 65 73 74 20 70 61 67 65 72 31 2d 33 2e 24 74  test pager1-3.$t
29b0: 6e 2e 32 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b  n.2 {.    BEGIN;
29c0: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
29d0: 54 4f 20 7a 20 56 41 4c 55 45 53 28 4e 55 4c 4c  TO z VALUES(NULL
29e0: 2c 20 61 5f 73 74 72 69 6e 67 28 38 30 30 29 29  , a_string(800))
29f0: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
2a00: 4e 54 4f 20 7a 20 56 41 4c 55 45 53 28 4e 55 4c  NTO z VALUES(NUL
2a10: 4c 2c 20 61 5f 73 74 72 69 6e 67 28 38 30 30 29  L, a_string(800)
2a20: 29 3b 0a 20 20 20 20 20 20 53 41 56 45 50 4f 49  );.      SAVEPOI
2a30: 4e 54 20 6f 6e 65 3b 0a 20 20 20 20 20 20 20 20  NT one;.        
2a40: 55 50 44 41 54 45 20 7a 20 53 45 54 20 79 20 3d  UPDATE z SET y =
2a50: 20 4e 55 4c 4c 20 57 48 45 52 45 20 78 3e 32 35   NULL WHERE x>25
2a60: 36 3b 0a 20 20 20 20 20 20 20 20 50 52 41 47 4d  6;.        PRAGM
2a70: 41 20 69 6e 63 72 65 6d 65 6e 74 61 6c 5f 76 61  A incremental_va
2a80: 63 75 75 6d 3b 0a 20 20 20 20 20 20 20 20 53 45  cuum;.        SE
2a90: 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
2aa0: 4f 4d 20 7a 20 57 48 45 52 45 20 78 20 3c 20 31  OM z WHERE x < 1
2ab0: 30 30 3b 0a 20 20 20 20 20 20 52 4f 4c 4c 42 41  00;.      ROLLBA
2ac0: 43 4b 20 54 4f 20 6f 6e 65 3b 0a 20 20 20 20 43  CK TO one;.    C
2ad0: 4f 4d 4d 49 54 3b 0a 20 20 7d 20 7b 39 39 7d 0a  OMMIT;.  } {99}.
2ae0: 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  .  do_execsql_te
2af0: 73 74 20 70 61 67 65 72 31 2d 33 2e 24 74 6e 2e  st pager1-3.$tn.
2b00: 33 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20  3 {.    BEGIN;. 
2b10: 20 20 20 20 20 53 41 56 45 50 4f 49 4e 54 20 6f       SAVEPOINT o
2b20: 6e 65 3b 0a 20 20 20 20 20 20 20 20 55 50 44 41  ne;.        UPDA
2b30: 54 45 20 7a 20 53 45 54 20 79 20 3d 20 79 7c 7c  TE z SET y = y||
2b40: 78 3b 0a 20 20 20 20 20 20 52 4f 4c 4c 42 41 43  x;.      ROLLBAC
2b50: 4b 20 54 4f 20 6f 6e 65 3b 0a 20 20 20 20 43 4f  K TO one;.    CO
2b60: 4d 4d 49 54 3b 0a 20 20 20 20 53 45 4c 45 43 54  MMIT;.    SELECT
2b70: 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 7a   count(*) FROM z
2b80: 3b 0a 20 20 7d 20 7b 32 35 38 7d 0a 0a 20 20 64  ;.  } {258}..  d
2b90: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70  o_execsql_test p
2ba0: 61 67 65 72 31 2d 33 2e 24 74 6e 2e 34 20 7b 0a  ager1-3.$tn.4 {.
2bb0: 20 20 20 20 53 41 56 45 50 4f 49 4e 54 20 6f 6e      SAVEPOINT on
2bc0: 65 3b 0a 20 20 20 20 20 20 55 50 44 41 54 45 20  e;.      UPDATE 
2bd0: 7a 20 53 45 54 20 79 20 3d 20 79 7c 7c 78 3b 0a  z SET y = y||x;.
2be0: 20 20 20 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20      ROLLBACK TO 
2bf0: 6f 6e 65 3b 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f  one;.  } {}.  do
2c00: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61  _execsql_test pa
2c10: 67 65 72 31 2d 33 2e 24 74 6e 2e 35 20 7b 0a 20  ger1-3.$tn.5 {. 
2c20: 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28     SELECT count(
2c30: 2a 29 20 46 52 4f 4d 20 7a 3b 0a 20 20 20 20 52  *) FROM z;.    R
2c40: 45 4c 45 41 53 45 20 6f 6e 65 3b 0a 20 20 20 20  ELEASE one;.    
2c50: 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79  PRAGMA integrity
2c60: 5f 63 68 65 63 6b 3b 0a 20 20 7d 20 7b 32 35 38  _check;.  } {258
2c70: 20 6f 6b 7d 0a 0a 20 20 64 62 20 63 6c 6f 73 65   ok}..  db close
2c80: 0a 20 20 63 61 74 63 68 20 7b 20 74 76 20 64 65  .  catch { tv de
2c90: 6c 65 74 65 20 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d  lete }.}..#-----
2ca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2cd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ce0: 2d 2d 2d 2d 0a 23 20 48 6f 74 20 6a 6f 75 72 6e  ----.# Hot journ
2cf0: 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 72 65 6c 61  al rollback rela
2d00: 74 65 64 20 74 65 73 74 20 63 61 73 65 73 2e 0a  ted test cases..
2d10: 23 0a 23 20 70 61 67 65 72 31 2e 34 2e 31 2e 2a  #.# pager1.4.1.*
2d20: 3a 20 54 65 73 74 20 74 68 61 74 20 74 68 65 20  : Test that the 
2d30: 70 61 67 65 72 20 6d 6f 64 75 6c 65 20 64 65 6c  pager module del
2d40: 65 74 65 73 20 76 65 72 79 20 73 6d 61 6c 6c 20  etes very small 
2d50: 69 6e 76 61 6c 69 64 0a 23 20 20 20 20 20 20 20  invalid.#       
2d60: 20 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20          journal 
2d70: 66 69 6c 65 73 2e 0a 23 0a 23 20 70 61 67 65 72  files..#.# pager
2d80: 31 2e 34 2e 32 2e 2a 3a 20 54 65 73 74 20 74 68  1.4.2.*: Test th
2d90: 61 74 20 69 66 20 74 68 65 20 6d 61 73 74 65 72  at if the master
2da0: 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72   journal pointer
2db0: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61   at the end of a
2dc0: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
2dd0: 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c   hot-journal fil
2de0: 65 20 61 70 70 65 61 72 73 20 74 6f 20 62 65 20  e appears to be 
2df0: 63 6f 72 72 75 70 74 20 28 63 68 65 63 6b 73 75  corrupt (checksu
2e00: 6d 20 64 6f 65 73 20 6e 6f 74 0a 23 20 20 20 20  m does not.#    
2e10: 20 20 20 20 20 20 20 20 20 20 20 63 6f 6d 70 75             compu
2e20: 74 65 29 20 74 68 65 20 61 73 73 6f 63 69 61 74  te) the associat
2e30: 65 64 20 6a 6f 75 72 6e 61 6c 20 69 73 20 72 6f  ed journal is ro
2e40: 6c 6c 65 64 20 62 61 63 6b 20 28 61 6e 64 20 6e  lled back (and n
2e50: 6f 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20  o.#             
2e60: 20 20 78 41 63 63 65 73 73 28 29 20 63 61 6c 6c    xAccess() call
2e70: 20 74 6f 20 63 68 65 63 6b 20 66 6f 72 20 74 68   to check for th
2e80: 65 20 70 72 65 73 65 6e 63 65 20 6f 66 20 61 6e  e presence of an
2e90: 79 20 6d 61 73 74 65 72 20 0a 23 20 20 20 20 20  y master .#     
2ea0: 20 20 20 20 20 20 20 20 20 20 6a 6f 75 72 6e 61            journa
2eb0: 6c 20 66 69 6c 65 20 69 73 20 6d 61 64 65 29 2e  l file is made).
2ec0: 0a 23 0a 23 20 70 61 67 65 72 31 2e 34 2e 33 2e  .#.# pager1.4.3.
2ed0: 2a 3a 20 54 65 73 74 20 74 68 61 74 20 74 68 65  *: Test that the
2ee0: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61 20 68   contents of a h
2ef0: 6f 74 2d 6a 6f 75 72 6e 61 6c 20 61 72 65 20 69  ot-journal are i
2f00: 67 6e 6f 72 65 64 20 69 66 20 74 68 65 0a 23 20  gnored if the.# 
2f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61                pa
2f20: 67 65 2d 73 69 7a 65 20 6f 72 20 73 65 63 74 6f  ge-size or secto
2f30: 72 2d 73 69 7a 65 20 69 6e 20 74 68 65 20 6a 6f  r-size in the jo
2f40: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 61 70 70  urnal header app
2f50: 65 61 72 20 74 6f 0a 23 20 20 20 20 20 20 20 20  ear to.#        
2f60: 20 20 20 20 20 20 20 62 65 20 69 6e 76 61 6c 69         be invali
2f70: 64 20 28 74 6f 6f 20 6c 61 72 67 65 2c 20 74 6f  d (too large, to
2f80: 6f 20 73 6d 61 6c 6c 20 6f 72 20 6e 6f 74 20 61  o small or not a
2f90: 20 70 6f 77 65 72 20 6f 66 20 32 29 2e 0a 23 0a   power of 2)..#.
2fa0: 23 20 70 61 67 65 72 31 2e 34 2e 34 2e 2a 3a 20  # pager1.4.4.*: 
2fb0: 54 65 73 74 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  Test hot-journal
2fc0: 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 6a 6f 75   rollback of jou
2fd0: 72 6e 61 6c 20 66 69 6c 65 20 77 69 74 68 20 61  rnal file with a
2fe0: 20 6d 61 73 74 65 72 0a 23 20 20 20 20 20 20 20   master.#       
2ff0: 20 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20          journal 
3000: 70 6f 69 6e 74 65 72 20 67 65 6e 65 72 61 74 65  pointer generate
3010: 64 20 69 6e 20 76 61 72 69 6f 75 73 20 22 50 52  d in various "PR
3020: 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73  AGMA synchronous
3030: 22 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20  ".#             
3040: 20 20 6d 6f 64 65 73 2e 0a 23 0a 23 20 70 61 67    modes..#.# pag
3050: 65 72 31 2e 34 2e 35 2e 2a 3a 20 54 65 73 74 20  er1.4.5.*: Test 
3060: 74 68 61 74 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  that hot-journal
3070: 20 72 6f 6c 6c 62 61 63 6b 20 73 74 6f 70 73 20   rollback stops 
3080: 69 66 20 69 74 20 65 6e 63 6f 75 6e 74 65 72 73  if it encounters
3090: 20 61 0a 23 20 20 20 20 20 20 20 20 20 20 20 20   a.#            
30a0: 20 20 20 6a 6f 75 72 6e 61 6c 2d 72 65 63 6f 72     journal-recor
30b0: 64 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20  d for which the 
30c0: 63 68 65 63 6b 73 75 6d 20 66 61 69 6c 73 2e 0a  checksum fails..
30d0: 23 0a 23 20 70 61 67 65 72 31 2e 34 2e 36 2e 2a  #.# pager1.4.6.*
30e0: 3a 20 54 65 73 74 20 74 68 61 74 20 77 68 65 6e  : Test that when
30f0: 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20   rolling back a 
3100: 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 74 68 61 74  hot-journal that
3110: 20 63 6f 6e 74 61 69 6e 73 20 61 0a 23 20 20 20   contains a.#   
3120: 20 20 20 20 20 20 20 20 20 20 20 20 6d 61 73 74              mast
3130: 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74  er journal point
3140: 65 72 2c 20 74 68 65 20 6d 61 73 74 65 72 20 6a  er, the master j
3150: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 64  ournal file is d
3160: 65 6c 65 74 65 64 0a 23 20 20 20 20 20 20 20 20  eleted.#        
3170: 20 20 20 20 20 20 20 61 66 74 65 72 20 61 6c 6c         after all
3180: 20 74 68 65 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c   the hot-journal
3190: 73 20 74 68 61 74 20 72 65 66 65 72 20 74 6f 20  s that refer to 
31a0: 69 74 20 61 72 65 20 64 65 6c 65 74 65 64 2e 0a  it are deleted..
31b0: 23 0a 23 20 70 61 67 65 72 31 2e 34 2e 37 2e 2a  #.# pager1.4.7.*
31c0: 3a 20 54 65 73 74 20 74 68 61 74 20 69 66 20 61  : Test that if a
31d0: 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c   hot-journal fil
31e0: 65 20 65 78 69 73 74 73 20 62 75 74 20 61 20 63  e exists but a c
31f0: 6c 69 65 6e 74 20 63 61 6e 0a 23 20 20 20 20 20  lient can.#     
3200: 20 20 20 20 20 20 20 20 20 20 6f 70 65 6e 20 69            open i
3210: 74 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f 6e  t for reading on
3220: 6c 79 2c 20 74 68 65 20 64 61 74 61 62 61 73 65  ly, the database
3230: 20 63 61 6e 6e 6f 74 20 62 65 20 61 63 63 65 73   cannot be acces
3240: 73 65 64 20 61 6e 64 0a 23 20 20 20 20 20 20 20  sed and.#       
3250: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 43          SQLITE_C
3260: 41 4e 54 4f 50 45 4e 20 69 73 20 72 65 74 75 72  ANTOPEN is retur
3270: 6e 65 64 2e 0a 23 20 0a 64 6f 5f 74 65 73 74 20  ned..# .do_test 
3280: 70 61 67 65 72 31 2e 34 2e 31 2e 31 20 7b 0a 20  pager1.4.1.1 {. 
3290: 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65   faultsim_delete
32a0: 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78  _and_reopen.  ex
32b0: 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 43 52 45  ecsql { .    CRE
32c0: 41 54 45 20 54 41 42 4c 45 20 78 28 79 2c 20 7a  ATE TABLE x(y, z
32d0: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
32e0: 54 4f 20 78 20 56 41 4c 55 45 53 28 31 2c 20 32  TO x VALUES(1, 2
32f0: 29 3b 0a 20 20 7d 0a 20 20 73 65 74 20 66 64 20  );.  }.  set fd 
3300: 5b 6f 70 65 6e 20 74 65 73 74 2e 64 62 2d 6a 6f  [open test.db-jo
3310: 75 72 6e 61 6c 20 77 5d 0a 20 20 70 75 74 73 20  urnal w].  puts 
3320: 2d 6e 6f 6e 65 77 6c 69 6e 65 20 24 66 64 20 22  -nonewline $fd "
3330: 68 65 6c 6c 6f 77 6f 72 6c 64 22 0a 20 20 63 6c  helloworld".  cl
3340: 6f 73 65 20 24 66 64 0a 20 20 66 69 6c 65 20 65  ose $fd.  file e
3350: 78 69 73 74 73 20 74 65 73 74 2e 64 62 2d 6a 6f  xists test.db-jo
3360: 75 72 6e 61 6c 0a 7d 20 7b 31 7d 0a 64 6f 5f 74  urnal.} {1}.do_t
3370: 65 73 74 20 70 61 67 65 72 31 2e 34 2e 31 2e 32  est pager1.4.1.2
3380: 20 7b 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c   { execsql { SEL
3390: 45 43 54 20 2a 20 46 52 4f 4d 20 78 20 7d 20 7d  ECT * FROM x } }
33a0: 20 7b 31 20 32 7d 0a 64 6f 5f 74 65 73 74 20 70   {1 2}.do_test p
33b0: 61 67 65 72 31 2e 34 2e 31 2e 33 20 7b 20 66 69  ager1.4.1.3 { fi
33c0: 6c 65 20 65 78 69 73 74 73 20 74 65 73 74 2e 64  le exists test.d
33d0: 62 2d 6a 6f 75 72 6e 61 6c 20 7d 20 7b 30 7d 0a  b-journal } {0}.
33e0: 0a 23 20 53 65 74 20 75 70 20 61 20 5b 74 65 73  .# Set up a [tes
33f0: 74 76 66 73 5d 20 74 6f 20 73 6e 61 70 73 68 6f  tvfs] to snapsho
3400: 74 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  t the file-syste
3410: 6d 20 6a 75 73 74 20 62 65 66 6f 72 65 20 53 51  m just before SQ
3420: 4c 69 74 65 0a 23 20 64 65 6c 65 74 65 73 20 74  Lite.# deletes t
3430: 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  he master-journa
3440: 6c 20 74 6f 20 63 6f 6d 6d 69 74 20 61 20 6d 75  l to commit a mu
3450: 6c 74 69 2d 66 69 6c 65 20 74 72 61 6e 73 61 63  lti-file transac
3460: 74 69 6f 6e 2e 0a 23 0a 23 20 49 6e 20 73 75 62  tion..#.# In sub
3470: 73 65 71 75 65 6e 74 20 74 65 73 74 20 63 61 73  sequent test cas
3480: 65 73 2c 20 69 6e 76 6f 6b 69 6e 67 20 5b 66 61  es, invoking [fa
3490: 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61  ultsim_restore_a
34a0: 6e 64 5f 72 65 6f 70 65 6e 5d 20 73 65 74 73 0a  nd_reopen] sets.
34b0: 23 20 75 70 20 74 68 65 20 66 69 6c 65 20 73 79  # up the file sy
34c0: 73 74 65 6d 20 74 6f 20 63 6f 6e 74 61 69 6e 20  stem to contain 
34d0: 74 77 6f 20 64 61 74 61 62 61 73 65 73 2c 20 74  two databases, t
34e0: 77 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66  wo hot-journal f
34f0: 69 6c 65 73 20 61 6e 64 0a 23 20 61 20 6d 61 73  iles and.# a mas
3500: 74 65 72 2d 6a 6f 75 72 6e 61 6c 2e 0a 23 0a 64  ter-journal..#.d
3510: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e  o_test pager1.4.
3520: 32 2e 31 20 7b 0a 20 20 74 65 73 74 76 66 73 20  2.1 {.  testvfs 
3530: 74 73 74 76 66 73 20 2d 64 65 66 61 75 6c 74 20  tstvfs -default 
3540: 31 0a 20 20 74 73 74 76 66 73 20 66 69 6c 74 65  1.  tstvfs filte
3550: 72 20 78 44 65 6c 65 74 65 0a 20 20 74 73 74 76  r xDelete.  tstv
3560: 66 73 20 73 63 72 69 70 74 20 78 44 65 6c 65 74  fs script xDelet
3570: 65 43 61 6c 6c 62 61 63 6b 0a 20 20 70 72 6f 63  eCallback.  proc
3580: 20 78 44 65 6c 65 74 65 43 61 6c 6c 62 61 63 6b   xDeleteCallback
3590: 20 7b 6d 65 74 68 6f 64 20 66 69 6c 65 20 61 72   {method file ar
35a0: 67 73 7d 20 7b 0a 20 20 20 20 73 65 74 20 66 69  gs} {.    set fi
35b0: 6c 65 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 66  le [file tail $f
35c0: 69 6c 65 5d 0a 20 20 20 20 69 66 20 7b 20 5b 73  ile].    if { [s
35d0: 74 72 69 6e 67 20 6d 61 74 63 68 20 2a 6d 6a 2a  tring match *mj*
35e0: 20 24 66 69 6c 65 5d 20 7d 20 7b 20 66 61 75 6c   $file] } { faul
35f0: 74 73 69 6d 5f 73 61 76 65 20 7d 0a 20 20 7d 0a  tsim_save }.  }.
3600: 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74    faultsim_delet
3610: 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 64  e_and_reopen.  d
3620: 62 20 66 75 6e 63 20 61 5f 73 74 72 69 6e 67 20  b func a_string 
3630: 61 5f 73 74 72 69 6e 67 0a 20 20 65 78 65 63 73  a_string.  execs
3640: 71 6c 20 7b 0a 20 20 20 20 41 54 54 41 43 48 20  ql {.    ATTACH 
3650: 27 74 65 73 74 2e 64 62 32 27 20 41 53 20 61 75  'test.db2' AS au
3660: 78 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f  x;.    PRAGMA jo
3670: 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c  urnal_mode = DEL
3680: 45 54 45 3b 0a 20 20 20 20 50 52 41 47 4d 41 20  ETE;.    PRAGMA 
3690: 6d 61 69 6e 2e 63 61 63 68 65 5f 73 69 7a 65 20  main.cache_size 
36a0: 3d 20 31 30 3b 0a 20 20 20 20 50 52 41 47 4d 41  = 10;.    PRAGMA
36b0: 20 61 75 78 2e 63 61 63 68 65 5f 73 69 7a 65 20   aux.cache_size 
36c0: 3d 20 31 30 3b 0a 20 20 20 20 43 52 45 41 54 45  = 10;.    CREATE
36d0: 20 54 41 42 4c 45 20 74 31 28 61 20 55 4e 49 51   TABLE t1(a UNIQ
36e0: 55 45 2c 20 62 20 55 4e 49 51 55 45 29 3b 0a 20  UE, b UNIQUE);. 
36f0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
3700: 61 75 78 2e 74 32 28 61 20 55 4e 49 51 55 45 2c  aux.t2(a UNIQUE,
3710: 20 62 20 55 4e 49 51 55 45 29 3b 0a 20 20 20 20   b UNIQUE);.    
3720: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
3730: 41 4c 55 45 53 28 61 5f 73 74 72 69 6e 67 28 32  ALUES(a_string(2
3740: 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 33 30  00), a_string(30
3750: 30 29 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  0));.    INSERT 
3760: 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61  INTO t1 SELECT a
3770: 5f 73 74 72 69 6e 67 28 32 30 30 29 2c 20 61 5f  _string(200), a_
3780: 73 74 72 69 6e 67 28 33 30 30 29 20 46 52 4f 4d  string(300) FROM
3790: 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   t1;.    INSERT 
37a0: 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61  INTO t1 SELECT a
37b0: 5f 73 74 72 69 6e 67 28 32 30 30 29 2c 20 61 5f  _string(200), a_
37c0: 73 74 72 69 6e 67 28 33 30 30 29 20 46 52 4f 4d  string(300) FROM
37d0: 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   t1;.    INSERT 
37e0: 49 4e 54 4f 20 74 32 20 53 45 4c 45 43 54 20 2a  INTO t2 SELECT *
37f0: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 42 45   FROM t1;.    BE
3800: 47 49 4e 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  GIN;.      INSER
3810: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
3820: 20 61 5f 73 74 72 69 6e 67 28 32 30 31 29 2c 20   a_string(201), 
3830: 61 5f 73 74 72 69 6e 67 28 33 30 31 29 20 46 52  a_string(301) FR
3840: 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20 49 4e 53  OM t1;.      INS
3850: 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
3860: 43 54 20 61 5f 73 74 72 69 6e 67 28 32 30 32 29  CT a_string(202)
3870: 2c 20 61 5f 73 74 72 69 6e 67 28 33 30 32 29 20  , a_string(302) 
3880: 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20 49  FROM t1;.      I
3890: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
38a0: 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 32 30  LECT a_string(20
38b0: 33 29 2c 20 61 5f 73 74 72 69 6e 67 28 33 30 33  3), a_string(303
38c0: 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20  ) FROM t1;.     
38d0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
38e0: 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28  SELECT a_string(
38f0: 32 30 34 29 2c 20 61 5f 73 74 72 69 6e 67 28 33  204), a_string(3
3900: 30 34 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20  04) FROM t1;.   
3910: 20 20 20 52 45 50 4c 41 43 45 20 49 4e 54 4f 20     REPLACE INTO 
3920: 74 32 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  t2 SELECT * FROM
3930: 20 74 31 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b   t1;.    COMMIT;
3940: 0a 20 20 7d 0a 20 20 64 62 20 63 6c 6f 73 65 0a  .  }.  db close.
3950: 20 20 74 73 74 76 66 73 20 64 65 6c 65 74 65 0a    tstvfs delete.
3960: 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67  } {}.do_test pag
3970: 65 72 31 2e 34 2e 32 2e 32 20 7b 0a 20 20 66 61  er1.4.2.2 {.  fa
3980: 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61  ultsim_restore_a
3990: 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65 63  nd_reopen.  exec
39a0: 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54  sql {.    SELECT
39b0: 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74   count(*) FROM t
39c0: 31 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 69 6e  1;.    PRAGMA in
39d0: 74 65 67 72 69 74 79 5f 63 68 65 63 6b 3b 0a 20  tegrity_check;. 
39e0: 20 7d 0a 7d 20 7b 34 20 6f 6b 7d 0a 64 6f 5f 74   }.} {4 ok}.do_t
39f0: 65 73 74 20 70 61 67 65 72 31 2e 34 2e 32 2e 33  est pager1.4.2.3
3a00: 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 72 65   {.  faultsim_re
3a10: 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e  store_and_reopen
3a20: 0a 20 20 66 6f 72 65 61 63 68 20 66 20 5b 67 6c  .  foreach f [gl
3a30: 6f 62 20 74 65 73 74 2e 64 62 2d 6d 6a 2a 5d 20  ob test.db-mj*] 
3a40: 7b 20 66 69 6c 65 20 64 65 6c 65 74 65 20 2d 66  { file delete -f
3a50: 6f 72 63 65 20 24 66 20 7d 0a 20 20 65 78 65 63  orce $f }.  exec
3a60: 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54  sql {.    SELECT
3a70: 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74   count(*) FROM t
3a80: 31 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 69 6e  1;.    PRAGMA in
3a90: 74 65 67 72 69 74 79 5f 63 68 65 63 6b 3b 0a 20  tegrity_check;. 
3aa0: 20 7d 0a 7d 20 7b 36 34 20 6f 6b 7d 0a 64 6f 5f   }.} {64 ok}.do_
3ab0: 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e 32 2e  test pager1.4.2.
3ac0: 34 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 72  4 {.  faultsim_r
3ad0: 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65  estore_and_reope
3ae0: 6e 0a 20 20 68 65 78 69 6f 5f 77 72 69 74 65 20  n.  hexio_write 
3af0: 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20  test.db-journal 
3b00: 5b 65 78 70 72 20 5b 66 69 6c 65 20 73 69 7a 65  [expr [file size
3b10: 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c   test.db-journal
3b20: 5d 2d 32 30 5d 20 31 32 33 34 35 36 0a 20 20 65  ]-20] 123456.  e
3b30: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c  xecsql {.    SEL
3b40: 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
3b50: 4d 20 74 31 3b 0a 20 20 20 20 50 52 41 47 4d 41  M t1;.    PRAGMA
3b60: 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b   integrity_check
3b70: 3b 0a 20 20 7d 0a 7d 20 7b 34 20 6f 6b 7d 0a 64  ;.  }.} {4 ok}.d
3b80: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e  o_test pager1.4.
3b90: 32 2e 35 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d  2.5 {.  faultsim
3ba0: 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f  _restore_and_reo
3bb0: 70 65 6e 0a 20 20 68 65 78 69 6f 5f 77 72 69 74  pen.  hexio_writ
3bc0: 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61  e test.db-journa
3bd0: 6c 20 5b 65 78 70 72 20 5b 66 69 6c 65 20 73 69  l [expr [file si
3be0: 7a 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e  ze test.db-journ
3bf0: 61 6c 5d 2d 32 30 5d 20 31 32 33 34 35 36 0a 20  al]-20] 123456. 
3c00: 20 66 6f 72 65 61 63 68 20 66 20 5b 67 6c 6f 62   foreach f [glob
3c10: 20 74 65 73 74 2e 64 62 2d 6d 6a 2a 5d 20 7b 20   test.db-mj*] { 
3c20: 66 69 6c 65 20 64 65 6c 65 74 65 20 2d 66 6f 72  file delete -for
3c30: 63 65 20 24 66 20 7d 0a 20 20 65 78 65 63 73 71  ce $f }.  execsq
3c40: 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 63  l {.    SELECT c
3c50: 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31 3b  ount(*) FROM t1;
3c60: 0a 20 20 20 20 50 52 41 47 4d 41 20 69 6e 74 65  .    PRAGMA inte
3c70: 67 72 69 74 79 5f 63 68 65 63 6b 3b 0a 20 20 7d  grity_check;.  }
3c80: 0a 7d 20 7b 34 20 6f 6b 7d 0a 0a 64 6f 5f 74 65  .} {4 ok}..do_te
3c90: 73 74 20 70 61 67 65 72 31 2e 34 2e 33 2e 31 20  st pager1.4.3.1 
3ca0: 7b 0a 20 20 74 65 73 74 76 66 73 20 74 73 74 76  {.  testvfs tstv
3cb0: 66 73 20 2d 64 65 66 61 75 6c 74 20 31 0a 20 20  fs -default 1.  
3cc0: 74 73 74 76 66 73 20 66 69 6c 74 65 72 20 78 53  tstvfs filter xS
3cd0: 79 6e 63 0a 20 20 74 73 74 76 66 73 20 73 63 72  ync.  tstvfs scr
3ce0: 69 70 74 20 78 53 79 6e 63 43 61 6c 6c 62 61 63  ipt xSyncCallbac
3cf0: 6b 0a 20 20 70 72 6f 63 20 78 53 79 6e 63 43 61  k.  proc xSyncCa
3d00: 6c 6c 62 61 63 6b 20 7b 6d 65 74 68 6f 64 20 66  llback {method f
3d10: 69 6c 65 20 61 72 67 73 7d 20 7b 0a 20 20 20 20  ile args} {.    
3d20: 73 65 74 20 66 69 6c 65 20 5b 66 69 6c 65 20 74  set file [file t
3d30: 61 69 6c 20 24 66 69 6c 65 5d 0a 20 20 20 20 69  ail $file].    i
3d40: 66 20 7b 20 30 3d 3d 5b 73 74 72 69 6e 67 20 6d  f { 0==[string m
3d50: 61 74 63 68 20 2a 6a 6f 75 72 6e 61 6c 20 24 66  atch *journal $f
3d60: 69 6c 65 5d 20 7d 20 7b 20 66 61 75 6c 74 73 69  ile] } { faultsi
3d70: 6d 5f 73 61 76 65 20 7d 0a 20 20 7d 0a 20 20 66  m_save }.  }.  f
3d80: 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61  aultsim_delete_a
3d90: 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65 63  nd_reopen.  exec
3da0: 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41  sql {.    PRAGMA
3db0: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20   journal_mode = 
3dc0: 44 45 4c 45 54 45 3b 0a 20 20 20 20 43 52 45 41  DELETE;.    CREA
3dd0: 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62  TE TABLE t1(a, b
3de0: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
3df0: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20  TO t1 VALUES(1, 
3e00: 32 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  2);.    INSERT I
3e10: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 33 2c  NTO t1 VALUES(3,
3e20: 20 34 29 3b 0a 20 20 7d 0a 20 20 64 62 20 63 6c   4);.  }.  db cl
3e30: 6f 73 65 0a 20 20 74 73 74 76 66 73 20 64 65 6c  ose.  tstvfs del
3e40: 65 74 65 0a 7d 20 7b 7d 0a 0a 66 6f 72 65 61 63  ete.} {}..foreac
3e50: 68 20 7b 74 6e 20 6f 66 73 74 20 76 61 6c 75 65  h {tn ofst value
3e60: 20 72 65 73 75 6c 74 7d 20 7b 0a 20 20 20 20 20   result} {.     
3e70: 20 20 20 20 20 32 20 20 20 32 30 20 20 20 20 33       2   20    3
3e80: 31 20 20 20 20 20 20 20 7b 31 20 32 20 33 20 34  1       {1 2 3 4
3e90: 7d 0a 20 20 20 20 20 20 20 20 20 20 33 20 20 20  }.          3   
3ea0: 32 30 20 20 20 20 33 32 20 20 20 20 20 20 20 7b  20    32       {
3eb0: 31 20 32 20 33 20 34 7d 0a 20 20 20 20 20 20 20  1 2 3 4}.       
3ec0: 20 20 20 34 20 20 20 32 30 20 20 20 20 33 33 20     4   20    33 
3ed0: 20 20 20 20 20 20 7b 31 20 32 20 33 20 34 7d 0a        {1 2 3 4}.
3ee0: 20 20 20 20 20 20 20 20 20 20 35 20 20 20 32 30            5   20
3ef0: 20 20 20 20 36 35 35 33 36 20 20 20 20 7b 31 20      65536    {1 
3f00: 32 20 33 20 34 7d 0a 20 20 20 20 20 20 20 20 20  2 3 4}.         
3f10: 20 36 20 20 20 32 30 20 20 20 20 31 33 31 30 37   6   20    13107
3f20: 32 20 20 20 7b 31 20 32 20 33 20 34 7d 0a 0a 20  2   {1 2 3 4}.. 
3f30: 20 20 20 20 20 20 20 20 20 37 20 20 20 32 34 20           7   24 
3f40: 20 20 20 35 31 31 20 20 20 20 20 20 7b 31 20 32     511      {1 2
3f50: 20 33 20 34 7d 0a 20 20 20 20 20 20 20 20 20 20   3 4}.          
3f60: 38 20 20 20 32 34 20 20 20 20 35 31 33 20 20 20  8   24    513   
3f70: 20 20 20 7b 31 20 32 20 33 20 34 7d 0a 20 20 20     {1 2 3 4}.   
3f80: 20 20 20 20 20 20 20 39 20 20 20 32 34 20 20 20         9   24   
3f90: 20 36 35 35 33 36 20 20 20 20 7b 31 20 32 20 33   65536    {1 2 3
3fa0: 20 34 7d 0a 0a 20 20 20 20 20 20 20 20 20 31 30   4}..         10
3fb0: 20 20 20 33 32 20 20 20 20 36 35 35 33 36 20 20     32    65536  
3fc0: 20 20 7b 31 20 32 7d 0a 7d 20 7b 0a 20 20 64 6f    {1 2}.} {.  do
3fd0: 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e 33  _test pager1.4.3
3fe0: 2e 24 74 6e 20 7b 0a 20 20 20 20 66 61 75 6c 74  .$tn {.    fault
3ff0: 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f  sim_restore_and_
4000: 72 65 6f 70 65 6e 0a 20 20 20 20 68 65 78 69 6f  reopen.    hexio
4010: 5f 77 72 69 74 65 20 74 65 73 74 2e 64 62 2d 6a  _write test.db-j
4020: 6f 75 72 6e 61 6c 20 24 6f 66 73 74 20 5b 66 6f  ournal $ofst [fo
4030: 72 6d 61 74 20 25 2e 38 78 20 24 76 61 6c 75 65  rmat %.8x $value
4040: 5d 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20  ].    execsql { 
4050: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
4060: 20 7d 0a 20 20 7d 20 24 72 65 73 75 6c 74 0a 7d   }.  } $result.}
4070: 0a 64 62 20 63 6c 6f 73 65 0a 0a 23 20 53 65 74  .db close..# Set
4080: 20 75 70 20 61 20 56 46 53 20 74 68 61 74 20 73   up a VFS that s
4090: 6e 61 70 73 68 6f 74 73 20 74 68 65 20 66 69 6c  napshots the fil
40a0: 65 2d 73 79 73 74 65 6d 20 6a 75 73 74 20 62 65  e-system just be
40b0: 66 6f 72 65 20 61 20 6d 61 73 74 65 72 20 6a 6f  fore a master jo
40c0: 75 72 6e 61 6c 0a 23 20 66 69 6c 65 20 69 73 20  urnal.# file is 
40d0: 64 65 6c 65 74 65 64 20 74 6f 20 63 6f 6d 6d 69  deleted to commi
40e0: 74 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 74  t a multi-file t
40f0: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 53 70 65 63  ransaction. Spec
4100: 69 66 69 63 61 6c 6c 79 2c 20 74 68 65 0a 23 20  ifically, the.# 
4110: 66 69 6c 65 2d 73 79 73 74 65 6d 20 69 73 20 73  file-system is s
4120: 61 76 65 64 20 6a 75 73 74 20 62 65 66 6f 72 65  aved just before
4130: 20 74 68 65 20 78 44 65 6c 65 74 65 28 29 20 63   the xDelete() c
4140: 61 6c 6c 20 74 6f 20 72 65 6d 6f 76 65 20 74 68  all to remove th
4150: 65 20 0a 23 20 6d 61 73 74 65 72 20 6a 6f 75 72  e .# master jour
4160: 6e 61 6c 20 66 69 6c 65 20 66 72 6f 6d 20 74 68  nal file from th
4170: 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e 0a 23  e file-system..#
4180: 0a 74 65 73 74 76 66 73 20 74 76 20 2d 64 65 66  .testvfs tv -def
4190: 61 75 6c 74 20 31 0a 74 76 20 73 63 72 69 70 74  ault 1.tv script
41a0: 20 63 6f 70 79 5f 6f 6e 5f 6d 6a 5f 64 65 6c 65   copy_on_mj_dele
41b0: 74 65 0a 73 65 74 20 3a 3a 6d 6a 5f 66 69 6c 65  te.set ::mj_file
41c0: 6e 61 6d 65 5f 6c 65 6e 67 74 68 20 30 0a 70 72  name_length 0.pr
41d0: 6f 63 20 63 6f 70 79 5f 6f 6e 5f 6d 6a 5f 64 65  oc copy_on_mj_de
41e0: 6c 65 74 65 20 7b 6d 65 74 68 6f 64 20 66 69 6c  lete {method fil
41f0: 65 6e 61 6d 65 20 61 72 67 73 7d 20 7b 0a 20 20  ename args} {.  
4200: 69 66 20 7b 5b 73 74 72 69 6e 67 20 6d 61 74 63  if {[string matc
4210: 68 20 2a 6d 6a 2a 20 5b 66 69 6c 65 20 74 61 69  h *mj* [file tai
4220: 6c 20 24 66 69 6c 65 6e 61 6d 65 5d 5d 7d 20 7b  l $filename]]} {
4230: 20 0a 20 20 20 20 73 65 74 20 3a 3a 6d 6a 5f 66   .    set ::mj_f
4240: 69 6c 65 6e 61 6d 65 5f 6c 65 6e 67 74 68 20 5b  ilename_length [
4250: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 66  string length $f
4260: 69 6c 65 6e 61 6d 65 5d 0a 20 20 20 20 66 61 75  ilename].    fau
4270: 6c 74 73 69 6d 5f 73 61 76 65 20 0a 20 20 7d 0a  ltsim_save .  }.
4280: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
4290: 4f 4b 0a 7d 0a 0a 73 65 74 20 70 77 64 20 5b 70  OK.}..set pwd [p
42a0: 77 64 5d 0a 66 6f 72 65 61 63 68 20 7b 74 6e 31  wd].foreach {tn1
42b0: 20 74 63 6c 7d 20 7b 0a 20 20 31 20 7b 20 73 65   tcl} {.  1 { se
42c0: 74 20 70 72 65 66 69 78 20 22 74 65 73 74 2e 64  t prefix "test.d
42d0: 62 22 20 7d 0a 20 20 32 20 7b 20 0a 20 20 20 20  b" }.  2 { .    
42e0: 23 20 54 68 69 73 20 74 65 73 74 20 64 65 70 65  # This test depe
42f0: 6e 64 73 20 6f 6e 20 74 68 65 20 75 6e 64 65 72  nds on the under
4300: 6c 79 69 6e 67 20 56 46 53 20 62 65 69 6e 67 20  lying VFS being 
4310: 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 70 61 74  able to open pat
4320: 68 73 0a 20 20 20 20 23 20 35 31 32 20 62 79 74  hs.    # 512 byt
4330: 65 73 20 69 6e 20 6c 65 6e 67 74 68 2e 20 54 68  es in length. Th
4340: 65 20 69 64 65 61 20 69 73 20 74 6f 20 63 72 65  e idea is to cre
4350: 61 74 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  ate a hot-journa
4360: 6c 20 66 69 6c 65 20 74 68 61 74 0a 20 20 20 20  l file that.    
4370: 23 20 63 6f 6e 74 61 69 6e 73 20 61 20 6d 61 73  # contains a mas
4380: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  ter-journal poin
4390: 74 65 72 20 73 6f 20 6c 61 72 67 65 20 74 68 61  ter so large tha
43a0: 74 20 69 74 20 63 6f 75 6c 64 20 63 6f 6e 74 61  t it could conta
43b0: 69 6e 0a 20 20 20 20 23 20 61 20 76 61 6c 69 64  in.    # a valid
43c0: 20 70 61 67 65 20 72 65 63 6f 72 64 20 28 69 66   page record (if
43d0: 20 74 68 65 20 66 69 6c 65 20 70 61 67 65 2d 73   the file page-s
43e0: 69 7a 65 20 69 73 20 35 31 32 20 62 79 74 65 73  ize is 512 bytes
43f0: 29 2e 20 53 6f 20 61 73 20 74 6f 0a 20 20 20 20  ). So as to.    
4400: 23 20 6d 61 6b 65 20 73 75 72 65 20 53 51 4c 69  # make sure SQLi
4410: 74 65 20 64 6f 65 73 6e 27 74 20 67 65 74 20 63  te doesn't get c
4420: 6f 6e 66 75 73 65 64 20 62 79 20 74 68 69 73 2e  onfused by this.
4430: 0a 20 20 20 20 23 0a 20 20 20 20 73 65 74 20 6e  .    #.    set n
4440: 50 61 64 64 69 6e 67 20 5b 65 78 70 72 20 35 31  Padding [expr 51
4450: 31 20 2d 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61  1 - $::mj_filena
4460: 6d 65 5f 6c 65 6e 67 74 68 5d 0a 0a 20 20 20 20  me_length]..    
4470: 23 20 57 65 20 63 61 6e 6e 6f 74 20 6a 75 73 74  # We cannot just
4480: 20 63 72 65 61 74 65 20 61 20 72 65 61 6c 6c 79   create a really
4490: 20 6c 6f 6e 67 20 64 61 74 61 62 61 73 65 20 66   long database f
44a0: 69 6c 65 20 6e 61 6d 65 20 74 6f 20 6f 70 65 6e  ile name to open
44b0: 2c 20 61 73 0a 20 20 20 20 23 20 4c 69 6e 75 78  , as.    # Linux
44c0: 20 6c 69 6d 69 74 73 20 61 20 73 69 6e 67 6c 65   limits a single
44d0: 20 63 6f 6d 70 6f 6e 65 6e 74 20 6f 66 20 61 20   component of a 
44e0: 70 61 74 68 20 74 6f 20 32 35 35 20 62 79 74 65  path to 255 byte
44f0: 73 20 62 79 20 64 65 66 61 75 6c 74 0a 20 20 20  s by default.   
4500: 20 23 20 28 61 6e 64 20 70 72 65 73 75 6d 61 62   # (and presumab
4510: 6c 79 20 6f 74 68 65 72 20 73 79 73 74 65 6d 73  ly other systems
4520: 20 68 61 76 65 20 6c 69 6d 69 74 73 20 74 6f 6f   have limits too
4530: 29 2e 20 53 6f 20 63 72 65 61 74 65 20 61 20 64  ). So create a d
4540: 69 72 65 63 74 6f 72 79 0a 20 20 20 20 23 20 68  irectory.    # h
4550: 69 65 72 61 72 63 68 79 20 74 6f 20 77 6f 72 6b  ierarchy to work
4560: 20 69 6e 2e 0a 20 20 20 20 23 0a 20 20 20 20 73   in..    #.    s
4570: 65 74 20 64 69 72 6e 61 6d 65 20 22 64 31 32 33  et dirname "d123
4580: 34 35 36 37 38 39 30 31 32 33 34 35 36 37 38 39  4567890123456789
4590: 30 31 32 33 34 35 36 37 38 39 30 2f 22 0a 20 20  01234567890/".  
45a0: 20 20 73 65 74 20 6e 44 69 72 20 5b 65 78 70 72    set nDir [expr
45b0: 20 24 6e 50 61 64 64 69 6e 67 20 2f 20 33 32 5d   $nPadding / 32]
45c0: 0a 20 20 20 20 69 66 20 7b 20 24 6e 44 69 72 20  .    if { $nDir 
45d0: 7d 20 7b 0a 20 20 20 20 20 20 73 65 74 20 70 20  } {.      set p 
45e0: 5b 73 74 72 69 6e 67 20 72 65 70 65 61 74 20 24  [string repeat $
45f0: 64 69 72 6e 61 6d 65 20 24 6e 44 69 72 5d 0a 20  dirname $nDir]. 
4600: 20 20 20 20 20 66 69 6c 65 20 6d 6b 64 69 72 20       file mkdir 
4610: 24 70 0a 20 20 20 20 20 20 63 64 20 24 70 0a 20  $p.      cd $p. 
4620: 20 20 20 7d 0a 0a 20 20 20 20 73 65 74 20 70 61     }..    set pa
4630: 64 64 69 6e 67 20 5b 73 74 72 69 6e 67 20 72 65  dding [string re
4640: 70 65 61 74 20 78 20 5b 65 78 70 72 20 24 6e 50  peat x [expr $nP
4650: 61 64 64 69 6e 67 20 25 33 32 5d 5d 0a 20 20 20  adding %32]].   
4660: 20 73 65 74 20 70 72 65 66 69 78 20 22 74 65 73   set prefix "tes
4670: 74 2e 64 62 24 7b 70 61 64 64 69 6e 67 7d 22 0a  t.db${padding}".
4680: 20 20 7d 0a 7d 20 7b 0a 20 20 65 76 61 6c 20 24    }.} {.  eval $
4690: 74 63 6c 0a 20 20 66 6f 72 65 61 63 68 20 7b 74  tcl.  foreach {t
46a0: 6e 32 20 73 71 6c 7d 20 7b 0a 20 20 20 20 6f 20  n2 sql} {.    o 
46b0: 7b 20 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20  { .      PRAGMA 
46c0: 6d 61 69 6e 2e 73 79 6e 63 68 72 6f 6e 6f 75 73  main.synchronous
46d0: 3d 4f 46 46 3b 0a 20 20 20 20 20 20 50 52 41 47  =OFF;.      PRAG
46e0: 4d 41 20 61 75 78 2e 73 79 6e 63 68 72 6f 6e 6f  MA aux.synchrono
46f0: 75 73 3d 4f 46 46 3b 0a 20 20 20 20 7d 0a 20 20  us=OFF;.    }.  
4700: 20 20 6f 35 31 32 20 7b 20 0a 20 20 20 20 20 20    o512 { .      
4710: 50 52 41 47 4d 41 20 6d 61 69 6e 2e 73 79 6e 63  PRAGMA main.sync
4720: 68 72 6f 6e 6f 75 73 3d 4f 46 46 3b 0a 20 20 20  hronous=OFF;.   
4730: 20 20 20 50 52 41 47 4d 41 20 61 75 78 2e 73 79     PRAGMA aux.sy
4740: 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46 46 3b 0a 20  nchronous=OFF;. 
4750: 20 20 20 20 20 50 52 41 47 4d 41 20 6d 61 69 6e       PRAGMA main
4760: 2e 70 61 67 65 5f 73 69 7a 65 20 3d 20 35 31 32  .page_size = 512
4770: 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 61  ;.      PRAGMA a
4780: 75 78 2e 70 61 67 65 5f 73 69 7a 65 20 3d 20 35  ux.page_size = 5
4790: 31 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 20  12;.    }.    n 
47a0: 7b 20 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20  { .      PRAGMA 
47b0: 6d 61 69 6e 2e 73 79 6e 63 68 72 6f 6e 6f 75 73  main.synchronous
47c0: 3d 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 20 20 50  =NORMAL;.      P
47d0: 52 41 47 4d 41 20 61 75 78 2e 73 79 6e 63 68 72  RAGMA aux.synchr
47e0: 6f 6e 6f 75 73 3d 4e 4f 52 4d 41 4c 3b 0a 20 20  onous=NORMAL;.  
47f0: 20 20 7d 0a 20 20 20 20 66 20 7b 20 0a 20 20 20    }.    f { .   
4800: 20 20 20 50 52 41 47 4d 41 20 6d 61 69 6e 2e 73     PRAGMA main.s
4810: 79 6e 63 68 72 6f 6e 6f 75 73 3d 46 55 4c 4c 3b  ynchronous=FULL;
4820: 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 61 75  .      PRAGMA au
4830: 78 2e 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 46 55  x.synchronous=FU
4840: 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 0a  LL;.    }.  } {.
4850: 0a 20 20 20 20 73 65 74 20 74 6e 20 22 24 7b 74  .    set tn "${t
4860: 6e 31 7d 2e 24 7b 74 6e 32 7d 22 0a 20 20 0a 20  n1}.${tn2}".  . 
4870: 20 20 20 23 20 53 65 74 20 75 70 20 61 20 63 6f     # Set up a co
4880: 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 68 61 76 65  nnection to have
4890: 20 74 77 6f 20 64 61 74 61 62 61 73 65 73 2c 20   two databases, 
48a0: 74 65 73 74 2e 64 62 20 28 6d 61 69 6e 29 20 61  test.db (main) a
48b0: 6e 64 20 0a 20 20 20 20 23 20 74 65 73 74 2e 64  nd .    # test.d
48c0: 62 32 20 28 61 75 78 29 2e 20 54 68 65 6e 20 72  b2 (aux). Then r
48d0: 75 6e 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20  un a multi-file 
48e0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74  transaction on t
48f0: 68 65 6d 2e 20 54 68 65 0a 20 20 20 20 23 20 56  hem. The.    # V
4900: 46 53 20 77 69 6c 6c 20 73 6e 61 70 73 68 6f 74  FS will snapshot
4910: 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
4920: 20 6a 75 73 74 20 62 65 66 6f 72 65 20 74 68 65   just before the
4930: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 0a   master-journal.
4940: 20 20 20 20 23 20 66 69 6c 65 20 69 73 20 64 65      # file is de
4950: 6c 65 74 65 64 20 74 6f 20 63 6f 6d 6d 69 74 20  leted to commit 
4960: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
4970: 0a 20 20 20 20 23 0a 20 20 20 20 74 76 20 66 69  .    #.    tv fi
4980: 6c 74 65 72 20 78 44 65 6c 65 74 65 0a 20 20 20  lter xDelete.   
4990: 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
49a0: 34 2e 34 2e 24 74 6e 2e 31 20 7b 0a 20 20 20 20  4.4.$tn.1 {.    
49b0: 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74    faultsim_delet
49c0: 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 20 24 70 72  e_and_reopen $pr
49d0: 65 66 69 78 0a 20 20 20 20 20 20 65 78 65 63 73  efix.      execs
49e0: 71 6c 20 22 0a 20 20 20 20 20 20 20 20 41 54 54  ql ".        ATT
49f0: 41 43 48 20 27 24 7b 70 72 65 66 69 78 7d 32 27  ACH '${prefix}2'
4a00: 20 41 53 20 61 75 78 3b 0a 20 20 20 20 20 20 20   AS aux;.       
4a10: 20 24 73 71 6c 0a 20 20 20 20 20 20 20 20 43 52   $sql.        CR
4a20: 45 41 54 45 20 54 41 42 4c 45 20 61 28 78 29 3b  EATE TABLE a(x);
4a30: 0a 20 20 20 20 20 20 20 20 43 52 45 41 54 45 20  .        CREATE 
4a40: 54 41 42 4c 45 20 61 75 78 2e 62 28 78 29 3b 0a  TABLE aux.b(x);.
4a50: 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49          INSERT I
4a60: 4e 54 4f 20 61 20 56 41 4c 55 45 53 28 27 64 6f  NTO a VALUES('do
4a70: 75 62 6c 65 2d 79 6f 75 27 29 3b 0a 20 20 20 20  uble-you');.    
4a80: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
4a90: 61 20 56 41 4c 55 45 53 28 27 77 68 79 27 29 3b  a VALUES('why');
4aa0: 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20  .        INSERT 
4ab0: 49 4e 54 4f 20 61 20 56 41 4c 55 45 53 28 27 7a  INTO a VALUES('z
4ac0: 65 64 27 29 3b 0a 20 20 20 20 20 20 20 20 49 4e  ed');.        IN
4ad0: 53 45 52 54 20 49 4e 54 4f 20 62 20 56 41 4c 55  SERT INTO b VALU
4ae0: 45 53 28 27 77 6f 6e 27 29 3b 0a 20 20 20 20 20  ES('won');.     
4af0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 62     INSERT INTO b
4b00: 20 56 41 4c 55 45 53 28 27 74 6f 6f 27 29 3b 0a   VALUES('too');.
4b10: 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49          INSERT I
4b20: 4e 54 4f 20 62 20 56 41 4c 55 45 53 28 27 66 72  NTO b VALUES('fr
4b30: 65 65 27 29 3b 0a 20 20 20 20 20 20 22 0a 20 20  ee');.      ".  
4b40: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20      execsql {.  
4b50: 20 20 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20        BEGIN;.   
4b60: 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e         INSERT IN
4b70: 54 4f 20 61 20 53 45 4c 45 43 54 20 2a 20 46 52  TO a SELECT * FR
4b80: 4f 4d 20 62 20 57 48 45 52 45 20 72 6f 77 69 64  OM b WHERE rowid
4b90: 3c 3d 33 3b 0a 20 20 20 20 20 20 20 20 20 20 49  <=3;.          I
4ba0: 4e 53 45 52 54 20 49 4e 54 4f 20 62 20 53 45 4c  NSERT INTO b SEL
4bb0: 45 43 54 20 2a 20 46 52 4f 4d 20 61 20 57 48 45  ECT * FROM a WHE
4bc0: 52 45 20 72 6f 77 69 64 3c 3d 33 3b 0a 20 20 20  RE rowid<=3;.   
4bd0: 20 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 20       COMMIT;.   
4be0: 20 20 20 7d 0a 20 20 20 20 7d 20 7b 7d 0a 20 20     }.    } {}.  
4bf0: 20 20 74 76 20 66 69 6c 74 65 72 20 7b 7d 0a 20    tv filter {}. 
4c00: 20 20 20 0a 20 20 20 20 23 20 43 68 65 63 6b 20     .    # Check 
4c10: 74 68 61 74 20 74 68 65 20 74 72 61 6e 73 61 63  that the transac
4c20: 74 69 6f 6e 20 77 61 73 20 63 6f 6d 6d 69 74 74  tion was committ
4c30: 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e  ed successfully.
4c40: 0a 20 20 20 20 23 0a 20 20 20 20 64 6f 5f 65 78  .    #.    do_ex
4c50: 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72  ecsql_test pager
4c60: 31 2d 34 2e 34 2e 24 74 6e 2e 32 20 7b 0a 20 20  1-4.4.$tn.2 {.  
4c70: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
4c80: 4d 20 61 0a 20 20 20 20 7d 20 7b 64 6f 75 62 6c  M a.    } {doubl
4c90: 65 2d 79 6f 75 20 77 68 79 20 7a 65 64 20 77 6f  e-you why zed wo
4ca0: 6e 20 74 6f 6f 20 66 72 65 65 7d 0a 20 20 20 20  n too free}.    
4cb0: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
4cc0: 70 61 67 65 72 31 2d 34 2e 34 2e 24 74 6e 2e 33  pager1-4.4.$tn.3
4cd0: 20 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20   {.      SELECT 
4ce0: 2a 20 46 52 4f 4d 20 62 0a 20 20 20 20 7d 20 7b  * FROM b.    } {
4cf0: 77 6f 6e 20 74 6f 6f 20 66 72 65 65 20 64 6f 75  won too free dou
4d00: 62 6c 65 2d 79 6f 75 20 77 68 79 20 7a 65 64 7d  ble-you why zed}
4d10: 0a 20 20 20 20 0a 20 20 20 20 23 20 52 65 73 74  .    .    # Rest
4d20: 6f 72 65 20 74 68 65 20 66 69 6c 65 2d 73 79 73  ore the file-sys
4d30: 74 65 6d 20 61 6e 64 20 72 65 6f 70 65 6e 20 74  tem and reopen t
4d40: 68 65 20 64 61 74 61 62 61 73 65 73 2e 20 43 68  he databases. Ch
4d50: 65 63 6b 20 74 68 61 74 20 69 74 20 6e 6f 77 0a  eck that it now.
4d60: 20 20 20 20 23 20 61 70 70 65 61 72 73 20 74 68      # appears th
4d70: 61 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  at the transacti
4d80: 6f 6e 20 77 61 73 20 6e 6f 74 20 63 6f 6d 6d 69  on was not commi
4d90: 74 74 65 64 20 28 62 65 63 61 75 73 65 20 74 68  tted (because th
4da0: 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 0a 20 20  e file-system.  
4db0: 20 20 23 20 77 61 73 20 72 65 73 74 6f 72 65 64    # was restored
4dc0: 20 74 6f 20 74 68 65 20 73 74 61 74 65 20 77 68   to the state wh
4dd0: 65 72 65 20 69 74 20 68 61 64 20 6e 6f 74 20 62  ere it had not b
4de0: 65 65 6e 29 2e 0a 20 20 20 20 23 0a 20 20 20 20  een)..    #.    
4df0: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 34  do_test pager1-4
4e00: 2e 34 2e 24 74 6e 2e 34 20 7b 0a 20 20 20 20 20  .4.$tn.4 {.     
4e10: 20 66 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72   faultsim_restor
4e20: 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 20 24 70 72  e_and_reopen $pr
4e30: 65 66 69 78 0a 20 20 20 20 20 20 65 78 65 63 73  efix.      execs
4e40: 71 6c 20 22 41 54 54 41 43 48 20 27 24 7b 70 72  ql "ATTACH '${pr
4e50: 65 66 69 78 7d 32 27 20 41 53 20 61 75 78 22 0a  efix}2' AS aux".
4e60: 20 20 20 20 7d 20 7b 7d 0a 20 20 20 20 64 6f 5f      } {}.    do_
4e70: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67  execsql_test pag
4e80: 65 72 31 2d 34 2e 34 2e 24 74 6e 2e 35 20 7b 53  er1-4.4.$tn.5 {S
4e90: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 61 7d 20  ELECT * FROM a} 
4ea0: 7b 64 6f 75 62 6c 65 2d 79 6f 75 20 77 68 79 20  {double-you why 
4eb0: 7a 65 64 7d 0a 20 20 20 20 64 6f 5f 65 78 65 63  zed}.    do_exec
4ec0: 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d  sql_test pager1-
4ed0: 34 2e 34 2e 24 74 6e 2e 36 20 7b 53 45 4c 45 43  4.4.$tn.6 {SELEC
4ee0: 54 20 2a 20 46 52 4f 4d 20 62 7d 20 7b 77 6f 6e  T * FROM b} {won
4ef0: 20 74 6f 6f 20 66 72 65 65 7d 0a 20 20 20 20 0a   too free}.    .
4f00: 20 20 20 20 23 20 52 65 73 74 6f 72 65 20 74 68      # Restore th
4f10: 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 61 67  e file-system ag
4f20: 61 69 6e 2e 20 54 68 69 73 20 74 69 6d 65 2c 20  ain. This time, 
4f30: 62 65 66 6f 72 65 20 72 65 6f 70 65 6e 69 6e 67  before reopening
4f40: 20 74 68 65 20 64 61 74 61 62 61 73 65 73 2c 0a   the databases,.
4f50: 20 20 20 20 23 20 64 65 6c 65 74 65 20 74 68 65      # delete the
4f60: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
4f70: 66 69 6c 65 20 66 72 6f 6d 20 74 68 65 20 66 69  file from the fi
4f80: 6c 65 2d 73 79 73 74 65 6d 2e 20 49 74 20 6e 6f  le-system. It no
4f90: 77 20 61 70 70 65 61 72 73 20 74 68 61 74 0a 20  w appears that. 
4fa0: 20 20 20 23 20 74 68 65 20 74 72 61 6e 73 61 63     # the transac
4fb0: 74 69 6f 6e 20 77 61 73 20 63 6f 6d 6d 69 74 74  tion was committ
4fc0: 65 64 20 28 6e 6f 20 6d 61 73 74 65 72 2d 6a 6f  ed (no master-jo
4fd0: 75 72 6e 61 6c 20 66 69 6c 65 20 3d 3d 20 6e 6f  urnal file == no
4fe0: 20 72 6f 6c 6c 62 61 63 6b 29 2e 0a 20 20 20 20   rollback)..    
4ff0: 23 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 70 61  #.    do_test pa
5000: 67 65 72 31 2d 34 2e 34 2e 24 74 6e 2e 37 20 7b  ger1-4.4.$tn.7 {
5010: 0a 20 20 20 20 20 20 66 61 75 6c 74 73 69 6d 5f  .      faultsim_
5020: 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70  restore_and_reop
5030: 65 6e 20 24 70 72 65 66 69 78 0a 20 20 20 20 20  en $prefix.     
5040: 20 66 6f 72 65 61 63 68 20 66 20 5b 67 6c 6f 62   foreach f [glob
5050: 20 24 7b 70 72 65 66 69 78 7d 2d 6d 6a 2a 5d 20   ${prefix}-mj*] 
5060: 7b 20 66 69 6c 65 20 64 65 6c 65 74 65 20 2d 66  { file delete -f
5070: 6f 72 63 65 20 24 66 20 7d 0a 20 20 20 20 20 20  orce $f }.      
5080: 65 78 65 63 73 71 6c 20 22 41 54 54 41 43 48 20  execsql "ATTACH 
5090: 27 24 7b 70 72 65 66 69 78 7d 32 27 20 41 53 20  '${prefix}2' AS 
50a0: 61 75 78 22 0a 20 20 20 20 7d 20 7b 7d 0a 20 20  aux".    } {}.  
50b0: 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73    do_execsql_tes
50c0: 74 20 70 61 67 65 72 31 2d 34 2e 34 2e 24 74 6e  t pager1-4.4.$tn
50d0: 2e 38 20 7b 0a 20 20 20 20 20 20 53 45 4c 45 43  .8 {.      SELEC
50e0: 54 20 2a 20 46 52 4f 4d 20 61 0a 20 20 20 20 7d  T * FROM a.    }
50f0: 20 7b 64 6f 75 62 6c 65 2d 79 6f 75 20 77 68 79   {double-you why
5100: 20 7a 65 64 20 77 6f 6e 20 74 6f 6f 20 66 72 65   zed won too fre
5110: 65 7d 0a 20 20 20 20 64 6f 5f 65 78 65 63 73 71  e}.    do_execsq
5120: 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 34 2e  l_test pager1-4.
5130: 34 2e 24 74 6e 2e 39 20 7b 0a 20 20 20 20 20 20  4.$tn.9 {.      
5140: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 62 0a  SELECT * FROM b.
5150: 20 20 20 20 7d 20 7b 77 6f 6e 20 74 6f 6f 20 66      } {won too f
5160: 72 65 65 20 64 6f 75 62 6c 65 2d 79 6f 75 20 77  ree double-you w
5170: 68 79 20 7a 65 64 7d 0a 20 20 7d 0a 0a 20 20 63  hy zed}.  }..  c
5180: 64 20 24 70 77 64 0a 7d 0a 64 62 20 63 6c 6f 73  d $pwd.}.db clos
5190: 65 0a 74 76 20 64 65 6c 65 74 65 0a 66 69 6c 65  e.tv delete.file
51a0: 20 64 65 6c 65 74 65 20 2d 66 6f 72 63 65 20 24   delete -force $
51b0: 64 69 72 6e 61 6d 65 0a 0a 0a 23 20 53 65 74 20  dirname...# Set 
51c0: 75 70 20 61 20 56 46 53 20 74 6f 20 6d 61 6b 65  up a VFS to make
51d0: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 66   a copy of the f
51e0: 69 6c 65 2d 73 79 73 74 65 6d 20 6a 75 73 74 20  ile-system just 
51f0: 62 65 66 6f 72 65 20 64 65 6c 65 74 69 6e 67 20  before deleting 
5200: 61 0a 23 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  a.# journal file
5210: 20 74 6f 20 63 6f 6d 6d 69 74 20 61 20 74 72 61   to commit a tra
5220: 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 74 72  nsaction. The tr
5230: 61 6e 73 61 63 74 69 6f 6e 20 6d 6f 64 69 66 69  ansaction modifi
5240: 65 73 20 65 78 61 63 74 6c 79 0a 23 20 74 77 6f  es exactly.# two
5250: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 73 20   database pages 
5260: 28 61 6e 64 20 70 61 67 65 20 31 20 2d 20 74 68  (and page 1 - th
5270: 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72  e change counter
5280: 29 2e 0a 23 0a 74 65 73 74 76 66 73 20 74 76 20  )..#.testvfs tv 
5290: 2d 64 65 66 61 75 6c 74 20 31 0a 74 76 20 73 65  -default 1.tv se
52a0: 63 74 6f 72 73 69 7a 65 20 35 31 32 0a 74 76 20  ctorsize 512.tv 
52b0: 73 63 72 69 70 74 20 63 6f 70 79 5f 6f 6e 5f 6a  script copy_on_j
52c0: 6f 75 72 6e 61 6c 5f 64 65 6c 65 74 65 0a 74 76  ournal_delete.tv
52d0: 20 66 69 6c 74 65 72 20 78 44 65 6c 65 74 65 0a   filter xDelete.
52e0: 70 72 6f 63 20 63 6f 70 79 5f 6f 6e 5f 6a 6f 75  proc copy_on_jou
52f0: 72 6e 61 6c 5f 64 65 6c 65 74 65 20 7b 6d 65 74  rnal_delete {met
5300: 68 6f 64 20 66 69 6c 65 6e 61 6d 65 20 61 72 67  hod filename arg
5310: 73 7d 20 7b 0a 20 20 69 66 20 7b 5b 73 74 72 69  s} {.  if {[stri
5320: 6e 67 20 6d 61 74 63 68 20 2a 6a 6f 75 72 6e 61  ng match *journa
5330: 6c 20 24 66 69 6c 65 6e 61 6d 65 5d 7d 20 66 61  l $filename]} fa
5340: 75 6c 74 73 69 6d 5f 73 61 76 65 20 0a 20 20 72  ultsim_save .  r
5350: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a  eturn SQLITE_OK.
5360: 7d 0a 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74  }.faultsim_delet
5370: 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 64 6f 5f  e_and_reopen.do_
5380: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67  execsql_test pag
5390: 65 72 31 2e 34 2e 35 2e 31 20 7b 0a 20 20 50 52  er1.4.5.1 {.  PR
53a0: 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d  AGMA page_size =
53b0: 20 31 30 32 34 3b 0a 20 20 43 52 45 41 54 45 20   1024;.  CREATE 
53c0: 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a  TABLE t1(a, b);.
53d0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
53e0: 32 28 61 2c 20 62 29 3b 0a 20 20 49 4e 53 45 52  2(a, b);.  INSER
53f0: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
5400: 28 27 49 27 2c 20 27 49 49 27 29 3b 0a 20 20 49  ('I', 'II');.  I
5410: 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41  NSERT INTO t2 VA
5420: 4c 55 45 53 28 27 49 49 49 27 2c 20 27 49 56 27  LUES('III', 'IV'
5430: 29 3b 0a 20 20 42 45 47 49 4e 3b 0a 20 20 20 20  );.  BEGIN;.    
5440: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
5450: 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20 20 20  ALUES(1, 2);.   
5460: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20   INSERT INTO t2 
5470: 56 41 4c 55 45 53 28 33 2c 20 34 29 3b 0a 20 20  VALUES(3, 4);.  
5480: 43 4f 4d 4d 49 54 3b 0a 7d 20 7b 7d 0a 74 76 20  COMMIT;.} {}.tv 
5490: 66 69 6c 74 65 72 20 7b 7d 0a 0a 23 20 43 68 65  filter {}..# Che
54a0: 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ck the transacti
54b0: 6f 6e 20 77 61 73 20 63 6f 6d 6d 69 74 74 65 64  on was committed
54c0: 3a 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  :.#.do_execsql_t
54d0: 65 73 74 20 70 61 67 65 72 31 2e 34 2e 35 2e 32  est pager1.4.5.2
54e0: 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52   {.  SELECT * FR
54f0: 4f 4d 20 74 31 3b 0a 20 20 53 45 4c 45 43 54 20  OM t1;.  SELECT 
5500: 2a 20 46 52 4f 4d 20 74 32 3b 0a 7d 20 7b 49 20  * FROM t2;.} {I 
5510: 49 49 20 31 20 32 20 49 49 49 20 49 56 20 33 20  II 1 2 III IV 3 
5520: 34 7d 0a 0a 23 20 4e 6f 77 20 74 72 79 20 66 6f  4}..# Now try fo
5530: 75 72 20 74 65 73 74 73 3a 0a 23 0a 23 20 20 70  ur tests:.#.#  p
5540: 61 67 65 72 31 2d 34 2e 35 2e 33 3a 20 52 65 73  ager1-4.5.3: Res
5550: 74 6f 72 65 20 74 68 65 20 66 69 6c 65 2d 73 79  tore the file-sy
5560: 73 74 65 6d 2e 20 43 68 65 63 6b 20 74 68 61 74  stem. Check that
5570: 20 74 68 65 20 77 68 6f 6c 65 20 74 72 61 6e 73   the whole trans
5580: 61 63 74 69 6f 6e 20 0a 23 20 20 20 20 20 20 20  action .#       
5590: 20 20 20 20 20 20 20 20 20 69 73 20 72 6f 6c 6c           is roll
55a0: 65 64 20 62 61 63 6b 2e 0a 23 0a 23 20 20 70 61  ed back..#.#  pa
55b0: 67 65 72 31 2d 34 2e 35 2e 34 3a 20 52 65 73 74  ger1-4.5.4: Rest
55c0: 6f 72 65 20 74 68 65 20 66 69 6c 65 2d 73 79 73  ore the file-sys
55d0: 74 65 6d 2e 20 43 6f 72 72 75 70 74 20 74 68 65  tem. Corrupt the
55e0: 20 66 69 72 73 74 20 72 65 63 6f 72 64 20 69 6e   first record in
55f0: 20 74 68 65 0a 23 20 20 20 20 20 20 20 20 20 20   the.#          
5600: 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 2e 20 43        journal. C
5610: 68 65 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63  heck the transac
5620: 74 69 6f 6e 20 69 73 20 6e 6f 74 20 72 6f 6c 6c  tion is not roll
5630: 65 64 20 62 61 63 6b 2e 0a 23 0a 23 20 20 70 61  ed back..#.#  pa
5640: 67 65 72 31 2d 34 2e 35 2e 35 3a 20 52 65 73 74  ger1-4.5.5: Rest
5650: 6f 72 65 20 74 68 65 20 66 69 6c 65 2d 73 79 73  ore the file-sys
5660: 74 65 6d 2e 20 43 6f 72 72 75 70 74 20 74 68 65  tem. Corrupt the
5670: 20 73 65 63 6f 6e 64 20 72 65 63 6f 72 64 20 69   second record i
5680: 6e 20 74 68 65 0a 23 20 20 20 20 20 20 20 20 20  n the.#         
5690: 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 2e 20         journal. 
56a0: 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 66  Check that the f
56b0: 69 72 73 74 20 72 65 63 6f 72 64 20 69 6e 20 74  irst record in t
56c0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  he transaction i
56d0: 73 20 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  s .#            
56e0: 20 20 20 20 70 6c 61 79 65 64 20 62 61 63 6b 2c      played back,
56f0: 20 62 75 74 20 6e 6f 74 20 74 68 65 20 73 65 63   but not the sec
5700: 6f 6e 64 2e 0a 23 0a 23 20 20 70 61 67 65 72 31  ond..#.#  pager1
5710: 2d 34 2e 35 2e 36 3a 20 52 65 73 74 6f 72 65 20  -4.5.6: Restore 
5720: 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e  the file-system.
5730: 20 54 72 79 20 74 6f 20 6f 70 65 6e 20 74 68 65   Try to open the
5740: 20 64 61 74 61 62 61 73 65 20 77 69 74 68 20 61   database with a
5750: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
5760: 20 20 72 65 61 64 6f 6e 6c 79 20 63 6f 6e 6e 65    readonly conne
5770: 63 74 69 6f 6e 2e 20 54 68 69 73 20 73 68 6f 75  ction. This shou
5780: 6c 64 20 66 61 69 6c 2c 20 61 73 20 61 20 72 65  ld fail, as a re
5790: 61 64 2d 6f 6e 6c 79 0a 23 20 20 20 20 20 20 20  ad-only.#       
57a0: 20 20 20 20 20 20 20 20 20 63 6f 6e 6e 65 63 74           connect
57b0: 69 6f 6e 20 63 61 6e 6e 6f 74 20 72 6f 6c 6c 20  ion cannot roll 
57c0: 62 61 63 6b 20 74 68 65 20 64 61 74 61 62 61 73  back the databas
57d0: 65 20 66 69 6c 65 2e 0a 23 0a 66 61 75 6c 74 73  e file..#.faults
57e0: 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72  im_restore_and_r
57f0: 65 6f 70 65 6e 0a 64 6f 5f 65 78 65 63 73 71 6c  eopen.do_execsql
5800: 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e 35  _test pager1.4.5
5810: 2e 33 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20  .3 {.  SELECT * 
5820: 46 52 4f 4d 20 74 31 3b 0a 20 20 53 45 4c 45 43  FROM t1;.  SELEC
5830: 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 7d 20 7b  T * FROM t2;.} {
5840: 49 20 49 49 20 49 49 49 20 49 56 7d 0a 66 61 75  I II III IV}.fau
5850: 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e  ltsim_restore_an
5860: 64 5f 72 65 6f 70 65 6e 0a 68 65 78 69 6f 5f 77  d_reopen.hexio_w
5870: 72 69 74 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75  rite test.db-jou
5880: 72 6e 61 6c 20 5b 65 78 70 72 20 35 31 32 2b 34  rnal [expr 512+4
5890: 2b 31 30 32 34 20 2d 20 32 30 32 5d 20 30 31 32  +1024 - 202] 012
58a0: 33 34 35 36 37 38 39 41 42 43 44 45 46 0a 64 6f  3456789ABCDEF.do
58b0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61  _execsql_test pa
58c0: 67 65 72 31 2e 34 2e 35 2e 34 20 7b 0a 20 20 53  ger1.4.5.4 {.  S
58d0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b  ELECT * FROM t1;
58e0: 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  .  SELECT * FROM
58f0: 20 74 32 3b 0a 7d 20 7b 49 20 49 49 20 31 20 32   t2;.} {I II 1 2
5900: 20 49 49 49 20 49 56 20 33 20 34 7d 0a 66 61 75   III IV 3 4}.fau
5910: 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e  ltsim_restore_an
5920: 64 5f 72 65 6f 70 65 6e 0a 68 65 78 69 6f 5f 77  d_reopen.hexio_w
5930: 72 69 74 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75  rite test.db-jou
5940: 72 6e 61 6c 20 5b 65 78 70 72 20 35 31 32 2b 34  rnal [expr 512+4
5950: 2b 31 30 32 34 2b 34 2b 34 2b 31 30 32 34 20 2d  +1024+4+4+1024 -
5960: 20 32 30 32 5d 20 30 31 32 33 34 35 36 37 38 39   202] 0123456789
5970: 41 42 43 44 45 46 0a 64 6f 5f 65 78 65 63 73 71  ABCDEF.do_execsq
5980: 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e  l_test pager1.4.
5990: 35 2e 35 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a  5.5 {.  SELECT *
59a0: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 53 45 4c 45   FROM t1;.  SELE
59b0: 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 7d 20  CT * FROM t2;.} 
59c0: 7b 49 20 49 49 20 49 49 49 20 49 56 20 33 20 34  {I II III IV 3 4
59d0: 7d 0a 0a 66 61 75 6c 74 73 69 6d 5f 72 65 73 74  }..faultsim_rest
59e0: 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 64  ore_and_reopen.d
59f0: 62 20 63 6c 6f 73 65 0a 73 71 6c 69 74 65 33 20  b close.sqlite3 
5a00: 64 62 20 74 65 73 74 2e 64 62 20 2d 72 65 61 64  db test.db -read
5a10: 6f 6e 6c 79 20 31 0a 64 6f 5f 63 61 74 63 68 73  only 1.do_catchs
5a20: 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34  ql_test pager1.4
5a30: 2e 35 2e 36 20 7b 0a 20 20 53 45 4c 45 43 54 20  .5.6 {.  SELECT 
5a40: 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 53 45 4c  * FROM t1;.  SEL
5a50: 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 7d  ECT * FROM t2;.}
5a60: 20 7b 31 20 7b 64 69 73 6b 20 49 2f 4f 20 65 72   {1 {disk I/O er
5a70: 72 6f 72 7d 7d 0a 64 62 20 63 6c 6f 73 65 0a 0a  ror}}.db close..
5a80: 23 20 53 6e 61 70 73 68 6f 74 20 74 68 65 20 66  # Snapshot the f
5a90: 69 6c 65 2d 73 79 73 74 65 6d 20 6a 75 73 74 20  ile-system just 
5aa0: 62 65 66 6f 72 65 20 6d 75 6c 74 69 2d 66 69 6c  before multi-fil
5ab0: 65 20 63 6f 6d 6d 69 74 2e 20 53 61 76 65 20 74  e commit. Save t
5ac0: 68 65 20 6e 61 6d 65 0a 23 20 6f 66 20 74 68 65  he name.# of the
5ad0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
5ae0: 66 69 6c 65 20 69 6e 20 24 3a 3a 6d 6a 5f 66 69  file in $::mj_fi
5af0: 6c 65 6e 61 6d 65 2e 0a 23 0a 74 76 20 73 63 72  lename..#.tv scr
5b00: 69 70 74 20 63 6f 70 79 5f 6f 6e 5f 6d 6a 5f 64  ipt copy_on_mj_d
5b10: 65 6c 65 74 65 0a 74 76 20 66 69 6c 74 65 72 20  elete.tv filter 
5b20: 78 44 65 6c 65 74 65 0a 70 72 6f 63 20 63 6f 70  xDelete.proc cop
5b30: 79 5f 6f 6e 5f 6d 6a 5f 64 65 6c 65 74 65 20 7b  y_on_mj_delete {
5b40: 6d 65 74 68 6f 64 20 66 69 6c 65 6e 61 6d 65 20  method filename 
5b50: 61 72 67 73 7d 20 7b 0a 20 20 69 66 20 7b 5b 73  args} {.  if {[s
5b60: 74 72 69 6e 67 20 6d 61 74 63 68 20 2a 6d 6a 2a  tring match *mj*
5b70: 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 66 69 6c   [file tail $fil
5b80: 65 6e 61 6d 65 5d 5d 7d 20 7b 20 0a 20 20 20 20  ename]]} { .    
5b90: 73 65 74 20 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d  set ::mj_filenam
5ba0: 65 20 24 66 69 6c 65 6e 61 6d 65 0a 20 20 20 20  e $filename.    
5bb0: 66 61 75 6c 74 73 69 6d 5f 73 61 76 65 20 0a 20  faultsim_save . 
5bc0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
5bd0: 54 45 5f 4f 4b 0a 7d 0a 64 6f 5f 74 65 73 74 20  TE_OK.}.do_test 
5be0: 70 61 67 65 72 31 2e 34 2e 36 2e 31 20 7b 0a 20  pager1.4.6.1 {. 
5bf0: 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65   faultsim_delete
5c00: 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78  _and_reopen.  ex
5c10: 65 63 73 71 6c 20 7b 0a 20 20 20 20 41 54 54 41  ecsql {.    ATTA
5c20: 43 48 20 27 74 65 73 74 2e 64 62 32 27 20 41 53  CH 'test.db2' AS
5c30: 20 74 77 6f 3b 0a 20 20 20 20 43 52 45 41 54 45   two;.    CREATE
5c40: 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b   TABLE t1(a, b);
5c50: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
5c60: 45 20 74 77 6f 2e 74 32 28 61 2c 20 62 29 3b 0a  E two.t2(a, b);.
5c70: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
5c80: 74 31 20 56 41 4c 55 45 53 28 31 2c 20 27 74 31  t1 VALUES(1, 't1
5c90: 2e 31 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  .1');.    INSERT
5ca0: 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28   INTO t2 VALUES(
5cb0: 31 2c 20 27 74 32 2e 31 27 29 3b 0a 20 20 20 20  1, 't2.1');.    
5cc0: 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 55 50 44  BEGIN;.      UPD
5cd0: 41 54 45 20 74 31 20 53 45 54 20 62 20 3d 20 27  ATE t1 SET b = '
5ce0: 74 31 2e 32 27 3b 0a 20 20 20 20 20 20 55 50 44  t1.2';.      UPD
5cf0: 41 54 45 20 74 32 20 53 45 54 20 62 20 3d 20 27  ATE t2 SET b = '
5d00: 74 32 2e 32 27 3b 0a 20 20 20 20 43 4f 4d 4d 49  t2.2';.    COMMI
5d10: 54 3b 0a 20 20 7d 0a 20 20 74 76 20 66 69 6c 74  T;.  }.  tv filt
5d20: 65 72 20 7b 7d 0a 20 20 64 62 20 63 6c 6f 73 65  er {}.  db close
5d30: 0a 7d 20 7b 7d 0a 0a 66 61 75 6c 74 73 69 6d 5f  .} {}..faultsim_
5d40: 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70  restore_and_reop
5d50: 65 6e 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  en.do_execsql_te
5d60: 73 74 20 70 61 67 65 72 31 2e 34 2e 36 2e 32 20  st pager1.4.6.2 
5d70: 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  { SELECT * FROM 
5d80: 74 31 20 7d 20 20 20 20 20 20 20 20 20 20 20 7b  t1 }           {
5d90: 31 20 74 31 2e 31 7d 0a 64 6f 5f 74 65 73 74 20  1 t1.1}.do_test 
5da0: 20 20 20 20 20 20 20 20 70 61 67 65 72 31 2e 34          pager1.4
5db0: 2e 36 2e 33 20 7b 20 66 69 6c 65 20 65 78 69 73  .6.3 { file exis
5dc0: 74 73 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d  ts $::mj_filenam
5dd0: 65 20 7d 20 7b 31 7d 0a 64 6f 5f 65 78 65 63 73  e } {1}.do_execs
5de0: 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34  ql_test pager1.4
5df0: 2e 36 2e 34 20 7b 0a 20 20 41 54 54 41 43 48 20  .6.4 {.  ATTACH 
5e00: 27 74 65 73 74 2e 64 62 32 27 20 41 53 20 74 77  'test.db2' AS tw
5e10: 6f 3b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52  o;.  SELECT * FR
5e20: 4f 4d 20 74 32 3b 0a 7d 20 7b 31 20 74 32 2e 31  OM t2;.} {1 t2.1
5e30: 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  }.do_test pager1
5e40: 2e 34 2e 36 2e 35 20 7b 20 66 69 6c 65 20 65 78  .4.6.5 { file ex
5e50: 69 73 74 73 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e  ists $::mj_filen
5e60: 61 6d 65 20 7d 20 7b 30 7d 0a 0a 66 61 75 6c 74  ame } {0}..fault
5e70: 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f  sim_restore_and_
5e80: 72 65 6f 70 65 6e 0a 64 62 20 63 6c 6f 73 65 0a  reopen.db close.
5e90: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34  do_test pager1.4
5ea0: 2e 36 2e 38 20 7b 0a 20 20 73 65 74 20 3a 3a 6d  .6.8 {.  set ::m
5eb0: 6a 5f 66 69 6c 65 6e 61 6d 65 31 20 24 3a 3a 6d  j_filename1 $::m
5ec0: 6a 5f 66 69 6c 65 6e 61 6d 65 0a 20 20 74 76 20  j_filename.  tv 
5ed0: 66 69 6c 74 65 72 20 78 44 65 6c 65 74 65 0a 20  filter xDelete. 
5ee0: 20 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74   sqlite3 db test
5ef0: 2e 64 62 32 0a 20 20 65 78 65 63 73 71 6c 20 7b  .db2.  execsql {
5f00: 0a 20 20 20 20 41 54 54 41 43 48 20 27 74 65 73  .    ATTACH 'tes
5f10: 74 2e 64 62 33 27 20 41 53 20 74 68 72 65 65 3b  t.db3' AS three;
5f20: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
5f30: 45 20 74 68 72 65 65 2e 74 33 28 61 2c 20 62 29  E three.t3(a, b)
5f40: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
5f50: 4f 20 74 33 20 56 41 4c 55 45 53 28 31 2c 20 27  O t3 VALUES(1, '
5f60: 74 33 2e 31 27 29 3b 0a 20 20 20 20 42 45 47 49  t3.1');.    BEGI
5f70: 4e 3b 0a 20 20 20 20 20 20 55 50 44 41 54 45 20  N;.      UPDATE 
5f80: 74 32 20 53 45 54 20 62 20 3d 20 27 74 32 2e 33  t2 SET b = 't2.3
5f90: 27 3b 0a 20 20 20 20 20 20 55 50 44 41 54 45 20  ';.      UPDATE 
5fa0: 74 33 20 53 45 54 20 62 20 3d 20 27 74 33 2e 33  t3 SET b = 't3.3
5fb0: 27 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20  ';.    COMMIT;. 
5fc0: 20 7d 0a 20 20 65 78 70 72 20 7b 24 3a 3a 6d 6a   }.  expr {$::mj
5fd0: 5f 66 69 6c 65 6e 61 6d 65 31 20 21 3d 20 24 3a  _filename1 != $:
5fe0: 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 7d 0a 7d 20  :mj_filename}.} 
5ff0: 7b 31 7d 0a 66 61 75 6c 74 73 69 6d 5f 72 65 73  {1}.faultsim_res
6000: 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a  tore_and_reopen.
6010: 74 76 20 66 69 6c 74 65 72 20 7b 7d 0a 0a 23 20  tv filter {}..# 
6020: 54 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  The file-system 
6030: 6e 6f 77 20 63 6f 6e 74 61 69 6e 73 3a 0a 23 0a  now contains:.#.
6040: 23 20 20 20 2a 20 74 68 72 65 65 20 64 61 74 61  #   * three data
6050: 62 61 73 65 73 0a 23 20 20 20 2a 20 74 68 72 65  bases.#   * thre
6060: 65 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69  e hot-journal fi
6070: 6c 65 73 0a 23 20 20 20 2a 20 74 77 6f 20 6d 61  les.#   * two ma
6080: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster-journal fil
6090: 65 73 2e 0a 23 0a 23 20 54 68 65 20 68 6f 74 2d  es..#.# The hot-
60a0: 6a 6f 75 72 6e 61 6c 73 20 61 73 73 6f 63 69 61  journals associa
60b0: 74 65 64 20 77 69 74 68 20 74 65 73 74 2e 64 62  ted with test.db
60c0: 32 20 61 6e 64 20 74 65 73 74 2e 64 62 33 20 70  2 and test.db3 p
60d0: 6f 69 6e 74 20 74 6f 0a 23 20 6d 61 73 74 65 72  oint to.# master
60e0: 20 6a 6f 75 72 6e 61 6c 20 24 3a 3a 6d 6a 5f 66   journal $::mj_f
60f0: 69 6c 65 6e 61 6d 65 2e 20 54 68 65 20 68 6f 74  ilename. The hot
6100: 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 73  -journal file as
6110: 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a 23 20  sociated with.# 
6120: 74 65 73 74 2e 64 62 20 70 6f 69 6e 74 73 20 74  test.db points t
6130: 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  o master journal
6140: 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 31   $::mj_filename1
6150: 2e 20 53 6f 20 72 65 61 64 69 6e 67 20 66 72 6f  . So reading fro
6160: 6d 0a 23 20 74 65 73 74 2e 64 62 20 73 68 6f 75  m.# test.db shou
6170: 6c 64 20 64 65 6c 65 74 65 20 24 3a 3a 6d 6a 5f  ld delete $::mj_
6180: 66 69 6c 65 6e 61 6d 65 31 2e 0a 23 0a 64 6f 5f  filename1..#.do_
6190: 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e 36 2e  test pager1.4.6.
61a0: 39 20 7b 0a 20 20 6c 73 6f 72 74 20 5b 67 6c 6f  9 {.  lsort [glo
61b0: 62 20 74 65 73 74 2e 64 62 2a 5d 0a 7d 20 5b 6c  b test.db*].} [l
61c0: 73 6f 72 74 20 5b 6c 69 73 74 20 20 20 20 20 20  sort [list      
61d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
61e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
61f0: 20 20 20 20 20 5c 0a 20 20 74 65 73 74 2e 64 62       \.  test.db
6200: 20 74 65 73 74 2e 64 62 32 20 74 65 73 74 2e 64   test.db2 test.d
6210: 62 33 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b3              
6220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6230: 5c 0a 20 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72  \.  test.db-jour
6240: 6e 61 6c 20 74 65 73 74 2e 64 62 32 2d 6a 6f 75  nal test.db2-jou
6250: 72 6e 61 6c 20 74 65 73 74 2e 64 62 33 2d 6a 6f  rnal test.db3-jo
6260: 75 72 6e 61 6c 20 20 20 20 20 20 5c 0a 20 20 5b  urnal      \.  [
6270: 66 69 6c 65 20 74 61 69 6c 20 24 3a 3a 6d 6a 5f  file tail $::mj_
6280: 66 69 6c 65 6e 61 6d 65 5d 20 5b 66 69 6c 65 20  filename] [file 
6290: 74 61 69 6c 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e  tail $::mj_filen
62a0: 61 6d 65 31 5d 0a 5d 5d 0a 0a 23 20 54 68 65 20  ame1].]]..# The 
62b0: 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 24  master-journal $
62c0: 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 31 20 63  ::mj_filename1 c
62d0: 6f 6e 74 61 69 6e 73 20 70 6f 69 6e 74 65 72 73  ontains pointers
62e0: 20 74 6f 20 74 65 73 74 2e 64 62 20 61 6e 64 20   to test.db and 
62f0: 0a 23 20 74 65 73 74 2e 64 62 32 2e 20 48 6f 77  .# test.db2. How
6300: 65 76 65 72 20 74 68 65 20 68 6f 74 2d 6a 6f 75  ever the hot-jou
6310: 72 6e 61 6c 20 61 73 73 6f 63 69 61 74 65 64 20  rnal associated 
6320: 77 69 74 68 20 74 65 73 74 2e 64 62 32 20 70 6f  with test.db2 po
6330: 69 6e 74 73 20 74 6f 0a 23 20 61 20 64 69 66 66  ints to.# a diff
6340: 65 72 65 6e 74 20 6d 61 73 74 65 72 2d 6a 6f 75  erent master-jou
6350: 72 6e 61 6c 2e 20 54 68 65 72 65 66 6f 72 65 2c  rnal. Therefore,
6360: 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 74 65   reading from te
6370: 73 74 2e 64 62 20 6f 6e 6c 79 20 73 68 6f 75 6c  st.db only shoul
6380: 64 0a 23 20 62 65 20 65 6e 6f 75 67 68 20 74 6f  d.# be enough to
6390: 20 63 61 75 73 65 20 53 51 4c 69 74 65 20 74 6f   cause SQLite to
63a0: 20 64 65 6c 65 74 65 20 24 3a 3a 6d 6a 5f 66 69   delete $::mj_fi
63b0: 6c 65 6e 61 6d 65 31 2e 0a 23 0a 64 6f 5f 74 65  lename1..#.do_te
63c0: 73 74 20 20 20 20 20 20 20 20 20 70 61 67 65 72  st         pager
63d0: 31 2e 34 2e 36 2e 31 30 20 7b 20 66 69 6c 65 20  1.4.6.10 { file 
63e0: 65 78 69 73 74 73 20 24 3a 3a 6d 6a 5f 66 69 6c  exists $::mj_fil
63f0: 65 6e 61 6d 65 20 20 7d 20 7b 31 7d 0a 64 6f 5f  ename  } {1}.do_
6400: 74 65 73 74 20 20 20 20 20 20 20 20 20 70 61 67  test         pag
6410: 65 72 31 2e 34 2e 36 2e 31 31 20 7b 20 66 69 6c  er1.4.6.11 { fil
6420: 65 20 65 78 69 73 74 73 20 24 3a 3a 6d 6a 5f 66  e exists $::mj_f
6430: 69 6c 65 6e 61 6d 65 31 20 7d 20 7b 31 7d 0a 64  ilename1 } {1}.d
6440: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70  o_execsql_test p
6450: 61 67 65 72 31 2e 34 2e 36 2e 31 32 20 7b 20 53  ager1.4.6.12 { S
6460: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
6470: 7d 20 7b 31 20 74 31 2e 31 7d 0a 64 6f 5f 74 65  } {1 t1.1}.do_te
6480: 73 74 20 20 20 20 20 20 20 20 20 70 61 67 65 72  st         pager
6490: 31 2e 34 2e 36 2e 31 33 20 7b 20 66 69 6c 65 20  1.4.6.13 { file 
64a0: 65 78 69 73 74 73 20 24 3a 3a 6d 6a 5f 66 69 6c  exists $::mj_fil
64b0: 65 6e 61 6d 65 20 20 7d 20 7b 31 7d 0a 64 6f 5f  ename  } {1}.do_
64c0: 74 65 73 74 20 20 20 20 20 20 20 20 20 70 61 67  test         pag
64d0: 65 72 31 2e 34 2e 36 2e 31 34 20 7b 20 66 69 6c  er1.4.6.14 { fil
64e0: 65 20 65 78 69 73 74 73 20 24 3a 3a 6d 6a 5f 66  e exists $::mj_f
64f0: 69 6c 65 6e 61 6d 65 31 20 7d 20 7b 30 7d 0a 0a  ilename1 } {0}..
6500: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
6510: 70 61 67 65 72 31 2e 34 2e 36 2e 31 32 20 7b 0a  pager1.4.6.12 {.
6520: 20 20 41 54 54 41 43 48 20 27 74 65 73 74 2e 64    ATTACH 'test.d
6530: 62 32 27 20 41 53 20 74 77 6f 3b 0a 20 20 53 45  b2' AS two;.  SE
6540: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a  LECT * FROM t2;.
6550: 7d 20 7b 31 20 74 32 2e 31 7d 0a 64 6f 5f 74 65  } {1 t2.1}.do_te
6560: 73 74 20 20 20 20 20 20 20 20 20 70 61 67 65 72  st         pager
6570: 31 2e 34 2e 36 2e 31 33 20 7b 20 66 69 6c 65 20  1.4.6.13 { file 
6580: 65 78 69 73 74 73 20 24 3a 3a 6d 6a 5f 66 69 6c  exists $::mj_fil
6590: 65 6e 61 6d 65 20 7d 20 20 7b 31 7d 0a 64 6f 5f  ename }  {1}.do_
65a0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67  execsql_test pag
65b0: 65 72 31 2e 34 2e 36 2e 31 34 20 7b 0a 20 20 41  er1.4.6.14 {.  A
65c0: 54 54 41 43 48 20 27 74 65 73 74 2e 64 62 33 27  TTACH 'test.db3'
65d0: 20 41 53 20 74 68 72 65 65 3b 0a 20 20 53 45 4c   AS three;.  SEL
65e0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 33 3b 0a 7d  ECT * FROM t3;.}
65f0: 20 7b 31 20 74 33 2e 31 7d 0a 64 6f 5f 74 65 73   {1 t3.1}.do_tes
6600: 74 20 20 20 20 20 20 20 20 20 70 61 67 65 72 31  t         pager1
6610: 2e 34 2e 36 2e 31 35 20 7b 20 66 69 6c 65 20 65  .4.6.15 { file e
6620: 78 69 73 74 73 20 24 3a 3a 6d 6a 5f 66 69 6c 65  xists $::mj_file
6630: 6e 61 6d 65 20 7d 20 20 7b 30 7d 0a 0a 64 62 20  name }  {0}..db 
6640: 63 6c 6f 73 65 0a 74 76 20 64 65 6c 65 74 65 0a  close.tv delete.
6650: 0a 74 65 73 74 76 66 73 20 74 76 20 2d 64 65 66  .testvfs tv -def
6660: 61 75 6c 74 20 31 0a 74 76 20 73 65 63 74 6f 72  ault 1.tv sector
6670: 73 69 7a 65 20 35 31 32 0a 74 76 20 73 63 72 69  size 512.tv scri
6680: 70 74 20 63 6f 70 79 5f 6f 6e 5f 6a 6f 75 72 6e  pt copy_on_journ
6690: 61 6c 5f 64 65 6c 65 74 65 0a 74 76 20 66 69 6c  al_delete.tv fil
66a0: 74 65 72 20 78 44 65 6c 65 74 65 0a 70 72 6f 63  ter xDelete.proc
66b0: 20 63 6f 70 79 5f 6f 6e 5f 6a 6f 75 72 6e 61 6c   copy_on_journal
66c0: 5f 64 65 6c 65 74 65 20 7b 6d 65 74 68 6f 64 20  _delete {method 
66d0: 66 69 6c 65 6e 61 6d 65 20 61 72 67 73 7d 20 7b  filename args} {
66e0: 0a 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6d  .  if {[string m
66f0: 61 74 63 68 20 2a 6a 6f 75 72 6e 61 6c 20 24 66  atch *journal $f
6700: 69 6c 65 6e 61 6d 65 5d 7d 20 66 61 75 6c 74 73  ilename]} faults
6710: 69 6d 5f 73 61 76 65 20 0a 20 20 72 65 74 75 72  im_save .  retur
6720: 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 7d 0a 66 61  n SQLITE_OK.}.fa
6730: 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e  ultsim_delete_an
6740: 64 5f 72 65 6f 70 65 6e 0a 64 6f 5f 65 78 65 63  d_reopen.do_exec
6750: 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2e  sql_test pager1.
6760: 34 2e 37 2e 31 20 7b 0a 20 20 43 52 45 41 54 45  4.7.1 {.  CREATE
6770: 20 54 41 42 4c 45 20 74 31 28 78 20 50 52 49 4d   TABLE t1(x PRIM
6780: 41 52 59 20 4b 45 59 2c 20 79 29 3b 0a 20 20 43  ARY KEY, y);.  C
6790: 52 45 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f  REATE INDEX i1 O
67a0: 4e 20 74 31 28 79 29 3b 0a 20 20 49 4e 53 45 52  N t1(y);.  INSER
67b0: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
67c0: 28 27 49 27 2c 20 20 20 27 6f 6e 65 27 29 3b 0a  ('I',   'one');.
67d0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
67e0: 20 56 41 4c 55 45 53 28 27 49 49 27 2c 20 20 27   VALUES('II',  '
67f0: 66 6f 75 72 27 29 3b 0a 20 20 49 4e 53 45 52 54  four');.  INSERT
6800: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
6810: 27 49 49 49 27 2c 20 27 6e 69 6e 65 27 29 3b 0a  'III', 'nine');.
6820: 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 49 4e 53    BEGIN;.    INS
6830: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
6840: 45 53 28 27 49 56 27 2c 20 27 73 69 78 74 65 65  ES('IV', 'sixtee
6850: 6e 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  n');.    INSERT 
6860: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27  INTO t1 VALUES('
6870: 56 27 20 2c 20 27 74 77 65 6e 74 79 66 69 76 65  V' , 'twentyfive
6880: 27 29 3b 0a 20 20 43 4f 4d 4d 49 54 3b 0a 7d 20  ');.  COMMIT;.} 
6890: 7b 7d 0a 74 76 20 66 69 6c 74 65 72 20 7b 7d 0a  {}.tv filter {}.
68a0: 64 62 20 63 6c 6f 73 65 0a 74 76 20 64 65 6c 65  db close.tv dele
68b0: 74 65 20 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  te .do_test page
68c0: 72 31 2e 34 2e 37 2e 32 20 7b 0a 20 20 66 61 75  r1.4.7.2 {.  fau
68d0: 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e  ltsim_restore_an
68e0: 64 5f 72 65 6f 70 65 6e 0a 20 20 63 61 74 63 68  d_reopen.  catch
68f0: 20 7b 66 69 6c 65 20 61 74 74 72 69 62 75 74 65   {file attribute
6900: 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61  s test.db-journa
6910: 6c 20 2d 70 65 72 6d 69 73 73 69 6f 6e 73 20 72  l -permissions r
6920: 2d 2d 2d 2d 2d 2d 2d 2d 7d 0a 20 20 63 61 74 63  --------}.  catc
6930: 68 20 7b 66 69 6c 65 20 61 74 74 72 69 62 75 74  h {file attribut
6940: 65 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e  es test.db-journ
6950: 61 6c 20 2d 72 65 61 64 6f 6e 6c 79 20 31 7d 0a  al -readonly 1}.
6960: 20 20 63 61 74 63 68 73 71 6c 20 7b 20 53 45 4c    catchsql { SEL
6970: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 0a  ECT * FROM t1 }.
6980: 7d 20 7b 31 20 7b 75 6e 61 62 6c 65 20 74 6f 20  } {1 {unable to 
6990: 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 66 69  open database fi
69a0: 6c 65 7d 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67  le}}.do_test pag
69b0: 65 72 31 2e 34 2e 37 2e 33 20 7b 0a 20 20 64 62  er1.4.7.3 {.  db
69c0: 20 63 6c 6f 73 65 0a 20 20 63 61 74 63 68 20 7b   close.  catch {
69d0: 66 69 6c 65 20 61 74 74 72 69 62 75 74 65 73 20  file attributes 
69e0: 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20  test.db-journal 
69f0: 2d 70 65 72 6d 69 73 73 69 6f 6e 73 20 72 77 2d  -permissions rw-
6a00: 72 77 2d 72 77 2d 7d 0a 20 20 63 61 74 63 68 20  rw-rw-}.  catch 
6a10: 7b 66 69 6c 65 20 61 74 74 72 69 62 75 74 65 73  {file attributes
6a20: 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c   test.db-journal
6a30: 20 2d 72 65 61 64 6f 6e 6c 79 20 30 7d 0a 20 20   -readonly 0}.  
6a40: 66 69 6c 65 20 64 65 6c 65 74 65 20 74 65 73 74  file delete test
6a50: 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 20 20 66 69  .db-journal.  fi
6a60: 6c 65 20 65 78 69 73 74 73 20 74 65 73 74 2e 64  le exists test.d
6a70: 62 2d 6a 6f 75 72 6e 61 6c 0a 7d 20 7b 30 7d 0a  b-journal.} {0}.
6a80: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
6a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68  -----------.# Th
6ad0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74  e following test
6ae0: 73 20 64 65 61 6c 20 77 69 74 68 20 6d 75 6c 74  s deal with mult
6af0: 69 2d 66 69 6c 65 20 63 6f 6d 6d 69 74 73 2e 0a  i-file commits..
6b00: 23 0a 23 20 70 61 67 65 72 31 2d 35 2e 31 2e 2a  #.# pager1-5.1.*
6b10: 3a 20 54 68 65 20 63 61 73 65 20 77 68 65 72 65  : The case where
6b20: 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 63 61   a multi-file ca
6b30: 6e 6e 6f 74 20 62 65 20 63 6f 6d 6d 69 74 74 65  nnot be committe
6b40: 64 20 62 65 63 61 75 73 65 0a 23 20 20 20 20 20  d because.#     
6b50: 20 20 20 20 20 20 20 20 20 20 61 6e 6f 74 68 65            anothe
6b60: 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20  r connection is 
6b70: 68 6f 6c 64 69 6e 67 20 61 20 53 48 41 52 45 44  holding a SHARED
6b80: 20 6c 6f 63 6b 20 6f 6e 20 6f 6e 65 20 6f 66 20   lock on one of 
6b90: 74 68 65 0a 23 20 20 20 20 20 20 20 20 20 20 20  the.#           
6ba0: 20 20 20 20 66 69 6c 65 73 2e 20 41 66 74 65 72      files. After
6bb0: 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b   the SHARED lock
6bc0: 20 69 73 20 72 65 6d 6f 76 65 64 2c 20 74 68 65   is removed, the
6bd0: 20 43 4f 4d 4d 49 54 20 73 75 63 63 65 65 64 73   COMMIT succeeds
6be0: 2e 0a 23 0a 23 20 70 61 67 65 72 31 2d 35 2e 32  ..#.# pager1-5.2
6bf0: 2e 2a 3a 20 4d 75 6c 74 69 2d 66 69 6c 65 20 63  .*: Multi-file c
6c00: 6f 6d 6d 69 74 73 20 77 69 74 68 20 6a 6f 75 72  ommits with jour
6c10: 6e 61 6c 5f 6d 6f 64 65 3d 6d 65 6d 6f 72 79 2e  nal_mode=memory.
6c20: 0a 23 0a 23 20 70 61 67 65 72 31 2d 35 2e 33 2e  .#.# pager1-5.3.
6c30: 2a 3a 20 4d 75 6c 74 69 2d 66 69 6c 65 20 63 6f  *: Multi-file co
6c40: 6d 6d 69 74 73 20 77 69 74 68 20 6a 6f 75 72 6e  mmits with journ
6c50: 61 6c 5f 6d 6f 64 65 3d 6d 65 6d 6f 72 79 2e 0a  al_mode=memory..
6c60: 23 0a 23 20 70 61 67 65 72 31 2d 35 2e 34 2e 2a  #.# pager1-5.4.*
6c70: 3a 20 43 68 65 63 6b 20 74 68 61 74 20 77 69 74  : Check that wit
6c80: 68 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 6e 6f  h synchronous=no
6c90: 72 6d 61 6c 2c 20 74 68 65 20 6d 61 73 74 65 72  rmal, the master
6ca0: 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 23 20  -journal file.# 
6cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 61                na
6cc0: 6d 65 20 69 73 20 61 64 64 65 64 20 74 6f 20 61  me is added to a
6cd0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6d   journal file im
6ce0: 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20  mediately after 
6cf0: 74 68 65 20 6c 61 73 74 0a 23 20 20 20 20 20 20  the last.#      
6d00: 20 20 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c           journal
6d10: 20 72 65 63 6f 72 64 2e 20 42 75 74 20 77 69 74   record. But wit
6d20: 68 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 66 75  h synchronous=fu
6d30: 6c 6c 2c 20 65 78 74 72 61 20 75 6e 75 73 65 64  ll, extra unused
6d40: 20 73 70 61 63 65 0a 23 20 20 20 20 20 20 20 20   space.#        
6d50: 20 20 20 20 20 20 20 69 73 20 61 6c 6c 6f 63 61         is alloca
6d60: 74 65 64 20 62 65 74 77 65 65 6e 20 74 68 65 20  ted between the 
6d70: 6c 61 73 74 20 6a 6f 75 72 6e 61 6c 20 72 65 63  last journal rec
6d80: 6f 72 64 20 61 6e 64 20 74 68 65 20 0a 23 20 20  ord and the .#  
6d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 61 73               mas
6da0: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter-journal file
6db0: 20 6e 61 6d 65 20 73 6f 20 74 68 61 74 20 74 68   name so that th
6dc0: 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  e master-journal
6dd0: 20 66 69 6c 65 0a 23 20 20 20 20 20 20 20 20 20   file.#         
6de0: 20 20 20 20 20 20 6e 61 6d 65 20 64 6f 65 73 20        name does 
6df0: 6e 6f 74 20 6c 69 65 20 6f 6e 20 74 68 65 20 73  not lie on the s
6e00: 61 6d 65 20 73 65 63 74 6f 72 20 61 73 20 74 68  ame sector as th
6e10: 65 20 6c 61 73 74 20 6a 6f 75 72 6e 61 6c 20 66  e last journal f
6e20: 69 6c 65 0a 23 20 20 20 20 20 20 20 20 20 20 20  ile.#           
6e30: 20 20 20 20 72 65 63 6f 72 64 2e 0a 23 0a 23 20      record..#.# 
6e40: 70 61 67 65 72 31 2d 35 2e 35 2e 2a 3a 20 43 68  pager1-5.5.*: Ch
6e50: 65 63 6b 20 74 68 61 74 20 69 6e 20 6a 6f 75 72  eck that in jour
6e60: 6e 61 6c 5f 6d 6f 64 65 3d 50 45 52 53 49 53 54  nal_mode=PERSIST
6e70: 20 6d 6f 64 65 2c 20 61 20 6a 6f 75 72 6e 61 6c   mode, a journal
6e80: 20 66 69 6c 65 20 69 73 0a 23 20 20 20 20 20 20   file is.#      
6e90: 20 20 20 20 20 20 20 20 20 74 72 75 6e 63 61 74           truncat
6ea0: 65 64 20 74 6f 20 7a 65 72 6f 20 62 79 74 65 73  ed to zero bytes
6eb0: 20 77 68 65 6e 20 61 20 6d 75 6c 74 69 2d 66 69   when a multi-fi
6ec0: 6c 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  le transaction i
6ed0: 73 20 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  s .#            
6ee0: 20 20 20 63 6f 6d 6d 69 74 74 65 64 20 28 69 6e     committed (in
6ef0: 73 74 65 61 64 20 6f 66 20 74 68 65 20 66 69 72  stead of the fir
6f00: 73 74 20 63 6f 75 70 6c 65 20 6f 66 20 62 79 74  st couple of byt
6f10: 65 73 20 62 65 69 6e 67 20 7a 65 72 6f 65 64 29  es being zeroed)
6f20: 2e 0a 23 0a 23 0a 64 6f 5f 74 65 73 74 20 70 61  ..#.#.do_test pa
6f30: 67 65 72 31 2d 35 2e 31 2e 31 20 7b 0a 20 20 66  ger1-5.1.1 {.  f
6f40: 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61  aultsim_delete_a
6f50: 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65 63  nd_reopen.  exec
6f60: 73 71 6c 20 7b 0a 20 20 20 20 41 54 54 41 43 48  sql {.    ATTACH
6f70: 20 27 74 65 73 74 2e 64 62 32 27 20 41 53 20 61   'test.db2' AS a
6f80: 75 78 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  ux;.    CREATE T
6f90: 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20  ABLE t1(a, b);. 
6fa0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
6fb0: 61 75 78 2e 74 32 28 61 2c 20 62 29 3b 0a 20 20  aux.t2(a, b);.  
6fc0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
6fd0: 20 56 41 4c 55 45 53 28 31 37 2c 20 27 4c 65 6e   VALUES(17, 'Len
6fe0: 69 6e 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  in');.    INSERT
6ff0: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
7000: 32 32 2c 20 27 53 74 61 6c 69 6e 27 29 3b 0a 20  22, 'Stalin');. 
7010: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
7020: 31 20 56 41 4c 55 45 53 28 35 33 2c 20 27 4b 68  1 VALUES(53, 'Kh
7030: 72 75 73 68 63 68 65 76 27 29 3b 0a 20 20 7d 0a  rushchev');.  }.
7040: 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67  } {}.do_test pag
7050: 65 72 31 2d 35 2e 31 2e 32 20 7b 0a 20 20 65 78  er1-5.1.2 {.  ex
7060: 65 63 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49  ecsql {.    BEGI
7070: 4e 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  N;.      INSERT 
7080: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 36  INTO t1 VALUES(6
7090: 34 2c 20 27 42 72 65 7a 68 6e 65 76 27 29 3b 0a  4, 'Brezhnev');.
70a0: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
70b0: 4f 20 74 32 20 53 45 4c 45 43 54 20 2a 20 46 52  O t2 SELECT * FR
70c0: 4f 4d 20 74 31 3b 0a 20 20 7d 0a 20 20 73 71 6c  OM t1;.  }.  sql
70d0: 69 74 65 33 20 64 62 32 20 74 65 73 74 2e 64 62  ite3 db2 test.db
70e0: 32 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  2.  execsql {.  
70f0: 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 53    BEGIN;.      S
7100: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b  ELECT * FROM t2;
7110: 0a 20 20 7d 20 64 62 32 0a 7d 20 7b 7d 0a 64 6f  .  } db2.} {}.do
7120: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 35 2e 31  _test pager1-5.1
7130: 2e 33 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20  .3 {.  catchsql 
7140: 43 4f 4d 4d 49 54 0a 7d 20 7b 31 20 7b 64 61 74  COMMIT.} {1 {dat
7150: 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 7d  abase is locked}
7160: 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  }.do_test pager1
7170: 2d 35 2e 31 2e 34 20 7b 0a 20 20 65 78 65 63 73  -5.1.4 {.  execs
7180: 71 6c 20 43 4f 4d 4d 49 54 20 64 62 32 0a 20 20  ql COMMIT db2.  
7190: 65 78 65 63 73 71 6c 20 43 4f 4d 4d 49 54 0a 20  execsql COMMIT. 
71a0: 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43   execsql { SELEC
71b0: 54 20 2a 20 46 52 4f 4d 20 74 32 20 7d 20 64 62  T * FROM t2 } db
71c0: 32 0a 7d 20 7b 31 37 20 4c 65 6e 69 6e 20 32 32  2.} {17 Lenin 22
71d0: 20 53 74 61 6c 69 6e 20 35 33 20 4b 68 72 75 73   Stalin 53 Khrus
71e0: 68 63 68 65 76 20 36 34 20 42 72 65 7a 68 6e 65  hchev 64 Brezhne
71f0: 76 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  v}.do_test pager
7200: 31 2d 35 2e 31 2e 35 20 7b 0a 20 20 64 62 32 20  1-5.1.5 {.  db2 
7210: 63 6c 6f 73 65 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74  close.} {}..do_t
7220: 65 73 74 20 70 61 67 65 72 31 2d 35 2e 32 2e 31  est pager1-5.2.1
7230: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
7240: 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61     PRAGMA journa
7250: 6c 5f 6d 6f 64 65 20 3d 20 6d 65 6d 6f 72 79 3b  l_mode = memory;
7260: 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20  .    BEGIN;.    
7270: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
7280: 20 56 41 4c 55 45 53 28 38 34 2c 20 27 41 6e 64   VALUES(84, 'And
7290: 72 6f 70 6f 76 27 29 3b 0a 20 20 20 20 20 20 49  ropov');.      I
72a0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41  NSERT INTO t2 VA
72b0: 4c 55 45 53 28 38 34 2c 20 27 41 6e 64 72 6f 70  LUES(84, 'Androp
72c0: 6f 76 27 29 3b 0a 20 20 20 20 43 4f 4d 4d 49 54  ov');.    COMMIT
72d0: 3b 0a 20 20 7d 0a 7d 20 7b 6d 65 6d 6f 72 79 7d  ;.  }.} {memory}
72e0: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
72f0: 35 2e 33 2e 31 20 7b 0a 20 20 65 78 65 63 73 71  5.3.1 {.  execsq
7300: 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a  l {.    PRAGMA j
7310: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 6f 66  ournal_mode = of
7320: 66 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20  f;.    BEGIN;.  
7330: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
7340: 74 31 20 56 41 4c 55 45 53 28 38 35 2c 20 27 47  t1 VALUES(85, 'G
7350: 6f 72 62 61 63 68 65 76 27 29 3b 0a 20 20 20 20  orbachev');.    
7360: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32    INSERT INTO t2
7370: 20 56 41 4c 55 45 53 28 38 35 2c 20 27 47 6f 72   VALUES(85, 'Gor
7380: 62 61 63 68 65 76 27 29 3b 0a 20 20 20 20 43 4f  bachev');.    CO
7390: 4d 4d 49 54 3b 0a 20 20 7d 0a 7d 20 7b 6f 66 66  MMIT;.  }.} {off
73a0: 7d 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  }..do_test pager
73b0: 31 2d 35 2e 34 2e 31 20 7b 0a 20 20 64 62 20 63  1-5.4.1 {.  db c
73c0: 6c 6f 73 65 0a 20 20 74 65 73 74 76 66 73 20 74  lose.  testvfs t
73d0: 76 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 74  v.  sqlite3 db t
73e0: 65 73 74 2e 64 62 20 2d 76 66 73 20 74 76 0a 20  est.db -vfs tv. 
73f0: 20 65 78 65 63 73 71 6c 20 7b 20 41 54 54 41 43   execsql { ATTAC
7400: 48 20 27 74 65 73 74 2e 64 62 32 27 20 41 53 20  H 'test.db2' AS 
7410: 61 75 78 20 7d 0a 0a 20 20 74 76 20 66 69 6c 74  aux }..  tv filt
7420: 65 72 20 78 44 65 6c 65 74 65 0a 20 20 74 76 20  er xDelete.  tv 
7430: 73 63 72 69 70 74 20 6d 61 78 5f 6a 6f 75 72 6e  script max_journ
7440: 61 6c 5f 73 69 7a 65 0a 20 20 74 76 20 73 65 63  al_size.  tv sec
7450: 74 6f 72 73 69 7a 65 20 35 31 32 0a 20 20 73 65  torsize 512.  se
7460: 74 20 3a 3a 6d 61 78 5f 6a 6f 75 72 6e 61 6c 20  t ::max_journal 
7470: 30 0a 20 20 70 72 6f 63 20 6d 61 78 5f 6a 6f 75  0.  proc max_jou
7480: 72 6e 61 6c 5f 73 69 7a 65 20 7b 6d 65 74 68 6f  rnal_size {metho
7490: 64 20 61 72 67 73 7d 20 7b 0a 20 20 20 20 73 65  d args} {.    se
74a0: 74 20 73 7a 20 30 0a 20 20 20 20 63 61 74 63 68  t sz 0.    catch
74b0: 20 7b 20 73 65 74 20 73 7a 20 5b 66 69 6c 65 20   { set sz [file 
74c0: 73 69 7a 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75  size test.db-jou
74d0: 72 6e 61 6c 5d 20 7d 0a 20 20 20 20 69 66 20 7b  rnal] }.    if {
74e0: 24 73 7a 20 3e 20 24 3a 3a 6d 61 78 5f 6a 6f 75  $sz > $::max_jou
74f0: 72 6e 61 6c 7d 20 7b 0a 20 20 20 20 20 20 73 65  rnal} {.      se
7500: 74 20 3a 3a 6d 61 78 5f 6a 6f 75 72 6e 61 6c 20  t ::max_journal 
7510: 24 73 7a 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  $sz.    }.    re
7520: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 20  turn SQLITE_OK. 
7530: 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   }.  execsql {. 
7540: 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61     PRAGMA journa
7550: 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c 45 54 45 3b  l_mode = DELETE;
7560: 0a 20 20 20 20 50 52 41 47 4d 41 20 73 79 6e 63  .    PRAGMA sync
7570: 68 72 6f 6e 6f 75 73 20 3d 20 4e 4f 52 4d 41 4c  hronous = NORMAL
7580: 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20  ;.    BEGIN;.   
7590: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
75a0: 31 20 56 41 4c 55 45 53 28 38 35 2c 20 27 47 6f  1 VALUES(85, 'Go
75b0: 72 62 61 63 68 65 76 27 29 3b 0a 20 20 20 20 20  rbachev');.     
75c0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20   INSERT INTO t2 
75d0: 56 41 4c 55 45 53 28 38 35 2c 20 27 47 6f 72 62  VALUES(85, 'Gorb
75e0: 61 63 68 65 76 27 29 3b 0a 20 20 20 20 43 4f 4d  achev');.    COM
75f0: 4d 49 54 3b 0a 20 20 7d 0a 20 20 73 65 74 20 3a  MIT;.  }.  set :
7600: 3a 6d 61 78 5f 6a 6f 75 72 6e 61 6c 0a 7d 20 5b  :max_journal.} [
7610: 65 78 70 72 20 32 36 31 35 2b 5b 73 74 72 69 6e  expr 2615+[strin
7620: 67 20 6c 65 6e 67 74 68 20 5b 70 77 64 5d 5d 5d  g length [pwd]]]
7630: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
7640: 35 2e 34 2e 32 20 7b 0a 20 20 73 65 74 20 3a 3a  5.4.2 {.  set ::
7650: 6d 61 78 5f 6a 6f 75 72 6e 61 6c 20 30 0a 20 20  max_journal 0.  
7660: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52  execsql {.    PR
7670: 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73  AGMA synchronous
7680: 20 3d 20 66 75 6c 6c 3b 0a 20 20 20 20 42 45 47   = full;.    BEG
7690: 49 4e 3b 0a 20 20 20 20 20 20 44 45 4c 45 54 45  IN;.      DELETE
76a0: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 62   FROM t1 WHERE b
76b0: 20 3d 20 27 4c 65 6e 69 6e 27 3b 0a 20 20 20 20   = 'Lenin';.    
76c0: 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 32    DELETE FROM t2
76d0: 20 57 48 45 52 45 20 62 20 3d 20 27 4c 65 6e 69   WHERE b = 'Leni
76e0: 6e 27 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a  n';.    COMMIT;.
76f0: 20 20 7d 0a 20 20 73 65 74 20 3a 3a 6d 61 78 5f    }.  set ::max_
7700: 6a 6f 75 72 6e 61 6c 0a 7d 20 5b 65 78 70 72 20  journal.} [expr 
7710: 33 31 31 31 2b 5b 73 74 72 69 6e 67 20 6c 65 6e  3111+[string len
7720: 67 74 68 20 5b 70 77 64 5d 5d 5d 0a 64 62 20 63  gth [pwd]]].db c
7730: 6c 6f 73 65 0a 74 76 20 64 65 6c 65 74 65 0a 0a  lose.tv delete..
7740: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 35  do_test pager1-5
7750: 2e 35 2e 31 20 7b 0a 20 20 73 71 6c 69 74 65 33  .5.1 {.  sqlite3
7760: 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20 65 78   db test.db.  ex
7770: 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 41 54 54  ecsql { .    ATT
7780: 41 43 48 20 27 74 65 73 74 2e 64 62 32 27 20 41  ACH 'test.db2' A
7790: 53 20 61 75 78 3b 0a 20 20 20 20 50 52 41 47 4d  S aux;.    PRAGM
77a0: 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d  A journal_mode =
77b0: 20 50 45 52 53 49 53 54 3b 0a 20 20 20 20 43 52   PERSIST;.    CR
77c0: 45 41 54 45 20 54 41 42 4c 45 20 74 33 28 61 2c  EATE TABLE t3(a,
77d0: 20 62 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   b);.    INSERT 
77e0: 49 4e 54 4f 20 74 33 20 53 45 4c 45 43 54 20 72  INTO t3 SELECT r
77f0: 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 2c  andomblob(1500),
7800: 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30   randomblob(1500
7810: 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 55  ) FROM t1;.    U
7820: 50 44 41 54 45 20 74 33 20 53 45 54 20 62 20 3d  PDATE t3 SET b =
7830: 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30   randomblob(1500
7840: 29 3b 0a 20 20 7d 0a 20 20 65 78 70 72 20 5b 66  );.  }.  expr [f
7850: 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62  ile size test.db
7860: 2d 6a 6f 75 72 6e 61 6c 5d 20 3e 20 31 35 30 30  -journal] > 1500
7870: 30 0a 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73 74 20  0.} {1}.do_test 
7880: 70 61 67 65 72 31 2d 35 2e 35 2e 32 20 7b 0a 20  pager1-5.5.2 {. 
7890: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50   execsql {.    P
78a0: 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75  RAGMA synchronou
78b0: 73 20 3d 20 66 75 6c 6c 3b 0a 20 20 20 20 42 45  s = full;.    BE
78c0: 47 49 4e 3b 0a 20 20 20 20 20 20 44 45 4c 45 54  GIN;.      DELET
78d0: 45 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  E FROM t1 WHERE 
78e0: 62 20 3d 20 27 53 74 61 6c 69 6e 27 3b 0a 20 20  b = 'Stalin';.  
78f0: 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20      DELETE FROM 
7900: 74 32 20 57 48 45 52 45 20 62 20 3d 20 27 53 74  t2 WHERE b = 'St
7910: 61 6c 69 6e 27 3b 0a 20 20 20 20 43 4f 4d 4d 49  alin';.    COMMI
7920: 54 3b 0a 20 20 7d 0a 20 20 66 69 6c 65 20 73 69  T;.  }.  file si
7930: 7a 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e  ze test.db-journ
7940: 61 6c 0a 7d 20 7b 30 7d 0a 0a 0a 23 2d 2d 2d 2d  al.} {0}...#----
7950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7990: 2d 2d 2d 2d 2d 0a 23 20 54 68 65 20 66 6f 6c 6c  -----.# The foll
79a0: 6f 77 69 6e 67 20 74 65 73 74 73 20 77 6f 72 6b  owing tests work
79b0: 20 77 69 74 68 20 22 50 52 41 47 4d 41 20 6d 61   with "PRAGMA ma
79c0: 78 5f 70 61 67 65 5f 63 6f 75 6e 74 22 0a 23 0a  x_page_count".#.
79d0: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 36  do_test pager1-6
79e0: 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f  .1 {.  faultsim_
79f0: 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65  delete_and_reope
7a00: 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  n.  execsql {.  
7a10: 20 20 50 52 41 47 4d 41 20 6d 61 78 5f 70 61 67    PRAGMA max_pag
7a20: 65 5f 63 6f 75 6e 74 20 3d 20 31 30 3b 0a 20 20  e_count = 10;.  
7a30: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
7a40: 32 28 61 2c 20 62 29 3b 0a 20 20 20 20 43 52 45  2(a, b);.    CRE
7a50: 41 54 45 20 54 41 42 4c 45 20 74 33 28 61 2c 20  ATE TABLE t3(a, 
7a60: 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  b);.    CREATE T
7a70: 41 42 4c 45 20 74 34 28 61 2c 20 62 29 3b 0a 20  ABLE t4(a, b);. 
7a80: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
7a90: 74 35 28 61 2c 20 62 29 3b 0a 20 20 20 20 43 52  t5(a, b);.    CR
7aa0: 45 41 54 45 20 54 41 42 4c 45 20 74 36 28 61 2c  EATE TABLE t6(a,
7ab0: 20 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20   b);.    CREATE 
7ac0: 54 41 42 4c 45 20 74 37 28 61 2c 20 62 29 3b 0a  TABLE t7(a, b);.
7ad0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
7ae0: 20 74 38 28 61 2c 20 62 29 3b 0a 20 20 20 20 43   t8(a, b);.    C
7af0: 52 45 41 54 45 20 54 41 42 4c 45 20 74 39 28 61  REATE TABLE t9(a
7b00: 2c 20 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45  , b);.    CREATE
7b10: 20 54 41 42 4c 45 20 74 31 30 28 61 2c 20 62 29   TABLE t10(a, b)
7b20: 3b 0a 20 20 7d 0a 7d 20 7b 31 30 7d 0a 64 6f 5f  ;.  }.} {10}.do_
7b30: 63 61 74 63 68 73 71 6c 5f 74 65 73 74 20 70 61  catchsql_test pa
7b40: 67 65 72 31 2d 36 2e 32 20 7b 0a 20 20 43 52 45  ger1-6.2 {.  CRE
7b50: 41 54 45 20 54 41 42 4c 45 20 74 31 31 28 61 2c  ATE TABLE t11(a,
7b60: 20 62 29 0a 7d 20 7b 31 20 7b 64 61 74 61 62 61   b).} {1 {databa
7b70: 73 65 20 6f 72 20 64 69 73 6b 20 69 73 20 66 75  se or disk is fu
7b80: 6c 6c 7d 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  ll}}.do_execsql_
7b90: 74 65 73 74 20 70 61 67 65 72 31 2d 36 2e 34 20  test pager1-6.4 
7ba0: 7b 20 50 52 41 47 4d 41 20 6d 61 78 5f 70 61 67  { PRAGMA max_pag
7bb0: 65 5f 63 6f 75 6e 74 20 20 20 20 20 20 7d 20 7b  e_count      } {
7bc0: 31 30 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  10}.do_execsql_t
7bd0: 65 73 74 20 70 61 67 65 72 31 2d 36 2e 35 20 7b  est pager1-6.5 {
7be0: 20 50 52 41 47 4d 41 20 6d 61 78 5f 70 61 67 65   PRAGMA max_page
7bf0: 5f 63 6f 75 6e 74 20 3d 20 31 35 20 7d 20 7b 31  _count = 15 } {1
7c00: 35 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  5}.do_execsql_te
7c10: 73 74 20 70 61 67 65 72 31 2d 36 2e 36 20 7b 20  st pager1-6.6 { 
7c20: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 31  CREATE TABLE t11
7c30: 28 61 2c 20 62 29 20 20 20 20 20 7d 20 7b 7d 0a  (a, b)     } {}.
7c40: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
7c50: 70 61 67 65 72 31 2d 36 2e 37 20 7b 0a 20 20 42  pager1-6.7 {.  B
7c60: 45 47 49 4e 3b 0a 20 20 20 20 49 4e 53 45 52 54  EGIN;.    INSERT
7c70: 20 49 4e 54 4f 20 74 31 31 20 56 41 4c 55 45 53   INTO t11 VALUES
7c80: 28 31 2c 20 32 29 3b 0a 20 20 20 20 50 52 41 47  (1, 2);.    PRAG
7c90: 4d 41 20 6d 61 78 5f 70 61 67 65 5f 63 6f 75 6e  MA max_page_coun
7ca0: 74 20 3d 20 31 33 3b 0a 7d 20 7b 31 33 7d 0a 64  t = 13;.} {13}.d
7cb0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70  o_execsql_test p
7cc0: 61 67 65 72 31 2d 36 2e 38 20 7b 0a 20 20 20 20  ager1-6.8 {.    
7cd0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 31 20  INSERT INTO t11 
7ce0: 56 41 4c 55 45 53 28 33 2c 20 34 29 3b 0a 20 20  VALUES(3, 4);.  
7cf0: 20 20 50 52 41 47 4d 41 20 6d 61 78 5f 70 61 67    PRAGMA max_pag
7d00: 65 5f 63 6f 75 6e 74 20 3d 20 31 30 3b 0a 7d 20  e_count = 10;.} 
7d10: 7b 31 31 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  {11}.do_execsql_
7d20: 74 65 73 74 20 70 61 67 65 72 31 2d 36 2e 39 20  test pager1-6.9 
7d30: 7b 20 43 4f 4d 4d 49 54 20 7d 20 7b 7d 0a 0a 0a  { COMMIT } {}...
7d40: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
7d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7d70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 65  ----------.# The
7d90: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74 73   following tests
7da0: 20 77 6f 72 6b 20 77 69 74 68 20 22 50 52 41 47   work with "PRAG
7db0: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  MA journal_mode=
7dc0: 54 52 55 4e 43 41 54 45 22 20 61 6e 64 0a 23 20  TRUNCATE" and.# 
7dd0: 22 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f  "PRAGMA locking_
7de0: 6d 6f 64 65 3d 45 58 43 4c 55 53 49 56 45 22 2e  mode=EXCLUSIVE".
7df0: 0a 23 0a 23 20 45 61 63 68 20 74 65 73 74 20 69  .#.# Each test i
7e00: 73 20 73 70 65 63 69 66 69 65 64 20 77 69 74 68  s specified with
7e10: 20 35 20 76 61 72 69 61 62 6c 65 73 2e 20 41 73   5 variables. As
7e20: 20 66 6f 6c 6c 6f 77 73 3a 0a 23 0a 23 20 20 20   follows:.#.#   
7e30: 24 74 6e 3a 20 20 54 65 73 74 20 4e 75 6d 62 65  $tn:  Test Numbe
7e40: 72 2e 20 55 73 65 64 20 61 73 20 70 61 72 74 20  r. Used as part 
7e50: 6f 66 20 74 68 65 20 5b 64 6f 5f 74 65 73 74 5d  of the [do_test]
7e60: 20 74 65 73 74 20 6e 61 6d 65 73 2e 0a 23 20 20   test names..#  
7e70: 20 24 73 71 6c 3a 20 53 51 4c 20 74 6f 20 65 78   $sql: SQL to ex
7e80: 65 63 75 74 65 2e 0a 23 20 20 20 24 72 65 73 3a  ecute..#   $res:
7e90: 20 45 78 70 65 63 74 65 64 20 72 65 73 75 6c 74   Expected result
7ea0: 20 6f 66 20 65 78 65 63 75 74 69 6e 67 20 24 73   of executing $s
7eb0: 71 6c 2e 0a 23 20 20 20 24 6a 73 3a 20 20 54 68  ql..#   $js:  Th
7ec0: 65 20 65 78 70 65 63 74 65 64 20 73 69 7a 65 20  e expected size 
7ed0: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
7ee0: 69 6c 65 2c 20 69 6e 20 62 79 74 65 73 2c 20 61  ile, in bytes, a
7ef0: 66 74 65 72 20 65 78 65 63 75 74 69 6e 67 0a 23  fter executing.#
7f00: 20 20 20 20 20 20 20 20 20 74 68 65 20 53 51 4c           the SQL
7f10: 20 73 63 72 69 70 74 2e 20 4f 72 20 2d 31 20 69   script. Or -1 i
7f20: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  f the journal is
7f30: 20 6e 6f 74 20 65 78 70 65 63 74 65 64 20 74 6f   not expected to
7f40: 20 65 78 69 73 74 2e 0a 23 20 20 20 24 77 73 3a   exist..#   $ws:
7f50: 20 20 54 68 65 20 65 78 70 65 63 74 65 64 20 73    The expected s
7f60: 69 7a 65 20 6f 66 20 74 68 65 20 57 41 4c 20 66  ize of the WAL f
7f70: 69 6c 65 2c 20 69 6e 20 62 79 74 65 73 2c 20 61  ile, in bytes, a
7f80: 66 74 65 72 20 65 78 65 63 75 74 69 6e 67 0a 23  fter executing.#
7f90: 20 20 20 20 20 20 20 20 20 74 68 65 20 53 51 4c           the SQL
7fa0: 20 73 63 72 69 70 74 2e 20 4f 72 20 2d 31 20 69   script. Or -1 i
7fb0: 66 20 74 68 65 20 57 41 4c 20 69 73 20 6e 6f 74  f the WAL is not
7fc0: 20 65 78 70 65 63 74 65 64 20 74 6f 20 65 78 69   expected to exi
7fd0: 73 74 2e 0a 23 0a 69 66 63 61 70 61 62 6c 65 20  st..#.ifcapable 
7fe0: 77 61 6c 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d  wal {.  faultsim
7ff0: 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70  _delete_and_reop
8000: 65 6e 0a 20 20 66 6f 72 65 61 63 68 20 7b 74 6e  en.  foreach {tn
8010: 20 73 71 6c 20 72 65 73 20 6a 73 20 77 73 7d 20   sql res js ws} 
8020: 5b 73 75 62 73 74 20 7b 0a 20 20 0a 20 20 20 20  [subst {.  .    
8030: 31 20 20 7b 0a 20 20 20 20 20 20 43 52 45 41 54  1  {.      CREAT
8040: 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29  E TABLE t1(a, b)
8050: 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 61  ;.      PRAGMA a
8060: 75 74 6f 5f 76 61 63 75 75 6d 3d 4f 46 46 3b 0a  uto_vacuum=OFF;.
8070: 20 20 20 20 20 20 50 52 41 47 4d 41 20 73 79 6e        PRAGMA syn
8080: 63 68 72 6f 6e 6f 75 73 3d 4e 4f 52 4d 41 4c 3b  chronous=NORMAL;
8090: 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 70 61  .      PRAGMA pa
80a0: 67 65 5f 73 69 7a 65 3d 31 30 32 34 3b 0a 20 20  ge_size=1024;.  
80b0: 20 20 20 20 50 52 41 47 4d 41 20 6c 6f 63 6b 69      PRAGMA locki
80c0: 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55 53 49 56  ng_mode=EXCLUSIV
80d0: 45 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20  E;.      PRAGMA 
80e0: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 54 52 55  journal_mode=TRU
80f0: 4e 43 41 54 45 3b 0a 20 20 20 20 20 20 49 4e 53  NCATE;.      INS
8100: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
8110: 45 53 28 31 2c 20 32 29 3b 0a 20 20 20 20 7d 20  ES(1, 2);.    } 
8120: 7b 65 78 63 6c 75 73 69 76 65 20 74 72 75 6e 63  {exclusive trunc
8130: 61 74 65 7d 20 30 20 2d 31 0a 20 20 0a 20 20 20  ate} 0 -1.  .   
8140: 20 32 20 20 7b 0a 20 20 20 20 20 20 42 45 47 49   2  {.      BEGI
8150: 4e 20 49 4d 4d 45 44 49 41 54 45 3b 0a 20 20 20  N IMMEDIATE;.   
8160: 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52       SELECT * FR
8170: 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20 43 4f 4d  OM t1;.      COM
8180: 4d 49 54 3b 0a 20 20 20 20 7d 20 7b 31 20 32 7d  MIT;.    } {1 2}
8190: 20 30 20 2d 31 0a 20 20 0a 20 20 20 20 33 20 20   0 -1.  .    3  
81a0: 7b 0a 20 20 20 20 20 20 42 45 47 49 4e 3b 0a 20  {.      BEGIN;. 
81b0: 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20         SELECT * 
81c0: 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20 43  FROM t1;.      C
81d0: 4f 4d 4d 49 54 3b 0a 20 20 20 20 7d 20 7b 31 20  OMMIT;.    } {1 
81e0: 32 7d 20 30 20 2d 31 0a 20 20 0a 20 20 20 20 34  2} 0 -1.  .    4
81f0: 20 20 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e    { PRAGMA journ
8200: 61 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c 20 7d 20  al_mode = WAL } 
8210: 20 20 20 77 61 6c 20 20 20 20 2d 31 20 2d 31 0a     wal    -1 -1.
8220: 20 20 20 20 35 20 20 7b 20 49 4e 53 45 52 54 20      5  { INSERT 
8230: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 33  INTO t1 VALUES(3
8240: 2c 20 34 29 20 7d 20 20 7b 7d 20 20 20 20 20 2d  , 4) }  {}     -
8250: 31 20 5b 77 61 6c 5f 66 69 6c 65 5f 73 69 7a 65  1 [wal_file_size
8260: 20 31 20 31 30 32 34 5d 0a 20 20 20 20 36 20 20   1 1024].    6  
8270: 7b 20 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67  { PRAGMA locking
8280: 5f 6d 6f 64 65 20 3d 20 4e 4f 52 4d 41 4c 20 7d  _mode = NORMAL }
8290: 20 6e 6f 72 6d 61 6c 20 2d 31 20 5b 77 61 6c 5f   normal -1 [wal_
82a0: 66 69 6c 65 5f 73 69 7a 65 20 31 20 31 30 32 34  file_size 1 1024
82b0: 5d 0a 20 20 20 20 37 20 20 7b 20 49 4e 53 45 52  ].    7  { INSER
82c0: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
82d0: 28 35 2c 20 36 29 3b 20 7d 20 7b 7d 20 20 20 20  (5, 6); } {}    
82e0: 20 2d 31 20 5b 77 61 6c 5f 66 69 6c 65 5f 73 69   -1 [wal_file_si
82f0: 7a 65 20 32 20 31 30 32 34 5d 0a 20 20 0a 20 20  ze 2 1024].  .  
8300: 20 20 38 20 20 7b 20 50 52 41 47 4d 41 20 6a 6f    8  { PRAGMA jo
8310: 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 54 52 55  urnal_mode = TRU
8320: 4e 43 41 54 45 20 7d 20 74 72 75 6e 63 61 74 65  NCATE } truncate
8330: 20 20 20 20 20 20 20 20 20 20 30 20 2d 31 0a 20            0 -1. 
8340: 20 20 20 39 20 20 7b 20 49 4e 53 45 52 54 20 49     9  { INSERT I
8350: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 37 2c  NTO t1 VALUES(7,
8360: 20 38 29 20 7d 20 20 20 20 7b 7d 20 20 20 20 20   8) }    {}     
8370: 20 20 20 20 20 20 20 20 20 20 20 30 20 2d 31 0a             0 -1.
8380: 20 20 20 20 31 30 20 7b 20 53 45 4c 45 43 54 20      10 { SELECT 
8390: 2a 20 46 52 4f 4d 20 74 31 20 7d 20 20 20 20 20  * FROM t1 }     
83a0: 20 20 20 20 20 20 20 20 20 20 7b 31 20 32 20 33            {1 2 3
83b0: 20 34 20 35 20 36 20 37 20 38 7d 20 30 20 2d 31   4 5 6 7 8} 0 -1
83c0: 0a 20 20 0a 20 20 7d 5d 20 7b 0a 20 20 20 20 64  .  .  }] {.    d
83d0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70  o_execsql_test p
83e0: 61 67 65 72 31 2d 37 2e 31 2e 24 74 6e 2e 31 20  ager1-7.1.$tn.1 
83f0: 24 73 71 6c 20 24 72 65 73 0a 20 20 20 20 63 61  $sql $res.    ca
8400: 74 63 68 20 7b 20 73 65 74 20 4a 20 2d 31 20 3b  tch { set J -1 ;
8410: 20 73 65 74 20 4a 20 5b 66 69 6c 65 20 73 69 7a   set J [file siz
8420: 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61  e test.db-journa
8430: 6c 5d 20 7d 0a 20 20 20 20 63 61 74 63 68 20 7b  l] }.    catch {
8440: 20 73 65 74 20 57 20 2d 31 20 3b 20 73 65 74 20   set W -1 ; set 
8450: 57 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73  W [file size tes
8460: 74 2e 64 62 2d 77 61 6c 5d 20 7d 0a 20 20 20 20  t.db-wal] }.    
8470: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 37  do_test pager1-7
8480: 2e 31 2e 24 74 6e 2e 32 20 7b 20 6c 69 73 74 20  .1.$tn.2 { list 
8490: 24 4a 20 24 57 20 7d 20 5b 6c 69 73 74 20 24 6a  $J $W } [list $j
84a0: 73 20 24 77 73 5d 0a 20 20 7d 0a 7d 0a 0a 64 6f  s $ws].  }.}..do
84b0: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 37 2e 32  _test pager1-7.2
84c0: 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f  .1 {.  faultsim_
84d0: 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65  delete_and_reope
84e0: 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  n.  execsql {.  
84f0: 20 20 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67    PRAGMA locking
8500: 5f 6d 6f 64 65 20 3d 20 45 58 43 4c 55 53 49 56  _mode = EXCLUSIV
8510: 45 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  E;.    CREATE TA
8520: 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20  BLE t1(a, b);.  
8530: 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 50    BEGIN;.      P
8540: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
8550: 64 65 20 3d 20 64 65 6c 65 74 65 3b 0a 20 20 20  de = delete;.   
8560: 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61     PRAGMA journa
8570: 6c 5f 6d 6f 64 65 20 3d 20 74 72 75 6e 63 61 74  l_mode = truncat
8580: 65 3b 0a 20 20 7d 0a 7d 20 7b 65 78 63 6c 75 73  e;.  }.} {exclus
8590: 69 76 65 20 64 65 6c 65 74 65 20 74 72 75 6e 63  ive delete trunc
85a0: 61 74 65 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67  ate}.do_test pag
85b0: 65 72 31 2d 37 2e 32 2e 32 20 7b 0a 20 20 65 78  er1-7.2.2 {.  ex
85c0: 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49  ecsql { INSERT I
85d0: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c  NTO t1 VALUES(1,
85e0: 20 32 29 20 7d 0a 20 20 65 78 65 63 73 71 6c 20   2) }.  execsql 
85f0: 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c  { PRAGMA journal
8600: 5f 6d 6f 64 65 20 3d 20 70 65 72 73 69 73 74 20  _mode = persist 
8610: 7d 0a 7d 20 7b 74 72 75 6e 63 61 74 65 7d 0a 64  }.} {truncate}.d
8620: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 37 2e  o_test pager1-7.
8630: 32 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  2.3 {.  execsql 
8640: 7b 20 43 4f 4d 4d 49 54 20 7d 0a 20 20 65 78 65  { COMMIT }.  exe
8650: 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d  csql {.    PRAGM
8660: 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d  A journal_mode =
8670: 20 70 65 72 73 69 73 74 3b 0a 20 20 20 20 50 52   persist;.    PR
8680: 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 73 69 7a  AGMA journal_siz
8690: 65 5f 6c 69 6d 69 74 3b 0a 20 20 7d 0a 7d 20 7b  e_limit;.  }.} {
86a0: 70 65 72 73 69 73 74 20 2d 31 7d 0a 0a 23 2d 2d  persist -1}..#--
86b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
86c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
86d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
86e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
86f0: 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 65 20 66 6f  -------.# The fo
8700: 6c 6c 6f 77 69 6e 67 20 74 65 73 74 73 2c 20 70  llowing tests, p
8710: 61 67 65 72 31 2d 38 2e 2a 2c 20 74 65 73 74 20  ager1-8.*, test 
8720: 74 68 61 74 20 74 68 65 20 73 70 65 63 69 61 6c  that the special
8730: 20 66 69 6c 65 6e 61 6d 65 73 20 0a 23 20 22 3a   filenames .# ":
8740: 6d 65 6d 6f 72 79 3a 22 20 61 6e 64 20 22 22 20  memory:" and "" 
8750: 6f 70 65 6e 20 74 65 6d 70 6f 72 61 72 79 20 64  open temporary d
8760: 61 74 61 62 61 73 65 73 2e 0a 23 0a 66 6f 72 65  atabases..#.fore
8770: 61 63 68 20 7b 74 6e 20 66 69 6c 65 6e 61 6d 65  ach {tn filename
8780: 7d 20 7b 0a 20 20 31 20 3a 6d 65 6d 6f 72 79 3a  } {.  1 :memory:
8790: 0a 20 20 32 20 22 22 0a 7d 20 7b 0a 20 20 64 6f  .  2 "".} {.  do
87a0: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 38 2e 24  _test pager1-8.$
87b0: 74 6e 2e 31 20 7b 0a 20 20 20 20 66 61 75 6c 74  tn.1 {.    fault
87c0: 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72  sim_delete_and_r
87d0: 65 6f 70 65 6e 0a 20 20 20 20 64 62 20 63 6c 6f  eopen.    db clo
87e0: 73 65 0a 20 20 20 20 73 71 6c 69 74 65 33 20 64  se.    sqlite3 d
87f0: 62 20 24 66 69 6c 65 6e 61 6d 65 0a 20 20 20 20  b $filename.    
8800: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20  execsql {.      
8810: 50 52 41 47 4d 41 20 61 75 74 6f 5f 76 61 63 75  PRAGMA auto_vacu
8820: 75 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 43 52  um = 1;.      CR
8830: 45 41 54 45 20 54 41 42 4c 45 20 78 31 28 78 29  EATE TABLE x1(x)
8840: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
8850: 4e 54 4f 20 78 31 20 56 41 4c 55 45 53 28 27 43  NTO x1 VALUES('C
8860: 68 61 72 6c 65 73 27 29 3b 0a 20 20 20 20 20 20  harles');.      
8870: 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 31 20 56  INSERT INTO x1 V
8880: 41 4c 55 45 53 28 27 4a 61 6d 65 73 27 29 3b 0a  ALUES('James');.
8890: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
88a0: 4f 20 78 31 20 56 41 4c 55 45 53 28 27 4d 61 72  O x1 VALUES('Mar
88b0: 79 27 29 3b 0a 20 20 20 20 20 20 53 45 4c 45 43  y');.      SELEC
88c0: 54 20 2a 20 46 52 4f 4d 20 78 31 3b 0a 20 20 20  T * FROM x1;.   
88d0: 20 7d 0a 20 20 7d 20 7b 43 68 61 72 6c 65 73 20   }.  } {Charles 
88e0: 4a 61 6d 65 73 20 4d 61 72 79 7d 0a 0a 20 20 64  James Mary}..  d
88f0: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 38 2e  o_test pager1-8.
8900: 24 74 6e 2e 32 20 7b 0a 20 20 20 20 73 71 6c 69  $tn.2 {.    sqli
8910: 74 65 33 20 64 62 32 20 24 66 69 6c 65 6e 61 6d  te3 db2 $filenam
8920: 65 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b  e.    catchsql {
8930: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 78   SELECT * FROM x
8940: 31 20 7d 20 64 62 32 0a 20 20 7d 20 7b 31 20 7b  1 } db2.  } {1 {
8950: 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20 78  no such table: x
8960: 31 7d 7d 0a 0a 20 20 64 6f 5f 65 78 65 63 73 71  1}}..  do_execsq
8970: 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 38 2e  l_test pager1-8.
8980: 24 74 6e 2e 33 20 7b 0a 20 20 20 20 42 45 47 49  $tn.3 {.    BEGI
8990: 4e 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  N;.      INSERT 
89a0: 49 4e 54 4f 20 78 31 20 56 41 4c 55 45 53 28 27  INTO x1 VALUES('
89b0: 57 69 6c 6c 69 61 6d 27 29 3b 0a 20 20 20 20 20  William');.     
89c0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 31 20   INSERT INTO x1 
89d0: 56 41 4c 55 45 53 28 27 41 6e 6e 65 27 29 3b 0a  VALUES('Anne');.
89e0: 20 20 20 20 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20      ROLLBACK;.  
89f0: 7d 20 7b 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d  } {}.}..#-------
8a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8a10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8a20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8a40: 2d 2d 0a 23 20 54 68 65 20 6e 65 78 74 20 62 6c  --.# The next bl
8a50: 6f 63 6b 20 6f 66 20 74 65 73 74 73 20 2d 20 70  ock of tests - p
8a60: 61 67 65 72 31 2d 39 2e 2a 20 2d 20 64 65 61 6c  ager1-9.* - deal
8a70: 20 77 69 74 68 20 69 6e 74 65 72 61 63 74 69 6f   with interactio
8a80: 6e 73 20 62 65 74 77 65 65 6e 0a 23 20 74 68 65  ns between.# the
8a90: 20 70 61 67 65 72 20 61 6e 64 20 74 68 65 20 62   pager and the b
8aa0: 61 63 6b 75 70 20 41 50 49 2e 20 54 65 73 74 20  ackup API. Test 
8ab0: 63 61 73 65 73 3a 0a 23 0a 23 20 20 20 70 61 67  cases:.#.#   pag
8ac0: 65 72 31 2d 39 2e 31 2e 2a 3a 20 54 65 73 74 20  er1-9.1.*: Test 
8ad0: 74 68 61 74 20 61 20 62 61 63 6b 75 70 20 63 6f  that a backup co
8ae0: 6d 70 6c 65 74 65 73 20 73 75 63 63 65 73 73 66  mpletes successf
8af0: 75 6c 6c 79 20 65 76 65 6e 20 69 66 20 74 68 65  ully even if the
8b00: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
8b10: 20 20 20 73 6f 75 72 63 65 20 64 62 20 69 73 20     source db is 
8b20: 77 72 69 74 74 65 6e 20 74 6f 20 64 75 72 69 6e  written to durin
8b30: 67 20 74 68 65 20 62 61 63 6b 75 70 20 6f 70 2e  g the backup op.
8b40: 0a 23 0a 23 20 20 20 70 61 67 65 72 31 2d 39 2e  .#.#   pager1-9.
8b50: 32 2e 2a 3a 20 54 65 73 74 20 74 68 61 74 20 61  2.*: Test that a
8b60: 20 62 61 63 6b 75 70 20 63 6f 6d 70 6c 65 74 65   backup complete
8b70: 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 65  s successfully e
8b80: 76 65 6e 20 69 66 20 74 68 65 0a 23 20 20 20 20  ven if the.#    
8b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 6f 75               sou
8ba0: 72 63 65 20 64 62 20 69 73 20 77 72 69 74 74 65  rce db is writte
8bb0: 6e 20 74 6f 20 61 6e 64 20 74 68 65 6e 20 72 6f  n to and then ro
8bc0: 6c 6c 65 64 20 62 61 63 6b 20 64 75 72 69 6e 67  lled back during
8bd0: 20 61 20 0a 23 20 20 20 20 20 20 20 20 20 20 20   a .#           
8be0: 20 20 20 20 20 20 62 61 63 6b 75 70 20 6f 70 65        backup ope
8bf0: 72 61 74 69 6f 6e 2e 0a 23 0a 64 6f 5f 74 65 73  ration..#.do_tes
8c00: 74 20 70 61 67 65 72 31 2d 39 2e 30 2e 31 20 7b  t pager1-9.0.1 {
8c10: 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65  .  faultsim_dele
8c20: 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20  te_and_reopen.  
8c30: 64 62 20 66 75 6e 63 20 61 5f 73 74 72 69 6e 67  db func a_string
8c40: 20 61 5f 73 74 72 69 6e 67 0a 20 20 65 78 65 63   a_string.  exec
8c50: 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41  sql {.    PRAGMA
8c60: 20 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 31 30   cache_size = 10
8c70: 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20  ;.    BEGIN;.   
8c80: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
8c90: 61 62 28 61 2c 20 62 2c 20 55 4e 49 51 55 45 28  ab(a, b, UNIQUE(
8ca0: 61 2c 20 62 29 29 3b 0a 20 20 20 20 20 20 49 4e  a, b));.      IN
8cb0: 53 45 52 54 20 49 4e 54 4f 20 61 62 20 56 41 4c  SERT INTO ab VAL
8cc0: 55 45 53 28 20 61 5f 73 74 72 69 6e 67 28 32 30  UES( a_string(20
8cd0: 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 33 30 30  0), a_string(300
8ce0: 29 20 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  ) );.      INSER
8cf0: 54 20 49 4e 54 4f 20 61 62 20 53 45 4c 45 43 54  T INTO ab SELECT
8d00: 20 61 5f 73 74 72 69 6e 67 28 32 30 30 29 2c 20   a_string(200), 
8d10: 61 5f 73 74 72 69 6e 67 28 33 30 30 29 20 46 52  a_string(300) FR
8d20: 4f 4d 20 61 62 3b 0a 20 20 20 20 20 20 49 4e 53  OM ab;.      INS
8d30: 45 52 54 20 49 4e 54 4f 20 61 62 20 53 45 4c 45  ERT INTO ab SELE
8d40: 43 54 20 61 5f 73 74 72 69 6e 67 28 32 30 30 29  CT a_string(200)
8d50: 2c 20 61 5f 73 74 72 69 6e 67 28 33 30 30 29 20  , a_string(300) 
8d60: 46 52 4f 4d 20 61 62 3b 0a 20 20 20 20 20 20 49  FROM ab;.      I
8d70: 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 20 53 45  NSERT INTO ab SE
8d80: 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 32 30  LECT a_string(20
8d90: 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 33 30 30  0), a_string(300
8da0: 29 20 46 52 4f 4d 20 61 62 3b 0a 20 20 20 20 20  ) FROM ab;.     
8db0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 20   INSERT INTO ab 
8dc0: 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28  SELECT a_string(
8dd0: 32 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 33  200), a_string(3
8de0: 30 30 29 20 46 52 4f 4d 20 61 62 3b 0a 20 20 20  00) FROM ab;.   
8df0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61     INSERT INTO a
8e00: 62 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e  b SELECT a_strin
8e10: 67 28 32 30 30 29 2c 20 61 5f 73 74 72 69 6e 67  g(200), a_string
8e20: 28 33 30 30 29 20 46 52 4f 4d 20 61 62 3b 0a 20  (300) FROM ab;. 
8e30: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
8e40: 20 61 62 20 53 45 4c 45 43 54 20 61 5f 73 74 72   ab SELECT a_str
8e50: 69 6e 67 28 32 30 30 29 2c 20 61 5f 73 74 72 69  ing(200), a_stri
8e60: 6e 67 28 33 30 30 29 20 46 52 4f 4d 20 61 62 3b  ng(300) FROM ab;
8e70: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
8e80: 54 4f 20 61 62 20 53 45 4c 45 43 54 20 61 5f 73  TO ab SELECT a_s
8e90: 74 72 69 6e 67 28 32 30 30 29 2c 20 61 5f 73 74  tring(200), a_st
8ea0: 72 69 6e 67 28 33 30 30 29 20 46 52 4f 4d 20 61  ring(300) FROM a
8eb0: 62 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20  b;.    COMMIT;. 
8ec0: 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20   }.} {}.do_test 
8ed0: 70 61 67 65 72 31 2d 39 2e 30 2e 32 20 7b 0a 20  pager1-9.0.2 {. 
8ee0: 20 73 71 6c 69 74 65 33 20 64 62 32 20 74 65 73   sqlite3 db2 tes
8ef0: 74 2e 64 62 32 0a 20 20 64 62 32 20 65 76 61 6c  t.db2.  db2 eval
8f00: 20 7b 20 50 52 41 47 4d 41 20 63 61 63 68 65 5f   { PRAGMA cache_
8f10: 73 69 7a 65 20 3d 20 31 30 20 7d 0a 20 20 73 71  size = 10 }.  sq
8f20: 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 42 20 64  lite3_backup B d
8f30: 62 32 20 6d 61 69 6e 20 64 62 20 6d 61 69 6e 0a  b2 main db main.
8f40: 20 20 6c 69 73 74 20 5b 42 20 73 74 65 70 20 31    list [B step 1
8f50: 30 30 30 30 5d 20 5b 42 20 66 69 6e 69 73 68 5d  0000] [B finish]
8f60: 0a 7d 20 7b 53 51 4c 49 54 45 5f 44 4f 4e 45 20  .} {SQLITE_DONE 
8f70: 53 51 4c 49 54 45 5f 4f 4b 7d 0a 64 6f 5f 74 65  SQLITE_OK}.do_te
8f80: 73 74 20 70 61 67 65 72 31 2d 39 2e 30 2e 33 20  st pager1-9.0.3 
8f90: 7b 0a 20 64 62 20 6f 6e 65 20 7b 53 45 4c 45 43  {. db one {SELEC
8fa0: 54 20 6d 64 35 73 75 6d 28 61 2c 20 62 29 20 46  T md5sum(a, b) F
8fb0: 52 4f 4d 20 61 62 7d 0a 7d 20 5b 64 62 32 20 6f  ROM ab}.} [db2 o
8fc0: 6e 65 20 7b 53 45 4c 45 43 54 20 6d 64 35 73 75  ne {SELECT md5su
8fd0: 6d 28 61 2c 20 62 29 20 46 52 4f 4d 20 61 62 7d  m(a, b) FROM ab}
8fe0: 5d 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  ]..do_test pager
8ff0: 31 2d 39 2e 31 2e 31 20 7b 0a 20 20 65 78 65 63  1-9.1.1 {.  exec
9000: 73 71 6c 20 7b 20 55 50 44 41 54 45 20 61 62 20  sql { UPDATE ab 
9010: 53 45 54 20 61 20 3d 20 61 5f 73 74 72 69 6e 67  SET a = a_string
9020: 28 32 30 31 29 20 7d 0a 20 20 73 71 6c 69 74 65  (201) }.  sqlite
9030: 33 5f 62 61 63 6b 75 70 20 42 20 64 62 32 20 6d  3_backup B db2 m
9040: 61 69 6e 20 64 62 20 6d 61 69 6e 0a 20 20 42 20  ain db main.  B 
9050: 73 74 65 70 20 33 30 0a 7d 20 7b 53 51 4c 49 54  step 30.} {SQLIT
9060: 45 5f 4f 4b 7d 0a 64 6f 5f 74 65 73 74 20 70 61  E_OK}.do_test pa
9070: 67 65 72 31 2d 39 2e 31 2e 32 20 7b 0a 20 20 65  ger1-9.1.2 {.  e
9080: 78 65 63 73 71 6c 20 7b 20 55 50 44 41 54 45 20  xecsql { UPDATE 
9090: 61 62 20 53 45 54 20 62 20 3d 20 61 5f 73 74 72  ab SET b = a_str
90a0: 69 6e 67 28 33 30 31 29 20 7d 0a 20 20 6c 69 73  ing(301) }.  lis
90b0: 74 20 5b 42 20 73 74 65 70 20 31 30 30 30 30 5d  t [B step 10000]
90c0: 20 5b 42 20 66 69 6e 69 73 68 5d 0a 7d 20 7b 53   [B finish].} {S
90d0: 51 4c 49 54 45 5f 44 4f 4e 45 20 53 51 4c 49 54  QLITE_DONE SQLIT
90e0: 45 5f 4f 4b 7d 0a 64 6f 5f 74 65 73 74 20 70 61  E_OK}.do_test pa
90f0: 67 65 72 31 2d 39 2e 31 2e 33 20 7b 0a 20 64 62  ger1-9.1.3 {. db
9100: 20 6f 6e 65 20 7b 53 45 4c 45 43 54 20 6d 64 35   one {SELECT md5
9110: 73 75 6d 28 61 2c 20 62 29 20 46 52 4f 4d 20 61  sum(a, b) FROM a
9120: 62 7d 0a 7d 20 5b 64 62 32 20 6f 6e 65 20 7b 53  b}.} [db2 one {S
9130: 45 4c 45 43 54 20 6d 64 35 73 75 6d 28 61 2c 20  ELECT md5sum(a, 
9140: 62 29 20 46 52 4f 4d 20 61 62 7d 5d 0a 64 6f 5f  b) FROM ab}].do_
9150: 74 65 73 74 20 70 61 67 65 72 31 2d 39 2e 31 2e  test pager1-9.1.
9160: 34 20 7b 20 65 78 65 63 73 71 6c 20 7b 20 53 45  4 { execsql { SE
9170: 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
9180: 4f 4d 20 61 62 20 7d 20 7d 20 7b 31 32 38 7d 0a  OM ab } } {128}.
9190: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
91a0: 39 2e 32 2e 31 20 7b 0a 20 20 65 78 65 63 73 71  9.2.1 {.  execsq
91b0: 6c 20 7b 20 55 50 44 41 54 45 20 61 62 20 53 45  l { UPDATE ab SE
91c0: 54 20 61 20 3d 20 61 5f 73 74 72 69 6e 67 28 32  T a = a_string(2
91d0: 30 32 29 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  02) }.  sqlite3_
91e0: 62 61 63 6b 75 70 20 42 20 64 62 32 20 6d 61 69  backup B db2 mai
91f0: 6e 20 64 62 20 6d 61 69 6e 0a 20 20 42 20 73 74  n db main.  B st
9200: 65 70 20 33 30 0a 7d 20 7b 53 51 4c 49 54 45 5f  ep 30.} {SQLITE_
9210: 4f 4b 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  OK}.do_test page
9220: 72 31 2d 39 2e 32 2e 32 20 7b 0a 20 20 65 78 65  r1-9.2.2 {.  exe
9230: 63 73 71 6c 20 7b 20 0a 20 20 20 20 42 45 47 49  csql { .    BEGI
9240: 4e 3b 0a 20 20 20 20 20 20 55 50 44 41 54 45 20  N;.      UPDATE 
9250: 61 62 20 53 45 54 20 62 20 3d 20 61 5f 73 74 72  ab SET b = a_str
9260: 69 6e 67 28 33 30 31 29 3b 0a 20 20 20 20 52 4f  ing(301);.    RO
9270: 4c 4c 42 41 43 4b 3b 0a 20 20 7d 0a 20 20 6c 69  LLBACK;.  }.  li
9280: 73 74 20 5b 42 20 73 74 65 70 20 31 30 30 30 30  st [B step 10000
9290: 5d 20 5b 42 20 66 69 6e 69 73 68 5d 0a 7d 20 7b  ] [B finish].} {
92a0: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 53 51 4c 49  SQLITE_DONE SQLI
92b0: 54 45 5f 4f 4b 7d 0a 64 6f 5f 74 65 73 74 20 70  TE_OK}.do_test p
92c0: 61 67 65 72 31 2d 39 2e 32 2e 33 20 7b 0a 20 64  ager1-9.2.3 {. d
92d0: 62 20 6f 6e 65 20 7b 53 45 4c 45 43 54 20 6d 64  b one {SELECT md
92e0: 35 73 75 6d 28 61 2c 20 62 29 20 46 52 4f 4d 20  5sum(a, b) FROM 
92f0: 61 62 7d 0a 7d 20 5b 64 62 32 20 6f 6e 65 20 7b  ab}.} [db2 one {
9300: 53 45 4c 45 43 54 20 6d 64 35 73 75 6d 28 61 2c  SELECT md5sum(a,
9310: 20 62 29 20 46 52 4f 4d 20 61 62 7d 5d 0a 64 6f   b) FROM ab}].do
9320: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 39 2e 32  _test pager1-9.2
9330: 2e 34 20 7b 20 65 78 65 63 73 71 6c 20 7b 20 53  .4 { execsql { S
9340: 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
9350: 52 4f 4d 20 61 62 20 7d 20 7d 20 7b 31 32 38 7d  ROM ab } } {128}
9360: 0a 64 62 20 63 6c 6f 73 65 0a 64 62 32 20 63 6c  .db close.db2 cl
9370: 6f 73 65 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ose..#----------
9380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
93a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
93b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
93c0: 23 20 54 65 73 74 20 74 68 61 74 20 72 65 67 61  # Test that rega
93d0: 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 76 61  rdless of the va
93e0: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
93f0: 78 53 65 63 74 6f 72 53 69 7a 65 28 29 2c 20 74  xSectorSize(), t
9400: 68 65 0a 23 20 6d 69 6e 69 6d 75 6d 20 65 66 66  he.# minimum eff
9410: 65 63 74 69 76 65 20 73 65 63 74 6f 72 2d 73 69  ective sector-si
9420: 7a 65 20 69 73 20 35 31 32 20 61 6e 64 20 74 68  ze is 512 and th
9430: 65 20 6d 61 78 69 6d 75 6d 20 36 35 35 33 36 20  e maximum 65536 
9440: 62 79 74 65 73 2e 0a 23 0a 74 65 73 74 76 66 73  bytes..#.testvfs
9450: 20 74 76 20 2d 64 65 66 61 75 6c 74 20 31 0a 66   tv -default 1.f
9460: 6f 72 65 61 63 68 20 73 65 63 74 6f 72 73 69 7a  oreach sectorsiz
9470: 65 20 7b 0a 20 20 20 20 33 32 20 20 20 36 34 20  e {.    32   64 
9480: 20 20 31 32 38 20 20 20 32 35 36 20 20 20 35 31    128   256   51
9490: 32 20 20 20 31 30 32 34 20 20 20 32 30 34 38 20  2   1024   2048 
94a0: 0a 20 20 20 20 34 30 39 36 20 38 31 39 32 20 31  .    4096 8192 1
94b0: 36 33 38 34 20 33 32 37 36 38 20 36 35 35 33 36  6384 32768 65536
94c0: 20 31 33 31 30 37 32 20 32 36 32 31 34 34 0a 7d   131072 262144.}
94d0: 20 7b 0a 20 20 74 76 20 73 65 63 74 6f 72 73 69   {.  tv sectorsi
94e0: 7a 65 20 24 73 65 63 74 6f 72 73 69 7a 65 0a 20  ze $sectorsize. 
94f0: 20 73 65 74 20 65 66 66 20 24 73 65 63 74 6f 72   set eff $sector
9500: 73 69 7a 65 0a 20 20 69 66 20 7b 24 73 65 63 74  size.  if {$sect
9510: 6f 72 73 69 7a 65 20 3c 20 35 31 32 7d 20 20 20  orsize < 512}   
9520: 7b 20 73 65 74 20 65 66 66 20 35 31 32 20 7d 0a  { set eff 512 }.
9530: 20 20 69 66 20 7b 24 73 65 63 74 6f 72 73 69 7a    if {$sectorsiz
9540: 65 20 3e 20 36 35 35 33 36 7d 20 7b 20 73 65 74  e > 65536} { set
9550: 20 65 66 66 20 36 35 35 33 36 20 7d 0a 0a 20 20   eff 65536 }..  
9560: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31  do_test pager1-1
9570: 30 2e 24 73 65 63 74 6f 72 73 69 7a 65 20 7b 0a  0.$sectorsize {.
9580: 20 20 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c      faultsim_del
9590: 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20  ete_and_reopen. 
95a0: 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20     execsql {.   
95b0: 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61     PRAGMA journa
95c0: 6c 5f 6d 6f 64 65 20 3d 20 50 45 52 53 49 53 54  l_mode = PERSIST
95d0: 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 70  ;.      PRAGMA p
95e0: 61 67 65 5f 73 69 7a 65 20 3d 20 31 30 32 34 3b  age_size = 1024;
95f0: 0a 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41  .      CREATE TA
9600: 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20  BLE t1(a, b);.  
9610: 20 20 7d 0a 20 20 20 20 66 69 6c 65 20 73 69 7a    }.    file siz
9620: 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61  e test.db-journa
9630: 6c 0a 20 20 7d 20 5b 65 78 70 72 20 24 73 65 63  l.  } [expr $sec
9640: 74 6f 72 73 69 7a 65 20 3e 20 36 35 35 33 36 20  torsize > 65536 
9650: 3f 20 36 35 35 33 36 20 3a 20 24 73 65 63 74 6f  ? 65536 : $secto
9660: 72 73 69 7a 65 5d 0a 7d 0a 64 62 20 63 6c 6f 73  rsize].}.db clos
9670: 65 0a 74 76 20 64 65 6c 65 74 65 0a 0a 74 65 73  e.tv delete..tes
9680: 74 76 66 73 20 74 76 20 2d 64 65 66 61 75 6c 74  tvfs tv -default
9690: 20 31 0a 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65   1.faultsim_dele
96a0: 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 64 62  te_and_reopen.db
96b0: 20 66 75 6e 63 20 61 5f 73 74 72 69 6e 67 20 61   func a_string a
96c0: 5f 73 74 72 69 6e 67 0a 64 6f 5f 65 78 65 63 73  _string.do_execs
96d0: 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31  ql_test pager1-1
96e0: 31 2e 31 20 7b 0a 20 20 50 52 41 47 4d 41 20 63  1.1 {.  PRAGMA c
96f0: 61 63 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b 0a  ache_size = 10;.
9700: 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 43 52 45    BEGIN;.    CRE
9710: 41 54 45 20 54 41 42 4c 45 20 7a 7a 28 74 6f 70  ATE TABLE zz(top
9720: 20 50 52 49 4d 41 52 59 20 4b 45 59 29 3b 0a 20   PRIMARY KEY);. 
9730: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a     INSERT INTO z
9740: 7a 20 56 41 4c 55 45 53 28 61 5f 73 74 72 69 6e  z VALUES(a_strin
9750: 67 28 32 32 32 29 29 3b 0a 20 20 20 20 49 4e 53  g(222));.    INS
9760: 45 52 54 20 49 4e 54 4f 20 7a 7a 20 53 45 4c 45  ERT INTO zz SELE
9770: 43 54 20 61 5f 73 74 72 69 6e 67 28 28 53 45 4c  CT a_string((SEL
9780: 45 43 54 20 32 32 32 2b 6d 61 78 28 72 6f 77 69  ECT 222+max(rowi
9790: 64 29 20 46 52 4f 4d 20 7a 7a 29 29 20 46 52 4f  d) FROM zz)) FRO
97a0: 4d 20 7a 7a 3b 0a 20 20 20 20 49 4e 53 45 52 54  M zz;.    INSERT
97b0: 20 49 4e 54 4f 20 7a 7a 20 53 45 4c 45 43 54 20   INTO zz SELECT 
97c0: 61 5f 73 74 72 69 6e 67 28 28 53 45 4c 45 43 54  a_string((SELECT
97d0: 20 32 32 32 2b 6d 61 78 28 72 6f 77 69 64 29 20   222+max(rowid) 
97e0: 46 52 4f 4d 20 7a 7a 29 29 20 46 52 4f 4d 20 7a  FROM zz)) FROM z
97f0: 7a 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  z;.    INSERT IN
9800: 54 4f 20 7a 7a 20 53 45 4c 45 43 54 20 61 5f 73  TO zz SELECT a_s
9810: 74 72 69 6e 67 28 28 53 45 4c 45 43 54 20 32 32  tring((SELECT 22
9820: 32 2b 6d 61 78 28 72 6f 77 69 64 29 20 46 52 4f  2+max(rowid) FRO
9830: 4d 20 7a 7a 29 29 20 46 52 4f 4d 20 7a 7a 3b 0a  M zz)) FROM zz;.
9840: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
9850: 7a 7a 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69  zz SELECT a_stri
9860: 6e 67 28 28 53 45 4c 45 43 54 20 32 32 32 2b 6d  ng((SELECT 222+m
9870: 61 78 28 72 6f 77 69 64 29 20 46 52 4f 4d 20 7a  ax(rowid) FROM z
9880: 7a 29 29 20 46 52 4f 4d 20 7a 7a 3b 0a 20 20 20  z)) FROM zz;.   
9890: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a 7a 20   INSERT INTO zz 
98a0: 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28  SELECT a_string(
98b0: 28 53 45 4c 45 43 54 20 32 32 32 2b 6d 61 78 28  (SELECT 222+max(
98c0: 72 6f 77 69 64 29 20 46 52 4f 4d 20 7a 7a 29 29  rowid) FROM zz))
98d0: 20 46 52 4f 4d 20 7a 7a 3b 0a 20 20 43 4f 4d 4d   FROM zz;.  COMM
98e0: 49 54 3b 0a 20 20 42 45 47 49 4e 3b 0a 20 20 20  IT;.  BEGIN;.   
98f0: 20 55 50 44 41 54 45 20 7a 7a 20 53 45 54 20 74   UPDATE zz SET t
9900: 6f 70 20 3d 20 61 5f 73 74 72 69 6e 67 28 33 34  op = a_string(34
9910: 35 29 3b 0a 7d 20 7b 7d 0a 0a 70 72 6f 63 20 6c  5);.} {}..proc l
9920: 6f 63 6b 6f 75 74 20 7b 6d 65 74 68 6f 64 20 61  ockout {method a
9930: 72 67 73 7d 20 7b 20 72 65 74 75 72 6e 20 53 51  rgs} { return SQ
9940: 4c 49 54 45 5f 49 4f 45 52 52 20 7d 0a 74 76 20  LITE_IOERR }.tv 
9950: 73 63 72 69 70 74 20 6c 6f 63 6b 6f 75 74 0a 74  script lockout.t
9960: 76 20 66 69 6c 74 65 72 20 7b 78 57 72 69 74 65  v filter {xWrite
9970: 20 78 54 72 75 6e 63 61 74 65 20 78 53 79 6e 63   xTruncate xSync
9980: 7d 0a 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74 65  }.do_catchsql_te
9990: 73 74 20 70 61 67 65 72 31 2d 31 31 2e 32 20 7b  st pager1-11.2 {
99a0: 20 43 4f 4d 4d 49 54 20 7d 20 7b 31 20 7b 64 69   COMMIT } {1 {di
99b0: 73 6b 20 49 2f 4f 20 65 72 72 6f 72 7d 7d 0a 0a  sk I/O error}}..
99c0: 74 76 20 73 63 72 69 70 74 20 7b 7d 0a 64 6f 5f  tv script {}.do_
99d0: 74 65 73 74 20 70 61 67 65 72 31 2d 31 31 2e 33  test pager1-11.3
99e0: 20 7b 0a 20 20 73 71 6c 69 74 65 33 20 64 62 32   {.  sqlite3 db2
99f0: 20 74 65 73 74 2e 64 62 0a 20 20 65 78 65 63 73   test.db.  execs
9a00: 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20  ql {.    PRAGMA 
9a10: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 54  journal_mode = T
9a20: 52 55 4e 43 41 54 45 3b 0a 20 20 20 20 50 52 41  RUNCATE;.    PRA
9a30: 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68  GMA integrity_ch
9a40: 65 63 6b 3b 0a 20 20 7d 20 64 62 32 0a 7d 20 7b  eck;.  } db2.} {
9a50: 74 72 75 6e 63 61 74 65 20 6f 6b 7d 0a 64 6f 5f  truncate ok}.do_
9a60: 74 65 73 74 20 70 61 67 65 72 31 2d 31 31 2e 34  test pager1-11.4
9a70: 20 7b 0a 20 20 64 62 32 20 63 6c 6f 73 65 0a 20   {.  db2 close. 
9a80: 20 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e   file size test.
9a90: 64 62 2d 6a 6f 75 72 6e 61 6c 0a 7d 20 7b 30 7d  db-journal.} {0}
9aa0: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
9ab0: 20 70 61 67 65 72 31 2d 31 31 2e 35 20 7b 20 53   pager1-11.5 { S
9ac0: 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
9ad0: 52 4f 4d 20 7a 7a 20 7d 20 7b 33 32 7d 0a 64 62  ROM zz } {32}.db
9ae0: 20 63 6c 6f 73 65 0a 74 76 20 64 65 6c 65 74 65   close.tv delete
9af0: 0a 20 20 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .  .#-----------
9b00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9b10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
9b40: 20 54 65 73 74 20 22 50 52 41 47 4d 41 20 70 61   Test "PRAGMA pa
9b50: 67 65 5f 73 69 7a 65 22 0a 23 0a 66 6f 72 65 61  ge_size".#.forea
9b60: 63 68 20 70 61 67 65 73 69 7a 65 20 7b 0a 20 20  ch pagesize {.  
9b70: 20 20 35 31 32 20 20 20 31 30 32 34 20 20 20 32    512   1024   2
9b80: 30 34 38 20 34 30 39 36 20 38 31 39 32 20 31 36  048 4096 8192 16
9b90: 33 38 34 20 33 32 37 36 38 20 0a 7d 20 7b 0a 20  384 32768 .} {. 
9ba0: 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65   faultsim_delete
9bb0: 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 0a 20 20 64  _and_reopen..  d
9bc0: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 32  o_test pager1-12
9bd0: 2e 24 70 61 67 65 73 69 7a 65 2e 31 20 7b 0a 20  .$pagesize.1 {. 
9be0: 20 20 20 73 71 6c 69 74 65 33 20 64 62 32 20 74     sqlite3 db2 t
9bf0: 65 73 74 2e 64 62 0a 20 20 20 20 65 78 65 63 73  est.db.    execs
9c00: 71 6c 20 22 0a 20 20 20 20 20 20 50 52 41 47 4d  ql ".      PRAGM
9c10: 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20 24 70  A page_size = $p
9c20: 61 67 65 73 69 7a 65 3b 0a 20 20 20 20 20 20 43  agesize;.      C
9c30: 52 45 41 54 45 20 56 49 45 57 20 76 20 41 53 20  REATE VIEW v AS 
9c40: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 71  SELECT * FROM sq
9c50: 6c 69 74 65 5f 6d 61 73 74 65 72 3b 0a 20 20 20  lite_master;.   
9c60: 20 22 20 64 62 32 0a 20 20 20 20 66 69 6c 65 20   " db2.    file 
9c70: 73 69 7a 65 20 74 65 73 74 2e 64 62 0a 20 20 7d  size test.db.  }
9c80: 20 24 70 61 67 65 73 69 7a 65 0a 20 20 64 6f 5f   $pagesize.  do_
9c90: 74 65 73 74 20 70 61 67 65 72 31 2d 31 32 2e 24  test pager1-12.$
9ca0: 70 61 67 65 73 69 7a 65 2e 32 20 7b 0a 20 20 20  pagesize.2 {.   
9cb0: 20 73 71 6c 69 74 65 33 20 64 62 32 20 74 65 73   sqlite3 db2 tes
9cc0: 74 2e 64 62 0a 20 20 20 20 65 78 65 63 73 71 6c  t.db.    execsql
9cd0: 20 7b 20 0a 20 20 20 20 20 20 53 45 4c 45 43 54   { .      SELECT
9ce0: 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 76   count(*) FROM v
9cf0: 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 6d  ;.      PRAGMA m
9d00: 61 69 6e 2e 70 61 67 65 5f 73 69 7a 65 3b 0a 20  ain.page_size;. 
9d10: 20 20 20 7d 20 64 62 32 0a 20 20 7d 20 5b 6c 69     } db2.  } [li
9d20: 73 74 20 31 20 24 70 61 67 65 73 69 7a 65 5d 0a  st 1 $pagesize].
9d30: 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
9d40: 2d 31 32 2e 24 70 61 67 65 73 69 7a 65 2e 33 20  -12.$pagesize.3 
9d50: 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20  {.    execsql { 
9d60: 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 63 6f  .      SELECT co
9d70: 75 6e 74 28 2a 29 20 46 52 4f 4d 20 76 3b 0a 20  unt(*) FROM v;. 
9d80: 20 20 20 20 20 50 52 41 47 4d 41 20 6d 61 69 6e       PRAGMA main
9d90: 2e 70 61 67 65 5f 73 69 7a 65 3b 0a 20 20 20 20  .page_size;.    
9da0: 7d 0a 20 20 7d 20 5b 6c 69 73 74 20 31 20 24 70  }.  } [list 1 $p
9db0: 61 67 65 73 69 7a 65 5d 0a 20 20 64 62 32 20 63  agesize].  db2 c
9dc0: 6c 6f 73 65 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d  lose.}..#-------
9dd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9de0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9df0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9e10: 2d 2d 0a 23 20 54 65 73 74 20 73 70 65 63 61 6c  --.# Test specal
9e20: 20 22 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c   "PRAGMA journal
9e30: 5f 6d 6f 64 65 3d 50 45 52 53 49 53 54 22 20 74  _mode=PERSIST" t
9e40: 65 73 74 20 63 61 73 65 73 2e 0a 23 0a 23 20 70  est cases..#.# p
9e50: 61 67 65 72 31 2d 31 33 2e 31 2e 2a 3a 20 54 68  ager1-13.1.*: Th
9e60: 69 73 20 74 65 73 74 73 20 61 20 73 70 65 63 69  is tests a speci
9e70: 61 6c 20 63 61 73 65 20 65 6e 63 6f 75 6e 74 65  al case encounte
9e80: 72 65 64 20 69 6e 20 70 65 72 73 69 73 74 65 6e  red in persisten
9e90: 74 20 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  t .#            
9ea0: 20 20 20 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65      journal mode
9eb0: 3a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  : If the journal
9ec0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
9ed0: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 23   a transaction.#
9ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ef0: 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  is smaller than 
9f00: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
9f10: 20 28 62 65 63 61 75 73 65 20 61 20 70 72 65 76   (because a prev
9f20: 69 6f 75 73 20 0a 23 20 20 20 20 20 20 20 20 20  ious .#         
9f30: 20 20 20 20 20 20 20 74 72 61 6e 73 61 63 74 69         transacti
9f40: 6f 6e 20 6c 65 66 74 20 61 20 76 65 72 79 20 6c  on left a very l
9f50: 61 72 67 65 20 6e 6f 6e 2d 68 6f 74 20 6a 6f 75  arge non-hot jou
9f60: 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 74 68 65  rnal file in the
9f70: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
9f80: 20 20 66 69 6c 65 2d 73 79 73 74 65 6d 29 2c 20    file-system), 
9f90: 74 68 65 6e 20 53 51 4c 69 74 65 20 68 61 73 20  then SQLite has 
9fa0: 74 6f 20 62 65 20 63 61 72 65 66 75 6c 20 74 68  to be careful th
9fb0: 61 74 20 74 68 65 72 65 20 69 73 0a 23 20 20 20  at there is.#   
9fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 6f 74               not
9fd0: 20 61 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65   a journal-heade
9fe0: 72 20 6c 65 66 74 20 6f 76 65 72 20 66 72 6f 6d  r left over from
9ff0: 20 61 20 70 72 65 76 69 6f 75 73 20 74 72 61 6e   a previous tran
a000: 73 61 63 74 69 6f 6e 0a 23 20 20 20 20 20 20 20  saction.#       
a010: 20 20 20 20 20 20 20 20 20 69 6d 6d 65 64 69 61           immedia
a020: 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  tely following t
a030: 68 65 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74 65  he journal conte
a040: 6e 74 20 6a 75 73 74 20 77 72 69 74 74 65 6e 2e  nt just written.
a050: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
a060: 20 20 49 66 20 74 68 65 72 65 20 69 73 2c 20 61    If there is, a
a070: 6e 64 20 74 68 65 20 70 72 6f 63 65 73 73 20 63  nd the process c
a080: 72 61 73 68 65 73 20 73 6f 20 74 68 61 74 20 74  rashes so that t
a090: 68 65 20 6a 6f 75 72 6e 61 6c 0a 23 20 20 20 20  he journal.#    
a0a0: 20 20 20 20 20 20 20 20 20 20 20 20 62 65 63 6f              beco
a0b0: 6d 65 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  mes a hot-journa
a0c0: 6c 20 61 6e 64 20 6d 75 73 74 20 62 65 20 72 6f  l and must be ro
a0d0: 6c 6c 65 64 20 62 61 63 6b 20 62 79 20 61 6e 6f  lled back by ano
a0e0: 74 68 65 72 0a 23 20 20 20 20 20 20 20 20 20 20  ther.#          
a0f0: 20 20 20 20 20 20 70 72 6f 63 65 73 73 2c 20 74        process, t
a100: 68 65 72 65 20 69 73 20 61 20 64 61 6e 67 65 72  here is a danger
a110: 20 74 68 61 74 20 74 68 65 20 6f 74 68 65 72 20   that the other 
a120: 70 72 6f 63 65 73 73 20 6d 61 79 20 72 6f 6c 6c  process may roll
a130: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
a140: 20 20 62 61 63 6b 20 74 68 65 20 61 62 6f 72 74    back the abort
a150: 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  ed transaction, 
a160: 74 68 65 6e 20 63 6f 6e 74 69 6e 75 65 20 63 6f  then continue co
a170: 70 79 69 6e 67 20 64 61 74 61 0a 23 20 20 20 20  pying data.#    
a180: 20 20 20 20 20 20 20 20 20 20 20 20 66 72 6f 6d              from
a190: 20 61 6e 20 6f 6c 64 65 72 20 74 72 61 6e 73 61   an older transa
a1a0: 63 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 72  ction from the r
a1b0: 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 65 20  emainder of the 
a1c0: 6a 6f 75 72 6e 61 6c 2e 0a 23 20 20 20 20 20 20  journal..#      
a1d0: 20 20 20 20 20 20 20 20 20 20 53 65 65 20 74 68            See th
a1e0: 65 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 29 20  e syncJournal() 
a1f0: 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 64 65 74  function for det
a200: 61 69 6c 73 2e 0a 23 0a 23 20 70 61 67 65 72 31  ails..#.# pager1
a210: 2d 31 33 2e 32 2e 2a 3a 20 53 61 6d 65 20 74 65  -13.2.*: Same te
a220: 73 74 20 61 73 20 74 68 65 20 70 72 65 76 69 6f  st as the previo
a230: 75 73 2e 20 54 68 69 73 20 74 69 6d 65 2c 20 74  us. This time, t
a240: 68 72 6f 77 20 61 6e 20 69 6e 64 65 78 20 69 6e  hrow an index in
a250: 74 6f 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  to.#            
a260: 20 20 20 20 74 68 65 20 6d 69 78 20 74 6f 20 6d      the mix to m
a270: 61 6b 65 20 74 68 65 20 69 6e 74 65 67 72 69 74  ake the integrit
a280: 79 2d 63 68 65 63 6b 20 6d 6f 72 65 20 6c 69 6b  y-check more lik
a290: 65 6c 79 20 74 6f 20 63 61 74 63 68 0a 23 20 20  ely to catch.#  
a2a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 72                er
a2b0: 72 6f 72 73 2e 0a 23 0a 74 65 73 74 76 66 73 20  rors..#.testvfs 
a2c0: 74 76 20 2d 64 65 66 61 75 6c 74 20 31 0a 74 76  tv -default 1.tv
a2d0: 20 73 63 72 69 70 74 20 78 53 79 6e 63 43 62 0a   script xSyncCb.
a2e0: 74 76 20 66 69 6c 74 65 72 20 78 53 79 6e 63 0a  tv filter xSync.
a2f0: 70 72 6f 63 20 78 53 79 6e 63 43 62 20 7b 6d 65  proc xSyncCb {me
a300: 74 68 6f 64 20 66 69 6c 65 6e 61 6d 65 20 61 72  thod filename ar
a310: 67 73 7d 20 7b 0a 20 20 73 65 74 20 74 20 5b 66  gs} {.  set t [f
a320: 69 6c 65 20 74 61 69 6c 20 24 66 69 6c 65 6e 61  ile tail $filena
a330: 6d 65 5d 0a 20 20 69 66 20 7b 24 74 20 3d 3d 20  me].  if {$t == 
a340: 22 74 65 73 74 2e 64 62 22 7d 20 66 61 75 6c 74  "test.db"} fault
a350: 73 69 6d 5f 73 61 76 65 0a 20 20 72 65 74 75 72  sim_save.  retur
a360: 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 7d 0a 66 61  n SQLITE_OK.}.fa
a370: 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e  ultsim_delete_an
a380: 64 5f 72 65 6f 70 65 6e 0a 64 62 20 66 75 6e 63  d_reopen.db func
a390: 20 61 5f 73 74 72 69 6e 67 20 61 5f 73 74 72 69   a_string a_stri
a3a0: 6e 67 0a 0a 23 20 54 68 65 20 55 50 44 41 54 45  ng..# The UPDATE
a3b0: 20 73 74 61 74 65 6d 65 6e 74 20 61 74 20 74 68   statement at th
a3c0: 65 20 65 6e 64 20 6f 66 20 74 68 69 73 20 74 65  e end of this te
a3d0: 73 74 20 63 61 73 65 20 63 72 65 61 74 65 73 20  st case creates 
a3e0: 61 20 72 65 61 6c 6c 79 20 62 69 67 0a 23 20 6a  a really big.# j
a3f0: 6f 75 72 6e 61 6c 2e 20 53 69 6e 63 65 20 74 68  ournal. Since th
a400: 65 20 63 61 63 68 65 2d 73 69 7a 65 20 69 73 20  e cache-size is 
a410: 6f 6e 6c 79 20 31 30 20 70 61 67 65 73 2c 20 74  only 10 pages, t
a420: 68 65 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74 61  he journal conta
a430: 69 6e 73 20 0a 23 20 66 72 65 71 75 65 6e 74 20  ins .# frequent 
a440: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 73 2e  journal headers.
a450: 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  .#.do_execsql_te
a460: 73 74 20 70 61 67 65 72 31 2d 31 33 2e 31 2e 31  st pager1-13.1.1
a470: 20 7b 0a 20 20 50 52 41 47 4d 41 20 70 61 67 65   {.  PRAGMA page
a480: 5f 73 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20  _size = 1024;.  
a490: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
a4a0: 6f 64 65 20 3d 20 50 45 52 53 49 53 54 3b 0a 20  ode = PERSIST;. 
a4b0: 20 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69   PRAGMA cache_si
a4c0: 7a 65 20 3d 20 31 30 3b 0a 20 20 42 45 47 49 4e  ze = 10;.  BEGIN
a4d0: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
a4e0: 4c 45 20 74 31 28 61 20 49 4e 54 45 47 45 52 20  LE t1(a INTEGER 
a4f0: 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 20 42  PRIMARY KEY, b B
a500: 4c 4f 42 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  LOB);.    INSERT
a510: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
a520: 4e 55 4c 4c 2c 20 61 5f 73 74 72 69 6e 67 28 34  NULL, a_string(4
a530: 30 30 29 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  00));.    INSERT
a540: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
a550: 4e 55 4c 4c 2c 20 61 5f 73 74 72 69 6e 67 28 34  NULL, a_string(4
a560: 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20  00) FROM t1;    
a570: 20 20 20 20 20 20 2f 2a 20 20 20 32 20 2a 2f 0a        /*   2 */.
a580: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
a590: 74 31 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20  t1 SELECT NULL, 
a5a0: 61 5f 73 74 72 69 6e 67 28 34 30 30 29 20 46 52  a_string(400) FR
a5b0: 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 20 20 20  OM t1;          
a5c0: 2f 2a 20 20 20 34 20 2a 2f 0a 20 20 20 20 49 4e  /*   4 */.    IN
a5d0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
a5e0: 45 43 54 20 4e 55 4c 4c 2c 20 61 5f 73 74 72 69  ECT NULL, a_stri
a5f0: 6e 67 28 34 30 30 29 20 46 52 4f 4d 20 74 31 3b  ng(400) FROM t1;
a600: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20 38            /*   8
a610: 20 2a 2f 0a 20 20 20 20 49 4e 53 45 52 54 20 49   */.    INSERT I
a620: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 4e 55  NTO t1 SELECT NU
a630: 4c 4c 2c 20 61 5f 73 74 72 69 6e 67 28 34 30 30  LL, a_string(400
a640: 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20  ) FROM t1;      
a650: 20 20 20 20 2f 2a 20 20 31 36 20 2a 2f 0a 20 20      /*  16 */.  
a660: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
a670: 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 61 5f   SELECT NULL, a_
a680: 73 74 72 69 6e 67 28 34 30 30 29 20 46 52 4f 4d  string(400) FROM
a690: 20 74 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a   t1;          /*
a6a0: 20 20 33 32 20 2a 2f 0a 20 20 20 20 49 4e 53 45    32 */.    INSE
a6b0: 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
a6c0: 54 20 4e 55 4c 4c 2c 20 61 5f 73 74 72 69 6e 67  T NULL, a_string
a6d0: 28 34 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20  (400) FROM t1;  
a6e0: 20 20 20 20 20 20 20 20 2f 2a 20 20 36 34 20 2a          /*  64 *
a6f0: 2f 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  /.    INSERT INT
a700: 4f 20 74 31 20 53 45 4c 45 43 54 20 4e 55 4c 4c  O t1 SELECT NULL
a710: 2c 20 61 5f 73 74 72 69 6e 67 28 34 30 30 29 20  , a_string(400) 
a720: 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 20  FROM t1;        
a730: 20 20 2f 2a 20 31 32 38 20 2a 2f 0a 20 20 43 4f    /* 128 */.  CO
a740: 4d 4d 49 54 3b 0a 20 20 55 50 44 41 54 45 20 74  MMIT;.  UPDATE t
a750: 31 20 53 45 54 20 62 20 3d 20 61 5f 73 74 72 69  1 SET b = a_stri
a760: 6e 67 28 34 30 30 29 3b 0a 7d 20 7b 70 65 72 73  ng(400);.} {pers
a770: 69 73 74 7d 0a 0a 23 20 52 75 6e 20 74 72 61 6e  ist}..# Run tran
a780: 73 61 63 74 69 6f 6e 73 20 6f 66 20 69 6e 63 72  sactions of incr
a790: 65 61 73 69 6e 67 20 73 69 7a 65 73 2e 20 45 76  easing sizes. Ev
a7a0: 65 6e 74 75 61 6c 6c 79 2c 20 6f 6e 65 20 28 6f  entually, one (o
a7b0: 72 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 29  r more than one)
a7c0: 0a 23 20 6f 66 20 74 68 65 73 65 20 77 69 6c 6c  .# of these will
a7d0: 20 77 72 69 74 65 20 6a 75 73 74 20 65 6e 6f 75   write just enou
a7e0: 67 68 20 63 6f 6e 74 65 6e 74 20 74 68 61 74 20  gh content that 
a7f0: 6f 6e 65 20 6f 66 20 74 68 65 20 6f 6c 64 20 68  one of the old h
a800: 65 61 64 65 72 73 20 63 72 65 61 74 65 64 20 0a  eaders created .
a810: 23 20 62 79 20 74 68 65 20 74 72 61 6e 73 61 63  # by the transac
a820: 74 69 6f 6e 20 69 6e 20 74 68 65 20 62 6c 6f 63  tion in the bloc
a830: 6b 20 61 62 6f 76 65 20 6c 69 65 73 20 69 6d 6d  k above lies imm
a840: 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 74  ediately after t
a850: 68 65 20 63 6f 6e 74 65 6e 74 0a 23 20 6a 6f 75  he content.# jou
a860: 72 6e 61 6c 6c 65 64 20 62 79 20 74 68 65 20 63  rnalled by the c
a870: 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69  urrent transacti
a880: 6f 6e 2e 0a 23 0a 66 6f 72 20 7b 73 65 74 20 6e  on..#.for {set n
a890: 55 70 20 31 7d 20 7b 24 6e 55 70 3c 36 34 7d 20  Up 1} {$nUp<64} 
a8a0: 7b 69 6e 63 72 20 6e 55 70 7d 20 7b 0a 20 20 64  {incr nUp} {.  d
a8b0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70  o_execsql_test p
a8c0: 61 67 65 72 31 2d 31 33 2e 31 2e 32 2e 24 6e 55  ager1-13.1.2.$nU
a8d0: 70 2e 31 20 7b 20 0a 20 20 20 20 55 50 44 41 54  p.1 { .    UPDAT
a8e0: 45 20 74 31 20 53 45 54 20 62 20 3d 20 61 5f 73  E t1 SET b = a_s
a8f0: 74 72 69 6e 67 28 33 39 39 29 20 57 48 45 52 45  tring(399) WHERE
a900: 20 61 20 3c 3d 20 24 6e 55 70 0a 20 20 7d 20 7b   a <= $nUp.  } {
a910: 7d 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74  }.  do_execsql_t
a920: 65 73 74 20 70 61 67 65 72 31 2d 31 33 2e 31 2e  est pager1-13.1.
a930: 32 2e 24 6e 55 70 2e 32 20 7b 20 50 52 41 47 4d  2.$nUp.2 { PRAGM
a940: 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63  A integrity_chec
a950: 6b 20 7d 20 7b 6f 6b 7d 20 0a 0a 20 20 23 20 54  k } {ok} ..  # T
a960: 72 79 20 74 6f 20 61 63 63 65 73 73 20 74 68 65  ry to access the
a970: 20 73 6e 61 70 73 68 6f 74 20 6f 66 20 74 68 65   snapshot of the
a980: 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e 0a 20 20   file-system..  
a990: 23 0a 20 20 73 71 6c 69 74 65 33 20 64 62 32 20  #.  sqlite3 db2 
a9a0: 73 76 5f 74 65 73 74 2e 64 62 0a 20 20 64 6f 5f  sv_test.db.  do_
a9b0: 74 65 73 74 20 70 61 67 65 72 31 2d 31 33 2e 31  test pager1-13.1
a9c0: 2e 32 2e 24 6e 55 70 2e 33 20 7b 0a 20 20 20 20  .2.$nUp.3 {.    
a9d0: 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54  execsql { SELECT
a9e0: 20 73 75 6d 28 6c 65 6e 67 74 68 28 62 29 29 20   sum(length(b)) 
a9f0: 46 52 4f 4d 20 74 31 20 7d 20 64 62 32 0a 20 20  FROM t1 } db2.  
aa00: 7d 20 5b 65 78 70 72 20 7b 31 32 38 2a 34 30 30  } [expr {128*400
aa10: 20 2d 20 28 24 6e 55 70 2d 31 29 7d 5d 0a 20 20   - ($nUp-1)}].  
aa20: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31  do_test pager1-1
aa30: 33 2e 31 2e 32 2e 24 6e 55 70 2e 34 20 7b 0a 20  3.1.2.$nUp.4 {. 
aa40: 20 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41     execsql { PRA
aa50: 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68  GMA integrity_ch
aa60: 65 63 6b 20 7d 20 64 62 32 0a 20 20 7d 20 7b 6f  eck } db2.  } {o
aa70: 6b 7d 0a 20 20 64 62 32 20 63 6c 6f 73 65 0a 7d  k}.  db2 close.}
aa80: 0a 0a 23 20 53 61 6d 65 20 74 65 73 74 20 61 73  ..# Same test as
aa90: 20 61 62 6f 76 65 2e 20 42 75 74 20 74 68 69 73   above. But this
aaa0: 20 74 69 6d 65 20 77 69 74 68 20 61 6e 20 69 6e   time with an in
aab0: 64 65 78 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  dex on the table
aac0: 2e 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  ..#.do_execsql_t
aad0: 65 73 74 20 70 61 67 65 72 31 2d 31 33 2e 32 2e  est pager1-13.2.
aae0: 31 20 7b 0a 20 20 43 52 45 41 54 45 20 49 4e 44  1 {.  CREATE IND
aaf0: 45 58 20 69 31 20 4f 4e 20 74 31 28 62 29 3b 0a  EX i1 ON t1(b);.
ab00: 20 20 55 50 44 41 54 45 20 74 31 20 53 45 54 20    UPDATE t1 SET 
ab10: 62 20 3d 20 61 5f 73 74 72 69 6e 67 28 34 30 30  b = a_string(400
ab20: 29 3b 0a 7d 20 7b 7d 0a 66 6f 72 20 7b 73 65 74  );.} {}.for {set
ab30: 20 6e 55 70 20 31 7d 20 7b 24 6e 55 70 3c 36 34   nUp 1} {$nUp<64
ab40: 7d 20 7b 69 6e 63 72 20 6e 55 70 7d 20 7b 0a 20  } {incr nUp} {. 
ab50: 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74   do_execsql_test
ab60: 20 70 61 67 65 72 31 2d 31 33 2e 32 2e 32 2e 24   pager1-13.2.2.$
ab70: 6e 55 70 2e 31 20 7b 20 0a 20 20 20 20 55 50 44  nUp.1 { .    UPD
ab80: 41 54 45 20 74 31 20 53 45 54 20 62 20 3d 20 61  ATE t1 SET b = a
ab90: 5f 73 74 72 69 6e 67 28 33 39 39 29 20 57 48 45  _string(399) WHE
aba0: 52 45 20 61 20 3c 3d 20 24 6e 55 70 0a 20 20 7d  RE a <= $nUp.  }
abb0: 20 7b 7d 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c   {}.  do_execsql
abc0: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 33 2e  _test pager1-13.
abd0: 32 2e 32 2e 24 6e 55 70 2e 32 20 7b 20 50 52 41  2.2.$nUp.2 { PRA
abe0: 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68  GMA integrity_ch
abf0: 65 63 6b 20 7d 20 7b 6f 6b 7d 20 0a 20 20 73 71  eck } {ok} .  sq
ac00: 6c 69 74 65 33 20 64 62 32 20 73 76 5f 74 65 73  lite3 db2 sv_tes
ac10: 74 2e 64 62 0a 20 20 64 6f 5f 74 65 73 74 20 70  t.db.  do_test p
ac20: 61 67 65 72 31 2d 31 33 2e 32 2e 32 2e 24 6e 55  ager1-13.2.2.$nU
ac30: 70 2e 33 20 7b 0a 20 20 20 20 65 78 65 63 73 71  p.3 {.    execsq
ac40: 6c 20 7b 20 53 45 4c 45 43 54 20 73 75 6d 28 6c  l { SELECT sum(l
ac50: 65 6e 67 74 68 28 62 29 29 20 46 52 4f 4d 20 74  ength(b)) FROM t
ac60: 31 20 7d 20 64 62 32 0a 20 20 7d 20 5b 65 78 70  1 } db2.  } [exp
ac70: 72 20 7b 31 32 38 2a 34 30 30 20 2d 20 28 24 6e  r {128*400 - ($n
ac80: 55 70 2d 31 29 7d 5d 0a 20 20 64 6f 5f 74 65 73  Up-1)}].  do_tes
ac90: 74 20 70 61 67 65 72 31 2d 31 33 2e 32 2e 32 2e  t pager1-13.2.2.
aca0: 24 6e 55 70 2e 34 20 7b 0a 20 20 20 20 65 78 65  $nUp.4 {.    exe
acb0: 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 69 6e  csql { PRAGMA in
acc0: 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 7d 20  tegrity_check } 
acd0: 64 62 32 0a 20 20 7d 20 7b 6f 6b 7d 0a 20 20 64  db2.  } {ok}.  d
ace0: 62 32 20 63 6c 6f 73 65 0a 7d 0a 0a 64 62 20 63  b2 close.}..db c
acf0: 6c 6f 73 65 0a 74 76 20 64 65 6c 65 74 65 0a 0a  lose.tv delete..
ad00: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
ad10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ad20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ad30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ad40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73  ----------.# Tes
ad50: 74 20 73 70 65 63 61 6c 20 22 50 52 41 47 4d 41  t specal "PRAGMA
ad60: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 4f 46   journal_mode=OF
ad70: 46 22 20 74 65 73 74 20 63 61 73 65 73 2e 0a 23  F" test cases..#
ad80: 0a 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65  .faultsim_delete
ad90: 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 64 6f 5f 65  _and_reopen.do_e
ada0: 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65  xecsql_test page
adb0: 72 31 2d 31 34 2e 31 2e 31 20 7b 0a 20 20 50 52  r1-14.1.1 {.  PR
adc0: 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
add0: 65 20 3d 20 4f 46 46 3b 0a 20 20 43 52 45 41 54  e = OFF;.  CREAT
ade0: 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29  E TABLE t1(a, b)
adf0: 3b 0a 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 49  ;.  BEGIN;.    I
ae00: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
ae10: 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20 20 43 4f  LUES(1, 2);.  CO
ae20: 4d 4d 49 54 3b 0a 20 20 53 45 4c 45 43 54 20 2a  MMIT;.  SELECT *
ae30: 20 46 52 4f 4d 20 74 31 3b 0a 7d 20 7b 6f 66 66   FROM t1;.} {off
ae40: 20 31 20 32 7d 0a 64 6f 5f 63 61 74 63 68 73 71   1 2}.do_catchsq
ae50: 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 34  l_test pager1-14
ae60: 2e 31 2e 32 20 7b 0a 20 20 42 45 47 49 4e 3b 0a  .1.2 {.  BEGIN;.
ae70: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
ae80: 74 31 20 56 41 4c 55 45 53 28 33 2c 20 34 29 3b  t1 VALUES(3, 4);
ae90: 0a 20 20 52 4f 4c 4c 42 41 43 4b 3b 0a 7d 20 7b  .  ROLLBACK;.} {
aea0: 30 20 7b 7d 7d 0a 64 6f 5f 65 78 65 63 73 71 6c  0 {}}.do_execsql
aeb0: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 34 2e  _test pager1-14.
aec0: 31 2e 33 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a  1.3 {.  SELECT *
aed0: 20 46 52 4f 4d 20 74 31 3b 0a 7d 20 7b 31 20 32   FROM t1;.} {1 2
aee0: 20 33 20 34 7d 0a 64 6f 5f 63 61 74 63 68 73 71   3 4}.do_catchsq
aef0: 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 34  l_test pager1-14
af00: 2e 31 2e 34 20 7b 0a 20 20 42 45 47 49 4e 3b 0a  .1.4 {.  BEGIN;.
af10: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
af20: 74 31 28 72 6f 77 69 64 2c 20 61 2c 20 62 29 20  t1(rowid, a, b) 
af30: 53 45 4c 45 43 54 20 61 2b 33 2c 20 62 2c 20 62  SELECT a+3, b, b
af40: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e   FROM t1;.    IN
af50: 53 45 52 54 20 49 4e 54 4f 20 74 31 28 72 6f 77  SERT INTO t1(row
af60: 69 64 2c 20 61 2c 20 62 29 20 53 45 4c 45 43 54  id, a, b) SELECT
af70: 20 61 2b 33 2c 20 62 2c 20 62 20 46 52 4f 4d 20   a+3, b, b FROM 
af80: 74 31 3b 0a 7d 20 7b 31 20 7b 50 52 49 4d 41 52  t1;.} {1 {PRIMAR
af90: 59 20 4b 45 59 20 6d 75 73 74 20 62 65 20 75 6e  Y KEY must be un
afa0: 69 71 75 65 7d 7d 0a 64 6f 5f 65 78 65 63 73 71  ique}}.do_execsq
afb0: 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 34  l_test pager1-14
afc0: 2e 31 2e 35 20 7b 0a 20 20 43 4f 4d 4d 49 54 3b  .1.5 {.  COMMIT;
afd0: 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  .  SELECT * FROM
afe0: 20 74 31 3b 0a 7d 20 7b 31 20 32 20 33 20 34 20   t1;.} {1 2 3 4 
aff0: 32 20 32 20 34 20 34 7d 0a 0a 23 2d 2d 2d 2d 2d  2 2 4 4}..#-----
b000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b040: 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 6f 70 65 6e  ----.# Test open
b050: 69 6e 67 20 61 6e 64 20 63 6c 6f 73 69 6e 67 20  ing and closing 
b060: 74 68 65 20 70 61 67 65 72 20 73 75 62 2d 73 79  the pager sub-sy
b070: 73 74 65 6d 20 77 69 74 68 20 64 69 66 66 65 72  stem with differ
b080: 65 6e 74 20 76 61 6c 75 65 73 0a 23 20 66 6f 72  ent values.# for
b090: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 76 66 73   the sqlite3_vfs
b0a0: 2e 73 7a 4f 73 46 69 6c 65 20 76 61 72 69 61 62  .szOsFile variab
b0b0: 6c 65 2e 0a 23 0a 66 61 75 6c 74 73 69 6d 5f 64  le..#.faultsim_d
b0c0: 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e  elete_and_reopen
b0d0: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
b0e0: 20 70 61 67 65 72 31 2d 31 35 2e 30 20 7b 0a 20   pager1-15.0 {. 
b0f0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 78   CREATE TABLE tx
b100: 28 79 2c 20 7a 29 3b 0a 20 20 49 4e 53 45 52 54  (y, z);.  INSERT
b110: 20 49 4e 54 4f 20 74 78 20 56 41 4c 55 45 53 28   INTO tx VALUES(
b120: 27 41 79 75 74 74 68 61 79 61 27 2c 20 27 42 65  'Ayutthaya', 'Be
b130: 69 6a 69 6e 67 27 29 3b 0a 20 20 49 4e 53 45 52  ijing');.  INSER
b140: 54 20 49 4e 54 4f 20 74 78 20 56 41 4c 55 45 53  T INTO tx VALUES
b150: 28 27 4c 6f 6e 64 6f 6e 27 2c 20 27 54 6f 6b 79  ('London', 'Toky
b160: 6f 27 29 3b 0a 7d 20 7b 7d 0a 64 62 20 63 6c 6f  o');.} {}.db clo
b170: 73 65 0a 66 6f 72 20 7b 73 65 74 20 69 20 30 7d  se.for {set i 0}
b180: 20 7b 24 69 3c 35 31 33 7d 20 7b 69 6e 63 72 20   {$i<513} {incr 
b190: 69 20 33 7d 20 7b 0a 20 20 74 65 73 74 76 66 73  i 3} {.  testvfs
b1a0: 20 74 76 20 2d 64 65 66 61 75 6c 74 20 31 20 2d   tv -default 1 -
b1b0: 73 7a 6f 73 66 69 6c 65 20 24 69 0a 20 20 73 71  szosfile $i.  sq
b1c0: 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62  lite3 db test.db
b1d0: 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  .  do_execsql_te
b1e0: 73 74 20 70 61 67 65 72 31 2d 31 35 2e 24 69 2e  st pager1-15.$i.
b1f0: 31 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a  1 {.    SELECT *
b200: 20 46 52 4f 4d 20 74 78 3b 0a 20 20 7d 20 7b 41   FROM tx;.  } {A
b210: 79 75 74 74 68 61 79 61 20 42 65 69 6a 69 6e 67  yutthaya Beijing
b220: 20 4c 6f 6e 64 6f 6e 20 54 6f 6b 79 6f 7d 0a 20   London Tokyo}. 
b230: 20 64 62 20 63 6c 6f 73 65 0a 20 20 74 76 20 64   db close.  tv d
b240: 65 6c 65 74 65 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d  elete.}..#------
b250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b290: 2d 2d 2d 0a 23 20 43 68 65 63 6b 20 74 68 61 74  ---.# Check that
b2a0: 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   it is not possi
b2b0: 62 6c 65 20 74 6f 20 6f 70 65 6e 20 61 20 64 61  ble to open a da
b2c0: 74 61 62 61 73 65 20 66 69 6c 65 20 69 66 20 74  tabase file if t
b2d0: 68 65 20 66 75 6c 6c 20 70 61 74 68 0a 23 20 74  he full path.# t
b2e0: 6f 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64  o the associated
b2f0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69   journal file wi
b300: 6c 6c 20 62 65 20 6c 6f 6e 67 65 72 20 74 68 61  ll be longer tha
b310: 6e 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78  n sqlite3_vfs.mx
b320: 50 61 74 68 6e 61 6d 65 2e 0a 23 0a 74 65 73 74  Pathname..#.test
b330: 76 66 73 20 74 76 20 2d 64 65 66 61 75 6c 74 20  vfs tv -default 
b340: 31 0a 74 76 20 73 63 72 69 70 74 20 78 4f 70 65  1.tv script xOpe
b350: 6e 43 62 0a 74 76 20 66 69 6c 74 65 72 20 78 4f  nCb.tv filter xO
b360: 70 65 6e 0a 70 72 6f 63 20 78 4f 70 65 6e 43 62  pen.proc xOpenCb
b370: 20 7b 6d 65 74 68 6f 64 20 66 69 6c 65 6e 61 6d   {method filenam
b380: 65 7d 20 7b 0a 20 20 73 65 74 20 3a 3a 66 69 6c  e} {.  set ::fil
b390: 65 5f 6c 65 6e 20 5b 73 74 72 69 6e 67 20 6c 65  e_len [string le
b3a0: 6e 67 74 68 20 24 66 69 6c 65 6e 61 6d 65 5d 0a  ngth $filename].
b3b0: 7d 0a 73 71 6c 69 74 65 33 20 64 62 20 74 65 73  }.sqlite3 db tes
b3c0: 74 2e 64 62 0a 64 62 20 63 6c 6f 73 65 0a 74 76  t.db.db close.tv
b3d0: 20 64 65 6c 65 74 65 0a 0a 66 6f 72 20 7b 73 65   delete..for {se
b3e0: 74 20 69 69 20 5b 65 78 70 72 20 24 3a 3a 66 69  t ii [expr $::fi
b3f0: 6c 65 5f 6c 65 6e 2d 35 5d 7d 20 7b 24 69 69 20  le_len-5]} {$ii 
b400: 3c 20 5b 65 78 70 72 20 24 3a 3a 66 69 6c 65 5f  < [expr $::file_
b410: 6c 65 6e 2b 32 30 5d 7d 20 7b 69 6e 63 72 20 69  len+20]} {incr i
b420: 69 7d 20 7b 0a 20 20 74 65 73 74 76 66 73 20 74  i} {.  testvfs t
b430: 76 20 2d 64 65 66 61 75 6c 74 20 31 20 2d 6d 78  v -default 1 -mx
b440: 70 61 74 68 6e 61 6d 65 20 24 69 69 0a 0a 20 20  pathname $ii..  
b450: 23 20 54 68 65 20 6c 65 6e 67 74 68 20 6f 66 20  # The length of 
b460: 74 68 65 20 66 75 6c 6c 20 70 61 74 68 20 74 6f  the full path to
b470: 20 66 69 6c 65 20 22 74 65 73 74 2e 64 62 2d 6a   file "test.db-j
b480: 6f 75 72 6e 61 6c 22 20 69 73 20 28 24 3a 3a 66  ournal" is ($::f
b490: 69 6c 65 5f 6c 65 6e 2b 38 29 2e 0a 20 20 23 20  ile_len+8)..  # 
b4a0: 49 66 20 74 68 65 20 63 6f 6e 66 69 67 75 72 65  If the configure
b4b0: 64 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78  d sqlite3_vfs.mx
b4c0: 50 61 74 68 6e 61 6d 65 20 76 61 6c 75 65 20 67  Pathname value g
b4d0: 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65  reater than or e
b4e0: 71 75 61 6c 20 74 6f 0a 20 20 23 20 74 68 69 73  qual to.  # this
b4f0: 2c 20 74 68 65 6e 20 74 68 65 20 66 69 6c 65 20  , then the file 
b500: 63 61 6e 20 62 65 20 6f 70 65 6e 65 64 2e 20 4f  can be opened. O
b510: 74 68 65 72 77 69 73 65 2c 20 69 74 20 63 61 6e  therwise, it can
b520: 6e 6f 74 2e 0a 20 20 23 0a 20 20 69 66 20 7b 24  not..  #.  if {$
b530: 69 69 20 3e 3d 20 5b 65 78 70 72 20 24 3a 3a 66  ii >= [expr $::f
b540: 69 6c 65 5f 6c 65 6e 2b 38 5d 7d 20 7b 0a 20 20  ile_len+8]} {.  
b550: 20 20 73 65 74 20 72 65 73 20 7b 30 20 7b 7d 7d    set res {0 {}}
b560: 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20  .  } else {.    
b570: 73 65 74 20 72 65 73 20 7b 31 20 7b 75 6e 61 62  set res {1 {unab
b580: 6c 65 20 74 6f 20 6f 70 65 6e 20 64 61 74 61 62  le to open datab
b590: 61 73 65 20 66 69 6c 65 7d 7d 0a 20 20 7d 0a 0a  ase file}}.  }..
b5a0: 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
b5b0: 2d 31 36 2e 31 2e 24 69 69 20 7b 0a 20 20 20 20  -16.1.$ii {.    
b5c0: 6c 69 73 74 20 5b 63 61 74 63 68 20 7b 20 73 71  list [catch { sq
b5d0: 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62  lite3 db test.db
b5e0: 20 7d 20 6d 73 67 5d 20 24 6d 73 67 0a 20 20 7d   } msg] $msg.  }
b5f0: 20 24 72 65 73 0a 0a 20 20 63 61 74 63 68 20 7b   $res..  catch {
b600: 64 62 20 63 6c 6f 73 65 7d 0a 20 20 74 76 20 64  db close}.  tv d
b610: 65 6c 65 74 65 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d  elete.}..#------
b620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b660: 2d 2d 2d 0a 23 20 54 65 73 74 20 22 50 52 41 47  ---.# Test "PRAG
b670: 4d 41 20 6f 6d 69 74 5f 72 65 61 64 6c 6f 63 6b  MA omit_readlock
b680: 22 2e 20 0a 23 0a 23 20 20 20 70 61 67 65 72 31  ". .#.#   pager1
b690: 2d 31 37 2e 24 74 6e 2e 31 2e 2a 3a 20 54 65 73  -17.$tn.1.*: Tes
b6a0: 74 20 74 68 61 74 20 69 66 20 61 20 73 65 63 6f  t that if a seco
b6b0: 6e 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61  nd connection ha
b6c0: 73 20 61 6e 20 6f 70 65 6e 20 0a 23 20 20 20 20  s an open .#    
b6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b6e0: 20 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69    read-transacti
b6f0: 6f 6e 2c 20 69 74 20 69 73 20 6e 6f 74 20 75 73  on, it is not us
b700: 75 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 20 74  ually possible t
b710: 6f 20 77 72 69 74 65 20 0a 23 20 20 20 20 20 20  o write .#      
b720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b730: 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 23 0a  the database..#.
b740: 23 20 20 20 70 61 67 65 72 31 2d 31 37 2e 24 74  #   pager1-17.$t
b750: 6e 2e 32 2e 2a 3a 20 54 65 73 74 20 74 68 61 74  n.2.*: Test that
b760: 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20 63   if the second c
b770: 6f 6e 6e 65 63 74 69 6f 6e 20 77 61 73 20 6f 70  onnection was op
b780: 65 6e 65 64 20 77 69 74 68 0a 23 20 20 20 20 20  ened with.#     
b790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b7a0: 20 74 68 65 20 53 51 4c 49 54 45 5f 4f 50 45 4e   the SQLITE_OPEN
b7b0: 5f 52 45 41 44 4f 4e 4c 59 20 66 6c 61 67 2c 20  _READONLY flag, 
b7c0: 61 6e 64 20 0a 23 20 20 20 20 20 20 20 20 20 20  and .#          
b7d0: 20 20 20 20 20 20 20 20 20 20 20 20 22 50 52 41              "PRA
b7e0: 47 4d 41 20 6f 6d 69 74 5f 72 65 61 64 6c 6f 63  GMA omit_readloc
b7f0: 6b 20 3d 20 31 22 20 69 73 20 65 78 65 63 75 74  k = 1" is execut
b800: 65 64 20 62 65 66 6f 72 65 20 61 74 74 61 63 68  ed before attach
b810: 69 6e 67 0a 23 20 20 20 20 20 20 20 20 20 20 20  ing.#           
b820: 20 20 20 20 20 20 20 20 20 20 20 74 68 65 20 64             the d
b830: 61 74 61 62 61 73 65 20 61 6e 64 20 6f 70 65 6e  atabase and open
b840: 69 6e 67 20 61 20 72 65 61 64 2d 74 72 61 6e 73  ing a read-trans
b850: 61 63 74 69 6f 6e 20 6f 6e 20 69 74 2c 20 69 74  action on it, it
b860: 20 69 73 0a 23 20 20 20 20 20 20 20 20 20 20 20   is.#           
b870: 20 20 20 20 20 20 20 20 20 20 20 70 6f 73 73 69             possi
b880: 62 6c 65 20 74 6f 20 77 72 69 74 65 20 74 68 65  ble to write the
b890: 20 64 62 2e 0a 23 0a 23 20 20 20 70 61 67 65 72   db..#.#   pager
b8a0: 31 2d 31 37 2e 24 74 6e 2e 33 2e 2a 3a 20 54 65  1-17.$tn.3.*: Te
b8b0: 73 74 20 74 68 61 74 20 69 66 20 74 68 65 20 73  st that if the s
b8c0: 65 63 6f 6e 64 20 63 6f 6e 6e 65 63 74 69 6f 6e  econd connection
b8d0: 20 77 61 73 20 2a 6e 6f 74 2a 20 6f 70 65 6e 65   was *not* opene
b8e0: 64 20 77 69 74 68 0a 23 20 20 20 20 20 20 20 20  d with.#        
b8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
b900: 65 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  e SQLITE_OPEN_RE
b910: 41 44 4f 4e 4c 59 20 66 6c 61 67 2c 20 65 78 65  ADONLY flag, exe
b920: 63 75 74 69 6e 67 20 0a 23 20 20 20 20 20 20 20  cuting .#       
b930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
b940: 50 52 41 47 4d 41 20 6f 6d 69 74 5f 72 65 61 64  PRAGMA omit_read
b950: 6c 6f 63 6b 20 3d 20 31 22 20 68 61 73 20 6e 6f  lock = 1" has no
b960: 20 65 66 66 65 63 74 2e 0a 23 0a 64 6f 5f 6d 75   effect..#.do_mu
b970: 6c 74 69 63 6c 69 65 6e 74 5f 74 65 73 74 20 74  lticlient_test t
b980: 6e 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 70 61  n {.  do_test pa
b990: 67 65 72 31 2d 31 37 2e 24 74 6e 2e 31 2e 31 20  ger1-17.$tn.1.1 
b9a0: 7b 0a 20 20 20 20 73 71 6c 31 20 7b 20 0a 20 20  {.    sql1 { .  
b9b0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
b9c0: 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 20   t1(a, b);.     
b9d0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
b9e0: 56 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20 20  VALUES(1, 2);.  
b9f0: 20 20 7d 0a 20 20 20 20 73 71 6c 32 20 7b 0a 20    }.    sql2 {. 
ba00: 20 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20       BEGIN;.    
ba10: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
ba20: 74 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 31  t1;.    }.  } {1
ba30: 20 32 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61   2}.  do_test pa
ba40: 67 65 72 31 2d 31 37 2e 24 74 6e 2e 31 2e 32 20  ger1-17.$tn.1.2 
ba50: 7b 0a 20 20 20 20 63 73 71 6c 31 20 7b 20 49 4e  {.    csql1 { IN
ba60: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
ba70: 55 45 53 28 33 2c 20 34 29 20 7d 0a 20 20 7d 20  UES(3, 4) }.  } 
ba80: 7b 31 20 7b 64 61 74 61 62 61 73 65 20 69 73 20  {1 {database is 
ba90: 6c 6f 63 6b 65 64 7d 7d 0a 20 20 64 6f 5f 74 65  locked}}.  do_te
baa0: 73 74 20 70 61 67 65 72 31 2d 31 37 2e 24 74 6e  st pager1-17.$tn
bab0: 2e 31 2e 33 20 7b 0a 20 20 20 20 73 71 6c 32 20  .1.3 {.    sql2 
bac0: 7b 20 43 4f 4d 4d 49 54 20 7d 0a 20 20 20 20 73  { COMMIT }.    s
bad0: 71 6c 31 20 7b 20 49 4e 53 45 52 54 20 49 4e 54  ql1 { INSERT INT
bae0: 4f 20 74 31 20 56 41 4c 55 45 53 28 33 2c 20 34  O t1 VALUES(3, 4
baf0: 29 20 7d 0a 20 20 7d 20 7b 7d 0a 0a 20 20 64 6f  ) }.  } {}..  do
bb00: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 37 2e  _test pager1-17.
bb10: 24 74 6e 2e 32 2e 31 20 7b 0a 20 20 20 20 63 6f  $tn.2.1 {.    co
bb20: 64 65 32 20 7b 0a 20 20 20 20 20 20 64 62 32 20  de2 {.      db2 
bb30: 63 6c 6f 73 65 0a 20 20 20 20 20 20 73 71 6c 69  close.      sqli
bb40: 74 65 33 20 64 62 32 20 3a 6d 65 6d 6f 72 79 3a  te3 db2 :memory:
bb50: 20 2d 72 65 61 64 6f 6e 6c 79 20 31 0a 20 20 20   -readonly 1.   
bb60: 20 7d 0a 20 20 20 20 73 71 6c 32 20 7b 20 0a 20   }.    sql2 { . 
bb70: 20 20 20 20 20 50 52 41 47 4d 41 20 6f 6d 69 74       PRAGMA omit
bb80: 5f 72 65 61 64 6c 6f 63 6b 20 3d 20 31 3b 0a 20  _readlock = 1;. 
bb90: 20 20 20 20 20 41 54 54 41 43 48 20 27 74 65 73       ATTACH 'tes
bba0: 74 2e 64 62 27 20 41 53 20 74 77 6f 3b 0a 20 20  t.db' AS two;.  
bbb0: 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20      BEGIN;.     
bbc0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
bbd0: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 31 20  1;.    }.  } {1 
bbe0: 32 20 33 20 34 7d 0a 20 20 64 6f 5f 74 65 73 74  2 3 4}.  do_test
bbf0: 20 70 61 67 65 72 31 2d 31 37 2e 24 74 6e 2e 32   pager1-17.$tn.2
bc00: 2e 32 20 7b 20 73 71 6c 31 20 22 49 4e 53 45 52  .2 { sql1 "INSER
bc10: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
bc20: 28 35 2c 20 36 29 22 20 7d 20 7b 7d 0a 20 20 64  (5, 6)" } {}.  d
bc30: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 37  o_test pager1-17
bc40: 2e 24 74 6e 2e 32 2e 33 20 7b 20 73 71 6c 32 20  .$tn.2.3 { sql2 
bc50: 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74  "SELECT * FROM t
bc60: 31 22 20 7d 20 20 20 20 20 20 20 20 20 20 20 20  1" }            
bc70: 7b 31 20 32 20 33 20 34 7d 0a 20 20 64 6f 5f 74  {1 2 3 4}.  do_t
bc80: 65 73 74 20 70 61 67 65 72 31 2d 31 37 2e 24 74  est pager1-17.$t
bc90: 6e 2e 32 2e 34 20 7b 20 73 71 6c 32 20 22 43 4f  n.2.4 { sql2 "CO
bca0: 4d 4d 49 54 20 3b 20 53 45 4c 45 43 54 20 2a 20  MMIT ; SELECT * 
bcb0: 46 52 4f 4d 20 74 31 22 20 7d 20 20 20 7b 31 20  FROM t1" }   {1 
bcc0: 32 20 33 20 34 20 35 20 36 7d 0a 0a 20 20 64 6f  2 3 4 5 6}..  do
bcd0: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 37 2e  _test pager1-17.
bce0: 24 74 6e 2e 33 2e 31 20 7b 0a 20 20 20 20 63 6f  $tn.3.1 {.    co
bcf0: 64 65 32 20 7b 0a 20 20 20 20 20 20 64 62 32 20  de2 {.      db2 
bd00: 63 6c 6f 73 65 0a 20 20 20 20 20 20 73 71 6c 69  close.      sqli
bd10: 74 65 33 20 64 62 32 20 3a 6d 65 6d 6f 72 79 3a  te3 db2 :memory:
bd20: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 32 20  .    }.    sql2 
bd30: 7b 20 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20  { .      PRAGMA 
bd40: 6f 6d 69 74 5f 72 65 61 64 6c 6f 63 6b 20 3d 20  omit_readlock = 
bd50: 31 3b 0a 20 20 20 20 20 20 41 54 54 41 43 48 20  1;.      ATTACH 
bd60: 27 74 65 73 74 2e 64 62 27 20 41 53 20 74 77 6f  'test.db' AS two
bd70: 3b 0a 20 20 20 20 20 20 42 45 47 49 4e 3b 0a 20  ;.      BEGIN;. 
bd80: 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52       SELECT * FR
bd90: 4f 4d 20 74 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  OM t1;.    }.  }
bda0: 20 7b 31 20 32 20 33 20 34 20 35 20 36 7d 0a 20   {1 2 3 4 5 6}. 
bdb0: 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
bdc0: 31 37 2e 24 74 6e 2e 33 2e 32 20 7b 0a 20 20 20  17.$tn.3.2 {.   
bdd0: 20 63 73 71 6c 31 20 7b 20 49 4e 53 45 52 54 20   csql1 { INSERT 
bde0: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 33  INTO t1 VALUES(3
bdf0: 2c 20 34 29 20 7d 0a 20 20 7d 20 7b 31 20 7b 64  , 4) }.  } {1 {d
be00: 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65  atabase is locke
be10: 64 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61  d}}.  do_test pa
be20: 67 65 72 31 2d 31 37 2e 24 74 6e 2e 33 2e 33 20  ger1-17.$tn.3.3 
be30: 7b 20 73 71 6c 32 20 43 4f 4d 4d 49 54 20 7d 20  { sql2 COMMIT } 
be40: 7b 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  {}.}..#---------
be50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
be60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
be70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
be80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
be90: 0a 23 20 54 65 73 74 20 74 68 65 20 70 61 67 65  .# Test the page
bea0: 72 73 20 72 65 73 70 6f 6e 73 65 20 74 6f 20 74  rs response to t
beb0: 68 65 20 62 2d 74 72 65 65 20 6c 61 79 65 72 20  he b-tree layer 
bec0: 72 65 71 75 65 73 74 69 6e 67 20 69 6c 6c 65 67  requesting illeg
bed0: 61 6c 20 70 61 67 65 20 0a 23 20 6e 75 6d 62 65  al page .# numbe
bee0: 72 73 3a 0a 23 0a 23 20 20 20 2b 20 54 68 65 20  rs:.#.#   + The 
bef0: 6c 6f 63 6b 69 6e 67 20 70 61 67 65 2c 0a 23 20  locking page,.# 
bf00: 20 20 2b 20 50 61 67 65 20 30 2c 0a 23 20 20 20    + Page 0,.#   
bf10: 2b 20 41 20 70 61 67 65 20 77 69 74 68 20 61 20  + A page with a 
bf20: 70 61 67 65 20 6e 75 6d 62 65 72 20 67 72 65 61  page number grea
bf30: 74 65 72 20 74 68 61 6e 20 28 32 5e 33 31 2d 31  ter than (2^31-1
bf40: 29 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 70 61 67  )..#.do_test pag
bf50: 65 72 31 2d 31 38 2e 31 20 7b 0a 20 20 66 61 75  er1-18.1 {.  fau
bf60: 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64  ltsim_delete_and
bf70: 5f 72 65 6f 70 65 6e 0a 20 20 64 62 20 66 75 6e  _reopen.  db fun
bf80: 63 20 61 5f 73 74 72 69 6e 67 20 61 5f 73 74 72  c a_string a_str
bf90: 69 6e 67 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  ing.  execsql { 
bfa0: 0a 20 20 20 20 50 52 41 47 4d 41 20 70 61 67 65  .    PRAGMA page
bfb0: 5f 73 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20  _size = 1024;.  
bfc0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
bfd0: 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 49 4e 53  1(a, b);.    INS
bfe0: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
bff0: 45 53 28 61 5f 73 74 72 69 6e 67 28 35 30 30 29  ES(a_string(500)
c000: 2c 20 61 5f 73 74 72 69 6e 67 28 32 30 30 29 29  , a_string(200))
c010: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
c020: 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74  O t1 SELECT a_st
c030: 72 69 6e 67 28 35 30 30 29 2c 20 61 5f 73 74 72  ring(500), a_str
c040: 69 6e 67 28 32 30 30 29 20 46 52 4f 4d 20 74 31  ing(200) FROM t1
c050: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
c060: 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74  O t1 SELECT a_st
c070: 72 69 6e 67 28 35 30 30 29 2c 20 61 5f 73 74 72  ring(500), a_str
c080: 69 6e 67 28 32 30 30 29 20 46 52 4f 4d 20 74 31  ing(200) FROM t1
c090: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
c0a0: 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74  O t1 SELECT a_st
c0b0: 72 69 6e 67 28 35 30 30 29 2c 20 61 5f 73 74 72  ring(500), a_str
c0c0: 69 6e 67 28 32 30 30 29 20 46 52 4f 4d 20 74 31  ing(200) FROM t1
c0d0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
c0e0: 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74  O t1 SELECT a_st
c0f0: 72 69 6e 67 28 35 30 30 29 2c 20 61 5f 73 74 72  ring(500), a_str
c100: 69 6e 67 28 32 30 30 29 20 46 52 4f 4d 20 74 31  ing(200) FROM t1
c110: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
c120: 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74  O t1 SELECT a_st
c130: 72 69 6e 67 28 35 30 30 29 2c 20 61 5f 73 74 72  ring(500), a_str
c140: 69 6e 67 28 32 30 30 29 20 46 52 4f 4d 20 74 31  ing(200) FROM t1
c150: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
c160: 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74  O t1 SELECT a_st
c170: 72 69 6e 67 28 35 30 30 29 2c 20 61 5f 73 74 72  ring(500), a_str
c180: 69 6e 67 28 32 30 30 29 20 46 52 4f 4d 20 74 31  ing(200) FROM t1
c190: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
c1a0: 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74  O t1 SELECT a_st
c1b0: 72 69 6e 67 28 35 30 30 29 2c 20 61 5f 73 74 72  ring(500), a_str
c1c0: 69 6e 67 28 32 30 30 29 20 46 52 4f 4d 20 74 31  ing(200) FROM t1
c1d0: 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65  ;.  }.} {}.do_te
c1e0: 73 74 20 70 61 67 65 72 31 2d 31 38 2e 32 20 7b  st pager1-18.2 {
c1f0: 0a 20 20 73 65 74 20 72 6f 6f 74 20 5b 64 62 20  .  set root [db 
c200: 6f 6e 65 20 22 53 45 4c 45 43 54 20 72 6f 6f 74  one "SELECT root
c210: 70 61 67 65 20 46 52 4f 4d 20 73 71 6c 69 74 65  page FROM sqlite
c220: 5f 6d 61 73 74 65 72 22 5d 0a 20 20 73 65 74 20  _master"].  set 
c230: 6c 6f 63 6b 69 6e 67 70 61 67 65 20 5b 65 78 70  lockingpage [exp
c240: 72 20 28 30 78 31 30 30 30 30 2f 31 30 32 34 29  r (0x10000/1024)
c250: 20 2b 20 31 5d 0a 20 20 65 78 65 63 73 71 6c 20   + 1].  execsql 
c260: 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 77 72 69  {.    PRAGMA wri
c270: 74 61 62 6c 65 5f 73 63 68 65 6d 61 20 3d 20 31  table_schema = 1
c280: 3b 0a 20 20 20 20 55 50 44 41 54 45 20 73 71 6c  ;.    UPDATE sql
c290: 69 74 65 5f 6d 61 73 74 65 72 20 53 45 54 20 72  ite_master SET r
c2a0: 6f 6f 74 70 61 67 65 20 3d 20 24 6c 6f 63 6b 69  ootpage = $locki
c2b0: 6e 67 70 61 67 65 3b 0a 20 20 7d 0a 20 20 73 71  ngpage;.  }.  sq
c2c0: 6c 69 74 65 33 20 64 62 32 20 74 65 73 74 2e 64  lite3 db2 test.d
c2d0: 62 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20 53  b.  catchsql { S
c2e0: 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
c2f0: 52 4f 4d 20 74 31 20 7d 20 64 62 32 0a 7d 20 7b  ROM t1 } db2.} {
c300: 31 20 7b 64 61 74 61 62 61 73 65 20 64 69 73 6b  1 {database disk
c310: 20 69 6d 61 67 65 20 69 73 20 6d 61 6c 66 6f 72   image is malfor
c320: 6d 65 64 7d 7d 0a 64 62 32 20 63 6c 6f 73 65 0a  med}}.db2 close.
c330: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31  do_test pager1-1
c340: 38 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  8.3 {.  execsql 
c350: 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  {.    CREATE TAB
c360: 4c 45 20 74 32 28 78 29 3b 0a 20 20 20 20 49 4e  LE t2(x);.    IN
c370: 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c  SERT INTO t2 VAL
c380: 55 45 53 28 61 5f 73 74 72 69 6e 67 28 35 30 30  UES(a_string(500
c390: 30 29 29 3b 0a 20 20 7d 0a 20 20 73 65 74 20 70  0));.  }.  set p
c3a0: 67 6e 6f 20 5b 65 78 70 72 20 28 5b 66 69 6c 65  gno [expr ([file
c3b0: 20 73 69 7a 65 20 74 65 73 74 2e 64 62 5d 20 2f   size test.db] /
c3c0: 20 31 30 32 34 29 2d 32 5d 0a 20 20 68 65 78 69   1024)-2].  hexi
c3d0: 6f 5f 77 72 69 74 65 20 74 65 73 74 2e 64 62 20  o_write test.db 
c3e0: 5b 65 78 70 72 20 28 24 70 67 6e 6f 2d 31 29 2a  [expr ($pgno-1)*
c3f0: 31 30 32 34 5d 20 30 30 30 30 30 30 30 30 0a 20  1024] 00000000. 
c400: 20 73 71 6c 69 74 65 33 20 64 62 32 20 74 65 73   sqlite3 db2 tes
c410: 74 2e 64 62 0a 20 20 63 61 74 63 68 73 71 6c 20  t.db.  catchsql 
c420: 7b 20 53 45 4c 45 43 54 20 6c 65 6e 67 74 68 28  { SELECT length(
c430: 78 29 20 46 52 4f 4d 20 74 32 20 7d 20 64 62 32  x) FROM t2 } db2
c440: 0a 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20  .} {1 {database 
c450: 64 69 73 6b 20 69 6d 61 67 65 20 69 73 20 6d 61  disk image is ma
c460: 6c 66 6f 72 6d 65 64 7d 7d 0a 64 62 32 20 63 6c  lformed}}.db2 cl
c470: 6f 73 65 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  ose.do_test page
c480: 72 31 2d 31 38 2e 34 20 7b 0a 20 20 68 65 78 69  r1-18.4 {.  hexi
c490: 6f 5f 77 72 69 74 65 20 74 65 73 74 2e 64 62 20  o_write test.db 
c4a0: 5b 65 78 70 72 20 28 24 70 67 6e 6f 2d 31 29 2a  [expr ($pgno-1)*
c4b0: 31 30 32 34 5d 20 39 30 30 30 30 30 30 30 0a 20  1024] 90000000. 
c4c0: 20 73 71 6c 69 74 65 33 20 64 62 32 20 74 65 73   sqlite3 db2 tes
c4d0: 74 2e 64 62 0a 20 20 63 61 74 63 68 73 71 6c 20  t.db.  catchsql 
c4e0: 7b 20 53 45 4c 45 43 54 20 6c 65 6e 67 74 68 28  { SELECT length(
c4f0: 78 29 20 46 52 4f 4d 20 74 32 20 7d 20 64 62 32  x) FROM t2 } db2
c500: 0a 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20  .} {1 {database 
c510: 64 69 73 6b 20 69 6d 61 67 65 20 69 73 20 6d 61  disk image is ma
c520: 6c 66 6f 72 6d 65 64 7d 7d 0a 64 62 32 20 63 6c  lformed}}.db2 cl
c530: 6f 73 65 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  ose.do_test page
c540: 72 31 2d 31 38 2e 35 20 7b 0a 20 20 73 71 6c 69  r1-18.5 {.  sqli
c550: 74 65 33 20 64 62 20 22 22 0a 20 20 65 78 65 63  te3 db "".  exec
c560: 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45  sql {.    CREATE
c570: 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b   TABLE t1(a, b);
c580: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
c590: 45 20 74 32 28 61 2c 20 62 29 3b 0a 20 20 20 20  E t2(a, b);.    
c5a0: 50 52 41 47 4d 41 20 77 72 69 74 61 62 6c 65 5f  PRAGMA writable_
c5b0: 73 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20  schema = 1;.    
c5c0: 55 50 44 41 54 45 20 73 71 6c 69 74 65 5f 6d 61  UPDATE sqlite_ma
c5d0: 73 74 65 72 20 53 45 54 20 72 6f 6f 74 70 61 67  ster SET rootpag
c5e0: 65 3d 35 20 57 48 45 52 45 20 74 62 6c 5f 6e 61  e=5 WHERE tbl_na
c5f0: 6d 65 20 3d 20 27 74 31 27 3b 0a 20 20 20 20 50  me = 't1';.    P
c600: 52 41 47 4d 41 20 77 72 69 74 61 62 6c 65 5f 73  RAGMA writable_s
c610: 63 68 65 6d 61 20 3d 20 30 3b 0a 20 20 20 20 41  chema = 0;.    A
c620: 4c 54 45 52 20 54 41 42 4c 45 20 74 31 20 52 45  LTER TABLE t1 RE
c630: 4e 41 4d 45 20 54 4f 20 78 31 3b 0a 20 20 7d 0a  NAME TO x1;.  }.
c640: 20 20 63 61 74 63 68 73 71 6c 20 7b 20 53 45 4c    catchsql { SEL
c650: 45 43 54 20 2a 20 46 52 4f 4d 20 78 31 20 7d 0a  ECT * FROM x1 }.
c660: 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20 64  } {1 {database d
c670: 69 73 6b 20 69 6d 61 67 65 20 69 73 20 6d 61 6c  isk image is mal
c680: 66 6f 72 6d 65 64 7d 7d 0a 64 62 20 63 6c 6f 73  formed}}.db clos
c690: 65 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  e..do_test pager
c6a0: 31 2d 31 38 2e 36 20 7b 0a 20 20 66 61 75 6c 74  1-18.6 {.  fault
c6b0: 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72  sim_delete_and_r
c6c0: 65 6f 70 65 6e 0a 20 20 64 62 20 66 75 6e 63 20  eopen.  db func 
c6d0: 61 5f 73 74 72 69 6e 67 20 61 5f 73 74 72 69 6e  a_string a_strin
c6e0: 67 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  g.  execsql {.  
c6f0: 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69    PRAGMA page_si
c700: 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20 20 20 43  ze = 1024;.    C
c710: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 78  REATE TABLE t1(x
c720: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
c730: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 61 5f 73  TO t1 VALUES(a_s
c740: 74 72 69 6e 67 28 38 30 30 29 29 3b 0a 20 20 20  tring(800));.   
c750: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
c760: 56 41 4c 55 45 53 28 61 5f 73 74 72 69 6e 67 28  VALUES(a_string(
c770: 38 30 30 29 29 3b 0a 20 20 7d 0a 0a 20 20 73 65  800));.  }..  se
c780: 74 20 72 6f 6f 74 20 5b 64 62 20 6f 6e 65 20 22  t root [db one "
c790: 53 45 4c 45 43 54 20 72 6f 6f 74 70 61 67 65 20  SELECT rootpage 
c7a0: 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
c7b0: 65 72 22 5d 0a 20 20 64 62 20 63 6c 6f 73 65 0a  er"].  db close.
c7c0: 0a 20 20 68 65 78 69 6f 5f 77 72 69 74 65 20 74  .  hexio_write t
c7d0: 65 73 74 2e 64 62 20 5b 65 78 70 72 20 28 24 72  est.db [expr ($r
c7e0: 6f 6f 74 2d 31 29 2a 31 30 32 34 20 2b 20 38 5d  oot-1)*1024 + 8]
c7f0: 20 30 30 30 30 30 30 30 30 0a 20 20 73 71 6c 69   00000000.  sqli
c800: 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20  te3 db test.db. 
c810: 20 63 61 74 63 68 73 71 6c 20 7b 20 53 45 4c 45   catchsql { SELE
c820: 43 54 20 6c 65 6e 67 74 68 28 78 29 20 46 52 4f  CT length(x) FRO
c830: 4d 20 74 31 20 7d 0a 7d 20 7b 31 20 7b 64 61 74  M t1 }.} {1 {dat
c840: 61 62 61 73 65 20 64 69 73 6b 20 69 6d 61 67 65  abase disk image
c850: 20 69 73 20 6d 61 6c 66 6f 72 6d 65 64 7d 7d 0a   is malformed}}.
c860: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
c870: 31 39 2e 31 20 7b 0a 20 20 73 71 6c 69 74 65 33  19.1 {.  sqlite3
c880: 20 64 62 20 22 22 0a 20 20 64 62 20 66 75 6e 63   db "".  db func
c890: 20 61 5f 73 74 72 69 6e 67 20 61 5f 73 74 72 69   a_string a_stri
c8a0: 6e 67 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  ng.  execsql {. 
c8b0: 20 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73     PRAGMA page_s
c8c0: 69 7a 65 20 3d 20 35 31 32 3b 0a 20 20 20 20 50  ize = 512;.    P
c8d0: 52 41 47 4d 41 20 61 75 74 6f 5f 76 61 63 75 75  RAGMA auto_vacuu
c8e0: 6d 20 3d 20 31 3b 0a 20 20 20 20 43 52 45 41 54  m = 1;.    CREAT
c8f0: 45 20 54 41 42 4c 45 20 74 31 28 61 61 2c 20 61  E TABLE t1(aa, a
c900: 62 2c 20 61 63 2c 20 61 64 2c 20 61 65 2c 20 61  b, ac, ad, ae, a
c910: 66 2c 20 61 67 2c 20 61 68 2c 20 61 69 2c 20 61  f, ag, ah, ai, a
c920: 6a 2c 20 61 6b 2c 20 61 6c 2c 20 61 6d 2c 20 61  j, ak, al, am, a
c930: 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n,.             
c940: 20 20 20 20 20 20 20 62 61 2c 20 62 62 2c 20 62         ba, bb, b
c950: 63 2c 20 62 64 2c 20 62 65 2c 20 62 66 2c 20 62  c, bd, be, bf, b
c960: 67 2c 20 62 68 2c 20 62 69 2c 20 62 6a 2c 20 62  g, bh, bi, bj, b
c970: 6b 2c 20 62 6c 2c 20 62 6d 2c 20 62 6e 2c 0a 20  k, bl, bm, bn,. 
c980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c990: 20 20 20 63 61 2c 20 63 62 2c 20 63 63 2c 20 63     ca, cb, cc, c
c9a0: 64 2c 20 63 65 2c 20 63 66 2c 20 63 67 2c 20 63  d, ce, cf, cg, c
c9b0: 68 2c 20 63 69 2c 20 63 6a 2c 20 63 6b 2c 20 63  h, ci, cj, ck, c
c9c0: 6c 2c 20 63 6d 2c 20 63 6e 2c 0a 20 20 20 20 20  l, cm, cn,.     
c9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
c9e0: 61 2c 20 64 62 2c 20 64 63 2c 20 64 64 2c 20 64  a, db, dc, dd, d
c9f0: 65 2c 20 64 66 2c 20 64 67 2c 20 64 68 2c 20 64  e, df, dg, dh, d
ca00: 69 2c 20 64 6a 2c 20 64 6b 2c 20 64 6c 2c 20 64  i, dj, dk, dl, d
ca10: 6d 2c 20 64 6e 2c 0a 20 20 20 20 20 20 20 20 20  m, dn,.         
ca20: 20 20 20 20 20 20 20 20 20 20 20 65 61 2c 20 65             ea, e
ca30: 62 2c 20 65 63 2c 20 65 64 2c 20 65 65 2c 20 65  b, ec, ed, ee, e
ca40: 66 2c 20 65 67 2c 20 65 68 2c 20 65 69 2c 20 65  f, eg, eh, ei, e
ca50: 6a 2c 20 65 6b 2c 20 65 6c 2c 20 65 6d 2c 20 65  j, ek, el, em, e
ca60: 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n,.             
ca70: 20 20 20 20 20 20 20 66 61 2c 20 66 62 2c 20 66         fa, fb, f
ca80: 63 2c 20 66 64 2c 20 66 65 2c 20 66 66 2c 20 66  c, fd, fe, ff, f
ca90: 67 2c 20 66 68 2c 20 66 69 2c 20 66 6a 2c 20 66  g, fh, fi, fj, f
caa0: 6b 2c 20 66 6c 2c 20 66 6d 2c 20 66 6e 2c 0a 20  k, fl, fm, fn,. 
cab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cac0: 20 20 20 67 61 2c 20 67 62 2c 20 67 63 2c 20 67     ga, gb, gc, g
cad0: 64 2c 20 67 65 2c 20 67 66 2c 20 67 67 2c 20 67  d, ge, gf, gg, g
cae0: 68 2c 20 67 69 2c 20 67 6a 2c 20 67 6b 2c 20 67  h, gi, gj, gk, g
caf0: 6c 2c 20 67 6d 2c 20 67 6e 2c 0a 20 20 20 20 20  l, gm, gn,.     
cb00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 68                 h
cb10: 61 2c 20 68 62 2c 20 68 63 2c 20 68 64 2c 20 68  a, hb, hc, hd, h
cb20: 65 2c 20 68 66 2c 20 68 67 2c 20 68 68 2c 20 68  e, hf, hg, hh, h
cb30: 69 2c 20 68 6a 2c 20 68 6b 2c 20 68 6c 2c 20 68  i, hj, hk, hl, h
cb40: 6d 2c 20 68 6e 2c 0a 20 20 20 20 20 20 20 20 20  m, hn,.         
cb50: 20 20 20 20 20 20 20 20 20 20 20 69 61 2c 20 69             ia, i
cb60: 62 2c 20 69 63 2c 20 69 64 2c 20 69 65 2c 20 69  b, ic, id, ie, i
cb70: 66 2c 20 69 67 2c 20 69 68 2c 20 69 69 2c 20 69  f, ig, ih, ii, i
cb80: 6a 2c 20 69 6b 2c 20 69 6c 2c 20 69 6d 2c 20 69  j, ik, il, im, i
cb90: 78 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  x,.             
cba0: 20 20 20 20 20 20 20 6a 61 2c 20 6a 62 2c 20 6a         ja, jb, j
cbb0: 63 2c 20 6a 64 2c 20 6a 65 2c 20 6a 66 2c 20 6a  c, jd, je, jf, j
cbc0: 67 2c 20 6a 68 2c 20 6a 69 2c 20 6a 6a 2c 20 6a  g, jh, ji, jj, j
cbd0: 6b 2c 20 6a 6c 2c 20 6a 6d 2c 20 6a 6e 2c 0a 20  k, jl, jm, jn,. 
cbe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cbf0: 20 20 20 6b 61 2c 20 6b 62 2c 20 6b 63 2c 20 6b     ka, kb, kc, k
cc00: 64 2c 20 6b 65 2c 20 6b 66 2c 20 6b 67 2c 20 6b  d, ke, kf, kg, k
cc10: 68 2c 20 6b 69 2c 20 6b 6a 2c 20 6b 6b 2c 20 6b  h, ki, kj, kk, k
cc20: 6c 2c 20 6b 6d 2c 20 6b 6e 2c 0a 20 20 20 20 20  l, km, kn,.     
cc30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c                 l
cc40: 61 2c 20 6c 62 2c 20 6c 63 2c 20 6c 64 2c 20 6c  a, lb, lc, ld, l
cc50: 65 2c 20 6c 66 2c 20 6c 67 2c 20 6c 68 2c 20 6c  e, lf, lg, lh, l
cc60: 69 2c 20 6c 6a 2c 20 6c 6b 2c 20 6c 6c 2c 20 6c  i, lj, lk, ll, l
cc70: 6d 2c 20 6c 6e 2c 0a 20 20 20 20 20 20 20 20 20  m, ln,.         
cc80: 20 20 20 20 20 20 20 20 20 20 20 6d 61 2c 20 6d             ma, m
cc90: 62 2c 20 6d 63 2c 20 6d 64 2c 20 6d 65 2c 20 6d  b, mc, md, me, m
cca0: 66 2c 20 6d 67 2c 20 6d 68 2c 20 6d 69 2c 20 6d  f, mg, mh, mi, m
ccb0: 6a 2c 20 6d 6b 2c 20 6d 6c 2c 20 6d 6d 2c 20 6d  j, mk, ml, mm, m
ccc0: 6e 0a 20 20 20 20 29 3b 0a 20 20 20 20 43 52 45  n.    );.    CRE
ccd0: 41 54 45 20 54 41 42 4c 45 20 74 32 28 61 61 2c  ATE TABLE t2(aa,
cce0: 20 61 62 2c 20 61 63 2c 20 61 64 2c 20 61 65 2c   ab, ac, ad, ae,
ccf0: 20 61 66 2c 20 61 67 2c 20 61 68 2c 20 61 69 2c   af, ag, ah, ai,
cd00: 20 61 6a 2c 20 61 6b 2c 20 61 6c 2c 20 61 6d 2c   aj, ak, al, am,
cd10: 20 61 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20   an,.           
cd20: 20 20 20 20 20 20 20 20 20 62 61 2c 20 62 62 2c           ba, bb,
cd30: 20 62 63 2c 20 62 64 2c 20 62 65 2c 20 62 66 2c   bc, bd, be, bf,
cd40: 20 62 67 2c 20 62 68 2c 20 62 69 2c 20 62 6a 2c   bg, bh, bi, bj,
cd50: 20 62 6b 2c 20 62 6c 2c 20 62 6d 2c 20 62 6e 2c   bk, bl, bm, bn,
cd60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
cd70: 20 20 20 20 20 63 61 2c 20 63 62 2c 20 63 63 2c       ca, cb, cc,
cd80: 20 63 64 2c 20 63 65 2c 20 63 66 2c 20 63 67 2c   cd, ce, cf, cg,
cd90: 20 63 68 2c 20 63 69 2c 20 63 6a 2c 20 63 6b 2c   ch, ci, cj, ck,
cda0: 20 63 6c 2c 20 63 6d 2c 20 63 6e 2c 0a 20 20 20   cl, cm, cn,.   
cdb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cdc0: 20 64 61 2c 20 64 62 2c 20 64 63 2c 20 64 64 2c   da, db, dc, dd,
cdd0: 20 64 65 2c 20 64 66 2c 20 64 67 2c 20 64 68 2c   de, df, dg, dh,
cde0: 20 64 69 2c 20 64 6a 2c 20 64 6b 2c 20 64 6c 2c   di, dj, dk, dl,
cdf0: 20 64 6d 2c 20 64 6e 2c 0a 20 20 20 20 20 20 20   dm, dn,.       
ce00: 20 20 20 20 20 20 20 20 20 20 20 20 20 65 61 2c               ea,
ce10: 20 65 62 2c 20 65 63 2c 20 65 64 2c 20 65 65 2c   eb, ec, ed, ee,
ce20: 20 65 66 2c 20 65 67 2c 20 65 68 2c 20 65 69 2c   ef, eg, eh, ei,
ce30: 20 65 6a 2c 20 65 6b 2c 20 65 6c 2c 20 65 6d 2c   ej, ek, el, em,
ce40: 20 65 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20   en,.           
ce50: 20 20 20 20 20 20 20 20 20 66 61 2c 20 66 62 2c           fa, fb,
ce60: 20 66 63 2c 20 66 64 2c 20 66 65 2c 20 66 66 2c   fc, fd, fe, ff,
ce70: 20 66 67 2c 20 66 68 2c 20 66 69 2c 20 66 6a 2c   fg, fh, fi, fj,
ce80: 20 66 6b 2c 20 66 6c 2c 20 66 6d 2c 20 66 6e 2c   fk, fl, fm, fn,
ce90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
cea0: 20 20 20 20 20 67 61 2c 20 67 62 2c 20 67 63 2c       ga, gb, gc,
ceb0: 20 67 64 2c 20 67 65 2c 20 67 66 2c 20 67 67 2c   gd, ge, gf, gg,
cec0: 20 67 68 2c 20 67 69 2c 20 67 6a 2c 20 67 6b 2c   gh, gi, gj, gk,
ced0: 20 67 6c 2c 20 67 6d 2c 20 67 6e 2c 0a 20 20 20   gl, gm, gn,.   
cee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cef0: 20 68 61 2c 20 68 62 2c 20 68 63 2c 20 68 64 2c   ha, hb, hc, hd,
cf00: 20 68 65 2c 20 68 66 2c 20 68 67 2c 20 68 68 2c   he, hf, hg, hh,
cf10: 20 68 69 2c 20 68 6a 2c 20 68 6b 2c 20 68 6c 2c   hi, hj, hk, hl,
cf20: 20 68 6d 2c 20 68 6e 2c 0a 20 20 20 20 20 20 20   hm, hn,.       
cf30: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 61 2c               ia,
cf40: 20 69 62 2c 20 69 63 2c 20 69 64 2c 20 69 65 2c   ib, ic, id, ie,
cf50: 20 69 66 2c 20 69 67 2c 20 69 68 2c 20 69 69 2c   if, ig, ih, ii,
cf60: 20 69 6a 2c 20 69 6b 2c 20 69 6c 2c 20 69 6d 2c   ij, ik, il, im,
cf70: 20 69 78 2c 0a 20 20 20 20 20 20 20 20 20 20 20   ix,.           
cf80: 20 20 20 20 20 20 20 20 20 6a 61 2c 20 6a 62 2c           ja, jb,
cf90: 20 6a 63 2c 20 6a 64 2c 20 6a 65 2c 20 6a 66 2c   jc, jd, je, jf,
cfa0: 20 6a 67 2c 20 6a 68 2c 20 6a 69 2c 20 6a 6a 2c   jg, jh, ji, jj,
cfb0: 20 6a 6b 2c 20 6a 6c 2c 20 6a 6d 2c 20 6a 6e 2c   jk, jl, jm, jn,
cfc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
cfd0: 20 20 20 20 20 6b 61 2c 20 6b 62 2c 20 6b 63 2c       ka, kb, kc,
cfe0: 20 6b 64 2c 20 6b 65 2c 20 6b 66 2c 20 6b 67 2c   kd, ke, kf, kg,
cff0: 20 6b 68 2c 20 6b 69 2c 20 6b 6a 2c 20 6b 6b 2c   kh, ki, kj, kk,
d000: 20 6b 6c 2c 20 6b 6d 2c 20 6b 6e 2c 0a 20 20 20   kl, km, kn,.   
d010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d020: 20 6c 61 2c 20 6c 62 2c 20 6c 63 2c 20 6c 64 2c   la, lb, lc, ld,
d030: 20 6c 65 2c 20 6c 66 2c 20 6c 67 2c 20 6c 68 2c   le, lf, lg, lh,
d040: 20 6c 69 2c 20 6c 6a 2c 20 6c 6b 2c 20 6c 6c 2c   li, lj, lk, ll,
d050: 20 6c 6d 2c 20 6c 6e 2c 0a 20 20 20 20 20 20 20   lm, ln,.       
d060: 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 61 2c               ma,
d070: 20 6d 62 2c 20 6d 63 2c 20 6d 64 2c 20 6d 65 2c   mb, mc, md, me,
d080: 20 6d 66 2c 20 6d 67 2c 20 6d 68 2c 20 6d 69 2c   mf, mg, mh, mi,
d090: 20 6d 6a 2c 20 6d 6b 2c 20 6d 6c 2c 20 6d 6d 2c   mj, mk, ml, mm,
d0a0: 20 6d 6e 0a 20 20 20 20 29 3b 0a 20 20 20 20 49   mn.    );.    I
d0b0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 28 61 61  NSERT INTO t1(aa
d0c0: 29 20 56 41 4c 55 45 53 28 20 61 5f 73 74 72 69  ) VALUES( a_stri
d0d0: 6e 67 28 31 30 30 30 30 30 29 20 29 3b 0a 20 20  ng(100000) );.  
d0e0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32    INSERT INTO t2
d0f0: 28 61 61 29 20 56 41 4c 55 45 53 28 20 61 5f 73  (aa) VALUES( a_s
d100: 74 72 69 6e 67 28 31 30 30 30 30 30 29 20 29 3b  tring(100000) );
d110: 0a 20 20 20 20 56 41 43 55 55 4d 3b 0a 20 20 7d  .    VACUUM;.  }
d120: 0a 7d 20 7b 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  .} {}..#--------
d130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d170: 2d 0a 23 20 54 65 73 74 20 61 20 63 6f 75 70 6c  -.# Test a coupl
d180: 65 20 6f 66 20 73 70 65 63 69 61 6c 20 63 61 73  e of special cas
d190: 65 73 20 74 68 61 74 20 63 6f 6d 65 20 75 70 20  es that come up 
d1a0: 77 68 69 6c 65 20 63 6f 6d 6d 69 74 74 69 6e 67  while committing
d1b0: 20 0a 23 20 74 72 61 6e 73 61 63 74 69 6f 6e 73   .# transactions
d1c0: 3a 0a 23 0a 23 20 20 20 70 61 67 65 72 31 2d 32  :.#.#   pager1-2
d1d0: 30 2e 31 2e 2a 3a 20 43 6f 6d 6d 69 74 74 69 6e  0.1.*: Committin
d1e0: 67 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  g an in-memory d
d1f0: 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74  atabase transact
d200: 69 6f 6e 20 77 68 65 6e 20 74 68 65 20 0a 23 20  ion when the .# 
d210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d220: 20 64 61 74 61 62 61 73 65 20 68 61 73 20 6e 6f   database has no
d230: 74 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20  t been modified 
d240: 61 74 20 61 6c 6c 2e 0a 23 0a 23 20 20 20 70 61  at all..#.#   pa
d250: 67 65 72 31 2d 32 30 2e 32 2e 2a 3a 20 41 73 20  ger1-20.2.*: As 
d260: 61 62 6f 76 65 2c 20 62 75 74 20 77 69 74 68 20  above, but with 
d270: 61 20 6e 6f 72 6d 61 6c 20 64 62 20 69 6e 20 65  a normal db in e
d280: 78 63 6c 75 73 69 76 65 2d 6c 6f 63 6b 69 6e 67  xclusive-locking
d290: 20 6d 6f 64 65 2e 0a 23 0a 23 20 20 20 70 61 67   mode..#.#   pag
d2a0: 65 72 31 2d 32 30 2e 33 2e 2a 3a 20 43 6f 6d 6d  er1-20.3.*: Comm
d2b0: 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63  itting a transac
d2c0: 74 69 6f 6e 20 69 6e 20 57 41 4c 20 6d 6f 64 65  tion in WAL mode
d2d0: 20 77 68 65 72 65 20 74 68 65 20 64 61 74 61 62   where the datab
d2e0: 61 73 65 20 68 61 73 0a 23 20 20 20 20 20 20 20  ase has.#       
d2f0: 20 20 20 20 20 20 20 20 20 20 20 62 65 65 6e 20             been 
d300: 6d 6f 64 69 66 69 65 64 2c 20 62 75 74 20 61 6c  modified, but al
d310: 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 68 61  l dirty pages ha
d320: 76 65 20 62 65 65 6e 20 66 6c 75 73 68 65 64 20  ve been flushed 
d330: 74 6f 20 0a 23 20 20 20 20 20 20 20 20 20 20 20  to .#           
d340: 20 20 20 20 20 20 20 64 69 73 6b 20 62 65 66 6f         disk befo
d350: 72 65 20 74 68 65 20 63 6f 6d 6d 69 74 2e 0a 23  re the commit..#
d360: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
d370: 32 30 2e 31 2e 31 20 7b 0a 20 20 63 61 74 63 68  20.1.1 {.  catch
d380: 20 7b 64 62 20 63 6c 6f 73 65 7d 0a 20 20 73 71   {db close}.  sq
d390: 6c 69 74 65 33 20 64 62 20 3a 6d 65 6d 6f 72 79  lite3 db :memory
d3a0: 3a 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  :.  execsql {.  
d3b0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 6f    CREATE TABLE o
d3c0: 6e 65 28 74 77 6f 2c 20 74 68 72 65 65 29 3b 0a  ne(two, three);.
d3d0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
d3e0: 6f 6e 65 20 56 41 4c 55 45 53 28 27 61 27 2c 20  one VALUES('a', 
d3f0: 27 62 27 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64  'b');.  }.} {}.d
d400: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 30  o_test pager1-20
d410: 2e 31 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c  .1.2 {.  execsql
d420: 20 7b 0a 20 20 20 20 42 45 47 49 4e 20 45 58 43   {.    BEGIN EXC
d430: 4c 55 53 49 56 45 3b 0a 20 20 20 20 43 4f 4d 4d  LUSIVE;.    COMM
d440: 49 54 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 64 6f  IT;.  }.} {}..do
d450: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 30 2e  _test pager1-20.
d460: 32 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d  2.1 {.  faultsim
d470: 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70  _delete_and_reop
d480: 65 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  en.  execsql {. 
d490: 20 20 20 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e     PRAGMA lockin
d4a0: 67 5f 6d 6f 64 65 20 3d 20 65 78 63 6c 75 73 69  g_mode = exclusi
d4b0: 76 65 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a  ve;.    PRAGMA j
d4c0: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 70 65  ournal_mode = pe
d4d0: 72 73 69 73 74 3b 0a 20 20 20 20 43 52 45 41 54  rsist;.    CREAT
d4e0: 45 20 54 41 42 4c 45 20 6f 6e 65 28 74 77 6f 2c  E TABLE one(two,
d4f0: 20 74 68 72 65 65 29 3b 0a 20 20 20 20 49 4e 53   three);.    INS
d500: 45 52 54 20 49 4e 54 4f 20 6f 6e 65 20 56 41 4c  ERT INTO one VAL
d510: 55 45 53 28 27 61 27 2c 20 27 62 27 29 3b 0a 20  UES('a', 'b');. 
d520: 20 7d 0a 7d 20 7b 65 78 63 6c 75 73 69 76 65 20   }.} {exclusive 
d530: 70 65 72 73 69 73 74 7d 0a 64 6f 5f 74 65 73 74  persist}.do_test
d540: 20 70 61 67 65 72 31 2d 32 30 2e 32 2e 32 20 7b   pager1-20.2.2 {
d550: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
d560: 20 42 45 47 49 4e 20 45 58 43 4c 55 53 49 56 45   BEGIN EXCLUSIVE
d570: 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20  ;.    COMMIT;.  
d580: 7d 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74 20  }.} {}..do_test 
d590: 70 61 67 65 72 31 2d 32 30 2e 33 2e 31 20 7b 0a  pager1-20.3.1 {.
d5a0: 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74    faultsim_delet
d5b0: 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 64  e_and_reopen.  d
d5c0: 62 20 66 75 6e 63 20 61 5f 73 74 72 69 6e 67 20  b func a_string 
d5d0: 61 5f 73 74 72 69 6e 67 0a 20 20 65 78 65 63 73  a_string.  execs
d5e0: 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20  ql {.    PRAGMA 
d5f0: 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b  cache_size = 10;
d600: 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72  .    PRAGMA jour
d610: 6e 61 6c 5f 6d 6f 64 65 20 3d 20 77 61 6c 3b 0a  nal_mode = wal;.
d620: 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20      BEGIN;.     
d630: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
d640: 28 78 29 3b 0a 20 20 20 20 20 20 43 52 45 41 54  (x);.      CREAT
d650: 45 20 54 41 42 4c 45 20 74 32 28 79 29 3b 0a 20  E TABLE t2(y);. 
d660: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
d670: 20 74 31 20 56 41 4c 55 45 53 28 61 5f 73 74 72   t1 VALUES(a_str
d680: 69 6e 67 28 38 30 30 29 29 3b 0a 20 20 20 20 20  ing(800));.     
d690: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
d6a0: 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28  SELECT a_string(
d6b0: 38 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20  800) FROM t1;   
d6c0: 20 20 20 20 20 20 2f 2a 20 20 20 32 20 2a 2f 0a        /*   2 */.
d6d0: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
d6e0: 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74  O t1 SELECT a_st
d6f0: 72 69 6e 67 28 38 30 30 29 20 46 52 4f 4d 20 74  ring(800) FROM t
d700: 31 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20  1;         /*   
d710: 34 20 2a 2f 0a 20 20 20 20 20 20 49 4e 53 45 52  4 */.      INSER
d720: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
d730: 20 61 5f 73 74 72 69 6e 67 28 38 30 30 29 20 46   a_string(800) F
d740: 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 20 20  ROM t1;         
d750: 2f 2a 20 20 20 38 20 2a 2f 0a 20 20 20 20 20 20  /*   8 */.      
d760: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
d770: 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 38  ELECT a_string(8
d780: 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20  00) FROM t1;    
d790: 20 20 20 20 20 2f 2a 20 20 31 36 20 2a 2f 0a 20       /*  16 */. 
d7a0: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
d7b0: 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74 72   t1 SELECT a_str
d7c0: 69 6e 67 28 38 30 30 29 20 46 52 4f 4d 20 74 31  ing(800) FROM t1
d7d0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 20 33 32  ;         /*  32
d7e0: 20 2a 2f 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a   */.    COMMIT;.
d7f0: 20 20 7d 0a 7d 20 7b 77 61 6c 7d 0a 64 6f 5f 74    }.} {wal}.do_t
d800: 65 73 74 20 70 61 67 65 72 31 2d 32 30 2e 33 2e  est pager1-20.3.
d810: 32 20 7b 0a 20 20 70 72 6f 63 20 72 65 63 75 72  2 {.  proc recur
d820: 73 69 76 65 5f 73 65 6c 65 63 74 20 7b 69 64 7d  sive_select {id}
d830: 20 7b 0a 20 20 20 20 64 62 20 65 76 61 6c 20 7b   {.    db eval {
d840: 53 45 4c 45 43 54 20 72 6f 77 69 64 2c 20 78 20  SELECT rowid, x 
d850: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 72 6f  FROM t1 WHERE ro
d860: 77 69 64 20 3d 20 28 24 69 64 2d 31 29 7d 20 7b  wid = ($id-1)} {
d870: 0a 20 20 20 20 20 20 72 65 63 75 72 73 69 76 65  .      recursive
d880: 5f 73 65 6c 65 63 74 20 24 72 6f 77 69 64 0a 20  _select $rowid. 
d890: 20 20 20 7d 0a 20 20 7d 0a 20 20 65 78 65 63 73     }.  }.  execs
d8a0: 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a  ql {.    BEGIN;.
d8b0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
d8c0: 74 32 20 56 41 4c 55 45 53 28 27 78 78 78 78 27  t2 VALUES('xxxx'
d8d0: 29 3b 0a 20 20 7d 0a 20 20 72 65 63 75 72 73 69  );.  }.  recursi
d8e0: 76 65 5f 73 65 6c 65 63 74 20 33 32 0a 20 20 65  ve_select 32.  e
d8f0: 78 65 63 73 71 6c 20 43 4f 4d 4d 49 54 0a 7d 20  xecsql COMMIT.} 
d900: 7b 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  {}..#-----------
d910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
d950: 20 54 65 73 74 20 74 68 61 74 20 61 20 57 41 4c   Test that a WAL
d960: 20 64 61 74 61 62 61 73 65 20 6d 61 79 20 6e 6f   database may no
d970: 74 20 62 65 20 6f 70 65 6e 65 64 20 69 66 3a 0a  t be opened if:.
d980: 23 0a 23 20 20 20 70 61 67 65 72 31 2d 32 31 2e  #.#   pager1-21.
d990: 31 2e 2a 3a 20 54 68 65 20 56 46 53 20 68 61 73  1.*: The VFS has
d9a0: 20 61 6e 20 69 56 65 72 73 69 6f 6e 20 6c 65 73   an iVersion les
d9b0: 73 20 74 68 61 6e 20 32 2c 20 6f 72 0a 23 20 20  s than 2, or.#  
d9c0: 20 70 61 67 65 72 31 2d 32 31 2e 32 2e 2a 3a 20   pager1-21.2.*: 
d9d0: 54 68 65 20 56 46 53 20 64 6f 65 73 20 6e 6f 74  The VFS does not
d9e0: 20 70 72 6f 76 69 64 65 20 78 53 68 6d 58 58 58   provide xShmXXX
d9f0: 28 29 20 6d 65 74 68 6f 64 73 2e 0a 23 0a 64 6f  () methods..#.do
da00: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 31 2e  _test pager1-21.
da10: 30 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64  0 {.  faultsim_d
da20: 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e  elete_and_reopen
da30: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
da40: 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f   PRAGMA journal_
da50: 6d 6f 64 65 20 3d 20 57 41 4c 3b 0a 20 20 20 20  mode = WAL;.    
da60: 43 52 45 41 54 45 20 54 41 42 4c 45 20 6b 6f 28  CREATE TABLE ko(
da70: 63 20 44 45 46 41 55 4c 54 20 27 61 62 63 27 2c  c DEFAULT 'abc',
da80: 20 62 20 44 45 46 41 55 4c 54 20 27 64 65 66 27   b DEFAULT 'def'
da90: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
daa0: 54 4f 20 6b 6f 20 44 45 46 41 55 4c 54 20 56 41  TO ko DEFAULT VA
dab0: 4c 55 45 53 3b 0a 20 20 7d 0a 7d 20 7b 77 61 6c  LUES;.  }.} {wal
dac0: 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  }.do_test pager1
dad0: 2d 32 31 2e 31 20 7b 0a 20 20 74 65 73 74 76 66  -21.1 {.  testvf
dae0: 73 20 74 76 20 2d 6e 6f 73 68 6d 20 31 0a 20 20  s tv -noshm 1.  
daf0: 73 71 6c 69 74 65 33 20 64 62 32 20 74 65 73 74  sqlite3 db2 test
db00: 2e 64 62 20 2d 76 66 73 20 74 76 0a 20 20 63 61  .db -vfs tv.  ca
db10: 74 63 68 73 71 6c 20 7b 20 53 45 4c 45 43 54 20  tchsql { SELECT 
db20: 2a 20 46 52 4f 4d 20 6b 6f 20 7d 20 64 62 32 0a  * FROM ko } db2.
db30: 7d 20 7b 31 20 7b 75 6e 61 62 6c 65 20 74 6f 20  } {1 {unable to 
db40: 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 66 69  open database fi
db50: 6c 65 7d 7d 0a 64 62 32 20 63 6c 6f 73 65 0a 74  le}}.db2 close.t
db60: 76 20 64 65 6c 65 74 65 0a 64 6f 5f 74 65 73 74  v delete.do_test
db70: 20 70 61 67 65 72 31 2d 32 31 2e 32 20 7b 0a 62   pager1-21.2 {.b
db80: 72 65 61 6b 70 6f 69 6e 74 0a 20 20 74 65 73 74  reakpoint.  test
db90: 76 66 73 20 74 76 20 2d 69 76 65 72 73 69 6f 6e  vfs tv -iversion
dba0: 20 31 0a 20 20 73 71 6c 69 74 65 33 20 64 62 32   1.  sqlite3 db2
dbb0: 20 74 65 73 74 2e 64 62 20 2d 76 66 73 20 74 76   test.db -vfs tv
dbc0: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20 53 45  .  catchsql { SE
dbd0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6b 6f 20 7d  LECT * FROM ko }
dbe0: 20 64 62 32 0a 7d 20 7b 31 20 7b 75 6e 61 62 6c   db2.} {1 {unabl
dbf0: 65 20 74 6f 20 6f 70 65 6e 20 64 61 74 61 62 61  e to open databa
dc00: 73 65 20 66 69 6c 65 7d 7d 0a 64 62 32 20 63 6c  se file}}.db2 cl
dc10: 6f 73 65 0a 74 76 20 64 65 6c 65 74 65 0a 0a 23  ose.tv delete..#
dc20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
dc30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
dc40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
dc50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
dc60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74  ---------.# Test
dc70: 20 74 68 61 74 20 61 20 22 50 52 41 47 4d 41 20   that a "PRAGMA 
dc80: 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 22 3a  wal_checkpoint":
dc90: 0a 23 0a 23 20 20 20 70 61 67 65 72 31 2d 32 32  .#.#   pager1-22
dca0: 2e 31 2e 2a 3a 20 69 73 20 61 20 6e 6f 2d 6f 70  .1.*: is a no-op
dcb0: 20 6f 6e 20 61 20 6e 6f 6e 2d 57 41 4c 20 64 62   on a non-WAL db
dcc0: 2c 20 61 6e 64 0a 23 20 20 20 70 61 67 65 72 31  , and.#   pager1
dcd0: 2d 32 32 2e 32 2e 2a 3a 20 64 6f 65 73 20 6e 6f  -22.2.*: does no
dce0: 74 20 63 61 75 73 65 20 78 53 79 6e 63 20 63 61  t cause xSync ca
dcf0: 6c 6c 73 20 77 69 74 68 20 61 20 73 79 6e 63 68  lls with a synch
dd00: 72 6f 6e 6f 75 73 3d 6f 66 66 20 64 62 2e 0a 23  ronous=off db..#
dd10: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
dd20: 32 32 2e 31 2e 31 20 7b 0a 20 20 66 61 75 6c 74  22.1.1 {.  fault
dd30: 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72  sim_delete_and_r
dd40: 65 6f 70 65 6e 0a 20 20 65 78 65 63 73 71 6c 20  eopen.  execsql 
dd50: 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  {.    CREATE TAB
dd60: 4c 45 20 6b 6f 28 63 20 44 45 46 41 55 4c 54 20  LE ko(c DEFAULT 
dd70: 27 61 62 63 27 2c 20 62 20 44 45 46 41 55 4c 54  'abc', b DEFAULT
dd80: 20 27 64 65 66 27 29 3b 0a 20 20 20 20 49 4e 53   'def');.    INS
dd90: 45 52 54 20 49 4e 54 4f 20 6b 6f 20 44 45 46 41  ERT INTO ko DEFA
dda0: 55 4c 54 20 56 41 4c 55 45 53 3b 0a 20 20 7d 0a  ULT VALUES;.  }.
ddb0: 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47    execsql { PRAG
ddc0: 4d 41 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e  MA wal_checkpoin
ddd0: 74 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74  t }.} {}.do_test
dde0: 20 70 61 67 65 72 31 2d 32 32 2e 32 2e 31 20 7b   pager1-22.2.1 {
ddf0: 0a 20 20 74 65 73 74 76 66 73 20 74 76 20 2d 64  .  testvfs tv -d
de00: 65 66 61 75 6c 74 20 31 0a 20 20 74 76 20 66 69  efault 1.  tv fi
de10: 6c 74 65 72 20 78 53 79 6e 63 0a 20 20 74 76 20  lter xSync.  tv 
de20: 73 63 72 69 70 74 20 78 53 79 6e 63 43 62 0a 20  script xSyncCb. 
de30: 20 70 72 6f 63 20 78 53 79 6e 63 43 62 20 7b 61   proc xSyncCb {a
de40: 72 67 73 7d 20 7b 69 6e 63 72 20 3a 3a 73 79 6e  rgs} {incr ::syn
de50: 63 63 6f 75 6e 74 7d 0a 20 20 73 65 74 20 3a 3a  ccount}.  set ::
de60: 73 79 6e 63 63 6f 75 6e 74 20 30 0a 20 20 73 71  synccount 0.  sq
de70: 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62  lite3 db test.db
de80: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
de90: 20 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e   PRAGMA synchron
dea0: 6f 75 73 20 3d 20 6f 66 66 3b 0a 20 20 20 20 50  ous = off;.    P
deb0: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
dec0: 64 65 20 3d 20 57 41 4c 3b 0a 20 20 20 20 49 4e  de = WAL;.    IN
ded0: 53 45 52 54 20 49 4e 54 4f 20 6b 6f 20 44 45 46  SERT INTO ko DEF
dee0: 41 55 4c 54 20 56 41 4c 55 45 53 3b 0a 20 20 7d  AULT VALUES;.  }
def0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41  .  execsql { PRA
df00: 47 4d 41 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69  GMA wal_checkpoi
df10: 6e 74 20 7d 0a 20 20 73 65 74 20 73 79 6e 63 63  nt }.  set syncc
df20: 6f 75 6e 74 0a 7d 20 7b 30 7d 0a 64 62 20 63 6c  ount.} {0}.db cl
df30: 6f 73 65 0a 74 76 20 64 65 6c 65 74 65 0a 0a 23  ose.tv delete..#
df40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
df50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
df60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
df70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
df80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74  ---------.# Test
df90: 73 20 66 6f 72 20 63 68 61 6e 67 69 6e 67 20 6a  s for changing j
dfa0: 6f 75 72 6e 61 6c 20 6d 6f 64 65 2e 0a 23 0a 23  ournal mode..#.#
dfb0: 20 20 20 70 61 67 65 72 31 2d 32 33 2e 31 2e 2a     pager1-23.1.*
dfc0: 3a 20 54 65 73 74 20 74 68 61 74 20 77 68 65 6e  : Test that when
dfd0: 20 63 68 61 6e 67 69 6e 67 20 66 72 6f 6d 20 50   changing from P
dfe0: 45 52 53 49 53 54 20 74 6f 20 44 45 4c 45 54 45  ERSIST to DELETE
dff0: 20 6d 6f 64 65 2c 0a 23 20 20 20 20 20 20 20 20   mode,.#        
e000: 20 20 20 20 20 20 20 20 20 20 74 68 65 20 6a 6f            the jo
e010: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 64 65  urnal file is de
e020: 6c 65 74 65 64 2e 0a 23 0a 23 20 20 20 70 61 67  leted..#.#   pag
e030: 65 72 31 2d 32 33 2e 32 2e 2a 3a 20 53 61 6d 65  er1-23.2.*: Same
e040: 20 74 65 73 74 20 61 73 20 61 62 6f 76 65 2c 20   test as above, 
e050: 62 75 74 20 77 68 69 6c 65 20 61 20 73 68 61 72  but while a shar
e060: 65 64 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 0a  ed lock is held.
e070: 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  #               
e080: 20 20 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61     on the databa
e090: 73 65 20 66 69 6c 65 2e 0a 23 0a 23 20 20 20 70  se file..#.#   p
e0a0: 61 67 65 72 31 2d 32 33 2e 33 2e 2a 3a 20 53 61  ager1-23.3.*: Sa
e0b0: 6d 65 20 74 65 73 74 20 61 73 20 61 62 6f 76 65  me test as above
e0c0: 2c 20 62 75 74 20 77 68 69 6c 65 20 61 20 72 65  , but while a re
e0d0: 73 65 72 76 65 64 20 6c 6f 63 6b 20 69 73 20 68  served lock is h
e0e0: 65 6c 64 0a 23 20 20 20 20 20 20 20 20 20 20 20  eld.#           
e0f0: 20 20 20 20 20 20 20 6f 6e 20 74 68 65 20 64 61         on the da
e100: 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 23 0a 23  tabase file..#.#
e110: 20 20 20 70 61 67 65 72 31 2d 32 33 2e 34 2e 2a     pager1-23.4.*
e120: 3a 20 41 6e 64 2c 20 66 6f 72 20 66 75 6e 2c 20  : And, for fun, 
e130: 77 68 69 6c 65 20 68 6f 6c 64 69 6e 67 20 61 6e  while holding an
e140: 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e   exclusive lock.
e150: 0a 23 0a 23 20 20 20 70 61 67 65 72 31 2d 32 33  .#.#   pager1-23
e160: 2e 35 2e 2a 3a 20 54 72 79 20 74 6f 20 73 65 74  .5.*: Try to set
e170: 20 76 61 72 69 6f 75 73 20 64 69 66 66 65 72 65   various differe
e180: 6e 74 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 73  nt journal modes
e190: 20 77 69 74 68 20 61 6e 0a 23 20 20 20 20 20 20   with an.#      
e1a0: 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 2d 6d              in-m
e1b0: 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 28  emory database (
e1c0: 6f 6e 6c 79 20 4d 45 4d 4f 52 59 20 61 6e 64 20  only MEMORY and 
e1d0: 4f 46 46 20 73 68 6f 75 6c 64 20 77 6f 72 6b 29  OFF should work)
e1e0: 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  ..#.do_test page
e1f0: 72 31 2d 32 33 2e 31 2e 31 20 7b 0a 20 20 66 61  r1-23.1.1 {.  fa
e200: 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e  ultsim_delete_an
e210: 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65 63 73  d_reopen.  execs
e220: 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20  ql {.    PRAGMA 
e230: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 50  journal_mode = P
e240: 45 52 53 49 53 54 3b 0a 20 20 20 20 43 52 45 41  ERSIST;.    CREA
e250: 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62  TE TABLE t1(a, b
e260: 29 3b 0a 20 20 7d 0a 20 20 66 69 6c 65 20 65 78  );.  }.  file ex
e270: 69 73 74 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75  ists test.db-jou
e280: 72 6e 61 6c 0a 7d 20 7b 31 7d 0a 64 6f 5f 74 65  rnal.} {1}.do_te
e290: 73 74 20 70 61 67 65 72 31 2d 32 33 2e 31 2e 32  st pager1-23.1.2
e2a0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 50   {.  execsql { P
e2b0: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
e2c0: 64 65 20 3d 20 44 45 4c 45 54 45 20 7d 0a 20 20  de = DELETE }.  
e2d0: 66 69 6c 65 20 65 78 69 73 74 73 20 74 65 73 74  file exists test
e2e0: 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 7d 20 7b 30  .db-journal.} {0
e2f0: 7d 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  }..do_test pager
e300: 31 2d 32 33 2e 32 2e 31 20 7b 0a 20 20 65 78 65  1-23.2.1 {.  exe
e310: 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d  csql {.    PRAGM
e320: 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d  A journal_mode =
e330: 20 50 45 52 53 49 53 54 3b 0a 20 20 20 20 49 4e   PERSIST;.    IN
e340: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
e350: 55 45 53 28 27 43 61 6e 62 65 72 72 61 27 2c 20  UES('Canberra', 
e360: 27 41 43 54 27 29 3b 0a 20 20 7d 0a 20 20 64 62  'ACT');.  }.  db
e370: 20 65 76 61 6c 20 7b 20 53 45 4c 45 43 54 20 2a   eval { SELECT *
e380: 20 46 52 4f 4d 20 74 31 20 7d 20 7b 0a 20 20 20   FROM t1 } {.   
e390: 20 64 62 20 65 76 61 6c 20 7b 20 50 52 41 47 4d   db eval { PRAGM
e3a0: 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d  A journal_mode =
e3b0: 20 44 45 4c 45 54 45 20 7d 0a 20 20 7d 0a 20 20   DELETE }.  }.  
e3c0: 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41  execsql { PRAGMA
e3d0: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 7d 0a   journal_mode }.
e3e0: 7d 20 7b 64 65 6c 65 74 65 7d 0a 64 6f 5f 74 65  } {delete}.do_te
e3f0: 73 74 20 70 61 67 65 72 31 2d 32 33 2e 32 2e 32  st pager1-23.2.2
e400: 20 7b 0a 20 20 66 69 6c 65 20 65 78 69 73 74 73   {.  file exists
e410: 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c   test.db-journal
e420: 0a 7d 20 7b 30 7d 0a 0a 64 6f 5f 74 65 73 74 20  .} {0}..do_test 
e430: 70 61 67 65 72 31 2d 32 33 2e 33 2e 31 20 7b 0a  pager1-23.3.1 {.
e440: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
e450: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
e460: 6f 64 65 20 3d 20 50 45 52 53 49 53 54 3b 0a 20  ode = PERSIST;. 
e470: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
e480: 31 20 56 41 4c 55 45 53 28 27 44 61 72 77 69 6e  1 VALUES('Darwin
e490: 27 2c 20 27 4e 54 27 29 3b 0a 20 20 20 20 42 45  ', 'NT');.    BE
e4a0: 47 49 4e 20 49 4d 4d 45 44 49 41 54 45 3b 0a 20  GIN IMMEDIATE;. 
e4b0: 20 7d 0a 20 20 64 62 20 65 76 61 6c 20 7b 20 50   }.  db eval { P
e4c0: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
e4d0: 64 65 20 3d 20 44 45 4c 45 54 45 20 7d 0a 20 20  de = DELETE }.  
e4e0: 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41  execsql { PRAGMA
e4f0: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 7d 0a   journal_mode }.
e500: 7d 20 7b 64 65 6c 65 74 65 7d 0a 64 6f 5f 74 65  } {delete}.do_te
e510: 73 74 20 70 61 67 65 72 31 2d 32 33 2e 33 2e 32  st pager1-23.3.2
e520: 20 7b 0a 20 20 66 69 6c 65 20 65 78 69 73 74 73   {.  file exists
e530: 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c   test.db-journal
e540: 0a 7d 20 7b 30 7d 0a 64 6f 5f 74 65 73 74 20 70  .} {0}.do_test p
e550: 61 67 65 72 31 2d 32 33 2e 33 2e 33 20 7b 0a 20  ager1-23.3.3 {. 
e560: 20 65 78 65 63 73 71 6c 20 43 4f 4d 4d 49 54 0a   execsql COMMIT.
e570: 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74 20 70 61  } {}..do_test pa
e580: 67 65 72 31 2d 32 33 2e 34 2e 31 20 7b 0a 20 20  ger1-23.4.1 {.  
e590: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52  execsql {.    PR
e5a0: 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
e5b0: 65 20 3d 20 50 45 52 53 49 53 54 3b 0a 20 20 20  e = PERSIST;.   
e5c0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
e5d0: 56 41 4c 55 45 53 28 27 41 64 65 6c 61 69 64 65  VALUES('Adelaide
e5e0: 27 2c 20 27 53 41 27 29 3b 0a 20 20 20 20 42 45  ', 'SA');.    BE
e5f0: 47 49 4e 20 45 58 43 4c 55 53 49 56 45 3b 0a 20  GIN EXCLUSIVE;. 
e600: 20 7d 0a 20 20 64 62 20 65 76 61 6c 20 7b 20 50   }.  db eval { P
e610: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
e620: 64 65 20 3d 20 44 45 4c 45 54 45 20 7d 0a 20 20  de = DELETE }.  
e630: 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41  execsql { PRAGMA
e640: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 7d 0a   journal_mode }.
e650: 7d 20 7b 64 65 6c 65 74 65 7d 0a 64 6f 5f 74 65  } {delete}.do_te
e660: 73 74 20 70 61 67 65 72 31 2d 32 33 2e 34 2e 32  st pager1-23.4.2
e670: 20 7b 0a 20 20 66 69 6c 65 20 65 78 69 73 74 73   {.  file exists
e680: 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c   test.db-journal
e690: 0a 7d 20 7b 30 7d 0a 64 6f 5f 74 65 73 74 20 70  .} {0}.do_test p
e6a0: 61 67 65 72 31 2d 32 33 2e 34 2e 33 20 7b 0a 20  ager1-23.4.3 {. 
e6b0: 20 65 78 65 63 73 71 6c 20 43 4f 4d 4d 49 54 0a   execsql COMMIT.
e6c0: 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74 20 70 61  } {}..do_test pa
e6d0: 67 65 72 31 2d 32 33 2e 35 2e 31 20 7b 0a 20 20  ger1-23.5.1 {.  
e6e0: 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f  faultsim_delete_
e6f0: 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 73 71 6c  and_reopen.  sql
e700: 69 74 65 33 20 64 62 20 3a 6d 65 6d 6f 72 79 3a  ite3 db :memory:
e710: 0a 7d 20 7b 7d 0a 66 6f 72 65 61 63 68 20 7b 74  .} {}.foreach {t
e720: 6e 20 6d 6f 64 65 20 70 6f 73 73 69 62 6c 65 7d  n mode possible}
e730: 20 7b 0a 20 20 32 20 20 6f 66 66 20 20 20 20 20   {.  2  off     
e740: 20 31 0a 20 20 33 20 20 6d 65 6d 6f 72 79 20 20   1.  3  memory  
e750: 20 31 0a 20 20 34 20 20 70 65 72 73 69 73 74 20   1.  4  persist 
e760: 20 30 0a 20 20 35 20 20 64 65 6c 65 74 65 20 20   0.  5  delete  
e770: 20 30 0a 20 20 36 20 20 77 61 6c 20 20 20 20 20   0.  6  wal     
e780: 20 30 0a 20 20 37 20 20 74 72 75 6e 63 61 74 65   0.  7  truncate
e790: 20 30 0a 7d 20 7b 0a 20 20 64 6f 5f 74 65 73 74   0.} {.  do_test
e7a0: 20 70 61 67 65 72 31 2d 32 33 2e 35 2e 24 74 6e   pager1-23.5.$tn
e7b0: 2e 31 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c  .1 {.    execsql
e7c0: 20 22 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c   "PRAGMA journal
e7d0: 5f 6d 6f 64 65 20 3d 20 6f 66 66 22 0a 20 20 20  _mode = off".   
e7e0: 20 65 78 65 63 73 71 6c 20 22 50 52 41 47 4d 41   execsql "PRAGMA
e7f0: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20   journal_mode = 
e800: 24 6d 6f 64 65 22 0a 20 20 7d 20 5b 69 66 20 24  $mode".  } [if $
e810: 70 6f 73 73 69 62 6c 65 20 7b 6c 69 73 74 20 24  possible {list $
e820: 6d 6f 64 65 7d 20 7b 6c 69 73 74 20 6f 66 66 7d  mode} {list off}
e830: 5d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65  ].  do_test page
e840: 72 31 2d 32 33 2e 35 2e 24 74 6e 2e 32 20 7b 0a  r1-23.5.$tn.2 {.
e850: 20 20 20 20 65 78 65 63 73 71 6c 20 22 50 52 41      execsql "PRA
e860: 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
e870: 20 3d 20 6d 65 6d 6f 72 79 22 0a 20 20 20 20 65   = memory".    e
e880: 78 65 63 73 71 6c 20 22 50 52 41 47 4d 41 20 6a  xecsql "PRAGMA j
e890: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 24 6d  ournal_mode = $m
e8a0: 6f 64 65 22 0a 20 20 7d 20 5b 69 66 20 24 70 6f  ode".  } [if $po
e8b0: 73 73 69 62 6c 65 20 7b 6c 69 73 74 20 24 6d 6f  ssible {list $mo
e8c0: 64 65 7d 20 7b 6c 69 73 74 20 6d 65 6d 6f 72 79  de} {list memory
e8d0: 7d 5d 0a 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67  }].}.do_test pag
e8e0: 65 72 31 2d 32 33 2e 38 2e 31 20 7b 0a 20 20 65  er1-23.8.1 {.  e
e8f0: 78 65 63 73 71 6c 20 7b 50 52 41 47 4d 41 20 6c  xecsql {PRAGMA l
e900: 6f 63 6b 69 6e 67 5f 6d 6f 64 65 20 3d 20 6e 6f  ocking_mode = no
e910: 72 6d 61 6c 7d 0a 7d 20 7b 65 78 63 6c 75 73 69  rmal}.} {exclusi
e920: 76 65 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  ve}.do_test page
e930: 72 31 2d 32 33 2e 38 2e 32 20 7b 0a 20 20 65 78  r1-23.8.2 {.  ex
e940: 65 63 73 71 6c 20 7b 50 52 41 47 4d 41 20 6c 6f  ecsql {PRAGMA lo
e950: 63 6b 69 6e 67 5f 6d 6f 64 65 20 3d 20 65 78 63  cking_mode = exc
e960: 6c 75 73 69 76 65 7d 0a 7d 20 7b 65 78 63 6c 75  lusive}.} {exclu
e970: 73 69 76 65 7d 0a 64 6f 5f 74 65 73 74 20 70 61  sive}.do_test pa
e980: 67 65 72 31 2d 32 33 2e 38 2e 33 20 7b 0a 20 20  ger1-23.8.3 {.  
e990: 65 78 65 63 73 71 6c 20 7b 50 52 41 47 4d 41 20  execsql {PRAGMA 
e9a0: 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 7d 0a 7d 20  locking_mode}.} 
e9b0: 7b 65 78 63 6c 75 73 69 76 65 7d 0a 64 6f 5f 74  {exclusive}.do_t
e9c0: 65 73 74 20 70 61 67 65 72 31 2d 32 33 2e 38 2e  est pager1-23.8.
e9d0: 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 50  4 {.  execsql {P
e9e0: 52 41 47 4d 41 20 6d 61 69 6e 2e 6c 6f 63 6b 69  RAGMA main.locki
e9f0: 6e 67 5f 6d 6f 64 65 7d 0a 7d 20 7b 65 78 63 6c  ng_mode}.} {excl
ea00: 75 73 69 76 65 7d 0a 0a 0a 66 69 6e 69 73 68 5f  usive}...finish_
ea10: 74 65 73 74 0a 0a                                test..