/ Hex Artifact Content
Login

Artifact 67de7de48695203bab435eca9e650fb5ec634da6:


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 70 72 6f 63 20 72 65 63 75 72 73  ose..proc recurs
9380: 69 76 65 5f 73 65 6c 65 63 74 20 7b 69 64 20 74  ive_select {id t
9390: 61 62 6c 65 20 7b 73 63 72 69 70 74 20 7b 7d 7d  able {script {}}
93a0: 7d 20 7b 0a 20 20 73 65 74 20 63 6e 74 20 30 0a  } {.  set cnt 0.
93b0: 20 20 64 62 20 65 76 61 6c 20 22 53 45 4c 45 43    db eval "SELEC
93c0: 54 20 72 6f 77 69 64 2c 20 2a 20 46 52 4f 4d 20  T rowid, * FROM 
93d0: 24 74 61 62 6c 65 20 57 48 45 52 45 20 72 6f 77  $table WHERE row
93e0: 69 64 20 3d 20 28 24 69 64 2d 31 29 22 20 7b 0a  id = ($id-1)" {.
93f0: 20 20 20 20 72 65 63 75 72 73 69 76 65 5f 73 65      recursive_se
9400: 6c 65 63 74 20 24 72 6f 77 69 64 20 24 74 61 62  lect $rowid $tab
9410: 6c 65 20 24 73 63 72 69 70 74 0a 20 20 20 20 69  le $script.    i
9420: 6e 63 72 20 63 6e 74 0a 20 20 7d 0a 20 20 69 66  ncr cnt.  }.  if
9430: 20 7b 24 63 6e 74 3d 3d 30 7d 20 7b 20 65 76 61   {$cnt==0} { eva
9440: 6c 20 24 73 63 72 69 70 74 20 7d 0a 7d 0a 0a 23  l $script }.}..#
9450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74  ---------.# Test
94a0: 20 74 68 61 74 20 72 65 67 61 72 64 6c 65 73 73   that regardless
94b0: 20 6f 66 20 74 68 65 20 76 61 6c 75 65 20 72 65   of the value re
94c0: 74 75 72 6e 65 64 20 62 79 20 78 53 65 63 74 6f  turned by xSecto
94d0: 72 53 69 7a 65 28 29 2c 20 74 68 65 0a 23 20 6d  rSize(), the.# m
94e0: 69 6e 69 6d 75 6d 20 65 66 66 65 63 74 69 76 65  inimum effective
94f0: 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 69 73 20   sector-size is 
9500: 35 31 32 20 61 6e 64 20 74 68 65 20 6d 61 78 69  512 and the maxi
9510: 6d 75 6d 20 36 35 35 33 36 20 62 79 74 65 73 2e  mum 65536 bytes.
9520: 0a 23 0a 74 65 73 74 76 66 73 20 74 76 20 2d 64  .#.testvfs tv -d
9530: 65 66 61 75 6c 74 20 31 0a 66 6f 72 65 61 63 68  efault 1.foreach
9540: 20 73 65 63 74 6f 72 73 69 7a 65 20 7b 0a 20 20   sectorsize {.  
9550: 20 20 33 32 20 20 20 36 34 20 20 20 31 32 38 20    32   64   128 
9560: 20 20 32 35 36 20 20 20 35 31 32 20 20 20 31 30    256   512   10
9570: 32 34 20 20 20 32 30 34 38 20 0a 20 20 20 20 34  24   2048 .    4
9580: 30 39 36 20 38 31 39 32 20 31 36 33 38 34 20 33  096 8192 16384 3
9590: 32 37 36 38 20 36 35 35 33 36 20 31 33 31 30 37  2768 65536 13107
95a0: 32 20 32 36 32 31 34 34 0a 7d 20 7b 0a 20 20 74  2 262144.} {.  t
95b0: 76 20 73 65 63 74 6f 72 73 69 7a 65 20 24 73 65  v sectorsize $se
95c0: 63 74 6f 72 73 69 7a 65 0a 20 20 73 65 74 20 65  ctorsize.  set e
95d0: 66 66 20 24 73 65 63 74 6f 72 73 69 7a 65 0a 20  ff $sectorsize. 
95e0: 20 69 66 20 7b 24 73 65 63 74 6f 72 73 69 7a 65   if {$sectorsize
95f0: 20 3c 20 35 31 32 7d 20 20 20 7b 20 73 65 74 20   < 512}   { set 
9600: 65 66 66 20 35 31 32 20 7d 0a 20 20 69 66 20 7b  eff 512 }.  if {
9610: 24 73 65 63 74 6f 72 73 69 7a 65 20 3e 20 36 35  $sectorsize > 65
9620: 35 33 36 7d 20 7b 20 73 65 74 20 65 66 66 20 36  536} { set eff 6
9630: 35 35 33 36 20 7d 0a 0a 20 20 64 6f 5f 74 65 73  5536 }..  do_tes
9640: 74 20 70 61 67 65 72 31 2d 31 30 2e 24 73 65 63  t pager1-10.$sec
9650: 74 6f 72 73 69 7a 65 2e 31 20 7b 0a 20 20 20 20  torsize.1 {.    
9660: 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f  faultsim_delete_
9670: 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 20 20 64  and_reopen.    d
9680: 62 20 66 75 6e 63 20 61 5f 73 74 72 69 6e 67 20  b func a_string 
9690: 61 5f 73 74 72 69 6e 67 0a 20 20 20 20 65 78 65  a_string.    exe
96a0: 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 50 52 41  csql {.      PRA
96b0: 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
96c0: 20 3d 20 50 45 52 53 49 53 54 3b 0a 20 20 20 20   = PERSIST;.    
96d0: 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69    PRAGMA page_si
96e0: 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20 20 20 20  ze = 1024;.     
96f0: 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 20 20   BEGIN;.        
9700: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
9710: 61 2c 20 62 29 3b 0a 20 20 20 20 20 20 20 20 43  a, b);.        C
9720: 52 45 41 54 45 20 54 41 42 4c 45 20 74 32 28 61  REATE TABLE t2(a
9730: 2c 20 62 29 3b 0a 20 20 20 20 20 20 20 20 43 52  , b);.        CR
9740: 45 41 54 45 20 54 41 42 4c 45 20 74 33 28 61 2c  EATE TABLE t3(a,
9750: 20 62 29 3b 0a 20 20 20 20 20 20 43 4f 4d 4d 49   b);.      COMMI
9760: 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 69 6c  T;.    }.    fil
9770: 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 2d 6a  e size test.db-j
9780: 6f 75 72 6e 61 6c 0a 20 20 7d 20 5b 65 78 70 72  ournal.  } [expr
9790: 20 24 73 65 63 74 6f 72 73 69 7a 65 20 3e 20 36   $sectorsize > 6
97a0: 35 35 33 36 20 3f 20 36 35 35 33 36 20 3a 20 24  5536 ? 65536 : $
97b0: 73 65 63 74 6f 72 73 69 7a 65 5d 0a 0a 20 20 64  sectorsize]..  d
97c0: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 30  o_test pager1-10
97d0: 2e 24 73 65 63 74 6f 72 73 69 7a 65 2e 32 20 7b  .$sectorsize.2 {
97e0: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 0a  .    execsql { .
97f0: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
9800: 4f 20 74 33 20 56 41 4c 55 45 53 28 61 5f 73 74  O t3 VALUES(a_st
9810: 72 69 6e 67 28 33 30 30 29 2c 20 61 5f 73 74 72  ring(300), a_str
9820: 69 6e 67 28 33 30 30 29 29 3b 0a 20 20 20 20 20  ing(300));.     
9830: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 20   INSERT INTO t3 
9840: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 33  SELECT * FROM t3
9850: 3b 20 20 20 20 20 20 20 20 2f 2a 20 20 32 20 2a  ;        /*  2 *
9860: 2f 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  /.      INSERT I
9870: 4e 54 4f 20 74 33 20 53 45 4c 45 43 54 20 2a 20  NTO t3 SELECT * 
9880: 46 52 4f 4d 20 74 33 3b 20 20 20 20 20 20 20 20  FROM t3;        
9890: 2f 2a 20 20 34 20 2a 2f 0a 20 20 20 20 20 20 49  /*  4 */.      I
98a0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 20 53 45  NSERT INTO t3 SE
98b0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 33 3b 20  LECT * FROM t3; 
98c0: 20 20 20 20 20 20 20 2f 2a 20 20 38 20 2a 2f 0a         /*  8 */.
98d0: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
98e0: 4f 20 74 33 20 53 45 4c 45 43 54 20 2a 20 46 52  O t3 SELECT * FR
98f0: 4f 4d 20 74 33 3b 20 20 20 20 20 20 20 20 2f 2a  OM t3;        /*
9900: 20 31 36 20 2a 2f 0a 20 20 20 20 20 20 49 4e 53   16 */.      INS
9910: 45 52 54 20 49 4e 54 4f 20 74 33 20 53 45 4c 45  ERT INTO t3 SELE
9920: 43 54 20 2a 20 46 52 4f 4d 20 74 33 3b 20 20 20  CT * FROM t3;   
9930: 20 20 20 20 20 2f 2a 20 33 32 20 2a 2f 0a 20 20       /* 32 */.  
9940: 20 20 7d 0a 20 20 7d 20 7b 7d 0a 0a 20 20 64 6f    }.  } {}..  do
9950: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 30 2e  _test pager1-10.
9960: 24 73 65 63 74 6f 72 73 69 7a 65 2e 33 20 7b 0a  $sectorsize.3 {.
9970: 20 20 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 20      db close.   
9980: 20 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74   sqlite3 db test
9990: 2e 64 62 0a 20 20 20 20 65 78 65 63 73 71 6c 20  .db.    execsql 
99a0: 7b 20 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20  { .      PRAGMA 
99b0: 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b  cache_size = 10;
99c0: 0a 20 20 20 20 20 20 42 45 47 49 4e 3b 0a 20 20  .      BEGIN;.  
99d0: 20 20 7d 0a 20 20 20 20 72 65 63 75 72 73 69 76    }.    recursiv
99e0: 65 5f 73 65 6c 65 63 74 20 33 32 20 74 33 20 7b  e_select 32 t3 {
99f0: 64 62 20 65 76 61 6c 20 22 49 4e 53 45 52 54 20  db eval "INSERT 
9a00: 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 31  INTO t2 VALUES(1
9a10: 2c 20 32 29 22 7d 0a 20 20 20 20 65 78 65 63 73  , 2)"}.    execs
9a20: 71 6c 20 7b 0a 20 20 20 20 20 20 43 4f 4d 4d 49  ql {.      COMMI
9a30: 54 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20  T;.      SELECT 
9a40: 2a 20 46 52 4f 4d 20 74 32 3b 0a 20 20 20 20 7d  * FROM t2;.    }
9a50: 0a 20 20 7d 20 7b 31 20 32 7d 0a 0a 20 20 64 6f  .  } {1 2}..  do
9a60: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 30 2e  _test pager1-10.
9a70: 24 73 65 63 74 6f 72 73 69 7a 65 2e 34 20 7b 0a  $sectorsize.4 {.
9a80: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20      execsql {.  
9a90: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
9aa0: 20 74 36 28 61 2c 20 62 29 3b 0a 20 20 20 20 20   t6(a, b);.     
9ab0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 37   CREATE TABLE t7
9ac0: 28 61 2c 20 62 29 3b 0a 20 20 20 20 20 20 43 52  (a, b);.      CR
9ad0: 45 41 54 45 20 54 41 42 4c 45 20 74 35 28 61 2c  EATE TABLE t5(a,
9ae0: 20 62 29 3b 0a 20 20 20 20 20 20 44 52 4f 50 20   b);.      DROP 
9af0: 54 41 42 4c 45 20 74 36 3b 0a 20 20 20 20 20 20  TABLE t6;.      
9b00: 44 52 4f 50 20 54 41 42 4c 45 20 74 37 3b 0a 20  DROP TABLE t7;. 
9b10: 20 20 20 7d 0a 20 20 20 20 69 66 20 7b 24 65 66     }.    if {$ef
9b20: 66 3d 3d 36 35 35 33 36 7d 20 62 72 65 61 6b 70  f==65536} breakp
9b30: 6f 69 6e 74 0a 20 20 20 20 65 78 65 63 73 71 6c  oint.    execsql
9b40: 20 7b 0a 20 20 20 20 20 20 42 45 47 49 4e 3b 0a   {.      BEGIN;.
9b50: 20 20 20 20 20 20 20 20 43 52 45 41 54 45 20 54          CREATE T
9b60: 41 42 4c 45 20 74 36 28 61 2c 20 62 29 3b 0a 20  ABLE t6(a, b);. 
9b70: 20 20 20 7d 0a 20 20 20 20 72 65 63 75 72 73 69     }.    recursi
9b80: 76 65 5f 73 65 6c 65 63 74 20 33 32 20 74 33 20  ve_select 32 t3 
9b90: 7b 64 62 20 65 76 61 6c 20 22 49 4e 53 45 52 54  {db eval "INSERT
9ba0: 20 49 4e 54 4f 20 74 35 20 56 41 4c 55 45 53 28   INTO t5 VALUES(
9bb0: 31 2c 20 32 29 22 7d 0a 20 20 20 20 65 78 65 63  1, 2)"}.    exec
9bc0: 73 71 6c 20 7b 0a 20 20 20 20 20 20 43 4f 4d 4d  sql {.      COMM
9bd0: 49 54 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54  IT;.      SELECT
9be0: 20 2a 20 46 52 4f 4d 20 74 35 3b 0a 20 20 20 20   * FROM t5;.    
9bf0: 7d 0a 20 20 7d 20 7b 31 20 32 7d 0a 20 20 0a 7d  }.  } {1 2}.  .}
9c00: 0a 64 62 20 63 6c 6f 73 65 0a 0a 74 76 20 73 65  .db close..tv se
9c10: 63 74 6f 72 73 69 7a 65 20 34 30 39 36 0a 64 6f  ctorsize 4096.do
9c20: 5f 74 65 73 74 20 70 61 67 65 72 31 2e 31 30 2e  _test pager1.10.
9c30: 78 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d  x.1 {.  faultsim
9c40: 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70  _delete_and_reop
9c50: 65 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  en.  execsql {. 
9c60: 20 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73     PRAGMA page_s
9c70: 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20 20 20  ize = 1024;.    
9c80: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
9c90: 78 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 20 7b 73  x);.  }.  for {s
9ca0: 65 74 20 69 20 30 7d 20 7b 24 69 3c 33 30 7d 20  et i 0} {$i<30} 
9cb0: 7b 69 6e 63 72 20 69 7d 20 7b 0a 20 20 20 20 65  {incr i} {.    e
9cc0: 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20  xecsql { INSERT 
9cd0: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 7a  INTO t1 VALUES(z
9ce0: 65 72 6f 62 6c 6f 62 28 39 30 30 29 29 20 7d 0a  eroblob(900)) }.
9cf0: 20 20 7d 0a 20 20 66 69 6c 65 20 73 69 7a 65 20    }.  file size 
9d00: 74 65 73 74 2e 64 62 0a 7d 20 7b 33 32 37 36 38  test.db.} {32768
9d10: 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  }.do_test pager1
9d20: 2e 31 30 2e 78 2e 32 20 7b 0a 20 20 65 78 65 63  .10.x.2 {.  exec
9d30: 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45  sql {.    CREATE
9d40: 20 54 41 42 4c 45 20 74 32 28 78 29 3b 0a 20 20   TABLE t2(x);.  
9d50: 20 20 44 52 4f 50 20 54 41 42 4c 45 20 74 32 3b    DROP TABLE t2;
9d60: 0a 20 20 7d 0a 20 20 66 69 6c 65 20 73 69 7a 65  .  }.  file size
9d70: 20 74 65 73 74 2e 64 62 0a 7d 20 7b 33 33 37 39   test.db.} {3379
9d80: 32 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  2}.do_test pager
9d90: 31 2e 31 30 2e 78 2e 33 20 7b 0a 20 20 65 78 65  1.10.x.3 {.  exe
9da0: 63 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e  csql {.    BEGIN
9db0: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
9dc0: 4c 45 20 74 32 28 78 29 3b 0a 20 20 7d 0a 20 20  LE t2(x);.  }.  
9dd0: 72 65 63 75 72 73 69 76 65 5f 73 65 6c 65 63 74  recursive_select
9de0: 20 33 30 20 74 31 0a 20 20 65 78 65 63 73 71 6c   30 t1.  execsql
9df0: 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41   {.    CREATE TA
9e00: 42 4c 45 20 74 33 28 78 29 3b 0a 20 20 20 20 43  BLE t3(x);.    C
9e10: 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a  OMMIT;.  }.} {}.
9e20: 0a 64 62 20 63 6c 6f 73 65 0a 74 76 20 64 65 6c  .db close.tv del
9e30: 65 74 65 0a 0a 74 65 73 74 76 66 73 20 74 76 20  ete..testvfs tv 
9e40: 2d 64 65 66 61 75 6c 74 20 31 0a 66 61 75 6c 74  -default 1.fault
9e50: 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72  sim_delete_and_r
9e60: 65 6f 70 65 6e 0a 64 62 20 66 75 6e 63 20 61 5f  eopen.db func a_
9e70: 73 74 72 69 6e 67 20 61 5f 73 74 72 69 6e 67 0a  string a_string.
9e80: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
9e90: 70 61 67 65 72 31 2d 31 31 2e 31 20 7b 0a 20 20  pager1-11.1 {.  
9ea0: 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a  PRAGMA cache_siz
9eb0: 65 20 3d 20 31 30 3b 0a 20 20 42 45 47 49 4e 3b  e = 10;.  BEGIN;
9ec0: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
9ed0: 45 20 7a 7a 28 74 6f 70 20 50 52 49 4d 41 52 59  E zz(top PRIMARY
9ee0: 20 4b 45 59 29 3b 0a 20 20 20 20 49 4e 53 45 52   KEY);.    INSER
9ef0: 54 20 49 4e 54 4f 20 7a 7a 20 56 41 4c 55 45 53  T INTO zz VALUES
9f00: 28 61 5f 73 74 72 69 6e 67 28 32 32 32 29 29 3b  (a_string(222));
9f10: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
9f20: 20 7a 7a 20 53 45 4c 45 43 54 20 61 5f 73 74 72   zz SELECT a_str
9f30: 69 6e 67 28 28 53 45 4c 45 43 54 20 32 32 32 2b  ing((SELECT 222+
9f40: 6d 61 78 28 72 6f 77 69 64 29 20 46 52 4f 4d 20  max(rowid) FROM 
9f50: 7a 7a 29 29 20 46 52 4f 4d 20 7a 7a 3b 0a 20 20  zz)) FROM zz;.  
9f60: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a 7a    INSERT INTO zz
9f70: 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67   SELECT a_string
9f80: 28 28 53 45 4c 45 43 54 20 32 32 32 2b 6d 61 78  ((SELECT 222+max
9f90: 28 72 6f 77 69 64 29 20 46 52 4f 4d 20 7a 7a 29  (rowid) FROM zz)
9fa0: 29 20 46 52 4f 4d 20 7a 7a 3b 0a 20 20 20 20 49  ) FROM zz;.    I
9fb0: 4e 53 45 52 54 20 49 4e 54 4f 20 7a 7a 20 53 45  NSERT INTO zz SE
9fc0: 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 28 53  LECT a_string((S
9fd0: 45 4c 45 43 54 20 32 32 32 2b 6d 61 78 28 72 6f  ELECT 222+max(ro
9fe0: 77 69 64 29 20 46 52 4f 4d 20 7a 7a 29 29 20 46  wid) FROM zz)) F
9ff0: 52 4f 4d 20 7a 7a 3b 0a 20 20 20 20 49 4e 53 45  ROM zz;.    INSE
a000: 52 54 20 49 4e 54 4f 20 7a 7a 20 53 45 4c 45 43  RT INTO zz SELEC
a010: 54 20 61 5f 73 74 72 69 6e 67 28 28 53 45 4c 45  T a_string((SELE
a020: 43 54 20 32 32 32 2b 6d 61 78 28 72 6f 77 69 64  CT 222+max(rowid
a030: 29 20 46 52 4f 4d 20 7a 7a 29 29 20 46 52 4f 4d  ) FROM zz)) FROM
a040: 20 7a 7a 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   zz;.    INSERT 
a050: 49 4e 54 4f 20 7a 7a 20 53 45 4c 45 43 54 20 61  INTO zz SELECT a
a060: 5f 73 74 72 69 6e 67 28 28 53 45 4c 45 43 54 20  _string((SELECT 
a070: 32 32 32 2b 6d 61 78 28 72 6f 77 69 64 29 20 46  222+max(rowid) F
a080: 52 4f 4d 20 7a 7a 29 29 20 46 52 4f 4d 20 7a 7a  ROM zz)) FROM zz
a090: 3b 0a 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 42 45  ;.  COMMIT;.  BE
a0a0: 47 49 4e 3b 0a 20 20 20 20 55 50 44 41 54 45 20  GIN;.    UPDATE 
a0b0: 7a 7a 20 53 45 54 20 74 6f 70 20 3d 20 61 5f 73  zz SET top = a_s
a0c0: 74 72 69 6e 67 28 33 34 35 29 3b 0a 7d 20 7b 7d  tring(345);.} {}
a0d0: 0a 0a 70 72 6f 63 20 6c 6f 63 6b 6f 75 74 20 7b  ..proc lockout {
a0e0: 6d 65 74 68 6f 64 20 61 72 67 73 7d 20 7b 20 72  method args} { r
a0f0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
a100: 52 52 20 7d 0a 74 76 20 73 63 72 69 70 74 20 6c  RR }.tv script l
a110: 6f 63 6b 6f 75 74 0a 74 76 20 66 69 6c 74 65 72  ockout.tv filter
a120: 20 7b 78 57 72 69 74 65 20 78 54 72 75 6e 63 61   {xWrite xTrunca
a130: 74 65 20 78 53 79 6e 63 7d 0a 64 6f 5f 63 61 74  te xSync}.do_cat
a140: 63 68 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72  chsql_test pager
a150: 31 2d 31 31 2e 32 20 7b 20 43 4f 4d 4d 49 54 20  1-11.2 { COMMIT 
a160: 7d 20 7b 31 20 7b 64 69 73 6b 20 49 2f 4f 20 65  } {1 {disk I/O e
a170: 72 72 6f 72 7d 7d 0a 0a 74 76 20 73 63 72 69 70  rror}}..tv scrip
a180: 74 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67  t {}.do_test pag
a190: 65 72 31 2d 31 31 2e 33 20 7b 0a 20 20 73 71 6c  er1-11.3 {.  sql
a1a0: 69 74 65 33 20 64 62 32 20 74 65 73 74 2e 64 62  ite3 db2 test.db
a1b0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
a1c0: 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f   PRAGMA journal_
a1d0: 6d 6f 64 65 20 3d 20 54 52 55 4e 43 41 54 45 3b  mode = TRUNCATE;
a1e0: 0a 20 20 20 20 50 52 41 47 4d 41 20 69 6e 74 65  .    PRAGMA inte
a1f0: 67 72 69 74 79 5f 63 68 65 63 6b 3b 0a 20 20 7d  grity_check;.  }
a200: 20 64 62 32 0a 7d 20 7b 74 72 75 6e 63 61 74 65   db2.} {truncate
a210: 20 6f 6b 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67   ok}.do_test pag
a220: 65 72 31 2d 31 31 2e 34 20 7b 0a 20 20 64 62 32  er1-11.4 {.  db2
a230: 20 63 6c 6f 73 65 0a 20 20 66 69 6c 65 20 73 69   close.  file si
a240: 7a 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e  ze test.db-journ
a250: 61 6c 0a 7d 20 7b 30 7d 0a 64 6f 5f 65 78 65 63  al.} {0}.do_exec
a260: 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d  sql_test pager1-
a270: 31 31 2e 35 20 7b 20 53 45 4c 45 43 54 20 63 6f  11.5 { SELECT co
a280: 75 6e 74 28 2a 29 20 46 52 4f 4d 20 7a 7a 20 7d  unt(*) FROM zz }
a290: 20 7b 33 32 7d 0a 64 62 20 63 6c 6f 73 65 0a 74   {32}.db close.t
a2a0: 76 20 64 65 6c 65 74 65 0a 20 20 0a 23 2d 2d 2d  v delete.  .#---
a2b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a2c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a2d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a2e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a2f0: 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 22 50  ------.# Test "P
a300: 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 22  RAGMA page_size"
a310: 0a 23 0a 66 6f 72 65 61 63 68 20 70 61 67 65 73  .#.foreach pages
a320: 69 7a 65 20 7b 0a 20 20 20 20 35 31 32 20 20 20  ize {.    512   
a330: 31 30 32 34 20 20 20 32 30 34 38 20 34 30 39 36  1024   2048 4096
a340: 20 38 31 39 32 20 31 36 33 38 34 20 33 32 37 36   8192 16384 3276
a350: 38 20 0a 7d 20 7b 0a 20 20 66 61 75 6c 74 73 69  8 .} {.  faultsi
a360: 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f  m_delete_and_reo
a370: 70 65 6e 0a 0a 20 20 64 6f 5f 74 65 73 74 20 70  pen..  do_test p
a380: 61 67 65 72 31 2d 31 32 2e 24 70 61 67 65 73 69  ager1-12.$pagesi
a390: 7a 65 2e 31 20 7b 0a 20 20 20 20 73 71 6c 69 74  ze.1 {.    sqlit
a3a0: 65 33 20 64 62 32 20 74 65 73 74 2e 64 62 0a 20  e3 db2 test.db. 
a3b0: 20 20 20 65 78 65 63 73 71 6c 20 22 0a 20 20 20     execsql ".   
a3c0: 20 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73     PRAGMA page_s
a3d0: 69 7a 65 20 3d 20 24 70 61 67 65 73 69 7a 65 3b  ize = $pagesize;
a3e0: 0a 20 20 20 20 20 20 43 52 45 41 54 45 20 56 49  .      CREATE VI
a3f0: 45 57 20 76 20 41 53 20 53 45 4c 45 43 54 20 2a  EW v AS SELECT *
a400: 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73   FROM sqlite_mas
a410: 74 65 72 3b 0a 20 20 20 20 22 20 64 62 32 0a 20  ter;.    " db2. 
a420: 20 20 20 66 69 6c 65 20 73 69 7a 65 20 74 65 73     file size tes
a430: 74 2e 64 62 0a 20 20 7d 20 24 70 61 67 65 73 69  t.db.  } $pagesi
a440: 7a 65 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67  ze.  do_test pag
a450: 65 72 31 2d 31 32 2e 24 70 61 67 65 73 69 7a 65  er1-12.$pagesize
a460: 2e 32 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  .2 {.    sqlite3
a470: 20 64 62 32 20 74 65 73 74 2e 64 62 0a 20 20 20   db2 test.db.   
a480: 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20   execsql { .    
a490: 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a    SELECT count(*
a4a0: 29 20 46 52 4f 4d 20 76 3b 0a 20 20 20 20 20 20  ) FROM v;.      
a4b0: 50 52 41 47 4d 41 20 6d 61 69 6e 2e 70 61 67 65  PRAGMA main.page
a4c0: 5f 73 69 7a 65 3b 0a 20 20 20 20 7d 20 64 62 32  _size;.    } db2
a4d0: 0a 20 20 7d 20 5b 6c 69 73 74 20 31 20 24 70 61  .  } [list 1 $pa
a4e0: 67 65 73 69 7a 65 5d 0a 20 20 64 6f 5f 74 65 73  gesize].  do_tes
a4f0: 74 20 70 61 67 65 72 31 2d 31 32 2e 24 70 61 67  t pager1-12.$pag
a500: 65 73 69 7a 65 2e 33 20 7b 0a 20 20 20 20 65 78  esize.3 {.    ex
a510: 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 20 20 53  ecsql { .      S
a520: 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
a530: 52 4f 4d 20 76 3b 0a 20 20 20 20 20 20 50 52 41  ROM v;.      PRA
a540: 47 4d 41 20 6d 61 69 6e 2e 70 61 67 65 5f 73 69  GMA main.page_si
a550: 7a 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 5b 6c  ze;.    }.  } [l
a560: 69 73 74 20 31 20 24 70 61 67 65 73 69 7a 65 5d  ist 1 $pagesize]
a570: 0a 20 20 64 62 32 20 63 6c 6f 73 65 0a 7d 0a 0a  .  db2 close.}..
a580: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
a590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a5a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a5b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a5c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73  ----------.# Tes
a5d0: 74 20 73 70 65 63 61 6c 20 22 50 52 41 47 4d 41  t specal "PRAGMA
a5e0: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 50 45   journal_mode=PE
a5f0: 52 53 49 53 54 22 20 74 65 73 74 20 63 61 73 65  RSIST" test case
a600: 73 2e 0a 23 0a 23 20 70 61 67 65 72 31 2d 31 33  s..#.# pager1-13
a610: 2e 31 2e 2a 3a 20 54 68 69 73 20 74 65 73 74 73  .1.*: This tests
a620: 20 61 20 73 70 65 63 69 61 6c 20 63 61 73 65 20   a special case 
a630: 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 6e 20 70  encountered in p
a640: 65 72 73 69 73 74 65 6e 74 20 0a 23 20 20 20 20  ersistent .#    
a650: 20 20 20 20 20 20 20 20 20 20 20 20 6a 6f 75 72              jour
a660: 6e 61 6c 20 6d 6f 64 65 3a 20 49 66 20 74 68 65  nal mode: If the
a670: 20 6a 6f 75 72 6e 61 6c 20 61 73 73 6f 63 69 61   journal associa
a680: 74 65 64 20 77 69 74 68 20 61 20 74 72 61 6e 73  ted with a trans
a690: 61 63 74 69 6f 6e 0a 23 20 20 20 20 20 20 20 20  action.#        
a6a0: 20 20 20 20 20 20 20 20 69 73 20 73 6d 61 6c 6c          is small
a6b0: 65 72 20 74 68 61 6e 20 74 68 65 20 6a 6f 75 72  er than the jour
a6c0: 6e 61 6c 20 66 69 6c 65 20 28 62 65 63 61 75 73  nal file (becaus
a6d0: 65 20 61 20 70 72 65 76 69 6f 75 73 20 0a 23 20  e a previous .# 
a6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
a6f0: 72 61 6e 73 61 63 74 69 6f 6e 20 6c 65 66 74 20  ransaction left 
a700: 61 20 76 65 72 79 20 6c 61 72 67 65 20 6e 6f 6e  a very large non
a710: 2d 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  -hot journal fil
a720: 65 20 69 6e 20 74 68 65 0a 23 20 20 20 20 20 20  e in the.#      
a730: 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 2d 73            file-s
a740: 79 73 74 65 6d 29 2c 20 74 68 65 6e 20 53 51 4c  ystem), then SQL
a750: 69 74 65 20 68 61 73 20 74 6f 20 62 65 20 63 61  ite has to be ca
a760: 72 65 66 75 6c 20 74 68 61 74 20 74 68 65 72 65  reful that there
a770: 20 69 73 0a 23 20 20 20 20 20 20 20 20 20 20 20   is.#           
a780: 20 20 20 20 20 6e 6f 74 20 61 20 6a 6f 75 72 6e       not a journ
a790: 61 6c 2d 68 65 61 64 65 72 20 6c 65 66 74 20 6f  al-header left o
a7a0: 76 65 72 20 66 72 6f 6d 20 61 20 70 72 65 76 69  ver from a previ
a7b0: 6f 75 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  ous transaction.
a7c0: 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  #               
a7d0: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c   immediately fol
a7e0: 6c 6f 77 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e  lowing the journ
a7f0: 61 6c 20 63 6f 6e 74 65 6e 74 20 6a 75 73 74 20  al content just 
a800: 77 72 69 74 74 65 6e 2e 0a 23 20 20 20 20 20 20  written..#      
a810: 20 20 20 20 20 20 20 20 20 20 49 66 20 74 68 65            If the
a820: 72 65 20 69 73 2c 20 61 6e 64 20 74 68 65 20 70  re is, and the p
a830: 72 6f 63 65 73 73 20 63 72 61 73 68 65 73 20 73  rocess crashes s
a840: 6f 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e  o that the journ
a850: 61 6c 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  al.#            
a860: 20 20 20 20 62 65 63 6f 6d 65 73 20 61 20 68 6f      becomes a ho
a870: 74 2d 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 6d 75  t-journal and mu
a880: 73 74 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  st be rolled bac
a890: 6b 20 62 79 20 61 6e 6f 74 68 65 72 0a 23 20 20  k by another.#  
a8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 72                pr
a8b0: 6f 63 65 73 73 2c 20 74 68 65 72 65 20 69 73 20  ocess, there is 
a8c0: 61 20 64 61 6e 67 65 72 20 74 68 61 74 20 74 68  a danger that th
a8d0: 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  e other process 
a8e0: 6d 61 79 20 72 6f 6c 6c 0a 23 20 20 20 20 20 20  may roll.#      
a8f0: 20 20 20 20 20 20 20 20 20 20 62 61 63 6b 20 74            back t
a900: 68 65 20 61 62 6f 72 74 65 64 20 74 72 61 6e 73  he aborted trans
a910: 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 63 6f 6e  action, then con
a920: 74 69 6e 75 65 20 63 6f 70 79 69 6e 67 20 64 61  tinue copying da
a930: 74 61 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  ta.#            
a940: 20 20 20 20 66 72 6f 6d 20 61 6e 20 6f 6c 64 65      from an olde
a950: 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 72  r transaction fr
a960: 6f 6d 20 74 68 65 20 72 65 6d 61 69 6e 64 65 72  om the remainder
a970: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   of the journal.
a980: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
a990: 20 20 53 65 65 20 74 68 65 20 73 79 6e 63 4a 6f    See the syncJo
a9a0: 75 72 6e 61 6c 28 29 20 66 75 6e 63 74 69 6f 6e  urnal() function
a9b0: 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 23 0a   for details..#.
a9c0: 23 20 70 61 67 65 72 31 2d 31 33 2e 32 2e 2a 3a  # pager1-13.2.*:
a9d0: 20 53 61 6d 65 20 74 65 73 74 20 61 73 20 74 68   Same test as th
a9e0: 65 20 70 72 65 76 69 6f 75 73 2e 20 54 68 69 73  e previous. This
a9f0: 20 74 69 6d 65 2c 20 74 68 72 6f 77 20 61 6e 20   time, throw an 
aa00: 69 6e 64 65 78 20 69 6e 74 6f 0a 23 20 20 20 20  index into.#    
aa10: 20 20 20 20 20 20 20 20 20 20 20 20 74 68 65 20              the 
aa20: 6d 69 78 20 74 6f 20 6d 61 6b 65 20 74 68 65 20  mix to make the 
aa30: 69 6e 74 65 67 72 69 74 79 2d 63 68 65 63 6b 20  integrity-check 
aa40: 6d 6f 72 65 20 6c 69 6b 65 6c 79 20 74 6f 20 63  more likely to c
aa50: 61 74 63 68 0a 23 20 20 20 20 20 20 20 20 20 20  atch.#          
aa60: 20 20 20 20 20 20 65 72 72 6f 72 73 2e 0a 23 0a        errors..#.
aa70: 74 65 73 74 76 66 73 20 74 76 20 2d 64 65 66 61  testvfs tv -defa
aa80: 75 6c 74 20 31 0a 74 76 20 73 63 72 69 70 74 20  ult 1.tv script 
aa90: 78 53 79 6e 63 43 62 0a 74 76 20 66 69 6c 74 65  xSyncCb.tv filte
aaa0: 72 20 78 53 79 6e 63 0a 70 72 6f 63 20 78 53 79  r xSync.proc xSy
aab0: 6e 63 43 62 20 7b 6d 65 74 68 6f 64 20 66 69 6c  ncCb {method fil
aac0: 65 6e 61 6d 65 20 61 72 67 73 7d 20 7b 0a 20 20  ename args} {.  
aad0: 73 65 74 20 74 20 5b 66 69 6c 65 20 74 61 69 6c  set t [file tail
aae0: 20 24 66 69 6c 65 6e 61 6d 65 5d 0a 20 20 69 66   $filename].  if
aaf0: 20 7b 24 74 20 3d 3d 20 22 74 65 73 74 2e 64 62   {$t == "test.db
ab00: 22 7d 20 66 61 75 6c 74 73 69 6d 5f 73 61 76 65  "} faultsim_save
ab10: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
ab20: 5f 4f 4b 0a 7d 0a 66 61 75 6c 74 73 69 6d 5f 64  _OK.}.faultsim_d
ab30: 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e  elete_and_reopen
ab40: 0a 64 62 20 66 75 6e 63 20 61 5f 73 74 72 69 6e  .db func a_strin
ab50: 67 20 61 5f 73 74 72 69 6e 67 0a 0a 23 20 54 68  g a_string..# Th
ab60: 65 20 55 50 44 41 54 45 20 73 74 61 74 65 6d 65  e UPDATE stateme
ab70: 6e 74 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  nt at the end of
ab80: 20 74 68 69 73 20 74 65 73 74 20 63 61 73 65 20   this test case 
ab90: 63 72 65 61 74 65 73 20 61 20 72 65 61 6c 6c 79  creates a really
aba0: 20 62 69 67 0a 23 20 6a 6f 75 72 6e 61 6c 2e 20   big.# journal. 
abb0: 53 69 6e 63 65 20 74 68 65 20 63 61 63 68 65 2d  Since the cache-
abc0: 73 69 7a 65 20 69 73 20 6f 6e 6c 79 20 31 30 20  size is only 10 
abd0: 70 61 67 65 73 2c 20 74 68 65 20 6a 6f 75 72 6e  pages, the journ
abe0: 61 6c 20 63 6f 6e 74 61 69 6e 73 20 0a 23 20 66  al contains .# f
abf0: 72 65 71 75 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  requent journal 
ac00: 68 65 61 64 65 72 73 2e 0a 23 0a 64 6f 5f 65 78  headers..#.do_ex
ac10: 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72  ecsql_test pager
ac20: 31 2d 31 33 2e 31 2e 31 20 7b 0a 20 20 50 52 41  1-13.1.1 {.  PRA
ac30: 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20  GMA page_size = 
ac40: 31 30 32 34 3b 0a 20 20 50 52 41 47 4d 41 20 6a  1024;.  PRAGMA j
ac50: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 50 45  ournal_mode = PE
ac60: 52 53 49 53 54 3b 0a 20 20 50 52 41 47 4d 41 20  RSIST;.  PRAGMA 
ac70: 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b  cache_size = 10;
ac80: 0a 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 43 52  .  BEGIN;.    CR
ac90: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 20  EATE TABLE t1(a 
aca0: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
acb0: 4b 45 59 2c 20 62 20 42 4c 4f 42 29 3b 0a 20 20  KEY, b BLOB);.  
acc0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
acd0: 20 56 41 4c 55 45 53 28 4e 55 4c 4c 2c 20 61 5f   VALUES(NULL, a_
ace0: 73 74 72 69 6e 67 28 34 30 30 29 29 3b 0a 20 20  string(400));.  
acf0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
ad00: 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 61 5f   SELECT NULL, a_
ad10: 73 74 72 69 6e 67 28 34 30 30 29 20 46 52 4f 4d  string(400) FROM
ad20: 20 74 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a   t1;          /*
ad30: 20 20 20 32 20 2a 2f 0a 20 20 20 20 49 4e 53 45     2 */.    INSE
ad40: 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
ad50: 54 20 4e 55 4c 4c 2c 20 61 5f 73 74 72 69 6e 67  T NULL, a_string
ad60: 28 34 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20  (400) FROM t1;  
ad70: 20 20 20 20 20 20 20 20 2f 2a 20 20 20 34 20 2a          /*   4 *
ad80: 2f 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  /.    INSERT INT
ad90: 4f 20 74 31 20 53 45 4c 45 43 54 20 4e 55 4c 4c  O t1 SELECT NULL
ada0: 2c 20 61 5f 73 74 72 69 6e 67 28 34 30 30 29 20  , a_string(400) 
adb0: 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 20  FROM t1;        
adc0: 20 20 2f 2a 20 20 20 38 20 2a 2f 0a 20 20 20 20    /*   8 */.    
add0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
ade0: 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 61 5f 73 74  ELECT NULL, a_st
adf0: 72 69 6e 67 28 34 30 30 29 20 46 52 4f 4d 20 74  ring(400) FROM t
ae00: 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20  1;          /*  
ae10: 31 36 20 2a 2f 0a 20 20 20 20 49 4e 53 45 52 54  16 */.    INSERT
ae20: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
ae30: 4e 55 4c 4c 2c 20 61 5f 73 74 72 69 6e 67 28 34  NULL, a_string(4
ae40: 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20  00) FROM t1;    
ae50: 20 20 20 20 20 20 2f 2a 20 20 33 32 20 2a 2f 0a        /*  32 */.
ae60: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
ae70: 74 31 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20  t1 SELECT NULL, 
ae80: 61 5f 73 74 72 69 6e 67 28 34 30 30 29 20 46 52  a_string(400) FR
ae90: 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 20 20 20  OM t1;          
aea0: 2f 2a 20 20 36 34 20 2a 2f 0a 20 20 20 20 49 4e  /*  64 */.    IN
aeb0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
aec0: 45 43 54 20 4e 55 4c 4c 2c 20 61 5f 73 74 72 69  ECT NULL, a_stri
aed0: 6e 67 28 34 30 30 29 20 46 52 4f 4d 20 74 31 3b  ng(400) FROM t1;
aee0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 32 38            /* 128
aef0: 20 2a 2f 0a 20 20 43 4f 4d 4d 49 54 3b 0a 20 20   */.  COMMIT;.  
af00: 55 50 44 41 54 45 20 74 31 20 53 45 54 20 62 20  UPDATE t1 SET b 
af10: 3d 20 61 5f 73 74 72 69 6e 67 28 34 30 30 29 3b  = a_string(400);
af20: 0a 7d 20 7b 70 65 72 73 69 73 74 7d 0a 0a 23 20  .} {persist}..# 
af30: 52 75 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  Run transactions
af40: 20 6f 66 20 69 6e 63 72 65 61 73 69 6e 67 20 73   of increasing s
af50: 69 7a 65 73 2e 20 45 76 65 6e 74 75 61 6c 6c 79  izes. Eventually
af60: 2c 20 6f 6e 65 20 28 6f 72 20 6d 6f 72 65 20 74  , one (or more t
af70: 68 61 6e 20 6f 6e 65 29 0a 23 20 6f 66 20 74 68  han one).# of th
af80: 65 73 65 20 77 69 6c 6c 20 77 72 69 74 65 20 6a  ese will write j
af90: 75 73 74 20 65 6e 6f 75 67 68 20 63 6f 6e 74 65  ust enough conte
afa0: 6e 74 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 74  nt that one of t
afb0: 68 65 20 6f 6c 64 20 68 65 61 64 65 72 73 20 63  he old headers c
afc0: 72 65 61 74 65 64 20 0a 23 20 62 79 20 74 68 65  reated .# by the
afd0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20   transaction in 
afe0: 74 68 65 20 62 6c 6f 63 6b 20 61 62 6f 76 65 20  the block above 
aff0: 6c 69 65 73 20 69 6d 6d 65 64 69 61 74 65 6c 79  lies immediately
b000: 20 61 66 74 65 72 20 74 68 65 20 63 6f 6e 74 65   after the conte
b010: 6e 74 0a 23 20 6a 6f 75 72 6e 61 6c 6c 65 64 20  nt.# journalled 
b020: 62 79 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  by the current t
b030: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 23 0a 66 6f  ransaction..#.fo
b040: 72 20 7b 73 65 74 20 6e 55 70 20 31 7d 20 7b 24  r {set nUp 1} {$
b050: 6e 55 70 3c 36 34 7d 20 7b 69 6e 63 72 20 6e 55  nUp<64} {incr nU
b060: 70 7d 20 7b 0a 20 20 64 6f 5f 65 78 65 63 73 71  p} {.  do_execsq
b070: 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 33  l_test pager1-13
b080: 2e 31 2e 32 2e 24 6e 55 70 2e 31 20 7b 20 0a 20  .1.2.$nUp.1 { . 
b090: 20 20 20 55 50 44 41 54 45 20 74 31 20 53 45 54     UPDATE t1 SET
b0a0: 20 62 20 3d 20 61 5f 73 74 72 69 6e 67 28 33 39   b = a_string(39
b0b0: 39 29 20 57 48 45 52 45 20 61 20 3c 3d 20 24 6e  9) WHERE a <= $n
b0c0: 55 70 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 65  Up.  } {}.  do_e
b0d0: 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65  xecsql_test page
b0e0: 72 31 2d 31 33 2e 31 2e 32 2e 24 6e 55 70 2e 32  r1-13.1.2.$nUp.2
b0f0: 20 7b 20 50 52 41 47 4d 41 20 69 6e 74 65 67 72   { PRAGMA integr
b100: 69 74 79 5f 63 68 65 63 6b 20 7d 20 7b 6f 6b 7d  ity_check } {ok}
b110: 20 0a 0a 20 20 23 20 54 72 79 20 74 6f 20 61 63   ..  # Try to ac
b120: 63 65 73 73 20 74 68 65 20 73 6e 61 70 73 68 6f  cess the snapsho
b130: 74 20 6f 66 20 74 68 65 20 66 69 6c 65 2d 73 79  t of the file-sy
b140: 73 74 65 6d 2e 0a 20 20 23 0a 20 20 73 71 6c 69  stem..  #.  sqli
b150: 74 65 33 20 64 62 32 20 73 76 5f 74 65 73 74 2e  te3 db2 sv_test.
b160: 64 62 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67  db.  do_test pag
b170: 65 72 31 2d 31 33 2e 31 2e 32 2e 24 6e 55 70 2e  er1-13.1.2.$nUp.
b180: 33 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20  3 {.    execsql 
b190: 7b 20 53 45 4c 45 43 54 20 73 75 6d 28 6c 65 6e  { SELECT sum(len
b1a0: 67 74 68 28 62 29 29 20 46 52 4f 4d 20 74 31 20  gth(b)) FROM t1 
b1b0: 7d 20 64 62 32 0a 20 20 7d 20 5b 65 78 70 72 20  } db2.  } [expr 
b1c0: 7b 31 32 38 2a 34 30 30 20 2d 20 28 24 6e 55 70  {128*400 - ($nUp
b1d0: 2d 31 29 7d 5d 0a 20 20 64 6f 5f 74 65 73 74 20  -1)}].  do_test 
b1e0: 70 61 67 65 72 31 2d 31 33 2e 31 2e 32 2e 24 6e  pager1-13.1.2.$n
b1f0: 55 70 2e 34 20 7b 0a 20 20 20 20 65 78 65 63 73  Up.4 {.    execs
b200: 71 6c 20 7b 20 50 52 41 47 4d 41 20 69 6e 74 65  ql { PRAGMA inte
b210: 67 72 69 74 79 5f 63 68 65 63 6b 20 7d 20 64 62  grity_check } db
b220: 32 0a 20 20 7d 20 7b 6f 6b 7d 0a 20 20 64 62 32  2.  } {ok}.  db2
b230: 20 63 6c 6f 73 65 0a 7d 0a 0a 23 20 53 61 6d 65   close.}..# Same
b240: 20 74 65 73 74 20 61 73 20 61 62 6f 76 65 2e 20   test as above. 
b250: 42 75 74 20 74 68 69 73 20 74 69 6d 65 20 77 69  But this time wi
b260: 74 68 20 61 6e 20 69 6e 64 65 78 20 6f 6e 20 74  th an index on t
b270: 68 65 20 74 61 62 6c 65 2e 0a 23 0a 64 6f 5f 65  he table..#.do_e
b280: 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65  xecsql_test page
b290: 72 31 2d 31 33 2e 32 2e 31 20 7b 0a 20 20 43 52  r1-13.2.1 {.  CR
b2a0: 45 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e  EATE INDEX i1 ON
b2b0: 20 74 31 28 62 29 3b 0a 20 20 55 50 44 41 54 45   t1(b);.  UPDATE
b2c0: 20 74 31 20 53 45 54 20 62 20 3d 20 61 5f 73 74   t1 SET b = a_st
b2d0: 72 69 6e 67 28 34 30 30 29 3b 0a 7d 20 7b 7d 0a  ring(400);.} {}.
b2e0: 66 6f 72 20 7b 73 65 74 20 6e 55 70 20 31 7d 20  for {set nUp 1} 
b2f0: 7b 24 6e 55 70 3c 36 34 7d 20 7b 69 6e 63 72 20  {$nUp<64} {incr 
b300: 6e 55 70 7d 20 7b 0a 20 20 64 6f 5f 65 78 65 63  nUp} {.  do_exec
b310: 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d  sql_test pager1-
b320: 31 33 2e 32 2e 32 2e 24 6e 55 70 2e 31 20 7b 20  13.2.2.$nUp.1 { 
b330: 0a 20 20 20 20 55 50 44 41 54 45 20 74 31 20 53  .    UPDATE t1 S
b340: 45 54 20 62 20 3d 20 61 5f 73 74 72 69 6e 67 28  ET b = a_string(
b350: 33 39 39 29 20 57 48 45 52 45 20 61 20 3c 3d 20  399) WHERE a <= 
b360: 24 6e 55 70 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f  $nUp.  } {}.  do
b370: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61  _execsql_test pa
b380: 67 65 72 31 2d 31 33 2e 32 2e 32 2e 24 6e 55 70  ger1-13.2.2.$nUp
b390: 2e 32 20 7b 20 50 52 41 47 4d 41 20 69 6e 74 65  .2 { PRAGMA inte
b3a0: 67 72 69 74 79 5f 63 68 65 63 6b 20 7d 20 7b 6f  grity_check } {o
b3b0: 6b 7d 20 0a 20 20 73 71 6c 69 74 65 33 20 64 62  k} .  sqlite3 db
b3c0: 32 20 73 76 5f 74 65 73 74 2e 64 62 0a 20 20 64  2 sv_test.db.  d
b3d0: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 33  o_test pager1-13
b3e0: 2e 32 2e 32 2e 24 6e 55 70 2e 33 20 7b 0a 20 20  .2.2.$nUp.3 {.  
b3f0: 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45    execsql { SELE
b400: 43 54 20 73 75 6d 28 6c 65 6e 67 74 68 28 62 29  CT sum(length(b)
b410: 29 20 46 52 4f 4d 20 74 31 20 7d 20 64 62 32 0a  ) FROM t1 } db2.
b420: 20 20 7d 20 5b 65 78 70 72 20 7b 31 32 38 2a 34    } [expr {128*4
b430: 30 30 20 2d 20 28 24 6e 55 70 2d 31 29 7d 5d 0a  00 - ($nUp-1)}].
b440: 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
b450: 2d 31 33 2e 32 2e 32 2e 24 6e 55 70 2e 34 20 7b  -13.2.2.$nUp.4 {
b460: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 50  .    execsql { P
b470: 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f  RAGMA integrity_
b480: 63 68 65 63 6b 20 7d 20 64 62 32 0a 20 20 7d 20  check } db2.  } 
b490: 7b 6f 6b 7d 0a 20 20 64 62 32 20 63 6c 6f 73 65  {ok}.  db2 close
b4a0: 0a 7d 0a 0a 64 62 20 63 6c 6f 73 65 0a 74 76 20  .}..db close.tv 
b4b0: 64 65 6c 65 74 65 0a 0a 23 2d 2d 2d 2d 2d 2d 2d  delete..#-------
b4c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b4d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b4e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b4f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b500: 2d 2d 0a 23 20 54 65 73 74 20 73 70 65 63 61 6c  --.# Test specal
b510: 20 22 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c   "PRAGMA journal
b520: 5f 6d 6f 64 65 3d 4f 46 46 22 20 74 65 73 74 20  _mode=OFF" test 
b530: 63 61 73 65 73 2e 0a 23 0a 66 61 75 6c 74 73 69  cases..#.faultsi
b540: 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f  m_delete_and_reo
b550: 70 65 6e 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  pen.do_execsql_t
b560: 65 73 74 20 70 61 67 65 72 31 2d 31 34 2e 31 2e  est pager1-14.1.
b570: 31 20 7b 0a 20 20 50 52 41 47 4d 41 20 6a 6f 75  1 {.  PRAGMA jou
b580: 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 4f 46 46 3b  rnal_mode = OFF;
b590: 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  .  CREATE TABLE 
b5a0: 74 31 28 61 2c 20 62 29 3b 0a 20 20 42 45 47 49  t1(a, b);.  BEGI
b5b0: 4e 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  N;.    INSERT IN
b5c0: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20  TO t1 VALUES(1, 
b5d0: 32 29 3b 0a 20 20 43 4f 4d 4d 49 54 3b 0a 20 20  2);.  COMMIT;.  
b5e0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
b5f0: 3b 0a 7d 20 7b 6f 66 66 20 31 20 32 7d 0a 64 6f  ;.} {off 1 2}.do
b600: 5f 63 61 74 63 68 73 71 6c 5f 74 65 73 74 20 70  _catchsql_test p
b610: 61 67 65 72 31 2d 31 34 2e 31 2e 32 20 7b 0a 20  ager1-14.1.2 {. 
b620: 20 42 45 47 49 4e 3b 0a 20 20 20 20 49 4e 53 45   BEGIN;.    INSE
b630: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
b640: 53 28 33 2c 20 34 29 3b 0a 20 20 52 4f 4c 4c 42  S(3, 4);.  ROLLB
b650: 41 43 4b 3b 0a 7d 20 7b 30 20 7b 7d 7d 0a 64 6f  ACK;.} {0 {}}.do
b660: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61  _execsql_test pa
b670: 67 65 72 31 2d 31 34 2e 31 2e 33 20 7b 0a 20 20  ger1-14.1.3 {.  
b680: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
b690: 3b 0a 7d 20 7b 31 20 32 20 33 20 34 7d 0a 64 6f  ;.} {1 2 3 4}.do
b6a0: 5f 63 61 74 63 68 73 71 6c 5f 74 65 73 74 20 70  _catchsql_test p
b6b0: 61 67 65 72 31 2d 31 34 2e 31 2e 34 20 7b 0a 20  ager1-14.1.4 {. 
b6c0: 20 42 45 47 49 4e 3b 0a 20 20 20 20 49 4e 53 45   BEGIN;.    INSE
b6d0: 52 54 20 49 4e 54 4f 20 74 31 28 72 6f 77 69 64  RT INTO t1(rowid
b6e0: 2c 20 61 2c 20 62 29 20 53 45 4c 45 43 54 20 61  , a, b) SELECT a
b6f0: 2b 33 2c 20 62 2c 20 62 20 46 52 4f 4d 20 74 31  +3, b, b FROM t1
b700: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
b710: 4f 20 74 31 28 72 6f 77 69 64 2c 20 61 2c 20 62  O t1(rowid, a, b
b720: 29 20 53 45 4c 45 43 54 20 61 2b 33 2c 20 62 2c  ) SELECT a+3, b,
b730: 20 62 20 46 52 4f 4d 20 74 31 3b 0a 7d 20 7b 31   b FROM t1;.} {1
b740: 20 7b 50 52 49 4d 41 52 59 20 4b 45 59 20 6d 75   {PRIMARY KEY mu
b750: 73 74 20 62 65 20 75 6e 69 71 75 65 7d 7d 0a 64  st be unique}}.d
b760: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70  o_execsql_test p
b770: 61 67 65 72 31 2d 31 34 2e 31 2e 35 20 7b 0a 20  ager1-14.1.5 {. 
b780: 20 43 4f 4d 4d 49 54 3b 0a 20 20 53 45 4c 45 43   COMMIT;.  SELEC
b790: 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 7d 20 7b  T * FROM t1;.} {
b7a0: 31 20 32 20 33 20 34 20 32 20 32 20 34 20 34 7d  1 2 3 4 2 2 4 4}
b7b0: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
b7c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b7d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b7e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b7f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54  ------------.# T
b800: 65 73 74 20 6f 70 65 6e 69 6e 67 20 61 6e 64 20  est opening and 
b810: 63 6c 6f 73 69 6e 67 20 74 68 65 20 70 61 67 65  closing the page
b820: 72 20 73 75 62 2d 73 79 73 74 65 6d 20 77 69 74  r sub-system wit
b830: 68 20 64 69 66 66 65 72 65 6e 74 20 76 61 6c 75  h different valu
b840: 65 73 0a 23 20 66 6f 72 20 74 68 65 20 73 71 6c  es.# for the sql
b850: 69 74 65 33 5f 76 66 73 2e 73 7a 4f 73 46 69 6c  ite3_vfs.szOsFil
b860: 65 20 76 61 72 69 61 62 6c 65 2e 0a 23 0a 66 61  e variable..#.fa
b870: 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e  ultsim_delete_an
b880: 64 5f 72 65 6f 70 65 6e 0a 64 6f 5f 65 78 65 63  d_reopen.do_exec
b890: 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d  sql_test pager1-
b8a0: 31 35 2e 30 20 7b 0a 20 20 43 52 45 41 54 45 20  15.0 {.  CREATE 
b8b0: 54 41 42 4c 45 20 74 78 28 79 2c 20 7a 29 3b 0a  TABLE tx(y, z);.
b8c0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 78    INSERT INTO tx
b8d0: 20 56 41 4c 55 45 53 28 27 41 79 75 74 74 68 61   VALUES('Ayuttha
b8e0: 79 61 27 2c 20 27 42 65 69 6a 69 6e 67 27 29 3b  ya', 'Beijing');
b8f0: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  .  INSERT INTO t
b900: 78 20 56 41 4c 55 45 53 28 27 4c 6f 6e 64 6f 6e  x VALUES('London
b910: 27 2c 20 27 54 6f 6b 79 6f 27 29 3b 0a 7d 20 7b  ', 'Tokyo');.} {
b920: 7d 0a 64 62 20 63 6c 6f 73 65 0a 66 6f 72 20 7b  }.db close.for {
b930: 73 65 74 20 69 20 30 7d 20 7b 24 69 3c 35 31 33  set i 0} {$i<513
b940: 7d 20 7b 69 6e 63 72 20 69 20 33 7d 20 7b 0a 20  } {incr i 3} {. 
b950: 20 74 65 73 74 76 66 73 20 74 76 20 2d 64 65 66   testvfs tv -def
b960: 61 75 6c 74 20 31 20 2d 73 7a 6f 73 66 69 6c 65  ault 1 -szosfile
b970: 20 24 69 0a 20 20 73 71 6c 69 74 65 33 20 64 62   $i.  sqlite3 db
b980: 20 74 65 73 74 2e 64 62 0a 20 20 64 6f 5f 65 78   test.db.  do_ex
b990: 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72  ecsql_test pager
b9a0: 31 2d 31 35 2e 24 69 2e 31 20 7b 0a 20 20 20 20  1-15.$i.1 {.    
b9b0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 78  SELECT * FROM tx
b9c0: 3b 0a 20 20 7d 20 7b 41 79 75 74 74 68 61 79 61  ;.  } {Ayutthaya
b9d0: 20 42 65 69 6a 69 6e 67 20 4c 6f 6e 64 6f 6e 20   Beijing London 
b9e0: 54 6f 6b 79 6f 7d 0a 20 20 64 62 20 63 6c 6f 73  Tokyo}.  db clos
b9f0: 65 0a 20 20 74 76 20 64 65 6c 65 74 65 0a 7d 0a  e.  tv delete.}.
ba00: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
ba10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ba20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ba30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ba40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 43 68  -----------.# Ch
ba50: 65 63 6b 20 74 68 61 74 20 69 74 20 69 73 20 6e  eck that it is n
ba60: 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 6f  ot possible to o
ba70: 70 65 6e 20 61 20 64 61 74 61 62 61 73 65 20 66  pen a database f
ba80: 69 6c 65 20 69 66 20 74 68 65 20 66 75 6c 6c 20  ile if the full 
ba90: 70 61 74 68 0a 23 20 74 6f 20 74 68 65 20 61 73  path.# to the as
baa0: 73 6f 63 69 61 74 65 64 20 6a 6f 75 72 6e 61 6c  sociated journal
bab0: 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 6c 6f   file will be lo
bac0: 6e 67 65 72 20 74 68 61 6e 20 73 71 6c 69 74 65  nger than sqlite
bad0: 33 5f 76 66 73 2e 6d 78 50 61 74 68 6e 61 6d 65  3_vfs.mxPathname
bae0: 2e 0a 23 0a 74 65 73 74 76 66 73 20 74 76 20 2d  ..#.testvfs tv -
baf0: 64 65 66 61 75 6c 74 20 31 0a 74 76 20 73 63 72  default 1.tv scr
bb00: 69 70 74 20 78 4f 70 65 6e 43 62 0a 74 76 20 66  ipt xOpenCb.tv f
bb10: 69 6c 74 65 72 20 78 4f 70 65 6e 0a 70 72 6f 63  ilter xOpen.proc
bb20: 20 78 4f 70 65 6e 43 62 20 7b 6d 65 74 68 6f 64   xOpenCb {method
bb30: 20 66 69 6c 65 6e 61 6d 65 7d 20 7b 0a 20 20 73   filename} {.  s
bb40: 65 74 20 3a 3a 66 69 6c 65 5f 6c 65 6e 20 5b 73  et ::file_len [s
bb50: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 66 69  tring length $fi
bb60: 6c 65 6e 61 6d 65 5d 0a 7d 0a 73 71 6c 69 74 65  lename].}.sqlite
bb70: 33 20 64 62 20 74 65 73 74 2e 64 62 0a 64 62 20  3 db test.db.db 
bb80: 63 6c 6f 73 65 0a 74 76 20 64 65 6c 65 74 65 0a  close.tv delete.
bb90: 0a 66 6f 72 20 7b 73 65 74 20 69 69 20 5b 65 78  .for {set ii [ex
bba0: 70 72 20 24 3a 3a 66 69 6c 65 5f 6c 65 6e 2d 35  pr $::file_len-5
bbb0: 5d 7d 20 7b 24 69 69 20 3c 20 5b 65 78 70 72 20  ]} {$ii < [expr 
bbc0: 24 3a 3a 66 69 6c 65 5f 6c 65 6e 2b 32 30 5d 7d  $::file_len+20]}
bbd0: 20 7b 69 6e 63 72 20 69 69 7d 20 7b 0a 20 20 74   {incr ii} {.  t
bbe0: 65 73 74 76 66 73 20 74 76 20 2d 64 65 66 61 75  estvfs tv -defau
bbf0: 6c 74 20 31 20 2d 6d 78 70 61 74 68 6e 61 6d 65  lt 1 -mxpathname
bc00: 20 24 69 69 0a 0a 20 20 23 20 54 68 65 20 6c 65   $ii..  # The le
bc10: 6e 67 74 68 20 6f 66 20 74 68 65 20 66 75 6c 6c  ngth of the full
bc20: 20 70 61 74 68 20 74 6f 20 66 69 6c 65 20 22 74   path to file "t
bc30: 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 22 20  est.db-journal" 
bc40: 69 73 20 28 24 3a 3a 66 69 6c 65 5f 6c 65 6e 2b  is ($::file_len+
bc50: 38 29 2e 0a 20 20 23 20 49 66 20 74 68 65 20 63  8)..  # If the c
bc60: 6f 6e 66 69 67 75 72 65 64 20 73 71 6c 69 74 65  onfigured sqlite
bc70: 33 5f 76 66 73 2e 6d 78 50 61 74 68 6e 61 6d 65  3_vfs.mxPathname
bc80: 20 76 61 6c 75 65 20 67 72 65 61 74 65 72 20 74   value greater t
bc90: 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 0a  han or equal to.
bca0: 20 20 23 20 74 68 69 73 2c 20 74 68 65 6e 20 74    # this, then t
bcb0: 68 65 20 66 69 6c 65 20 63 61 6e 20 62 65 20 6f  he file can be o
bcc0: 70 65 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  pened. Otherwise
bcd0: 2c 20 69 74 20 63 61 6e 6e 6f 74 2e 0a 20 20 23  , it cannot..  #
bce0: 0a 20 20 69 66 20 7b 24 69 69 20 3e 3d 20 5b 65  .  if {$ii >= [e
bcf0: 78 70 72 20 24 3a 3a 66 69 6c 65 5f 6c 65 6e 2b  xpr $::file_len+
bd00: 38 5d 7d 20 7b 0a 20 20 20 20 73 65 74 20 72 65  8]} {.    set re
bd10: 73 20 7b 30 20 7b 7d 7d 0a 20 20 7d 20 65 6c 73  s {0 {}}.  } els
bd20: 65 20 7b 0a 20 20 20 20 73 65 74 20 72 65 73 20  e {.    set res 
bd30: 7b 31 20 7b 75 6e 61 62 6c 65 20 74 6f 20 6f 70  {1 {unable to op
bd40: 65 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  en database file
bd50: 7d 7d 0a 20 20 7d 0a 0a 20 20 64 6f 5f 74 65 73  }}.  }..  do_tes
bd60: 74 20 70 61 67 65 72 31 2d 31 36 2e 31 2e 24 69  t pager1-16.1.$i
bd70: 69 20 7b 0a 20 20 20 20 6c 69 73 74 20 5b 63 61  i {.    list [ca
bd80: 74 63 68 20 7b 20 73 71 6c 69 74 65 33 20 64 62  tch { sqlite3 db
bd90: 20 74 65 73 74 2e 64 62 20 7d 20 6d 73 67 5d 20   test.db } msg] 
bda0: 24 6d 73 67 0a 20 20 7d 20 24 72 65 73 0a 0a 20  $msg.  } $res.. 
bdb0: 20 63 61 74 63 68 20 7b 64 62 20 63 6c 6f 73 65   catch {db close
bdc0: 7d 0a 20 20 74 76 20 64 65 6c 65 74 65 0a 7d 0a  }.  tv delete.}.
bdd0: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
bde0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bdf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
be00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
be10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65  -----------.# Te
be20: 73 74 20 22 50 52 41 47 4d 41 20 6f 6d 69 74 5f  st "PRAGMA omit_
be30: 72 65 61 64 6c 6f 63 6b 22 2e 20 0a 23 0a 23 20  readlock". .#.# 
be40: 20 20 70 61 67 65 72 31 2d 31 37 2e 24 74 6e 2e    pager1-17.$tn.
be50: 31 2e 2a 3a 20 54 65 73 74 20 74 68 61 74 20 69  1.*: Test that i
be60: 66 20 61 20 73 65 63 6f 6e 64 20 63 6f 6e 6e 65  f a second conne
be70: 63 74 69 6f 6e 20 68 61 73 20 61 6e 20 6f 70 65  ction has an ope
be80: 6e 20 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  n .#            
be90: 20 20 20 20 20 20 20 20 20 20 72 65 61 64 2d 74            read-t
bea0: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 74 20 69  ransaction, it i
beb0: 73 20 6e 6f 74 20 75 73 75 61 6c 6c 79 20 70 6f  s not usually po
bec0: 73 73 69 62 6c 65 20 74 6f 20 77 72 69 74 65 20  ssible to write 
bed0: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
bee0: 20 20 20 20 20 20 20 20 74 68 65 20 64 61 74 61          the data
bef0: 62 61 73 65 2e 0a 23 0a 23 20 20 20 70 61 67 65  base..#.#   page
bf00: 72 31 2d 31 37 2e 24 74 6e 2e 32 2e 2a 3a 20 54  r1-17.$tn.2.*: T
bf10: 65 73 74 20 74 68 61 74 20 69 66 20 74 68 65 20  est that if the 
bf20: 73 65 63 6f 6e 64 20 63 6f 6e 6e 65 63 74 69 6f  second connectio
bf30: 6e 20 77 61 73 20 6f 70 65 6e 65 64 20 77 69 74  n was opened wit
bf40: 68 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20  h.#             
bf50: 20 20 20 20 20 20 20 20 20 74 68 65 20 53 51 4c           the SQL
bf60: 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
bf70: 59 20 66 6c 61 67 2c 20 61 6e 64 20 0a 23 20 20  Y flag, and .#  
bf80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf90: 20 20 20 20 22 50 52 41 47 4d 41 20 6f 6d 69 74      "PRAGMA omit
bfa0: 5f 72 65 61 64 6c 6f 63 6b 20 3d 20 31 22 20 69  _readlock = 1" i
bfb0: 73 20 65 78 65 63 75 74 65 64 20 62 65 66 6f 72  s executed befor
bfc0: 65 20 61 74 74 61 63 68 69 6e 67 0a 23 20 20 20  e attaching.#   
bfd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bfe0: 20 20 20 74 68 65 20 64 61 74 61 62 61 73 65 20     the database 
bff0: 61 6e 64 20 6f 70 65 6e 69 6e 67 20 61 20 72 65  and opening a re
c000: 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  ad-transaction o
c010: 6e 20 69 74 2c 20 69 74 20 69 73 0a 23 20 20 20  n it, it is.#   
c020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c030: 20 20 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 77     possible to w
c040: 72 69 74 65 20 74 68 65 20 64 62 2e 0a 23 0a 23  rite the db..#.#
c050: 20 20 20 70 61 67 65 72 31 2d 31 37 2e 24 74 6e     pager1-17.$tn
c060: 2e 33 2e 2a 3a 20 54 65 73 74 20 74 68 61 74 20  .3.*: Test that 
c070: 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20 63 6f  if the second co
c080: 6e 6e 65 63 74 69 6f 6e 20 77 61 73 20 2a 6e 6f  nnection was *no
c090: 74 2a 20 6f 70 65 6e 65 64 20 77 69 74 68 0a 23  t* opened with.#
c0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c0b0: 20 20 20 20 20 20 74 68 65 20 53 51 4c 49 54 45        the SQLITE
c0c0: 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 66  _OPEN_READONLY f
c0d0: 6c 61 67 2c 20 65 78 65 63 75 74 69 6e 67 20 0a  lag, executing .
c0e0: 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  #               
c0f0: 20 20 20 20 20 20 20 22 50 52 41 47 4d 41 20 6f         "PRAGMA o
c100: 6d 69 74 5f 72 65 61 64 6c 6f 63 6b 20 3d 20 31  mit_readlock = 1
c110: 22 20 68 61 73 20 6e 6f 20 65 66 66 65 63 74 2e  " has no effect.
c120: 0a 23 0a 64 6f 5f 6d 75 6c 74 69 63 6c 69 65 6e  .#.do_multiclien
c130: 74 5f 74 65 73 74 20 74 6e 20 7b 0a 20 20 64 6f  t_test tn {.  do
c140: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 37 2e  _test pager1-17.
c150: 24 74 6e 2e 31 2e 31 20 7b 0a 20 20 20 20 73 71  $tn.1.1 {.    sq
c160: 6c 31 20 7b 20 0a 20 20 20 20 20 20 43 52 45 41  l1 { .      CREA
c170: 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62  TE TABLE t1(a, b
c180: 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  );.      INSERT 
c190: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31  INTO t1 VALUES(1
c1a0: 2c 20 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 2);.    }.    
c1b0: 73 71 6c 32 20 7b 0a 20 20 20 20 20 20 42 45 47  sql2 {.      BEG
c1c0: 49 4e 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54  IN;.      SELECT
c1d0: 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20   * FROM t1;.    
c1e0: 7d 0a 20 20 7d 20 7b 31 20 32 7d 0a 20 20 64 6f  }.  } {1 2}.  do
c1f0: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 37 2e  _test pager1-17.
c200: 24 74 6e 2e 31 2e 32 20 7b 0a 20 20 20 20 63 73  $tn.1.2 {.    cs
c210: 71 6c 31 20 7b 20 49 4e 53 45 52 54 20 49 4e 54  ql1 { INSERT INT
c220: 4f 20 74 31 20 56 41 4c 55 45 53 28 33 2c 20 34  O t1 VALUES(3, 4
c230: 29 20 7d 0a 20 20 7d 20 7b 31 20 7b 64 61 74 61  ) }.  } {1 {data
c240: 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 7d 7d  base is locked}}
c250: 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72  .  do_test pager
c260: 31 2d 31 37 2e 24 74 6e 2e 31 2e 33 20 7b 0a 20  1-17.$tn.1.3 {. 
c270: 20 20 20 73 71 6c 32 20 7b 20 43 4f 4d 4d 49 54     sql2 { COMMIT
c280: 20 7d 0a 20 20 20 20 73 71 6c 31 20 7b 20 49 4e   }.    sql1 { IN
c290: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
c2a0: 55 45 53 28 33 2c 20 34 29 20 7d 0a 20 20 7d 20  UES(3, 4) }.  } 
c2b0: 7b 7d 0a 0a 20 20 64 6f 5f 74 65 73 74 20 70 61  {}..  do_test pa
c2c0: 67 65 72 31 2d 31 37 2e 24 74 6e 2e 32 2e 31 20  ger1-17.$tn.2.1 
c2d0: 7b 0a 20 20 20 20 63 6f 64 65 32 20 7b 0a 20 20  {.    code2 {.  
c2e0: 20 20 20 20 64 62 32 20 63 6c 6f 73 65 0a 20 20      db2 close.  
c2f0: 20 20 20 20 73 71 6c 69 74 65 33 20 64 62 32 20      sqlite3 db2 
c300: 3a 6d 65 6d 6f 72 79 3a 20 2d 72 65 61 64 6f 6e  :memory: -readon
c310: 6c 79 20 31 0a 20 20 20 20 7d 0a 20 20 20 20 73  ly 1.    }.    s
c320: 71 6c 32 20 7b 20 0a 20 20 20 20 20 20 50 52 41  ql2 { .      PRA
c330: 47 4d 41 20 6f 6d 69 74 5f 72 65 61 64 6c 6f 63  GMA omit_readloc
c340: 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20 41 54 54  k = 1;.      ATT
c350: 41 43 48 20 27 74 65 73 74 2e 64 62 27 20 41 53  ACH 'test.db' AS
c360: 20 74 77 6f 3b 0a 20 20 20 20 20 20 42 45 47 49   two;.      BEGI
c370: 4e 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20  N;.      SELECT 
c380: 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 7d  * FROM t1;.    }
c390: 0a 20 20 7d 20 7b 31 20 32 20 33 20 34 7d 0a 20  .  } {1 2 3 4}. 
c3a0: 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
c3b0: 31 37 2e 24 74 6e 2e 32 2e 32 20 7b 20 73 71 6c  17.$tn.2.2 { sql
c3c0: 31 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  1 "INSERT INTO t
c3d0: 31 20 56 41 4c 55 45 53 28 35 2c 20 36 29 22 20  1 VALUES(5, 6)" 
c3e0: 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70  } {}.  do_test p
c3f0: 61 67 65 72 31 2d 31 37 2e 24 74 6e 2e 32 2e 33  ager1-17.$tn.2.3
c400: 20 7b 20 73 71 6c 32 20 22 53 45 4c 45 43 54 20   { sql2 "SELECT 
c410: 2a 20 46 52 4f 4d 20 74 31 22 20 7d 20 20 20 20  * FROM t1" }    
c420: 20 20 20 20 20 20 20 20 7b 31 20 32 20 33 20 34          {1 2 3 4
c430: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65  }.  do_test page
c440: 72 31 2d 31 37 2e 24 74 6e 2e 32 2e 34 20 7b 20  r1-17.$tn.2.4 { 
c450: 73 71 6c 32 20 22 43 4f 4d 4d 49 54 20 3b 20 53  sql2 "COMMIT ; S
c460: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 22  ELECT * FROM t1"
c470: 20 7d 20 20 20 7b 31 20 32 20 33 20 34 20 35 20   }   {1 2 3 4 5 
c480: 36 7d 0a 0a 20 20 64 6f 5f 74 65 73 74 20 70 61  6}..  do_test pa
c490: 67 65 72 31 2d 31 37 2e 24 74 6e 2e 33 2e 31 20  ger1-17.$tn.3.1 
c4a0: 7b 0a 20 20 20 20 63 6f 64 65 32 20 7b 0a 20 20  {.    code2 {.  
c4b0: 20 20 20 20 64 62 32 20 63 6c 6f 73 65 0a 20 20      db2 close.  
c4c0: 20 20 20 20 73 71 6c 69 74 65 33 20 64 62 32 20      sqlite3 db2 
c4d0: 3a 6d 65 6d 6f 72 79 3a 0a 20 20 20 20 7d 0a 20  :memory:.    }. 
c4e0: 20 20 20 73 71 6c 32 20 7b 20 0a 20 20 20 20 20     sql2 { .     
c4f0: 20 50 52 41 47 4d 41 20 6f 6d 69 74 5f 72 65 61   PRAGMA omit_rea
c500: 64 6c 6f 63 6b 20 3d 20 31 3b 0a 20 20 20 20 20  dlock = 1;.     
c510: 20 41 54 54 41 43 48 20 27 74 65 73 74 2e 64 62   ATTACH 'test.db
c520: 27 20 41 53 20 74 77 6f 3b 0a 20 20 20 20 20 20  ' AS two;.      
c530: 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 53 45 4c  BEGIN;.      SEL
c540: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20  ECT * FROM t1;. 
c550: 20 20 20 7d 0a 20 20 7d 20 7b 31 20 32 20 33 20     }.  } {1 2 3 
c560: 34 20 35 20 36 7d 0a 20 20 64 6f 5f 74 65 73 74  4 5 6}.  do_test
c570: 20 70 61 67 65 72 31 2d 31 37 2e 24 74 6e 2e 33   pager1-17.$tn.3
c580: 2e 32 20 7b 0a 20 20 20 20 63 73 71 6c 31 20 7b  .2 {.    csql1 {
c590: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
c5a0: 56 41 4c 55 45 53 28 33 2c 20 34 29 20 7d 0a 20  VALUES(3, 4) }. 
c5b0: 20 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20   } {1 {database 
c5c0: 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 20 20 64 6f  is locked}}.  do
c5d0: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 37 2e  _test pager1-17.
c5e0: 24 74 6e 2e 33 2e 33 20 7b 20 73 71 6c 32 20 43  $tn.3.3 { sql2 C
c5f0: 4f 4d 4d 49 54 20 7d 20 7b 7d 0a 7d 0a 0a 23 2d  OMMIT } {}.}..#-
c600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c640: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20  --------.# Test 
c650: 74 68 65 20 70 61 67 65 72 73 20 72 65 73 70 6f  the pagers respo
c660: 6e 73 65 20 74 6f 20 74 68 65 20 62 2d 74 72 65  nse to the b-tre
c670: 65 20 6c 61 79 65 72 20 72 65 71 75 65 73 74 69  e layer requesti
c680: 6e 67 20 69 6c 6c 65 67 61 6c 20 70 61 67 65 20  ng illegal page 
c690: 0a 23 20 6e 75 6d 62 65 72 73 3a 0a 23 0a 23 20  .# numbers:.#.# 
c6a0: 20 20 2b 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20    + The locking 
c6b0: 70 61 67 65 2c 0a 23 20 20 20 2b 20 50 61 67 65  page,.#   + Page
c6c0: 20 30 2c 0a 23 20 20 20 2b 20 41 20 70 61 67 65   0,.#   + A page
c6d0: 20 77 69 74 68 20 61 20 70 61 67 65 20 6e 75 6d   with a page num
c6e0: 62 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e  ber greater than
c6f0: 20 28 32 5e 33 31 2d 31 29 2e 0a 23 0a 64 6f 5f   (2^31-1)..#.do_
c700: 74 65 73 74 20 70 61 67 65 72 31 2d 31 38 2e 31  test pager1-18.1
c710: 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65   {.  faultsim_de
c720: 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a  lete_and_reopen.
c730: 20 20 64 62 20 66 75 6e 63 20 61 5f 73 74 72 69    db func a_stri
c740: 6e 67 20 61 5f 73 74 72 69 6e 67 0a 20 20 65 78  ng a_string.  ex
c750: 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 50 52 41  ecsql { .    PRA
c760: 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20  GMA page_size = 
c770: 31 30 32 34 3b 0a 20 20 20 20 43 52 45 41 54 45  1024;.    CREATE
c780: 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b   TABLE t1(a, b);
c790: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
c7a0: 20 74 31 20 56 41 4c 55 45 53 28 61 5f 73 74 72   t1 VALUES(a_str
c7b0: 69 6e 67 28 35 30 30 29 2c 20 61 5f 73 74 72 69  ing(500), a_stri
c7c0: 6e 67 28 32 30 30 29 29 3b 0a 20 20 20 20 49 4e  ng(200));.    IN
c7d0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
c7e0: 45 43 54 20 61 5f 73 74 72 69 6e 67 28 35 30 30  ECT a_string(500
c7f0: 29 2c 20 61 5f 73 74 72 69 6e 67 28 32 30 30 29  ), a_string(200)
c800: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e   FROM t1;.    IN
c810: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
c820: 45 43 54 20 61 5f 73 74 72 69 6e 67 28 35 30 30  ECT a_string(500
c830: 29 2c 20 61 5f 73 74 72 69 6e 67 28 32 30 30 29  ), a_string(200)
c840: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e   FROM t1;.    IN
c850: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
c860: 45 43 54 20 61 5f 73 74 72 69 6e 67 28 35 30 30  ECT a_string(500
c870: 29 2c 20 61 5f 73 74 72 69 6e 67 28 32 30 30 29  ), a_string(200)
c880: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e   FROM t1;.    IN
c890: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
c8a0: 45 43 54 20 61 5f 73 74 72 69 6e 67 28 35 30 30  ECT a_string(500
c8b0: 29 2c 20 61 5f 73 74 72 69 6e 67 28 32 30 30 29  ), a_string(200)
c8c0: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e   FROM t1;.    IN
c8d0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
c8e0: 45 43 54 20 61 5f 73 74 72 69 6e 67 28 35 30 30  ECT a_string(500
c8f0: 29 2c 20 61 5f 73 74 72 69 6e 67 28 32 30 30 29  ), a_string(200)
c900: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e   FROM t1;.    IN
c910: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
c920: 45 43 54 20 61 5f 73 74 72 69 6e 67 28 35 30 30  ECT a_string(500
c930: 29 2c 20 61 5f 73 74 72 69 6e 67 28 32 30 30 29  ), a_string(200)
c940: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e   FROM t1;.    IN
c950: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
c960: 45 43 54 20 61 5f 73 74 72 69 6e 67 28 35 30 30  ECT a_string(500
c970: 29 2c 20 61 5f 73 74 72 69 6e 67 28 32 30 30 29  ), a_string(200)
c980: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a 7d 20   FROM t1;.  }.} 
c990: 7b 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  {}.do_test pager
c9a0: 31 2d 31 38 2e 32 20 7b 0a 20 20 73 65 74 20 72  1-18.2 {.  set r
c9b0: 6f 6f 74 20 5b 64 62 20 6f 6e 65 20 22 53 45 4c  oot [db one "SEL
c9c0: 45 43 54 20 72 6f 6f 74 70 61 67 65 20 46 52 4f  ECT rootpage FRO
c9d0: 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22  M sqlite_master"
c9e0: 5d 0a 20 20 73 65 74 20 6c 6f 63 6b 69 6e 67 70  ].  set lockingp
c9f0: 61 67 65 20 5b 65 78 70 72 20 28 30 78 31 30 30  age [expr (0x100
ca00: 30 30 2f 31 30 32 34 29 20 2b 20 31 5d 0a 20 20  00/1024) + 1].  
ca10: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52  execsql {.    PR
ca20: 41 47 4d 41 20 77 72 69 74 61 62 6c 65 5f 73 63  AGMA writable_sc
ca30: 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20 55 50  hema = 1;.    UP
ca40: 44 41 54 45 20 73 71 6c 69 74 65 5f 6d 61 73 74  DATE sqlite_mast
ca50: 65 72 20 53 45 54 20 72 6f 6f 74 70 61 67 65 20  er SET rootpage 
ca60: 3d 20 24 6c 6f 63 6b 69 6e 67 70 61 67 65 3b 0a  = $lockingpage;.
ca70: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 20 64 62    }.  sqlite3 db
ca80: 32 20 74 65 73 74 2e 64 62 0a 20 20 63 61 74 63  2 test.db.  catc
ca90: 68 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 63 6f  hsql { SELECT co
caa0: 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31 20 7d  unt(*) FROM t1 }
cab0: 20 64 62 32 0a 7d 20 7b 31 20 7b 64 61 74 61 62   db2.} {1 {datab
cac0: 61 73 65 20 64 69 73 6b 20 69 6d 61 67 65 20 69  ase disk image i
cad0: 73 20 6d 61 6c 66 6f 72 6d 65 64 7d 7d 0a 64 62  s malformed}}.db
cae0: 32 20 63 6c 6f 73 65 0a 64 6f 5f 74 65 73 74 20  2 close.do_test 
caf0: 70 61 67 65 72 31 2d 31 38 2e 33 20 7b 0a 20 20  pager1-18.3 {.  
cb00: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52  execsql {.    CR
cb10: 45 41 54 45 20 54 41 42 4c 45 20 74 32 28 78 29  EATE TABLE t2(x)
cb20: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
cb30: 4f 20 74 32 20 56 41 4c 55 45 53 28 61 5f 73 74  O t2 VALUES(a_st
cb40: 72 69 6e 67 28 35 30 30 30 29 29 3b 0a 20 20 7d  ring(5000));.  }
cb50: 0a 20 20 73 65 74 20 70 67 6e 6f 20 5b 65 78 70  .  set pgno [exp
cb60: 72 20 28 5b 66 69 6c 65 20 73 69 7a 65 20 74 65  r ([file size te
cb70: 73 74 2e 64 62 5d 20 2f 20 31 30 32 34 29 2d 32  st.db] / 1024)-2
cb80: 5d 0a 20 20 68 65 78 69 6f 5f 77 72 69 74 65 20  ].  hexio_write 
cb90: 74 65 73 74 2e 64 62 20 5b 65 78 70 72 20 28 24  test.db [expr ($
cba0: 70 67 6e 6f 2d 31 29 2a 31 30 32 34 5d 20 30 30  pgno-1)*1024] 00
cbb0: 30 30 30 30 30 30 0a 20 20 73 71 6c 69 74 65 33  000000.  sqlite3
cbc0: 20 64 62 32 20 74 65 73 74 2e 64 62 0a 20 20 63   db2 test.db.  c
cbd0: 61 74 63 68 73 71 6c 20 7b 20 53 45 4c 45 43 54  atchsql { SELECT
cbe0: 20 6c 65 6e 67 74 68 28 78 29 20 46 52 4f 4d 20   length(x) FROM 
cbf0: 74 32 20 7d 20 64 62 32 0a 7d 20 7b 31 20 7b 64  t2 } db2.} {1 {d
cc00: 61 74 61 62 61 73 65 20 64 69 73 6b 20 69 6d 61  atabase disk ima
cc10: 67 65 20 69 73 20 6d 61 6c 66 6f 72 6d 65 64 7d  ge is malformed}
cc20: 7d 0a 64 62 32 20 63 6c 6f 73 65 0a 64 6f 5f 74  }.db2 close.do_t
cc30: 65 73 74 20 70 61 67 65 72 31 2d 31 38 2e 34 20  est pager1-18.4 
cc40: 7b 0a 20 20 68 65 78 69 6f 5f 77 72 69 74 65 20  {.  hexio_write 
cc50: 74 65 73 74 2e 64 62 20 5b 65 78 70 72 20 28 24  test.db [expr ($
cc60: 70 67 6e 6f 2d 31 29 2a 31 30 32 34 5d 20 39 30  pgno-1)*1024] 90
cc70: 30 30 30 30 30 30 0a 20 20 73 71 6c 69 74 65 33  000000.  sqlite3
cc80: 20 64 62 32 20 74 65 73 74 2e 64 62 0a 20 20 63   db2 test.db.  c
cc90: 61 74 63 68 73 71 6c 20 7b 20 53 45 4c 45 43 54  atchsql { SELECT
cca0: 20 6c 65 6e 67 74 68 28 78 29 20 46 52 4f 4d 20   length(x) FROM 
ccb0: 74 32 20 7d 20 64 62 32 0a 7d 20 7b 31 20 7b 64  t2 } db2.} {1 {d
ccc0: 61 74 61 62 61 73 65 20 64 69 73 6b 20 69 6d 61  atabase disk ima
ccd0: 67 65 20 69 73 20 6d 61 6c 66 6f 72 6d 65 64 7d  ge is malformed}
cce0: 7d 0a 64 62 32 20 63 6c 6f 73 65 0a 64 6f 5f 74  }.db2 close.do_t
ccf0: 65 73 74 20 70 61 67 65 72 31 2d 31 38 2e 35 20  est pager1-18.5 
cd00: 7b 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 22  {.  sqlite3 db "
cd10: 22 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  ".  execsql {.  
cd20: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
cd30: 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 43 52 45  1(a, b);.    CRE
cd40: 41 54 45 20 54 41 42 4c 45 20 74 32 28 61 2c 20  ATE TABLE t2(a, 
cd50: 62 29 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 77  b);.    PRAGMA w
cd60: 72 69 74 61 62 6c 65 5f 73 63 68 65 6d 61 20 3d  ritable_schema =
cd70: 20 31 3b 0a 20 20 20 20 55 50 44 41 54 45 20 73   1;.    UPDATE s
cd80: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 53 45 54  qlite_master SET
cd90: 20 72 6f 6f 74 70 61 67 65 3d 35 20 57 48 45 52   rootpage=5 WHER
cda0: 45 20 74 62 6c 5f 6e 61 6d 65 20 3d 20 27 74 31  E tbl_name = 't1
cdb0: 27 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 77 72  ';.    PRAGMA wr
cdc0: 69 74 61 62 6c 65 5f 73 63 68 65 6d 61 20 3d 20  itable_schema = 
cdd0: 30 3b 0a 20 20 20 20 41 4c 54 45 52 20 54 41 42  0;.    ALTER TAB
cde0: 4c 45 20 74 31 20 52 45 4e 41 4d 45 20 54 4f 20  LE t1 RENAME TO 
cdf0: 78 31 3b 0a 20 20 7d 0a 20 20 63 61 74 63 68 73  x1;.  }.  catchs
ce00: 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52  ql { SELECT * FR
ce10: 4f 4d 20 78 31 20 7d 0a 7d 20 7b 31 20 7b 64 61  OM x1 }.} {1 {da
ce20: 74 61 62 61 73 65 20 64 69 73 6b 20 69 6d 61 67  tabase disk imag
ce30: 65 20 69 73 20 6d 61 6c 66 6f 72 6d 65 64 7d 7d  e is malformed}}
ce40: 0a 64 62 20 63 6c 6f 73 65 0a 0a 64 6f 5f 74 65  .db close..do_te
ce50: 73 74 20 70 61 67 65 72 31 2d 31 38 2e 36 20 7b  st pager1-18.6 {
ce60: 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65  .  faultsim_dele
ce70: 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20  te_and_reopen.  
ce80: 64 62 20 66 75 6e 63 20 61 5f 73 74 72 69 6e 67  db func a_string
ce90: 20 61 5f 73 74 72 69 6e 67 0a 20 20 65 78 65 63   a_string.  exec
cea0: 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41  sql {.    PRAGMA
ceb0: 20 70 61 67 65 5f 73 69 7a 65 20 3d 20 31 30 32   page_size = 102
cec0: 34 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  4;.    CREATE TA
ced0: 42 4c 45 20 74 31 28 78 29 3b 0a 20 20 20 20 49  BLE t1(x);.    I
cee0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
cef0: 4c 55 45 53 28 61 5f 73 74 72 69 6e 67 28 38 30  LUES(a_string(80
cf00: 30 29 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  0));.    INSERT 
cf10: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 61  INTO t1 VALUES(a
cf20: 5f 73 74 72 69 6e 67 28 38 30 30 29 29 3b 0a 20  _string(800));. 
cf30: 20 7d 0a 0a 20 20 73 65 74 20 72 6f 6f 74 20 5b   }..  set root [
cf40: 64 62 20 6f 6e 65 20 22 53 45 4c 45 43 54 20 72  db one "SELECT r
cf50: 6f 6f 74 70 61 67 65 20 46 52 4f 4d 20 73 71 6c  ootpage FROM sql
cf60: 69 74 65 5f 6d 61 73 74 65 72 22 5d 0a 20 20 64  ite_master"].  d
cf70: 62 20 63 6c 6f 73 65 0a 0a 20 20 68 65 78 69 6f  b close..  hexio
cf80: 5f 77 72 69 74 65 20 74 65 73 74 2e 64 62 20 5b  _write test.db [
cf90: 65 78 70 72 20 28 24 72 6f 6f 74 2d 31 29 2a 31  expr ($root-1)*1
cfa0: 30 32 34 20 2b 20 38 5d 20 30 30 30 30 30 30 30  024 + 8] 0000000
cfb0: 30 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 74  0.  sqlite3 db t
cfc0: 65 73 74 2e 64 62 0a 20 20 63 61 74 63 68 73 71  est.db.  catchsq
cfd0: 6c 20 7b 20 53 45 4c 45 43 54 20 6c 65 6e 67 74  l { SELECT lengt
cfe0: 68 28 78 29 20 46 52 4f 4d 20 74 31 20 7d 0a 7d  h(x) FROM t1 }.}
cff0: 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20 64 69   {1 {database di
d000: 73 6b 20 69 6d 61 67 65 20 69 73 20 6d 61 6c 66  sk image is malf
d010: 6f 72 6d 65 64 7d 7d 0a 0a 64 6f 5f 74 65 73 74  ormed}}..do_test
d020: 20 70 61 67 65 72 31 2d 31 39 2e 31 20 7b 0a 20   pager1-19.1 {. 
d030: 20 73 71 6c 69 74 65 33 20 64 62 20 22 22 0a 20   sqlite3 db "". 
d040: 20 64 62 20 66 75 6e 63 20 61 5f 73 74 72 69 6e   db func a_strin
d050: 67 20 61 5f 73 74 72 69 6e 67 0a 20 20 65 78 65  g a_string.  exe
d060: 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d  csql {.    PRAGM
d070: 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20 35 31  A page_size = 51
d080: 32 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 61 75  2;.    PRAGMA au
d090: 74 6f 5f 76 61 63 75 75 6d 20 3d 20 31 3b 0a 20  to_vacuum = 1;. 
d0a0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
d0b0: 74 31 28 61 61 2c 20 61 62 2c 20 61 63 2c 20 61  t1(aa, ab, ac, a
d0c0: 64 2c 20 61 65 2c 20 61 66 2c 20 61 67 2c 20 61  d, ae, af, ag, a
d0d0: 68 2c 20 61 69 2c 20 61 6a 2c 20 61 6b 2c 20 61  h, ai, aj, ak, a
d0e0: 6c 2c 20 61 6d 2c 20 61 6e 2c 0a 20 20 20 20 20  l, am, an,.     
d0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
d100: 61 2c 20 62 62 2c 20 62 63 2c 20 62 64 2c 20 62  a, bb, bc, bd, b
d110: 65 2c 20 62 66 2c 20 62 67 2c 20 62 68 2c 20 62  e, bf, bg, bh, b
d120: 69 2c 20 62 6a 2c 20 62 6b 2c 20 62 6c 2c 20 62  i, bj, bk, bl, b
d130: 6d 2c 20 62 6e 2c 0a 20 20 20 20 20 20 20 20 20  m, bn,.         
d140: 20 20 20 20 20 20 20 20 20 20 20 63 61 2c 20 63             ca, c
d150: 62 2c 20 63 63 2c 20 63 64 2c 20 63 65 2c 20 63  b, cc, cd, ce, c
d160: 66 2c 20 63 67 2c 20 63 68 2c 20 63 69 2c 20 63  f, cg, ch, ci, c
d170: 6a 2c 20 63 6b 2c 20 63 6c 2c 20 63 6d 2c 20 63  j, ck, cl, cm, c
d180: 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n,.             
d190: 20 20 20 20 20 20 20 64 61 2c 20 64 62 2c 20 64         da, db, d
d1a0: 63 2c 20 64 64 2c 20 64 65 2c 20 64 66 2c 20 64  c, dd, de, df, d
d1b0: 67 2c 20 64 68 2c 20 64 69 2c 20 64 6a 2c 20 64  g, dh, di, dj, d
d1c0: 6b 2c 20 64 6c 2c 20 64 6d 2c 20 64 6e 2c 0a 20  k, dl, dm, dn,. 
d1d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d1e0: 20 20 20 65 61 2c 20 65 62 2c 20 65 63 2c 20 65     ea, eb, ec, e
d1f0: 64 2c 20 65 65 2c 20 65 66 2c 20 65 67 2c 20 65  d, ee, ef, eg, e
d200: 68 2c 20 65 69 2c 20 65 6a 2c 20 65 6b 2c 20 65  h, ei, ej, ek, e
d210: 6c 2c 20 65 6d 2c 20 65 6e 2c 0a 20 20 20 20 20  l, em, en,.     
d220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
d230: 61 2c 20 66 62 2c 20 66 63 2c 20 66 64 2c 20 66  a, fb, fc, fd, f
d240: 65 2c 20 66 66 2c 20 66 67 2c 20 66 68 2c 20 66  e, ff, fg, fh, f
d250: 69 2c 20 66 6a 2c 20 66 6b 2c 20 66 6c 2c 20 66  i, fj, fk, fl, f
d260: 6d 2c 20 66 6e 2c 0a 20 20 20 20 20 20 20 20 20  m, fn,.         
d270: 20 20 20 20 20 20 20 20 20 20 20 67 61 2c 20 67             ga, g
d280: 62 2c 20 67 63 2c 20 67 64 2c 20 67 65 2c 20 67  b, gc, gd, ge, g
d290: 66 2c 20 67 67 2c 20 67 68 2c 20 67 69 2c 20 67  f, gg, gh, gi, g
d2a0: 6a 2c 20 67 6b 2c 20 67 6c 2c 20 67 6d 2c 20 67  j, gk, gl, gm, g
d2b0: 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n,.             
d2c0: 20 20 20 20 20 20 20 68 61 2c 20 68 62 2c 20 68         ha, hb, h
d2d0: 63 2c 20 68 64 2c 20 68 65 2c 20 68 66 2c 20 68  c, hd, he, hf, h
d2e0: 67 2c 20 68 68 2c 20 68 69 2c 20 68 6a 2c 20 68  g, hh, hi, hj, h
d2f0: 6b 2c 20 68 6c 2c 20 68 6d 2c 20 68 6e 2c 0a 20  k, hl, hm, hn,. 
d300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d310: 20 20 20 69 61 2c 20 69 62 2c 20 69 63 2c 20 69     ia, ib, ic, i
d320: 64 2c 20 69 65 2c 20 69 66 2c 20 69 67 2c 20 69  d, ie, if, ig, i
d330: 68 2c 20 69 69 2c 20 69 6a 2c 20 69 6b 2c 20 69  h, ii, ij, ik, i
d340: 6c 2c 20 69 6d 2c 20 69 78 2c 0a 20 20 20 20 20  l, im, ix,.     
d350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6a                 j
d360: 61 2c 20 6a 62 2c 20 6a 63 2c 20 6a 64 2c 20 6a  a, jb, jc, jd, j
d370: 65 2c 20 6a 66 2c 20 6a 67 2c 20 6a 68 2c 20 6a  e, jf, jg, jh, j
d380: 69 2c 20 6a 6a 2c 20 6a 6b 2c 20 6a 6c 2c 20 6a  i, jj, jk, jl, j
d390: 6d 2c 20 6a 6e 2c 0a 20 20 20 20 20 20 20 20 20  m, jn,.         
d3a0: 20 20 20 20 20 20 20 20 20 20 20 6b 61 2c 20 6b             ka, k
d3b0: 62 2c 20 6b 63 2c 20 6b 64 2c 20 6b 65 2c 20 6b  b, kc, kd, ke, k
d3c0: 66 2c 20 6b 67 2c 20 6b 68 2c 20 6b 69 2c 20 6b  f, kg, kh, ki, k
d3d0: 6a 2c 20 6b 6b 2c 20 6b 6c 2c 20 6b 6d 2c 20 6b  j, kk, kl, km, k
d3e0: 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n,.             
d3f0: 20 20 20 20 20 20 20 6c 61 2c 20 6c 62 2c 20 6c         la, lb, l
d400: 63 2c 20 6c 64 2c 20 6c 65 2c 20 6c 66 2c 20 6c  c, ld, le, lf, l
d410: 67 2c 20 6c 68 2c 20 6c 69 2c 20 6c 6a 2c 20 6c  g, lh, li, lj, l
d420: 6b 2c 20 6c 6c 2c 20 6c 6d 2c 20 6c 6e 2c 0a 20  k, ll, lm, ln,. 
d430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d440: 20 20 20 6d 61 2c 20 6d 62 2c 20 6d 63 2c 20 6d     ma, mb, mc, m
d450: 64 2c 20 6d 65 2c 20 6d 66 2c 20 6d 67 2c 20 6d  d, me, mf, mg, m
d460: 68 2c 20 6d 69 2c 20 6d 6a 2c 20 6d 6b 2c 20 6d  h, mi, mj, mk, m
d470: 6c 2c 20 6d 6d 2c 20 6d 6e 0a 20 20 20 20 29 3b  l, mm, mn.    );
d480: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
d490: 45 20 74 32 28 61 61 2c 20 61 62 2c 20 61 63 2c  E t2(aa, ab, ac,
d4a0: 20 61 64 2c 20 61 65 2c 20 61 66 2c 20 61 67 2c   ad, ae, af, ag,
d4b0: 20 61 68 2c 20 61 69 2c 20 61 6a 2c 20 61 6b 2c   ah, ai, aj, ak,
d4c0: 20 61 6c 2c 20 61 6d 2c 20 61 6e 2c 0a 20 20 20   al, am, an,.   
d4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d4e0: 20 62 61 2c 20 62 62 2c 20 62 63 2c 20 62 64 2c   ba, bb, bc, bd,
d4f0: 20 62 65 2c 20 62 66 2c 20 62 67 2c 20 62 68 2c   be, bf, bg, bh,
d500: 20 62 69 2c 20 62 6a 2c 20 62 6b 2c 20 62 6c 2c   bi, bj, bk, bl,
d510: 20 62 6d 2c 20 62 6e 2c 0a 20 20 20 20 20 20 20   bm, bn,.       
d520: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 61 2c               ca,
d530: 20 63 62 2c 20 63 63 2c 20 63 64 2c 20 63 65 2c   cb, cc, cd, ce,
d540: 20 63 66 2c 20 63 67 2c 20 63 68 2c 20 63 69 2c   cf, cg, ch, ci,
d550: 20 63 6a 2c 20 63 6b 2c 20 63 6c 2c 20 63 6d 2c   cj, ck, cl, cm,
d560: 20 63 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20   cn,.           
d570: 20 20 20 20 20 20 20 20 20 64 61 2c 20 64 62 2c           da, db,
d580: 20 64 63 2c 20 64 64 2c 20 64 65 2c 20 64 66 2c   dc, dd, de, df,
d590: 20 64 67 2c 20 64 68 2c 20 64 69 2c 20 64 6a 2c   dg, dh, di, dj,
d5a0: 20 64 6b 2c 20 64 6c 2c 20 64 6d 2c 20 64 6e 2c   dk, dl, dm, dn,
d5b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
d5c0: 20 20 20 20 20 65 61 2c 20 65 62 2c 20 65 63 2c       ea, eb, ec,
d5d0: 20 65 64 2c 20 65 65 2c 20 65 66 2c 20 65 67 2c   ed, ee, ef, eg,
d5e0: 20 65 68 2c 20 65 69 2c 20 65 6a 2c 20 65 6b 2c   eh, ei, ej, ek,
d5f0: 20 65 6c 2c 20 65 6d 2c 20 65 6e 2c 0a 20 20 20   el, em, en,.   
d600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d610: 20 66 61 2c 20 66 62 2c 20 66 63 2c 20 66 64 2c   fa, fb, fc, fd,
d620: 20 66 65 2c 20 66 66 2c 20 66 67 2c 20 66 68 2c   fe, ff, fg, fh,
d630: 20 66 69 2c 20 66 6a 2c 20 66 6b 2c 20 66 6c 2c   fi, fj, fk, fl,
d640: 20 66 6d 2c 20 66 6e 2c 0a 20 20 20 20 20 20 20   fm, fn,.       
d650: 20 20 20 20 20 20 20 20 20 20 20 20 20 67 61 2c               ga,
d660: 20 67 62 2c 20 67 63 2c 20 67 64 2c 20 67 65 2c   gb, gc, gd, ge,
d670: 20 67 66 2c 20 67 67 2c 20 67 68 2c 20 67 69 2c   gf, gg, gh, gi,
d680: 20 67 6a 2c 20 67 6b 2c 20 67 6c 2c 20 67 6d 2c   gj, gk, gl, gm,
d690: 20 67 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20   gn,.           
d6a0: 20 20 20 20 20 20 20 20 20 68 61 2c 20 68 62 2c           ha, hb,
d6b0: 20 68 63 2c 20 68 64 2c 20 68 65 2c 20 68 66 2c   hc, hd, he, hf,
d6c0: 20 68 67 2c 20 68 68 2c 20 68 69 2c 20 68 6a 2c   hg, hh, hi, hj,
d6d0: 20 68 6b 2c 20 68 6c 2c 20 68 6d 2c 20 68 6e 2c   hk, hl, hm, hn,
d6e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
d6f0: 20 20 20 20 20 69 61 2c 20 69 62 2c 20 69 63 2c       ia, ib, ic,
d700: 20 69 64 2c 20 69 65 2c 20 69 66 2c 20 69 67 2c   id, ie, if, ig,
d710: 20 69 68 2c 20 69 69 2c 20 69 6a 2c 20 69 6b 2c   ih, ii, ij, ik,
d720: 20 69 6c 2c 20 69 6d 2c 20 69 78 2c 0a 20 20 20   il, im, ix,.   
d730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d740: 20 6a 61 2c 20 6a 62 2c 20 6a 63 2c 20 6a 64 2c   ja, jb, jc, jd,
d750: 20 6a 65 2c 20 6a 66 2c 20 6a 67 2c 20 6a 68 2c   je, jf, jg, jh,
d760: 20 6a 69 2c 20 6a 6a 2c 20 6a 6b 2c 20 6a 6c 2c   ji, jj, jk, jl,
d770: 20 6a 6d 2c 20 6a 6e 2c 0a 20 20 20 20 20 20 20   jm, jn,.       
d780: 20 20 20 20 20 20 20 20 20 20 20 20 20 6b 61 2c               ka,
d790: 20 6b 62 2c 20 6b 63 2c 20 6b 64 2c 20 6b 65 2c   kb, kc, kd, ke,
d7a0: 20 6b 66 2c 20 6b 67 2c 20 6b 68 2c 20 6b 69 2c   kf, kg, kh, ki,
d7b0: 20 6b 6a 2c 20 6b 6b 2c 20 6b 6c 2c 20 6b 6d 2c   kj, kk, kl, km,
d7c0: 20 6b 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20   kn,.           
d7d0: 20 20 20 20 20 20 20 20 20 6c 61 2c 20 6c 62 2c           la, lb,
d7e0: 20 6c 63 2c 20 6c 64 2c 20 6c 65 2c 20 6c 66 2c   lc, ld, le, lf,
d7f0: 20 6c 67 2c 20 6c 68 2c 20 6c 69 2c 20 6c 6a 2c   lg, lh, li, lj,
d800: 20 6c 6b 2c 20 6c 6c 2c 20 6c 6d 2c 20 6c 6e 2c   lk, ll, lm, ln,
d810: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
d820: 20 20 20 20 20 6d 61 2c 20 6d 62 2c 20 6d 63 2c       ma, mb, mc,
d830: 20 6d 64 2c 20 6d 65 2c 20 6d 66 2c 20 6d 67 2c   md, me, mf, mg,
d840: 20 6d 68 2c 20 6d 69 2c 20 6d 6a 2c 20 6d 6b 2c   mh, mi, mj, mk,
d850: 20 6d 6c 2c 20 6d 6d 2c 20 6d 6e 0a 20 20 20 20   ml, mm, mn.    
d860: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
d870: 54 4f 20 74 31 28 61 61 29 20 56 41 4c 55 45 53  TO t1(aa) VALUES
d880: 28 20 61 5f 73 74 72 69 6e 67 28 31 30 30 30 30  ( a_string(10000
d890: 30 29 20 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  0) );.    INSERT
d8a0: 20 49 4e 54 4f 20 74 32 28 61 61 29 20 56 41 4c   INTO t2(aa) VAL
d8b0: 55 45 53 28 20 61 5f 73 74 72 69 6e 67 28 31 30  UES( a_string(10
d8c0: 30 30 30 30 29 20 29 3b 0a 20 20 20 20 56 41 43  0000) );.    VAC
d8d0: 55 55 4d 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 23  UUM;.  }.} {}..#
d8e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d8f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d900: 2d 2d 2d 2d 2d 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 0a 23 20 54 65 73 74  ---------.# Test
d930: 20 61 20 63 6f 75 70 6c 65 20 6f 66 20 73 70 65   a couple of spe
d940: 63 69 61 6c 20 63 61 73 65 73 20 74 68 61 74 20  cial cases that 
d950: 63 6f 6d 65 20 75 70 20 77 68 69 6c 65 20 63 6f  come up while co
d960: 6d 6d 69 74 74 69 6e 67 20 0a 23 20 74 72 61 6e  mmitting .# tran
d970: 73 61 63 74 69 6f 6e 73 3a 0a 23 0a 23 20 20 20  sactions:.#.#   
d980: 70 61 67 65 72 31 2d 32 30 2e 31 2e 2a 3a 20 43  pager1-20.1.*: C
d990: 6f 6d 6d 69 74 74 69 6e 67 20 61 6e 20 69 6e 2d  ommitting an in-
d9a0: 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20  memory database 
d9b0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 68 65 6e  transaction when
d9c0: 20 74 68 65 20 0a 23 20 20 20 20 20 20 20 20 20   the .#         
d9d0: 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73           databas
d9e0: 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 6d  e has not been m
d9f0: 6f 64 69 66 69 65 64 20 61 74 20 61 6c 6c 2e 0a  odified at all..
da00: 23 0a 23 20 20 20 70 61 67 65 72 31 2d 32 30 2e  #.#   pager1-20.
da10: 32 2e 2a 3a 20 41 73 20 61 62 6f 76 65 2c 20 62  2.*: As above, b
da20: 75 74 20 77 69 74 68 20 61 20 6e 6f 72 6d 61 6c  ut with a normal
da30: 20 64 62 20 69 6e 20 65 78 63 6c 75 73 69 76 65   db in exclusive
da40: 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2e 0a 23  -locking mode..#
da50: 0a 23 20 20 20 70 61 67 65 72 31 2d 32 30 2e 33  .#   pager1-20.3
da60: 2e 2a 3a 20 43 6f 6d 6d 69 74 74 69 6e 67 20 61  .*: Committing a
da70: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20   transaction in 
da80: 57 41 4c 20 6d 6f 64 65 20 77 68 65 72 65 20 74  WAL mode where t
da90: 68 65 20 64 61 74 61 62 61 73 65 20 68 61 73 0a  he database has.
daa0: 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  #               
dab0: 20 20 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64     been modified
dac0: 2c 20 62 75 74 20 61 6c 6c 20 64 69 72 74 79 20  , but all dirty 
dad0: 70 61 67 65 73 20 68 61 76 65 20 62 65 65 6e 20  pages have been 
dae0: 66 6c 75 73 68 65 64 20 74 6f 20 0a 23 20 20 20  flushed to .#   
daf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
db00: 69 73 6b 20 62 65 66 6f 72 65 20 74 68 65 20 63  isk before the c
db10: 6f 6d 6d 69 74 2e 0a 23 0a 64 6f 5f 74 65 73 74  ommit..#.do_test
db20: 20 70 61 67 65 72 31 2d 32 30 2e 31 2e 31 20 7b   pager1-20.1.1 {
db30: 0a 20 20 63 61 74 63 68 20 7b 64 62 20 63 6c 6f  .  catch {db clo
db40: 73 65 7d 0a 20 20 73 71 6c 69 74 65 33 20 64 62  se}.  sqlite3 db
db50: 20 3a 6d 65 6d 6f 72 79 3a 0a 20 20 65 78 65 63   :memory:.  exec
db60: 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45  sql {.    CREATE
db70: 20 54 41 42 4c 45 20 6f 6e 65 28 74 77 6f 2c 20   TABLE one(two, 
db80: 74 68 72 65 65 29 3b 0a 20 20 20 20 49 4e 53 45  three);.    INSE
db90: 52 54 20 49 4e 54 4f 20 6f 6e 65 20 56 41 4c 55  RT INTO one VALU
dba0: 45 53 28 27 61 27 2c 20 27 62 27 29 3b 0a 20 20  ES('a', 'b');.  
dbb0: 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 70  }.} {}.do_test p
dbc0: 61 67 65 72 31 2d 32 30 2e 31 2e 32 20 7b 0a 20  ager1-20.1.2 {. 
dbd0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42   execsql {.    B
dbe0: 45 47 49 4e 20 45 58 43 4c 55 53 49 56 45 3b 0a  EGIN EXCLUSIVE;.
dbf0: 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a      COMMIT;.  }.
dc00: 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74 20 70 61  } {}..do_test pa
dc10: 67 65 72 31 2d 32 30 2e 32 2e 31 20 7b 0a 20 20  ger1-20.2.1 {.  
dc20: 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f  faultsim_delete_
dc30: 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65  and_reopen.  exe
dc40: 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d  csql {.    PRAGM
dc50: 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 20 3d  A locking_mode =
dc60: 20 65 78 63 6c 75 73 69 76 65 3b 0a 20 20 20 20   exclusive;.    
dc70: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
dc80: 6f 64 65 20 3d 20 70 65 72 73 69 73 74 3b 0a 20  ode = persist;. 
dc90: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
dca0: 6f 6e 65 28 74 77 6f 2c 20 74 68 72 65 65 29 3b  one(two, three);
dcb0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
dcc0: 20 6f 6e 65 20 56 41 4c 55 45 53 28 27 61 27 2c   one VALUES('a',
dcd0: 20 27 62 27 29 3b 0a 20 20 7d 0a 7d 20 7b 65 78   'b');.  }.} {ex
dce0: 63 6c 75 73 69 76 65 20 70 65 72 73 69 73 74 7d  clusive persist}
dcf0: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
dd00: 32 30 2e 32 2e 32 20 7b 0a 20 20 65 78 65 63 73  20.2.2 {.  execs
dd10: 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 20 45  ql {.    BEGIN E
dd20: 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20 43 4f  XCLUSIVE;.    CO
dd30: 4d 4d 49 54 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a  MMIT;.  }.} {}..
dd40: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32  do_test pager1-2
dd50: 30 2e 33 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73  0.3.1 {.  faults
dd60: 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65  im_delete_and_re
dd70: 6f 70 65 6e 0a 20 20 64 62 20 66 75 6e 63 20 61  open.  db func a
dd80: 5f 73 74 72 69 6e 67 20 61 5f 73 74 72 69 6e 67  _string a_string
dd90: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
dda0: 20 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69   PRAGMA cache_si
ddb0: 7a 65 20 3d 20 31 30 3b 0a 20 20 20 20 50 52 41  ze = 10;.    PRA
ddc0: 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
ddd0: 20 3d 20 77 61 6c 3b 0a 20 20 20 20 42 45 47 49   = wal;.    BEGI
dde0: 4e 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45 20  N;.      CREATE 
ddf0: 54 41 42 4c 45 20 74 31 28 78 29 3b 0a 20 20 20  TABLE t1(x);.   
de00: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
de10: 74 32 28 79 29 3b 0a 20 20 20 20 20 20 49 4e 53  t2(y);.      INS
de20: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
de30: 45 53 28 61 5f 73 74 72 69 6e 67 28 38 30 30 29  ES(a_string(800)
de40: 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  );.      INSERT 
de50: 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61  INTO t1 SELECT a
de60: 5f 73 74 72 69 6e 67 28 38 30 30 29 20 46 52 4f  _string(800) FRO
de70: 4d 20 74 31 3b 20 20 20 20 20 20 20 20 20 2f 2a  M t1;         /*
de80: 20 20 20 32 20 2a 2f 0a 20 20 20 20 20 20 49 4e     2 */.      IN
de90: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
dea0: 45 43 54 20 61 5f 73 74 72 69 6e 67 28 38 30 30  ECT a_string(800
deb0: 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20  ) FROM t1;      
dec0: 20 20 20 2f 2a 20 20 20 34 20 2a 2f 0a 20 20 20     /*   4 */.   
ded0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
dee0: 31 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e  1 SELECT a_strin
def0: 67 28 38 30 30 29 20 46 52 4f 4d 20 74 31 3b 20  g(800) FROM t1; 
df00: 20 20 20 20 20 20 20 20 2f 2a 20 20 20 38 20 2a          /*   8 *
df10: 2f 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  /.      INSERT I
df20: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f  NTO t1 SELECT a_
df30: 73 74 72 69 6e 67 28 38 30 30 29 20 46 52 4f 4d  string(800) FROM
df40: 20 74 31 3b 20 20 20 20 20 20 20 20 20 2f 2a 20   t1;         /* 
df50: 20 31 36 20 2a 2f 0a 20 20 20 20 20 20 49 4e 53   16 */.      INS
df60: 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
df70: 43 54 20 61 5f 73 74 72 69 6e 67 28 38 30 30 29  CT a_string(800)
df80: 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 20   FROM t1;       
df90: 20 20 2f 2a 20 20 33 32 20 2a 2f 0a 20 20 20 20    /*  32 */.    
dfa0: 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 7d 20 7b 77  COMMIT;.  }.} {w
dfb0: 61 6c 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  al}.do_test page
dfc0: 72 31 2d 32 30 2e 33 2e 32 20 7b 0a 20 20 70 72  r1-20.3.2 {.  pr
dfd0: 6f 63 20 72 65 63 75 72 73 69 76 65 5f 73 65 6c  oc recursive_sel
dfe0: 65 63 74 20 7b 69 64 7d 20 7b 0a 20 20 20 20 64  ect {id} {.    d
dff0: 62 20 65 76 61 6c 20 7b 53 45 4c 45 43 54 20 72  b eval {SELECT r
e000: 6f 77 69 64 2c 20 78 20 46 52 4f 4d 20 74 31 20  owid, x FROM t1 
e010: 57 48 45 52 45 20 72 6f 77 69 64 20 3d 20 28 24  WHERE rowid = ($
e020: 69 64 2d 31 29 7d 20 7b 0a 20 20 20 20 20 20 72  id-1)} {.      r
e030: 65 63 75 72 73 69 76 65 5f 73 65 6c 65 63 74 20  ecursive_select 
e040: 24 72 6f 77 69 64 0a 20 20 20 20 7d 0a 20 20 7d  $rowid.    }.  }
e050: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
e060: 20 42 45 47 49 4e 3b 0a 20 20 20 20 49 4e 53 45   BEGIN;.    INSE
e070: 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45  RT INTO t2 VALUE
e080: 53 28 27 78 78 78 78 27 29 3b 0a 20 20 7d 0a 20  S('xxxx');.  }. 
e090: 20 72 65 63 75 72 73 69 76 65 5f 73 65 6c 65 63   recursive_selec
e0a0: 74 20 33 32 0a 20 20 65 78 65 63 73 71 6c 20 43  t 32.  execsql C
e0b0: 4f 4d 4d 49 54 0a 7d 20 7b 7d 0a 0a 23 2d 2d 2d  OMMIT.} {}..#---
e0c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e0d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e0e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e0f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e100: 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68  ------.# Test th
e110: 61 74 20 61 20 57 41 4c 20 64 61 74 61 62 61 73  at a WAL databas
e120: 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f 70 65  e may not be ope
e130: 6e 65 64 20 69 66 3a 0a 23 0a 23 20 20 20 70 61  ned if:.#.#   pa
e140: 67 65 72 31 2d 32 31 2e 31 2e 2a 3a 20 54 68 65  ger1-21.1.*: The
e150: 20 56 46 53 20 68 61 73 20 61 6e 20 69 56 65 72   VFS has an iVer
e160: 73 69 6f 6e 20 6c 65 73 73 20 74 68 61 6e 20 32  sion less than 2
e170: 2c 20 6f 72 0a 23 20 20 20 70 61 67 65 72 31 2d  , or.#   pager1-
e180: 32 31 2e 32 2e 2a 3a 20 54 68 65 20 56 46 53 20  21.2.*: The VFS 
e190: 64 6f 65 73 20 6e 6f 74 20 70 72 6f 76 69 64 65  does not provide
e1a0: 20 78 53 68 6d 58 58 58 28 29 20 6d 65 74 68 6f   xShmXXX() metho
e1b0: 64 73 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 70 61  ds..#.do_test pa
e1c0: 67 65 72 31 2d 32 31 2e 30 20 7b 0a 20 20 66 61  ger1-21.0 {.  fa
e1d0: 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e  ultsim_delete_an
e1e0: 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65 63 73  d_reopen.  execs
e1f0: 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20  ql {.    PRAGMA 
e200: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 57  journal_mode = W
e210: 41 4c 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  AL;.    CREATE T
e220: 41 42 4c 45 20 6b 6f 28 63 20 44 45 46 41 55 4c  ABLE ko(c DEFAUL
e230: 54 20 27 61 62 63 27 2c 20 62 20 44 45 46 41 55  T 'abc', b DEFAU
e240: 4c 54 20 27 64 65 66 27 29 3b 0a 20 20 20 20 49  LT 'def');.    I
e250: 4e 53 45 52 54 20 49 4e 54 4f 20 6b 6f 20 44 45  NSERT INTO ko DE
e260: 46 41 55 4c 54 20 56 41 4c 55 45 53 3b 0a 20 20  FAULT VALUES;.  
e270: 7d 0a 7d 20 7b 77 61 6c 7d 0a 64 6f 5f 74 65 73  }.} {wal}.do_tes
e280: 74 20 70 61 67 65 72 31 2d 32 31 2e 31 20 7b 0a  t pager1-21.1 {.
e290: 20 20 74 65 73 74 76 66 73 20 74 76 20 2d 6e 6f    testvfs tv -no
e2a0: 73 68 6d 20 31 0a 20 20 73 71 6c 69 74 65 33 20  shm 1.  sqlite3 
e2b0: 64 62 32 20 74 65 73 74 2e 64 62 20 2d 76 66 73  db2 test.db -vfs
e2c0: 20 74 76 0a 20 20 63 61 74 63 68 73 71 6c 20 7b   tv.  catchsql {
e2d0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6b   SELECT * FROM k
e2e0: 6f 20 7d 20 64 62 32 0a 7d 20 7b 31 20 7b 75 6e  o } db2.} {1 {un
e2f0: 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 64 61 74  able to open dat
e300: 61 62 61 73 65 20 66 69 6c 65 7d 7d 0a 64 62 32  abase file}}.db2
e310: 20 63 6c 6f 73 65 0a 74 76 20 64 65 6c 65 74 65   close.tv delete
e320: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
e330: 32 31 2e 32 20 7b 0a 20 20 74 65 73 74 76 66 73  21.2 {.  testvfs
e340: 20 74 76 20 2d 69 76 65 72 73 69 6f 6e 20 31 0a   tv -iversion 1.
e350: 20 20 73 71 6c 69 74 65 33 20 64 62 32 20 74 65    sqlite3 db2 te
e360: 73 74 2e 64 62 20 2d 76 66 73 20 74 76 0a 20 20  st.db -vfs tv.  
e370: 63 61 74 63 68 73 71 6c 20 7b 20 53 45 4c 45 43  catchsql { SELEC
e380: 54 20 2a 20 46 52 4f 4d 20 6b 6f 20 7d 20 64 62  T * FROM ko } db
e390: 32 0a 7d 20 7b 31 20 7b 75 6e 61 62 6c 65 20 74  2.} {1 {unable t
e3a0: 6f 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20  o open database 
e3b0: 66 69 6c 65 7d 7d 0a 64 62 32 20 63 6c 6f 73 65  file}}.db2 close
e3c0: 0a 74 76 20 64 65 6c 65 74 65 0a 0a 23 2d 2d 2d  .tv delete..#---
e3d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e3e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e3f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e410: 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68  ------.# Test th
e420: 61 74 20 61 20 22 50 52 41 47 4d 41 20 77 61 6c  at a "PRAGMA wal
e430: 5f 63 68 65 63 6b 70 6f 69 6e 74 22 3a 0a 23 0a  _checkpoint":.#.
e440: 23 20 20 20 70 61 67 65 72 31 2d 32 32 2e 31 2e  #   pager1-22.1.
e450: 2a 3a 20 69 73 20 61 20 6e 6f 2d 6f 70 20 6f 6e  *: is a no-op on
e460: 20 61 20 6e 6f 6e 2d 57 41 4c 20 64 62 2c 20 61   a non-WAL db, a
e470: 6e 64 0a 23 20 20 20 70 61 67 65 72 31 2d 32 32  nd.#   pager1-22
e480: 2e 32 2e 2a 3a 20 64 6f 65 73 20 6e 6f 74 20 63  .2.*: does not c
e490: 61 75 73 65 20 78 53 79 6e 63 20 63 61 6c 6c 73  ause xSync calls
e4a0: 20 77 69 74 68 20 61 20 73 79 6e 63 68 72 6f 6e   with a synchron
e4b0: 6f 75 73 3d 6f 66 66 20 64 62 2e 0a 23 0a 64 6f  ous=off db..#.do
e4c0: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 32 2e  _test pager1-22.
e4d0: 31 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d  1.1 {.  faultsim
e4e0: 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70  _delete_and_reop
e4f0: 65 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  en.  execsql {. 
e500: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
e510: 6b 6f 28 63 20 44 45 46 41 55 4c 54 20 27 61 62  ko(c DEFAULT 'ab
e520: 63 27 2c 20 62 20 44 45 46 41 55 4c 54 20 27 64  c', b DEFAULT 'd
e530: 65 66 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  ef');.    INSERT
e540: 20 49 4e 54 4f 20 6b 6f 20 44 45 46 41 55 4c 54   INTO ko DEFAULT
e550: 20 56 41 4c 55 45 53 3b 0a 20 20 7d 0a 20 20 65   VALUES;.  }.  e
e560: 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20  xecsql { PRAGMA 
e570: 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20 7d  wal_checkpoint }
e580: 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 70 61  .} {}.do_test pa
e590: 67 65 72 31 2d 32 32 2e 32 2e 31 20 7b 0a 20 20  ger1-22.2.1 {.  
e5a0: 74 65 73 74 76 66 73 20 74 76 20 2d 64 65 66 61  testvfs tv -defa
e5b0: 75 6c 74 20 31 0a 20 20 74 76 20 66 69 6c 74 65  ult 1.  tv filte
e5c0: 72 20 78 53 79 6e 63 0a 20 20 74 76 20 73 63 72  r xSync.  tv scr
e5d0: 69 70 74 20 78 53 79 6e 63 43 62 0a 20 20 70 72  ipt xSyncCb.  pr
e5e0: 6f 63 20 78 53 79 6e 63 43 62 20 7b 61 72 67 73  oc xSyncCb {args
e5f0: 7d 20 7b 69 6e 63 72 20 3a 3a 73 79 6e 63 63 6f  } {incr ::syncco
e600: 75 6e 74 7d 0a 20 20 73 65 74 20 3a 3a 73 79 6e  unt}.  set ::syn
e610: 63 63 6f 75 6e 74 20 30 0a 20 20 73 71 6c 69 74  ccount 0.  sqlit
e620: 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20  e3 db test.db.  
e630: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52  execsql {.    PR
e640: 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73  AGMA synchronous
e650: 20 3d 20 6f 66 66 3b 0a 20 20 20 20 50 52 41 47   = off;.    PRAG
e660: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  MA journal_mode 
e670: 3d 20 57 41 4c 3b 0a 20 20 20 20 49 4e 53 45 52  = WAL;.    INSER
e680: 54 20 49 4e 54 4f 20 6b 6f 20 44 45 46 41 55 4c  T INTO ko DEFAUL
e690: 54 20 56 41 4c 55 45 53 3b 0a 20 20 7d 0a 20 20  T VALUES;.  }.  
e6a0: 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41  execsql { PRAGMA
e6b0: 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20   wal_checkpoint 
e6c0: 7d 0a 20 20 73 65 74 20 73 79 6e 63 63 6f 75 6e  }.  set synccoun
e6d0: 74 0a 7d 20 7b 30 7d 0a 64 62 20 63 6c 6f 73 65  t.} {0}.db close
e6e0: 0a 74 76 20 64 65 6c 65 74 65 0a 0a 23 2d 2d 2d  .tv delete..#---
e6f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e730: 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 73 20 66  ------.# Tests f
e740: 6f 72 20 63 68 61 6e 67 69 6e 67 20 6a 6f 75 72  or changing jour
e750: 6e 61 6c 20 6d 6f 64 65 2e 0a 23 0a 23 20 20 20  nal mode..#.#   
e760: 70 61 67 65 72 31 2d 32 33 2e 31 2e 2a 3a 20 54  pager1-23.1.*: T
e770: 65 73 74 20 74 68 61 74 20 77 68 65 6e 20 63 68  est that when ch
e780: 61 6e 67 69 6e 67 20 66 72 6f 6d 20 50 45 52 53  anging from PERS
e790: 49 53 54 20 74 6f 20 44 45 4c 45 54 45 20 6d 6f  IST to DELETE mo
e7a0: 64 65 2c 0a 23 20 20 20 20 20 20 20 20 20 20 20  de,.#           
e7b0: 20 20 20 20 20 20 20 74 68 65 20 6a 6f 75 72 6e         the journ
e7c0: 61 6c 20 66 69 6c 65 20 69 73 20 64 65 6c 65 74  al file is delet
e7d0: 65 64 2e 0a 23 0a 23 20 20 20 70 61 67 65 72 31  ed..#.#   pager1
e7e0: 2d 32 33 2e 32 2e 2a 3a 20 53 61 6d 65 20 74 65  -23.2.*: Same te
e7f0: 73 74 20 61 73 20 61 62 6f 76 65 2c 20 62 75 74  st as above, but
e800: 20 77 68 69 6c 65 20 61 20 73 68 61 72 65 64 20   while a shared 
e810: 6c 6f 63 6b 20 69 73 20 68 65 6c 64 0a 23 20 20  lock is held.#  
e820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e830: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
e840: 66 69 6c 65 2e 0a 23 0a 23 20 20 20 70 61 67 65  file..#.#   page
e850: 72 31 2d 32 33 2e 33 2e 2a 3a 20 53 61 6d 65 20  r1-23.3.*: Same 
e860: 74 65 73 74 20 61 73 20 61 62 6f 76 65 2c 20 62  test as above, b
e870: 75 74 20 77 68 69 6c 65 20 61 20 72 65 73 65 72  ut while a reser
e880: 76 65 64 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  ved lock is held
e890: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
e8a0: 20 20 20 20 6f 6e 20 74 68 65 20 64 61 74 61 62      on the datab
e8b0: 61 73 65 20 66 69 6c 65 2e 0a 23 0a 23 20 20 20  ase file..#.#   
e8c0: 70 61 67 65 72 31 2d 32 33 2e 34 2e 2a 3a 20 41  pager1-23.4.*: A
e8d0: 6e 64 2c 20 66 6f 72 20 66 75 6e 2c 20 77 68 69  nd, for fun, whi
e8e0: 6c 65 20 68 6f 6c 64 69 6e 67 20 61 6e 20 65 78  le holding an ex
e8f0: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 0a 23 0a  clusive lock..#.
e900: 23 20 20 20 70 61 67 65 72 31 2d 32 33 2e 35 2e  #   pager1-23.5.
e910: 2a 3a 20 54 72 79 20 74 6f 20 73 65 74 20 76 61  *: Try to set va
e920: 72 69 6f 75 73 20 64 69 66 66 65 72 65 6e 74 20  rious different 
e930: 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 73 20 77 69  journal modes wi
e940: 74 68 20 61 6e 0a 23 20 20 20 20 20 20 20 20 20  th an.#         
e950: 20 20 20 20 20 20 20 20 20 69 6e 2d 6d 65 6d 6f           in-memo
e960: 72 79 20 64 61 74 61 62 61 73 65 20 28 6f 6e 6c  ry database (onl
e970: 79 20 4d 45 4d 4f 52 59 20 61 6e 64 20 4f 46 46  y MEMORY and OFF
e980: 20 73 68 6f 75 6c 64 20 77 6f 72 6b 29 2e 0a 23   should work)..#
e990: 0a 23 20 20 20 70 61 67 65 72 31 2d 32 33 2e 36  .#   pager1-23.6
e9a0: 2e 2a 3a 20 54 72 79 20 74 6f 20 73 65 74 20 6c  .*: Try to set l
e9b0: 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d  ocking_mode=norm
e9c0: 61 6c 20 6f 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f  al on an in-memo
e9d0: 72 79 20 64 61 74 61 62 61 73 65 0a 23 20 20 20  ry database.#   
e9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
e9f0: 64 6f 65 73 6e 27 74 20 77 6f 72 6b 20 2d 20 69  doesn't work - i
ea00: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
ea10: 65 73 20 61 6c 77 61 79 73 20 75 73 65 0a 23 20  es always use.# 
ea20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ea30: 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78   locking_mode=ex
ea40: 63 6c 75 73 69 76 65 29 2e 0a 23 0a 64 6f 5f 74  clusive)..#.do_t
ea50: 65 73 74 20 70 61 67 65 72 31 2d 32 33 2e 31 2e  est pager1-23.1.
ea60: 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64  1 {.  faultsim_d
ea70: 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e  elete_and_reopen
ea80: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
ea90: 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f   PRAGMA journal_
eaa0: 6d 6f 64 65 20 3d 20 50 45 52 53 49 53 54 3b 0a  mode = PERSIST;.
eab0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
eac0: 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 7d 0a 20   t1(a, b);.  }. 
ead0: 20 66 69 6c 65 20 65 78 69 73 74 73 20 74 65 73   file exists tes
eae0: 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 7d 20 7b  t.db-journal.} {
eaf0: 31 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  1}.do_test pager
eb00: 31 2d 32 33 2e 31 2e 32 20 7b 0a 20 20 65 78 65  1-23.1.2 {.  exe
eb10: 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 6a 6f  csql { PRAGMA jo
eb20: 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c  urnal_mode = DEL
eb30: 45 54 45 20 7d 0a 20 20 66 69 6c 65 20 65 78 69  ETE }.  file exi
eb40: 73 74 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72  sts test.db-jour
eb50: 6e 61 6c 0a 7d 20 7b 30 7d 0a 0a 64 6f 5f 74 65  nal.} {0}..do_te
eb60: 73 74 20 70 61 67 65 72 31 2d 32 33 2e 32 2e 31  st pager1-23.2.1
eb70: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
eb80: 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61     PRAGMA journa
eb90: 6c 5f 6d 6f 64 65 20 3d 20 50 45 52 53 49 53 54  l_mode = PERSIST
eba0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
ebb0: 4f 20 74 31 20 56 41 4c 55 45 53 28 27 43 61 6e  O t1 VALUES('Can
ebc0: 62 65 72 72 61 27 2c 20 27 41 43 54 27 29 3b 0a  berra', 'ACT');.
ebd0: 20 20 7d 0a 20 20 64 62 20 65 76 61 6c 20 7b 20    }.  db eval { 
ebe0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
ebf0: 20 7d 20 7b 0a 20 20 20 20 64 62 20 65 76 61 6c   } {.    db eval
ec00: 20 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61   { PRAGMA journa
ec10: 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c 45 54 45 20  l_mode = DELETE 
ec20: 7d 0a 20 20 7d 0a 20 20 65 78 65 63 73 71 6c 20  }.  }.  execsql 
ec30: 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c  { PRAGMA journal
ec40: 5f 6d 6f 64 65 20 7d 0a 7d 20 7b 64 65 6c 65 74  _mode }.} {delet
ec50: 65 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  e}.do_test pager
ec60: 31 2d 32 33 2e 32 2e 32 20 7b 0a 20 20 66 69 6c  1-23.2.2 {.  fil
ec70: 65 20 65 78 69 73 74 73 20 74 65 73 74 2e 64 62  e exists test.db
ec80: 2d 6a 6f 75 72 6e 61 6c 0a 7d 20 7b 30 7d 0a 0a  -journal.} {0}..
ec90: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32  do_test pager1-2
eca0: 33 2e 33 2e 31 20 7b 0a 20 20 65 78 65 63 73 71  3.3.1 {.  execsq
ecb0: 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a  l {.    PRAGMA j
ecc0: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 50 45  ournal_mode = PE
ecd0: 52 53 49 53 54 3b 0a 20 20 20 20 49 4e 53 45 52  RSIST;.    INSER
ece0: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
ecf0: 28 27 44 61 72 77 69 6e 27 2c 20 27 4e 54 27 29  ('Darwin', 'NT')
ed00: 3b 0a 20 20 20 20 42 45 47 49 4e 20 49 4d 4d 45  ;.    BEGIN IMME
ed10: 44 49 41 54 45 3b 0a 20 20 7d 0a 20 20 64 62 20  DIATE;.  }.  db 
ed20: 65 76 61 6c 20 7b 20 50 52 41 47 4d 41 20 6a 6f  eval { PRAGMA jo
ed30: 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c  urnal_mode = DEL
ed40: 45 54 45 20 7d 0a 20 20 65 78 65 63 73 71 6c 20  ETE }.  execsql 
ed50: 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c  { PRAGMA journal
ed60: 5f 6d 6f 64 65 20 7d 0a 7d 20 7b 64 65 6c 65 74  _mode }.} {delet
ed70: 65 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  e}.do_test pager
ed80: 31 2d 32 33 2e 33 2e 32 20 7b 0a 20 20 66 69 6c  1-23.3.2 {.  fil
ed90: 65 20 65 78 69 73 74 73 20 74 65 73 74 2e 64 62  e exists test.db
eda0: 2d 6a 6f 75 72 6e 61 6c 0a 7d 20 7b 30 7d 0a 64  -journal.} {0}.d
edb0: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 33  o_test pager1-23
edc0: 2e 33 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c  .3.3 {.  execsql
edd0: 20 43 4f 4d 4d 49 54 0a 7d 20 7b 7d 0a 0a 64 6f   COMMIT.} {}..do
ede0: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 33 2e  _test pager1-23.
edf0: 34 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  4.1 {.  execsql 
ee00: 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75  {.    PRAGMA jou
ee10: 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 50 45 52 53  rnal_mode = PERS
ee20: 49 53 54 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  IST;.    INSERT 
ee30: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27  INTO t1 VALUES('
ee40: 41 64 65 6c 61 69 64 65 27 2c 20 27 53 41 27 29  Adelaide', 'SA')
ee50: 3b 0a 20 20 20 20 42 45 47 49 4e 20 45 58 43 4c  ;.    BEGIN EXCL
ee60: 55 53 49 56 45 3b 0a 20 20 7d 0a 20 20 64 62 20  USIVE;.  }.  db 
ee70: 65 76 61 6c 20 7b 20 50 52 41 47 4d 41 20 6a 6f  eval { PRAGMA jo
ee80: 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c  urnal_mode = DEL
ee90: 45 54 45 20 7d 0a 20 20 65 78 65 63 73 71 6c 20  ETE }.  execsql 
eea0: 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c  { PRAGMA journal
eeb0: 5f 6d 6f 64 65 20 7d 0a 7d 20 7b 64 65 6c 65 74  _mode }.} {delet
eec0: 65 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  e}.do_test pager
eed0: 31 2d 32 33 2e 34 2e 32 20 7b 0a 20 20 66 69 6c  1-23.4.2 {.  fil
eee0: 65 20 65 78 69 73 74 73 20 74 65 73 74 2e 64 62  e exists test.db
eef0: 2d 6a 6f 75 72 6e 61 6c 0a 7d 20 7b 30 7d 0a 64  -journal.} {0}.d
ef00: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 33  o_test pager1-23
ef10: 2e 34 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c  .4.3 {.  execsql
ef20: 20 43 4f 4d 4d 49 54 0a 7d 20 7b 7d 0a 0a 64 6f   COMMIT.} {}..do
ef30: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 33 2e  _test pager1-23.
ef40: 35 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d  5.1 {.  faultsim
ef50: 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70  _delete_and_reop
ef60: 65 6e 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20  en.  sqlite3 db 
ef70: 3a 6d 65 6d 6f 72 79 3a 0a 7d 20 7b 7d 0a 66 6f  :memory:.} {}.fo
ef80: 72 65 61 63 68 20 7b 74 6e 20 6d 6f 64 65 20 70  reach {tn mode p
ef90: 6f 73 73 69 62 6c 65 7d 20 7b 0a 20 20 32 20 20  ossible} {.  2  
efa0: 6f 66 66 20 20 20 20 20 20 31 0a 20 20 33 20 20  off      1.  3  
efb0: 6d 65 6d 6f 72 79 20 20 20 31 0a 20 20 34 20 20  memory   1.  4  
efc0: 70 65 72 73 69 73 74 20 20 30 0a 20 20 35 20 20  persist  0.  5  
efd0: 64 65 6c 65 74 65 20 20 20 30 0a 20 20 36 20 20  delete   0.  6  
efe0: 77 61 6c 20 20 20 20 20 20 30 0a 20 20 37 20 20  wal      0.  7  
eff0: 74 72 75 6e 63 61 74 65 20 30 0a 7d 20 7b 0a 20  truncate 0.} {. 
f000: 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
f010: 32 33 2e 35 2e 24 74 6e 2e 31 20 7b 0a 20 20 20  23.5.$tn.1 {.   
f020: 20 65 78 65 63 73 71 6c 20 22 50 52 41 47 4d 41   execsql "PRAGMA
f030: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20   journal_mode = 
f040: 6f 66 66 22 0a 20 20 20 20 65 78 65 63 73 71 6c  off".    execsql
f050: 20 22 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c   "PRAGMA journal
f060: 5f 6d 6f 64 65 20 3d 20 24 6d 6f 64 65 22 0a 20  _mode = $mode". 
f070: 20 7d 20 5b 69 66 20 24 70 6f 73 73 69 62 6c 65   } [if $possible
f080: 20 7b 6c 69 73 74 20 24 6d 6f 64 65 7d 20 7b 6c   {list $mode} {l
f090: 69 73 74 20 6f 66 66 7d 5d 0a 20 20 64 6f 5f 74  ist off}].  do_t
f0a0: 65 73 74 20 70 61 67 65 72 31 2d 32 33 2e 35 2e  est pager1-23.5.
f0b0: 24 74 6e 2e 32 20 7b 0a 20 20 20 20 65 78 65 63  $tn.2 {.    exec
f0c0: 73 71 6c 20 22 50 52 41 47 4d 41 20 6a 6f 75 72  sql "PRAGMA jour
f0d0: 6e 61 6c 5f 6d 6f 64 65 20 3d 20 6d 65 6d 6f 72  nal_mode = memor
f0e0: 79 22 0a 20 20 20 20 65 78 65 63 73 71 6c 20 22  y".    execsql "
f0f0: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
f100: 6f 64 65 20 3d 20 24 6d 6f 64 65 22 0a 20 20 7d  ode = $mode".  }
f110: 20 5b 69 66 20 24 70 6f 73 73 69 62 6c 65 20 7b   [if $possible {
f120: 6c 69 73 74 20 24 6d 6f 64 65 7d 20 7b 6c 69 73  list $mode} {lis
f130: 74 20 6d 65 6d 6f 72 79 7d 5d 0a 7d 0a 64 6f 5f  t memory}].}.do_
f140: 74 65 73 74 20 70 61 67 65 72 31 2d 32 33 2e 36  test pager1-23.6
f150: 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .1 {.  execsql {
f160: 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d  PRAGMA locking_m
f170: 6f 64 65 20 3d 20 6e 6f 72 6d 61 6c 7d 0a 7d 20  ode = normal}.} 
f180: 7b 65 78 63 6c 75 73 69 76 65 7d 0a 64 6f 5f 74  {exclusive}.do_t
f190: 65 73 74 20 70 61 67 65 72 31 2d 32 33 2e 36 2e  est pager1-23.6.
f1a0: 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 50  2 {.  execsql {P
f1b0: 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  RAGMA locking_mo
f1c0: 64 65 20 3d 20 65 78 63 6c 75 73 69 76 65 7d 0a  de = exclusive}.
f1d0: 7d 20 7b 65 78 63 6c 75 73 69 76 65 7d 0a 64 6f  } {exclusive}.do
f1e0: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 33 2e  _test pager1-23.
f1f0: 36 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  6.3 {.  execsql 
f200: 7b 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f  {PRAGMA locking_
f210: 6d 6f 64 65 7d 0a 7d 20 7b 65 78 63 6c 75 73 69  mode}.} {exclusi
f220: 76 65 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  ve}.do_test page
f230: 72 31 2d 32 33 2e 36 2e 34 20 7b 0a 20 20 65 78  r1-23.6.4 {.  ex
f240: 65 63 73 71 6c 20 7b 50 52 41 47 4d 41 20 6d 61  ecsql {PRAGMA ma
f250: 69 6e 2e 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 7d  in.locking_mode}
f260: 0a 7d 20 7b 65 78 63 6c 75 73 69 76 65 7d 0a 0a  .} {exclusive}..
f270: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
f280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f2a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f2b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 0a 64 6f 5f  ----------.#.do_
f2c0: 74 65 73 74 20 70 61 67 65 72 31 2d 32 34 2e 31  test pager1-24.1
f2d0: 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f  .1 {.  faultsim_
f2e0: 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65  delete_and_reope
f2f0: 6e 0a 20 20 64 62 20 66 75 6e 63 20 61 5f 73 74  n.  db func a_st
f300: 72 69 6e 67 20 61 5f 73 74 72 69 6e 67 0a 20 20  ring a_string.  
f310: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52  execsql {.    PR
f320: 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 20  AGMA cache_size 
f330: 3d 20 31 30 3b 0a 20 20 20 20 50 52 41 47 4d 41  = 10;.    PRAGMA
f340: 20 61 75 74 6f 5f 76 61 63 75 75 6d 20 3d 20 46   auto_vacuum = F
f350: 55 4c 4c 3b 0a 20 20 20 20 43 52 45 41 54 45 20  ULL;.    CREATE 
f360: 54 41 42 4c 45 20 78 31 28 78 2c 20 79 2c 20 7a  TABLE x1(x, y, z
f370: 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 28 79 2c  , PRIMARY KEY(y,
f380: 20 7a 29 29 3b 0a 20 20 20 20 43 52 45 41 54 45   z));.    CREATE
f390: 20 54 41 42 4c 45 20 78 32 28 78 2c 20 79 2c 20   TABLE x2(x, y, 
f3a0: 7a 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 28 79  z, PRIMARY KEY(y
f3b0: 2c 20 7a 29 29 3b 0a 20 20 20 20 49 4e 53 45 52  , z));.    INSER
f3c0: 54 20 49 4e 54 4f 20 78 32 20 56 41 4c 55 45 53  T INTO x2 VALUES
f3d0: 28 61 5f 73 74 72 69 6e 67 28 34 30 30 29 2c 20  (a_string(400), 
f3e0: 61 5f 73 74 72 69 6e 67 28 35 30 30 29 2c 20 61  a_string(500), a
f3f0: 5f 73 74 72 69 6e 67 28 36 30 30 29 29 3b 0a 20  _string(600));. 
f400: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78     INSERT INTO x
f410: 32 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e  2 SELECT a_strin
f420: 67 28 36 30 30 29 2c 20 61 5f 73 74 72 69 6e 67  g(600), a_string
f430: 28 34 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28  (400), a_string(
f440: 35 30 30 29 20 46 52 4f 4d 20 78 32 3b 0a 20 20  500) FROM x2;.  
f450: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 32    INSERT INTO x2
f460: 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67   SELECT a_string
f470: 28 35 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28  (500), a_string(
f480: 36 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 34  600), a_string(4
f490: 30 30 29 20 46 52 4f 4d 20 78 32 3b 0a 20 20 20  00) FROM x2;.   
f4a0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 32 20   INSERT INTO x2 
f4b0: 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28  SELECT a_string(
f4c0: 34 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 35  400), a_string(5
f4d0: 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 36 30  00), a_string(60
f4e0: 30 29 20 46 52 4f 4d 20 78 32 3b 0a 20 20 20 20  0) FROM x2;.    
f4f0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 32 20 53  INSERT INTO x2 S
f500: 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 36  ELECT a_string(6
f510: 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 34 30  00), a_string(40
f520: 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 35 30 30  0), a_string(500
f530: 29 20 46 52 4f 4d 20 78 32 3b 0a 20 20 20 20 49  ) FROM x2;.    I
f540: 4e 53 45 52 54 20 49 4e 54 4f 20 78 32 20 53 45  NSERT INTO x2 SE
f550: 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 35 30  LECT a_string(50
f560: 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 36 30 30  0), a_string(600
f570: 29 2c 20 61 5f 73 74 72 69 6e 67 28 34 30 30 29  ), a_string(400)
f580: 20 46 52 4f 4d 20 78 32 3b 0a 20 20 20 20 49 4e   FROM x2;.    IN
f590: 53 45 52 54 20 49 4e 54 4f 20 78 32 20 53 45 4c  SERT INTO x2 SEL
f5a0: 45 43 54 20 61 5f 73 74 72 69 6e 67 28 34 30 30  ECT a_string(400
f5b0: 29 2c 20 61 5f 73 74 72 69 6e 67 28 35 30 30 29  ), a_string(500)
f5c0: 2c 20 61 5f 73 74 72 69 6e 67 28 36 30 30 29 20  , a_string(600) 
f5d0: 46 52 4f 4d 20 78 32 3b 0a 20 20 20 20 49 4e 53  FROM x2;.    INS
f5e0: 45 52 54 20 49 4e 54 4f 20 78 31 20 53 45 4c 45  ERT INTO x1 SELE
f5f0: 43 54 20 2a 20 46 52 4f 4d 20 78 32 3b 0a 20 20  CT * FROM x2;.  
f600: 7d 0a 7d 20 7b 7d 0a 70 72 6f 63 20 72 65 63 75  }.} {}.proc recu
f610: 72 73 69 76 65 5f 73 65 6c 65 63 74 20 7b 69 64  rsive_select {id
f620: 20 7b 73 63 72 69 70 74 20 7b 7d 7d 7d 20 7b 0a   {script {}}} {.
f630: 20 20 73 65 74 20 63 6e 74 20 30 0a 20 20 64 62    set cnt 0.  db
f640: 20 65 76 61 6c 20 7b 53 45 4c 45 43 54 20 72 6f   eval {SELECT ro
f650: 77 69 64 2c 20 78 2c 79 2c 7a 20 46 52 4f 4d 20  wid, x,y,z FROM 
f660: 78 32 20 57 48 45 52 45 20 72 6f 77 69 64 20 3d  x2 WHERE rowid =
f670: 20 28 24 69 64 2d 31 29 7d 20 7b 0a 20 20 20 20   ($id-1)} {.    
f680: 72 65 63 75 72 73 69 76 65 5f 73 65 6c 65 63 74  recursive_select
f690: 20 24 72 6f 77 69 64 20 24 73 63 72 69 70 74 0a   $rowid $script.
f6a0: 20 20 20 20 69 6e 63 72 20 63 6e 74 0a 20 20 7d      incr cnt.  }
f6b0: 0a 20 20 69 66 20 7b 24 63 6e 74 3d 3d 30 7d 20  .  if {$cnt==0} 
f6c0: 7b 20 65 76 61 6c 20 24 73 63 72 69 70 74 20 7d  { eval $script }
f6d0: 0a 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  .}.do_test pager
f6e0: 31 2d 32 34 2e 31 2e 32 20 7b 0a 20 20 65 78 65  1-24.1.2 {.  exe
f6f0: 63 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e  csql {.    BEGIN
f700: 3b 0a 20 20 20 20 20 20 44 45 4c 45 54 45 20 46  ;.      DELETE F
f710: 52 4f 4d 20 78 31 20 57 48 45 52 45 20 72 6f 77  ROM x1 WHERE row
f720: 69 64 3c 33 32 3b 0a 20 20 7d 0a 20 20 72 65 63  id<32;.  }.  rec
f730: 75 72 73 69 76 65 5f 73 65 6c 65 63 74 20 36 34  ursive_select 64
f740: 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 70 61  .} {}.do_test pa
f750: 67 65 72 31 2d 32 34 2e 31 2e 33 20 7b 0a 20 20  ger1-24.1.3 {.  
f760: 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 20  execsql { .     
f770: 20 55 50 44 41 54 45 20 78 31 20 53 45 54 20 7a   UPDATE x1 SET z
f780: 20 3d 20 61 5f 73 74 72 69 6e 67 28 33 30 30 29   = a_string(300)
f790: 20 57 48 45 52 45 20 72 6f 77 69 64 3e 34 30 3b   WHERE rowid>40;
f7a0: 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 20  .    COMMIT;.   
f7b0: 20 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74   PRAGMA integrit
f7c0: 79 5f 63 68 65 63 6b 3b 0a 20 20 20 20 53 45 4c  y_check;.    SEL
f7d0: 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
f7e0: 4d 20 78 31 3b 0a 20 20 7d 0a 7d 20 7b 6f 6b 20  M x1;.  }.} {ok 
f7f0: 33 33 7d 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67  33}..do_test pag
f800: 65 72 31 2d 32 34 2e 31 2e 34 20 7b 0a 20 20 65  er1-24.1.4 {.  e
f810: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 44 45 4c  xecsql {.    DEL
f820: 45 54 45 20 46 52 4f 4d 20 78 31 3b 0a 20 20 20  ETE FROM x1;.   
f830: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 31 20   INSERT INTO x1 
f840: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 78 32  SELECT * FROM x2
f850: 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20  ;.    BEGIN;.   
f860: 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 78     DELETE FROM x
f870: 31 20 57 48 45 52 45 20 72 6f 77 69 64 3c 33 32  1 WHERE rowid<32
f880: 3b 0a 20 20 20 20 20 20 55 50 44 41 54 45 20 78  ;.      UPDATE x
f890: 31 20 53 45 54 20 7a 20 3d 20 61 5f 73 74 72 69  1 SET z = a_stri
f8a0: 6e 67 28 32 39 39 29 20 57 48 45 52 45 20 72 6f  ng(299) WHERE ro
f8b0: 77 69 64 3e 34 30 3b 0a 20 20 7d 0a 20 20 72 65  wid>40;.  }.  re
f8c0: 63 75 72 73 69 76 65 5f 73 65 6c 65 63 74 20 36  cursive_select 6
f8d0: 34 20 7b 64 62 20 65 76 61 6c 20 43 4f 4d 4d 49  4 {db eval COMMI
f8e0: 54 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  T}.  execsql {. 
f8f0: 20 20 20 50 52 41 47 4d 41 20 69 6e 74 65 67 72     PRAGMA integr
f900: 69 74 79 5f 63 68 65 63 6b 3b 0a 20 20 20 20 53  ity_check;.    S
f910: 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
f920: 52 4f 4d 20 78 31 3b 0a 20 20 7d 0a 7d 20 7b 6f  ROM x1;.  }.} {o
f930: 6b 20 33 33 7d 0a 0a 64 6f 5f 74 65 73 74 20 70  k 33}..do_test p
f940: 61 67 65 72 31 2d 32 34 2e 31 2e 35 20 7b 0a 20  ager1-24.1.5 {. 
f950: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 44   execsql {.    D
f960: 45 4c 45 54 45 20 46 52 4f 4d 20 78 31 3b 0a 20  ELETE FROM x1;. 
f970: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78     INSERT INTO x
f980: 31 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  1 SELECT * FROM 
f990: 78 32 3b 0a 20 20 7d 0a 20 20 72 65 63 75 72 73  x2;.  }.  recurs
f9a0: 69 76 65 5f 73 65 6c 65 63 74 20 36 34 20 7b 20  ive_select 64 { 
f9b0: 64 62 20 65 76 61 6c 20 7b 43 52 45 41 54 45 20  db eval {CREATE 
f9c0: 54 41 42 4c 45 20 78 33 28 78 2c 20 79 2c 20 7a  TABLE x3(x, y, z
f9d0: 29 7d 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b  )} }.  execsql {
f9e0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 78   SELECT * FROM x
f9f0: 33 20 7d 0a 7d 20 7b 7d 0a 0a 23 2d 2d 2d 2d 2d  3 }.} {}..#-----
fa00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fa10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fa20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fa30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fa40: 2d 2d 2d 2d 0a 23 0a 64 6f 5f 74 65 73 74 20 70  ----.#.do_test p
fa50: 61 67 65 72 31 2d 32 35 2d 31 20 7b 0a 20 20 66  ager1-25-1 {.  f
fa60: 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61  aultsim_delete_a
fa70: 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65 63  nd_reopen.  exec
fa80: 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b  sql {.    BEGIN;
fa90: 0a 20 20 20 20 20 20 53 41 56 45 50 4f 49 4e 54  .      SAVEPOINT
faa0: 20 61 62 63 3b 0a 20 20 20 20 20 20 20 20 43 52   abc;.        CR
fab0: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c  EATE TABLE t1(a,
fac0: 20 62 29 3b 0a 20 20 20 20 20 20 52 4f 4c 4c 42   b);.      ROLLB
fad0: 41 43 4b 20 54 4f 20 61 62 63 3b 0a 20 20 20 20  ACK TO abc;.    
fae0: 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 20 20 64 62  COMMIT;.  }.  db
faf0: 20 63 6c 6f 73 65 0a 7d 20 7b 7d 0a 62 72 65 61   close.} {}.brea
fb00: 6b 70 6f 69 6e 74 0a 64 6f 5f 74 65 73 74 20 70  kpoint.do_test p
fb10: 61 67 65 72 31 2d 32 35 2d 32 20 7b 0a 20 20 66  ager1-25-2 {.  f
fb20: 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61  aultsim_delete_a
fb30: 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65 63  nd_reopen.  exec
fb40: 73 71 6c 20 7b 0a 20 20 20 20 53 41 56 45 50 4f  sql {.    SAVEPO
fb50: 49 4e 54 20 61 62 63 3b 0a 20 20 20 20 20 20 43  INT abc;.      C
fb60: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61  REATE TABLE t1(a
fb70: 2c 20 62 29 3b 0a 20 20 20 20 52 4f 4c 4c 42 41  , b);.    ROLLBA
fb80: 43 4b 20 54 4f 20 61 62 63 3b 0a 20 20 20 20 43  CK TO abc;.    C
fb90: 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 20 20 64 62 20  OMMIT;.  }.  db 
fba0: 63 6c 6f 73 65 0a 7d 20 7b 7d 0a 0a 66 69 6e 69  close.} {}..fini
fbb0: 73 68 5f 74 65 73 74 0a                          sh_test.