/ Hex Artifact Content
Login

Artifact 31c04bec797dda1bde337810b52efa08d1f1f08e:


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 0a 23 20 44 6f 20 6e 6f 74 20  n.tcl..# Do not 
0210: 75 73 65 20 61 20 63 6f 64 65 63 20 66 6f 72 20  use a codec for 
0220: 74 65 73 74 73 20 69 6e 20 74 68 69 73 20 66 69  tests in this fi
0230: 6c 65 2c 20 61 73 20 74 68 65 20 64 61 74 61 62  le, as the datab
0240: 61 73 65 20 66 69 6c 65 20 69 73 0a 23 20 6d 61  ase file is.# ma
0250: 6e 69 70 75 6c 61 74 65 64 20 64 69 72 65 63 74  nipulated direct
0260: 6c 79 20 75 73 69 6e 67 20 74 63 6c 20 73 63 72  ly using tcl scr
0270: 69 70 74 73 20 28 75 73 69 6e 67 20 74 68 65 20  ipts (using the 
0280: 5b 68 65 78 69 6f 5f 77 72 69 74 65 5d 20 63 6f  [hexio_write] co
0290: 6d 6d 61 6e 64 29 2e 0a 23 0a 64 6f 5f 6e 6f 74  mmand)..#.do_not
02a0: 5f 75 73 65 5f 63 6f 64 65 63 0a 0a 23 0a 23 20  _use_codec..#.# 
02b0: 70 61 67 65 72 31 2d 31 2e 2a 3a 20 54 65 73 74  pager1-1.*: Test
02c0: 20 69 6e 74 65 72 2d 70 72 6f 63 65 73 73 20 6c   inter-process l
02d0: 6f 63 6b 69 6e 67 20 28 63 6c 69 65 6e 74 73 20  ocking (clients 
02e0: 69 6e 20 6d 75 6c 74 69 70 6c 65 20 70 72 6f 63  in multiple proc
02f0: 65 73 73 65 73 29 2e 0a 23 0a 23 20 70 61 67 65  esses)..#.# page
0300: 72 31 2d 32 2e 2a 3a 20 54 65 73 74 20 69 6e 74  r1-2.*: Test int
0310: 72 61 2d 70 72 6f 63 65 73 73 20 6c 6f 63 6b 69  ra-process locki
0320: 6e 67 20 28 6d 75 6c 74 69 70 6c 65 20 63 6c 69  ng (multiple cli
0330: 65 6e 74 73 20 69 6e 20 74 68 69 73 20 70 72 6f  ents in this pro
0340: 63 65 73 73 29 2e 0a 23 0a 23 20 70 61 67 65 72  cess)..#.# pager
0350: 31 2d 33 2e 2a 3a 20 53 61 76 65 70 6f 69 6e 74  1-3.*: Savepoint
0360: 20 72 65 6c 61 74 65 64 20 74 65 73 74 73 2e 0a   related tests..
0370: 23 0a 23 20 70 61 67 65 72 31 2d 34 2e 2a 3a 20  #.# pager1-4.*: 
0380: 48 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 65 6c 61  Hot-journal rela
0390: 74 65 64 20 74 65 73 74 73 2e 0a 23 0a 23 20 70  ted tests..#.# p
03a0: 61 67 65 72 31 2d 35 2e 2a 3a 20 43 61 73 65 73  ager1-5.*: Cases
03b0: 20 72 65 6c 61 74 65 64 20 74 6f 20 6d 75 6c 74   related to mult
03c0: 69 2d 66 69 6c 65 20 63 6f 6d 6d 69 74 73 2e 0a  i-file commits..
03d0: 23 0a 23 20 70 61 67 65 72 31 2d 36 2e 2a 3a 20  #.# pager1-6.*: 
03e0: 43 61 73 65 73 20 72 65 6c 61 74 65 64 20 74 6f  Cases related to
03f0: 20 22 50 52 41 47 4d 41 20 6d 61 78 5f 70 61 67   "PRAGMA max_pag
0400: 65 5f 63 6f 75 6e 74 22 0a 23 0a 23 20 70 61 67  e_count".#.# pag
0410: 65 72 31 2d 37 2e 2a 3a 20 43 61 73 65 73 20 73  er1-7.*: Cases s
0420: 70 65 63 69 66 69 63 20 74 6f 20 22 50 52 41 47  pecific to "PRAG
0430: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  MA journal_mode=
0440: 54 52 55 4e 43 41 54 45 22 0a 23 0a 23 20 70 61  TRUNCATE".#.# pa
0450: 67 65 72 31 2d 38 2e 2a 3a 20 43 61 73 65 73 20  ger1-8.*: Cases 
0460: 75 73 69 6e 67 20 74 65 6d 70 6f 72 61 72 79 20  using temporary 
0470: 61 6e 64 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61  and in-memory da
0480: 74 61 62 61 73 65 73 2e 0a 23 0a 23 20 70 61 67  tabases..#.# pag
0490: 65 72 31 2d 39 2e 2a 3a 20 54 65 73 74 73 20 72  er1-9.*: Tests r
04a0: 65 6c 61 74 65 64 20 74 6f 20 74 68 65 20 62 61  elated to the ba
04b0: 63 6b 75 70 20 41 50 49 2e 0a 23 0a 23 20 70 61  ckup API..#.# pa
04c0: 67 65 72 31 2d 31 30 2e 2a 3a 20 54 65 73 74 20  ger1-10.*: Test 
04d0: 74 68 61 74 20 74 68 65 20 61 73 73 75 6d 65 64  that the assumed
04e0: 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73 65 63   file-system sec
04f0: 74 6f 72 2d 73 69 7a 65 20 69 73 20 6c 69 6d 69  tor-size is limi
0500: 74 65 64 20 74 6f 0a 23 20 20 20 20 20 20 20 20  ted to.#        
0510: 20 20 20 20 20 20 36 34 4b 42 2e 0a 23 0a 23 20        64KB..#.# 
0520: 70 61 67 65 72 31 2d 31 32 2e 2a 3a 20 54 65 73  pager1-12.*: Tes
0530: 74 73 20 69 6e 76 6f 6c 76 69 6e 67 20 22 50 52  ts involving "PR
0540: 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 22 0a  AGMA page_size".
0550: 23 0a 23 20 70 61 67 65 72 31 2d 31 33 2e 2a 3a  #.# pager1-13.*:
0560: 20 43 61 73 65 73 20 73 70 65 63 69 66 69 63 20   Cases specific 
0570: 74 6f 20 22 50 52 41 47 4d 41 20 6a 6f 75 72 6e  to "PRAGMA journ
0580: 61 6c 5f 6d 6f 64 65 3d 50 45 52 53 49 53 54 22  al_mode=PERSIST"
0590: 0a 23 0a 23 20 70 61 67 65 72 31 2d 31 34 2e 2a  .#.# pager1-14.*
05a0: 3a 20 43 61 73 65 73 20 73 70 65 63 69 66 69 63  : Cases specific
05b0: 20 74 6f 20 22 50 52 41 47 4d 41 20 6a 6f 75 72   to "PRAGMA jour
05c0: 6e 61 6c 5f 6d 6f 64 65 3d 4f 46 46 22 0a 23 0a  nal_mode=OFF".#.
05d0: 23 20 70 61 67 65 72 31 2d 31 35 2e 2a 3a 20 56  # pager1-15.*: V
05e0: 61 72 79 69 6e 67 20 73 71 6c 69 74 65 33 5f 76  arying sqlite3_v
05f0: 66 73 2e 73 7a 4f 73 46 69 6c 65 0a 23 0a 23 20  fs.szOsFile.#.# 
0600: 70 61 67 65 72 31 2d 31 36 2e 2a 3a 20 56 61 72  pager1-16.*: Var
0610: 79 69 6e 67 20 73 71 6c 69 74 65 33 5f 76 66 73  ying sqlite3_vfs
0620: 2e 6d 78 50 61 74 68 6e 61 6d 65 0a 23 0a 23 20  .mxPathname.#.# 
0630: 70 61 67 65 72 31 2d 31 37 2e 2a 3a 20 54 65 73  pager1-17.*: Tes
0640: 74 73 20 72 65 6c 61 74 65 64 20 74 6f 20 22 50  ts related to "P
0650: 52 41 47 4d 41 20 6f 6d 69 74 5f 72 65 61 64 6c  RAGMA omit_readl
0660: 6f 63 6b 22 0a 23 20 20 20 20 20 20 20 20 20 20  ock".#          
0670: 20 20 20 20 28 54 68 65 20 6f 6d 69 74 5f 72 65      (The omit_re
0680: 61 64 6c 6f 63 6b 20 70 72 61 67 6d 61 20 68 61  adlock pragma ha
0690: 73 20 62 65 65 6e 20 72 65 6d 6f 76 65 64 20 61  s been removed a
06a0: 6e 64 20 73 6f 20 68 61 76 65 0a 23 20 20 20 20  nd so have.#    
06b0: 20 20 20 20 20 20 20 20 20 20 74 68 65 73 65 20            these 
06c0: 74 65 73 74 73 2e 29 0a 23 0a 23 20 70 61 67 65  tests.).#.# page
06d0: 72 31 2d 31 38 2e 2a 3a 20 54 65 73 74 20 74 68  r1-18.*: Test th
06e0: 61 74 20 74 68 65 20 70 61 67 65 72 20 6c 61 79  at the pager lay
06f0: 65 72 20 72 65 73 70 6f 6e 64 73 20 63 6f 72 72  er responds corr
0700: 65 63 74 6c 79 20 69 66 20 74 68 65 20 62 2d 74  ectly if the b-t
0710: 72 65 65 0a 23 20 20 20 20 20 20 20 20 20 20 20  ree.#           
0720: 20 20 20 72 65 71 75 65 73 74 73 20 61 6e 20 69     requests an i
0730: 6e 76 61 6c 69 64 20 70 61 67 65 20 6e 75 6d 62  nvalid page numb
0740: 65 72 20 28 64 75 65 20 74 6f 20 64 62 20 63 6f  er (due to db co
0750: 72 72 75 70 74 69 6f 6e 29 2e 0a 23 0a 0a 70 72  rruption)..#..pr
0760: 6f 63 20 72 65 63 75 72 73 69 76 65 5f 73 65 6c  oc recursive_sel
0770: 65 63 74 20 7b 69 64 20 74 61 62 6c 65 20 7b 73  ect {id table {s
0780: 63 72 69 70 74 20 7b 7d 7d 7d 20 7b 0a 20 20 73  cript {}}} {.  s
0790: 65 74 20 63 6e 74 20 30 0a 20 20 64 62 20 65 76  et cnt 0.  db ev
07a0: 61 6c 20 22 53 45 4c 45 43 54 20 72 6f 77 69 64  al "SELECT rowid
07b0: 2c 20 2a 20 46 52 4f 4d 20 24 74 61 62 6c 65 20  , * FROM $table 
07c0: 57 48 45 52 45 20 72 6f 77 69 64 20 3d 20 28 24  WHERE rowid = ($
07d0: 69 64 2d 31 29 22 20 7b 0a 20 20 20 20 72 65 63  id-1)" {.    rec
07e0: 75 72 73 69 76 65 5f 73 65 6c 65 63 74 20 24 72  ursive_select $r
07f0: 6f 77 69 64 20 24 74 61 62 6c 65 20 24 73 63 72  owid $table $scr
0800: 69 70 74 0a 20 20 20 20 69 6e 63 72 20 63 6e 74  ipt.    incr cnt
0810: 0a 20 20 7d 0a 20 20 69 66 20 7b 24 63 6e 74 3d  .  }.  if {$cnt=
0820: 3d 30 7d 20 7b 20 65 76 61 6c 20 24 73 63 72 69  =0} { eval $scri
0830: 70 74 20 7d 0a 7d 0a 0a 73 65 74 20 61 5f 73 74  pt }.}..set a_st
0840: 72 69 6e 67 5f 63 6f 75 6e 74 65 72 20 31 0a 70  ring_counter 1.p
0850: 72 6f 63 20 61 5f 73 74 72 69 6e 67 20 7b 6e 7d  roc a_string {n}
0860: 20 7b 0a 20 20 67 6c 6f 62 61 6c 20 61 5f 73 74   {.  global a_st
0870: 72 69 6e 67 5f 63 6f 75 6e 74 65 72 0a 20 20 69  ring_counter.  i
0880: 6e 63 72 20 61 5f 73 74 72 69 6e 67 5f 63 6f 75  ncr a_string_cou
0890: 6e 74 65 72 0a 20 20 73 74 72 69 6e 67 20 72 61  nter.  string ra
08a0: 6e 67 65 20 5b 73 74 72 69 6e 67 20 72 65 70 65  nge [string repe
08b0: 61 74 20 22 24 7b 61 5f 73 74 72 69 6e 67 5f 63  at "${a_string_c
08c0: 6f 75 6e 74 65 72 7d 2e 22 20 24 6e 5d 20 31 20  ounter}." $n] 1 
08d0: 24 6e 0a 7d 0a 64 62 20 66 75 6e 63 20 61 5f 73  $n.}.db func a_s
08e0: 74 72 69 6e 67 20 61 5f 73 74 72 69 6e 67 0a 0a  tring a_string..
08f0: 64 6f 5f 6d 75 6c 74 69 63 6c 69 65 6e 74 5f 74  do_multiclient_t
0900: 65 73 74 20 74 6e 20 7b 0a 0a 20 20 23 20 43 72  est tn {..  # Cr
0910: 65 61 74 65 20 61 6e 64 20 70 6f 70 75 6c 61 74  eate and populat
0920: 65 20 61 20 64 61 74 61 62 61 73 65 20 74 61 62  e a database tab
0930: 6c 65 20 75 73 69 6e 67 20 63 6f 6e 6e 65 63 74  le using connect
0940: 69 6f 6e 20 5b 64 62 5d 2e 20 43 68 65 63 6b 20  ion [db]. Check 
0950: 0a 20 20 23 20 74 68 61 74 20 63 6f 6e 6e 65 63  .  # that connec
0960: 74 69 6f 6e 73 20 5b 64 62 32 5d 20 61 6e 64 20  tions [db2] and 
0970: 5b 64 62 33 5d 20 63 61 6e 20 73 65 65 20 74 68  [db3] can see th
0980: 65 20 73 63 68 65 6d 61 20 61 6e 64 20 63 6f 6e  e schema and con
0990: 74 65 6e 74 2e 0a 20 20 23 0a 20 20 64 6f 5f 74  tent..  #.  do_t
09a0: 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 31  est pager1-$tn.1
09b0: 20 7b 0a 20 20 20 20 73 71 6c 31 20 7b 0a 20 20   {.    sql1 {.  
09c0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
09d0: 20 74 31 28 61 20 50 52 49 4d 41 52 59 20 4b 45   t1(a PRIMARY KE
09e0: 59 2c 20 62 29 3b 0a 20 20 20 20 20 20 43 52 45  Y, b);.      CRE
09f0: 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20  ATE INDEX i1 ON 
0a00: 74 31 28 62 29 3b 0a 20 20 20 20 20 20 49 4e 53  t1(b);.      INS
0a10: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
0a20: 45 53 28 31 2c 20 27 6f 6e 65 27 29 3b 20 49 4e  ES(1, 'one'); IN
0a30: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
0a40: 55 45 53 28 32 2c 20 27 74 77 6f 27 29 3b 0a 20  UES(2, 'two');. 
0a50: 20 20 20 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f     }.  } {}.  do
0a60: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e  _test pager1-$tn
0a70: 2e 32 20 7b 20 73 71 6c 32 20 7b 20 53 45 4c 45  .2 { sql2 { SELE
0a80: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7d  CT * FROM t1 } }
0a90: 20 7b 31 20 6f 6e 65 20 32 20 74 77 6f 7d 0a 20   {1 one 2 two}. 
0aa0: 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
0ab0: 24 74 6e 2e 33 20 7b 20 73 71 6c 33 20 7b 20 53  $tn.3 { sql3 { S
0ac0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
0ad0: 7d 20 7d 20 7b 31 20 6f 6e 65 20 32 20 74 77 6f  } } {1 one 2 two
0ae0: 7d 0a 0a 20 20 23 20 4f 70 65 6e 20 61 20 74 72  }..  # Open a tr
0af0: 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 61 64  ansaction and ad
0b00: 64 20 61 20 72 6f 77 20 75 73 69 6e 67 20 5b 64  d a row using [d
0b10: 62 5d 2e 20 54 68 69 73 20 70 75 74 73 20 5b 64  b]. This puts [d
0b20: 62 5d 20 69 6e 0a 20 20 23 20 52 45 53 45 52 56  b] in.  # RESERV
0b30: 45 44 20 73 74 61 74 65 2e 20 43 68 65 63 6b 20  ED state. Check 
0b40: 74 68 61 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  that connections
0b50: 20 5b 64 62 32 5d 20 61 6e 64 20 5b 64 62 33 5d   [db2] and [db3]
0b60: 20 63 61 6e 20 73 74 69 6c 6c 0a 20 20 23 20 72   can still.  # r
0b70: 65 61 64 20 74 68 65 20 64 61 74 61 62 61 73 65  ead the database
0b80: 20 63 6f 6e 74 65 6e 74 20 61 73 20 69 74 20 77   content as it w
0b90: 61 73 20 62 65 66 6f 72 65 20 74 68 65 20 74 72  as before the tr
0ba0: 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 0a 20 20  ansaction was.  
0bb0: 23 20 6f 70 65 6e 65 64 2e 20 5b 64 62 5d 20 73  # opened. [db] s
0bc0: 68 6f 75 6c 64 20 73 65 65 20 74 68 65 20 69 6e  hould see the in
0bd0: 73 65 72 74 65 64 20 72 6f 77 2e 0a 20 20 23 0a  serted row..  #.
0be0: 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
0bf0: 2d 24 74 6e 2e 34 20 7b 0a 20 20 20 20 73 71 6c  -$tn.4 {.    sql
0c00: 31 20 7b 0a 20 20 20 20 20 20 42 45 47 49 4e 3b  1 {.      BEGIN;
0c10: 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20  .        INSERT 
0c20: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 33  INTO t1 VALUES(3
0c30: 2c 20 27 74 68 72 65 65 27 29 3b 0a 20 20 20 20  , 'three');.    
0c40: 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65  }.  } {}.  do_te
0c50: 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 35 20  st pager1-$tn.5 
0c60: 7b 20 73 71 6c 32 20 7b 20 53 45 4c 45 43 54 20  { sql2 { SELECT 
0c70: 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7d 20 7b 31  * FROM t1 } } {1
0c80: 20 6f 6e 65 20 32 20 74 77 6f 7d 0a 20 20 64 6f   one 2 two}.  do
0c90: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e  _test pager1-$tn
0ca0: 2e 37 20 7b 20 73 71 6c 31 20 7b 20 53 45 4c 45  .7 { sql1 { SELE
0cb0: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7d  CT * FROM t1 } }
0cc0: 20 7b 31 20 6f 6e 65 20 32 20 74 77 6f 20 33 20   {1 one 2 two 3 
0cd0: 74 68 72 65 65 7d 0a 0a 20 20 23 20 5b 64 62 5d  three}..  # [db]
0ce0: 20 73 74 69 6c 6c 20 68 61 73 20 61 6e 20 6f 70   still has an op
0cf0: 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  en write transac
0d00: 74 69 6f 6e 2e 20 43 68 65 63 6b 20 74 68 61 74  tion. Check that
0d10: 20 74 68 69 73 20 70 72 65 76 65 6e 74 73 0a 20   this prevents. 
0d20: 20 23 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74   # other connect
0d30: 69 6f 6e 73 20 28 73 70 65 63 69 66 69 63 61 6c  ions (specifical
0d40: 6c 79 20 5b 64 62 32 5d 29 20 66 72 6f 6d 20 77  ly [db2]) from w
0d50: 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61  riting to the da
0d60: 74 61 62 61 73 65 2e 0a 20 20 23 0a 20 20 23 20  tabase..  #.  # 
0d70: 45 76 65 6e 20 69 66 20 5b 64 62 32 5d 20 6f 70  Even if [db2] op
0d80: 65 6e 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ens a transactio
0d90: 6e 20 66 69 72 73 74 2c 20 69 74 20 6d 61 79 20  n first, it may 
0da0: 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68 65  not write to the
0db0: 0a 20 20 23 20 64 61 74 61 62 61 73 65 2e 20 41  .  # database. A
0dc0: 66 74 65 72 20 74 68 65 20 61 74 74 65 6d 70 74  fter the attempt
0dd0: 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 64 62   to write the db
0de0: 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73 61   within a transa
0df0: 63 74 69 6f 6e 2c 20 0a 20 20 23 20 5b 64 62 32  ction, .  # [db2
0e00: 5d 20 69 73 20 6c 65 66 74 20 77 69 74 68 20 61  ] is left with a
0e10: 6e 20 6f 70 65 6e 20 74 72 61 6e 73 61 63 74 69  n open transacti
0e20: 6f 6e 2c 20 62 75 74 20 6e 6f 74 20 61 20 72 65  on, but not a re
0e30: 61 64 2d 6c 6f 63 6b 20 6f 6e 0a 20 20 23 20 74  ad-lock on.  # t
0e40: 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
0e50: 2e 20 53 6f 20 69 74 20 64 6f 65 73 20 6e 6f 74  . So it does not
0e60: 20 70 72 65 76 65 6e 74 20 5b 64 62 5d 20 66 72   prevent [db] fr
0e70: 6f 6d 20 63 6f 6d 6d 69 74 74 69 6e 67 2e 0a 20  om committing.. 
0e80: 20 23 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67   #.  do_test pag
0e90: 65 72 31 2d 24 74 6e 2e 38 20 7b 20 0a 20 20 20  er1-$tn.8 { .   
0ea0: 20 63 73 71 6c 32 20 7b 20 55 50 44 41 54 45 20   csql2 { UPDATE 
0eb0: 74 31 20 53 45 54 20 61 20 3d 20 61 20 2b 20 31  t1 SET a = a + 1
0ec0: 30 20 7d 0a 20 20 7d 20 7b 31 20 7b 64 61 74 61  0 }.  } {1 {data
0ed0: 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 7d 7d  base is locked}}
0ee0: 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72  .  do_test pager
0ef0: 31 2d 24 74 6e 2e 39 20 7b 20 0a 20 20 20 20 63  1-$tn.9 { .    c
0f00: 73 71 6c 32 20 7b 20 0a 20 20 20 20 20 20 42 45  sql2 { .      BE
0f10: 47 49 4e 3b 0a 20 20 20 20 20 20 55 50 44 41 54  GIN;.      UPDAT
0f20: 45 20 74 31 20 53 45 54 20 61 20 3d 20 61 20 2b  E t1 SET a = a +
0f30: 20 31 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b   10;.    }.  } {
0f40: 31 20 7b 64 61 74 61 62 61 73 65 20 69 73 20 6c  1 {database is l
0f50: 6f 63 6b 65 64 7d 7d 0a 0a 20 20 23 20 48 61 76  ocked}}..  # Hav
0f60: 65 20 5b 64 62 5d 20 63 6f 6d 6d 69 74 20 69 74  e [db] commit it
0f70: 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e 20  s transactions. 
0f80: 43 68 65 63 6b 20 74 68 65 20 6f 74 68 65 72 20  Check the other 
0f90: 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 63 61 6e 0a  connections can.
0fa0: 20 20 23 20 6e 6f 77 20 73 65 65 20 74 68 65 20    # now see the 
0fb0: 6e 65 77 20 64 61 74 61 62 61 73 65 20 63 6f 6e  new database con
0fc0: 74 65 6e 74 2e 0a 20 20 23 0a 20 20 64 6f 5f 74  tent..  #.  do_t
0fd0: 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 31  est pager1-$tn.1
0fe0: 30 20 7b 20 73 71 6c 31 20 7b 20 43 4f 4d 4d 49  0 { sql1 { COMMI
0ff0: 54 20 7d 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65  T } } {}.  do_te
1000: 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 31 31  st pager1-$tn.11
1010: 20 7b 20 73 71 6c 31 20 7b 20 53 45 4c 45 43 54   { sql1 { SELECT
1020: 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7d 20 7b   * FROM t1 } } {
1030: 31 20 6f 6e 65 20 32 20 74 77 6f 20 33 20 74 68  1 one 2 two 3 th
1040: 72 65 65 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70  ree}.  do_test p
1050: 61 67 65 72 31 2d 24 74 6e 2e 31 32 20 7b 20 73  ager1-$tn.12 { s
1060: 71 6c 32 20 7b 20 53 45 4c 45 43 54 20 2a 20 46  ql2 { SELECT * F
1070: 52 4f 4d 20 74 31 20 7d 20 7d 20 7b 31 20 6f 6e  ROM t1 } } {1 on
1080: 65 20 32 20 74 77 6f 20 33 20 74 68 72 65 65 7d  e 2 two 3 three}
1090: 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72  .  do_test pager
10a0: 31 2d 24 74 6e 2e 31 33 20 7b 20 73 71 6c 33 20  1-$tn.13 { sql3 
10b0: 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  { SELECT * FROM 
10c0: 74 31 20 7d 20 7d 20 7b 31 20 6f 6e 65 20 32 20  t1 } } {1 one 2 
10d0: 74 77 6f 20 33 20 74 68 72 65 65 7d 0a 0a 20 20  two 3 three}..  
10e0: 23 20 43 68 65 63 6b 20 74 68 61 74 2c 20 61 73  # Check that, as
10f0: 20 6e 6f 74 65 64 20 61 62 6f 76 65 2c 20 5b 64   noted above, [d
1100: 62 32 5d 20 72 65 61 6c 6c 79 20 64 69 64 20 6b  b2] really did k
1110: 65 65 70 20 61 6e 20 6f 70 65 6e 20 74 72 61 6e  eep an open tran
1120: 73 61 63 74 69 6f 6e 0a 20 20 23 20 61 66 74 65  saction.  # afte
1130: 72 20 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f  r the attempt to
1140: 20 77 72 69 74 65 20 74 68 65 20 64 61 74 61 62   write the datab
1150: 61 73 65 20 66 61 69 6c 65 64 2e 0a 20 20 23 0a  ase failed..  #.
1160: 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
1170: 2d 24 74 6e 2e 31 34 20 7b 20 0a 20 20 20 20 63  -$tn.14 { .    c
1180: 73 71 6c 32 20 7b 20 42 45 47 49 4e 20 7d 20 0a  sql2 { BEGIN } .
1190: 20 20 7d 20 7b 31 20 7b 63 61 6e 6e 6f 74 20 73    } {1 {cannot s
11a0: 74 61 72 74 20 61 20 74 72 61 6e 73 61 63 74 69  tart a transacti
11b0: 6f 6e 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e  on within a tran
11c0: 73 61 63 74 69 6f 6e 7d 7d 0a 20 20 64 6f 5f 74  saction}}.  do_t
11d0: 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 31  est pager1-$tn.1
11e0: 35 20 7b 20 73 71 6c 32 20 7b 20 52 4f 4c 4c 42  5 { sql2 { ROLLB
11f0: 41 43 4b 20 7d 20 7d 20 7b 7d 0a 0a 20 20 23 20  ACK } } {}..  # 
1200: 48 61 76 65 20 5b 64 62 32 5d 20 6f 70 65 6e 20  Have [db2] open 
1210: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e  a transaction an
1220: 64 20 74 61 6b 65 20 61 20 72 65 61 64 2d 6c 6f  d take a read-lo
1230: 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
1240: 73 65 2e 0a 20 20 23 20 43 68 65 63 6b 20 74 68  se..  # Check th
1250: 61 74 20 74 68 69 73 20 70 72 65 76 65 6e 74 73  at this prevents
1260: 20 5b 64 62 5d 20 66 72 6f 6d 20 77 72 69 74 69   [db] from writi
1270: 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ng to the databa
1280: 73 65 20 28 6f 75 74 73 69 64 65 0a 20 20 23 20  se (outside.  # 
1290: 6f 66 20 61 6e 79 20 74 72 61 6e 73 61 63 74 69  of any transacti
12a0: 6f 6e 29 2e 20 41 66 74 65 72 20 74 68 69 73 20  on). After this 
12b0: 66 61 69 6c 73 2c 20 63 68 65 63 6b 20 74 68 61  fails, check tha
12c0: 74 20 5b 64 62 33 5d 20 63 61 6e 20 72 65 61 64  t [db3] can read
12d0: 0a 20 20 23 20 74 68 65 20 64 62 20 28 73 68 6f  .  # the db (sho
12e0: 77 69 6e 67 20 74 68 61 74 20 5b 64 62 5d 20 64  wing that [db] d
12f0: 69 64 20 6e 6f 74 20 74 61 6b 65 20 61 20 50 45  id not take a PE
1300: 4e 44 49 4e 47 20 6c 6f 63 6b 20 65 74 63 2e 29  NDING lock etc.)
1310: 0a 20 20 23 0a 20 20 64 6f 5f 74 65 73 74 20 70  .  #.  do_test p
1320: 61 67 65 72 31 2d 24 74 6e 2e 31 35 20 7b 20 0a  ager1-$tn.15 { .
1330: 20 20 20 20 73 71 6c 32 20 7b 20 42 45 47 49 4e      sql2 { BEGIN
1340: 3b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  ; SELECT * FROM 
1350: 74 31 3b 20 7d 0a 20 20 7d 20 7b 31 20 6f 6e 65  t1; }.  } {1 one
1360: 20 32 20 74 77 6f 20 33 20 74 68 72 65 65 7d 0a   2 two 3 three}.
1370: 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
1380: 2d 24 74 6e 2e 31 36 20 7b 20 0a 20 20 20 20 63  -$tn.16 { .    c
1390: 73 71 6c 31 20 7b 20 55 50 44 41 54 45 20 74 31  sql1 { UPDATE t1
13a0: 20 53 45 54 20 61 20 3d 20 61 20 2b 20 31 30 20   SET a = a + 10 
13b0: 7d 0a 20 20 7d 20 7b 31 20 7b 64 61 74 61 62 61  }.  } {1 {databa
13c0: 73 65 20 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 20  se is locked}}. 
13d0: 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
13e0: 24 74 6e 2e 31 37 20 7b 20 73 71 6c 33 20 7b 20  $tn.17 { sql3 { 
13f0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
1400: 20 7d 20 7d 20 7b 31 20 6f 6e 65 20 32 20 74 77   } } {1 one 2 tw
1410: 6f 20 33 20 74 68 72 65 65 7d 0a 0a 20 20 23 20  o 3 three}..  # 
1420: 54 68 69 73 20 74 69 6d 65 2c 20 68 61 76 65 20  This time, have 
1430: 5b 64 62 5d 20 6f 70 65 6e 20 61 20 74 72 61 6e  [db] open a tran
1440: 73 61 63 74 69 6f 6e 20 62 65 66 6f 72 65 20 77  saction before w
1450: 72 69 74 69 6e 67 20 74 68 65 20 64 61 74 61 62  riting the datab
1460: 61 73 65 2e 0a 20 20 23 20 54 68 69 73 20 77 6f  ase..  # This wo
1470: 72 6b 73 20 2d 20 5b 64 62 5d 20 67 65 74 73 20  rks - [db] gets 
1480: 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
1490: 77 68 69 63 68 20 64 6f 65 73 20 6e 6f 74 20 63  which does not c
14a0: 6f 6e 66 6c 69 63 74 20 77 69 74 68 0a 20 20 23  onflict with.  #
14b0: 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b   the SHARED lock
14c0: 20 5b 64 62 32 5d 20 69 73 20 68 6f 6c 64 69 6e   [db2] is holdin
14d0: 67 2e 0a 20 20 23 0a 20 20 64 6f 5f 74 65 73 74  g..  #.  do_test
14e0: 20 70 61 67 65 72 31 2d 24 74 6e 2e 31 38 20 7b   pager1-$tn.18 {
14f0: 20 0a 20 20 20 20 73 71 6c 31 20 7b 20 0a 20 20   .    sql1 { .  
1500: 20 20 20 20 42 45 47 49 4e 3b 20 20 0a 20 20 20      BEGIN;  .   
1510: 20 20 20 55 50 44 41 54 45 20 74 31 20 53 45 54     UPDATE t1 SET
1520: 20 61 20 3d 20 61 20 2b 20 31 30 3b 20 0a 20 20   a = a + 10; .  
1530: 20 20 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f    }.  } {}.  do_
1540: 74 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2d  test pager1-$tn-
1550: 31 39 20 7b 20 0a 20 20 20 20 73 71 6c 31 20 7b  19 { .    sql1 {
1560: 20 50 52 41 47 4d 41 20 6c 6f 63 6b 5f 73 74 61   PRAGMA lock_sta
1570: 74 75 73 20 7d 20 0a 20 20 7d 20 7b 6d 61 69 6e  tus } .  } {main
1580: 20 72 65 73 65 72 76 65 64 20 74 65 6d 70 20 63   reserved temp c
1590: 6c 6f 73 65 64 7d 0a 20 20 64 6f 5f 74 65 73 74  losed}.  do_test
15a0: 20 70 61 67 65 72 31 2d 24 74 6e 2d 32 30 20 7b   pager1-$tn-20 {
15b0: 20 0a 20 20 20 20 73 71 6c 32 20 7b 20 50 52 41   .    sql2 { PRA
15c0: 47 4d 41 20 6c 6f 63 6b 5f 73 74 61 74 75 73 20  GMA lock_status 
15d0: 7d 20 0a 20 20 7d 20 7b 6d 61 69 6e 20 73 68 61  } .  } {main sha
15e0: 72 65 64 20 74 65 6d 70 20 63 6c 6f 73 65 64 7d  red temp closed}
15f0: 0a 0a 20 20 23 20 43 68 65 63 6b 20 74 68 61 74  ..  # Check that
1600: 20 61 6c 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 73   all connections
1610: 20 63 61 6e 20 73 74 69 6c 6c 20 72 65 61 64 20   can still read 
1620: 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 4f 6e  the database. On
1630: 6c 79 20 5b 64 62 5d 20 73 65 65 73 0a 20 20 23  ly [db] sees.  #
1640: 20 74 68 65 20 75 70 64 61 74 65 64 20 63 6f 6e   the updated con
1650: 74 65 6e 74 20 28 61 73 20 74 68 65 20 74 72 61  tent (as the tra
1660: 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 6e 6f 74  nsaction has not
1670: 20 62 65 65 6e 20 63 6f 6d 6d 69 74 74 65 64 20   been committed 
1680: 79 65 74 29 2e 0a 20 20 23 0a 20 20 64 6f 5f 74  yet)..  #.  do_t
1690: 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 32  est pager1-$tn.2
16a0: 31 20 7b 20 73 71 6c 31 20 7b 20 53 45 4c 45 43  1 { sql1 { SELEC
16b0: 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7d 20  T * FROM t1 } } 
16c0: 7b 31 31 20 6f 6e 65 20 31 32 20 74 77 6f 20 31  {11 one 12 two 1
16d0: 33 20 74 68 72 65 65 7d 0a 20 20 64 6f 5f 74 65  3 three}.  do_te
16e0: 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 32 32  st pager1-$tn.22
16f0: 20 7b 20 73 71 6c 32 20 7b 20 53 45 4c 45 43 54   { sql2 { SELECT
1700: 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7d 20 7b   * FROM t1 } } {
1710: 31 20 6f 6e 65 20 32 20 74 77 6f 20 33 20 74 68  1 one 2 two 3 th
1720: 72 65 65 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70  ree}.  do_test p
1730: 61 67 65 72 31 2d 24 74 6e 2e 32 33 20 7b 20 73  ager1-$tn.23 { s
1740: 71 6c 33 20 7b 20 53 45 4c 45 43 54 20 2a 20 46  ql3 { SELECT * F
1750: 52 4f 4d 20 74 31 20 7d 20 7d 20 7b 31 20 6f 6e  ROM t1 } } {1 on
1760: 65 20 32 20 74 77 6f 20 33 20 74 68 72 65 65 7d  e 2 two 3 three}
1770: 0a 0a 20 20 23 20 42 65 63 61 75 73 65 20 5b 64  ..  # Because [d
1780: 62 32 5d 20 73 74 69 6c 6c 20 68 61 73 20 74 68  b2] still has th
1790: 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 5b  e SHARED lock, [
17a0: 64 62 5d 20 69 73 20 75 6e 61 62 6c 65 20 74 6f  db] is unable to
17b0: 20 63 6f 6d 6d 69 74 20 74 68 65 0a 20 20 23 20   commit the.  # 
17c0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20  transaction. If 
17d0: 69 74 20 74 72 69 65 73 2c 20 61 6e 20 65 72 72  it tries, an err
17e0: 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  or is returned a
17f0: 6e 64 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  nd the connectio
1800: 6e 20 0a 20 20 23 20 75 70 67 72 61 64 65 73 20  n .  # upgrades 
1810: 74 6f 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63  to a PENDING loc
1820: 6b 2e 0a 20 20 23 0a 20 20 23 20 4f 6e 63 65 20  k..  #.  # Once 
1830: 74 68 69 73 20 68 61 70 70 65 6e 73 2c 20 5b 64  this happens, [d
1840: 62 5d 20 63 61 6e 20 72 65 61 64 20 74 68 65 20  b] can read the 
1850: 64 61 74 61 62 61 73 65 20 61 6e 64 20 73 65 65  database and see
1860: 20 74 68 65 20 6e 65 77 20 63 6f 6e 74 65 6e 74   the new content
1870: 2c 0a 20 20 23 20 5b 64 62 32 5d 20 28 73 74 69  ,.  # [db2] (sti
1880: 6c 6c 20 68 6f 6c 64 69 6e 67 20 53 48 41 52 45  ll holding SHARE
1890: 44 29 20 63 61 6e 20 73 74 69 6c 6c 20 72 65 61  D) can still rea
18a0: 64 20 74 68 65 20 6f 6c 64 20 63 6f 6e 74 65 6e  d the old conten
18b0: 74 2c 20 62 75 74 20 5b 64 62 33 5d 0a 20 20 23  t, but [db3].  #
18c0: 20 28 6e 6f 74 20 68 6f 6c 64 69 6e 67 20 61 6e   (not holding an
18d0: 79 20 6c 6f 63 6b 29 20 69 73 20 70 72 65 76 65  y lock) is preve
18e0: 6e 74 65 64 20 62 79 20 5b 64 62 5d 27 73 20 50  nted by [db]'s P
18f0: 45 4e 44 49 4e 47 20 66 72 6f 6d 20 72 65 61 64  ENDING from read
1900: 69 6e 67 0a 20 20 23 20 74 68 65 20 64 61 74 61  ing.  # the data
1910: 62 61 73 65 2e 0a 20 20 23 0a 20 20 64 6f 5f 74  base..  #.  do_t
1920: 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 32  est pager1-$tn.2
1930: 34 20 7b 20 63 73 71 6c 31 20 7b 20 43 4f 4d 4d  4 { csql1 { COMM
1940: 49 54 20 7d 20 7d 20 7b 31 20 7b 64 61 74 61 62  IT } } {1 {datab
1950: 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a  ase is locked}}.
1960: 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
1970: 2d 24 74 6e 2d 32 35 20 7b 20 0a 20 20 20 20 73  -$tn-25 { .    s
1980: 71 6c 31 20 7b 20 50 52 41 47 4d 41 20 6c 6f 63  ql1 { PRAGMA loc
1990: 6b 5f 73 74 61 74 75 73 20 7d 20 0a 20 20 7d 20  k_status } .  } 
19a0: 7b 6d 61 69 6e 20 70 65 6e 64 69 6e 67 20 74 65  {main pending te
19b0: 6d 70 20 63 6c 6f 73 65 64 7d 0a 20 20 64 6f 5f  mp closed}.  do_
19c0: 74 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e  test pager1-$tn.
19d0: 32 36 20 7b 20 73 71 6c 31 20 7b 20 53 45 4c 45  26 { sql1 { SELE
19e0: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 20 7d 20  CT * FROM t1  } 
19f0: 7d 20 7b 31 31 20 6f 6e 65 20 31 32 20 74 77 6f  } {11 one 12 two
1a00: 20 31 33 20 74 68 72 65 65 7d 0a 20 20 64 6f 5f   13 three}.  do_
1a10: 74 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e  test pager1-$tn.
1a20: 32 37 20 7b 20 73 71 6c 32 20 7b 20 53 45 4c 45  27 { sql2 { SELE
1a30: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 20 7d 20  CT * FROM t1  } 
1a40: 7d 20 7b 31 20 6f 6e 65 20 32 20 74 77 6f 20 33  } {1 one 2 two 3
1a50: 20 74 68 72 65 65 7d 0a 20 20 64 6f 5f 74 65 73   three}.  do_tes
1a60: 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 32 38 20  t pager1-$tn.28 
1a70: 7b 20 63 73 71 6c 33 20 7b 20 53 45 4c 45 43 54  { csql3 { SELECT
1a80: 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7d 20 7b   * FROM t1 } } {
1a90: 31 20 7b 64 61 74 61 62 61 73 65 20 69 73 20 6c  1 {database is l
1aa0: 6f 63 6b 65 64 7d 7d 0a 0a 20 20 23 20 48 61 76  ocked}}..  # Hav
1ab0: 65 20 5b 64 62 32 5d 20 63 6f 6d 6d 69 74 20 69  e [db2] commit i
1ac0: 74 73 20 72 65 61 64 20 74 72 61 6e 73 61 63 74  ts read transact
1ad0: 69 6f 6e 2c 20 72 65 6c 65 61 73 69 6e 67 20 74  ion, releasing t
1ae0: 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69  he SHARED lock i
1af0: 74 0a 20 20 23 20 69 73 20 68 6f 6c 64 69 6e 67  t.  # is holding
1b00: 2e 20 4e 6f 77 2c 20 6e 65 69 74 68 65 72 20 5b  . Now, neither [
1b10: 64 62 32 5d 20 6e 6f 72 20 5b 64 62 33 5d 20 6d  db2] nor [db3] m
1b20: 61 79 20 72 65 61 64 20 74 68 65 20 64 61 74 61  ay read the data
1b30: 62 61 73 65 20 28 61 73 20 5b 64 62 5d 0a 20 20  base (as [db].  
1b40: 23 20 69 73 20 73 74 69 6c 6c 20 68 6f 6c 64 69  # is still holdi
1b50: 6e 67 20 61 20 50 45 4e 44 49 4e 47 29 2e 0a 20  ng a PENDING).. 
1b60: 20 23 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67   #.  do_test pag
1b70: 65 72 31 2d 24 74 6e 2e 32 39 20 7b 20 73 71 6c  er1-$tn.29 { sql
1b80: 32 20 7b 20 43 4f 4d 4d 49 54 20 7d 20 7d 20 7b  2 { COMMIT } } {
1b90: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65  }.  do_test page
1ba0: 72 31 2d 24 74 6e 2e 33 30 20 7b 20 63 73 71 6c  r1-$tn.30 { csql
1bb0: 32 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  2 { SELECT * FRO
1bc0: 4d 20 74 31 20 7d 20 7d 20 7b 31 20 7b 64 61 74  M t1 } } {1 {dat
1bd0: 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 7d  abase is locked}
1be0: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65  }.  do_test page
1bf0: 72 31 2d 24 74 6e 2e 33 31 20 7b 20 63 73 71 6c  r1-$tn.31 { csql
1c00: 33 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  3 { SELECT * FRO
1c10: 4d 20 74 31 20 7d 20 7d 20 7b 31 20 7b 64 61 74  M t1 } } {1 {dat
1c20: 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 7d  abase is locked}
1c30: 7d 0a 0a 20 20 23 20 5b 64 62 5d 20 69 73 20 6e  }..  # [db] is n
1c40: 6f 77 20 61 62 6c 65 20 74 6f 20 63 6f 6d 6d 69  ow able to commi
1c50: 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  t the transactio
1c60: 6e 2e 20 4f 6e 63 65 20 74 68 65 20 74 72 61 6e  n. Once the tran
1c70: 73 61 63 74 69 6f 6e 20 69 73 20 0a 20 20 23 20  saction is .  # 
1c80: 63 6f 6d 6d 69 74 74 65 64 2c 20 61 6c 6c 20 74  committed, all t
1c90: 68 72 65 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  hree connections
1ca0: 20 63 61 6e 20 72 65 61 64 20 74 68 65 20 6e 65   can read the ne
1cb0: 77 20 63 6f 6e 74 65 6e 74 2e 0a 20 20 23 0a 20  w content..  #. 
1cc0: 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
1cd0: 24 74 6e 2e 32 35 20 7b 20 73 71 6c 31 20 7b 20  $tn.25 { sql1 { 
1ce0: 55 50 44 41 54 45 20 74 31 20 53 45 54 20 61 20  UPDATE t1 SET a 
1cf0: 3d 20 61 2b 31 30 20 7d 20 7d 20 7b 7d 0a 20 20  = a+10 } } {}.  
1d00: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24  do_test pager1-$
1d10: 74 6e 2e 32 36 20 7b 20 73 71 6c 31 20 7b 20 43  tn.26 { sql1 { C
1d20: 4f 4d 4d 49 54 20 7d 20 7d 20 7b 7d 0a 20 20 64  OMMIT } } {}.  d
1d30: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24 74  o_test pager1-$t
1d40: 6e 2e 32 37 20 7b 20 73 71 6c 31 20 7b 20 53 45  n.27 { sql1 { SE
1d50: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d  LECT * FROM t1 }
1d60: 20 7d 20 7b 32 31 20 6f 6e 65 20 32 32 20 74 77   } {21 one 22 tw
1d70: 6f 20 32 33 20 74 68 72 65 65 7d 0a 20 20 64 6f  o 23 three}.  do
1d80: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e  _test pager1-$tn
1d90: 2e 32 37 20 7b 20 73 71 6c 32 20 7b 20 53 45 4c  .27 { sql2 { SEL
1da0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20  ECT * FROM t1 } 
1db0: 7d 20 7b 32 31 20 6f 6e 65 20 32 32 20 74 77 6f  } {21 one 22 two
1dc0: 20 32 33 20 74 68 72 65 65 7d 0a 20 20 64 6f 5f   23 three}.  do_
1dd0: 74 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e  test pager1-$tn.
1de0: 32 38 20 7b 20 73 71 6c 33 20 7b 20 53 45 4c 45  28 { sql3 { SELE
1df0: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7d  CT * FROM t1 } }
1e00: 20 7b 32 31 20 6f 6e 65 20 32 32 20 74 77 6f 20   {21 one 22 two 
1e10: 32 33 20 74 68 72 65 65 7d 0a 0a 20 20 23 20 49  23 three}..  # I
1e20: 6e 73 74 61 6c 6c 20 61 20 62 75 73 79 2d 68 61  nstall a busy-ha
1e30: 6e 64 6c 65 72 20 66 6f 72 20 63 6f 6e 6e 65 63  ndler for connec
1e40: 74 69 6f 6e 20 5b 64 62 5d 2e 0a 20 20 23 0a 20  tion [db]..  #. 
1e50: 20 73 65 74 20 3a 3a 6e 62 75 73 79 20 5b 6c 69   set ::nbusy [li
1e60: 73 74 5d 0a 20 20 70 72 6f 63 20 62 75 73 79 20  st].  proc busy 
1e70: 7b 6e 7d 20 7b 0a 20 20 20 20 6c 61 70 70 65 6e  {n} {.    lappen
1e80: 64 20 3a 3a 6e 62 75 73 79 20 24 6e 0a 20 20 20  d ::nbusy $n.   
1e90: 20 69 66 20 7b 24 6e 3e 35 7d 20 7b 20 73 71 6c   if {$n>5} { sql
1ea0: 32 20 43 4f 4d 4d 49 54 20 7d 0a 20 20 20 20 72  2 COMMIT }.    r
1eb0: 65 74 75 72 6e 20 30 0a 20 20 7d 0a 20 20 64 62  eturn 0.  }.  db
1ec0: 20 62 75 73 79 20 62 75 73 79 0a 0a 20 20 64 6f   busy busy..  do
1ed0: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e  _test pager1-$tn
1ee0: 2e 32 39 20 7b 20 0a 20 20 20 20 73 71 6c 31 20  .29 { .    sql1 
1ef0: 7b 20 42 45 47 49 4e 20 3b 20 49 4e 53 45 52 54  { BEGIN ; INSERT
1f00: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
1f10: 27 78 27 2c 20 27 79 27 29 20 7d 20 0a 20 20 7d  'x', 'y') } .  }
1f20: 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61   {}.  do_test pa
1f30: 67 65 72 31 2d 24 74 6e 2e 33 30 20 7b 20 0a 20  ger1-$tn.30 { . 
1f40: 20 20 20 73 71 6c 32 20 7b 20 42 45 47 49 4e 20     sql2 { BEGIN 
1f50: 3b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  ; SELECT * FROM 
1f60: 74 31 20 7d 20 0a 20 20 7d 20 7b 32 31 20 6f 6e  t1 } .  } {21 on
1f70: 65 20 32 32 20 74 77 6f 20 32 33 20 74 68 72 65  e 22 two 23 thre
1f80: 65 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67  e}.  do_test pag
1f90: 65 72 31 2d 24 74 6e 2e 33 31 20 7b 20 73 71 6c  er1-$tn.31 { sql
1fa0: 31 20 43 4f 4d 4d 49 54 20 7d 20 7b 7d 0a 20 20  1 COMMIT } {}.  
1fb0: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24  do_test pager1-$
1fc0: 74 6e 2e 33 32 20 7b 20 73 65 74 20 3a 3a 6e 62  tn.32 { set ::nb
1fd0: 75 73 79 20 7d 20 7b 30 20 31 20 32 20 33 20 34  usy } {0 1 2 3 4
1fe0: 20 35 20 36 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d   5 6}.}..#------
1ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2030: 2d 2d 2d 0a 23 20 53 61 76 65 70 6f 69 6e 74 20  ---.# Savepoint 
2040: 72 65 6c 61 74 65 64 20 74 65 73 74 20 63 61 73  related test cas
2050: 65 73 2e 0a 23 0a 23 20 70 61 67 65 72 31 2d 33  es..#.# pager1-3
2060: 2e 31 2e 32 2e 2a 3a 20 46 6f 72 63 65 20 61 20  .1.2.*: Force a 
2070: 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61  savepoint rollba
2080: 63 6b 20 74 6f 20 63 61 75 73 65 20 74 68 65 20  ck to cause the 
2090: 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 23 20  database file.# 
20a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20b0: 74 6f 20 67 72 6f 77 2e 0a 23 0a 23 20 70 61 67  to grow..#.# pag
20c0: 65 72 31 2d 33 2e 31 2e 33 2e 2a 3a 20 55 73 65  er1-3.1.3.*: Use
20d0: 20 61 20 6a 6f 75 72 6e 61 6c 20 63 72 65 61 74   a journal creat
20e0: 65 64 20 69 6e 20 73 79 6e 63 68 72 6f 6e 6f 75  ed in synchronou
20f0: 73 3d 6f 66 66 20 6d 6f 64 65 20 61 73 20 70 61  s=off mode as pa
2100: 72 74 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  rt.#            
2110: 20 20 20 20 20 6f 66 20 61 20 73 61 76 65 70 6f       of a savepo
2120: 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 2e 0a 23 20  int rollback..# 
2130: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
2140: 33 2e 31 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73  3.1.1 {.  faults
2150: 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65  im_delete_and_re
2160: 6f 70 65 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b  open.  execsql {
2170: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
2180: 45 20 74 31 28 61 20 50 52 49 4d 41 52 59 20 4b  E t1(a PRIMARY K
2190: 45 59 2c 20 62 29 3b 0a 20 20 20 20 43 52 45 41  EY, b);.    CREA
21a0: 54 45 20 54 41 42 4c 45 20 63 6f 75 6e 74 65 72  TE TABLE counter
21b0: 28 0a 20 20 20 20 20 20 69 20 43 48 45 43 4b 20  (.      i CHECK 
21c0: 28 69 3c 35 29 2c 20 0a 20 20 20 20 20 20 75 20  (i<5), .      u 
21d0: 43 48 45 43 4b 20 28 75 3c 31 30 29 0a 20 20 20  CHECK (u<10).   
21e0: 20 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49   );.    INSERT I
21f0: 4e 54 4f 20 63 6f 75 6e 74 65 72 20 56 41 4c 55  NTO counter VALU
2200: 45 53 28 30 2c 20 30 29 3b 0a 20 20 20 20 43 52  ES(0, 0);.    CR
2210: 45 41 54 45 20 54 52 49 47 47 45 52 20 74 72 31  EATE TRIGGER tr1
2220: 20 41 46 54 45 52 20 49 4e 53 45 52 54 20 4f 4e   AFTER INSERT ON
2230: 20 74 31 20 42 45 47 49 4e 0a 20 20 20 20 20 20   t1 BEGIN.      
2240: 55 50 44 41 54 45 20 63 6f 75 6e 74 65 72 20 53  UPDATE counter S
2250: 45 54 20 69 20 3d 20 69 2b 31 3b 0a 20 20 20 20  ET i = i+1;.    
2260: 45 4e 44 3b 0a 20 20 20 20 43 52 45 41 54 45 20  END;.    CREATE 
2270: 54 52 49 47 47 45 52 20 74 72 32 20 41 46 54 45  TRIGGER tr2 AFTE
2280: 52 20 55 50 44 41 54 45 20 4f 4e 20 74 31 20 42  R UPDATE ON t1 B
2290: 45 47 49 4e 0a 20 20 20 20 20 20 55 50 44 41 54  EGIN.      UPDAT
22a0: 45 20 63 6f 75 6e 74 65 72 20 53 45 54 20 75 20  E counter SET u 
22b0: 3d 20 75 2b 31 3b 0a 20 20 20 20 45 4e 44 3b 0a  = u+1;.    END;.
22c0: 20 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20    }.  execsql { 
22d0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 63 6f  SELECT * FROM co
22e0: 75 6e 74 65 72 20 7d 0a 7d 20 7b 30 20 30 7d 0a  unter }.} {0 0}.
22f0: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
2300: 20 70 61 67 65 72 31 2d 33 2e 31 2e 32 20 7b 0a   pager1-3.1.2 {.
2310: 20 20 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73    PRAGMA cache_s
2320: 69 7a 65 20 3d 20 31 30 3b 0a 20 20 42 45 47 49  ize = 10;.  BEGI
2330: 4e 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  N;.    INSERT IN
2340: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20  TO t1 VALUES(1, 
2350: 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29  randomblob(1500)
2360: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
2370: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 32 2c 20  TO t1 VALUES(2, 
2380: 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29  randomblob(1500)
2390: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
23a0: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 33 2c 20  TO t1 VALUES(3, 
23b0: 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29  randomblob(1500)
23c0: 29 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20  );.    SELECT * 
23d0: 46 52 4f 4d 20 63 6f 75 6e 74 65 72 3b 0a 7d 20  FROM counter;.} 
23e0: 7b 33 20 30 7d 0a 64 6f 5f 63 61 74 63 68 73 71  {3 0}.do_catchsq
23f0: 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 33 2e  l_test pager1-3.
2400: 31 2e 33 20 7b 0a 20 20 20 20 49 4e 53 45 52 54  1.3 {.    INSERT
2410: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
2420: 61 2b 33 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  a+3, randomblob(
2430: 31 35 30 30 29 20 46 52 4f 4d 20 74 31 0a 7d 20  1500) FROM t1.} 
2440: 7b 31 20 7b 63 6f 6e 73 74 72 61 69 6e 74 20 66  {1 {constraint f
2450: 61 69 6c 65 64 7d 7d 0a 64 6f 5f 65 78 65 63 73  ailed}}.do_execs
2460: 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 33  ql_test pager1-3
2470: 2e 34 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52  .4 { SELECT * FR
2480: 4f 4d 20 63 6f 75 6e 74 65 72 20 7d 20 7b 33 20  OM counter } {3 
2490: 30 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  0}.do_execsql_te
24a0: 73 74 20 70 61 67 65 72 31 2d 33 2e 35 20 7b 20  st pager1-3.5 { 
24b0: 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31  SELECT a FROM t1
24c0: 20 7d 20 7b 31 20 32 20 33 7d 0a 64 6f 5f 65 78   } {1 2 3}.do_ex
24d0: 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72  ecsql_test pager
24e0: 31 2d 33 2e 36 20 7b 20 43 4f 4d 4d 49 54 20 7d  1-3.6 { COMMIT }
24f0: 20 7b 7d 0a 0a 66 6f 72 65 61 63 68 20 7b 74 6e   {}..foreach {tn
2500: 20 73 71 6c 20 74 63 6c 7d 20 7b 0a 20 20 37 20   sql tcl} {.  7 
2510: 20 7b 20 50 52 41 47 4d 41 20 73 79 6e 63 68 72   { PRAGMA synchr
2520: 6f 6e 6f 75 73 20 3d 20 4e 4f 52 4d 41 4c 20 3b  onous = NORMAL ;
2530: 20 50 52 41 47 4d 41 20 74 65 6d 70 5f 73 74 6f   PRAGMA temp_sto
2540: 72 65 20 3d 20 30 20 7d 20 7b 0a 20 20 20 20 74  re = 0 } {.    t
2550: 65 73 74 76 66 73 20 74 76 20 2d 64 65 66 61 75  estvfs tv -defau
2560: 6c 74 20 31 0a 20 20 20 20 74 76 20 64 65 76 63  lt 1.    tv devc
2570: 68 61 72 20 73 61 66 65 5f 61 70 70 65 6e 64 0a  har safe_append.
2580: 20 20 7d 0a 20 20 38 20 20 7b 20 50 52 41 47 4d    }.  8  { PRAGM
2590: 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 3d 20  A synchronous = 
25a0: 4e 4f 52 4d 41 4c 20 3b 20 50 52 41 47 4d 41 20  NORMAL ; PRAGMA 
25b0: 74 65 6d 70 5f 73 74 6f 72 65 20 3d 20 32 20 7d  temp_store = 2 }
25c0: 20 7b 0a 20 20 20 20 74 65 73 74 76 66 73 20 74   {.    testvfs t
25d0: 76 20 2d 64 65 66 61 75 6c 74 20 31 0a 20 20 20  v -default 1.   
25e0: 20 74 76 20 64 65 76 63 68 61 72 20 73 65 71 75   tv devchar sequ
25f0: 65 6e 74 69 61 6c 0a 20 20 7d 0a 20 20 39 20 20  ential.  }.  9  
2600: 7b 20 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f  { PRAGMA synchro
2610: 6e 6f 75 73 20 3d 20 46 55 4c 4c 20 7d 20 7b 20  nous = FULL } { 
2620: 7d 0a 20 20 31 30 20 7b 20 50 52 41 47 4d 41 20  }.  10 { PRAGMA 
2630: 73 79 6e 63 68 72 6f 6e 6f 75 73 20 3d 20 4e 4f  synchronous = NO
2640: 52 4d 41 4c 20 7d 20 7b 20 7d 0a 20 20 31 31 20  RMAL } { }.  11 
2650: 7b 20 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f  { PRAGMA synchro
2660: 6e 6f 75 73 20 3d 20 4f 46 46 20 7d 20 7b 20 7d  nous = OFF } { }
2670: 0a 20 20 31 32 20 7b 20 50 52 41 47 4d 41 20 73  .  12 { PRAGMA s
2680: 79 6e 63 68 72 6f 6e 6f 75 73 20 3d 20 46 55 4c  ynchronous = FUL
2690: 4c 20 3b 20 50 52 41 47 4d 41 20 66 75 6c 6c 66  L ; PRAGMA fullf
26a0: 73 79 6e 63 20 3d 20 31 20 7d 20 7b 20 7d 0a 20  sync = 1 } { }. 
26b0: 20 31 33 20 7b 20 50 52 41 47 4d 41 20 73 79 6e   13 { PRAGMA syn
26c0: 63 68 72 6f 6e 6f 75 73 20 3d 20 46 55 4c 4c 20  chronous = FULL 
26d0: 7d 20 7b 0a 20 20 20 20 74 65 73 74 76 66 73 20  } {.    testvfs 
26e0: 74 76 20 2d 64 65 66 61 75 6c 74 20 31 0a 20 20  tv -default 1.  
26f0: 20 20 74 76 20 64 65 76 63 68 61 72 20 73 65 71    tv devchar seq
2700: 75 65 6e 74 69 61 6c 0a 20 20 7d 0a 20 20 31 34  uential.  }.  14
2710: 20 7b 20 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e   { PRAGMA lockin
2720: 67 5f 6d 6f 64 65 20 3d 20 45 58 43 4c 55 53 49  g_mode = EXCLUSI
2730: 56 45 20 7d 20 7b 0a 20 20 7d 0a 7d 20 7b 0a 20  VE } {.  }.} {. 
2740: 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
2750: 33 2e 24 74 6e 2e 31 20 7b 0a 20 20 20 20 65 76  3.$tn.1 {.    ev
2760: 61 6c 20 24 74 63 6c 0a 20 20 20 20 66 61 75 6c  al $tcl.    faul
2770: 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f  tsim_delete_and_
2780: 72 65 6f 70 65 6e 0a 20 20 20 20 64 62 20 66 75  reopen.    db fu
2790: 6e 63 20 61 5f 73 74 72 69 6e 67 20 61 5f 73 74  nc a_string a_st
27a0: 72 69 6e 67 0a 20 20 20 20 65 78 65 63 73 71 6c  ring.    execsql
27b0: 20 24 73 71 6c 0a 20 20 20 20 65 78 65 63 73 71   $sql.    execsq
27c0: 6c 20 7b 0a 20 20 20 20 20 20 50 52 41 47 4d 41  l {.      PRAGMA
27d0: 20 61 75 74 6f 5f 76 61 63 75 75 6d 20 3d 20 32   auto_vacuum = 2
27e0: 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 63  ;.      PRAGMA c
27f0: 61 63 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b 0a  ache_size = 10;.
2800: 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42        CREATE TAB
2810: 4c 45 20 7a 28 78 20 49 4e 54 45 47 45 52 20 50  LE z(x INTEGER P
2820: 52 49 4d 41 52 59 20 4b 45 59 2c 20 79 29 3b 0a  RIMARY KEY, y);.
2830: 20 20 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20        BEGIN;.   
2840: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
2850: 20 7a 20 56 41 4c 55 45 53 28 4e 55 4c 4c 2c 20   z VALUES(NULL, 
2860: 61 5f 73 74 72 69 6e 67 28 38 30 30 29 29 3b 0a  a_string(800));.
2870: 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49          INSERT I
2880: 4e 54 4f 20 7a 20 53 45 4c 45 43 54 20 4e 55 4c  NTO z SELECT NUL
2890: 4c 2c 20 61 5f 73 74 72 69 6e 67 28 38 30 30 29  L, a_string(800)
28a0: 20 46 52 4f 4d 20 7a 3b 20 20 20 20 20 2d 2d 20   FROM z;     -- 
28b0: 20 20 32 0a 20 20 20 20 20 20 20 20 49 4e 53 45    2.        INSE
28c0: 52 54 20 49 4e 54 4f 20 7a 20 53 45 4c 45 43 54  RT INTO z SELECT
28d0: 20 4e 55 4c 4c 2c 20 61 5f 73 74 72 69 6e 67 28   NULL, a_string(
28e0: 38 30 30 29 20 46 52 4f 4d 20 7a 3b 20 20 20 20  800) FROM z;    
28f0: 20 2d 2d 20 20 20 34 0a 20 20 20 20 20 20 20 20   --   4.        
2900: 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a 20 53 45  INSERT INTO z SE
2910: 4c 45 43 54 20 4e 55 4c 4c 2c 20 61 5f 73 74 72  LECT NULL, a_str
2920: 69 6e 67 28 38 30 30 29 20 46 52 4f 4d 20 7a 3b  ing(800) FROM z;
2930: 20 20 20 20 20 2d 2d 20 20 20 38 0a 20 20 20 20       --   8.    
2940: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
2950: 7a 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 61  z SELECT NULL, a
2960: 5f 73 74 72 69 6e 67 28 38 30 30 29 20 46 52 4f  _string(800) FRO
2970: 4d 20 7a 3b 20 20 20 20 20 2d 2d 20 20 31 36 0a  M z;     --  16.
2980: 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49          INSERT I
2990: 4e 54 4f 20 7a 20 53 45 4c 45 43 54 20 4e 55 4c  NTO z SELECT NUL
29a0: 4c 2c 20 61 5f 73 74 72 69 6e 67 28 38 30 30 29  L, a_string(800)
29b0: 20 46 52 4f 4d 20 7a 3b 20 20 20 20 20 2d 2d 20   FROM z;     -- 
29c0: 20 33 32 0a 20 20 20 20 20 20 20 20 49 4e 53 45   32.        INSE
29d0: 52 54 20 49 4e 54 4f 20 7a 20 53 45 4c 45 43 54  RT INTO z SELECT
29e0: 20 4e 55 4c 4c 2c 20 61 5f 73 74 72 69 6e 67 28   NULL, a_string(
29f0: 38 30 30 29 20 46 52 4f 4d 20 7a 3b 20 20 20 20  800) FROM z;    
2a00: 20 2d 2d 20 20 36 34 0a 20 20 20 20 20 20 20 20   --  64.        
2a10: 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a 20 53 45  INSERT INTO z SE
2a20: 4c 45 43 54 20 4e 55 4c 4c 2c 20 61 5f 73 74 72  LECT NULL, a_str
2a30: 69 6e 67 28 38 30 30 29 20 46 52 4f 4d 20 7a 3b  ing(800) FROM z;
2a40: 20 20 20 20 20 2d 2d 20 31 32 38 0a 20 20 20 20       -- 128.    
2a50: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
2a60: 7a 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 61  z SELECT NULL, a
2a70: 5f 73 74 72 69 6e 67 28 38 30 30 29 20 46 52 4f  _string(800) FRO
2a80: 4d 20 7a 3b 20 20 20 20 20 2d 2d 20 32 35 36 0a  M z;     -- 256.
2a90: 20 20 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20        COMMIT;.  
2aa0: 20 20 7d 0a 20 20 20 20 65 78 65 63 73 71 6c 20    }.    execsql 
2ab0: 7b 20 50 52 41 47 4d 41 20 61 75 74 6f 5f 76 61  { PRAGMA auto_va
2ac0: 63 75 75 6d 20 7d 0a 20 20 7d 20 7b 32 7d 0a 20  cuum }.  } {2}. 
2ad0: 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74   do_execsql_test
2ae0: 20 70 61 67 65 72 31 2d 33 2e 24 74 6e 2e 32 20   pager1-3.$tn.2 
2af0: 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20  {.    BEGIN;.   
2b00: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a     INSERT INTO z
2b10: 20 56 41 4c 55 45 53 28 4e 55 4c 4c 2c 20 61 5f   VALUES(NULL, a_
2b20: 73 74 72 69 6e 67 28 38 30 30 29 29 3b 0a 20 20  string(800));.  
2b30: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
2b40: 7a 20 56 41 4c 55 45 53 28 4e 55 4c 4c 2c 20 61  z VALUES(NULL, a
2b50: 5f 73 74 72 69 6e 67 28 38 30 30 29 29 3b 0a 20  _string(800));. 
2b60: 20 20 20 20 20 53 41 56 45 50 4f 49 4e 54 20 6f       SAVEPOINT o
2b70: 6e 65 3b 0a 20 20 20 20 20 20 20 20 55 50 44 41  ne;.        UPDA
2b80: 54 45 20 7a 20 53 45 54 20 79 20 3d 20 4e 55 4c  TE z SET y = NUL
2b90: 4c 20 57 48 45 52 45 20 78 3e 32 35 36 3b 0a 20  L WHERE x>256;. 
2ba0: 20 20 20 20 20 20 20 50 52 41 47 4d 41 20 69 6e         PRAGMA in
2bb0: 63 72 65 6d 65 6e 74 61 6c 5f 76 61 63 75 75 6d  cremental_vacuum
2bc0: 3b 0a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54  ;.        SELECT
2bd0: 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 7a   count(*) FROM z
2be0: 20 57 48 45 52 45 20 78 20 3c 20 31 30 30 3b 0a   WHERE x < 100;.
2bf0: 20 20 20 20 20 20 52 4f 4c 4c 42 41 43 4b 20 54        ROLLBACK T
2c00: 4f 20 6f 6e 65 3b 0a 20 20 20 20 43 4f 4d 4d 49  O one;.    COMMI
2c10: 54 3b 0a 20 20 7d 20 7b 39 39 7d 0a 0a 20 20 64  T;.  } {99}..  d
2c20: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70  o_execsql_test p
2c30: 61 67 65 72 31 2d 33 2e 24 74 6e 2e 33 20 7b 0a  ager1-3.$tn.3 {.
2c40: 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20      BEGIN;.     
2c50: 20 53 41 56 45 50 4f 49 4e 54 20 6f 6e 65 3b 0a   SAVEPOINT one;.
2c60: 20 20 20 20 20 20 20 20 55 50 44 41 54 45 20 7a          UPDATE z
2c70: 20 53 45 54 20 79 20 3d 20 79 7c 7c 78 3b 0a 20   SET y = y||x;. 
2c80: 20 20 20 20 20 52 4f 4c 4c 42 41 43 4b 20 54 4f       ROLLBACK TO
2c90: 20 6f 6e 65 3b 0a 20 20 20 20 43 4f 4d 4d 49 54   one;.    COMMIT
2ca0: 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75  ;.    SELECT cou
2cb0: 6e 74 28 2a 29 20 46 52 4f 4d 20 7a 3b 0a 20 20  nt(*) FROM z;.  
2cc0: 7d 20 7b 32 35 38 7d 0a 0a 20 20 64 6f 5f 65 78  } {258}..  do_ex
2cd0: 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72  ecsql_test pager
2ce0: 31 2d 33 2e 24 74 6e 2e 34 20 7b 0a 20 20 20 20  1-3.$tn.4 {.    
2cf0: 53 41 56 45 50 4f 49 4e 54 20 6f 6e 65 3b 0a 20  SAVEPOINT one;. 
2d00: 20 20 20 20 20 55 50 44 41 54 45 20 7a 20 53 45       UPDATE z SE
2d10: 54 20 79 20 3d 20 79 7c 7c 78 3b 0a 20 20 20 20  T y = y||x;.    
2d20: 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 6f 6e 65 3b  ROLLBACK TO one;
2d30: 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 65 78 65  .  } {}.  do_exe
2d40: 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31  csql_test pager1
2d50: 2d 33 2e 24 74 6e 2e 35 20 7b 0a 20 20 20 20 53  -3.$tn.5 {.    S
2d60: 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
2d70: 52 4f 4d 20 7a 3b 0a 20 20 20 20 52 45 4c 45 41  ROM z;.    RELEA
2d80: 53 45 20 6f 6e 65 3b 0a 20 20 20 20 50 52 41 47  SE one;.    PRAG
2d90: 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65  MA integrity_che
2da0: 63 6b 3b 0a 20 20 7d 20 7b 32 35 38 20 6f 6b 7d  ck;.  } {258 ok}
2db0: 0a 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74  ..  do_execsql_t
2dc0: 65 73 74 20 70 61 67 65 72 31 2d 33 2e 24 74 6e  est pager1-3.$tn
2dd0: 2e 36 20 7b 0a 20 20 20 20 53 41 56 45 50 4f 49  .6 {.    SAVEPOI
2de0: 4e 54 20 6f 6e 65 3b 0a 20 20 20 20 52 45 4c 45  NT one;.    RELE
2df0: 41 53 45 20 6f 6e 65 3b 0a 20 20 7d 20 7b 7d 0a  ASE one;.  } {}.
2e00: 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 63 61  .  db close.  ca
2e10: 74 63 68 20 7b 20 74 76 20 64 65 6c 65 74 65 20  tch { tv delete 
2e20: 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }.}..#----------
2e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
2e70: 23 20 48 6f 74 20 6a 6f 75 72 6e 61 6c 20 72 6f  # Hot journal ro
2e80: 6c 6c 62 61 63 6b 20 72 65 6c 61 74 65 64 20 74  llback related t
2e90: 65 73 74 20 63 61 73 65 73 2e 0a 23 0a 23 20 70  est cases..#.# p
2ea0: 61 67 65 72 31 2e 34 2e 31 2e 2a 3a 20 54 65 73  ager1.4.1.*: Tes
2eb0: 74 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  t that the pager
2ec0: 20 6d 6f 64 75 6c 65 20 64 65 6c 65 74 65 73 20   module deletes 
2ed0: 76 65 72 79 20 73 6d 61 6c 6c 20 69 6e 76 61 6c  very small inval
2ee0: 69 64 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  id.#            
2ef0: 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73     journal files
2f00: 2e 0a 23 0a 23 20 70 61 67 65 72 31 2e 34 2e 32  ..#.# pager1.4.2
2f10: 2e 2a 3a 20 54 65 73 74 20 74 68 61 74 20 69 66  .*: Test that if
2f20: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
2f30: 6e 61 6c 20 70 6f 69 6e 74 65 72 20 61 74 20 74  nal pointer at t
2f40: 68 65 20 65 6e 64 20 6f 66 20 61 0a 23 20 20 20  he end of a.#   
2f50: 20 20 20 20 20 20 20 20 20 20 20 20 68 6f 74 2d              hot-
2f60: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 70 70  journal file app
2f70: 65 61 72 73 20 74 6f 20 62 65 20 63 6f 72 72 75  ears to be corru
2f80: 70 74 20 28 63 68 65 63 6b 73 75 6d 20 64 6f 65  pt (checksum doe
2f90: 73 20 6e 6f 74 0a 23 20 20 20 20 20 20 20 20 20  s not.#         
2fa0: 20 20 20 20 20 20 63 6f 6d 70 75 74 65 29 20 74        compute) t
2fb0: 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 6a 6f  he associated jo
2fc0: 75 72 6e 61 6c 20 69 73 20 72 6f 6c 6c 65 64 20  urnal is rolled 
2fd0: 62 61 63 6b 20 28 61 6e 64 20 6e 6f 0a 23 20 20  back (and no.#  
2fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 78 41 63               xAc
2ff0: 63 65 73 73 28 29 20 63 61 6c 6c 20 74 6f 20 63  cess() call to c
3000: 68 65 63 6b 20 66 6f 72 20 74 68 65 20 70 72 65  heck for the pre
3010: 73 65 6e 63 65 20 6f 66 20 61 6e 79 20 6d 61 73  sence of any mas
3020: 74 65 72 20 0a 23 20 20 20 20 20 20 20 20 20 20  ter .#          
3030: 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c       journal fil
3040: 65 20 69 73 20 6d 61 64 65 29 2e 0a 23 0a 23 20  e is made)..#.# 
3050: 70 61 67 65 72 31 2e 34 2e 33 2e 2a 3a 20 54 65  pager1.4.3.*: Te
3060: 73 74 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74  st that the cont
3070: 65 6e 74 73 20 6f 66 20 61 20 68 6f 74 2d 6a 6f  ents of a hot-jo
3080: 75 72 6e 61 6c 20 61 72 65 20 69 67 6e 6f 72 65  urnal are ignore
3090: 64 20 69 66 20 74 68 65 0a 23 20 20 20 20 20 20  d if the.#      
30a0: 20 20 20 20 20 20 20 20 20 70 61 67 65 2d 73 69           page-si
30b0: 7a 65 20 6f 72 20 73 65 63 74 6f 72 2d 73 69 7a  ze or sector-siz
30c0: 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e in the journal
30d0: 20 68 65 61 64 65 72 20 61 70 70 65 61 72 20 74   header appear t
30e0: 6f 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20  o.#             
30f0: 20 20 62 65 20 69 6e 76 61 6c 69 64 20 28 74 6f    be invalid (to
3100: 6f 20 6c 61 72 67 65 2c 20 74 6f 6f 20 73 6d 61  o large, too sma
3110: 6c 6c 20 6f 72 20 6e 6f 74 20 61 20 70 6f 77 65  ll or not a powe
3120: 72 20 6f 66 20 32 29 2e 0a 23 0a 23 20 70 61 67  r of 2)..#.# pag
3130: 65 72 31 2e 34 2e 34 2e 2a 3a 20 54 65 73 74 20  er1.4.4.*: Test 
3140: 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
3150: 62 61 63 6b 20 6f 66 20 6a 6f 75 72 6e 61 6c 20  back of journal 
3160: 66 69 6c 65 20 77 69 74 68 20 61 20 6d 61 73 74  file with a mast
3170: 65 72 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  er.#            
3180: 20 20 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74     journal point
3190: 65 72 20 67 65 6e 65 72 61 74 65 64 20 69 6e 20  er generated in 
31a0: 76 61 72 69 6f 75 73 20 22 50 52 41 47 4d 41 20  various "PRAGMA 
31b0: 73 79 6e 63 68 72 6f 6e 6f 75 73 22 0a 23 20 20  synchronous".#  
31c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 6f 64               mod
31d0: 65 73 2e 0a 23 0a 23 20 70 61 67 65 72 31 2e 34  es..#.# pager1.4
31e0: 2e 35 2e 2a 3a 20 54 65 73 74 20 74 68 61 74 20  .5.*: Test that 
31f0: 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
3200: 62 61 63 6b 20 73 74 6f 70 73 20 69 66 20 69 74  back stops if it
3210: 20 65 6e 63 6f 75 6e 74 65 72 73 20 61 0a 23 20   encounters a.# 
3220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6a 6f                jo
3230: 75 72 6e 61 6c 2d 72 65 63 6f 72 64 20 66 6f 72  urnal-record for
3240: 20 77 68 69 63 68 20 74 68 65 20 63 68 65 63 6b   which the check
3250: 73 75 6d 20 66 61 69 6c 73 2e 0a 23 0a 23 20 70  sum fails..#.# p
3260: 61 67 65 72 31 2e 34 2e 36 2e 2a 3a 20 54 65 73  ager1.4.6.*: Tes
3270: 74 20 74 68 61 74 20 77 68 65 6e 20 72 6f 6c 6c  t that when roll
3280: 69 6e 67 20 62 61 63 6b 20 61 20 68 6f 74 2d 6a  ing back a hot-j
3290: 6f 75 72 6e 61 6c 20 74 68 61 74 20 63 6f 6e 74  ournal that cont
32a0: 61 69 6e 73 20 61 0a 23 20 20 20 20 20 20 20 20  ains a.#        
32b0: 20 20 20 20 20 20 20 6d 61 73 74 65 72 20 6a 6f         master jo
32c0: 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 2c 20 74  urnal pointer, t
32d0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
32e0: 6c 20 66 69 6c 65 20 69 73 20 64 65 6c 65 74 65  l file is delete
32f0: 64 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20  d.#             
3300: 20 20 61 66 74 65 72 20 61 6c 6c 20 74 68 65 20    after all the 
3310: 68 6f 74 2d 6a 6f 75 72 6e 61 6c 73 20 74 68 61  hot-journals tha
3320: 74 20 72 65 66 65 72 20 74 6f 20 69 74 20 61 72  t refer to it ar
3330: 65 20 64 65 6c 65 74 65 64 2e 0a 23 0a 23 20 70  e deleted..#.# p
3340: 61 67 65 72 31 2e 34 2e 37 2e 2a 3a 20 54 65 73  ager1.4.7.*: Tes
3350: 74 20 74 68 61 74 20 69 66 20 61 20 68 6f 74 2d  t that if a hot-
3360: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69  journal file exi
3370: 73 74 73 20 62 75 74 20 61 20 63 6c 69 65 6e 74  sts but a client
3380: 20 63 61 6e 0a 23 20 20 20 20 20 20 20 20 20 20   can.#          
3390: 20 20 20 20 20 6f 70 65 6e 20 69 74 20 66 6f 72       open it for
33a0: 20 72 65 61 64 69 6e 67 20 6f 6e 6c 79 2c 20 74   reading only, t
33b0: 68 65 20 64 61 74 61 62 61 73 65 20 63 61 6e 6e  he database cann
33c0: 6f 74 20 62 65 20 61 63 63 65 73 73 65 64 20 61  ot be accessed a
33d0: 6e 64 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  nd.#            
33e0: 20 20 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50     SQLITE_CANTOP
33f0: 45 4e 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  EN is returned..
3400: 23 20 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  # .do_test pager
3410: 31 2e 34 2e 31 2e 31 20 7b 0a 20 20 66 61 75 6c  1.4.1.1 {.  faul
3420: 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f  tsim_delete_and_
3430: 72 65 6f 70 65 6e 0a 20 20 65 78 65 63 73 71 6c  reopen.  execsql
3440: 20 7b 20 0a 20 20 20 20 43 52 45 41 54 45 20 54   { .    CREATE T
3450: 41 42 4c 45 20 78 28 79 2c 20 7a 29 3b 0a 20 20  ABLE x(y, z);.  
3460: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 20    INSERT INTO x 
3470: 56 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20 20  VALUES(1, 2);.  
3480: 7d 0a 20 20 73 65 74 20 66 64 20 5b 6f 70 65 6e  }.  set fd [open
3490: 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c   test.db-journal
34a0: 20 77 5d 0a 20 20 70 75 74 73 20 2d 6e 6f 6e 65   w].  puts -none
34b0: 77 6c 69 6e 65 20 24 66 64 20 22 68 65 6c 6c 6f  wline $fd "hello
34c0: 77 6f 72 6c 64 22 0a 20 20 63 6c 6f 73 65 20 24  world".  close $
34d0: 66 64 0a 20 20 66 69 6c 65 20 65 78 69 73 74 73  fd.  file exists
34e0: 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c   test.db-journal
34f0: 0a 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73 74 20 70  .} {1}.do_test p
3500: 61 67 65 72 31 2e 34 2e 31 2e 32 20 7b 20 65 78  ager1.4.1.2 { ex
3510: 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a  ecsql { SELECT *
3520: 20 46 52 4f 4d 20 78 20 7d 20 7d 20 7b 31 20 32   FROM x } } {1 2
3530: 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  }.do_test pager1
3540: 2e 34 2e 31 2e 33 20 7b 20 66 69 6c 65 20 65 78  .4.1.3 { file ex
3550: 69 73 74 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75  ists test.db-jou
3560: 72 6e 61 6c 20 7d 20 7b 30 7d 0a 0a 23 20 53 65  rnal } {0}..# Se
3570: 74 20 75 70 20 61 20 5b 74 65 73 74 76 66 73 5d  t up a [testvfs]
3580: 20 74 6f 20 73 6e 61 70 73 68 6f 74 20 74 68 65   to snapshot the
3590: 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 6a 75 73   file-system jus
35a0: 74 20 62 65 66 6f 72 65 20 53 51 4c 69 74 65 0a  t before SQLite.
35b0: 23 20 64 65 6c 65 74 65 73 20 74 68 65 20 6d 61  # deletes the ma
35c0: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 74 6f 20  ster-journal to 
35d0: 63 6f 6d 6d 69 74 20 61 20 6d 75 6c 74 69 2d 66  commit a multi-f
35e0: 69 6c 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ile transaction.
35f0: 0a 23 0a 23 20 49 6e 20 73 75 62 73 65 71 75 65  .#.# In subseque
3600: 6e 74 20 74 65 73 74 20 63 61 73 65 73 2c 20 69  nt test cases, i
3610: 6e 76 6f 6b 69 6e 67 20 5b 66 61 75 6c 74 73 69  nvoking [faultsi
3620: 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65  m_restore_and_re
3630: 6f 70 65 6e 5d 20 73 65 74 73 0a 23 20 75 70 20  open] sets.# up 
3640: 74 68 65 20 66 69 6c 65 20 73 79 73 74 65 6d 20  the file system 
3650: 74 6f 20 63 6f 6e 74 61 69 6e 20 74 77 6f 20 64  to contain two d
3660: 61 74 61 62 61 73 65 73 2c 20 74 77 6f 20 68 6f  atabases, two ho
3670: 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20  t-journal files 
3680: 61 6e 64 0a 23 20 61 20 6d 61 73 74 65 72 2d 6a  and.# a master-j
3690: 6f 75 72 6e 61 6c 2e 0a 23 0a 64 6f 5f 74 65 73  ournal..#.do_tes
36a0: 74 20 70 61 67 65 72 31 2e 34 2e 32 2e 31 20 7b  t pager1.4.2.1 {
36b0: 0a 20 20 74 65 73 74 76 66 73 20 74 73 74 76 66  .  testvfs tstvf
36c0: 73 20 2d 64 65 66 61 75 6c 74 20 31 0a 20 20 74  s -default 1.  t
36d0: 73 74 76 66 73 20 66 69 6c 74 65 72 20 78 44 65  stvfs filter xDe
36e0: 6c 65 74 65 0a 20 20 74 73 74 76 66 73 20 73 63  lete.  tstvfs sc
36f0: 72 69 70 74 20 78 44 65 6c 65 74 65 43 61 6c 6c  ript xDeleteCall
3700: 62 61 63 6b 0a 20 20 70 72 6f 63 20 78 44 65 6c  back.  proc xDel
3710: 65 74 65 43 61 6c 6c 62 61 63 6b 20 7b 6d 65 74  eteCallback {met
3720: 68 6f 64 20 66 69 6c 65 20 61 72 67 73 7d 20 7b  hod file args} {
3730: 0a 20 20 20 20 73 65 74 20 66 69 6c 65 20 5b 66  .    set file [f
3740: 69 6c 65 20 74 61 69 6c 20 24 66 69 6c 65 5d 0a  ile tail $file].
3750: 20 20 20 20 69 66 20 7b 20 5b 73 74 72 69 6e 67      if { [string
3760: 20 6d 61 74 63 68 20 2a 6d 6a 2a 20 24 66 69 6c   match *mj* $fil
3770: 65 5d 20 7d 20 7b 20 66 61 75 6c 74 73 69 6d 5f  e] } { faultsim_
3780: 73 61 76 65 20 7d 0a 20 20 7d 0a 20 20 66 61 75  save }.  }.  fau
3790: 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64  ltsim_delete_and
37a0: 5f 72 65 6f 70 65 6e 0a 20 20 64 62 20 66 75 6e  _reopen.  db fun
37b0: 63 20 61 5f 73 74 72 69 6e 67 20 61 5f 73 74 72  c a_string a_str
37c0: 69 6e 67 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  ing.  execsql {.
37d0: 20 20 20 20 41 54 54 41 43 48 20 27 74 65 73 74      ATTACH 'test
37e0: 2e 64 62 32 27 20 41 53 20 61 75 78 3b 0a 20 20  .db2' AS aux;.  
37f0: 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c    PRAGMA journal
3800: 5f 6d 6f 64 65 20 3d 20 44 45 4c 45 54 45 3b 0a  _mode = DELETE;.
3810: 20 20 20 20 50 52 41 47 4d 41 20 6d 61 69 6e 2e      PRAGMA main.
3820: 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b  cache_size = 10;
3830: 0a 20 20 20 20 50 52 41 47 4d 41 20 61 75 78 2e  .    PRAGMA aux.
3840: 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b  cache_size = 10;
3850: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
3860: 45 20 74 31 28 61 20 55 4e 49 51 55 45 2c 20 62  E t1(a UNIQUE, b
3870: 20 55 4e 49 51 55 45 29 3b 0a 20 20 20 20 43 52   UNIQUE);.    CR
3880: 45 41 54 45 20 54 41 42 4c 45 20 61 75 78 2e 74  EATE TABLE aux.t
3890: 32 28 61 20 55 4e 49 51 55 45 2c 20 62 20 55 4e  2(a UNIQUE, b UN
38a0: 49 51 55 45 29 3b 0a 20 20 20 20 49 4e 53 45 52  IQUE);.    INSER
38b0: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
38c0: 28 61 5f 73 74 72 69 6e 67 28 32 30 30 29 2c 20  (a_string(200), 
38d0: 61 5f 73 74 72 69 6e 67 28 33 30 30 29 29 3b 0a  a_string(300));.
38e0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
38f0: 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69  t1 SELECT a_stri
3900: 6e 67 28 32 30 30 29 2c 20 61 5f 73 74 72 69 6e  ng(200), a_strin
3910: 67 28 33 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a  g(300) FROM t1;.
3920: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
3930: 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69  t1 SELECT a_stri
3940: 6e 67 28 32 30 30 29 2c 20 61 5f 73 74 72 69 6e  ng(200), a_strin
3950: 67 28 33 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a  g(300) FROM t1;.
3960: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
3970: 74 32 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  t2 SELECT * FROM
3980: 20 74 31 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a   t1;.    BEGIN;.
3990: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
39a0: 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74  O t1 SELECT a_st
39b0: 72 69 6e 67 28 32 30 31 29 2c 20 61 5f 73 74 72  ring(201), a_str
39c0: 69 6e 67 28 33 30 31 29 20 46 52 4f 4d 20 74 31  ing(301) FROM t1
39d0: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
39e0: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f  NTO t1 SELECT a_
39f0: 73 74 72 69 6e 67 28 32 30 32 29 2c 20 61 5f 73  string(202), a_s
3a00: 74 72 69 6e 67 28 33 30 32 29 20 46 52 4f 4d 20  tring(302) FROM 
3a10: 74 31 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  t1;.      INSERT
3a20: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
3a30: 61 5f 73 74 72 69 6e 67 28 32 30 33 29 2c 20 61  a_string(203), a
3a40: 5f 73 74 72 69 6e 67 28 33 30 33 29 20 46 52 4f  _string(303) FRO
3a50: 4d 20 74 31 3b 0a 20 20 20 20 20 20 49 4e 53 45  M t1;.      INSE
3a60: 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
3a70: 54 20 61 5f 73 74 72 69 6e 67 28 32 30 34 29 2c  T a_string(204),
3a80: 20 61 5f 73 74 72 69 6e 67 28 33 30 34 29 20 46   a_string(304) F
3a90: 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20 52 45  ROM t1;.      RE
3aa0: 50 4c 41 43 45 20 49 4e 54 4f 20 74 32 20 53 45  PLACE INTO t2 SE
3ab0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a  LECT * FROM t1;.
3ac0: 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a      COMMIT;.  }.
3ad0: 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 74 73 74    db close.  tst
3ae0: 76 66 73 20 64 65 6c 65 74 65 0a 7d 20 7b 7d 0a  vfs delete.} {}.
3af0: 0a 69 66 20 7b 24 3a 3a 74 63 6c 5f 70 6c 61 74  .if {$::tcl_plat
3b00: 66 6f 72 6d 28 70 6c 61 74 66 6f 72 6d 29 21 3d  form(platform)!=
3b10: 22 77 69 6e 64 6f 77 73 22 7d 20 7b 0a 64 6f 5f  "windows"} {.do_
3b20: 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e 32 2e  test pager1.4.2.
3b30: 32 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 72  2 {.  faultsim_r
3b40: 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65  estore_and_reope
3b50: 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  n.  execsql {.  
3b60: 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a    SELECT count(*
3b70: 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 50  ) FROM t1;.    P
3b80: 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f  RAGMA integrity_
3b90: 63 68 65 63 6b 3b 0a 20 20 7d 0a 7d 20 7b 34 20  check;.  }.} {4 
3ba0: 6f 6b 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  ok}.do_test page
3bb0: 72 31 2e 34 2e 32 2e 33 20 7b 0a 20 20 66 61 75  r1.4.2.3 {.  fau
3bc0: 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e  ltsim_restore_an
3bd0: 64 5f 72 65 6f 70 65 6e 0a 20 20 66 6f 72 65 61  d_reopen.  forea
3be0: 63 68 20 66 20 5b 67 6c 6f 62 20 74 65 73 74 2e  ch f [glob test.
3bf0: 64 62 2d 6d 6a 2a 5d 20 7b 20 66 6f 72 63 65 64  db-mj*] { forced
3c00: 65 6c 65 74 65 20 24 66 20 7d 0a 20 20 65 78 65  elete $f }.  exe
3c10: 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43  csql {.    SELEC
3c20: 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
3c30: 74 31 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 69  t1;.    PRAGMA i
3c40: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 3b 0a  ntegrity_check;.
3c50: 20 20 7d 0a 7d 20 7b 36 34 20 6f 6b 7d 0a 64 6f    }.} {64 ok}.do
3c60: 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e 32  _test pager1.4.2
3c70: 2e 34 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f  .4 {.  faultsim_
3c80: 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70  restore_and_reop
3c90: 65 6e 0a 20 20 68 65 78 69 6f 5f 77 72 69 74 65  en.  hexio_write
3ca0: 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c   test.db-journal
3cb0: 20 5b 65 78 70 72 20 5b 66 69 6c 65 20 73 69 7a   [expr [file siz
3cc0: 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61  e test.db-journa
3cd0: 6c 5d 2d 33 30 5d 20 31 32 33 34 35 36 0a 20 20  l]-30] 123456.  
3ce0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45  execsql {.    SE
3cf0: 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
3d00: 4f 4d 20 74 31 3b 0a 20 20 20 20 50 52 41 47 4d  OM t1;.    PRAGM
3d10: 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63  A integrity_chec
3d20: 6b 3b 0a 20 20 7d 0a 7d 20 7b 34 20 6f 6b 7d 0a  k;.  }.} {4 ok}.
3d30: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34  do_test pager1.4
3d40: 2e 32 2e 35 20 7b 0a 20 20 66 61 75 6c 74 73 69  .2.5 {.  faultsi
3d50: 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65  m_restore_and_re
3d60: 6f 70 65 6e 0a 20 20 68 65 78 69 6f 5f 77 72 69  open.  hexio_wri
3d70: 74 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e  te test.db-journ
3d80: 61 6c 20 5b 65 78 70 72 20 5b 66 69 6c 65 20 73  al [expr [file s
3d90: 69 7a 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72  ize test.db-jour
3da0: 6e 61 6c 5d 2d 33 30 5d 20 31 32 33 34 35 36 0a  nal]-30] 123456.
3db0: 20 20 66 6f 72 65 61 63 68 20 66 20 5b 67 6c 6f    foreach f [glo
3dc0: 62 20 74 65 73 74 2e 64 62 2d 6d 6a 2a 5d 20 7b  b test.db-mj*] {
3dd0: 20 66 6f 72 63 65 64 65 6c 65 74 65 20 24 66 20   forcedelete $f 
3de0: 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  }.  execsql {.  
3df0: 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a    SELECT count(*
3e00: 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 50  ) FROM t1;.    P
3e10: 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f  RAGMA integrity_
3e20: 63 68 65 63 6b 3b 0a 20 20 7d 0a 7d 20 7b 34 20  check;.  }.} {4 
3e30: 6f 6b 7d 0a 7d 0a 0a 64 6f 5f 74 65 73 74 20 70  ok}.}..do_test p
3e40: 61 67 65 72 31 2e 34 2e 33 2e 31 20 7b 0a 20 20  ager1.4.3.1 {.  
3e50: 74 65 73 74 76 66 73 20 74 73 74 76 66 73 20 2d  testvfs tstvfs -
3e60: 64 65 66 61 75 6c 74 20 31 0a 20 20 74 73 74 76  default 1.  tstv
3e70: 66 73 20 66 69 6c 74 65 72 20 78 53 79 6e 63 0a  fs filter xSync.
3e80: 20 20 74 73 74 76 66 73 20 73 63 72 69 70 74 20    tstvfs script 
3e90: 78 53 79 6e 63 43 61 6c 6c 62 61 63 6b 0a 20 20  xSyncCallback.  
3ea0: 70 72 6f 63 20 78 53 79 6e 63 43 61 6c 6c 62 61  proc xSyncCallba
3eb0: 63 6b 20 7b 6d 65 74 68 6f 64 20 66 69 6c 65 20  ck {method file 
3ec0: 61 72 67 73 7d 20 7b 0a 20 20 20 20 73 65 74 20  args} {.    set 
3ed0: 66 69 6c 65 20 5b 66 69 6c 65 20 74 61 69 6c 20  file [file tail 
3ee0: 24 66 69 6c 65 5d 0a 20 20 20 20 69 66 20 7b 20  $file].    if { 
3ef0: 30 3d 3d 5b 73 74 72 69 6e 67 20 6d 61 74 63 68  0==[string match
3f00: 20 2a 6a 6f 75 72 6e 61 6c 20 24 66 69 6c 65 5d   *journal $file]
3f10: 20 7d 20 7b 20 66 61 75 6c 74 73 69 6d 5f 73 61   } { faultsim_sa
3f20: 76 65 20 7d 0a 20 20 7d 0a 20 20 66 61 75 6c 74  ve }.  }.  fault
3f30: 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72  sim_delete_and_r
3f40: 65 6f 70 65 6e 0a 20 20 65 78 65 63 73 71 6c 20  eopen.  execsql 
3f50: 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75  {.    PRAGMA jou
3f60: 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c 45  rnal_mode = DELE
3f70: 54 45 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  TE;.    CREATE T
3f80: 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20  ABLE t1(a, b);. 
3f90: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
3fa0: 31 20 56 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a  1 VALUES(1, 2);.
3fb0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
3fc0: 74 31 20 56 41 4c 55 45 53 28 33 2c 20 34 29 3b  t1 VALUES(3, 4);
3fd0: 0a 20 20 7d 0a 20 20 64 62 20 63 6c 6f 73 65 0a  .  }.  db close.
3fe0: 20 20 74 73 74 76 66 73 20 64 65 6c 65 74 65 0a    tstvfs delete.
3ff0: 7d 20 7b 7d 0a 0a 66 6f 72 65 61 63 68 20 7b 74  } {}..foreach {t
4000: 6e 20 6f 66 73 74 20 76 61 6c 75 65 20 72 65 73  n ofst value res
4010: 75 6c 74 7d 20 7b 0a 20 20 20 20 20 20 20 20 20  ult} {.         
4020: 20 32 20 20 20 32 30 20 20 20 20 33 31 20 20 20   2   20    31   
4030: 20 20 20 20 7b 31 20 32 20 33 20 34 7d 0a 20 20      {1 2 3 4}.  
4040: 20 20 20 20 20 20 20 20 33 20 20 20 32 30 20 20          3   20  
4050: 20 20 33 32 20 20 20 20 20 20 20 7b 31 20 32 20    32       {1 2 
4060: 33 20 34 7d 0a 20 20 20 20 20 20 20 20 20 20 34  3 4}.          4
4070: 20 20 20 32 30 20 20 20 20 33 33 20 20 20 20 20     20    33     
4080: 20 20 7b 31 20 32 20 33 20 34 7d 0a 20 20 20 20    {1 2 3 4}.    
4090: 20 20 20 20 20 20 35 20 20 20 32 30 20 20 20 20        5   20    
40a0: 36 35 35 33 36 20 20 20 20 7b 31 20 32 20 33 20  65536    {1 2 3 
40b0: 34 7d 0a 20 20 20 20 20 20 20 20 20 20 36 20 20  4}.          6  
40c0: 20 32 30 20 20 20 20 31 33 31 30 37 32 20 20 20   20    131072   
40d0: 7b 31 20 32 20 33 20 34 7d 0a 0a 20 20 20 20 20  {1 2 3 4}..     
40e0: 20 20 20 20 20 37 20 20 20 32 34 20 20 20 20 35       7   24    5
40f0: 31 31 20 20 20 20 20 20 7b 31 20 32 20 33 20 34  11      {1 2 3 4
4100: 7d 0a 20 20 20 20 20 20 20 20 20 20 38 20 20 20  }.          8   
4110: 32 34 20 20 20 20 35 31 33 20 20 20 20 20 20 7b  24    513      {
4120: 31 20 32 20 33 20 34 7d 0a 20 20 20 20 20 20 20  1 2 3 4}.       
4130: 20 20 20 39 20 20 20 32 34 20 20 20 20 31 33 31     9   24    131
4140: 30 37 32 20 20 20 7b 31 20 32 20 33 20 34 7d 0a  072   {1 2 3 4}.
4150: 0a 20 20 20 20 20 20 20 20 20 31 30 20 20 20 33  .         10   3
4160: 32 20 20 20 20 36 35 35 33 36 20 20 20 20 7b 31  2    65536    {1
4170: 20 32 7d 0a 7d 20 7b 0a 20 20 64 6f 5f 74 65 73   2}.} {.  do_tes
4180: 74 20 70 61 67 65 72 31 2e 34 2e 33 2e 24 74 6e  t pager1.4.3.$tn
4190: 20 7b 0a 20 20 20 20 66 61 75 6c 74 73 69 6d 5f   {.    faultsim_
41a0: 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70  restore_and_reop
41b0: 65 6e 0a 20 20 20 20 68 65 78 69 6f 5f 77 72 69  en.    hexio_wri
41c0: 74 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e  te test.db-journ
41d0: 61 6c 20 24 6f 66 73 74 20 5b 66 6f 72 6d 61 74  al $ofst [format
41e0: 20 25 2e 38 78 20 24 76 61 6c 75 65 5d 0a 20 20   %.8x $value].  
41f0: 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45    execsql { SELE
4200: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 0a 20  CT * FROM t1 }. 
4210: 20 7d 20 24 72 65 73 75 6c 74 0a 7d 0a 64 62 20   } $result.}.db 
4220: 63 6c 6f 73 65 0a 0a 23 20 53 65 74 20 75 70 20  close..# Set up 
4230: 61 20 56 46 53 20 74 68 61 74 20 73 6e 61 70 73  a VFS that snaps
4240: 68 6f 74 73 20 74 68 65 20 66 69 6c 65 2d 73 79  hots the file-sy
4250: 73 74 65 6d 20 6a 75 73 74 20 62 65 66 6f 72 65  stem just before
4260: 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
4270: 6c 0a 23 20 66 69 6c 65 20 69 73 20 64 65 6c 65  l.# file is dele
4280: 74 65 64 20 74 6f 20 63 6f 6d 6d 69 74 20 61 20  ted to commit a 
4290: 6d 75 6c 74 69 2d 66 69 6c 65 20 74 72 61 6e 73  multi-file trans
42a0: 61 63 74 69 6f 6e 2e 20 53 70 65 63 69 66 69 63  action. Specific
42b0: 61 6c 6c 79 2c 20 74 68 65 0a 23 20 66 69 6c 65  ally, the.# file
42c0: 2d 73 79 73 74 65 6d 20 69 73 20 73 61 76 65 64  -system is saved
42d0: 20 6a 75 73 74 20 62 65 66 6f 72 65 20 74 68 65   just before the
42e0: 20 78 44 65 6c 65 74 65 28 29 20 63 61 6c 6c 20   xDelete() call 
42f0: 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 0a 23  to remove the .#
4300: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
4310: 66 69 6c 65 20 66 72 6f 6d 20 74 68 65 20 66 69  file from the fi
4320: 6c 65 2d 73 79 73 74 65 6d 2e 0a 23 0a 73 65 74  le-system..#.set
4330: 20 70 77 64 20 5b 67 65 74 5f 70 77 64 5d 0a 74   pwd [get_pwd].t
4340: 65 73 74 76 66 73 20 74 76 20 2d 64 65 66 61 75  estvfs tv -defau
4350: 6c 74 20 31 0a 74 76 20 73 63 72 69 70 74 20 63  lt 1.tv script c
4360: 6f 70 79 5f 6f 6e 5f 6d 6a 5f 64 65 6c 65 74 65  opy_on_mj_delete
4370: 0a 73 65 74 20 3a 3a 6d 6a 5f 66 69 6c 65 6e 61  .set ::mj_filena
4380: 6d 65 5f 6c 65 6e 67 74 68 20 30 0a 70 72 6f 63  me_length 0.proc
4390: 20 63 6f 70 79 5f 6f 6e 5f 6d 6a 5f 64 65 6c 65   copy_on_mj_dele
43a0: 74 65 20 7b 6d 65 74 68 6f 64 20 66 69 6c 65 6e  te {method filen
43b0: 61 6d 65 20 61 72 67 73 7d 20 7b 0a 20 20 69 66  ame args} {.  if
43c0: 20 7b 5b 73 74 72 69 6e 67 20 6d 61 74 63 68 20   {[string match 
43d0: 2a 6d 6a 2a 20 5b 66 69 6c 65 20 74 61 69 6c 20  *mj* [file tail 
43e0: 24 66 69 6c 65 6e 61 6d 65 5d 5d 7d 20 7b 20 0a  $filename]]} { .
43f0: 20 20 20 20 23 0a 20 20 20 20 23 20 4e 4f 54 45      #.    # NOTE
4400: 3a 20 49 73 20 74 68 65 20 66 69 6c 65 20 6e 61  : Is the file na
4410: 6d 65 20 72 65 6c 61 74 69 76 65 3f 20 20 49 66  me relative?  If
4420: 20 73 6f 2c 20 61 64 64 20 74 68 65 20 6c 65 6e   so, add the len
4430: 67 74 68 20 6f 66 20 74 68 65 20 63 75 72 72 65  gth of the curre
4440: 6e 74 0a 20 20 20 20 23 20 20 20 20 20 20 20 64  nt.    #       d
4450: 69 72 65 63 74 6f 72 79 2e 0a 20 20 20 20 23 0a  irectory..    #.
4460: 20 20 20 20 69 66 20 7b 5b 69 73 5f 72 65 6c 61      if {[is_rela
4470: 74 69 76 65 5f 66 69 6c 65 20 24 66 69 6c 65 6e  tive_file $filen
4480: 61 6d 65 5d 7d 20 7b 0a 20 20 20 20 20 20 73 65  ame]} {.      se
4490: 74 20 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 5f  t ::mj_filename_
44a0: 6c 65 6e 67 74 68 20 5c 0a 20 20 20 20 20 20 20  length \.       
44b0: 20 5b 65 78 70 72 20 7b 5b 73 74 72 69 6e 67 20   [expr {[string 
44c0: 6c 65 6e 67 74 68 20 24 66 69 6c 65 6e 61 6d 65  length $filename
44d0: 5d 20 2b 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67  ] + [string leng
44e0: 74 68 20 24 3a 3a 70 77 64 5d 7d 5d 0a 20 20 20  th $::pwd]}].   
44f0: 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
4500: 73 65 74 20 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d  set ::mj_filenam
4510: 65 5f 6c 65 6e 67 74 68 20 5b 73 74 72 69 6e 67  e_length [string
4520: 20 6c 65 6e 67 74 68 20 24 66 69 6c 65 6e 61 6d   length $filenam
4530: 65 5d 0a 20 20 20 20 7d 0a 20 20 20 20 66 61 75  e].    }.    fau
4540: 6c 74 73 69 6d 5f 73 61 76 65 20 0a 20 20 7d 0a  ltsim_save .  }.
4550: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
4560: 4f 4b 0a 7d 0a 0a 66 6f 72 65 61 63 68 20 7b 74  OK.}..foreach {t
4570: 6e 31 20 74 63 6c 7d 20 7b 0a 20 20 31 20 7b 20  n1 tcl} {.  1 { 
4580: 73 65 74 20 70 72 65 66 69 78 20 22 74 65 73 74  set prefix "test
4590: 2e 64 62 22 20 7d 0a 20 20 32 20 7b 20 0a 20 20  .db" }.  2 { .  
45a0: 20 20 23 20 54 68 69 73 20 74 65 73 74 20 64 65    # This test de
45b0: 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 75 6e 64  pends on the und
45c0: 65 72 6c 79 69 6e 67 20 56 46 53 20 62 65 69 6e  erlying VFS bein
45d0: 67 20 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 70  g able to open p
45e0: 61 74 68 73 0a 20 20 20 20 23 20 35 31 32 20 62  aths.    # 512 b
45f0: 79 74 65 73 20 69 6e 20 6c 65 6e 67 74 68 2e 20  ytes in length. 
4600: 54 68 65 20 69 64 65 61 20 69 73 20 74 6f 20 63  The idea is to c
4610: 72 65 61 74 65 20 61 20 68 6f 74 2d 6a 6f 75 72  reate a hot-jour
4620: 6e 61 6c 20 66 69 6c 65 20 74 68 61 74 0a 20 20  nal file that.  
4630: 20 20 23 20 63 6f 6e 74 61 69 6e 73 20 61 20 6d    # contains a m
4640: 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f  aster-journal po
4650: 69 6e 74 65 72 20 73 6f 20 6c 61 72 67 65 20 74  inter so large t
4660: 68 61 74 20 69 74 20 63 6f 75 6c 64 20 63 6f 6e  hat it could con
4670: 74 61 69 6e 0a 20 20 20 20 23 20 61 20 76 61 6c  tain.    # a val
4680: 69 64 20 70 61 67 65 20 72 65 63 6f 72 64 20 28  id page record (
4690: 69 66 20 74 68 65 20 66 69 6c 65 20 70 61 67 65  if the file page
46a0: 2d 73 69 7a 65 20 69 73 20 35 31 32 20 62 79 74  -size is 512 byt
46b0: 65 73 29 2e 20 53 6f 20 61 73 20 74 6f 0a 20 20  es). So as to.  
46c0: 20 20 23 20 6d 61 6b 65 20 73 75 72 65 20 53 51    # make sure SQ
46d0: 4c 69 74 65 20 64 6f 65 73 6e 27 74 20 67 65 74  Lite doesn't get
46e0: 20 63 6f 6e 66 75 73 65 64 20 62 79 20 74 68 69   confused by thi
46f0: 73 2e 0a 20 20 20 20 23 0a 20 20 20 20 73 65 74  s..    #.    set
4700: 20 6e 50 61 64 64 69 6e 67 20 5b 65 78 70 72 20   nPadding [expr 
4710: 35 31 31 20 2d 20 24 3a 3a 6d 6a 5f 66 69 6c 65  511 - $::mj_file
4720: 6e 61 6d 65 5f 6c 65 6e 67 74 68 5d 0a 20 20 20  name_length].   
4730: 20 69 66 20 7b 24 74 63 6c 5f 70 6c 61 74 66 6f   if {$tcl_platfo
4740: 72 6d 28 70 6c 61 74 66 6f 72 6d 29 3d 3d 22 77  rm(platform)=="w
4750: 69 6e 64 6f 77 73 22 7d 20 7b 0a 20 20 20 20 20  indows"} {.     
4760: 20 23 20 54 42 44 20 6e 65 65 64 20 74 6f 20 66   # TBD need to f
4770: 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 74 6f  igure out how to
4780: 20 64 6f 20 74 68 69 73 20 63 6f 72 72 65 63 74   do this correct
4790: 6c 79 20 66 6f 72 20 57 69 6e 64 6f 77 73 21 21  ly for Windows!!
47a0: 21 0a 20 20 20 20 20 20 73 65 74 20 6e 50 61 64  !.      set nPad
47b0: 64 69 6e 67 20 5b 65 78 70 72 20 32 35 35 20 2d  ding [expr 255 -
47c0: 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 5f   $::mj_filename_
47d0: 6c 65 6e 67 74 68 5d 0a 20 20 20 20 7d 0a 0a 20  length].    }.. 
47e0: 20 20 20 23 20 57 65 20 63 61 6e 6e 6f 74 20 6a     # We cannot j
47f0: 75 73 74 20 63 72 65 61 74 65 20 61 20 72 65 61  ust create a rea
4800: 6c 6c 79 20 6c 6f 6e 67 20 64 61 74 61 62 61 73  lly long databas
4810: 65 20 66 69 6c 65 20 6e 61 6d 65 20 74 6f 20 6f  e file name to o
4820: 70 65 6e 2c 20 61 73 0a 20 20 20 20 23 20 4c 69  pen, as.    # Li
4830: 6e 75 78 20 6c 69 6d 69 74 73 20 61 20 73 69 6e  nux limits a sin
4840: 67 6c 65 20 63 6f 6d 70 6f 6e 65 6e 74 20 6f 66  gle component of
4850: 20 61 20 70 61 74 68 20 74 6f 20 32 35 35 20 62   a path to 255 b
4860: 79 74 65 73 20 62 79 20 64 65 66 61 75 6c 74 0a  ytes by default.
4870: 20 20 20 20 23 20 28 61 6e 64 20 70 72 65 73 75      # (and presu
4880: 6d 61 62 6c 79 20 6f 74 68 65 72 20 73 79 73 74  mably other syst
4890: 65 6d 73 20 68 61 76 65 20 6c 69 6d 69 74 73 20  ems have limits 
48a0: 74 6f 6f 29 2e 20 53 6f 20 63 72 65 61 74 65 20  too). So create 
48b0: 61 20 64 69 72 65 63 74 6f 72 79 0a 20 20 20 20  a directory.    
48c0: 23 20 68 69 65 72 61 72 63 68 79 20 74 6f 20 77  # hierarchy to w
48d0: 6f 72 6b 20 69 6e 2e 0a 20 20 20 20 23 0a 20 20  ork in..    #.  
48e0: 20 20 73 65 74 20 64 69 72 6e 61 6d 65 20 22 64    set dirname "d
48f0: 31 32 33 34 35 36 37 38 39 30 31 32 33 34 35 36  1234567890123456
4900: 37 38 39 30 31 32 33 34 35 36 37 38 39 30 2f 22  78901234567890/"
4910: 0a 20 20 20 20 73 65 74 20 6e 44 69 72 20 5b 65  .    set nDir [e
4920: 78 70 72 20 24 6e 50 61 64 64 69 6e 67 20 2f 20  xpr $nPadding / 
4930: 33 32 5d 0a 20 20 20 20 69 66 20 7b 20 24 6e 44  32].    if { $nD
4940: 69 72 20 7d 20 7b 0a 20 20 20 20 20 20 73 65 74  ir } {.      set
4950: 20 70 20 5b 73 74 72 69 6e 67 20 72 65 70 65 61   p [string repea
4960: 74 20 24 64 69 72 6e 61 6d 65 20 24 6e 44 69 72  t $dirname $nDir
4970: 5d 0a 20 20 20 20 20 20 66 69 6c 65 20 6d 6b 64  ].      file mkd
4980: 69 72 20 24 70 0a 20 20 20 20 20 20 63 64 20 24  ir $p.      cd $
4990: 70 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 65 74  p.    }..    set
49a0: 20 70 61 64 64 69 6e 67 20 5b 73 74 72 69 6e 67   padding [string
49b0: 20 72 65 70 65 61 74 20 78 20 5b 65 78 70 72 20   repeat x [expr 
49c0: 24 6e 50 61 64 64 69 6e 67 20 25 33 32 5d 5d 0a  $nPadding %32]].
49d0: 20 20 20 20 73 65 74 20 70 72 65 66 69 78 20 22      set prefix "
49e0: 74 65 73 74 2e 64 62 24 7b 70 61 64 64 69 6e 67  test.db${padding
49f0: 7d 22 0a 20 20 7d 0a 7d 20 7b 0a 20 20 65 76 61  }".  }.} {.  eva
4a00: 6c 20 24 74 63 6c 0a 20 20 66 6f 72 65 61 63 68  l $tcl.  foreach
4a10: 20 7b 74 6e 32 20 73 71 6c 7d 20 7b 0a 20 20 20   {tn2 sql} {.   
4a20: 20 6f 20 7b 20 0a 20 20 20 20 20 20 50 52 41 47   o { .      PRAG
4a30: 4d 41 20 6d 61 69 6e 2e 73 79 6e 63 68 72 6f 6e  MA main.synchron
4a40: 6f 75 73 3d 4f 46 46 3b 0a 20 20 20 20 20 20 50  ous=OFF;.      P
4a50: 52 41 47 4d 41 20 61 75 78 2e 73 79 6e 63 68 72  RAGMA aux.synchr
4a60: 6f 6e 6f 75 73 3d 4f 46 46 3b 0a 20 20 20 20 20  onous=OFF;.     
4a70: 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f   PRAGMA journal_
4a80: 6d 6f 64 65 20 3d 20 44 45 4c 45 54 45 3b 0a 20  mode = DELETE;. 
4a90: 20 20 20 7d 0a 20 20 20 20 6f 35 31 32 20 7b 20     }.    o512 { 
4aa0: 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 6d 61  .      PRAGMA ma
4ab0: 69 6e 2e 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f  in.synchronous=O
4ac0: 46 46 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41  FF;.      PRAGMA
4ad0: 20 61 75 78 2e 73 79 6e 63 68 72 6f 6e 6f 75 73   aux.synchronous
4ae0: 3d 4f 46 46 3b 0a 20 20 20 20 20 20 50 52 41 47  =OFF;.      PRAG
4af0: 4d 41 20 6d 61 69 6e 2e 70 61 67 65 5f 73 69 7a  MA main.page_siz
4b00: 65 20 3d 20 35 31 32 3b 0a 20 20 20 20 20 20 50  e = 512;.      P
4b10: 52 41 47 4d 41 20 61 75 78 2e 70 61 67 65 5f 73  RAGMA aux.page_s
4b20: 69 7a 65 20 3d 20 35 31 32 3b 0a 20 20 20 20 20  ize = 512;.     
4b30: 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f   PRAGMA journal_
4b40: 6d 6f 64 65 20 3d 20 44 45 4c 45 54 45 3b 0a 20  mode = DELETE;. 
4b50: 20 20 20 7d 0a 20 20 20 20 6e 20 7b 20 0a 20 20     }.    n { .  
4b60: 20 20 20 20 50 52 41 47 4d 41 20 6d 61 69 6e 2e      PRAGMA main.
4b70: 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4e 4f 52 4d  synchronous=NORM
4b80: 41 4c 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41  AL;.      PRAGMA
4b90: 20 61 75 78 2e 73 79 6e 63 68 72 6f 6e 6f 75 73   aux.synchronous
4ba0: 3d 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 20 20 50  =NORMAL;.      P
4bb0: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
4bc0: 64 65 20 3d 20 44 45 4c 45 54 45 3b 0a 20 20 20  de = DELETE;.   
4bd0: 20 7d 0a 20 20 20 20 66 20 7b 20 0a 20 20 20 20   }.    f { .    
4be0: 20 20 50 52 41 47 4d 41 20 6d 61 69 6e 2e 73 79    PRAGMA main.sy
4bf0: 6e 63 68 72 6f 6e 6f 75 73 3d 46 55 4c 4c 3b 0a  nchronous=FULL;.
4c00: 20 20 20 20 20 20 50 52 41 47 4d 41 20 61 75 78        PRAGMA aux
4c10: 2e 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 46 55 4c  .synchronous=FUL
4c20: 4c 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20  L;.      PRAGMA 
4c30: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44  journal_mode = D
4c40: 45 4c 45 54 45 3b 0a 20 20 20 20 7d 0a 20 20 7d  ELETE;.    }.  }
4c50: 20 7b 0a 0a 20 20 20 20 73 65 74 20 74 6e 20 22   {..    set tn "
4c60: 24 7b 74 6e 31 7d 2e 24 7b 74 6e 32 7d 22 0a 20  ${tn1}.${tn2}". 
4c70: 20 0a 20 20 20 20 23 20 53 65 74 20 75 70 20 61   .    # Set up a
4c80: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 68   connection to h
4c90: 61 76 65 20 74 77 6f 20 64 61 74 61 62 61 73 65  ave two database
4ca0: 73 2c 20 74 65 73 74 2e 64 62 20 28 6d 61 69 6e  s, test.db (main
4cb0: 29 20 61 6e 64 20 0a 20 20 20 20 23 20 74 65 73  ) and .    # tes
4cc0: 74 2e 64 62 32 20 28 61 75 78 29 2e 20 54 68 65  t.db2 (aux). The
4cd0: 6e 20 72 75 6e 20 61 20 6d 75 6c 74 69 2d 66 69  n run a multi-fi
4ce0: 6c 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  le transaction o
4cf0: 6e 20 74 68 65 6d 2e 20 54 68 65 0a 20 20 20 20  n them. The.    
4d00: 23 20 56 46 53 20 77 69 6c 6c 20 73 6e 61 70 73  # VFS will snaps
4d10: 68 6f 74 20 74 68 65 20 66 69 6c 65 2d 73 79 73  hot the file-sys
4d20: 74 65 6d 20 6a 75 73 74 20 62 65 66 6f 72 65 20  tem just before 
4d30: 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e  the master-journ
4d40: 61 6c 0a 20 20 20 20 23 20 66 69 6c 65 20 69 73  al.    # file is
4d50: 20 64 65 6c 65 74 65 64 20 74 6f 20 63 6f 6d 6d   deleted to comm
4d60: 69 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  it the transacti
4d70: 6f 6e 2e 0a 20 20 20 20 23 0a 20 20 20 20 74 76  on..    #.    tv
4d80: 20 66 69 6c 74 65 72 20 78 44 65 6c 65 74 65 0a   filter xDelete.
4d90: 20 20 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65      do_test page
4da0: 72 31 2d 34 2e 34 2e 24 74 6e 2e 31 20 7b 0a 20  r1-4.4.$tn.1 {. 
4db0: 20 20 20 20 20 66 61 75 6c 74 73 69 6d 5f 64 65       faultsim_de
4dc0: 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 20  lete_and_reopen 
4dd0: 24 70 72 65 66 69 78 0a 20 20 20 20 20 20 65 78  $prefix.      ex
4de0: 65 63 73 71 6c 20 22 0a 20 20 20 20 20 20 20 20  ecsql ".        
4df0: 41 54 54 41 43 48 20 27 24 7b 70 72 65 66 69 78  ATTACH '${prefix
4e00: 7d 32 27 20 41 53 20 61 75 78 3b 0a 20 20 20 20  }2' AS aux;.    
4e10: 20 20 20 20 24 73 71 6c 0a 20 20 20 20 20 20 20      $sql.       
4e20: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 61 28   CREATE TABLE a(
4e30: 78 29 3b 0a 20 20 20 20 20 20 20 20 43 52 45 41  x);.        CREA
4e40: 54 45 20 54 41 42 4c 45 20 61 75 78 2e 62 28 78  TE TABLE aux.b(x
4e50: 29 3b 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52  );.        INSER
4e60: 54 20 49 4e 54 4f 20 61 20 56 41 4c 55 45 53 28  T INTO a VALUES(
4e70: 27 64 6f 75 62 6c 65 2d 79 6f 75 27 29 3b 0a 20  'double-you');. 
4e80: 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e         INSERT IN
4e90: 54 4f 20 61 20 56 41 4c 55 45 53 28 27 77 68 79  TO a VALUES('why
4ea0: 27 29 3b 0a 20 20 20 20 20 20 20 20 49 4e 53 45  ');.        INSE
4eb0: 52 54 20 49 4e 54 4f 20 61 20 56 41 4c 55 45 53  RT INTO a VALUES
4ec0: 28 27 7a 65 64 27 29 3b 0a 20 20 20 20 20 20 20  ('zed');.       
4ed0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 62 20 56   INSERT INTO b V
4ee0: 41 4c 55 45 53 28 27 77 6f 6e 27 29 3b 0a 20 20  ALUES('won');.  
4ef0: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
4f00: 4f 20 62 20 56 41 4c 55 45 53 28 27 74 6f 6f 27  O b VALUES('too'
4f10: 29 3b 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52  );.        INSER
4f20: 54 20 49 4e 54 4f 20 62 20 56 41 4c 55 45 53 28  T INTO b VALUES(
4f30: 27 66 72 65 65 27 29 3b 0a 20 20 20 20 20 20 22  'free');.      "
4f40: 0a 20 20 20 20 20 20 65 78 65 63 73 71 6c 20 7b  .      execsql {
4f50: 0a 20 20 20 20 20 20 20 20 42 45 47 49 4e 3b 0a  .        BEGIN;.
4f60: 20 20 20 20 20 20 20 20 20 20 49 4e 53 45 52 54            INSERT
4f70: 20 49 4e 54 4f 20 61 20 53 45 4c 45 43 54 20 2a   INTO a SELECT *
4f80: 20 46 52 4f 4d 20 62 20 57 48 45 52 45 20 72 6f   FROM b WHERE ro
4f90: 77 69 64 3c 3d 33 3b 0a 20 20 20 20 20 20 20 20  wid<=3;.        
4fa0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 62 20    INSERT INTO b 
4fb0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 61 20  SELECT * FROM a 
4fc0: 57 48 45 52 45 20 72 6f 77 69 64 3c 3d 33 3b 0a  WHERE rowid<=3;.
4fd0: 20 20 20 20 20 20 20 20 43 4f 4d 4d 49 54 3b 0a          COMMIT;.
4fe0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 7b 7d        }.    } {}
4ff0: 0a 20 20 20 20 74 76 20 66 69 6c 74 65 72 20 7b  .    tv filter {
5000: 7d 0a 20 20 20 20 0a 20 20 20 20 23 20 43 68 65  }.    .    # Che
5010: 63 6b 20 74 68 61 74 20 74 68 65 20 74 72 61 6e  ck that the tran
5020: 73 61 63 74 69 6f 6e 20 77 61 73 20 63 6f 6d 6d  saction was comm
5030: 69 74 74 65 64 20 73 75 63 63 65 73 73 66 75 6c  itted successful
5040: 6c 79 2e 0a 20 20 20 20 23 0a 20 20 20 20 64 6f  ly..    #.    do
5050: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61  _execsql_test pa
5060: 67 65 72 31 2d 34 2e 34 2e 24 74 6e 2e 32 20 7b  ger1-4.4.$tn.2 {
5070: 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20  .      SELECT * 
5080: 46 52 4f 4d 20 61 0a 20 20 20 20 7d 20 7b 64 6f  FROM a.    } {do
5090: 75 62 6c 65 2d 79 6f 75 20 77 68 79 20 7a 65 64  uble-you why zed
50a0: 20 77 6f 6e 20 74 6f 6f 20 66 72 65 65 7d 0a 20   won too free}. 
50b0: 20 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65     do_execsql_te
50c0: 73 74 20 70 61 67 65 72 31 2d 34 2e 34 2e 24 74  st pager1-4.4.$t
50d0: 6e 2e 33 20 7b 0a 20 20 20 20 20 20 53 45 4c 45  n.3 {.      SELE
50e0: 43 54 20 2a 20 46 52 4f 4d 20 62 0a 20 20 20 20  CT * FROM b.    
50f0: 7d 20 7b 77 6f 6e 20 74 6f 6f 20 66 72 65 65 20  } {won too free 
5100: 64 6f 75 62 6c 65 2d 79 6f 75 20 77 68 79 20 7a  double-you why z
5110: 65 64 7d 0a 20 20 20 20 0a 20 20 20 20 23 20 52  ed}.    .    # R
5120: 65 73 74 6f 72 65 20 74 68 65 20 66 69 6c 65 2d  estore the file-
5130: 73 79 73 74 65 6d 20 61 6e 64 20 72 65 6f 70 65  system and reope
5140: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 73 2e  n the databases.
5150: 20 43 68 65 63 6b 20 74 68 61 74 20 69 74 20 6e   Check that it n
5160: 6f 77 0a 20 20 20 20 23 20 61 70 70 65 61 72 73  ow.    # appears
5170: 20 74 68 61 74 20 74 68 65 20 74 72 61 6e 73 61   that the transa
5180: 63 74 69 6f 6e 20 77 61 73 20 6e 6f 74 20 63 6f  ction was not co
5190: 6d 6d 69 74 74 65 64 20 28 62 65 63 61 75 73 65  mmitted (because
51a0: 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
51b0: 0a 20 20 20 20 23 20 77 61 73 20 72 65 73 74 6f  .    # was resto
51c0: 72 65 64 20 74 6f 20 74 68 65 20 73 74 61 74 65  red to the state
51d0: 20 77 68 65 72 65 20 69 74 20 68 61 64 20 6e 6f   where it had no
51e0: 74 20 62 65 65 6e 29 2e 0a 20 20 20 20 23 0a 20  t been)..    #. 
51f0: 20 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72     do_test pager
5200: 31 2d 34 2e 34 2e 24 74 6e 2e 34 20 7b 0a 20 20  1-4.4.$tn.4 {.  
5210: 20 20 20 20 66 61 75 6c 74 73 69 6d 5f 72 65 73      faultsim_res
5220: 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 20  tore_and_reopen 
5230: 24 70 72 65 66 69 78 0a 20 20 20 20 20 20 65 78  $prefix.      ex
5240: 65 63 73 71 6c 20 22 41 54 54 41 43 48 20 27 24  ecsql "ATTACH '$
5250: 7b 70 72 65 66 69 78 7d 32 27 20 41 53 20 61 75  {prefix}2' AS au
5260: 78 22 0a 20 20 20 20 7d 20 7b 7d 0a 20 20 20 20  x".    } {}.    
5270: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
5280: 70 61 67 65 72 31 2d 34 2e 34 2e 24 74 6e 2e 35  pager1-4.4.$tn.5
5290: 20 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   {SELECT * FROM 
52a0: 61 7d 20 7b 64 6f 75 62 6c 65 2d 79 6f 75 20 77  a} {double-you w
52b0: 68 79 20 7a 65 64 7d 0a 20 20 20 20 64 6f 5f 65  hy zed}.    do_e
52c0: 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65  xecsql_test page
52d0: 72 31 2d 34 2e 34 2e 24 74 6e 2e 36 20 7b 53 45  r1-4.4.$tn.6 {SE
52e0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 62 7d 20 7b  LECT * FROM b} {
52f0: 77 6f 6e 20 74 6f 6f 20 66 72 65 65 7d 0a 20 20  won too free}.  
5300: 20 20 0a 20 20 20 20 23 20 52 65 73 74 6f 72 65    .    # Restore
5310: 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
5320: 20 61 67 61 69 6e 2e 20 54 68 69 73 20 74 69 6d   again. This tim
5330: 65 2c 20 62 65 66 6f 72 65 20 72 65 6f 70 65 6e  e, before reopen
5340: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
5350: 73 2c 0a 20 20 20 20 23 20 64 65 6c 65 74 65 20  s,.    # delete 
5360: 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e  the master-journ
5370: 61 6c 20 66 69 6c 65 20 66 72 6f 6d 20 74 68 65  al file from the
5380: 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e 20 49 74   file-system. It
5390: 20 6e 6f 77 20 61 70 70 65 61 72 73 20 74 68 61   now appears tha
53a0: 74 0a 20 20 20 20 23 20 74 68 65 20 74 72 61 6e  t.    # the tran
53b0: 73 61 63 74 69 6f 6e 20 77 61 73 20 63 6f 6d 6d  saction was comm
53c0: 69 74 74 65 64 20 28 6e 6f 20 6d 61 73 74 65 72  itted (no master
53d0: 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 3d 3d  -journal file ==
53e0: 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 29 2e 0a 20   no rollback).. 
53f0: 20 20 20 23 0a 20 20 20 20 64 6f 5f 74 65 73 74     #.    do_test
5400: 20 70 61 67 65 72 31 2d 34 2e 34 2e 24 74 6e 2e   pager1-4.4.$tn.
5410: 37 20 7b 0a 20 20 20 20 20 20 66 61 75 6c 74 73  7 {.      faults
5420: 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72  im_restore_and_r
5430: 65 6f 70 65 6e 20 24 70 72 65 66 69 78 0a 20 20  eopen $prefix.  
5440: 20 20 20 20 66 6f 72 65 61 63 68 20 66 20 5b 67      foreach f [g
5450: 6c 6f 62 20 24 7b 70 72 65 66 69 78 7d 2d 6d 6a  lob ${prefix}-mj
5460: 2a 5d 20 7b 20 66 6f 72 63 65 64 65 6c 65 74 65  *] { forcedelete
5470: 20 24 66 20 7d 0a 20 20 20 20 20 20 65 78 65 63   $f }.      exec
5480: 73 71 6c 20 22 41 54 54 41 43 48 20 27 24 7b 70  sql "ATTACH '${p
5490: 72 65 66 69 78 7d 32 27 20 41 53 20 61 75 78 22  refix}2' AS aux"
54a0: 0a 20 20 20 20 7d 20 7b 7d 0a 20 20 20 20 64 6f  .    } {}.    do
54b0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61  _execsql_test pa
54c0: 67 65 72 31 2d 34 2e 34 2e 24 74 6e 2e 38 20 7b  ger1-4.4.$tn.8 {
54d0: 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20  .      SELECT * 
54e0: 46 52 4f 4d 20 61 0a 20 20 20 20 7d 20 7b 64 6f  FROM a.    } {do
54f0: 75 62 6c 65 2d 79 6f 75 20 77 68 79 20 7a 65 64  uble-you why zed
5500: 20 77 6f 6e 20 74 6f 6f 20 66 72 65 65 7d 0a 20   won too free}. 
5510: 20 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65     do_execsql_te
5520: 73 74 20 70 61 67 65 72 31 2d 34 2e 34 2e 24 74  st pager1-4.4.$t
5530: 6e 2e 39 20 7b 0a 20 20 20 20 20 20 53 45 4c 45  n.9 {.      SELE
5540: 43 54 20 2a 20 46 52 4f 4d 20 62 0a 20 20 20 20  CT * FROM b.    
5550: 7d 20 7b 77 6f 6e 20 74 6f 6f 20 66 72 65 65 20  } {won too free 
5560: 64 6f 75 62 6c 65 2d 79 6f 75 20 77 68 79 20 7a  double-you why z
5570: 65 64 7d 0a 20 20 7d 0a 0a 20 20 63 64 20 24 70  ed}.  }..  cd $p
5580: 77 64 0a 7d 0a 64 62 20 63 6c 6f 73 65 0a 74 76  wd.}.db close.tv
5590: 20 64 65 6c 65 74 65 0a 66 6f 72 63 65 64 65 6c   delete.forcedel
55a0: 65 74 65 20 24 64 69 72 6e 61 6d 65 0a 0a 0a 23  ete $dirname...#
55b0: 20 53 65 74 20 75 70 20 61 20 56 46 53 20 74 6f   Set up a VFS to
55c0: 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20   make a copy of 
55d0: 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  the file-system 
55e0: 6a 75 73 74 20 62 65 66 6f 72 65 20 64 65 6c 65  just before dele
55f0: 74 69 6e 67 20 61 0a 23 20 6a 6f 75 72 6e 61 6c  ting a.# journal
5600: 20 66 69 6c 65 20 74 6f 20 63 6f 6d 6d 69 74 20   file to commit 
5610: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54  a transaction. T
5620: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  he transaction m
5630: 6f 64 69 66 69 65 73 20 65 78 61 63 74 6c 79 0a  odifies exactly.
5640: 23 20 74 77 6f 20 64 61 74 61 62 61 73 65 20 70  # two database p
5650: 61 67 65 73 20 28 61 6e 64 20 70 61 67 65 20 31  ages (and page 1
5660: 20 2d 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f   - the change co
5670: 75 6e 74 65 72 29 2e 0a 23 0a 74 65 73 74 76 66  unter)..#.testvf
5680: 73 20 74 76 20 2d 64 65 66 61 75 6c 74 20 31 0a  s tv -default 1.
5690: 74 76 20 73 65 63 74 6f 72 73 69 7a 65 20 35 31  tv sectorsize 51
56a0: 32 0a 74 76 20 73 63 72 69 70 74 20 63 6f 70 79  2.tv script copy
56b0: 5f 6f 6e 5f 6a 6f 75 72 6e 61 6c 5f 64 65 6c 65  _on_journal_dele
56c0: 74 65 0a 74 76 20 66 69 6c 74 65 72 20 78 44 65  te.tv filter xDe
56d0: 6c 65 74 65 0a 70 72 6f 63 20 63 6f 70 79 5f 6f  lete.proc copy_o
56e0: 6e 5f 6a 6f 75 72 6e 61 6c 5f 64 65 6c 65 74 65  n_journal_delete
56f0: 20 7b 6d 65 74 68 6f 64 20 66 69 6c 65 6e 61 6d   {method filenam
5700: 65 20 61 72 67 73 7d 20 7b 0a 20 20 69 66 20 7b  e args} {.  if {
5710: 5b 73 74 72 69 6e 67 20 6d 61 74 63 68 20 2a 6a  [string match *j
5720: 6f 75 72 6e 61 6c 20 24 66 69 6c 65 6e 61 6d 65  ournal $filename
5730: 5d 7d 20 66 61 75 6c 74 73 69 6d 5f 73 61 76 65  ]} faultsim_save
5740: 20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54   .  return SQLIT
5750: 45 5f 4f 4b 0a 7d 0a 66 61 75 6c 74 73 69 6d 5f  E_OK.}.faultsim_
5760: 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65  delete_and_reope
5770: 6e 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  n.do_execsql_tes
5780: 74 20 70 61 67 65 72 31 2e 34 2e 35 2e 31 20 7b  t pager1.4.5.1 {
5790: 0a 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61  .  PRAGMA journa
57a0: 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c 45 54 45 3b  l_mode = DELETE;
57b0: 0a 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73  .  PRAGMA page_s
57c0: 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20 43 52  ize = 1024;.  CR
57d0: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c  EATE TABLE t1(a,
57e0: 20 62 29 3b 0a 20 20 43 52 45 41 54 45 20 54 41   b);.  CREATE TA
57f0: 42 4c 45 20 74 32 28 61 2c 20 62 29 3b 0a 20 20  BLE t2(a, b);.  
5800: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
5810: 41 4c 55 45 53 28 27 49 27 2c 20 27 49 49 27 29  ALUES('I', 'II')
5820: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
5830: 74 32 20 56 41 4c 55 45 53 28 27 49 49 49 27 2c  t2 VALUES('III',
5840: 20 27 49 56 27 29 3b 0a 20 20 42 45 47 49 4e 3b   'IV');.  BEGIN;
5850: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
5860: 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20 32 29   t1 VALUES(1, 2)
5870: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
5880: 4f 20 74 32 20 56 41 4c 55 45 53 28 33 2c 20 34  O t2 VALUES(3, 4
5890: 29 3b 0a 20 20 43 4f 4d 4d 49 54 3b 0a 7d 20 7b  );.  COMMIT;.} {
58a0: 64 65 6c 65 74 65 7d 0a 74 76 20 66 69 6c 74 65  delete}.tv filte
58b0: 72 20 7b 7d 0a 0a 23 20 43 68 65 63 6b 20 74 68  r {}..# Check th
58c0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  e transaction wa
58d0: 73 20 63 6f 6d 6d 69 74 74 65 64 3a 0a 23 0a 64  s committed:.#.d
58e0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70  o_execsql_test p
58f0: 61 67 65 72 31 2e 34 2e 35 2e 32 20 7b 0a 20 20  ager1.4.5.2 {.  
5900: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
5910: 3b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  ;.  SELECT * FRO
5920: 4d 20 74 32 3b 0a 7d 20 7b 49 20 49 49 20 31 20  M t2;.} {I II 1 
5930: 32 20 49 49 49 20 49 56 20 33 20 34 7d 0a 0a 23  2 III IV 3 4}..#
5940: 20 4e 6f 77 20 74 72 79 20 66 6f 75 72 20 74 65   Now try four te
5950: 73 74 73 3a 0a 23 0a 23 20 20 70 61 67 65 72 31  sts:.#.#  pager1
5960: 2d 34 2e 35 2e 33 3a 20 52 65 73 74 6f 72 65 20  -4.5.3: Restore 
5970: 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e  the file-system.
5980: 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   Check that the 
5990: 77 68 6f 6c 65 20 74 72 61 6e 73 61 63 74 69 6f  whole transactio
59a0: 6e 20 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  n .#            
59b0: 20 20 20 20 69 73 20 72 6f 6c 6c 65 64 20 62 61      is rolled ba
59c0: 63 6b 2e 0a 23 0a 23 20 20 70 61 67 65 72 31 2d  ck..#.#  pager1-
59d0: 34 2e 35 2e 34 3a 20 52 65 73 74 6f 72 65 20 74  4.5.4: Restore t
59e0: 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e 20  he file-system. 
59f0: 43 6f 72 72 75 70 74 20 74 68 65 20 66 69 72 73  Corrupt the firs
5a00: 74 20 72 65 63 6f 72 64 20 69 6e 20 74 68 65 0a  t record in the.
5a10: 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  #               
5a20: 20 6a 6f 75 72 6e 61 6c 2e 20 43 68 65 63 6b 20   journal. Check 
5a30: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
5a40: 69 73 20 6e 6f 74 20 72 6f 6c 6c 65 64 20 62 61  is not rolled ba
5a50: 63 6b 2e 0a 23 0a 23 20 20 70 61 67 65 72 31 2d  ck..#.#  pager1-
5a60: 34 2e 35 2e 35 3a 20 52 65 73 74 6f 72 65 20 74  4.5.5: Restore t
5a70: 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e 20  he file-system. 
5a80: 43 6f 72 72 75 70 74 20 74 68 65 20 73 65 63 6f  Corrupt the seco
5a90: 6e 64 20 72 65 63 6f 72 64 20 69 6e 20 74 68 65  nd record in the
5aa0: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
5ab0: 20 20 6a 6f 75 72 6e 61 6c 2e 20 43 68 65 63 6b    journal. Check
5ac0: 20 74 68 61 74 20 74 68 65 20 66 69 72 73 74 20   that the first 
5ad0: 72 65 63 6f 72 64 20 69 6e 20 74 68 65 20 74 72  record in the tr
5ae0: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 0a 23 20  ansaction is .# 
5af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
5b00: 6c 61 79 65 64 20 62 61 63 6b 2c 20 62 75 74 20  layed back, but 
5b10: 6e 6f 74 20 74 68 65 20 73 65 63 6f 6e 64 2e 0a  not the second..
5b20: 23 0a 23 20 20 70 61 67 65 72 31 2d 34 2e 35 2e  #.#  pager1-4.5.
5b30: 36 3a 20 52 65 73 74 6f 72 65 20 74 68 65 20 66  6: Restore the f
5b40: 69 6c 65 2d 73 79 73 74 65 6d 2e 20 54 72 79 20  ile-system. Try 
5b50: 74 6f 20 6f 70 65 6e 20 74 68 65 20 64 61 74 61  to open the data
5b60: 62 61 73 65 20 77 69 74 68 20 61 0a 23 20 20 20  base with a.#   
5b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 61               rea
5b80: 64 6f 6e 6c 79 20 63 6f 6e 6e 65 63 74 69 6f 6e  donly connection
5b90: 2e 20 54 68 69 73 20 73 68 6f 75 6c 64 20 66 61  . This should fa
5ba0: 69 6c 2c 20 61 73 20 61 20 72 65 61 64 2d 6f 6e  il, as a read-on
5bb0: 6c 79 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  ly.#            
5bc0: 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63      connection c
5bd0: 61 6e 6e 6f 74 20 72 6f 6c 6c 20 62 61 63 6b 20  annot roll back 
5be0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
5bf0: 65 2e 0a 23 0a 66 61 75 6c 74 73 69 6d 5f 72 65  e..#.faultsim_re
5c00: 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e  store_and_reopen
5c10: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
5c20: 20 70 61 67 65 72 31 2e 34 2e 35 2e 33 20 7b 0a   pager1.4.5.3 {.
5c30: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
5c40: 74 31 3b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46  t1;.  SELECT * F
5c50: 52 4f 4d 20 74 32 3b 0a 7d 20 7b 49 20 49 49 20  ROM t2;.} {I II 
5c60: 49 49 49 20 49 56 7d 0a 66 61 75 6c 74 73 69 6d  III IV}.faultsim
5c70: 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f  _restore_and_reo
5c80: 70 65 6e 0a 68 65 78 69 6f 5f 77 72 69 74 65 20  pen.hexio_write 
5c90: 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20  test.db-journal 
5ca0: 5b 65 78 70 72 20 35 31 32 2b 34 2b 31 30 32 34  [expr 512+4+1024
5cb0: 20 2d 20 32 30 32 5d 20 30 31 32 33 34 35 36 37   - 202] 01234567
5cc0: 38 39 41 42 43 44 45 46 0a 64 6f 5f 65 78 65 63  89ABCDEF.do_exec
5cd0: 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2e  sql_test pager1.
5ce0: 34 2e 35 2e 34 20 7b 0a 20 20 53 45 4c 45 43 54  4.5.4 {.  SELECT
5cf0: 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 53 45   * FROM t1;.  SE
5d00: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a  LECT * FROM t2;.
5d10: 7d 20 7b 49 20 49 49 20 31 20 32 20 49 49 49 20  } {I II 1 2 III 
5d20: 49 56 20 33 20 34 7d 0a 66 61 75 6c 74 73 69 6d  IV 3 4}.faultsim
5d30: 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f  _restore_and_reo
5d40: 70 65 6e 0a 68 65 78 69 6f 5f 77 72 69 74 65 20  pen.hexio_write 
5d50: 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20  test.db-journal 
5d60: 5b 65 78 70 72 20 35 31 32 2b 34 2b 31 30 32 34  [expr 512+4+1024
5d70: 2b 34 2b 34 2b 31 30 32 34 20 2d 20 32 30 32 5d  +4+4+1024 - 202]
5d80: 20 30 31 32 33 34 35 36 37 38 39 41 42 43 44 45   0123456789ABCDE
5d90: 46 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  F.do_execsql_tes
5da0: 74 20 70 61 67 65 72 31 2e 34 2e 35 2e 35 20 7b  t pager1.4.5.5 {
5db0: 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  .  SELECT * FROM
5dc0: 20 74 31 3b 0a 20 20 53 45 4c 45 43 54 20 2a 20   t1;.  SELECT * 
5dd0: 46 52 4f 4d 20 74 32 3b 0a 7d 20 7b 49 20 49 49  FROM t2;.} {I II
5de0: 20 49 49 49 20 49 56 20 33 20 34 7d 0a 0a 66 61   III IV 3 4}..fa
5df0: 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61  ultsim_restore_a
5e00: 6e 64 5f 72 65 6f 70 65 6e 0a 64 62 20 63 6c 6f  nd_reopen.db clo
5e10: 73 65 0a 73 71 6c 69 74 65 33 20 64 62 20 74 65  se.sqlite3 db te
5e20: 73 74 2e 64 62 20 2d 72 65 61 64 6f 6e 6c 79 20  st.db -readonly 
5e30: 31 0a 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74 65  1.do_catchsql_te
5e40: 73 74 20 70 61 67 65 72 31 2e 34 2e 35 2e 36 20  st pager1.4.5.6 
5e50: 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  {.  SELECT * FRO
5e60: 4d 20 74 31 3b 0a 20 20 53 45 4c 45 43 54 20 2a  M t1;.  SELECT *
5e70: 20 46 52 4f 4d 20 74 32 3b 0a 7d 20 7b 31 20 7b   FROM t2;.} {1 {
5e80: 61 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65  attempt to write
5e90: 20 61 20 72 65 61 64 6f 6e 6c 79 20 64 61 74 61   a readonly data
5ea0: 62 61 73 65 7d 7d 0a 64 62 20 63 6c 6f 73 65 0a  base}}.db close.
5eb0: 0a 23 20 53 6e 61 70 73 68 6f 74 20 74 68 65 20  .# Snapshot the 
5ec0: 66 69 6c 65 2d 73 79 73 74 65 6d 20 6a 75 73 74  file-system just
5ed0: 20 62 65 66 6f 72 65 20 6d 75 6c 74 69 2d 66 69   before multi-fi
5ee0: 6c 65 20 63 6f 6d 6d 69 74 2e 20 53 61 76 65 20  le commit. Save 
5ef0: 74 68 65 20 6e 61 6d 65 0a 23 20 6f 66 20 74 68  the name.# of th
5f00: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
5f10: 20 66 69 6c 65 20 69 6e 20 24 3a 3a 6d 6a 5f 66   file in $::mj_f
5f20: 69 6c 65 6e 61 6d 65 2e 0a 23 0a 74 76 20 73 63  ilename..#.tv sc
5f30: 72 69 70 74 20 63 6f 70 79 5f 6f 6e 5f 6d 6a 5f  ript copy_on_mj_
5f40: 64 65 6c 65 74 65 0a 74 76 20 66 69 6c 74 65 72  delete.tv filter
5f50: 20 78 44 65 6c 65 74 65 0a 70 72 6f 63 20 63 6f   xDelete.proc co
5f60: 70 79 5f 6f 6e 5f 6d 6a 5f 64 65 6c 65 74 65 20  py_on_mj_delete 
5f70: 7b 6d 65 74 68 6f 64 20 66 69 6c 65 6e 61 6d 65  {method filename
5f80: 20 61 72 67 73 7d 20 7b 0a 20 20 69 66 20 7b 5b   args} {.  if {[
5f90: 73 74 72 69 6e 67 20 6d 61 74 63 68 20 2a 6d 6a  string match *mj
5fa0: 2a 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 66 69  * [file tail $fi
5fb0: 6c 65 6e 61 6d 65 5d 5d 7d 20 7b 20 0a 20 20 20  lename]]} { .   
5fc0: 20 73 65 74 20 3a 3a 6d 6a 5f 66 69 6c 65 6e 61   set ::mj_filena
5fd0: 6d 65 20 24 66 69 6c 65 6e 61 6d 65 0a 20 20 20  me $filename.   
5fe0: 20 66 61 75 6c 74 73 69 6d 5f 73 61 76 65 20 0a   faultsim_save .
5ff0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
6000: 49 54 45 5f 4f 4b 0a 7d 0a 64 6f 5f 74 65 73 74  ITE_OK.}.do_test
6010: 20 70 61 67 65 72 31 2e 34 2e 36 2e 31 20 7b 0a   pager1.4.6.1 {.
6020: 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74    faultsim_delet
6030: 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65  e_and_reopen.  e
6040: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41  xecsql {.    PRA
6050: 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
6060: 20 3d 20 44 45 4c 45 54 45 3b 0a 20 20 20 20 41   = DELETE;.    A
6070: 54 54 41 43 48 20 27 74 65 73 74 2e 64 62 32 27  TTACH 'test.db2'
6080: 20 41 53 20 74 77 6f 3b 0a 20 20 20 20 43 52 45   AS two;.    CRE
6090: 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20  ATE TABLE t1(a, 
60a0: 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  b);.    CREATE T
60b0: 41 42 4c 45 20 74 77 6f 2e 74 32 28 61 2c 20 62  ABLE two.t2(a, b
60c0: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
60d0: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20  TO t1 VALUES(1, 
60e0: 27 74 31 2e 31 27 29 3b 0a 20 20 20 20 49 4e 53  't1.1');.    INS
60f0: 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55  ERT INTO t2 VALU
6100: 45 53 28 31 2c 20 27 74 32 2e 31 27 29 3b 0a 20  ES(1, 't2.1');. 
6110: 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20     BEGIN;.      
6120: 55 50 44 41 54 45 20 74 31 20 53 45 54 20 62 20  UPDATE t1 SET b 
6130: 3d 20 27 74 31 2e 32 27 3b 0a 20 20 20 20 20 20  = 't1.2';.      
6140: 55 50 44 41 54 45 20 74 32 20 53 45 54 20 62 20  UPDATE t2 SET b 
6150: 3d 20 27 74 32 2e 32 27 3b 0a 20 20 20 20 43 4f  = 't2.2';.    CO
6160: 4d 4d 49 54 3b 0a 20 20 7d 0a 20 20 74 76 20 66  MMIT;.  }.  tv f
6170: 69 6c 74 65 72 20 7b 7d 0a 20 20 64 62 20 63 6c  ilter {}.  db cl
6180: 6f 73 65 0a 7d 20 7b 7d 0a 0a 66 61 75 6c 74 73  ose.} {}..faults
6190: 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72  im_restore_and_r
61a0: 65 6f 70 65 6e 0a 64 6f 5f 65 78 65 63 73 71 6c  eopen.do_execsql
61b0: 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e 36  _test pager1.4.6
61c0: 2e 32 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52  .2 { SELECT * FR
61d0: 4f 4d 20 74 31 20 7d 20 20 20 20 20 20 20 20 20  OM t1 }         
61e0: 20 20 7b 31 20 74 31 2e 31 7d 0a 64 6f 5f 74 65    {1 t1.1}.do_te
61f0: 73 74 20 20 20 20 20 20 20 20 20 70 61 67 65 72  st         pager
6200: 31 2e 34 2e 36 2e 33 20 7b 20 66 69 6c 65 20 65  1.4.6.3 { file e
6210: 78 69 73 74 73 20 24 3a 3a 6d 6a 5f 66 69 6c 65  xists $::mj_file
6220: 6e 61 6d 65 20 7d 20 7b 31 7d 0a 64 6f 5f 65 78  name } {1}.do_ex
6230: 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72  ecsql_test pager
6240: 31 2e 34 2e 36 2e 34 20 7b 0a 20 20 41 54 54 41  1.4.6.4 {.  ATTA
6250: 43 48 20 27 74 65 73 74 2e 64 62 32 27 20 41 53  CH 'test.db2' AS
6260: 20 74 77 6f 3b 0a 20 20 53 45 4c 45 43 54 20 2a   two;.  SELECT *
6270: 20 46 52 4f 4d 20 74 32 3b 0a 7d 20 7b 31 20 74   FROM t2;.} {1 t
6280: 32 2e 31 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67  2.1}.do_test pag
6290: 65 72 31 2e 34 2e 36 2e 35 20 7b 20 66 69 6c 65  er1.4.6.5 { file
62a0: 20 65 78 69 73 74 73 20 24 3a 3a 6d 6a 5f 66 69   exists $::mj_fi
62b0: 6c 65 6e 61 6d 65 20 7d 20 7b 30 7d 0a 0a 66 61  lename } {0}..fa
62c0: 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61  ultsim_restore_a
62d0: 6e 64 5f 72 65 6f 70 65 6e 0a 64 62 20 63 6c 6f  nd_reopen.db clo
62e0: 73 65 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  se.do_test pager
62f0: 31 2e 34 2e 36 2e 38 20 7b 0a 20 20 73 65 74 20  1.4.6.8 {.  set 
6300: 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 31 20 24  ::mj_filename1 $
6310: 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 0a 20 20  ::mj_filename.  
6320: 74 76 20 66 69 6c 74 65 72 20 78 44 65 6c 65 74  tv filter xDelet
6330: 65 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 74  e.  sqlite3 db t
6340: 65 73 74 2e 64 62 32 0a 20 20 65 78 65 63 73 71  est.db2.  execsq
6350: 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a  l {.    PRAGMA j
6360: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45  ournal_mode = DE
6370: 4c 45 54 45 3b 0a 20 20 20 20 41 54 54 41 43 48  LETE;.    ATTACH
6380: 20 27 74 65 73 74 2e 64 62 33 27 20 41 53 20 74   'test.db3' AS t
6390: 68 72 65 65 3b 0a 20 20 20 20 43 52 45 41 54 45  hree;.    CREATE
63a0: 20 54 41 42 4c 45 20 74 68 72 65 65 2e 74 33 28   TABLE three.t3(
63b0: 61 2c 20 62 29 3b 0a 20 20 20 20 49 4e 53 45 52  a, b);.    INSER
63c0: 54 20 49 4e 54 4f 20 74 33 20 56 41 4c 55 45 53  T INTO t3 VALUES
63d0: 28 31 2c 20 27 74 33 2e 31 27 29 3b 0a 20 20 20  (1, 't3.1');.   
63e0: 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 55 50   BEGIN;.      UP
63f0: 44 41 54 45 20 74 32 20 53 45 54 20 62 20 3d 20  DATE t2 SET b = 
6400: 27 74 32 2e 33 27 3b 0a 20 20 20 20 20 20 55 50  't2.3';.      UP
6410: 44 41 54 45 20 74 33 20 53 45 54 20 62 20 3d 20  DATE t3 SET b = 
6420: 27 74 33 2e 33 27 3b 0a 20 20 20 20 43 4f 4d 4d  't3.3';.    COMM
6430: 49 54 3b 0a 20 20 7d 0a 20 20 65 78 70 72 20 7b  IT;.  }.  expr {
6440: 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 31 20  $::mj_filename1 
6450: 21 3d 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d  != $::mj_filenam
6460: 65 7d 0a 7d 20 7b 31 7d 0a 66 61 75 6c 74 73 69  e}.} {1}.faultsi
6470: 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65  m_restore_and_re
6480: 6f 70 65 6e 0a 74 76 20 66 69 6c 74 65 72 20 7b  open.tv filter {
6490: 7d 0a 0a 23 20 54 68 65 20 66 69 6c 65 2d 73 79  }..# The file-sy
64a0: 73 74 65 6d 20 6e 6f 77 20 63 6f 6e 74 61 69 6e  stem now contain
64b0: 73 3a 0a 23 0a 23 20 20 20 2a 20 74 68 72 65 65  s:.#.#   * three
64c0: 20 64 61 74 61 62 61 73 65 73 0a 23 20 20 20 2a   databases.#   *
64d0: 20 74 68 72 65 65 20 68 6f 74 2d 6a 6f 75 72 6e   three hot-journ
64e0: 61 6c 20 66 69 6c 65 73 0a 23 20 20 20 2a 20 74  al files.#   * t
64f0: 77 6f 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  wo master-journa
6500: 6c 20 66 69 6c 65 73 2e 0a 23 0a 23 20 54 68 65  l files..#.# The
6510: 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 73 20 61 73   hot-journals as
6520: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 65  sociated with te
6530: 73 74 2e 64 62 32 20 61 6e 64 20 74 65 73 74 2e  st.db2 and test.
6540: 64 62 33 20 70 6f 69 6e 74 20 74 6f 0a 23 20 6d  db3 point to.# m
6550: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 24 3a  aster journal $:
6560: 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 2e 20 54 68  :mj_filename. Th
6570: 65 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69  e hot-journal fi
6580: 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  le associated wi
6590: 74 68 0a 23 20 74 65 73 74 2e 64 62 20 70 6f 69  th.# test.db poi
65a0: 6e 74 73 20 74 6f 20 6d 61 73 74 65 72 20 6a 6f  nts to master jo
65b0: 75 72 6e 61 6c 20 24 3a 3a 6d 6a 5f 66 69 6c 65  urnal $::mj_file
65c0: 6e 61 6d 65 31 2e 20 53 6f 20 72 65 61 64 69 6e  name1. So readin
65d0: 67 20 66 72 6f 6d 0a 23 20 74 65 73 74 2e 64 62  g from.# test.db
65e0: 20 73 68 6f 75 6c 64 20 64 65 6c 65 74 65 20 24   should delete $
65f0: 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 31 2e 0a  ::mj_filename1..
6600: 23 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  #.do_test pager1
6610: 2e 34 2e 36 2e 39 20 7b 0a 20 20 6c 73 6f 72 74  .4.6.9 {.  lsort
6620: 20 5b 67 6c 6f 62 20 74 65 73 74 2e 64 62 2a 5d   [glob test.db*]
6630: 0a 7d 20 5b 6c 73 6f 72 74 20 5b 6c 69 73 74 20  .} [lsort [list 
6640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6660: 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 74 65            \.  te
6670: 73 74 2e 64 62 20 74 65 73 74 2e 64 62 32 20 74  st.db test.db2 t
6680: 65 73 74 2e 64 62 33 20 20 20 20 20 20 20 20 20  est.db3         
6690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
66a0: 20 20 20 20 20 5c 0a 20 20 74 65 73 74 2e 64 62       \.  test.db
66b0: 2d 6a 6f 75 72 6e 61 6c 20 74 65 73 74 2e 64 62  -journal test.db
66c0: 32 2d 6a 6f 75 72 6e 61 6c 20 74 65 73 74 2e 64  2-journal test.d
66d0: 62 33 2d 6a 6f 75 72 6e 61 6c 20 20 20 20 20 20  b3-journal      
66e0: 5c 0a 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24  \.  [file tail $
66f0: 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 5d 20 5b  ::mj_filename] [
6700: 66 69 6c 65 20 74 61 69 6c 20 24 3a 3a 6d 6a 5f  file tail $::mj_
6710: 66 69 6c 65 6e 61 6d 65 31 5d 0a 5d 5d 0a 0a 23  filename1].]]..#
6720: 20 54 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72   The master-jour
6730: 6e 61 6c 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61  nal $::mj_filena
6740: 6d 65 31 20 63 6f 6e 74 61 69 6e 73 20 70 6f 69  me1 contains poi
6750: 6e 74 65 72 73 20 74 6f 20 74 65 73 74 2e 64 62  nters to test.db
6760: 20 61 6e 64 20 0a 23 20 74 65 73 74 2e 64 62 32   and .# test.db2
6770: 2e 20 48 6f 77 65 76 65 72 20 74 68 65 20 68 6f  . However the ho
6780: 74 2d 6a 6f 75 72 6e 61 6c 20 61 73 73 6f 63 69  t-journal associ
6790: 61 74 65 64 20 77 69 74 68 20 74 65 73 74 2e 64  ated with test.d
67a0: 62 32 20 70 6f 69 6e 74 73 20 74 6f 0a 23 20 61  b2 points to.# a
67b0: 20 64 69 66 66 65 72 65 6e 74 20 6d 61 73 74 65   different maste
67c0: 72 2d 6a 6f 75 72 6e 61 6c 2e 20 54 68 65 72 65  r-journal. There
67d0: 66 6f 72 65 2c 20 72 65 61 64 69 6e 67 20 66 72  fore, reading fr
67e0: 6f 6d 20 74 65 73 74 2e 64 62 20 6f 6e 6c 79 20  om test.db only 
67f0: 73 68 6f 75 6c 64 0a 23 20 62 65 20 65 6e 6f 75  should.# be enou
6800: 67 68 20 74 6f 20 63 61 75 73 65 20 53 51 4c 69  gh to cause SQLi
6810: 74 65 20 74 6f 20 64 65 6c 65 74 65 20 24 3a 3a  te to delete $::
6820: 6d 6a 5f 66 69 6c 65 6e 61 6d 65 31 2e 0a 23 0a  mj_filename1..#.
6830: 64 6f 5f 74 65 73 74 20 20 20 20 20 20 20 20 20  do_test         
6840: 70 61 67 65 72 31 2e 34 2e 36 2e 31 30 20 7b 20  pager1.4.6.10 { 
6850: 66 69 6c 65 20 65 78 69 73 74 73 20 24 3a 3a 6d  file exists $::m
6860: 6a 5f 66 69 6c 65 6e 61 6d 65 20 20 7d 20 7b 31  j_filename  } {1
6870: 7d 0a 64 6f 5f 74 65 73 74 20 20 20 20 20 20 20  }.do_test       
6880: 20 20 70 61 67 65 72 31 2e 34 2e 36 2e 31 31 20    pager1.4.6.11 
6890: 7b 20 66 69 6c 65 20 65 78 69 73 74 73 20 24 3a  { file exists $:
68a0: 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 31 20 7d 20  :mj_filename1 } 
68b0: 7b 31 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  {1}.do_execsql_t
68c0: 65 73 74 20 70 61 67 65 72 31 2e 34 2e 36 2e 31  est pager1.4.6.1
68d0: 32 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  2 { SELECT * FRO
68e0: 4d 20 74 31 20 7d 20 7b 31 20 74 31 2e 31 7d 0a  M t1 } {1 t1.1}.
68f0: 64 6f 5f 74 65 73 74 20 20 20 20 20 20 20 20 20  do_test         
6900: 70 61 67 65 72 31 2e 34 2e 36 2e 31 33 20 7b 20  pager1.4.6.13 { 
6910: 66 69 6c 65 20 65 78 69 73 74 73 20 24 3a 3a 6d  file exists $::m
6920: 6a 5f 66 69 6c 65 6e 61 6d 65 20 20 7d 20 7b 31  j_filename  } {1
6930: 7d 0a 64 6f 5f 74 65 73 74 20 20 20 20 20 20 20  }.do_test       
6940: 20 20 70 61 67 65 72 31 2e 34 2e 36 2e 31 34 20    pager1.4.6.14 
6950: 7b 20 66 69 6c 65 20 65 78 69 73 74 73 20 24 3a  { file exists $:
6960: 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 31 20 7d 20  :mj_filename1 } 
6970: 7b 30 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  {0}..do_execsql_
6980: 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e 36 2e  test pager1.4.6.
6990: 31 32 20 7b 0a 20 20 41 54 54 41 43 48 20 27 74  12 {.  ATTACH 't
69a0: 65 73 74 2e 64 62 32 27 20 41 53 20 74 77 6f 3b  est.db2' AS two;
69b0: 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  .  SELECT * FROM
69c0: 20 74 32 3b 0a 7d 20 7b 31 20 74 32 2e 31 7d 0a   t2;.} {1 t2.1}.
69d0: 64 6f 5f 74 65 73 74 20 20 20 20 20 20 20 20 20  do_test         
69e0: 70 61 67 65 72 31 2e 34 2e 36 2e 31 33 20 7b 20  pager1.4.6.13 { 
69f0: 66 69 6c 65 20 65 78 69 73 74 73 20 24 3a 3a 6d  file exists $::m
6a00: 6a 5f 66 69 6c 65 6e 61 6d 65 20 7d 20 20 7b 31  j_filename }  {1
6a10: 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  }.do_execsql_tes
6a20: 74 20 70 61 67 65 72 31 2e 34 2e 36 2e 31 34 20  t pager1.4.6.14 
6a30: 7b 0a 20 20 41 54 54 41 43 48 20 27 74 65 73 74  {.  ATTACH 'test
6a40: 2e 64 62 33 27 20 41 53 20 74 68 72 65 65 3b 0a  .db3' AS three;.
6a50: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
6a60: 74 33 3b 0a 7d 20 7b 31 20 74 33 2e 31 7d 0a 64  t3;.} {1 t3.1}.d
6a70: 6f 5f 74 65 73 74 20 20 20 20 20 20 20 20 20 70  o_test         p
6a80: 61 67 65 72 31 2e 34 2e 36 2e 31 35 20 7b 20 66  ager1.4.6.15 { f
6a90: 69 6c 65 20 65 78 69 73 74 73 20 24 3a 3a 6d 6a  ile exists $::mj
6aa0: 5f 66 69 6c 65 6e 61 6d 65 20 7d 20 20 7b 30 7d  _filename }  {0}
6ab0: 0a 0a 64 62 20 63 6c 6f 73 65 0a 74 76 20 64 65  ..db close.tv de
6ac0: 6c 65 74 65 0a 0a 74 65 73 74 76 66 73 20 74 76  lete..testvfs tv
6ad0: 20 2d 64 65 66 61 75 6c 74 20 31 0a 74 76 20 73   -default 1.tv s
6ae0: 65 63 74 6f 72 73 69 7a 65 20 35 31 32 0a 74 76  ectorsize 512.tv
6af0: 20 73 63 72 69 70 74 20 63 6f 70 79 5f 6f 6e 5f   script copy_on_
6b00: 6a 6f 75 72 6e 61 6c 5f 64 65 6c 65 74 65 0a 74  journal_delete.t
6b10: 76 20 66 69 6c 74 65 72 20 78 44 65 6c 65 74 65  v filter xDelete
6b20: 0a 70 72 6f 63 20 63 6f 70 79 5f 6f 6e 5f 6a 6f  .proc copy_on_jo
6b30: 75 72 6e 61 6c 5f 64 65 6c 65 74 65 20 7b 6d 65  urnal_delete {me
6b40: 74 68 6f 64 20 66 69 6c 65 6e 61 6d 65 20 61 72  thod filename ar
6b50: 67 73 7d 20 7b 0a 20 20 69 66 20 7b 5b 73 74 72  gs} {.  if {[str
6b60: 69 6e 67 20 6d 61 74 63 68 20 2a 6a 6f 75 72 6e  ing match *journ
6b70: 61 6c 20 24 66 69 6c 65 6e 61 6d 65 5d 7d 20 66  al $filename]} f
6b80: 61 75 6c 74 73 69 6d 5f 73 61 76 65 20 0a 20 20  aultsim_save .  
6b90: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
6ba0: 0a 7d 0a 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65  .}.faultsim_dele
6bb0: 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 64 6f  te_and_reopen.do
6bc0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61  _execsql_test pa
6bd0: 67 65 72 31 2e 34 2e 37 2e 31 20 7b 0a 20 20 50  ger1.4.7.1 {.  P
6be0: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
6bf0: 64 65 20 3d 20 44 45 4c 45 54 45 3b 0a 20 20 43  de = DELETE;.  C
6c00: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 78  REATE TABLE t1(x
6c10: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 79 29   PRIMARY KEY, y)
6c20: 3b 0a 20 20 43 52 45 41 54 45 20 49 4e 44 45 58  ;.  CREATE INDEX
6c30: 20 69 31 20 4f 4e 20 74 31 28 79 29 3b 0a 20 20   i1 ON t1(y);.  
6c40: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
6c50: 41 4c 55 45 53 28 27 49 27 2c 20 20 20 27 6f 6e  ALUES('I',   'on
6c60: 65 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e  e');.  INSERT IN
6c70: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27 49 49  TO t1 VALUES('II
6c80: 27 2c 20 20 27 66 6f 75 72 27 29 3b 0a 20 20 49  ',  'four');.  I
6c90: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
6ca0: 4c 55 45 53 28 27 49 49 49 27 2c 20 27 6e 69 6e  LUES('III', 'nin
6cb0: 65 27 29 3b 0a 20 20 42 45 47 49 4e 3b 0a 20 20  e');.  BEGIN;.  
6cc0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
6cd0: 20 56 41 4c 55 45 53 28 27 49 56 27 2c 20 27 73   VALUES('IV', 's
6ce0: 69 78 74 65 65 6e 27 29 3b 0a 20 20 20 20 49 4e  ixteen');.    IN
6cf0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
6d00: 55 45 53 28 27 56 27 20 2c 20 27 74 77 65 6e 74  UES('V' , 'twent
6d10: 79 66 69 76 65 27 29 3b 0a 20 20 43 4f 4d 4d 49  yfive');.  COMMI
6d20: 54 3b 0a 7d 20 7b 64 65 6c 65 74 65 7d 0a 74 76  T;.} {delete}.tv
6d30: 20 66 69 6c 74 65 72 20 7b 7d 0a 64 62 20 63 6c   filter {}.db cl
6d40: 6f 73 65 0a 74 76 20 64 65 6c 65 74 65 20 0a 63  ose.tv delete .c
6d50: 61 74 63 68 20 7b 0a 20 20 74 65 73 74 5f 73 79  atch {.  test_sy
6d60: 73 63 61 6c 6c 20 69 6e 73 74 61 6c 6c 20 66 63  scall install fc
6d70: 68 6d 6f 64 0a 20 20 74 65 73 74 5f 73 79 73 63  hmod.  test_sysc
6d80: 61 6c 6c 20 66 61 75 6c 74 20 31 20 31 0a 7d 0a  all fault 1 1.}.
6d90: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34  do_test pager1.4
6da0: 2e 37 2e 32 20 7b 0a 20 20 66 61 75 6c 74 73 69  .7.2 {.  faultsi
6db0: 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65  m_restore_and_re
6dc0: 6f 70 65 6e 0a 20 20 63 61 74 63 68 20 7b 66 69  open.  catch {fi
6dd0: 6c 65 20 61 74 74 72 69 62 75 74 65 73 20 74 65  le attributes te
6de0: 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 2d 70  st.db-journal -p
6df0: 65 72 6d 69 73 73 69 6f 6e 73 20 72 2d 2d 2d 2d  ermissions r----
6e00: 2d 2d 2d 2d 7d 0a 20 20 63 61 74 63 68 20 7b 66  ----}.  catch {f
6e10: 69 6c 65 20 61 74 74 72 69 62 75 74 65 73 20 74  ile attributes t
6e20: 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 2d  est.db-journal -
6e30: 72 65 61 64 6f 6e 6c 79 20 31 7d 0a 20 20 63 61  readonly 1}.  ca
6e40: 74 63 68 73 71 6c 20 7b 20 53 45 4c 45 43 54 20  tchsql { SELECT 
6e50: 2a 20 46 52 4f 4d 20 74 31 20 7d 0a 7d 20 7b 31  * FROM t1 }.} {1
6e60: 20 7b 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e   {unable to open
6e70: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 7d 7d   database file}}
6e80: 0a 63 61 74 63 68 20 7b 0a 20 20 74 65 73 74 5f  .catch {.  test_
6e90: 73 79 73 63 61 6c 6c 20 72 65 73 65 74 0a 20 20  syscall reset.  
6ea0: 74 65 73 74 5f 73 79 73 63 61 6c 6c 20 66 61 75  test_syscall fau
6eb0: 6c 74 20 30 20 30 0a 7d 0a 64 6f 5f 74 65 73 74  lt 0 0.}.do_test
6ec0: 20 70 61 67 65 72 31 2e 34 2e 37 2e 33 20 7b 0a   pager1.4.7.3 {.
6ed0: 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 63 61 74    db close.  cat
6ee0: 63 68 20 7b 66 69 6c 65 20 61 74 74 72 69 62 75  ch {file attribu
6ef0: 74 65 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72  tes test.db-jour
6f00: 6e 61 6c 20 2d 70 65 72 6d 69 73 73 69 6f 6e 73  nal -permissions
6f10: 20 72 77 2d 72 77 2d 72 77 2d 7d 0a 20 20 63 61   rw-rw-rw-}.  ca
6f20: 74 63 68 20 7b 66 69 6c 65 20 61 74 74 72 69 62  tch {file attrib
6f30: 75 74 65 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75  utes test.db-jou
6f40: 72 6e 61 6c 20 2d 72 65 61 64 6f 6e 6c 79 20 30  rnal -readonly 0
6f50: 7d 0a 20 20 64 65 6c 65 74 65 5f 66 69 6c 65 20  }.  delete_file 
6f60: 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a  test.db-journal.
6f70: 20 20 66 69 6c 65 20 65 78 69 73 74 73 20 74 65    file exists te
6f80: 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 7d 20  st.db-journal.} 
6f90: 7b 30 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  {0}.do_test page
6fa0: 72 31 2e 34 2e 38 2e 31 20 7b 0a 20 20 63 61 74  r1.4.8.1 {.  cat
6fb0: 63 68 20 7b 66 69 6c 65 20 61 74 74 72 69 62 75  ch {file attribu
6fc0: 74 65 73 20 74 65 73 74 2e 64 62 20 2d 70 65 72  tes test.db -per
6fd0: 6d 69 73 73 69 6f 6e 73 20 72 2d 2d 2d 2d 2d 2d  missions r------
6fe0: 2d 2d 7d 0a 20 20 63 61 74 63 68 20 7b 66 69 6c  --}.  catch {fil
6ff0: 65 20 61 74 74 72 69 62 75 74 65 73 20 74 65 73  e attributes tes
7000: 74 2e 64 62 20 2d 72 65 61 64 6f 6e 6c 79 20 31  t.db -readonly 1
7010: 7d 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 74  }.  sqlite3 db t
7020: 65 73 74 2e 64 62 0a 20 20 64 62 20 65 76 61 6c  est.db.  db eval
7030: 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d   { SELECT * FROM
7040: 20 74 31 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f   t1 }.  sqlite3_
7050: 64 62 5f 72 65 61 64 6f 6e 6c 79 20 64 62 20 6d  db_readonly db m
7060: 61 69 6e 0a 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73  ain.} {1}.do_tes
7070: 74 20 70 61 67 65 72 31 2e 34 2e 38 2e 32 20 7b  t pager1.4.8.2 {
7080: 0a 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 72 65  .  sqlite3_db_re
7090: 61 64 6f 6e 6c 79 20 64 62 20 78 79 7a 0a 7d 20  adonly db xyz.} 
70a0: 7b 2d 31 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67  {-1}.do_test pag
70b0: 65 72 31 2e 34 2e 38 2e 33 20 7b 0a 20 20 64 62  er1.4.8.3 {.  db
70c0: 20 63 6c 6f 73 65 0a 20 20 63 61 74 63 68 20 7b   close.  catch {
70d0: 66 69 6c 65 20 61 74 74 72 69 62 75 74 65 73 20  file attributes 
70e0: 74 65 73 74 2e 64 62 20 2d 72 65 61 64 6f 6e 6c  test.db -readonl
70f0: 79 20 30 7d 0a 20 20 63 61 74 63 68 20 7b 66 69  y 0}.  catch {fi
7100: 6c 65 20 61 74 74 72 69 62 75 74 65 73 20 74 65  le attributes te
7110: 73 74 2e 64 62 20 2d 70 65 72 6d 69 73 73 69 6f  st.db -permissio
7120: 6e 73 20 72 77 2d 72 77 2d 72 77 2d 7d 20 6d 73  ns rw-rw-rw-} ms
7130: 67 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 74  g.  sqlite3 db t
7140: 65 73 74 2e 64 62 0a 20 20 64 62 20 65 76 61 6c  est.db.  db eval
7150: 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d   { SELECT * FROM
7160: 20 74 31 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f   t1 }.  sqlite3_
7170: 64 62 5f 72 65 61 64 6f 6e 6c 79 20 64 62 20 6d  db_readonly db m
7180: 61 69 6e 0a 7d 20 7b 30 7d 0a 0a 23 2d 2d 2d 2d  ain.} {0}..#----
7190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
71a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
71b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
71c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
71d0: 2d 2d 2d 2d 2d 0a 23 20 54 68 65 20 66 6f 6c 6c  -----.# The foll
71e0: 6f 77 69 6e 67 20 74 65 73 74 73 20 64 65 61 6c  owing tests deal
71f0: 20 77 69 74 68 20 6d 75 6c 74 69 2d 66 69 6c 65   with multi-file
7200: 20 63 6f 6d 6d 69 74 73 2e 0a 23 0a 23 20 70 61   commits..#.# pa
7210: 67 65 72 31 2d 35 2e 31 2e 2a 3a 20 54 68 65 20  ger1-5.1.*: The 
7220: 63 61 73 65 20 77 68 65 72 65 20 61 20 6d 75 6c  case where a mul
7230: 74 69 2d 66 69 6c 65 20 63 61 6e 6e 6f 74 20 62  ti-file cannot b
7240: 65 20 63 6f 6d 6d 69 74 74 65 64 20 62 65 63 61  e committed beca
7250: 75 73 65 0a 23 20 20 20 20 20 20 20 20 20 20 20  use.#           
7260: 20 20 20 20 61 6e 6f 74 68 65 72 20 63 6f 6e 6e      another conn
7270: 65 63 74 69 6f 6e 20 69 73 20 68 6f 6c 64 69 6e  ection is holdin
7280: 67 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20  g a SHARED lock 
7290: 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 0a 23 20  on one of the.# 
72a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69                fi
72b0: 6c 65 73 2e 20 41 66 74 65 72 20 74 68 65 20 53  les. After the S
72c0: 48 41 52 45 44 20 6c 6f 63 6b 20 69 73 20 72 65  HARED lock is re
72d0: 6d 6f 76 65 64 2c 20 74 68 65 20 43 4f 4d 4d 49  moved, the COMMI
72e0: 54 20 73 75 63 63 65 65 64 73 2e 0a 23 0a 23 20  T succeeds..#.# 
72f0: 70 61 67 65 72 31 2d 35 2e 32 2e 2a 3a 20 4d 75  pager1-5.2.*: Mu
7300: 6c 74 69 2d 66 69 6c 65 20 63 6f 6d 6d 69 74 73  lti-file commits
7310: 20 77 69 74 68 20 6a 6f 75 72 6e 61 6c 5f 6d 6f   with journal_mo
7320: 64 65 3d 6d 65 6d 6f 72 79 2e 0a 23 0a 23 20 70  de=memory..#.# p
7330: 61 67 65 72 31 2d 35 2e 33 2e 2a 3a 20 4d 75 6c  ager1-5.3.*: Mul
7340: 74 69 2d 66 69 6c 65 20 63 6f 6d 6d 69 74 73 20  ti-file commits 
7350: 77 69 74 68 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  with journal_mod
7360: 65 3d 6d 65 6d 6f 72 79 2e 0a 23 0a 23 20 70 61  e=memory..#.# pa
7370: 67 65 72 31 2d 35 2e 34 2e 2a 3a 20 43 68 65 63  ger1-5.4.*: Chec
7380: 6b 20 74 68 61 74 20 77 69 74 68 20 73 79 6e 63  k that with sync
7390: 68 72 6f 6e 6f 75 73 3d 6e 6f 72 6d 61 6c 2c 20  hronous=normal, 
73a0: 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e  the master-journ
73b0: 61 6c 20 66 69 6c 65 0a 23 20 20 20 20 20 20 20  al file.#       
73c0: 20 20 20 20 20 20 20 20 6e 61 6d 65 20 69 73 20          name is 
73d0: 61 64 64 65 64 20 74 6f 20 61 20 6a 6f 75 72 6e  added to a journ
73e0: 61 6c 20 66 69 6c 65 20 69 6d 6d 65 64 69 61 74  al file immediat
73f0: 65 6c 79 20 61 66 74 65 72 20 74 68 65 20 6c 61  ely after the la
7400: 73 74 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  st.#            
7410: 20 20 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72     journal recor
7420: 64 2e 20 42 75 74 20 77 69 74 68 20 73 79 6e 63  d. But with sync
7430: 68 72 6f 6e 6f 75 73 3d 66 75 6c 6c 2c 20 65 78  hronous=full, ex
7440: 74 72 61 20 75 6e 75 73 65 64 20 73 70 61 63 65  tra unused space
7450: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
7460: 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 65   is allocated be
7470: 74 77 65 65 6e 20 74 68 65 20 6c 61 73 74 20 6a  tween the last j
7480: 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 61 6e  ournal record an
7490: 64 20 74 68 65 20 0a 23 20 20 20 20 20 20 20 20  d the .#        
74a0: 20 20 20 20 20 20 20 6d 61 73 74 65 72 2d 6a 6f         master-jo
74b0: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
74c0: 73 6f 20 74 68 61 74 20 74 68 65 20 6d 61 73 74  so that the mast
74d0: 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  er-journal file.
74e0: 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  #               
74f0: 6e 61 6d 65 20 64 6f 65 73 20 6e 6f 74 20 6c 69  name does not li
7500: 65 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 73 65  e on the same se
7510: 63 74 6f 72 20 61 73 20 74 68 65 20 6c 61 73 74  ctor as the last
7520: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 23 20   journal file.# 
7530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
7540: 63 6f 72 64 2e 0a 23 0a 23 20 70 61 67 65 72 31  cord..#.# pager1
7550: 2d 35 2e 35 2e 2a 3a 20 43 68 65 63 6b 20 74 68  -5.5.*: Check th
7560: 61 74 20 69 6e 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  at in journal_mo
7570: 64 65 3d 50 45 52 53 49 53 54 20 6d 6f 64 65 2c  de=PERSIST mode,
7580: 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20   a journal file 
7590: 69 73 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  is.#            
75a0: 20 20 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20     truncated to 
75b0: 7a 65 72 6f 20 62 79 74 65 73 20 77 68 65 6e 20  zero bytes when 
75c0: 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 74 72 61  a multi-file tra
75d0: 6e 73 61 63 74 69 6f 6e 20 69 73 20 0a 23 20 20  nsaction is .#  
75e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6d               com
75f0: 6d 69 74 74 65 64 20 28 69 6e 73 74 65 61 64 20  mitted (instead 
7600: 6f 66 20 74 68 65 20 66 69 72 73 74 20 63 6f 75  of the first cou
7610: 70 6c 65 20 6f 66 20 62 79 74 65 73 20 62 65 69  ple of bytes bei
7620: 6e 67 20 7a 65 72 6f 65 64 29 2e 0a 23 0a 23 0a  ng zeroed)..#.#.
7630: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 35  do_test pager1-5
7640: 2e 31 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73 69  .1.1 {.  faultsi
7650: 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f  m_delete_and_reo
7660: 70 65 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  pen.  execsql {.
7670: 20 20 20 20 41 54 54 41 43 48 20 27 74 65 73 74      ATTACH 'test
7680: 2e 64 62 32 27 20 41 53 20 61 75 78 3b 0a 20 20  .db2' AS aux;.  
7690: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
76a0: 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 43 52 45  1(a, b);.    CRE
76b0: 41 54 45 20 54 41 42 4c 45 20 61 75 78 2e 74 32  ATE TABLE aux.t2
76c0: 28 61 2c 20 62 29 3b 0a 20 20 20 20 49 4e 53 45  (a, b);.    INSE
76d0: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
76e0: 53 28 31 37 2c 20 27 4c 65 6e 69 6e 27 29 3b 0a  S(17, 'Lenin');.
76f0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
7700: 74 31 20 56 41 4c 55 45 53 28 32 32 2c 20 27 53  t1 VALUES(22, 'S
7710: 74 61 6c 69 6e 27 29 3b 0a 20 20 20 20 49 4e 53  talin');.    INS
7720: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
7730: 45 53 28 35 33 2c 20 27 4b 68 72 75 73 68 63 68  ES(53, 'Khrushch
7740: 65 76 27 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64  ev');.  }.} {}.d
7750: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 35 2e  o_test pager1-5.
7760: 31 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  1.2 {.  execsql 
7770: 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20  {.    BEGIN;.   
7780: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
7790: 31 20 56 41 4c 55 45 53 28 36 34 2c 20 27 42 72  1 VALUES(64, 'Br
77a0: 65 7a 68 6e 65 76 27 29 3b 0a 20 20 20 20 20 20  ezhnev');.      
77b0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 53  INSERT INTO t2 S
77c0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b  ELECT * FROM t1;
77d0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 20 64  .  }.  sqlite3 d
77e0: 62 32 20 74 65 73 74 2e 64 62 32 0a 20 20 65 78  b2 test.db2.  ex
77f0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49  ecsql {.    BEGI
7800: 4e 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20  N;.      SELECT 
7810: 2a 20 46 52 4f 4d 20 74 32 3b 0a 20 20 7d 20 64  * FROM t2;.  } d
7820: 62 32 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20  b2.} {}.do_test 
7830: 70 61 67 65 72 31 2d 35 2e 31 2e 33 20 7b 0a 20  pager1-5.1.3 {. 
7840: 20 63 61 74 63 68 73 71 6c 20 43 4f 4d 4d 49 54   catchsql COMMIT
7850: 0a 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20  .} {1 {database 
7860: 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 64 6f 5f 74  is locked}}.do_t
7870: 65 73 74 20 70 61 67 65 72 31 2d 35 2e 31 2e 34  est pager1-5.1.4
7880: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 43 4f 4d   {.  execsql COM
7890: 4d 49 54 20 64 62 32 0a 20 20 65 78 65 63 73 71  MIT db2.  execsq
78a0: 6c 20 43 4f 4d 4d 49 54 0a 20 20 65 78 65 63 73  l COMMIT.  execs
78b0: 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52  ql { SELECT * FR
78c0: 4f 4d 20 74 32 20 7d 20 64 62 32 0a 7d 20 7b 31  OM t2 } db2.} {1
78d0: 37 20 4c 65 6e 69 6e 20 32 32 20 53 74 61 6c 69  7 Lenin 22 Stali
78e0: 6e 20 35 33 20 4b 68 72 75 73 68 63 68 65 76 20  n 53 Khrushchev 
78f0: 36 34 20 42 72 65 7a 68 6e 65 76 7d 0a 64 6f 5f  64 Brezhnev}.do_
7900: 74 65 73 74 20 70 61 67 65 72 31 2d 35 2e 31 2e  test pager1-5.1.
7910: 35 20 7b 0a 20 20 64 62 32 20 63 6c 6f 73 65 0a  5 {.  db2 close.
7920: 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74 20 70 61  } {}..do_test pa
7930: 67 65 72 31 2d 35 2e 32 2e 31 20 7b 0a 20 20 65  ger1-5.2.1 {.  e
7940: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41  xecsql {.    PRA
7950: 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
7960: 20 3d 20 6d 65 6d 6f 72 79 3b 0a 20 20 20 20 42   = memory;.    B
7970: 45 47 49 4e 3b 0a 20 20 20 20 20 20 49 4e 53 45  EGIN;.      INSE
7980: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
7990: 53 28 38 34 2c 20 27 41 6e 64 72 6f 70 6f 76 27  S(84, 'Andropov'
79a0: 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  );.      INSERT 
79b0: 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 38  INTO t2 VALUES(8
79c0: 34 2c 20 27 41 6e 64 72 6f 70 6f 76 27 29 3b 0a  4, 'Andropov');.
79d0: 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a      COMMIT;.  }.
79e0: 7d 20 7b 6d 65 6d 6f 72 79 7d 0a 64 6f 5f 74 65  } {memory}.do_te
79f0: 73 74 20 70 61 67 65 72 31 2d 35 2e 33 2e 31 20  st pager1-5.3.1 
7a00: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
7a10: 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c    PRAGMA journal
7a20: 5f 6d 6f 64 65 20 3d 20 6f 66 66 3b 0a 20 20 20  _mode = off;.   
7a30: 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 49 4e   BEGIN;.      IN
7a40: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
7a50: 55 45 53 28 38 35 2c 20 27 47 6f 72 62 61 63 68  UES(85, 'Gorbach
7a60: 65 76 27 29 3b 0a 20 20 20 20 20 20 49 4e 53 45  ev');.      INSE
7a70: 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45  RT INTO t2 VALUE
7a80: 53 28 38 35 2c 20 27 47 6f 72 62 61 63 68 65 76  S(85, 'Gorbachev
7a90: 27 29 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a  ');.    COMMIT;.
7aa0: 20 20 7d 0a 7d 20 7b 6f 66 66 7d 0a 0a 64 6f 5f    }.} {off}..do_
7ab0: 74 65 73 74 20 70 61 67 65 72 31 2d 35 2e 34 2e  test pager1-5.4.
7ac0: 31 20 7b 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20  1 {.  db close. 
7ad0: 20 74 65 73 74 76 66 73 20 74 76 0a 20 20 73 71   testvfs tv.  sq
7ae0: 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62  lite3 db test.db
7af0: 20 2d 76 66 73 20 74 76 0a 20 20 65 78 65 63 73   -vfs tv.  execs
7b00: 71 6c 20 7b 20 41 54 54 41 43 48 20 27 74 65 73  ql { ATTACH 'tes
7b10: 74 2e 64 62 32 27 20 41 53 20 61 75 78 20 7d 0a  t.db2' AS aux }.
7b20: 0a 20 20 74 76 20 66 69 6c 74 65 72 20 78 44 65  .  tv filter xDe
7b30: 6c 65 74 65 0a 20 20 74 76 20 73 63 72 69 70 74  lete.  tv script
7b40: 20 6d 61 78 5f 6a 6f 75 72 6e 61 6c 5f 73 69 7a   max_journal_siz
7b50: 65 0a 20 20 74 76 20 73 65 63 74 6f 72 73 69 7a  e.  tv sectorsiz
7b60: 65 20 35 31 32 0a 20 20 73 65 74 20 3a 3a 6d 61  e 512.  set ::ma
7b70: 78 5f 6a 6f 75 72 6e 61 6c 20 30 0a 20 20 70 72  x_journal 0.  pr
7b80: 6f 63 20 6d 61 78 5f 6a 6f 75 72 6e 61 6c 5f 73  oc max_journal_s
7b90: 69 7a 65 20 7b 6d 65 74 68 6f 64 20 61 72 67 73  ize {method args
7ba0: 7d 20 7b 0a 20 20 20 20 73 65 74 20 73 7a 20 30  } {.    set sz 0
7bb0: 0a 20 20 20 20 63 61 74 63 68 20 7b 20 73 65 74  .    catch { set
7bc0: 20 73 7a 20 5b 66 69 6c 65 20 73 69 7a 65 20 74   sz [file size t
7bd0: 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5d 20  est.db-journal] 
7be0: 7d 0a 20 20 20 20 69 66 20 7b 24 73 7a 20 3e 20  }.    if {$sz > 
7bf0: 24 3a 3a 6d 61 78 5f 6a 6f 75 72 6e 61 6c 7d 20  $::max_journal} 
7c00: 7b 0a 20 20 20 20 20 20 73 65 74 20 3a 3a 6d 61  {.      set ::ma
7c10: 78 5f 6a 6f 75 72 6e 61 6c 20 24 73 7a 0a 20 20  x_journal $sz.  
7c20: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 53    }.    return S
7c30: 51 4c 49 54 45 5f 4f 4b 0a 20 20 7d 0a 20 20 65  QLITE_OK.  }.  e
7c40: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41  xecsql {.    PRA
7c50: 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
7c60: 20 3d 20 44 45 4c 45 54 45 3b 0a 20 20 20 20 50   = DELETE;.    P
7c70: 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75  RAGMA synchronou
7c80: 73 20 3d 20 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20  s = NORMAL;.    
7c90: 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 49 4e 53  BEGIN;.      INS
7ca0: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
7cb0: 45 53 28 38 35 2c 20 27 47 6f 72 62 61 63 68 65  ES(85, 'Gorbache
7cc0: 76 27 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  v');.      INSER
7cd0: 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53  T INTO t2 VALUES
7ce0: 28 38 35 2c 20 27 47 6f 72 62 61 63 68 65 76 27  (85, 'Gorbachev'
7cf0: 29 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20  );.    COMMIT;. 
7d00: 20 7d 0a 0a 20 20 23 20 54 68 65 20 73 69 7a 65   }..  # The size
7d10: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
7d20: 66 69 6c 65 20 69 73 20 6e 6f 77 3a 0a 20 20 23  file is now:.  #
7d30: 20 0a 20 20 23 20 20 20 31 29 20 35 31 32 20 62   .  #   1) 512 b
7d40: 79 74 65 20 68 65 61 64 65 72 20 2b 0a 20 20 23  yte header +.  #
7d50: 20 20 20 32 29 20 32 20 2a 20 28 31 30 32 34 2b     2) 2 * (1024+
7d60: 38 29 20 62 79 74 65 20 72 65 63 6f 72 64 73 20  8) byte records 
7d70: 2b 0a 20 20 23 20 20 20 33 29 20 32 30 2b 4e 20  +.  #   3) 20+N 
7d80: 62 79 74 65 73 20 6f 66 20 6d 61 73 74 65 72 2d  bytes of master-
7d90: 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 2c  journal pointer,
7da0: 20 77 68 65 72 65 20 4e 20 69 73 20 74 68 65 20   where N is the 
7db0: 73 69 7a 65 20 6f 66 20 0a 20 20 23 20 20 20 20  size of .  #    
7dc0: 20 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75    the master-jou
7dd0: 72 6e 61 6c 20 6e 61 6d 65 20 65 6e 63 6f 64 65  rnal name encode
7de0: 64 20 61 73 20 75 74 66 2d 38 20 77 69 74 68 20  d as utf-8 with 
7df0: 6e 6f 20 6e 75 6c 20 74 65 72 6d 2e 0a 20 20 23  no nul term..  #
7e00: 0a 20 20 73 65 74 20 6d 6a 5f 70 6f 69 6e 74 65  .  set mj_pointe
7e10: 72 20 5b 65 78 70 72 20 7b 0a 20 20 20 20 32 30  r [expr {.    20
7e20: 20 2b 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74   + [string lengt
7e30: 68 20 22 74 65 73 74 2e 64 62 2d 6d 6a 58 58 58  h "test.db-mjXXX
7e40: 58 58 58 39 58 58 22 5d 0a 20 20 7d 5d 0a 20 20  XXX9XX"].  }].  
7e50: 23 0a 20 20 23 20 20 20 4e 4f 54 45 3a 20 46 6f  #.  #   NOTE: Fo
7e60: 72 20 69 74 65 6d 20 33 20 61 62 6f 76 65 2c 20  r item 3 above, 
7e70: 69 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 53  if the current S
7e80: 51 4c 69 74 65 20 56 46 53 20 6c 61 63 6b 73 20  QLite VFS lacks 
7e90: 74 68 65 20 63 6f 6e 63 65 70 74 20 6f 66 20 61  the concept of a
7ea0: 0a 20 20 23 20 20 20 20 20 20 20 20 20 63 75 72  .  #         cur
7eb0: 72 65 6e 74 20 64 69 72 65 63 74 6f 72 79 2c 20  rent directory, 
7ec0: 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68  the length of th
7ed0: 65 20 63 75 72 72 65 6e 74 20 64 69 72 65 63 74  e current direct
7ee0: 6f 72 79 20 6e 61 6d 65 20 70 6c 75 73 20 31 0a  ory name plus 1.
7ef0: 20 20 23 20 20 20 20 20 20 20 20 20 63 68 61 72    #         char
7f00: 61 63 74 65 72 20 66 6f 72 20 74 68 65 20 64 69  acter for the di
7f10: 72 65 63 74 6f 72 79 20 73 65 70 61 72 61 74 6f  rectory separato
7f20: 72 20 63 68 61 72 61 63 74 65 72 20 61 72 65 20  r character are 
7f30: 4e 4f 54 20 63 6f 75 6e 74 65 64 20 61 73 0a 20  NOT counted as. 
7f40: 20 23 20 20 20 20 20 20 20 20 20 70 61 72 74 20   #         part 
7f50: 6f 66 20 74 68 65 20 74 6f 74 61 6c 20 73 69 7a  of the total siz
7f60: 65 3b 20 6f 74 68 65 72 77 69 73 65 2c 20 74 68  e; otherwise, th
7f70: 65 79 20 61 72 65 2e 0a 20 20 23 0a 20 20 69 66  ey are..  #.  if
7f80: 63 61 70 61 62 6c 65 20 63 75 72 64 69 72 20 7b  capable curdir {
7f90: 0a 20 20 20 20 73 65 74 20 6d 6a 5f 70 6f 69 6e  .    set mj_poin
7fa0: 74 65 72 20 5b 65 78 70 72 20 7b 24 6d 6a 5f 70  ter [expr {$mj_p
7fb0: 6f 69 6e 74 65 72 20 2b 20 5b 73 74 72 69 6e 67  ointer + [string
7fc0: 20 6c 65 6e 67 74 68 20 5b 67 65 74 5f 70 77 64   length [get_pwd
7fd0: 5d 5d 20 2b 20 31 7d 5d 0a 20 20 7d 0a 20 20 65  ]] + 1}].  }.  e
7fe0: 78 70 72 20 7b 24 3a 3a 6d 61 78 5f 6a 6f 75 72  xpr {$::max_jour
7ff0: 6e 61 6c 3d 3d 28 35 31 32 2b 32 2a 28 31 30 32  nal==(512+2*(102
8000: 34 2b 38 29 2b 24 6d 6a 5f 70 6f 69 6e 74 65 72  4+8)+$mj_pointer
8010: 29 7d 0a 7d 20 31 0a 64 6f 5f 74 65 73 74 20 70  )}.} 1.do_test p
8020: 61 67 65 72 31 2d 35 2e 34 2e 32 20 7b 0a 20 20  ager1-5.4.2 {.  
8030: 73 65 74 20 3a 3a 6d 61 78 5f 6a 6f 75 72 6e 61  set ::max_journa
8040: 6c 20 30 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  l 0.  execsql {.
8050: 20 20 20 20 50 52 41 47 4d 41 20 73 79 6e 63 68      PRAGMA synch
8060: 72 6f 6e 6f 75 73 20 3d 20 66 75 6c 6c 3b 0a 20  ronous = full;. 
8070: 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20     BEGIN;.      
8080: 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 20 57  DELETE FROM t1 W
8090: 48 45 52 45 20 62 20 3d 20 27 4c 65 6e 69 6e 27  HERE b = 'Lenin'
80a0: 3b 0a 20 20 20 20 20 20 44 45 4c 45 54 45 20 46  ;.      DELETE F
80b0: 52 4f 4d 20 74 32 20 57 48 45 52 45 20 62 20 3d  ROM t2 WHERE b =
80c0: 20 27 4c 65 6e 69 6e 27 3b 0a 20 20 20 20 43 4f   'Lenin';.    CO
80d0: 4d 4d 49 54 3b 0a 20 20 7d 0a 0a 20 20 23 20 49  MMIT;.  }..  # I
80e0: 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 66 75  n synchronous=fu
80f0: 6c 6c 20 6d 6f 64 65 2c 20 74 68 65 20 6d 61 73  ll mode, the mas
8100: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  ter-journal poin
8110: 74 65 72 20 69 73 20 6e 6f 74 20 77 72 69 74 74  ter is not writt
8120: 65 6e 0a 20 20 23 20 64 69 72 65 63 74 6c 79 20  en.  # directly 
8130: 61 66 74 65 72 20 74 68 65 20 6c 61 73 74 20 72  after the last r
8140: 65 63 6f 72 64 20 69 6e 20 74 68 65 20 6a 6f 75  ecord in the jou
8150: 72 6e 61 6c 20 66 69 6c 65 2e 20 49 6e 73 74 65  rnal file. Inste
8160: 61 64 2c 20 69 74 20 69 73 0a 20 20 23 20 77 72  ad, it is.  # wr
8170: 69 74 74 65 6e 20 73 74 61 72 74 69 6e 67 20 61  itten starting a
8180: 74 20 74 68 65 20 6e 65 78 74 20 28 69 6e 20 74  t the next (in t
8190: 68 69 73 20 63 61 73 65 20 35 31 32 20 62 79 74  his case 512 byt
81a0: 65 29 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61  e) sector bounda
81b0: 72 79 2e 0a 20 20 23 0a 20 20 73 65 74 20 6d 6a  ry..  #.  set mj
81c0: 5f 70 6f 69 6e 74 65 72 20 5b 65 78 70 72 20 7b  _pointer [expr {
81d0: 0a 20 20 20 20 32 30 20 2b 20 5b 73 74 72 69 6e  .    20 + [strin
81e0: 67 20 6c 65 6e 67 74 68 20 22 74 65 73 74 2e 64  g length "test.d
81f0: 62 2d 6d 6a 58 58 58 58 58 58 39 58 58 22 5d 0a  b-mjXXXXXX9XX"].
8200: 20 20 7d 5d 0a 20 20 23 0a 20 20 23 20 20 20 4e    }].  #.  #   N
8210: 4f 54 45 3a 20 49 66 20 74 68 65 20 63 75 72 72  OTE: If the curr
8220: 65 6e 74 20 53 51 4c 69 74 65 20 56 46 53 20 6c  ent SQLite VFS l
8230: 61 63 6b 73 20 74 68 65 20 63 6f 6e 63 65 70 74  acks the concept
8240: 20 6f 66 20 61 20 63 75 72 72 65 6e 74 20 64 69   of a current di
8250: 72 65 63 74 6f 72 79 2c 0a 20 20 23 20 20 20 20  rectory,.  #    
8260: 20 20 20 20 20 74 68 65 20 6c 65 6e 67 74 68 20       the length 
8270: 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 64  of the current d
8280: 69 72 65 63 74 6f 72 79 20 6e 61 6d 65 20 70 6c  irectory name pl
8290: 75 73 20 31 20 63 68 61 72 61 63 74 65 72 20 66  us 1 character f
82a0: 6f 72 20 74 68 65 0a 20 20 23 20 20 20 20 20 20  or the.  #      
82b0: 20 20 20 64 69 72 65 63 74 6f 72 79 20 73 65 70     directory sep
82c0: 61 72 61 74 6f 72 20 63 68 61 72 61 63 74 65 72  arator character
82d0: 20 61 72 65 20 4e 4f 54 20 63 6f 75 6e 74 65 64   are NOT counted
82e0: 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   as part of the 
82f0: 74 6f 74 61 6c 0a 20 20 23 20 20 20 20 20 20 20  total.  #       
8300: 20 20 73 69 7a 65 3b 20 6f 74 68 65 72 77 69 73    size; otherwis
8310: 65 2c 20 74 68 65 79 20 61 72 65 2e 0a 20 20 23  e, they are..  #
8320: 0a 20 20 69 66 63 61 70 61 62 6c 65 20 63 75 72  .  ifcapable cur
8330: 64 69 72 20 7b 0a 20 20 20 20 73 65 74 20 6d 6a  dir {.    set mj
8340: 5f 70 6f 69 6e 74 65 72 20 5b 65 78 70 72 20 7b  _pointer [expr {
8350: 24 6d 6a 5f 70 6f 69 6e 74 65 72 20 2b 20 5b 73  $mj_pointer + [s
8360: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 5b 67 65  tring length [ge
8370: 74 5f 70 77 64 5d 5d 20 2b 20 31 7d 5d 0a 20 20  t_pwd]] + 1}].  
8380: 7d 0a 20 20 65 78 70 72 20 7b 24 3a 3a 6d 61 78  }.  expr {$::max
8390: 5f 6a 6f 75 72 6e 61 6c 3d 3d 28 28 28 35 31 32  _journal==(((512
83a0: 2b 32 2a 28 31 30 32 34 2b 38 29 2b 35 31 31 29  +2*(1024+8)+511)
83b0: 2f 35 31 32 29 2a 35 31 32 20 2b 20 24 6d 6a 5f  /512)*512 + $mj_
83c0: 70 6f 69 6e 74 65 72 29 7d 0a 7d 20 31 0a 64 62  pointer)}.} 1.db
83d0: 20 63 6c 6f 73 65 0a 74 76 20 64 65 6c 65 74 65   close.tv delete
83e0: 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  ..do_test pager1
83f0: 2d 35 2e 35 2e 31 20 7b 0a 20 20 73 71 6c 69 74  -5.5.1 {.  sqlit
8400: 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20  e3 db test.db.  
8410: 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 41  execsql { .    A
8420: 54 54 41 43 48 20 27 74 65 73 74 2e 64 62 32 27  TTACH 'test.db2'
8430: 20 41 53 20 61 75 78 3b 0a 20 20 20 20 50 52 41   AS aux;.    PRA
8440: 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
8450: 20 3d 20 50 45 52 53 49 53 54 3b 0a 20 20 20 20   = PERSIST;.    
8460: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 33 28  CREATE TABLE t3(
8470: 61 2c 20 62 29 3b 0a 20 20 20 20 49 4e 53 45 52  a, b);.    INSER
8480: 54 20 49 4e 54 4f 20 74 33 20 53 45 4c 45 43 54  T INTO t3 SELECT
8490: 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30   randomblob(1500
84a0: 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35  ), randomblob(15
84b0: 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20  00) FROM t1;.   
84c0: 20 55 50 44 41 54 45 20 74 33 20 53 45 54 20 62   UPDATE t3 SET b
84d0: 20 3d 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35   = randomblob(15
84e0: 30 30 29 3b 0a 20 20 7d 0a 20 20 65 78 70 72 20  00);.  }.  expr 
84f0: 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e  [file size test.
8500: 64 62 2d 6a 6f 75 72 6e 61 6c 5d 20 3e 20 31 35  db-journal] > 15
8510: 30 30 30 0a 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73  000.} {1}.do_tes
8520: 74 20 70 61 67 65 72 31 2d 35 2e 35 2e 32 20 7b  t pager1-5.5.2 {
8530: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
8540: 20 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e   PRAGMA synchron
8550: 6f 75 73 20 3d 20 66 75 6c 6c 3b 0a 20 20 20 20  ous = full;.    
8560: 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 44 45 4c  BEGIN;.      DEL
8570: 45 54 45 20 46 52 4f 4d 20 74 31 20 57 48 45 52  ETE FROM t1 WHER
8580: 45 20 62 20 3d 20 27 53 74 61 6c 69 6e 27 3b 0a  E b = 'Stalin';.
8590: 20 20 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f        DELETE FRO
85a0: 4d 20 74 32 20 57 48 45 52 45 20 62 20 3d 20 27  M t2 WHERE b = '
85b0: 53 74 61 6c 69 6e 27 3b 0a 20 20 20 20 43 4f 4d  Stalin';.    COM
85c0: 4d 49 54 3b 0a 20 20 7d 0a 20 20 66 69 6c 65 20  MIT;.  }.  file 
85d0: 73 69 7a 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75  size test.db-jou
85e0: 72 6e 61 6c 0a 7d 20 7b 30 7d 0a 0a 0a 23 2d 2d  rnal.} {0}...#--
85f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8630: 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 65 20 66 6f  -------.# The fo
8640: 6c 6c 6f 77 69 6e 67 20 74 65 73 74 73 20 77 6f  llowing tests wo
8650: 72 6b 20 77 69 74 68 20 22 50 52 41 47 4d 41 20  rk with "PRAGMA 
8660: 6d 61 78 5f 70 61 67 65 5f 63 6f 75 6e 74 22 0a  max_page_count".
8670: 23 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  #.do_test pager1
8680: 2d 36 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73 69  -6.1 {.  faultsi
8690: 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f  m_delete_and_reo
86a0: 70 65 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  pen.  execsql {.
86b0: 20 20 20 20 50 52 41 47 4d 41 20 61 75 74 6f 5f      PRAGMA auto_
86c0: 76 61 63 75 75 6d 20 3d 20 6e 6f 6e 65 3b 0a 20  vacuum = none;. 
86d0: 20 20 20 50 52 41 47 4d 41 20 6d 61 78 5f 70 61     PRAGMA max_pa
86e0: 67 65 5f 63 6f 75 6e 74 20 3d 20 31 30 3b 0a 20  ge_count = 10;. 
86f0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
8700: 74 32 28 61 2c 20 62 29 3b 0a 20 20 20 20 43 52  t2(a, b);.    CR
8710: 45 41 54 45 20 54 41 42 4c 45 20 74 33 28 61 2c  EATE TABLE t3(a,
8720: 20 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20   b);.    CREATE 
8730: 54 41 42 4c 45 20 74 34 28 61 2c 20 62 29 3b 0a  TABLE t4(a, b);.
8740: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
8750: 20 74 35 28 61 2c 20 62 29 3b 0a 20 20 20 20 43   t5(a, b);.    C
8760: 52 45 41 54 45 20 54 41 42 4c 45 20 74 36 28 61  REATE TABLE t6(a
8770: 2c 20 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45  , b);.    CREATE
8780: 20 54 41 42 4c 45 20 74 37 28 61 2c 20 62 29 3b   TABLE t7(a, b);
8790: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
87a0: 45 20 74 38 28 61 2c 20 62 29 3b 0a 20 20 20 20  E t8(a, b);.    
87b0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 39 28  CREATE TABLE t9(
87c0: 61 2c 20 62 29 3b 0a 20 20 20 20 43 52 45 41 54  a, b);.    CREAT
87d0: 45 20 54 41 42 4c 45 20 74 31 30 28 61 2c 20 62  E TABLE t10(a, b
87e0: 29 3b 0a 20 20 7d 0a 7d 20 7b 31 30 7d 0a 64 6f  );.  }.} {10}.do
87f0: 5f 63 61 74 63 68 73 71 6c 5f 74 65 73 74 20 70  _catchsql_test p
8800: 61 67 65 72 31 2d 36 2e 32 20 7b 0a 20 20 43 52  ager1-6.2 {.  CR
8810: 45 41 54 45 20 54 41 42 4c 45 20 74 31 31 28 61  EATE TABLE t11(a
8820: 2c 20 62 29 0a 7d 20 7b 31 20 7b 64 61 74 61 62  , b).} {1 {datab
8830: 61 73 65 20 6f 72 20 64 69 73 6b 20 69 73 20 66  ase or disk is f
8840: 75 6c 6c 7d 7d 0a 64 6f 5f 65 78 65 63 73 71 6c  ull}}.do_execsql
8850: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 36 2e 34  _test pager1-6.4
8860: 20 7b 20 50 52 41 47 4d 41 20 6d 61 78 5f 70 61   { PRAGMA max_pa
8870: 67 65 5f 63 6f 75 6e 74 20 20 20 20 20 20 7d 20  ge_count      } 
8880: 7b 31 30 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  {10}.do_execsql_
8890: 74 65 73 74 20 70 61 67 65 72 31 2d 36 2e 35 20  test pager1-6.5 
88a0: 7b 20 50 52 41 47 4d 41 20 6d 61 78 5f 70 61 67  { PRAGMA max_pag
88b0: 65 5f 63 6f 75 6e 74 20 3d 20 31 35 20 7d 20 7b  e_count = 15 } {
88c0: 31 35 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  15}.do_execsql_t
88d0: 65 73 74 20 70 61 67 65 72 31 2d 36 2e 36 20 7b  est pager1-6.6 {
88e0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
88f0: 31 28 61 2c 20 62 29 20 20 20 20 20 7d 20 7b 7d  1(a, b)     } {}
8900: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
8910: 20 70 61 67 65 72 31 2d 36 2e 37 20 7b 0a 20 20   pager1-6.7 {.  
8920: 42 45 47 49 4e 3b 0a 20 20 20 20 49 4e 53 45 52  BEGIN;.    INSER
8930: 54 20 49 4e 54 4f 20 74 31 31 20 56 41 4c 55 45  T INTO t11 VALUE
8940: 53 28 31 2c 20 32 29 3b 0a 20 20 20 20 50 52 41  S(1, 2);.    PRA
8950: 47 4d 41 20 6d 61 78 5f 70 61 67 65 5f 63 6f 75  GMA max_page_cou
8960: 6e 74 20 3d 20 31 33 3b 0a 7d 20 7b 31 33 7d 0a  nt = 13;.} {13}.
8970: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
8980: 70 61 67 65 72 31 2d 36 2e 38 20 7b 0a 20 20 20  pager1-6.8 {.   
8990: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 31   INSERT INTO t11
89a0: 20 56 41 4c 55 45 53 28 33 2c 20 34 29 3b 0a 20   VALUES(3, 4);. 
89b0: 20 20 20 50 52 41 47 4d 41 20 6d 61 78 5f 70 61     PRAGMA max_pa
89c0: 67 65 5f 63 6f 75 6e 74 20 3d 20 31 30 3b 0a 7d  ge_count = 10;.}
89d0: 20 7b 31 31 7d 0a 64 6f 5f 65 78 65 63 73 71 6c   {11}.do_execsql
89e0: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 36 2e 39  _test pager1-6.9
89f0: 20 7b 20 43 4f 4d 4d 49 54 20 7d 20 7b 7d 0a 0a   { COMMIT } {}..
8a00: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
8a10: 70 61 67 65 72 31 2d 36 2e 31 30 20 7b 20 50 52  pager1-6.10 { PR
8a20: 41 47 4d 41 20 6d 61 78 5f 70 61 67 65 5f 63 6f  AGMA max_page_co
8a30: 75 6e 74 20 3d 20 31 30 20 7d 20 7b 31 31 7d 0a  unt = 10 } {11}.
8a40: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
8a50: 70 61 67 65 72 31 2d 36 2e 31 31 20 7b 20 53 45  pager1-6.11 { SE
8a60: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 31 20  LECT * FROM t11 
8a70: 7d 20 20 20 20 20 20 20 20 20 20 7b 31 20 32 20  }          {1 2 
8a80: 33 20 34 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  3 4}.do_execsql_
8a90: 74 65 73 74 20 70 61 67 65 72 31 2d 36 2e 31 32  test pager1-6.12
8aa0: 20 7b 20 50 52 41 47 4d 41 20 6d 61 78 5f 70 61   { PRAGMA max_pa
8ab0: 67 65 5f 63 6f 75 6e 74 20 7d 20 20 20 20 20 20  ge_count }      
8ac0: 7b 31 31 7d 0a 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  {11}...#--------
8ad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8ae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8af0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8b00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8b10: 2d 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  -.# The followin
8b20: 67 20 74 65 73 74 73 20 77 6f 72 6b 20 77 69 74  g tests work wit
8b30: 68 20 22 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61  h "PRAGMA journa
8b40: 6c 5f 6d 6f 64 65 3d 54 52 55 4e 43 41 54 45 22  l_mode=TRUNCATE"
8b50: 20 61 6e 64 0a 23 20 22 50 52 41 47 4d 41 20 6c   and.# "PRAGMA l
8b60: 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c  ocking_mode=EXCL
8b70: 55 53 49 56 45 22 2e 0a 23 0a 23 20 45 61 63 68  USIVE"..#.# Each
8b80: 20 74 65 73 74 20 69 73 20 73 70 65 63 69 66 69   test is specifi
8b90: 65 64 20 77 69 74 68 20 35 20 76 61 72 69 61 62  ed with 5 variab
8ba0: 6c 65 73 2e 20 41 73 20 66 6f 6c 6c 6f 77 73 3a  les. As follows:
8bb0: 0a 23 0a 23 20 20 20 24 74 6e 3a 20 20 54 65 73  .#.#   $tn:  Tes
8bc0: 74 20 4e 75 6d 62 65 72 2e 20 55 73 65 64 20 61  t Number. Used a
8bd0: 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 5b 64  s part of the [d
8be0: 6f 5f 74 65 73 74 5d 20 74 65 73 74 20 6e 61 6d  o_test] test nam
8bf0: 65 73 2e 0a 23 20 20 20 24 73 71 6c 3a 20 53 51  es..#   $sql: SQ
8c00: 4c 20 74 6f 20 65 78 65 63 75 74 65 2e 0a 23 20  L to execute..# 
8c10: 20 20 24 72 65 73 3a 20 45 78 70 65 63 74 65 64    $res: Expected
8c20: 20 72 65 73 75 6c 74 20 6f 66 20 65 78 65 63 75   result of execu
8c30: 74 69 6e 67 20 24 73 71 6c 2e 0a 23 20 20 20 24  ting $sql..#   $
8c40: 6a 73 3a 20 20 54 68 65 20 65 78 70 65 63 74 65  js:  The expecte
8c50: 64 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f  d size of the jo
8c60: 75 72 6e 61 6c 20 66 69 6c 65 2c 20 69 6e 20 62  urnal file, in b
8c70: 79 74 65 73 2c 20 61 66 74 65 72 20 65 78 65 63  ytes, after exec
8c80: 75 74 69 6e 67 0a 23 20 20 20 20 20 20 20 20 20  uting.#         
8c90: 74 68 65 20 53 51 4c 20 73 63 72 69 70 74 2e 20  the SQL script. 
8ca0: 4f 72 20 2d 31 20 69 66 20 74 68 65 20 6a 6f 75  Or -1 if the jou
8cb0: 72 6e 61 6c 20 69 73 20 6e 6f 74 20 65 78 70 65  rnal is not expe
8cc0: 63 74 65 64 20 74 6f 20 65 78 69 73 74 2e 0a 23  cted to exist..#
8cd0: 20 20 20 24 77 73 3a 20 20 54 68 65 20 65 78 70     $ws:  The exp
8ce0: 65 63 74 65 64 20 73 69 7a 65 20 6f 66 20 74 68  ected size of th
8cf0: 65 20 57 41 4c 20 66 69 6c 65 2c 20 69 6e 20 62  e WAL file, in b
8d00: 79 74 65 73 2c 20 61 66 74 65 72 20 65 78 65 63  ytes, after exec
8d10: 75 74 69 6e 67 0a 23 20 20 20 20 20 20 20 20 20  uting.#         
8d20: 74 68 65 20 53 51 4c 20 73 63 72 69 70 74 2e 20  the SQL script. 
8d30: 4f 72 20 2d 31 20 69 66 20 74 68 65 20 57 41 4c  Or -1 if the WAL
8d40: 20 69 73 20 6e 6f 74 20 65 78 70 65 63 74 65 64   is not expected
8d50: 20 74 6f 20 65 78 69 73 74 2e 0a 23 0a 69 66 63   to exist..#.ifc
8d60: 61 70 61 62 6c 65 20 77 61 6c 20 7b 0a 20 20 66  apable wal {.  f
8d70: 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61  aultsim_delete_a
8d80: 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 66 6f 72 65  nd_reopen.  fore
8d90: 61 63 68 20 7b 74 6e 20 73 71 6c 20 72 65 73 20  ach {tn sql res 
8da0: 6a 73 20 77 73 7d 20 5b 73 75 62 73 74 20 7b 0a  js ws} [subst {.
8db0: 20 20 0a 20 20 20 20 31 20 20 7b 0a 20 20 20 20    .    1  {.    
8dc0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
8dd0: 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 20 20 50  1(a, b);.      P
8de0: 52 41 47 4d 41 20 61 75 74 6f 5f 76 61 63 75 75  RAGMA auto_vacuu
8df0: 6d 3d 4f 46 46 3b 0a 20 20 20 20 20 20 50 52 41  m=OFF;.      PRA
8e00: 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d  GMA synchronous=
8e10: 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 20 20 50 52  NORMAL;.      PR
8e20: 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 3d 31  AGMA page_size=1
8e30: 30 32 34 3b 0a 20 20 20 20 20 20 50 52 41 47 4d  024;.      PRAGM
8e40: 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45  A locking_mode=E
8e50: 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20 20 20  XCLUSIVE;.      
8e60: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
8e70: 6f 64 65 3d 54 52 55 4e 43 41 54 45 3b 0a 20 20  ode=TRUNCATE;.  
8e80: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
8e90: 74 31 20 56 41 4c 55 45 53 28 31 2c 20 32 29 3b  t1 VALUES(1, 2);
8ea0: 0a 20 20 20 20 7d 20 7b 65 78 63 6c 75 73 69 76  .    } {exclusiv
8eb0: 65 20 74 72 75 6e 63 61 74 65 7d 20 30 20 2d 31  e truncate} 0 -1
8ec0: 0a 20 20 0a 20 20 20 20 32 20 20 7b 0a 20 20 20  .  .    2  {.   
8ed0: 20 20 20 42 45 47 49 4e 20 49 4d 4d 45 44 49 41     BEGIN IMMEDIA
8ee0: 54 45 3b 0a 20 20 20 20 20 20 20 20 53 45 4c 45  TE;.        SELE
8ef0: 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20  CT * FROM t1;.  
8f00: 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 20 20      COMMIT;.    
8f10: 7d 20 7b 31 20 32 7d 20 30 20 2d 31 0a 20 20 0a  } {1 2} 0 -1.  .
8f20: 20 20 20 20 33 20 20 7b 0a 20 20 20 20 20 20 42      3  {.      B
8f30: 45 47 49 4e 3b 0a 20 20 20 20 20 20 20 20 53 45  EGIN;.        SE
8f40: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a  LECT * FROM t1;.
8f50: 20 20 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20        COMMIT;.  
8f60: 20 20 7d 20 7b 31 20 32 7d 20 30 20 2d 31 0a 20    } {1 2} 0 -1. 
8f70: 20 0a 20 20 20 20 34 20 20 7b 20 50 52 41 47 4d   .    4  { PRAGM
8f80: 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d  A journal_mode =
8f90: 20 57 41 4c 20 7d 20 20 20 20 77 61 6c 20 20 20   WAL }    wal   
8fa0: 20 20 20 20 2d 31 20 2d 31 0a 20 20 20 20 35 20      -1 -1.    5 
8fb0: 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74   { INSERT INTO t
8fc0: 31 20 56 41 4c 55 45 53 28 33 2c 20 34 29 20 7d  1 VALUES(3, 4) }
8fd0: 20 20 7b 7d 20 20 20 20 20 20 20 20 2d 31 20 5b    {}        -1 [
8fe0: 77 61 6c 5f 66 69 6c 65 5f 73 69 7a 65 20 31 20  wal_file_size 1 
8ff0: 31 30 32 34 5d 0a 20 20 20 20 36 20 20 7b 20 50  1024].    6  { P
9000: 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  RAGMA locking_mo
9010: 64 65 20 3d 20 4e 4f 52 4d 41 4c 20 7d 20 65 78  de = NORMAL } ex
9020: 63 6c 75 73 69 76 65 20 2d 31 20 5b 77 61 6c 5f  clusive -1 [wal_
9030: 66 69 6c 65 5f 73 69 7a 65 20 31 20 31 30 32 34  file_size 1 1024
9040: 5d 0a 20 20 20 20 37 20 20 7b 20 49 4e 53 45 52  ].    7  { INSER
9050: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
9060: 28 35 2c 20 36 29 3b 20 7d 20 7b 7d 20 20 20 20  (5, 6); } {}    
9070: 20 20 20 20 2d 31 20 5b 77 61 6c 5f 66 69 6c 65      -1 [wal_file
9080: 5f 73 69 7a 65 20 32 20 31 30 32 34 5d 0a 20 20  _size 2 1024].  
9090: 0a 20 20 20 20 38 20 20 7b 20 50 52 41 47 4d 41  .    8  { PRAGMA
90a0: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20   journal_mode = 
90b0: 54 52 55 4e 43 41 54 45 20 7d 20 74 72 75 6e 63  TRUNCATE } trunc
90c0: 61 74 65 20 20 20 20 20 20 20 20 20 20 30 20 2d  ate          0 -
90d0: 31 0a 20 20 20 20 39 20 20 7b 20 49 4e 53 45 52  1.    9  { INSER
90e0: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
90f0: 28 37 2c 20 38 29 20 7d 20 20 20 20 7b 7d 20 20  (7, 8) }    {}  
9100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
9110: 2d 31 0a 20 20 20 20 31 30 20 7b 20 53 45 4c 45  -1.    10 { SELE
9120: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 20  CT * FROM t1 }  
9130: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 31 20               {1 
9140: 32 20 33 20 34 20 35 20 36 20 37 20 38 7d 20 30  2 3 4 5 6 7 8} 0
9150: 20 2d 31 0a 20 20 0a 20 20 7d 5d 20 7b 0a 20 20   -1.  .  }] {.  
9160: 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73    do_execsql_tes
9170: 74 20 70 61 67 65 72 31 2d 37 2e 31 2e 24 74 6e  t pager1-7.1.$tn
9180: 2e 31 20 24 73 71 6c 20 24 72 65 73 0a 20 20 20  .1 $sql $res.   
9190: 20 63 61 74 63 68 20 7b 20 73 65 74 20 4a 20 2d   catch { set J -
91a0: 31 20 3b 20 73 65 74 20 4a 20 5b 66 69 6c 65 20  1 ; set J [file 
91b0: 73 69 7a 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75  size test.db-jou
91c0: 72 6e 61 6c 5d 20 7d 0a 20 20 20 20 63 61 74 63  rnal] }.    catc
91d0: 68 20 7b 20 73 65 74 20 57 20 2d 31 20 3b 20 73  h { set W -1 ; s
91e0: 65 74 20 57 20 5b 66 69 6c 65 20 73 69 7a 65 20  et W [file size 
91f0: 74 65 73 74 2e 64 62 2d 77 61 6c 5d 20 7d 0a 20  test.db-wal] }. 
9200: 20 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72     do_test pager
9210: 31 2d 37 2e 31 2e 24 74 6e 2e 32 20 7b 20 6c 69  1-7.1.$tn.2 { li
9220: 73 74 20 24 4a 20 24 57 20 7d 20 5b 6c 69 73 74  st $J $W } [list
9230: 20 24 6a 73 20 24 77 73 5d 0a 20 20 7d 0a 7d 0a   $js $ws].  }.}.
9240: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
9250: 37 2e 32 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73  7.2.1 {.  faults
9260: 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65  im_delete_and_re
9270: 6f 70 65 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b  open.  execsql {
9280: 0a 20 20 20 20 50 52 41 47 4d 41 20 6c 6f 63 6b  .    PRAGMA lock
9290: 69 6e 67 5f 6d 6f 64 65 20 3d 20 45 58 43 4c 55  ing_mode = EXCLU
92a0: 53 49 56 45 3b 0a 20 20 20 20 43 52 45 41 54 45  SIVE;.    CREATE
92b0: 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b   TABLE t1(a, b);
92c0: 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20  .    BEGIN;.    
92d0: 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c    PRAGMA journal
92e0: 5f 6d 6f 64 65 20 3d 20 64 65 6c 65 74 65 3b 0a  _mode = delete;.
92f0: 20 20 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75        PRAGMA jou
9300: 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 74 72 75 6e  rnal_mode = trun
9310: 63 61 74 65 3b 0a 20 20 7d 0a 7d 20 7b 65 78 63  cate;.  }.} {exc
9320: 6c 75 73 69 76 65 20 64 65 6c 65 74 65 20 74 72  lusive delete tr
9330: 75 6e 63 61 74 65 7d 0a 64 6f 5f 74 65 73 74 20  uncate}.do_test 
9340: 70 61 67 65 72 31 2d 37 2e 32 2e 32 20 7b 0a 20  pager1-7.2.2 {. 
9350: 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52   execsql { INSER
9360: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
9370: 28 31 2c 20 32 29 20 7d 0a 20 20 65 78 65 63 73  (1, 2) }.  execs
9380: 71 6c 20 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72  ql { PRAGMA jour
9390: 6e 61 6c 5f 6d 6f 64 65 20 3d 20 70 65 72 73 69  nal_mode = persi
93a0: 73 74 20 7d 0a 7d 20 7b 74 72 75 6e 63 61 74 65  st }.} {truncate
93b0: 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  }.do_test pager1
93c0: 2d 37 2e 32 2e 33 20 7b 0a 20 20 65 78 65 63 73  -7.2.3 {.  execs
93d0: 71 6c 20 7b 20 43 4f 4d 4d 49 54 20 7d 0a 20 20  ql { COMMIT }.  
93e0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52  execsql {.    PR
93f0: 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
9400: 65 20 3d 20 70 65 72 73 69 73 74 3b 0a 20 20 20  e = persist;.   
9410: 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f   PRAGMA journal_
9420: 73 69 7a 65 5f 6c 69 6d 69 74 3b 0a 20 20 7d 0a  size_limit;.  }.
9430: 7d 20 7b 70 65 72 73 69 73 74 20 2d 31 7d 0a 0a  } {persist -1}..
9440: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
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 0a 23 20 54 68 65  ----------.# The
9490: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74 73   following tests
94a0: 2c 20 70 61 67 65 72 31 2d 38 2e 2a 2c 20 74 65  , pager1-8.*, te
94b0: 73 74 20 74 68 61 74 20 74 68 65 20 73 70 65 63  st that the spec
94c0: 69 61 6c 20 66 69 6c 65 6e 61 6d 65 73 20 0a 23  ial filenames .#
94d0: 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 61 6e 64 20   ":memory:" and 
94e0: 22 22 20 6f 70 65 6e 20 74 65 6d 70 6f 72 61 72  "" open temporar
94f0: 79 20 64 61 74 61 62 61 73 65 73 2e 0a 23 0a 66  y databases..#.f
9500: 6f 72 65 61 63 68 20 7b 74 6e 20 66 69 6c 65 6e  oreach {tn filen
9510: 61 6d 65 7d 20 7b 0a 20 20 31 20 3a 6d 65 6d 6f  ame} {.  1 :memo
9520: 72 79 3a 0a 20 20 32 20 22 22 0a 7d 20 7b 0a 20  ry:.  2 "".} {. 
9530: 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
9540: 38 2e 24 74 6e 2e 31 20 7b 0a 20 20 20 20 66 61  8.$tn.1 {.    fa
9550: 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e  ultsim_delete_an
9560: 64 5f 72 65 6f 70 65 6e 0a 20 20 20 20 64 62 20  d_reopen.    db 
9570: 63 6c 6f 73 65 0a 20 20 20 20 73 71 6c 69 74 65  close.    sqlite
9580: 33 20 64 62 20 24 66 69 6c 65 6e 61 6d 65 0a 20  3 db $filename. 
9590: 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20     execsql {.   
95a0: 20 20 20 50 52 41 47 4d 41 20 61 75 74 6f 5f 76     PRAGMA auto_v
95b0: 61 63 75 75 6d 20 3d 20 31 3b 0a 20 20 20 20 20  acuum = 1;.     
95c0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 78 31   CREATE TABLE x1
95d0: 28 78 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  (x);.      INSER
95e0: 54 20 49 4e 54 4f 20 78 31 20 56 41 4c 55 45 53  T INTO x1 VALUES
95f0: 28 27 43 68 61 72 6c 65 73 27 29 3b 0a 20 20 20  ('Charles');.   
9600: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78     INSERT INTO x
9610: 31 20 56 41 4c 55 45 53 28 27 4a 61 6d 65 73 27  1 VALUES('James'
9620: 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  );.      INSERT 
9630: 49 4e 54 4f 20 78 31 20 56 41 4c 55 45 53 28 27  INTO x1 VALUES('
9640: 4d 61 72 79 27 29 3b 0a 20 20 20 20 20 20 53 45  Mary');.      SE
9650: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 78 31 3b 0a  LECT * FROM x1;.
9660: 20 20 20 20 7d 0a 20 20 7d 20 7b 43 68 61 72 6c      }.  } {Charl
9670: 65 73 20 4a 61 6d 65 73 20 4d 61 72 79 7d 0a 0a  es James Mary}..
9680: 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
9690: 2d 38 2e 24 74 6e 2e 32 20 7b 0a 20 20 20 20 73  -8.$tn.2 {.    s
96a0: 71 6c 69 74 65 33 20 64 62 32 20 24 66 69 6c 65  qlite3 db2 $file
96b0: 6e 61 6d 65 0a 20 20 20 20 63 61 74 63 68 73 71  name.    catchsq
96c0: 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  l { SELECT * FRO
96d0: 4d 20 78 31 20 7d 20 64 62 32 0a 20 20 7d 20 7b  M x1 } db2.  } {
96e0: 31 20 7b 6e 6f 20 73 75 63 68 20 74 61 62 6c 65  1 {no such table
96f0: 3a 20 78 31 7d 7d 0a 0a 20 20 64 6f 5f 65 78 65  : x1}}..  do_exe
9700: 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31  csql_test pager1
9710: 2d 38 2e 24 74 6e 2e 33 20 7b 0a 20 20 20 20 42  -8.$tn.3 {.    B
9720: 45 47 49 4e 3b 0a 20 20 20 20 20 20 49 4e 53 45  EGIN;.      INSE
9730: 52 54 20 49 4e 54 4f 20 78 31 20 56 41 4c 55 45  RT INTO x1 VALUE
9740: 53 28 27 57 69 6c 6c 69 61 6d 27 29 3b 0a 20 20  S('William');.  
9750: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
9760: 78 31 20 56 41 4c 55 45 53 28 27 41 6e 6e 65 27  x1 VALUES('Anne'
9770: 29 3b 0a 20 20 20 20 52 4f 4c 4c 42 41 43 4b 3b  );.    ROLLBACK;
9780: 0a 20 20 7d 20 7b 7d 0a 7d 0a 0a 23 2d 2d 2d 2d  .  } {}.}..#----
9790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
97a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
97b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
97c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
97d0: 2d 2d 2d 2d 2d 0a 23 20 54 68 65 20 6e 65 78 74  -----.# The next
97e0: 20 62 6c 6f 63 6b 20 6f 66 20 74 65 73 74 73 20   block of tests 
97f0: 2d 20 70 61 67 65 72 31 2d 39 2e 2a 20 2d 20 64  - pager1-9.* - d
9800: 65 61 6c 20 77 69 74 68 20 69 6e 74 65 72 61 63  eal with interac
9810: 74 69 6f 6e 73 20 62 65 74 77 65 65 6e 0a 23 20  tions between.# 
9820: 74 68 65 20 70 61 67 65 72 20 61 6e 64 20 74 68  the pager and th
9830: 65 20 62 61 63 6b 75 70 20 41 50 49 2e 20 54 65  e backup API. Te
9840: 73 74 20 63 61 73 65 73 3a 0a 23 0a 23 20 20 20  st cases:.#.#   
9850: 70 61 67 65 72 31 2d 39 2e 31 2e 2a 3a 20 54 65  pager1-9.1.*: Te
9860: 73 74 20 74 68 61 74 20 61 20 62 61 63 6b 75 70  st that a backup
9870: 20 63 6f 6d 70 6c 65 74 65 73 20 73 75 63 63 65   completes succe
9880: 73 73 66 75 6c 6c 79 20 65 76 65 6e 20 69 66 20  ssfully even if 
9890: 74 68 65 0a 23 20 20 20 20 20 20 20 20 20 20 20  the.#           
98a0: 20 20 20 20 20 20 73 6f 75 72 63 65 20 64 62 20        source db 
98b0: 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 64 75  is written to du
98c0: 72 69 6e 67 20 74 68 65 20 62 61 63 6b 75 70 20  ring the backup 
98d0: 6f 70 2e 0a 23 0a 23 20 20 20 70 61 67 65 72 31  op..#.#   pager1
98e0: 2d 39 2e 32 2e 2a 3a 20 54 65 73 74 20 74 68 61  -9.2.*: Test tha
98f0: 74 20 61 20 62 61 63 6b 75 70 20 63 6f 6d 70 6c  t a backup compl
9900: 65 74 65 73 20 73 75 63 63 65 73 73 66 75 6c 6c  etes successfull
9910: 79 20 65 76 65 6e 20 69 66 20 74 68 65 0a 23 20  y even if the.# 
9920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9930: 73 6f 75 72 63 65 20 64 62 20 69 73 20 77 72 69  source db is wri
9940: 74 74 65 6e 20 74 6f 20 61 6e 64 20 74 68 65 6e  tten to and then
9950: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 64 75 72   rolled back dur
9960: 69 6e 67 20 61 20 0a 23 20 20 20 20 20 20 20 20  ing a .#        
9970: 20 20 20 20 20 20 20 20 20 62 61 63 6b 75 70 20           backup 
9980: 6f 70 65 72 61 74 69 6f 6e 2e 0a 23 0a 64 6f 5f  operation..#.do_
9990: 74 65 73 74 20 70 61 67 65 72 31 2d 39 2e 30 2e  test pager1-9.0.
99a0: 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64  1 {.  faultsim_d
99b0: 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e  elete_and_reopen
99c0: 0a 20 20 64 62 20 66 75 6e 63 20 61 5f 73 74 72  .  db func a_str
99d0: 69 6e 67 20 61 5f 73 74 72 69 6e 67 0a 20 20 65  ing a_string.  e
99e0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41  xecsql {.    PRA
99f0: 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 20 3d  GMA cache_size =
9a00: 20 31 30 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a   10;.    BEGIN;.
9a10: 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42        CREATE TAB
9a20: 4c 45 20 61 62 28 61 2c 20 62 2c 20 55 4e 49 51  LE ab(a, b, UNIQ
9a30: 55 45 28 61 2c 20 62 29 29 3b 0a 20 20 20 20 20  UE(a, b));.     
9a40: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 20   INSERT INTO ab 
9a50: 56 41 4c 55 45 53 28 20 61 5f 73 74 72 69 6e 67  VALUES( a_string
9a60: 28 32 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28  (200), a_string(
9a70: 33 30 30 29 20 29 3b 0a 20 20 20 20 20 20 49 4e  300) );.      IN
9a80: 53 45 52 54 20 49 4e 54 4f 20 61 62 20 53 45 4c  SERT INTO ab SEL
9a90: 45 43 54 20 61 5f 73 74 72 69 6e 67 28 32 30 30  ECT a_string(200
9aa0: 29 2c 20 61 5f 73 74 72 69 6e 67 28 33 30 30 29  ), a_string(300)
9ab0: 20 46 52 4f 4d 20 61 62 3b 0a 20 20 20 20 20 20   FROM ab;.      
9ac0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 20 53  INSERT INTO ab S
9ad0: 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 32  ELECT a_string(2
9ae0: 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 33 30  00), a_string(30
9af0: 30 29 20 46 52 4f 4d 20 61 62 3b 0a 20 20 20 20  0) FROM ab;.    
9b00: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 62    INSERT INTO ab
9b10: 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67   SELECT a_string
9b20: 28 32 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28  (200), a_string(
9b30: 33 30 30 29 20 46 52 4f 4d 20 61 62 3b 0a 20 20  300) FROM ab;.  
9b40: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
9b50: 61 62 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69  ab SELECT a_stri
9b60: 6e 67 28 32 30 30 29 2c 20 61 5f 73 74 72 69 6e  ng(200), a_strin
9b70: 67 28 33 30 30 29 20 46 52 4f 4d 20 61 62 3b 0a  g(300) FROM ab;.
9b80: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
9b90: 4f 20 61 62 20 53 45 4c 45 43 54 20 61 5f 73 74  O ab SELECT a_st
9ba0: 72 69 6e 67 28 32 30 30 29 2c 20 61 5f 73 74 72  ring(200), a_str
9bb0: 69 6e 67 28 33 30 30 29 20 46 52 4f 4d 20 61 62  ing(300) FROM ab
9bc0: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
9bd0: 4e 54 4f 20 61 62 20 53 45 4c 45 43 54 20 61 5f  NTO ab SELECT a_
9be0: 73 74 72 69 6e 67 28 32 30 30 29 2c 20 61 5f 73  string(200), a_s
9bf0: 74 72 69 6e 67 28 33 30 30 29 20 46 52 4f 4d 20  tring(300) FROM 
9c00: 61 62 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  ab;.      INSERT
9c10: 20 49 4e 54 4f 20 61 62 20 53 45 4c 45 43 54 20   INTO ab SELECT 
9c20: 61 5f 73 74 72 69 6e 67 28 32 30 30 29 2c 20 61  a_string(200), a
9c30: 5f 73 74 72 69 6e 67 28 33 30 30 29 20 46 52 4f  _string(300) FRO
9c40: 4d 20 61 62 3b 0a 20 20 20 20 43 4f 4d 4d 49 54  M ab;.    COMMIT
9c50: 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65  ;.  }.} {}.do_te
9c60: 73 74 20 70 61 67 65 72 31 2d 39 2e 30 2e 32 20  st pager1-9.0.2 
9c70: 7b 0a 20 20 73 71 6c 69 74 65 33 20 64 62 32 20  {.  sqlite3 db2 
9c80: 74 65 73 74 2e 64 62 32 0a 20 20 64 62 32 20 65  test.db2.  db2 e
9c90: 76 61 6c 20 7b 20 50 52 41 47 4d 41 20 63 61 63  val { PRAGMA cac
9ca0: 68 65 5f 73 69 7a 65 20 3d 20 31 30 20 7d 0a 20  he_size = 10 }. 
9cb0: 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20   sqlite3_backup 
9cc0: 42 20 64 62 32 20 6d 61 69 6e 20 64 62 20 6d 61  B db2 main db ma
9cd0: 69 6e 0a 20 20 6c 69 73 74 20 5b 42 20 73 74 65  in.  list [B ste
9ce0: 70 20 31 30 30 30 30 5d 20 5b 42 20 66 69 6e 69  p 10000] [B fini
9cf0: 73 68 5d 0a 7d 20 7b 53 51 4c 49 54 45 5f 44 4f  sh].} {SQLITE_DO
9d00: 4e 45 20 53 51 4c 49 54 45 5f 4f 4b 7d 0a 64 6f  NE SQLITE_OK}.do
9d10: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 39 2e 30  _test pager1-9.0
9d20: 2e 33 20 7b 0a 20 64 62 20 6f 6e 65 20 7b 53 45  .3 {. db one {SE
9d30: 4c 45 43 54 20 6d 64 35 73 75 6d 28 61 2c 20 62  LECT md5sum(a, b
9d40: 29 20 46 52 4f 4d 20 61 62 7d 0a 7d 20 5b 64 62  ) FROM ab}.} [db
9d50: 32 20 6f 6e 65 20 7b 53 45 4c 45 43 54 20 6d 64  2 one {SELECT md
9d60: 35 73 75 6d 28 61 2c 20 62 29 20 46 52 4f 4d 20  5sum(a, b) FROM 
9d70: 61 62 7d 5d 0a 0a 64 6f 5f 74 65 73 74 20 70 61  ab}]..do_test pa
9d80: 67 65 72 31 2d 39 2e 31 2e 31 20 7b 0a 20 20 65  ger1-9.1.1 {.  e
9d90: 78 65 63 73 71 6c 20 7b 20 55 50 44 41 54 45 20  xecsql { UPDATE 
9da0: 61 62 20 53 45 54 20 61 20 3d 20 61 5f 73 74 72  ab SET a = a_str
9db0: 69 6e 67 28 32 30 31 29 20 7d 0a 20 20 73 71 6c  ing(201) }.  sql
9dc0: 69 74 65 33 5f 62 61 63 6b 75 70 20 42 20 64 62  ite3_backup B db
9dd0: 32 20 6d 61 69 6e 20 64 62 20 6d 61 69 6e 0a 20  2 main db main. 
9de0: 20 42 20 73 74 65 70 20 33 30 0a 7d 20 7b 53 51   B step 30.} {SQ
9df0: 4c 49 54 45 5f 4f 4b 7d 0a 64 6f 5f 74 65 73 74  LITE_OK}.do_test
9e00: 20 70 61 67 65 72 31 2d 39 2e 31 2e 32 20 7b 0a   pager1-9.1.2 {.
9e10: 20 20 65 78 65 63 73 71 6c 20 7b 20 55 50 44 41    execsql { UPDA
9e20: 54 45 20 61 62 20 53 45 54 20 62 20 3d 20 61 5f  TE ab SET b = a_
9e30: 73 74 72 69 6e 67 28 33 30 31 29 20 7d 0a 20 20  string(301) }.  
9e40: 6c 69 73 74 20 5b 42 20 73 74 65 70 20 31 30 30  list [B step 100
9e50: 30 30 5d 20 5b 42 20 66 69 6e 69 73 68 5d 0a 7d  00] [B finish].}
9e60: 20 7b 53 51 4c 49 54 45 5f 44 4f 4e 45 20 53 51   {SQLITE_DONE SQ
9e70: 4c 49 54 45 5f 4f 4b 7d 0a 64 6f 5f 74 65 73 74  LITE_OK}.do_test
9e80: 20 70 61 67 65 72 31 2d 39 2e 31 2e 33 20 7b 0a   pager1-9.1.3 {.
9e90: 20 64 62 20 6f 6e 65 20 7b 53 45 4c 45 43 54 20   db one {SELECT 
9ea0: 6d 64 35 73 75 6d 28 61 2c 20 62 29 20 46 52 4f  md5sum(a, b) FRO
9eb0: 4d 20 61 62 7d 0a 7d 20 5b 64 62 32 20 6f 6e 65  M ab}.} [db2 one
9ec0: 20 7b 53 45 4c 45 43 54 20 6d 64 35 73 75 6d 28   {SELECT md5sum(
9ed0: 61 2c 20 62 29 20 46 52 4f 4d 20 61 62 7d 5d 0a  a, b) FROM ab}].
9ee0: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 39  do_test pager1-9
9ef0: 2e 31 2e 34 20 7b 20 65 78 65 63 73 71 6c 20 7b  .1.4 { execsql {
9f00: 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29   SELECT count(*)
9f10: 20 46 52 4f 4d 20 61 62 20 7d 20 7d 20 7b 31 32   FROM ab } } {12
9f20: 38 7d 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  8}..do_test page
9f30: 72 31 2d 39 2e 32 2e 31 20 7b 0a 20 20 65 78 65  r1-9.2.1 {.  exe
9f40: 63 73 71 6c 20 7b 20 55 50 44 41 54 45 20 61 62  csql { UPDATE ab
9f50: 20 53 45 54 20 61 20 3d 20 61 5f 73 74 72 69 6e   SET a = a_strin
9f60: 67 28 32 30 32 29 20 7d 0a 20 20 73 71 6c 69 74  g(202) }.  sqlit
9f70: 65 33 5f 62 61 63 6b 75 70 20 42 20 64 62 32 20  e3_backup B db2 
9f80: 6d 61 69 6e 20 64 62 20 6d 61 69 6e 0a 20 20 42  main db main.  B
9f90: 20 73 74 65 70 20 33 30 0a 7d 20 7b 53 51 4c 49   step 30.} {SQLI
9fa0: 54 45 5f 4f 4b 7d 0a 64 6f 5f 74 65 73 74 20 70  TE_OK}.do_test p
9fb0: 61 67 65 72 31 2d 39 2e 32 2e 32 20 7b 0a 20 20  ager1-9.2.2 {.  
9fc0: 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 42  execsql { .    B
9fd0: 45 47 49 4e 3b 0a 20 20 20 20 20 20 55 50 44 41  EGIN;.      UPDA
9fe0: 54 45 20 61 62 20 53 45 54 20 62 20 3d 20 61 5f  TE ab SET b = a_
9ff0: 73 74 72 69 6e 67 28 33 30 31 29 3b 0a 20 20 20  string(301);.   
a000: 20 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 7d 0a 20   ROLLBACK;.  }. 
a010: 20 6c 69 73 74 20 5b 42 20 73 74 65 70 20 31 30   list [B step 10
a020: 30 30 30 5d 20 5b 42 20 66 69 6e 69 73 68 5d 0a  000] [B finish].
a030: 7d 20 7b 53 51 4c 49 54 45 5f 44 4f 4e 45 20 53  } {SQLITE_DONE S
a040: 51 4c 49 54 45 5f 4f 4b 7d 0a 64 6f 5f 74 65 73  QLITE_OK}.do_tes
a050: 74 20 70 61 67 65 72 31 2d 39 2e 32 2e 33 20 7b  t pager1-9.2.3 {
a060: 0a 20 64 62 20 6f 6e 65 20 7b 53 45 4c 45 43 54  . db one {SELECT
a070: 20 6d 64 35 73 75 6d 28 61 2c 20 62 29 20 46 52   md5sum(a, b) FR
a080: 4f 4d 20 61 62 7d 0a 7d 20 5b 64 62 32 20 6f 6e  OM ab}.} [db2 on
a090: 65 20 7b 53 45 4c 45 43 54 20 6d 64 35 73 75 6d  e {SELECT md5sum
a0a0: 28 61 2c 20 62 29 20 46 52 4f 4d 20 61 62 7d 5d  (a, b) FROM ab}]
a0b0: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
a0c0: 39 2e 32 2e 34 20 7b 20 65 78 65 63 73 71 6c 20  9.2.4 { execsql 
a0d0: 7b 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a  { SELECT count(*
a0e0: 29 20 46 52 4f 4d 20 61 62 20 7d 20 7d 20 7b 31  ) FROM ab } } {1
a0f0: 32 38 7d 0a 64 62 20 63 6c 6f 73 65 0a 64 62 32  28}.db close.db2
a100: 20 63 6c 6f 73 65 0a 0a 64 6f 5f 74 65 73 74 20   close..do_test 
a110: 70 61 67 65 72 31 2d 39 2e 33 2e 31 20 7b 0a 20  pager1-9.3.1 {. 
a120: 20 74 65 73 74 76 66 73 20 74 76 20 2d 64 65 66   testvfs tv -def
a130: 61 75 6c 74 20 31 0a 20 20 74 76 20 73 65 63 74  ault 1.  tv sect
a140: 6f 72 73 69 7a 65 20 34 30 39 36 0a 20 20 66 61  orsize 4096.  fa
a150: 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e  ultsim_delete_an
a160: 64 5f 72 65 6f 70 65 6e 0a 0a 20 20 65 78 65 63  d_reopen..  exec
a170: 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 70 61 67  sql { PRAGMA pag
a180: 65 5f 73 69 7a 65 20 3d 20 31 30 32 34 20 7d 0a  e_size = 1024 }.
a190: 20 20 66 6f 72 20 7b 73 65 74 20 69 69 20 30 7d    for {set ii 0}
a1a0: 20 7b 24 69 69 20 3c 20 34 7d 20 7b 69 6e 63 72   {$ii < 4} {incr
a1b0: 20 69 69 7d 20 7b 20 65 78 65 63 73 71 6c 20 22   ii} { execsql "
a1c0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 24 7b  CREATE TABLE t${
a1d0: 69 69 7d 28 61 2c 20 62 29 22 20 7d 0a 7d 20 7b  ii}(a, b)" }.} {
a1e0: 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  }.do_test pager1
a1f0: 2d 39 2e 33 2e 32 20 7b 0a 20 20 73 71 6c 69 74  -9.3.2 {.  sqlit
a200: 65 33 20 64 62 32 20 74 65 73 74 2e 64 62 32 0a  e3 db2 test.db2.
a210: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
a220: 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a   PRAGMA page_siz
a230: 65 20 3d 20 34 30 39 36 3b 0a 20 20 20 20 50 52  e = 4096;.    PR
a240: 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73  AGMA synchronous
a250: 20 3d 20 4f 46 46 3b 0a 20 20 20 20 43 52 45 41   = OFF;.    CREA
a260: 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62  TE TABLE t1(a, b
a270: 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  );.    CREATE TA
a280: 42 4c 45 20 74 32 28 61 2c 20 62 29 3b 0a 20 20  BLE t2(a, b);.  
a290: 7d 20 64 62 32 0a 0a 20 20 73 71 6c 69 74 65 33  } db2..  sqlite3
a2a0: 5f 62 61 63 6b 75 70 20 42 20 64 62 32 20 6d 61  _backup B db2 ma
a2b0: 69 6e 20 64 62 20 6d 61 69 6e 0a 20 20 42 20 73  in db main.  B s
a2c0: 74 65 70 20 33 30 0a 20 20 6c 69 73 74 20 5b 42  tep 30.  list [B
a2d0: 20 73 74 65 70 20 31 30 30 30 30 5d 20 5b 42 20   step 10000] [B 
a2e0: 66 69 6e 69 73 68 5d 0a 7d 20 7b 53 51 4c 49 54  finish].} {SQLIT
a2f0: 45 5f 44 4f 4e 45 20 53 51 4c 49 54 45 5f 4f 4b  E_DONE SQLITE_OK
a300: 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  }.do_test pager1
a310: 2d 39 2e 33 2e 33 20 7b 0a 20 20 64 62 32 20 63  -9.3.3 {.  db2 c
a320: 6c 6f 73 65 0a 20 20 64 62 20 63 6c 6f 73 65 0a  lose.  db close.
a330: 20 20 74 76 20 64 65 6c 65 74 65 0a 20 20 66 69    tv delete.  fi
a340: 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 32  le size test.db2
a350: 0a 7d 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65  .} [file size te
a360: 73 74 2e 64 62 5d 0a 0a 64 6f 5f 74 65 73 74 20  st.db]..do_test 
a370: 70 61 67 65 72 31 2d 39 2e 34 2e 31 20 7b 0a 20  pager1-9.4.1 {. 
a380: 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65   faultsim_delete
a390: 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 73 71  _and_reopen.  sq
a3a0: 6c 69 74 65 33 20 64 62 32 20 74 65 73 74 2e 64  lite3 db2 test.d
a3b0: 62 32 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  b2.  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 34 30 39 36 3b 0a 20 20 20 20  ize = 4096;.    
a3e0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
a3f0: 61 2c 20 62 29 3b 0a 20 20 20 20 43 52 45 41 54  a, b);.    CREAT
a400: 45 20 54 41 42 4c 45 20 74 32 28 61 2c 20 62 29  E TABLE t2(a, b)
a410: 3b 0a 20 20 7d 20 64 62 32 0a 20 20 73 71 6c 69  ;.  } db2.  sqli
a420: 74 65 33 5f 62 61 63 6b 75 70 20 42 20 64 62 32  te3_backup B db2
a430: 20 6d 61 69 6e 20 64 62 20 6d 61 69 6e 0a 20 20   main db main.  
a440: 6c 69 73 74 20 5b 42 20 73 74 65 70 20 31 30 30  list [B step 100
a450: 30 30 5d 20 5b 42 20 66 69 6e 69 73 68 5d 0a 7d  00] [B finish].}
a460: 20 7b 53 51 4c 49 54 45 5f 44 4f 4e 45 20 53 51   {SQLITE_DONE SQ
a470: 4c 49 54 45 5f 4f 4b 7d 0a 64 6f 5f 74 65 73 74  LITE_OK}.do_test
a480: 20 70 61 67 65 72 31 2d 39 2e 34 2e 32 20 7b 0a   pager1-9.4.2 {.
a490: 20 20 6c 69 73 74 20 5b 66 69 6c 65 20 73 69 7a    list [file siz
a4a0: 65 20 74 65 73 74 2e 64 62 32 5d 20 5b 66 69 6c  e test.db2] [fil
a4b0: 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 5d 0a  e size test.db].
a4c0: 7d 20 7b 31 30 32 34 20 30 7d 0a 64 62 32 20 63  } {1024 0}.db2 c
a4d0: 6c 6f 73 65 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  lose..#---------
a4e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a4f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a520: 0a 23 20 54 65 73 74 20 74 68 61 74 20 72 65 67  .# Test that reg
a530: 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 76  ardless of the v
a540: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
a550: 20 78 53 65 63 74 6f 72 53 69 7a 65 28 29 2c 20   xSectorSize(), 
a560: 74 68 65 0a 23 20 6d 69 6e 69 6d 75 6d 20 65 66  the.# minimum ef
a570: 66 65 63 74 69 76 65 20 73 65 63 74 6f 72 2d 73  fective sector-s
a580: 69 7a 65 20 69 73 20 35 31 32 20 61 6e 64 20 74  ize is 512 and t
a590: 68 65 20 6d 61 78 69 6d 75 6d 20 36 35 35 33 36  he maximum 65536
a5a0: 20 62 79 74 65 73 2e 0a 23 0a 74 65 73 74 76 66   bytes..#.testvf
a5b0: 73 20 74 76 20 2d 64 65 66 61 75 6c 74 20 31 0a  s tv -default 1.
a5c0: 66 6f 72 65 61 63 68 20 73 65 63 74 6f 72 73 69  foreach sectorsi
a5d0: 7a 65 20 7b 0a 20 20 20 20 33 32 20 20 20 36 34  ze {.    32   64
a5e0: 20 20 20 31 32 38 20 20 20 32 35 36 20 20 20 35     128   256   5
a5f0: 31 32 20 20 20 31 30 32 34 20 20 20 32 30 34 38  12   1024   2048
a600: 20 0a 20 20 20 20 34 30 39 36 20 38 31 39 32 20   .    4096 8192 
a610: 31 36 33 38 34 20 33 32 37 36 38 20 36 35 35 33  16384 32768 6553
a620: 36 20 31 33 31 30 37 32 20 32 36 32 31 34 34 0a  6 131072 262144.
a630: 7d 20 7b 0a 20 20 74 76 20 73 65 63 74 6f 72 73  } {.  tv sectors
a640: 69 7a 65 20 24 73 65 63 74 6f 72 73 69 7a 65 0a  ize $sectorsize.
a650: 20 20 74 76 20 64 65 76 63 68 61 72 20 7b 7d 0a    tv devchar {}.
a660: 20 20 73 65 74 20 65 66 66 20 24 73 65 63 74 6f    set eff $secto
a670: 72 73 69 7a 65 0a 20 20 69 66 20 7b 24 73 65 63  rsize.  if {$sec
a680: 74 6f 72 73 69 7a 65 20 3c 20 35 31 32 7d 20 20  torsize < 512}  
a690: 20 7b 20 73 65 74 20 65 66 66 20 35 31 32 20 7d   { set eff 512 }
a6a0: 0a 20 20 69 66 20 7b 24 73 65 63 74 6f 72 73 69  .  if {$sectorsi
a6b0: 7a 65 20 3e 20 36 35 35 33 36 7d 20 7b 20 73 65  ze > 65536} { se
a6c0: 74 20 65 66 66 20 36 35 35 33 36 20 7d 0a 0a 20  t eff 65536 }.. 
a6d0: 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
a6e0: 31 30 2e 24 73 65 63 74 6f 72 73 69 7a 65 2e 31  10.$sectorsize.1
a6f0: 20 7b 0a 20 20 20 20 66 61 75 6c 74 73 69 6d 5f   {.    faultsim_
a700: 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65  delete_and_reope
a710: 6e 0a 20 20 20 20 64 62 20 66 75 6e 63 20 61 5f  n.    db func a_
a720: 73 74 72 69 6e 67 20 61 5f 73 74 72 69 6e 67 0a  string a_string.
a730: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20      execsql {.  
a740: 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e      PRAGMA journ
a750: 61 6c 5f 6d 6f 64 65 20 3d 20 50 45 52 53 49 53  al_mode = PERSIS
a760: 54 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20  T;.      PRAGMA 
a770: 70 61 67 65 5f 73 69 7a 65 20 3d 20 31 30 32 34  page_size = 1024
a780: 3b 0a 20 20 20 20 20 20 42 45 47 49 4e 3b 0a 20  ;.      BEGIN;. 
a790: 20 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41         CREATE TA
a7a0: 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20  BLE t1(a, b);.  
a7b0: 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42        CREATE TAB
a7c0: 4c 45 20 74 32 28 61 2c 20 62 29 3b 0a 20 20 20  LE t2(a, b);.   
a7d0: 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c       CREATE TABL
a7e0: 45 20 74 33 28 61 2c 20 62 29 3b 0a 20 20 20 20  E t3(a, b);.    
a7f0: 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 20 20 7d 0a    COMMIT;.    }.
a800: 20 20 20 20 66 69 6c 65 20 73 69 7a 65 20 74 65      file size te
a810: 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 20 20  st.db-journal.  
a820: 7d 20 5b 65 78 70 72 20 24 73 65 63 74 6f 72 73  } [expr $sectors
a830: 69 7a 65 20 3e 20 36 35 35 33 36 20 3f 20 36 35  ize > 65536 ? 65
a840: 35 33 36 20 3a 20 24 73 65 63 74 6f 72 73 69 7a  536 : $sectorsiz
a850: 65 5d 0a 0a 20 20 64 6f 5f 74 65 73 74 20 70 61  e]..  do_test pa
a860: 67 65 72 31 2d 31 30 2e 24 73 65 63 74 6f 72 73  ger1-10.$sectors
a870: 69 7a 65 2e 32 20 7b 0a 20 20 20 20 65 78 65 63  ize.2 {.    exec
a880: 73 71 6c 20 7b 20 0a 20 20 20 20 20 20 49 4e 53  sql { .      INS
a890: 45 52 54 20 49 4e 54 4f 20 74 33 20 56 41 4c 55  ERT INTO t3 VALU
a8a0: 45 53 28 61 5f 73 74 72 69 6e 67 28 33 30 30 29  ES(a_string(300)
a8b0: 2c 20 61 5f 73 74 72 69 6e 67 28 33 30 30 29 29  , a_string(300))
a8c0: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
a8d0: 4e 54 4f 20 74 33 20 53 45 4c 45 43 54 20 2a 20  NTO t3 SELECT * 
a8e0: 46 52 4f 4d 20 74 33 3b 20 20 20 20 20 20 20 20  FROM t3;        
a8f0: 2f 2a 20 20 32 20 2a 2f 0a 20 20 20 20 20 20 49  /*  2 */.      I
a900: 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 20 53 45  NSERT INTO t3 SE
a910: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 33 3b 20  LECT * FROM t3; 
a920: 20 20 20 20 20 20 20 2f 2a 20 20 34 20 2a 2f 0a         /*  4 */.
a930: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
a940: 4f 20 74 33 20 53 45 4c 45 43 54 20 2a 20 46 52  O t3 SELECT * FR
a950: 4f 4d 20 74 33 3b 20 20 20 20 20 20 20 20 2f 2a  OM t3;        /*
a960: 20 20 38 20 2a 2f 0a 20 20 20 20 20 20 49 4e 53    8 */.      INS
a970: 45 52 54 20 49 4e 54 4f 20 74 33 20 53 45 4c 45  ERT INTO t3 SELE
a980: 43 54 20 2a 20 46 52 4f 4d 20 74 33 3b 20 20 20  CT * FROM t3;   
a990: 20 20 20 20 20 2f 2a 20 31 36 20 2a 2f 0a 20 20       /* 16 */.  
a9a0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
a9b0: 74 33 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  t3 SELECT * FROM
a9c0: 20 74 33 3b 20 20 20 20 20 20 20 20 2f 2a 20 33   t3;        /* 3
a9d0: 32 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 20 7b  2 */.    }.  } {
a9e0: 7d 0a 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67  }..  do_test pag
a9f0: 65 72 31 2d 31 30 2e 24 73 65 63 74 6f 72 73 69  er1-10.$sectorsi
aa00: 7a 65 2e 33 20 7b 0a 20 20 20 20 64 62 20 63 6c  ze.3 {.    db cl
aa10: 6f 73 65 0a 20 20 20 20 73 71 6c 69 74 65 33 20  ose.    sqlite3 
aa20: 64 62 20 74 65 73 74 2e 64 62 0a 20 20 20 20 65  db test.db.    e
aa30: 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 20 20  xecsql { .      
aa40: 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a  PRAGMA cache_siz
aa50: 65 20 3d 20 31 30 3b 0a 20 20 20 20 20 20 42 45  e = 10;.      BE
aa60: 47 49 4e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  GIN;.    }.    r
aa70: 65 63 75 72 73 69 76 65 5f 73 65 6c 65 63 74 20  ecursive_select 
aa80: 33 32 20 74 33 20 7b 64 62 20 65 76 61 6c 20 22  32 t3 {db eval "
aa90: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56  INSERT INTO t2 V
aaa0: 41 4c 55 45 53 28 31 2c 20 32 29 22 7d 0a 20 20  ALUES(1, 2)"}.  
aab0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
aac0: 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 20 20 20 20    COMMIT;.      
aad0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32  SELECT * FROM t2
aae0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 31 20 32  ;.    }.  } {1 2
aaf0: 7d 0a 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67  }..  do_test pag
ab00: 65 72 31 2d 31 30 2e 24 73 65 63 74 6f 72 73 69  er1-10.$sectorsi
ab10: 7a 65 2e 34 20 7b 0a 20 20 20 20 65 78 65 63 73  ze.4 {.    execs
ab20: 71 6c 20 7b 0a 20 20 20 20 20 20 43 52 45 41 54  ql {.      CREAT
ab30: 45 20 54 41 42 4c 45 20 74 36 28 61 2c 20 62 29  E TABLE t6(a, b)
ab40: 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45 20 54  ;.      CREATE T
ab50: 41 42 4c 45 20 74 37 28 61 2c 20 62 29 3b 0a 20  ABLE t7(a, b);. 
ab60: 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c       CREATE TABL
ab70: 45 20 74 35 28 61 2c 20 62 29 3b 0a 20 20 20 20  E t5(a, b);.    
ab80: 20 20 44 52 4f 50 20 54 41 42 4c 45 20 74 36 3b    DROP TABLE t6;
ab90: 0a 20 20 20 20 20 20 44 52 4f 50 20 54 41 42 4c  .      DROP TABL
aba0: 45 20 74 37 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E t7;.    }.    
abb0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20  execsql {.      
abc0: 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 20 20 43  BEGIN;.        C
abd0: 52 45 41 54 45 20 54 41 42 4c 45 20 74 36 28 61  REATE TABLE t6(a
abe0: 2c 20 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , b);.    }.    
abf0: 72 65 63 75 72 73 69 76 65 5f 73 65 6c 65 63 74  recursive_select
ac00: 20 33 32 20 74 33 20 7b 64 62 20 65 76 61 6c 20   32 t3 {db eval 
ac10: 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 35 20  "INSERT INTO t5 
ac20: 56 41 4c 55 45 53 28 31 2c 20 32 29 22 7d 0a 20  VALUES(1, 2)"}. 
ac30: 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20     execsql {.   
ac40: 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 20 20 20     COMMIT;.     
ac50: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
ac60: 35 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 31 20  5;.    }.  } {1 
ac70: 32 7d 0a 20 20 0a 7d 0a 64 62 20 63 6c 6f 73 65  2}.  .}.db close
ac80: 0a 0a 74 76 20 73 65 63 74 6f 72 73 69 7a 65 20  ..tv sectorsize 
ac90: 34 30 39 36 0a 64 6f 5f 74 65 73 74 20 70 61 67  4096.do_test pag
aca0: 65 72 31 2e 31 30 2e 78 2e 31 20 7b 0a 20 20 66  er1.10.x.1 {.  f
acb0: 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61  aultsim_delete_a
acc0: 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65 63  nd_reopen.  exec
acd0: 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41  sql {.    PRAGMA
ace0: 20 61 75 74 6f 5f 76 61 63 75 75 6d 20 3d 20 6e   auto_vacuum = n
acf0: 6f 6e 65 3b 0a 20 20 20 20 50 52 41 47 4d 41 20  one;.    PRAGMA 
ad00: 70 61 67 65 5f 73 69 7a 65 20 3d 20 31 30 32 34  page_size = 1024
ad10: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
ad20: 4c 45 20 74 31 28 78 29 3b 0a 20 20 7d 0a 20 20  LE t1(x);.  }.  
ad30: 66 6f 72 20 7b 73 65 74 20 69 20 30 7d 20 7b 24  for {set i 0} {$
ad40: 69 3c 33 30 7d 20 7b 69 6e 63 72 20 69 7d 20 7b  i<30} {incr i} {
ad50: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 49  .    execsql { I
ad60: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
ad70: 4c 55 45 53 28 7a 65 72 6f 62 6c 6f 62 28 39 30  LUES(zeroblob(90
ad80: 30 29 29 20 7d 0a 20 20 7d 0a 20 20 66 69 6c 65  0)) }.  }.  file
ad90: 20 73 69 7a 65 20 74 65 73 74 2e 64 62 0a 7d 20   size test.db.} 
ada0: 7b 33 32 37 36 38 7d 0a 64 6f 5f 74 65 73 74 20  {32768}.do_test 
adb0: 70 61 67 65 72 31 2e 31 30 2e 78 2e 32 20 7b 0a  pager1.10.x.2 {.
adc0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
add0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32 28  CREATE TABLE t2(
ade0: 78 29 3b 0a 20 20 20 20 44 52 4f 50 20 54 41 42  x);.    DROP TAB
adf0: 4c 45 20 74 32 3b 0a 20 20 7d 0a 20 20 66 69 6c  LE t2;.  }.  fil
ae00: 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 0a 7d  e size test.db.}
ae10: 20 7b 33 33 37 39 32 7d 0a 64 6f 5f 74 65 73 74   {33792}.do_test
ae20: 20 70 61 67 65 72 31 2e 31 30 2e 78 2e 33 20 7b   pager1.10.x.3 {
ae30: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
ae40: 20 42 45 47 49 4e 3b 0a 20 20 20 20 43 52 45 41   BEGIN;.    CREA
ae50: 54 45 20 54 41 42 4c 45 20 74 32 28 78 29 3b 0a  TE TABLE t2(x);.
ae60: 20 20 7d 0a 20 20 72 65 63 75 72 73 69 76 65 5f    }.  recursive_
ae70: 73 65 6c 65 63 74 20 33 30 20 74 31 0a 20 20 65  select 30 t1.  e
ae80: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45  xecsql {.    CRE
ae90: 41 54 45 20 54 41 42 4c 45 20 74 33 28 78 29 3b  ATE TABLE t3(x);
aea0: 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d  .    COMMIT;.  }
aeb0: 0a 7d 20 7b 7d 0a 0a 64 62 20 63 6c 6f 73 65 0a  .} {}..db close.
aec0: 74 76 20 64 65 6c 65 74 65 0a 0a 74 65 73 74 76  tv delete..testv
aed0: 66 73 20 74 76 20 2d 64 65 66 61 75 6c 74 20 31  fs tv -default 1
aee0: 0a 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65  .faultsim_delete
aef0: 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 64 62 20 66  _and_reopen.db f
af00: 75 6e 63 20 61 5f 73 74 72 69 6e 67 20 61 5f 73  unc a_string a_s
af10: 74 72 69 6e 67 0a 64 6f 5f 65 78 65 63 73 71 6c  tring.do_execsql
af20: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 31 2e  _test pager1-11.
af30: 31 20 7b 0a 20 20 50 52 41 47 4d 41 20 6a 6f 75  1 {.  PRAGMA jou
af40: 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c 45  rnal_mode = DELE
af50: 54 45 3b 0a 20 20 50 52 41 47 4d 41 20 63 61 63  TE;.  PRAGMA cac
af60: 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b 0a 20 20  he_size = 10;.  
af70: 42 45 47 49 4e 3b 0a 20 20 20 20 43 52 45 41 54  BEGIN;.    CREAT
af80: 45 20 54 41 42 4c 45 20 7a 7a 28 74 6f 70 20 50  E TABLE zz(top P
af90: 52 49 4d 41 52 59 20 4b 45 59 29 3b 0a 20 20 20  RIMARY KEY);.   
afa0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a 7a 20   INSERT INTO zz 
afb0: 56 41 4c 55 45 53 28 61 5f 73 74 72 69 6e 67 28  VALUES(a_string(
afc0: 32 32 32 29 29 3b 0a 20 20 20 20 49 4e 53 45 52  222));.    INSER
afd0: 54 20 49 4e 54 4f 20 7a 7a 20 53 45 4c 45 43 54  T INTO zz SELECT
afe0: 20 61 5f 73 74 72 69 6e 67 28 28 53 45 4c 45 43   a_string((SELEC
aff0: 54 20 32 32 32 2b 6d 61 78 28 72 6f 77 69 64 29  T 222+max(rowid)
b000: 20 46 52 4f 4d 20 7a 7a 29 29 20 46 52 4f 4d 20   FROM zz)) FROM 
b010: 7a 7a 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  zz;.    INSERT I
b020: 4e 54 4f 20 7a 7a 20 53 45 4c 45 43 54 20 61 5f  NTO zz SELECT a_
b030: 73 74 72 69 6e 67 28 28 53 45 4c 45 43 54 20 32  string((SELECT 2
b040: 32 32 2b 6d 61 78 28 72 6f 77 69 64 29 20 46 52  22+max(rowid) FR
b050: 4f 4d 20 7a 7a 29 29 20 46 52 4f 4d 20 7a 7a 3b  OM zz)) FROM zz;
b060: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
b070: 20 7a 7a 20 53 45 4c 45 43 54 20 61 5f 73 74 72   zz SELECT a_str
b080: 69 6e 67 28 28 53 45 4c 45 43 54 20 32 32 32 2b  ing((SELECT 222+
b090: 6d 61 78 28 72 6f 77 69 64 29 20 46 52 4f 4d 20  max(rowid) FROM 
b0a0: 7a 7a 29 29 20 46 52 4f 4d 20 7a 7a 3b 0a 20 20  zz)) FROM zz;.  
b0b0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a 7a    INSERT INTO zz
b0c0: 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67   SELECT a_string
b0d0: 28 28 53 45 4c 45 43 54 20 32 32 32 2b 6d 61 78  ((SELECT 222+max
b0e0: 28 72 6f 77 69 64 29 20 46 52 4f 4d 20 7a 7a 29  (rowid) FROM zz)
b0f0: 29 20 46 52 4f 4d 20 7a 7a 3b 0a 20 20 20 20 49  ) FROM zz;.    I
b100: 4e 53 45 52 54 20 49 4e 54 4f 20 7a 7a 20 53 45  NSERT INTO zz SE
b110: 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 28 53  LECT a_string((S
b120: 45 4c 45 43 54 20 32 32 32 2b 6d 61 78 28 72 6f  ELECT 222+max(ro
b130: 77 69 64 29 20 46 52 4f 4d 20 7a 7a 29 29 20 46  wid) FROM zz)) F
b140: 52 4f 4d 20 7a 7a 3b 0a 20 20 43 4f 4d 4d 49 54  ROM zz;.  COMMIT
b150: 3b 0a 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 55  ;.  BEGIN;.    U
b160: 50 44 41 54 45 20 7a 7a 20 53 45 54 20 74 6f 70  PDATE zz SET top
b170: 20 3d 20 61 5f 73 74 72 69 6e 67 28 33 34 35 29   = a_string(345)
b180: 3b 0a 7d 20 7b 64 65 6c 65 74 65 7d 0a 0a 70 72  ;.} {delete}..pr
b190: 6f 63 20 6c 6f 63 6b 6f 75 74 20 7b 6d 65 74 68  oc lockout {meth
b1a0: 6f 64 20 61 72 67 73 7d 20 7b 20 72 65 74 75 72  od args} { retur
b1b0: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 7d  n SQLITE_IOERR }
b1c0: 0a 74 76 20 73 63 72 69 70 74 20 6c 6f 63 6b 6f  .tv script locko
b1d0: 75 74 0a 74 76 20 66 69 6c 74 65 72 20 7b 78 57  ut.tv filter {xW
b1e0: 72 69 74 65 20 78 54 72 75 6e 63 61 74 65 20 78  rite xTruncate x
b1f0: 53 79 6e 63 7d 0a 64 6f 5f 63 61 74 63 68 73 71  Sync}.do_catchsq
b200: 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 31  l_test pager1-11
b210: 2e 32 20 7b 20 43 4f 4d 4d 49 54 20 7d 20 7b 31  .2 { COMMIT } {1
b220: 20 7b 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72   {disk I/O error
b230: 7d 7d 0a 0a 74 76 20 73 63 72 69 70 74 20 7b 7d  }}..tv script {}
b240: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
b250: 31 31 2e 33 20 7b 0a 20 20 73 71 6c 69 74 65 33  11.3 {.  sqlite3
b260: 20 64 62 32 20 74 65 73 74 2e 64 62 0a 20 20 65   db2 test.db.  e
b270: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41  xecsql {.    PRA
b280: 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
b290: 20 3d 20 54 52 55 4e 43 41 54 45 3b 0a 20 20 20   = TRUNCATE;.   
b2a0: 20 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74   PRAGMA integrit
b2b0: 79 5f 63 68 65 63 6b 3b 0a 20 20 7d 20 64 62 32  y_check;.  } db2
b2c0: 0a 7d 20 7b 74 72 75 6e 63 61 74 65 20 6f 6b 7d  .} {truncate ok}
b2d0: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
b2e0: 31 31 2e 34 20 7b 0a 20 20 64 62 32 20 63 6c 6f  11.4 {.  db2 clo
b2f0: 73 65 0a 20 20 66 69 6c 65 20 65 78 69 73 74 73  se.  file exists
b300: 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c   test.db-journal
b310: 0a 7d 20 7b 30 7d 0a 64 6f 5f 65 78 65 63 73 71  .} {0}.do_execsq
b320: 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 31  l_test pager1-11
b330: 2e 35 20 7b 20 53 45 4c 45 43 54 20 63 6f 75 6e  .5 { SELECT coun
b340: 74 28 2a 29 20 46 52 4f 4d 20 7a 7a 20 7d 20 7b  t(*) FROM zz } {
b350: 33 32 7d 0a 64 62 20 63 6c 6f 73 65 0a 74 76 20  32}.db close.tv 
b360: 64 65 6c 65 74 65 0a 20 20 0a 23 2d 2d 2d 2d 2d  delete.  .#-----
b370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b3a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b3b0: 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 22 50 52 41  ----.# Test "PRA
b3c0: 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 22 0a 23  GMA page_size".#
b3d0: 0a 74 65 73 74 76 66 73 20 74 76 20 2d 64 65 66  .testvfs tv -def
b3e0: 61 75 6c 74 20 31 0a 74 76 20 73 65 63 74 6f 72  ault 1.tv sector
b3f0: 73 69 7a 65 20 31 30 32 34 0a 66 6f 72 65 61 63  size 1024.foreac
b400: 68 20 70 61 67 65 73 69 7a 65 20 7b 0a 20 20 20  h pagesize {.   
b410: 20 35 31 32 20 20 20 31 30 32 34 20 20 20 32 30   512   1024   20
b420: 34 38 20 34 30 39 36 20 38 31 39 32 20 31 36 33  48 4096 8192 163
b430: 38 34 20 33 32 37 36 38 20 0a 7d 20 7b 0a 20 20  84 32768 .} {.  
b440: 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f  faultsim_delete_
b450: 61 6e 64 5f 72 65 6f 70 65 6e 0a 0a 20 20 23 20  and_reopen..  # 
b460: 54 68 65 20 73 65 63 74 6f 72 2d 73 69 7a 65 20  The sector-size 
b470: 28 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68  (according to th
b480: 65 20 56 46 53 29 20 69 73 20 31 30 32 34 20 62  e VFS) is 1024 b
b490: 79 74 65 73 2e 20 53 6f 20 69 66 20 74 68 65 0a  ytes. So if the.
b4a0: 20 20 23 20 70 61 67 65 2d 73 69 7a 65 20 72 65    # page-size re
b4b0: 71 75 65 73 74 65 64 20 75 73 69 6e 67 20 22 50  quested using "P
b4c0: 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 22  RAGMA page_size"
b4d0: 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
b4e0: 20 74 68 65 0a 20 20 23 20 63 6f 6d 70 69 6c 65   the.  # compile
b4f0: 20 74 69 6d 65 20 76 61 6c 75 65 20 6f 66 20 53   time value of S
b500: 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
b510: 49 5a 45 2c 20 74 68 65 6e 20 74 68 65 20 65 66  IZE, then the ef
b520: 66 65 63 74 69 76 65 20 0a 20 20 23 20 70 61 67  fective .  # pag
b530: 65 2d 73 69 7a 65 20 72 65 6d 61 69 6e 73 20 31  e-size remains 1
b540: 30 32 34 20 62 79 74 65 73 2e 0a 20 20 23 0a 20  024 bytes..  #. 
b550: 20 73 65 74 20 65 66 66 20 24 70 61 67 65 73 69   set eff $pagesi
b560: 7a 65 0a 20 20 69 66 20 7b 24 65 66 66 20 3e 20  ze.  if {$eff > 
b570: 24 3a 3a 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41  $::SQLITE_MAX_PA
b580: 47 45 5f 53 49 5a 45 7d 20 7b 20 73 65 74 20 65  GE_SIZE} { set e
b590: 66 66 20 31 30 32 34 20 7d 0a 0a 20 20 64 6f 5f  ff 1024 }..  do_
b5a0: 74 65 73 74 20 70 61 67 65 72 31 2d 31 32 2e 24  test pager1-12.$
b5b0: 70 61 67 65 73 69 7a 65 2e 31 20 7b 0a 20 20 20  pagesize.1 {.   
b5c0: 20 73 71 6c 69 74 65 33 20 64 62 32 20 74 65 73   sqlite3 db2 tes
b5d0: 74 2e 64 62 0a 20 20 20 20 65 78 65 63 73 71 6c  t.db.    execsql
b5e0: 20 22 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20   ".      PRAGMA 
b5f0: 70 61 67 65 5f 73 69 7a 65 20 3d 20 24 70 61 67  page_size = $pag
b600: 65 73 69 7a 65 3b 0a 20 20 20 20 20 20 43 52 45  esize;.      CRE
b610: 41 54 45 20 56 49 45 57 20 76 20 41 53 20 53 45  ATE VIEW v AS SE
b620: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 71 6c 69  LECT * FROM sqli
b630: 74 65 5f 6d 61 73 74 65 72 3b 0a 20 20 20 20 22  te_master;.    "
b640: 20 64 62 32 0a 20 20 20 20 66 69 6c 65 20 73 69   db2.    file si
b650: 7a 65 20 74 65 73 74 2e 64 62 0a 20 20 7d 20 24  ze test.db.  } $
b660: 65 66 66 0a 20 20 64 6f 5f 74 65 73 74 20 70 61  eff.  do_test pa
b670: 67 65 72 31 2d 31 32 2e 24 70 61 67 65 73 69 7a  ger1-12.$pagesiz
b680: 65 2e 32 20 7b 0a 20 20 20 20 73 71 6c 69 74 65  e.2 {.    sqlite
b690: 33 20 64 62 32 20 74 65 73 74 2e 64 62 0a 20 20  3 db2 test.db.  
b6a0: 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20    execsql { .   
b6b0: 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28     SELECT count(
b6c0: 2a 29 20 46 52 4f 4d 20 76 3b 0a 20 20 20 20 20  *) FROM v;.     
b6d0: 20 50 52 41 47 4d 41 20 6d 61 69 6e 2e 70 61 67   PRAGMA main.pag
b6e0: 65 5f 73 69 7a 65 3b 0a 20 20 20 20 7d 20 64 62  e_size;.    } db
b6f0: 32 0a 20 20 7d 20 5b 6c 69 73 74 20 31 20 24 65  2.  } [list 1 $e
b700: 66 66 5d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61  ff].  do_test pa
b710: 67 65 72 31 2d 31 32 2e 24 70 61 67 65 73 69 7a  ger1-12.$pagesiz
b720: 65 2e 33 20 7b 0a 20 20 20 20 65 78 65 63 73 71  e.3 {.    execsq
b730: 6c 20 7b 20 0a 20 20 20 20 20 20 53 45 4c 45 43  l { .      SELEC
b740: 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
b750: 76 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20  v;.      PRAGMA 
b760: 6d 61 69 6e 2e 70 61 67 65 5f 73 69 7a 65 3b 0a  main.page_size;.
b770: 20 20 20 20 7d 0a 20 20 7d 20 5b 6c 69 73 74 20      }.  } [list 
b780: 31 20 24 65 66 66 5d 0a 20 20 64 62 32 20 63 6c  1 $eff].  db2 cl
b790: 6f 73 65 0a 7d 0a 64 62 20 63 6c 6f 73 65 0a 74  ose.}.db close.t
b7a0: 76 20 64 65 6c 65 74 65 0a 0a 23 2d 2d 2d 2d 2d  v delete..#-----
b7b0: 2d 2d 2d 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 0a 23 20 54 65 73 74 20 73 70 65 63  ----.# Test spec
b800: 61 6c 20 22 50 52 41 47 4d 41 20 6a 6f 75 72 6e  al "PRAGMA journ
b810: 61 6c 5f 6d 6f 64 65 3d 50 45 52 53 49 53 54 22  al_mode=PERSIST"
b820: 20 74 65 73 74 20 63 61 73 65 73 2e 0a 23 0a 23   test cases..#.#
b830: 20 70 61 67 65 72 31 2d 31 33 2e 31 2e 2a 3a 20   pager1-13.1.*: 
b840: 54 68 69 73 20 74 65 73 74 73 20 61 20 73 70 65  This tests a spe
b850: 63 69 61 6c 20 63 61 73 65 20 65 6e 63 6f 75 6e  cial case encoun
b860: 74 65 72 65 64 20 69 6e 20 70 65 72 73 69 73 74  tered in persist
b870: 65 6e 74 20 0a 23 20 20 20 20 20 20 20 20 20 20  ent .#          
b880: 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 6d 6f        journal mo
b890: 64 65 3a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e  de: If the journ
b8a0: 61 6c 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  al associated wi
b8b0: 74 68 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  th a transaction
b8c0: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
b8d0: 20 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61    is smaller tha
b8e0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
b8f0: 6c 65 20 28 62 65 63 61 75 73 65 20 61 20 70 72  le (because a pr
b900: 65 76 69 6f 75 73 20 0a 23 20 20 20 20 20 20 20  evious .#       
b910: 20 20 20 20 20 20 20 20 20 74 72 61 6e 73 61 63           transac
b920: 74 69 6f 6e 20 6c 65 66 74 20 61 20 76 65 72 79  tion left a very
b930: 20 6c 61 72 67 65 20 6e 6f 6e 2d 68 6f 74 20 6a   large non-hot j
b940: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 74  ournal file in t
b950: 68 65 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  he.#            
b960: 20 20 20 20 66 69 6c 65 2d 73 79 73 74 65 6d 29      file-system)
b970: 2c 20 74 68 65 6e 20 53 51 4c 69 74 65 20 68 61  , then SQLite ha
b980: 73 20 74 6f 20 62 65 20 63 61 72 65 66 75 6c 20  s to be careful 
b990: 74 68 61 74 20 74 68 65 72 65 20 69 73 0a 23 20  that there is.# 
b9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
b9b0: 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 2d 68 65 61  ot a journal-hea
b9c0: 64 65 72 20 6c 65 66 74 20 6f 76 65 72 20 66 72  der left over fr
b9d0: 6f 6d 20 61 20 70 72 65 76 69 6f 75 73 20 74 72  om a previous tr
b9e0: 61 6e 73 61 63 74 69 6f 6e 0a 23 20 20 20 20 20  ansaction.#     
b9f0: 20 20 20 20 20 20 20 20 20 20 20 69 6d 6d 65 64             immed
ba00: 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67  iately following
ba10: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e   the journal con
ba20: 74 65 6e 74 20 6a 75 73 74 20 77 72 69 74 74 65  tent just writte
ba30: 6e 2e 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  n..#            
ba40: 20 20 20 20 49 66 20 74 68 65 72 65 20 69 73 2c      If there is,
ba50: 20 61 6e 64 20 74 68 65 20 70 72 6f 63 65 73 73   and the process
ba60: 20 63 72 61 73 68 65 73 20 73 6f 20 74 68 61 74   crashes so that
ba70: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 23 20 20   the journal.#  
ba80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 65                be
ba90: 63 6f 6d 65 73 20 61 20 68 6f 74 2d 6a 6f 75 72  comes a hot-jour
baa0: 6e 61 6c 20 61 6e 64 20 6d 75 73 74 20 62 65 20  nal and must be 
bab0: 72 6f 6c 6c 65 64 20 62 61 63 6b 20 62 79 20 61  rolled back by a
bac0: 6e 6f 74 68 65 72 0a 23 20 20 20 20 20 20 20 20  nother.#        
bad0: 20 20 20 20 20 20 20 20 70 72 6f 63 65 73 73 2c          process,
bae0: 20 74 68 65 72 65 20 69 73 20 61 20 64 61 6e 67   there is a dang
baf0: 65 72 20 74 68 61 74 20 74 68 65 20 6f 74 68 65  er that the othe
bb00: 72 20 70 72 6f 63 65 73 73 20 6d 61 79 20 72 6f  r process may ro
bb10: 6c 6c 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  ll.#            
bb20: 20 20 20 20 62 61 63 6b 20 74 68 65 20 61 62 6f      back the abo
bb30: 72 74 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e  rted transaction
bb40: 2c 20 74 68 65 6e 20 63 6f 6e 74 69 6e 75 65 20  , then continue 
bb50: 63 6f 70 79 69 6e 67 20 64 61 74 61 0a 23 20 20  copying data.#  
bb60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 72                fr
bb70: 6f 6d 20 61 6e 20 6f 6c 64 65 72 20 74 72 61 6e  om an older tran
bb80: 73 61 63 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65  saction from the
bb90: 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68   remainder of th
bba0: 65 20 6a 6f 75 72 6e 61 6c 2e 0a 23 20 20 20 20  e journal..#    
bbb0: 20 20 20 20 20 20 20 20 20 20 20 20 53 65 65 20              See 
bbc0: 74 68 65 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  the syncJournal(
bbd0: 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 64  ) function for d
bbe0: 65 74 61 69 6c 73 2e 0a 23 0a 23 20 70 61 67 65  etails..#.# page
bbf0: 72 31 2d 31 33 2e 32 2e 2a 3a 20 53 61 6d 65 20  r1-13.2.*: Same 
bc00: 74 65 73 74 20 61 73 20 74 68 65 20 70 72 65 76  test as the prev
bc10: 69 6f 75 73 2e 20 54 68 69 73 20 74 69 6d 65 2c  ious. This time,
bc20: 20 74 68 72 6f 77 20 61 6e 20 69 6e 64 65 78 20   throw an index 
bc30: 69 6e 74 6f 0a 23 20 20 20 20 20 20 20 20 20 20  into.#          
bc40: 20 20 20 20 20 20 74 68 65 20 6d 69 78 20 74 6f        the mix to
bc50: 20 6d 61 6b 65 20 74 68 65 20 69 6e 74 65 67 72   make the integr
bc60: 69 74 79 2d 63 68 65 63 6b 20 6d 6f 72 65 20 6c  ity-check more l
bc70: 69 6b 65 6c 79 20 74 6f 20 63 61 74 63 68 0a 23  ikely to catch.#
bc80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc90: 65 72 72 6f 72 73 2e 0a 23 0a 74 65 73 74 76 66  errors..#.testvf
bca0: 73 20 74 76 20 2d 64 65 66 61 75 6c 74 20 31 0a  s tv -default 1.
bcb0: 74 76 20 73 63 72 69 70 74 20 78 53 79 6e 63 43  tv script xSyncC
bcc0: 62 0a 74 76 20 66 69 6c 74 65 72 20 78 53 79 6e  b.tv filter xSyn
bcd0: 63 0a 70 72 6f 63 20 78 53 79 6e 63 43 62 20 7b  c.proc xSyncCb {
bce0: 6d 65 74 68 6f 64 20 66 69 6c 65 6e 61 6d 65 20  method filename 
bcf0: 61 72 67 73 7d 20 7b 0a 20 20 73 65 74 20 74 20  args} {.  set t 
bd00: 5b 66 69 6c 65 20 74 61 69 6c 20 24 66 69 6c 65  [file tail $file
bd10: 6e 61 6d 65 5d 0a 20 20 69 66 20 7b 24 74 20 3d  name].  if {$t =
bd20: 3d 20 22 74 65 73 74 2e 64 62 22 7d 20 66 61 75  = "test.db"} fau
bd30: 6c 74 73 69 6d 5f 73 61 76 65 0a 20 20 72 65 74  ltsim_save.  ret
bd40: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 7d 0a  urn SQLITE_OK.}.
bd50: 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f  faultsim_delete_
bd60: 61 6e 64 5f 72 65 6f 70 65 6e 0a 64 62 20 66 75  and_reopen.db fu
bd70: 6e 63 20 61 5f 73 74 72 69 6e 67 20 61 5f 73 74  nc a_string a_st
bd80: 72 69 6e 67 0a 0a 23 20 54 68 65 20 55 50 44 41  ring..# The UPDA
bd90: 54 45 20 73 74 61 74 65 6d 65 6e 74 20 61 74 20  TE statement at 
bda0: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 69 73 20  the end of this 
bdb0: 74 65 73 74 20 63 61 73 65 20 63 72 65 61 74 65  test case create
bdc0: 73 20 61 20 72 65 61 6c 6c 79 20 62 69 67 0a 23  s a really big.#
bdd0: 20 6a 6f 75 72 6e 61 6c 2e 20 53 69 6e 63 65 20   journal. Since 
bde0: 74 68 65 20 63 61 63 68 65 2d 73 69 7a 65 20 69  the cache-size i
bdf0: 73 20 6f 6e 6c 79 20 31 30 20 70 61 67 65 73 2c  s only 10 pages,
be00: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e   the journal con
be10: 74 61 69 6e 73 20 0a 23 20 66 72 65 71 75 65 6e  tains .# frequen
be20: 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
be30: 73 2e 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  s..#.do_execsql_
be40: 74 65 73 74 20 70 61 67 65 72 31 2d 31 33 2e 31  test pager1-13.1
be50: 2e 31 20 7b 0a 20 20 50 52 41 47 4d 41 20 70 61  .1 {.  PRAGMA pa
be60: 67 65 5f 73 69 7a 65 20 3d 20 31 30 32 34 3b 0a  ge_size = 1024;.
be70: 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c    PRAGMA journal
be80: 5f 6d 6f 64 65 20 3d 20 50 45 52 53 49 53 54 3b  _mode = PERSIST;
be90: 0a 20 20 50 52 41 47 4d 41 20 63 61 63 68 65 5f  .  PRAGMA cache_
bea0: 73 69 7a 65 20 3d 20 31 30 3b 0a 20 20 42 45 47  size = 10;.  BEG
beb0: 49 4e 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  IN;.    CREATE T
bec0: 41 42 4c 45 20 74 31 28 61 20 49 4e 54 45 47 45  ABLE t1(a INTEGE
bed0: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62  R PRIMARY KEY, b
bee0: 20 42 4c 4f 42 29 3b 0a 20 20 20 20 49 4e 53 45   BLOB);.    INSE
bef0: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
bf00: 53 28 4e 55 4c 4c 2c 20 61 5f 73 74 72 69 6e 67  S(NULL, a_string
bf10: 28 34 30 30 29 29 3b 0a 20 20 20 20 49 4e 53 45  (400));.    INSE
bf20: 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
bf30: 54 20 4e 55 4c 4c 2c 20 61 5f 73 74 72 69 6e 67  T NULL, a_string
bf40: 28 34 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20  (400) FROM t1;  
bf50: 20 20 20 20 20 20 20 20 2f 2a 20 20 20 32 20 2a          /*   2 *
bf60: 2f 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  /.    INSERT INT
bf70: 4f 20 74 31 20 53 45 4c 45 43 54 20 4e 55 4c 4c  O t1 SELECT NULL
bf80: 2c 20 61 5f 73 74 72 69 6e 67 28 34 30 30 29 20  , a_string(400) 
bf90: 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 20  FROM t1;        
bfa0: 20 20 2f 2a 20 20 20 34 20 2a 2f 0a 20 20 20 20    /*   4 */.    
bfb0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
bfc0: 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 61 5f 73 74  ELECT NULL, a_st
bfd0: 72 69 6e 67 28 34 30 30 29 20 46 52 4f 4d 20 74  ring(400) FROM t
bfe0: 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20  1;          /*  
bff0: 20 38 20 2a 2f 0a 20 20 20 20 49 4e 53 45 52 54   8 */.    INSERT
c000: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
c010: 4e 55 4c 4c 2c 20 61 5f 73 74 72 69 6e 67 28 34  NULL, a_string(4
c020: 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20  00) FROM t1;    
c030: 20 20 20 20 20 20 2f 2a 20 20 31 36 20 2a 2f 0a        /*  16 */.
c040: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
c050: 74 31 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20  t1 SELECT NULL, 
c060: 61 5f 73 74 72 69 6e 67 28 34 30 30 29 20 46 52  a_string(400) FR
c070: 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 20 20 20  OM t1;          
c080: 2f 2a 20 20 33 32 20 2a 2f 0a 20 20 20 20 49 4e  /*  32 */.    IN
c090: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
c0a0: 45 43 54 20 4e 55 4c 4c 2c 20 61 5f 73 74 72 69  ECT NULL, a_stri
c0b0: 6e 67 28 34 30 30 29 20 46 52 4f 4d 20 74 31 3b  ng(400) FROM t1;
c0c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20 36 34            /*  64
c0d0: 20 2a 2f 0a 20 20 20 20 49 4e 53 45 52 54 20 49   */.    INSERT I
c0e0: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 4e 55  NTO t1 SELECT NU
c0f0: 4c 4c 2c 20 61 5f 73 74 72 69 6e 67 28 34 30 30  LL, a_string(400
c100: 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20  ) FROM t1;      
c110: 20 20 20 20 2f 2a 20 31 32 38 20 2a 2f 0a 20 20      /* 128 */.  
c120: 43 4f 4d 4d 49 54 3b 0a 20 20 55 50 44 41 54 45  COMMIT;.  UPDATE
c130: 20 74 31 20 53 45 54 20 62 20 3d 20 61 5f 73 74   t1 SET b = a_st
c140: 72 69 6e 67 28 34 30 30 29 3b 0a 7d 20 7b 70 65  ring(400);.} {pe
c150: 72 73 69 73 74 7d 0a 0a 69 66 20 7b 24 3a 3a 74  rsist}..if {$::t
c160: 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 70 6c 61 74  cl_platform(plat
c170: 66 6f 72 6d 29 21 3d 22 77 69 6e 64 6f 77 73 22  form)!="windows"
c180: 7d 20 7b 0a 23 20 52 75 6e 20 74 72 61 6e 73 61  } {.# Run transa
c190: 63 74 69 6f 6e 73 20 6f 66 20 69 6e 63 72 65 61  ctions of increa
c1a0: 73 69 6e 67 20 73 69 7a 65 73 2e 20 45 76 65 6e  sing sizes. Even
c1b0: 74 75 61 6c 6c 79 2c 20 6f 6e 65 20 28 6f 72 20  tually, one (or 
c1c0: 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 29 0a 23  more than one).#
c1d0: 20 6f 66 20 74 68 65 73 65 20 77 69 6c 6c 20 77   of these will w
c1e0: 72 69 74 65 20 6a 75 73 74 20 65 6e 6f 75 67 68  rite just enough
c1f0: 20 63 6f 6e 74 65 6e 74 20 74 68 61 74 20 6f 6e   content that on
c200: 65 20 6f 66 20 74 68 65 20 6f 6c 64 20 68 65 61  e of the old hea
c210: 64 65 72 73 20 63 72 65 61 74 65 64 20 0a 23 20  ders created .# 
c220: 62 79 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  by the transacti
c230: 6f 6e 20 69 6e 20 74 68 65 20 62 6c 6f 63 6b 20  on in the block 
c240: 61 62 6f 76 65 20 6c 69 65 73 20 69 6d 6d 65 64  above lies immed
c250: 69 61 74 65 6c 79 20 61 66 74 65 72 20 74 68 65  iately after the
c260: 20 63 6f 6e 74 65 6e 74 0a 23 20 6a 6f 75 72 6e   content.# journ
c270: 61 6c 6c 65 64 20 62 79 20 74 68 65 20 63 75 72  alled by the cur
c280: 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
c290: 2e 0a 23 0a 66 6f 72 20 7b 73 65 74 20 6e 55 70  ..#.for {set nUp
c2a0: 20 31 7d 20 7b 24 6e 55 70 3c 36 34 7d 20 7b 69   1} {$nUp<64} {i
c2b0: 6e 63 72 20 6e 55 70 7d 20 7b 0a 20 20 64 6f 5f  ncr nUp} {.  do_
c2c0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67  execsql_test pag
c2d0: 65 72 31 2d 31 33 2e 31 2e 32 2e 24 6e 55 70 2e  er1-13.1.2.$nUp.
c2e0: 31 20 7b 20 0a 20 20 20 20 55 50 44 41 54 45 20  1 { .    UPDATE 
c2f0: 74 31 20 53 45 54 20 62 20 3d 20 61 5f 73 74 72  t1 SET b = a_str
c300: 69 6e 67 28 33 39 39 29 20 57 48 45 52 45 20 61  ing(399) WHERE a
c310: 20 3c 3d 20 24 6e 55 70 0a 20 20 7d 20 7b 7d 0a   <= $nUp.  } {}.
c320: 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73    do_execsql_tes
c330: 74 20 70 61 67 65 72 31 2d 31 33 2e 31 2e 32 2e  t pager1-13.1.2.
c340: 24 6e 55 70 2e 32 20 7b 20 50 52 41 47 4d 41 20  $nUp.2 { PRAGMA 
c350: 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20  integrity_check 
c360: 7d 20 7b 6f 6b 7d 20 0a 0a 20 20 23 20 54 72 79  } {ok} ..  # Try
c370: 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 73   to access the s
c380: 6e 61 70 73 68 6f 74 20 6f 66 20 74 68 65 20 66  napshot of the f
c390: 69 6c 65 2d 73 79 73 74 65 6d 2e 0a 20 20 23 0a  ile-system..  #.
c3a0: 20 20 73 71 6c 69 74 65 33 20 64 62 32 20 73 76    sqlite3 db2 sv
c3b0: 5f 74 65 73 74 2e 64 62 0a 20 20 64 6f 5f 74 65  _test.db.  do_te
c3c0: 73 74 20 70 61 67 65 72 31 2d 31 33 2e 31 2e 32  st pager1-13.1.2
c3d0: 2e 24 6e 55 70 2e 33 20 7b 0a 20 20 20 20 65 78  .$nUp.3 {.    ex
c3e0: 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 73  ecsql { SELECT s
c3f0: 75 6d 28 6c 65 6e 67 74 68 28 62 29 29 20 46 52  um(length(b)) FR
c400: 4f 4d 20 74 31 20 7d 20 64 62 32 0a 20 20 7d 20  OM t1 } db2.  } 
c410: 5b 65 78 70 72 20 7b 31 32 38 2a 34 30 30 20 2d  [expr {128*400 -
c420: 20 28 24 6e 55 70 2d 31 29 7d 5d 0a 20 20 64 6f   ($nUp-1)}].  do
c430: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 33 2e  _test pager1-13.
c440: 31 2e 32 2e 24 6e 55 70 2e 34 20 7b 0a 20 20 20  1.2.$nUp.4 {.   
c450: 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d   execsql { PRAGM
c460: 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63  A integrity_chec
c470: 6b 20 7d 20 64 62 32 0a 20 20 7d 20 7b 6f 6b 7d  k } db2.  } {ok}
c480: 0a 20 20 64 62 32 20 63 6c 6f 73 65 0a 7d 0a 7d  .  db2 close.}.}
c490: 0a 0a 69 66 20 7b 24 3a 3a 74 63 6c 5f 70 6c 61  ..if {$::tcl_pla
c4a0: 74 66 6f 72 6d 28 70 6c 61 74 66 6f 72 6d 29 21  tform(platform)!
c4b0: 3d 22 77 69 6e 64 6f 77 73 22 7d 20 7b 0a 23 20  ="windows"} {.# 
c4c0: 53 61 6d 65 20 74 65 73 74 20 61 73 20 61 62 6f  Same test as abo
c4d0: 76 65 2e 20 42 75 74 20 74 68 69 73 20 74 69 6d  ve. But this tim
c4e0: 65 20 77 69 74 68 20 61 6e 20 69 6e 64 65 78 20  e with an index 
c4f0: 6f 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 23 0a  on the table..#.
c500: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
c510: 70 61 67 65 72 31 2d 31 33 2e 32 2e 31 20 7b 0a  pager1-13.2.1 {.
c520: 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69    CREATE INDEX i
c530: 31 20 4f 4e 20 74 31 28 62 29 3b 0a 20 20 55 50  1 ON t1(b);.  UP
c540: 44 41 54 45 20 74 31 20 53 45 54 20 62 20 3d 20  DATE t1 SET b = 
c550: 61 5f 73 74 72 69 6e 67 28 34 30 30 29 3b 0a 7d  a_string(400);.}
c560: 20 7b 7d 0a 66 6f 72 20 7b 73 65 74 20 6e 55 70   {}.for {set nUp
c570: 20 31 7d 20 7b 24 6e 55 70 3c 36 34 7d 20 7b 69   1} {$nUp<64} {i
c580: 6e 63 72 20 6e 55 70 7d 20 7b 0a 20 20 64 6f 5f  ncr nUp} {.  do_
c590: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67  execsql_test pag
c5a0: 65 72 31 2d 31 33 2e 32 2e 32 2e 24 6e 55 70 2e  er1-13.2.2.$nUp.
c5b0: 31 20 7b 20 0a 20 20 20 20 55 50 44 41 54 45 20  1 { .    UPDATE 
c5c0: 74 31 20 53 45 54 20 62 20 3d 20 61 5f 73 74 72  t1 SET b = a_str
c5d0: 69 6e 67 28 33 39 39 29 20 57 48 45 52 45 20 61  ing(399) WHERE a
c5e0: 20 3c 3d 20 24 6e 55 70 0a 20 20 7d 20 7b 7d 0a   <= $nUp.  } {}.
c5f0: 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73    do_execsql_tes
c600: 74 20 70 61 67 65 72 31 2d 31 33 2e 32 2e 32 2e  t pager1-13.2.2.
c610: 24 6e 55 70 2e 32 20 7b 20 50 52 41 47 4d 41 20  $nUp.2 { PRAGMA 
c620: 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20  integrity_check 
c630: 7d 20 7b 6f 6b 7d 20 0a 20 20 73 71 6c 69 74 65  } {ok} .  sqlite
c640: 33 20 64 62 32 20 73 76 5f 74 65 73 74 2e 64 62  3 db2 sv_test.db
c650: 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72  .  do_test pager
c660: 31 2d 31 33 2e 32 2e 32 2e 24 6e 55 70 2e 33 20  1-13.2.2.$nUp.3 
c670: 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20  {.    execsql { 
c680: 53 45 4c 45 43 54 20 73 75 6d 28 6c 65 6e 67 74  SELECT sum(lengt
c690: 68 28 62 29 29 20 46 52 4f 4d 20 74 31 20 7d 20  h(b)) FROM t1 } 
c6a0: 64 62 32 0a 20 20 7d 20 5b 65 78 70 72 20 7b 31  db2.  } [expr {1
c6b0: 32 38 2a 34 30 30 20 2d 20 28 24 6e 55 70 2d 31  28*400 - ($nUp-1
c6c0: 29 7d 5d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61  )}].  do_test pa
c6d0: 67 65 72 31 2d 31 33 2e 32 2e 32 2e 24 6e 55 70  ger1-13.2.2.$nUp
c6e0: 2e 34 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c  .4 {.    execsql
c6f0: 20 7b 20 50 52 41 47 4d 41 20 69 6e 74 65 67 72   { PRAGMA integr
c700: 69 74 79 5f 63 68 65 63 6b 20 7d 20 64 62 32 0a  ity_check } db2.
c710: 20 20 7d 20 7b 6f 6b 7d 0a 20 20 64 62 32 20 63    } {ok}.  db2 c
c720: 6c 6f 73 65 0a 7d 0a 7d 0a 0a 64 62 20 63 6c 6f  lose.}.}..db clo
c730: 73 65 0a 74 76 20 64 65 6c 65 74 65 0a 0a 23 2d  se.tv delete..#-
c740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c780: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20  --------.# Test 
c790: 73 70 65 63 61 6c 20 22 50 52 41 47 4d 41 20 6a  specal "PRAGMA j
c7a0: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 4f 46 46 22  ournal_mode=OFF"
c7b0: 20 74 65 73 74 20 63 61 73 65 73 2e 0a 23 0a 66   test cases..#.f
c7c0: 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61  aultsim_delete_a
c7d0: 6e 64 5f 72 65 6f 70 65 6e 0a 64 6f 5f 65 78 65  nd_reopen.do_exe
c7e0: 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31  csql_test pager1
c7f0: 2d 31 34 2e 31 2e 31 20 7b 0a 20 20 50 52 41 47  -14.1.1 {.  PRAG
c800: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  MA journal_mode 
c810: 3d 20 4f 46 46 3b 0a 20 20 43 52 45 41 54 45 20  = OFF;.  CREATE 
c820: 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a  TABLE t1(a, b);.
c830: 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 49 4e 53    BEGIN;.    INS
c840: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
c850: 45 53 28 31 2c 20 32 29 3b 0a 20 20 43 4f 4d 4d  ES(1, 2);.  COMM
c860: 49 54 3b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46  IT;.  SELECT * F
c870: 52 4f 4d 20 74 31 3b 0a 7d 20 7b 6f 66 66 20 31  ROM t1;.} {off 1
c880: 20 32 7d 0a 64 6f 5f 63 61 74 63 68 73 71 6c 5f   2}.do_catchsql_
c890: 74 65 73 74 20 70 61 67 65 72 31 2d 31 34 2e 31  test pager1-14.1
c8a0: 2e 32 20 7b 0a 20 20 42 45 47 49 4e 3b 0a 20 20  .2 {.  BEGIN;.  
c8b0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
c8c0: 20 56 41 4c 55 45 53 28 33 2c 20 34 29 3b 0a 20   VALUES(3, 4);. 
c8d0: 20 52 4f 4c 4c 42 41 43 4b 3b 0a 7d 20 7b 30 20   ROLLBACK;.} {0 
c8e0: 7b 7d 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  {}}.do_execsql_t
c8f0: 65 73 74 20 70 61 67 65 72 31 2d 31 34 2e 31 2e  est pager1-14.1.
c900: 33 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46  3 {.  SELECT * F
c910: 52 4f 4d 20 74 31 3b 0a 7d 20 7b 31 20 32 7d 0a  ROM t1;.} {1 2}.
c920: 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74 65 73 74  do_catchsql_test
c930: 20 70 61 67 65 72 31 2d 31 34 2e 31 2e 34 20 7b   pager1-14.1.4 {
c940: 0a 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 49 4e  .  BEGIN;.    IN
c950: 53 45 52 54 20 49 4e 54 4f 20 74 31 28 72 6f 77  SERT INTO t1(row
c960: 69 64 2c 20 61 2c 20 62 29 20 53 45 4c 45 43 54  id, a, b) SELECT
c970: 20 61 2b 33 2c 20 62 2c 20 62 20 46 52 4f 4d 20   a+3, b, b FROM 
c980: 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  t1;.    INSERT I
c990: 4e 54 4f 20 74 31 28 72 6f 77 69 64 2c 20 61 2c  NTO t1(rowid, a,
c9a0: 20 62 29 20 53 45 4c 45 43 54 20 61 2b 33 2c 20   b) SELECT a+3, 
c9b0: 62 2c 20 62 20 46 52 4f 4d 20 74 31 3b 0a 7d 20  b, b FROM t1;.} 
c9c0: 7b 31 20 7b 50 52 49 4d 41 52 59 20 4b 45 59 20  {1 {PRIMARY KEY 
c9d0: 6d 75 73 74 20 62 65 20 75 6e 69 71 75 65 7d 7d  must be unique}}
c9e0: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
c9f0: 20 70 61 67 65 72 31 2d 31 34 2e 31 2e 35 20 7b   pager1-14.1.5 {
ca00: 0a 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 53 45 4c  .  COMMIT;.  SEL
ca10: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 7d  ECT * FROM t1;.}
ca20: 20 7b 31 20 32 20 32 20 32 7d 0a 0a 23 2d 2d 2d   {1 2 2 2}..#---
ca30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ca40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ca50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ca60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ca70: 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 6f 70  ------.# Test op
ca80: 65 6e 69 6e 67 20 61 6e 64 20 63 6c 6f 73 69 6e  ening and closin
ca90: 67 20 74 68 65 20 70 61 67 65 72 20 73 75 62 2d  g the pager sub-
caa0: 73 79 73 74 65 6d 20 77 69 74 68 20 64 69 66 66  system with diff
cab0: 65 72 65 6e 74 20 76 61 6c 75 65 73 0a 23 20 66  erent values.# f
cac0: 6f 72 20 74 68 65 20 73 71 6c 69 74 65 33 5f 76  or the sqlite3_v
cad0: 66 73 2e 73 7a 4f 73 46 69 6c 65 20 76 61 72 69  fs.szOsFile vari
cae0: 61 62 6c 65 2e 0a 23 0a 66 61 75 6c 74 73 69 6d  able..#.faultsim
caf0: 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70  _delete_and_reop
cb00: 65 6e 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  en.do_execsql_te
cb10: 73 74 20 70 61 67 65 72 31 2d 31 35 2e 30 20 7b  st pager1-15.0 {
cb20: 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  .  CREATE TABLE 
cb30: 74 78 28 79 2c 20 7a 29 3b 0a 20 20 49 4e 53 45  tx(y, z);.  INSE
cb40: 52 54 20 49 4e 54 4f 20 74 78 20 56 41 4c 55 45  RT INTO tx VALUE
cb50: 53 28 27 41 79 75 74 74 68 61 79 61 27 2c 20 27  S('Ayutthaya', '
cb60: 42 65 69 6a 69 6e 67 27 29 3b 0a 20 20 49 4e 53  Beijing');.  INS
cb70: 45 52 54 20 49 4e 54 4f 20 74 78 20 56 41 4c 55  ERT INTO tx VALU
cb80: 45 53 28 27 4c 6f 6e 64 6f 6e 27 2c 20 27 54 6f  ES('London', 'To
cb90: 6b 79 6f 27 29 3b 0a 7d 20 7b 7d 0a 64 62 20 63  kyo');.} {}.db c
cba0: 6c 6f 73 65 0a 66 6f 72 20 7b 73 65 74 20 69 20  lose.for {set i 
cbb0: 30 7d 20 7b 24 69 3c 35 31 33 7d 20 7b 69 6e 63  0} {$i<513} {inc
cbc0: 72 20 69 20 33 7d 20 7b 0a 20 20 74 65 73 74 76  r i 3} {.  testv
cbd0: 66 73 20 74 76 20 2d 64 65 66 61 75 6c 74 20 31  fs tv -default 1
cbe0: 20 2d 73 7a 6f 73 66 69 6c 65 20 24 69 0a 20 20   -szosfile $i.  
cbf0: 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e  sqlite3 db test.
cc00: 64 62 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f  db.  do_execsql_
cc10: 74 65 73 74 20 70 61 67 65 72 31 2d 31 35 2e 24  test pager1-15.$
cc20: 69 2e 31 20 7b 0a 20 20 20 20 53 45 4c 45 43 54  i.1 {.    SELECT
cc30: 20 2a 20 46 52 4f 4d 20 74 78 3b 0a 20 20 7d 20   * FROM tx;.  } 
cc40: 7b 41 79 75 74 74 68 61 79 61 20 42 65 69 6a 69  {Ayutthaya Beiji
cc50: 6e 67 20 4c 6f 6e 64 6f 6e 20 54 6f 6b 79 6f 7d  ng London Tokyo}
cc60: 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 74 76  .  db close.  tv
cc70: 20 64 65 6c 65 74 65 0a 7d 0a 0a 23 2d 2d 2d 2d   delete.}..#----
cc80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cc90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ccb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ccc0: 2d 2d 2d 2d 2d 0a 23 20 43 68 65 63 6b 20 74 68  -----.# Check th
ccd0: 61 74 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73  at it is not pos
cce0: 73 69 62 6c 65 20 74 6f 20 6f 70 65 6e 20 61 20  sible to open a 
ccf0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 66  database file if
cd00: 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 0a 23   the full path.#
cd10: 20 74 6f 20 74 68 65 20 61 73 73 6f 63 69 61 74   to the associat
cd20: 65 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ed journal file 
cd30: 77 69 6c 6c 20 62 65 20 6c 6f 6e 67 65 72 20 74  will be longer t
cd40: 68 61 6e 20 73 71 6c 69 74 65 33 5f 76 66 73 2e  han sqlite3_vfs.
cd50: 6d 78 50 61 74 68 6e 61 6d 65 2e 0a 23 0a 74 65  mxPathname..#.te
cd60: 73 74 76 66 73 20 74 76 20 2d 64 65 66 61 75 6c  stvfs tv -defaul
cd70: 74 20 31 0a 74 76 20 73 63 72 69 70 74 20 78 4f  t 1.tv script xO
cd80: 70 65 6e 43 62 0a 74 76 20 66 69 6c 74 65 72 20  penCb.tv filter 
cd90: 78 4f 70 65 6e 0a 70 72 6f 63 20 78 4f 70 65 6e  xOpen.proc xOpen
cda0: 43 62 20 7b 6d 65 74 68 6f 64 20 66 69 6c 65 6e  Cb {method filen
cdb0: 61 6d 65 20 61 72 67 73 7d 20 7b 0a 20 20 73 65  ame args} {.  se
cdc0: 74 20 3a 3a 66 69 6c 65 5f 6c 65 6e 20 5b 73 74  t ::file_len [st
cdd0: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 66 69 6c  ring length $fil
cde0: 65 6e 61 6d 65 5d 0a 7d 0a 73 71 6c 69 74 65 33  ename].}.sqlite3
cdf0: 20 64 62 20 74 65 73 74 2e 64 62 0a 64 62 20 63   db test.db.db c
ce00: 6c 6f 73 65 0a 74 76 20 64 65 6c 65 74 65 0a 0a  lose.tv delete..
ce10: 66 6f 72 20 7b 73 65 74 20 69 69 20 5b 65 78 70  for {set ii [exp
ce20: 72 20 24 3a 3a 66 69 6c 65 5f 6c 65 6e 2d 35 5d  r $::file_len-5]
ce30: 7d 20 7b 24 69 69 20 3c 20 5b 65 78 70 72 20 24  } {$ii < [expr $
ce40: 3a 3a 66 69 6c 65 5f 6c 65 6e 2b 32 30 5d 7d 20  ::file_len+20]} 
ce50: 7b 69 6e 63 72 20 69 69 7d 20 7b 0a 20 20 74 65  {incr ii} {.  te
ce60: 73 74 76 66 73 20 74 76 20 2d 64 65 66 61 75 6c  stvfs tv -defaul
ce70: 74 20 31 20 2d 6d 78 70 61 74 68 6e 61 6d 65 20  t 1 -mxpathname 
ce80: 24 69 69 0a 0a 20 20 23 20 54 68 65 20 6c 65 6e  $ii..  # The len
ce90: 67 74 68 20 6f 66 20 74 68 65 20 66 75 6c 6c 20  gth of the full 
cea0: 70 61 74 68 20 74 6f 20 66 69 6c 65 20 22 74 65  path to file "te
ceb0: 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 22 20 69  st.db-journal" i
cec0: 73 20 28 24 3a 3a 66 69 6c 65 5f 6c 65 6e 2b 38  s ($::file_len+8
ced0: 29 2e 0a 20 20 23 20 49 66 20 74 68 65 20 63 6f  )..  # If the co
cee0: 6e 66 69 67 75 72 65 64 20 73 71 6c 69 74 65 33  nfigured sqlite3
cef0: 5f 76 66 73 2e 6d 78 50 61 74 68 6e 61 6d 65 20  _vfs.mxPathname 
cf00: 76 61 6c 75 65 20 67 72 65 61 74 65 72 20 74 68  value greater th
cf10: 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 0a 20  an or equal to. 
cf20: 20 23 20 74 68 69 73 2c 20 74 68 65 6e 20 74 68   # this, then th
cf30: 65 20 66 69 6c 65 20 63 61 6e 20 62 65 20 6f 70  e file can be op
cf40: 65 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  ened. Otherwise,
cf50: 20 69 74 20 63 61 6e 6e 6f 74 2e 0a 20 20 23 0a   it cannot..  #.
cf60: 20 20 69 66 20 7b 24 69 69 20 3e 3d 20 5b 65 78    if {$ii >= [ex
cf70: 70 72 20 24 3a 3a 66 69 6c 65 5f 6c 65 6e 2b 38  pr $::file_len+8
cf80: 5d 7d 20 7b 0a 20 20 20 20 73 65 74 20 72 65 73  ]} {.    set res
cf90: 20 7b 30 20 7b 7d 7d 0a 20 20 7d 20 65 6c 73 65   {0 {}}.  } else
cfa0: 20 7b 0a 20 20 20 20 73 65 74 20 72 65 73 20 7b   {.    set res {
cfb0: 31 20 7b 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65  1 {unable to ope
cfc0: 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 7d  n database file}
cfd0: 7d 0a 20 20 7d 0a 0a 20 20 64 6f 5f 74 65 73 74  }.  }..  do_test
cfe0: 20 70 61 67 65 72 31 2d 31 36 2e 31 2e 24 69 69   pager1-16.1.$ii
cff0: 20 7b 0a 20 20 20 20 6c 69 73 74 20 5b 63 61 74   {.    list [cat
d000: 63 68 20 7b 20 73 71 6c 69 74 65 33 20 64 62 20  ch { sqlite3 db 
d010: 74 65 73 74 2e 64 62 20 7d 20 6d 73 67 5d 20 24  test.db } msg] $
d020: 6d 73 67 0a 20 20 7d 20 24 72 65 73 0a 0a 20 20  msg.  } $res..  
d030: 63 61 74 63 68 20 7b 64 62 20 63 6c 6f 73 65 7d  catch {db close}
d040: 0a 20 20 74 76 20 64 65 6c 65 74 65 0a 7d 0a 0a  .  tv delete.}..
d050: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
d060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65  -----------.# Te
d0a0: 73 74 20 74 68 65 20 70 61 67 65 72 73 20 72 65  st the pagers re
d0b0: 73 70 6f 6e 73 65 20 74 6f 20 74 68 65 20 62 2d  sponse to the b-
d0c0: 74 72 65 65 20 6c 61 79 65 72 20 72 65 71 75 65  tree layer reque
d0d0: 73 74 69 6e 67 20 69 6c 6c 65 67 61 6c 20 70 61  sting illegal pa
d0e0: 67 65 20 0a 23 20 6e 75 6d 62 65 72 73 3a 0a 23  ge .# numbers:.#
d0f0: 0a 23 20 20 20 2b 20 54 68 65 20 6c 6f 63 6b 69  .#   + The locki
d100: 6e 67 20 70 61 67 65 2c 0a 23 20 20 20 2b 20 50  ng page,.#   + P
d110: 61 67 65 20 30 2c 0a 23 20 20 20 2b 20 41 20 70  age 0,.#   + A p
d120: 61 67 65 20 77 69 74 68 20 61 20 70 61 67 65 20  age with a page 
d130: 6e 75 6d 62 65 72 20 67 72 65 61 74 65 72 20 74  number greater t
d140: 68 61 6e 20 28 32 5e 33 31 2d 31 29 2e 0a 23 0a  han (2^31-1)..#.
d150: 23 20 54 68 65 73 65 20 74 65 73 74 73 20 77 69  # These tests wi
d160: 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20 69 66 20 53  ll not work if S
d170: 51 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45  QLITE_DIRECT_OVE
d180: 52 46 4c 4f 57 5f 52 45 41 44 20 69 73 20 64 65  RFLOW_READ is de
d190: 66 69 6e 65 64 2e 20 49 6e 0a 23 20 74 68 61 74  fined. In.# that
d1a0: 20 63 61 73 65 20 49 4f 20 65 72 72 6f 72 73 20   case IO errors 
d1b0: 61 72 65 20 73 6f 6d 65 74 69 6d 65 73 20 72 65  are sometimes re
d1c0: 70 6f 72 74 65 64 20 69 6e 73 74 65 61 64 20 6f  ported instead o
d1d0: 66 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  f SQLITE_CORRUPT
d1e0: 2e 0a 23 0a 69 66 63 61 70 61 62 6c 65 20 21 64  ..#.ifcapable !d
d1f0: 69 72 65 63 74 5f 72 65 61 64 20 7b 0a 64 6f 5f  irect_read {.do_
d200: 74 65 73 74 20 70 61 67 65 72 31 2d 31 38 2e 31  test pager1-18.1
d210: 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65   {.  faultsim_de
d220: 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a  lete_and_reopen.
d230: 20 20 64 62 20 66 75 6e 63 20 61 5f 73 74 72 69    db func a_stri
d240: 6e 67 20 61 5f 73 74 72 69 6e 67 0a 20 20 65 78  ng a_string.  ex
d250: 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 50 52 41  ecsql { .    PRA
d260: 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20  GMA page_size = 
d270: 31 30 32 34 3b 0a 20 20 20 20 43 52 45 41 54 45  1024;.    CREATE
d280: 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b   TABLE t1(a, b);
d290: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
d2a0: 20 74 31 20 56 41 4c 55 45 53 28 61 5f 73 74 72   t1 VALUES(a_str
d2b0: 69 6e 67 28 35 30 30 29 2c 20 61 5f 73 74 72 69  ing(500), a_stri
d2c0: 6e 67 28 32 30 30 29 29 3b 0a 20 20 20 20 49 4e  ng(200));.    IN
d2d0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
d2e0: 45 43 54 20 61 5f 73 74 72 69 6e 67 28 35 30 30  ECT a_string(500
d2f0: 29 2c 20 61 5f 73 74 72 69 6e 67 28 32 30 30 29  ), a_string(200)
d300: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e   FROM t1;.    IN
d310: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
d320: 45 43 54 20 61 5f 73 74 72 69 6e 67 28 35 30 30  ECT a_string(500
d330: 29 2c 20 61 5f 73 74 72 69 6e 67 28 32 30 30 29  ), a_string(200)
d340: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e   FROM t1;.    IN
d350: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
d360: 45 43 54 20 61 5f 73 74 72 69 6e 67 28 35 30 30  ECT a_string(500
d370: 29 2c 20 61 5f 73 74 72 69 6e 67 28 32 30 30 29  ), a_string(200)
d380: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e   FROM t1;.    IN
d390: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
d3a0: 45 43 54 20 61 5f 73 74 72 69 6e 67 28 35 30 30  ECT a_string(500
d3b0: 29 2c 20 61 5f 73 74 72 69 6e 67 28 32 30 30 29  ), a_string(200)
d3c0: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e   FROM t1;.    IN
d3d0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
d3e0: 45 43 54 20 61 5f 73 74 72 69 6e 67 28 35 30 30  ECT a_string(500
d3f0: 29 2c 20 61 5f 73 74 72 69 6e 67 28 32 30 30 29  ), a_string(200)
d400: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e   FROM t1;.    IN
d410: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
d420: 45 43 54 20 61 5f 73 74 72 69 6e 67 28 35 30 30  ECT a_string(500
d430: 29 2c 20 61 5f 73 74 72 69 6e 67 28 32 30 30 29  ), a_string(200)
d440: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e   FROM t1;.    IN
d450: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
d460: 45 43 54 20 61 5f 73 74 72 69 6e 67 28 35 30 30  ECT a_string(500
d470: 29 2c 20 61 5f 73 74 72 69 6e 67 28 32 30 30 29  ), a_string(200)
d480: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a 7d 20   FROM t1;.  }.} 
d490: 7b 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  {}.do_test pager
d4a0: 31 2d 31 38 2e 32 20 7b 0a 20 20 73 65 74 20 72  1-18.2 {.  set r
d4b0: 6f 6f 74 20 5b 64 62 20 6f 6e 65 20 22 53 45 4c  oot [db one "SEL
d4c0: 45 43 54 20 72 6f 6f 74 70 61 67 65 20 46 52 4f  ECT rootpage FRO
d4d0: 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22  M sqlite_master"
d4e0: 5d 0a 20 20 73 65 74 20 6c 6f 63 6b 69 6e 67 70  ].  set lockingp
d4f0: 61 67 65 20 5b 65 78 70 72 20 28 30 78 31 30 30  age [expr (0x100
d500: 30 30 2f 31 30 32 34 29 20 2b 20 31 5d 0a 20 20  00/1024) + 1].  
d510: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52  execsql {.    PR
d520: 41 47 4d 41 20 77 72 69 74 61 62 6c 65 5f 73 63  AGMA writable_sc
d530: 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20 55 50  hema = 1;.    UP
d540: 44 41 54 45 20 73 71 6c 69 74 65 5f 6d 61 73 74  DATE sqlite_mast
d550: 65 72 20 53 45 54 20 72 6f 6f 74 70 61 67 65 20  er SET rootpage 
d560: 3d 20 24 6c 6f 63 6b 69 6e 67 70 61 67 65 3b 0a  = $lockingpage;.
d570: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 20 64 62    }.  sqlite3 db
d580: 32 20 74 65 73 74 2e 64 62 0a 20 20 63 61 74 63  2 test.db.  catc
d590: 68 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 63 6f  hsql { SELECT co
d5a0: 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31 20 7d  unt(*) FROM t1 }
d5b0: 20 64 62 32 0a 7d 20 7b 31 20 7b 64 61 74 61 62   db2.} {1 {datab
d5c0: 61 73 65 20 64 69 73 6b 20 69 6d 61 67 65 20 69  ase disk image i
d5d0: 73 20 6d 61 6c 66 6f 72 6d 65 64 7d 7d 0a 64 62  s malformed}}.db
d5e0: 32 20 63 6c 6f 73 65 0a 64 6f 5f 74 65 73 74 20  2 close.do_test 
d5f0: 70 61 67 65 72 31 2d 31 38 2e 33 2e 31 20 7b 0a  pager1-18.3.1 {.
d600: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
d610: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32 28  CREATE TABLE t2(
d620: 78 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  x);.    INSERT I
d630: 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 61 5f  NTO t2 VALUES(a_
d640: 73 74 72 69 6e 67 28 35 30 30 30 29 29 3b 0a 20  string(5000));. 
d650: 20 7d 0a 20 20 73 65 74 20 70 67 6e 6f 20 5b 65   }.  set pgno [e
d660: 78 70 72 20 28 5b 66 69 6c 65 20 73 69 7a 65 20  xpr ([file size 
d670: 74 65 73 74 2e 64 62 5d 20 2f 20 31 30 32 34 29  test.db] / 1024)
d680: 2d 32 5d 0a 20 20 68 65 78 69 6f 5f 77 72 69 74  -2].  hexio_writ
d690: 65 20 74 65 73 74 2e 64 62 20 5b 65 78 70 72 20  e test.db [expr 
d6a0: 28 24 70 67 6e 6f 2d 31 29 2a 31 30 32 34 5d 20  ($pgno-1)*1024] 
d6b0: 30 30 30 30 30 30 30 30 0a 20 20 73 71 6c 69 74  00000000.  sqlit
d6c0: 65 33 20 64 62 32 20 74 65 73 74 2e 64 62 0a 20  e3 db2 test.db. 
d6d0: 20 23 20 65 76 65 6e 20 74 68 6f 75 67 68 20 78   # even though x
d6e0: 20 69 73 20 6d 61 6c 66 6f 72 6d 65 64 2c 20 62   is malformed, b
d6f0: 65 63 61 75 73 65 20 74 79 70 65 6f 66 28 29 20  ecause typeof() 
d700: 64 6f 65 73 0a 20 20 23 20 6e 6f 74 20 6c 6f 61  does.  # not loa
d710: 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  d the content of
d720: 20 78 2c 20 74 68 65 20 65 72 72 6f 72 20 69 73   x, the error is
d730: 20 6e 6f 74 20 6e 6f 74 69 63 65 64 2e 0a 20 20   not noticed..  
d740: 63 61 74 63 68 73 71 6c 20 7b 20 53 45 4c 45 43  catchsql { SELEC
d750: 54 20 74 79 70 65 6f 66 28 78 29 20 46 52 4f 4d  T typeof(x) FROM
d760: 20 74 32 20 7d 20 64 62 32 0a 7d 20 7b 30 20 74   t2 } db2.} {0 t
d770: 65 78 74 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67  ext}.do_test pag
d780: 65 72 31 2d 31 38 2e 33 2e 32 20 7b 0a 20 20 23  er1-18.3.2 {.  #
d790: 20 69 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74   in this case, t
d7a0: 68 65 20 76 61 6c 75 65 20 6f 66 20 78 20 69 73  he value of x is
d7b0: 20 6c 6f 61 64 65 64 20 61 6e 64 20 73 6f 20 74   loaded and so t
d7c0: 68 65 20 65 72 72 6f 72 20 69 73 0a 20 20 23 20  he error is.  # 
d7d0: 64 65 74 65 63 74 65 64 0a 20 20 63 61 74 63 68  detected.  catch
d7e0: 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 6c 65 6e  sql { SELECT len
d7f0: 67 74 68 28 78 7c 7c 27 27 29 20 46 52 4f 4d 20  gth(x||'') FROM 
d800: 74 32 20 7d 20 64 62 32 0a 7d 20 7b 31 20 7b 64  t2 } db2.} {1 {d
d810: 61 74 61 62 61 73 65 20 64 69 73 6b 20 69 6d 61  atabase disk ima
d820: 67 65 20 69 73 20 6d 61 6c 66 6f 72 6d 65 64 7d  ge is malformed}
d830: 7d 0a 64 62 32 20 63 6c 6f 73 65 0a 64 6f 5f 74  }.db2 close.do_t
d840: 65 73 74 20 70 61 67 65 72 31 2d 31 38 2e 33 2e  est pager1-18.3.
d850: 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  3 {.  execsql {.
d860: 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20      DELETE FROM 
d870: 74 32 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  t2;.    INSERT I
d880: 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 72 61  NTO t2 VALUES(ra
d890: 6e 64 6f 6d 62 6c 6f 62 28 35 30 30 30 29 29 3b  ndomblob(5000));
d8a0: 0a 20 20 7d 0a 20 20 73 65 74 20 70 67 6e 6f 20  .  }.  set pgno 
d8b0: 5b 65 78 70 72 20 28 5b 66 69 6c 65 20 73 69 7a  [expr ([file siz
d8c0: 65 20 74 65 73 74 2e 64 62 5d 20 2f 20 31 30 32  e test.db] / 102
d8d0: 34 29 2d 32 5d 0a 20 20 68 65 78 69 6f 5f 77 72  4)-2].  hexio_wr
d8e0: 69 74 65 20 74 65 73 74 2e 64 62 20 5b 65 78 70  ite test.db [exp
d8f0: 72 20 28 24 70 67 6e 6f 2d 31 29 2a 31 30 32 34  r ($pgno-1)*1024
d900: 5d 20 30 30 30 30 30 30 30 30 0a 20 20 73 71 6c  ] 00000000.  sql
d910: 69 74 65 33 20 64 62 32 20 74 65 73 74 2e 64 62  ite3 db2 test.db
d920: 0a 20 20 23 20 65 76 65 6e 20 74 68 6f 75 67 68  .  # even though
d930: 20 78 20 69 73 20 6d 61 6c 66 6f 72 6d 65 64 2c   x is malformed,
d940: 20 62 65 63 61 75 73 65 20 6c 65 6e 67 74 68 28   because length(
d950: 29 20 61 6e 64 20 74 79 70 65 6f 66 28 29 20 64  ) and typeof() d
d960: 6f 0a 20 20 23 20 6e 6f 74 20 6c 6f 61 64 20 74  o.  # not load t
d970: 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 78 2c  he content of x,
d980: 20 74 68 65 20 65 72 72 6f 72 20 69 73 20 6e 6f   the error is no
d990: 74 20 6e 6f 74 69 63 65 64 2e 0a 20 20 63 61 74  t noticed..  cat
d9a0: 63 68 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 6c  chsql { SELECT l
d9b0: 65 6e 67 74 68 28 78 29 2c 20 74 79 70 65 6f 66  ength(x), typeof
d9c0: 28 78 29 20 46 52 4f 4d 20 74 32 20 7d 20 64 62  (x) FROM t2 } db
d9d0: 32 0a 7d 20 7b 30 20 7b 35 30 30 30 20 62 6c 6f  2.} {0 {5000 blo
d9e0: 62 7d 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  b}}.do_test page
d9f0: 72 31 2d 31 38 2e 33 2e 34 20 7b 0a 20 20 23 20  r1-18.3.4 {.  # 
da00: 69 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74 68  in this case, th
da10: 65 20 76 61 6c 75 65 20 6f 66 20 78 20 69 73 20  e value of x is 
da20: 6c 6f 61 64 65 64 20 61 6e 64 20 73 6f 20 74 68  loaded and so th
da30: 65 20 65 72 72 6f 72 20 69 73 0a 20 20 23 20 64  e error is.  # d
da40: 65 74 65 63 74 65 64 0a 20 20 63 61 74 63 68 73  etected.  catchs
da50: 71 6c 20 7b 20 53 45 4c 45 43 54 20 6c 65 6e 67  ql { SELECT leng
da60: 74 68 28 78 7c 7c 27 27 29 20 46 52 4f 4d 20 74  th(x||'') FROM t
da70: 32 20 7d 20 64 62 32 0a 7d 20 7b 31 20 7b 64 61  2 } db2.} {1 {da
da80: 74 61 62 61 73 65 20 64 69 73 6b 20 69 6d 61 67  tabase disk imag
da90: 65 20 69 73 20 6d 61 6c 66 6f 72 6d 65 64 7d 7d  e is malformed}}
daa0: 0a 64 62 32 20 63 6c 6f 73 65 0a 64 6f 5f 74 65  .db2 close.do_te
dab0: 73 74 20 70 61 67 65 72 31 2d 31 38 2e 34 20 7b  st pager1-18.4 {
dac0: 0a 20 20 68 65 78 69 6f 5f 77 72 69 74 65 20 74  .  hexio_write t
dad0: 65 73 74 2e 64 62 20 5b 65 78 70 72 20 28 24 70  est.db [expr ($p
dae0: 67 6e 6f 2d 31 29 2a 31 30 32 34 5d 20 39 30 30  gno-1)*1024] 900
daf0: 30 30 30 30 30 0a 20 20 73 71 6c 69 74 65 33 20  00000.  sqlite3 
db00: 64 62 32 20 74 65 73 74 2e 64 62 0a 20 20 63 61  db2 test.db.  ca
db10: 74 63 68 73 71 6c 20 7b 20 53 45 4c 45 43 54 20  tchsql { SELECT 
db20: 6c 65 6e 67 74 68 28 78 7c 7c 27 27 29 20 46 52  length(x||'') FR
db30: 4f 4d 20 74 32 20 7d 20 64 62 32 0a 7d 20 7b 31  OM t2 } db2.} {1
db40: 20 7b 64 61 74 61 62 61 73 65 20 64 69 73 6b 20   {database disk 
db50: 69 6d 61 67 65 20 69 73 20 6d 61 6c 66 6f 72 6d  image is malform
db60: 65 64 7d 7d 0a 64 62 32 20 63 6c 6f 73 65 0a 64  ed}}.db2 close.d
db70: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 38  o_test pager1-18
db80: 2e 35 20 7b 0a 20 20 73 71 6c 69 74 65 33 20 64  .5 {.  sqlite3 d
db90: 62 20 22 22 0a 20 20 65 78 65 63 73 71 6c 20 7b  b "".  execsql {
dba0: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
dbb0: 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20  E t1(a, b);.    
dbc0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32 28  CREATE TABLE t2(
dbd0: 61 2c 20 62 29 3b 0a 20 20 20 20 50 52 41 47 4d  a, b);.    PRAGM
dbe0: 41 20 77 72 69 74 61 62 6c 65 5f 73 63 68 65 6d  A writable_schem
dbf0: 61 20 3d 20 31 3b 0a 20 20 20 20 55 50 44 41 54  a = 1;.    UPDAT
dc00: 45 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  E sqlite_master 
dc10: 53 45 54 20 72 6f 6f 74 70 61 67 65 3d 35 20 57  SET rootpage=5 W
dc20: 48 45 52 45 20 74 62 6c 5f 6e 61 6d 65 20 3d 20  HERE tbl_name = 
dc30: 27 74 31 27 3b 0a 20 20 20 20 50 52 41 47 4d 41  't1';.    PRAGMA
dc40: 20 77 72 69 74 61 62 6c 65 5f 73 63 68 65 6d 61   writable_schema
dc50: 20 3d 20 30 3b 0a 20 20 20 20 41 4c 54 45 52 20   = 0;.    ALTER 
dc60: 54 41 42 4c 45 20 74 31 20 52 45 4e 41 4d 45 20  TABLE t1 RENAME 
dc70: 54 4f 20 78 31 3b 0a 20 20 7d 0a 20 20 63 61 74  TO x1;.  }.  cat
dc80: 63 68 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a  chsql { SELECT *
dc90: 20 46 52 4f 4d 20 78 31 20 7d 0a 7d 20 7b 31 20   FROM x1 }.} {1 
dca0: 7b 64 61 74 61 62 61 73 65 20 64 69 73 6b 20 69  {database disk i
dcb0: 6d 61 67 65 20 69 73 20 6d 61 6c 66 6f 72 6d 65  mage is malforme
dcc0: 64 7d 7d 0a 64 62 20 63 6c 6f 73 65 0a 0a 64 6f  d}}.db close..do
dcd0: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 38 2e  _test pager1-18.
dce0: 36 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64  6 {.  faultsim_d
dcf0: 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e  elete_and_reopen
dd00: 0a 20 20 64 62 20 66 75 6e 63 20 61 5f 73 74 72  .  db func a_str
dd10: 69 6e 67 20 61 5f 73 74 72 69 6e 67 0a 20 20 65  ing a_string.  e
dd20: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41  xecsql {.    PRA
dd30: 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20  GMA page_size = 
dd40: 31 30 32 34 3b 0a 20 20 20 20 43 52 45 41 54 45  1024;.    CREATE
dd50: 20 54 41 42 4c 45 20 74 31 28 78 29 3b 0a 20 20   TABLE t1(x);.  
dd60: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
dd70: 20 56 41 4c 55 45 53 28 61 5f 73 74 72 69 6e 67   VALUES(a_string
dd80: 28 38 30 30 29 29 3b 0a 20 20 20 20 49 4e 53 45  (800));.    INSE
dd90: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
dda0: 53 28 61 5f 73 74 72 69 6e 67 28 38 30 30 29 29  S(a_string(800))
ddb0: 3b 0a 20 20 7d 0a 0a 20 20 73 65 74 20 72 6f 6f  ;.  }..  set roo
ddc0: 74 20 5b 64 62 20 6f 6e 65 20 22 53 45 4c 45 43  t [db one "SELEC
ddd0: 54 20 72 6f 6f 74 70 61 67 65 20 46 52 4f 4d 20  T rootpage FROM 
dde0: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 5d 0a  sqlite_master"].
ddf0: 20 20 64 62 20 63 6c 6f 73 65 0a 0a 20 20 68 65    db close..  he
de00: 78 69 6f 5f 77 72 69 74 65 20 74 65 73 74 2e 64  xio_write test.d
de10: 62 20 5b 65 78 70 72 20 28 24 72 6f 6f 74 2d 31  b [expr ($root-1
de20: 29 2a 31 30 32 34 20 2b 20 38 5d 20 30 30 30 30  )*1024 + 8] 0000
de30: 30 30 30 30 0a 20 20 73 71 6c 69 74 65 33 20 64  0000.  sqlite3 d
de40: 62 20 74 65 73 74 2e 64 62 0a 20 20 63 61 74 63  b test.db.  catc
de50: 68 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 6c 65  hsql { SELECT le
de60: 6e 67 74 68 28 78 29 20 46 52 4f 4d 20 74 31 20  ngth(x) FROM t1 
de70: 7d 0a 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65  }.} {1 {database
de80: 20 64 69 73 6b 20 69 6d 61 67 65 20 69 73 20 6d   disk image is m
de90: 61 6c 66 6f 72 6d 65 64 7d 7d 0a 7d 0a 0a 64 6f  alformed}}.}..do
dea0: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 39 2e  _test pager1-19.
deb0: 31 20 7b 0a 20 20 73 71 6c 69 74 65 33 20 64 62  1 {.  sqlite3 db
dec0: 20 22 22 0a 20 20 64 62 20 66 75 6e 63 20 61 5f   "".  db func a_
ded0: 73 74 72 69 6e 67 20 61 5f 73 74 72 69 6e 67 0a  string a_string.
dee0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
def0: 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65  PRAGMA page_size
df00: 20 3d 20 35 31 32 3b 0a 20 20 20 20 50 52 41 47   = 512;.    PRAG
df10: 4d 41 20 61 75 74 6f 5f 76 61 63 75 75 6d 20 3d  MA auto_vacuum =
df20: 20 31 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54   1;.    CREATE T
df30: 41 42 4c 45 20 74 31 28 61 61 2c 20 61 62 2c 20  ABLE t1(aa, ab, 
df40: 61 63 2c 20 61 64 2c 20 61 65 2c 20 61 66 2c 20  ac, ad, ae, af, 
df50: 61 67 2c 20 61 68 2c 20 61 69 2c 20 61 6a 2c 20  ag, ah, ai, aj, 
df60: 61 6b 2c 20 61 6c 2c 20 61 6d 2c 20 61 6e 2c 0a  ak, al, am, an,.
df70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df80: 20 20 20 20 62 61 2c 20 62 62 2c 20 62 63 2c 20      ba, bb, bc, 
df90: 62 64 2c 20 62 65 2c 20 62 66 2c 20 62 67 2c 20  bd, be, bf, bg, 
dfa0: 62 68 2c 20 62 69 2c 20 62 6a 2c 20 62 6b 2c 20  bh, bi, bj, bk, 
dfb0: 62 6c 2c 20 62 6d 2c 20 62 6e 2c 0a 20 20 20 20  bl, bm, bn,.    
dfc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dfd0: 63 61 2c 20 63 62 2c 20 63 63 2c 20 63 64 2c 20  ca, cb, cc, cd, 
dfe0: 63 65 2c 20 63 66 2c 20 63 67 2c 20 63 68 2c 20  ce, cf, cg, ch, 
dff0: 63 69 2c 20 63 6a 2c 20 63 6b 2c 20 63 6c 2c 20  ci, cj, ck, cl, 
e000: 63 6d 2c 20 63 6e 2c 0a 20 20 20 20 20 20 20 20  cm, cn,.        
e010: 20 20 20 20 20 20 20 20 20 20 20 20 64 61 2c 20              da, 
e020: 64 62 2c 20 64 63 2c 20 64 64 2c 20 64 65 2c 20  db, dc, dd, de, 
e030: 64 66 2c 20 64 67 2c 20 64 68 2c 20 64 69 2c 20  df, dg, dh, di, 
e040: 64 6a 2c 20 64 6b 2c 20 64 6c 2c 20 64 6d 2c 20  dj, dk, dl, dm, 
e050: 64 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  dn,.            
e060: 20 20 20 20 20 20 20 20 65 61 2c 20 65 62 2c 20          ea, eb, 
e070: 65 63 2c 20 65 64 2c 20 65 65 2c 20 65 66 2c 20  ec, ed, ee, ef, 
e080: 65 67 2c 20 65 68 2c 20 65 69 2c 20 65 6a 2c 20  eg, eh, ei, ej, 
e090: 65 6b 2c 20 65 6c 2c 20 65 6d 2c 20 65 6e 2c 0a  ek, el, em, en,.
e0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e0b0: 20 20 20 20 66 61 2c 20 66 62 2c 20 66 63 2c 20      fa, fb, fc, 
e0c0: 66 64 2c 20 66 65 2c 20 66 66 2c 20 66 67 2c 20  fd, fe, ff, fg, 
e0d0: 66 68 2c 20 66 69 2c 20 66 6a 2c 20 66 6b 2c 20  fh, fi, fj, fk, 
e0e0: 66 6c 2c 20 66 6d 2c 20 66 6e 2c 0a 20 20 20 20  fl, fm, fn,.    
e0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e100: 67 61 2c 20 67 62 2c 20 67 63 2c 20 67 64 2c 20  ga, gb, gc, gd, 
e110: 67 65 2c 20 67 66 2c 20 67 67 2c 20 67 68 2c 20  ge, gf, gg, gh, 
e120: 67 69 2c 20 67 6a 2c 20 67 6b 2c 20 67 6c 2c 20  gi, gj, gk, gl, 
e130: 67 6d 2c 20 67 6e 2c 0a 20 20 20 20 20 20 20 20  gm, gn,.        
e140: 20 20 20 20 20 20 20 20 20 20 20 20 68 61 2c 20              ha, 
e150: 68 62 2c 20 68 63 2c 20 68 64 2c 20 68 65 2c 20  hb, hc, hd, he, 
e160: 68 66 2c 20 68 67 2c 20 68 68 2c 20 68 69 2c 20  hf, hg, hh, hi, 
e170: 68 6a 2c 20 68 6b 2c 20 68 6c 2c 20 68 6d 2c 20  hj, hk, hl, hm, 
e180: 68 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  hn,.            
e190: 20 20 20 20 20 20 20 20 69 61 2c 20 69 62 2c 20          ia, ib, 
e1a0: 69 63 2c 20 69 64 2c 20 69 65 2c 20 69 66 2c 20  ic, id, ie, if, 
e1b0: 69 67 2c 20 69 68 2c 20 69 69 2c 20 69 6a 2c 20  ig, ih, ii, ij, 
e1c0: 69 6b 2c 20 69 6c 2c 20 69 6d 2c 20 69 78 2c 0a  ik, il, im, ix,.
e1d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e1e0: 20 20 20 20 6a 61 2c 20 6a 62 2c 20 6a 63 2c 20      ja, jb, jc, 
e1f0: 6a 64 2c 20 6a 65 2c 20 6a 66 2c 20 6a 67 2c 20  jd, je, jf, jg, 
e200: 6a 68 2c 20 6a 69 2c 20 6a 6a 2c 20 6a 6b 2c 20  jh, ji, jj, jk, 
e210: 6a 6c 2c 20 6a 6d 2c 20 6a 6e 2c 0a 20 20 20 20  jl, jm, jn,.    
e220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e230: 6b 61 2c 20 6b 62 2c 20 6b 63 2c 20 6b 64 2c 20  ka, kb, kc, kd, 
e240: 6b 65 2c 20 6b 66 2c 20 6b 67 2c 20 6b 68 2c 20  ke, kf, kg, kh, 
e250: 6b 69 2c 20 6b 6a 2c 20 6b 6b 2c 20 6b 6c 2c 20  ki, kj, kk, kl, 
e260: 6b 6d 2c 20 6b 6e 2c 0a 20 20 20 20 20 20 20 20  km, kn,.        
e270: 20 20 20 20 20 20 20 20 20 20 20 20 6c 61 2c 20              la, 
e280: 6c 62 2c 20 6c 63 2c 20 6c 64 2c 20 6c 65 2c 20  lb, lc, ld, le, 
e290: 6c 66 2c 20 6c 67 2c 20 6c 68 2c 20 6c 69 2c 20  lf, lg, lh, li, 
e2a0: 6c 6a 2c 20 6c 6b 2c 20 6c 6c 2c 20 6c 6d 2c 20  lj, lk, ll, lm, 
e2b0: 6c 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ln,.            
e2c0: 20 20 20 20 20 20 20 20 6d 61 2c 20 6d 62 2c 20          ma, mb, 
e2d0: 6d 63 2c 20 6d 64 2c 20 6d 65 2c 20 6d 66 2c 20  mc, md, me, mf, 
e2e0: 6d 67 2c 20 6d 68 2c 20 6d 69 2c 20 6d 6a 2c 20  mg, mh, mi, mj, 
e2f0: 6d 6b 2c 20 6d 6c 2c 20 6d 6d 2c 20 6d 6e 0a 20  mk, ml, mm, mn. 
e300: 20 20 20 29 3b 0a 20 20 20 20 43 52 45 41 54 45     );.    CREATE
e310: 20 54 41 42 4c 45 20 74 32 28 61 61 2c 20 61 62   TABLE t2(aa, ab
e320: 2c 20 61 63 2c 20 61 64 2c 20 61 65 2c 20 61 66  , ac, ad, ae, af
e330: 2c 20 61 67 2c 20 61 68 2c 20 61 69 2c 20 61 6a  , ag, ah, ai, aj
e340: 2c 20 61 6b 2c 20 61 6c 2c 20 61 6d 2c 20 61 6e  , ak, al, am, an
e350: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
e360: 20 20 20 20 20 20 62 61 2c 20 62 62 2c 20 62 63        ba, bb, bc
e370: 2c 20 62 64 2c 20 62 65 2c 20 62 66 2c 20 62 67  , bd, be, bf, bg
e380: 2c 20 62 68 2c 20 62 69 2c 20 62 6a 2c 20 62 6b  , bh, bi, bj, bk
e390: 2c 20 62 6c 2c 20 62 6d 2c 20 62 6e 2c 0a 20 20  , bl, bm, bn,.  
e3a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e3b0: 20 20 63 61 2c 20 63 62 2c 20 63 63 2c 20 63 64    ca, cb, cc, cd
e3c0: 2c 20 63 65 2c 20 63 66 2c 20 63 67 2c 20 63 68  , ce, cf, cg, ch
e3d0: 2c 20 63 69 2c 20 63 6a 2c 20 63 6b 2c 20 63 6c  , ci, cj, ck, cl
e3e0: 2c 20 63 6d 2c 20 63 6e 2c 0a 20 20 20 20 20 20  , cm, cn,.      
e3f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61                da
e400: 2c 20 64 62 2c 20 64 63 2c 20 64 64 2c 20 64 65  , db, dc, dd, de
e410: 2c 20 64 66 2c 20 64 67 2c 20 64 68 2c 20 64 69  , df, dg, dh, di
e420: 2c 20 64 6a 2c 20 64 6b 2c 20 64 6c 2c 20 64 6d  , dj, dk, dl, dm
e430: 2c 20 64 6e 2c 0a 20 20 20 20 20 20 20 20 20 20  , dn,.          
e440: 20 20 20 20 20 20 20 20 20 20 65 61 2c 20 65 62            ea, eb
e450: 2c 20 65 63 2c 20 65 64 2c 20 65 65 2c 20 65 66  , ec, ed, ee, ef
e460: 2c 20 65 67 2c 20 65 68 2c 20 65 69 2c 20 65 6a  , eg, eh, ei, ej
e470: 2c 20 65 6b 2c 20 65 6c 2c 20 65 6d 2c 20 65 6e  , ek, el, em, en
e480: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
e490: 20 20 20 20 20 20 66 61 2c 20 66 62 2c 20 66 63        fa, fb, fc
e4a0: 2c 20 66 64 2c 20 66 65 2c 20 66 66 2c 20 66 67  , fd, fe, ff, fg
e4b0: 2c 20 66 68 2c 20 66 69 2c 20 66 6a 2c 20 66 6b  , fh, fi, fj, fk
e4c0: 2c 20 66 6c 2c 20 66 6d 2c 20 66 6e 2c 0a 20 20  , fl, fm, fn,.  
e4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e4e0: 20 20 67 61 2c 20 67 62 2c 20 67 63 2c 20 67 64    ga, gb, gc, gd
e4f0: 2c 20 67 65 2c 20 67 66 2c 20 67 67 2c 20 67 68  , ge, gf, gg, gh
e500: 2c 20 67 69 2c 20 67 6a 2c 20 67 6b 2c 20 67 6c  , gi, gj, gk, gl
e510: 2c 20 67 6d 2c 20 67 6e 2c 0a 20 20 20 20 20 20  , gm, gn,.      
e520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 68 61                ha
e530: 2c 20 68 62 2c 20 68 63 2c 20 68 64 2c 20 68 65  , hb, hc, hd, he
e540: 2c 20 68 66 2c 20 68 67 2c 20 68 68 2c 20 68 69  , hf, hg, hh, hi
e550: 2c 20 68 6a 2c 20 68 6b 2c 20 68 6c 2c 20 68 6d  , hj, hk, hl, hm
e560: 2c 20 68 6e 2c 0a 20 20 20 20 20 20 20 20 20 20  , hn,.          
e570: 20 20 20 20 20 20 20 20 20 20 69 61 2c 20 69 62            ia, ib
e580: 2c 20 69 63 2c 20 69 64 2c 20 69 65 2c 20 69 66  , ic, id, ie, if
e590: 2c 20 69 67 2c 20 69 68 2c 20 69 69 2c 20 69 6a  , ig, ih, ii, ij
e5a0: 2c 20 69 6b 2c 20 69 6c 2c 20 69 6d 2c 20 69 78  , ik, il, im, ix
e5b0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
e5c0: 20 20 20 20 20 20 6a 61 2c 20 6a 62 2c 20 6a 63        ja, jb, jc
e5d0: 2c 20 6a 64 2c 20 6a 65 2c 20 6a 66 2c 20 6a 67  , jd, je, jf, jg
e5e0: 2c 20 6a 68 2c 20 6a 69 2c 20 6a 6a 2c 20 6a 6b  , jh, ji, jj, jk
e5f0: 2c 20 6a 6c 2c 20 6a 6d 2c 20 6a 6e 2c 0a 20 20  , jl, jm, jn,.  
e600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e610: 20 20 6b 61 2c 20 6b 62 2c 20 6b 63 2c 20 6b 64    ka, kb, kc, kd
e620: 2c 20 6b 65 2c 20 6b 66 2c 20 6b 67 2c 20 6b 68  , ke, kf, kg, kh
e630: 2c 20 6b 69 2c 20 6b 6a 2c 20 6b 6b 2c 20 6b 6c  , ki, kj, kk, kl
e640: 2c 20 6b 6d 2c 20 6b 6e 2c 0a 20 20 20 20 20 20  , km, kn,.      
e650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 61                la
e660: 2c 20 6c 62 2c 20 6c 63 2c 20 6c 64 2c 20 6c 65  , lb, lc, ld, le
e670: 2c 20 6c 66 2c 20 6c 67 2c 20 6c 68 2c 20 6c 69  , lf, lg, lh, li
e680: 2c 20 6c 6a 2c 20 6c 6b 2c 20 6c 6c 2c 20 6c 6d  , lj, lk, ll, lm
e690: 2c 20 6c 6e 2c 0a 20 20 20 20 20 20 20 20 20 20  , ln,.          
e6a0: 20 20 20 20 20 20 20 20 20 20 6d 61 2c 20 6d 62            ma, mb
e6b0: 2c 20 6d 63 2c 20 6d 64 2c 20 6d 65 2c 20 6d 66  , mc, md, me, mf
e6c0: 2c 20 6d 67 2c 20 6d 68 2c 20 6d 69 2c 20 6d 6a  , mg, mh, mi, mj
e6d0: 2c 20 6d 6b 2c 20 6d 6c 2c 20 6d 6d 2c 20 6d 6e  , mk, ml, mm, mn
e6e0: 0a 20 20 20 20 29 3b 0a 20 20 20 20 49 4e 53 45  .    );.    INSE
e6f0: 52 54 20 49 4e 54 4f 20 74 31 28 61 61 29 20 56  RT INTO t1(aa) V
e700: 41 4c 55 45 53 28 20 61 5f 73 74 72 69 6e 67 28  ALUES( a_string(
e710: 31 30 30 30 30 30 29 20 29 3b 0a 20 20 20 20 49  100000) );.    I
e720: 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 28 61 61  NSERT INTO t2(aa
e730: 29 20 56 41 4c 55 45 53 28 20 61 5f 73 74 72 69  ) VALUES( a_stri
e740: 6e 67 28 31 30 30 30 30 30 29 20 29 3b 0a 20 20  ng(100000) );.  
e750: 20 20 56 41 43 55 55 4d 3b 0a 20 20 7d 0a 7d 20    VACUUM;.  }.} 
e760: 7b 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  {}..#-----------
e770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e7a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
e7b0: 20 54 65 73 74 20 61 20 63 6f 75 70 6c 65 20 6f   Test a couple o
e7c0: 66 20 73 70 65 63 69 61 6c 20 63 61 73 65 73 20  f special cases 
e7d0: 74 68 61 74 20 63 6f 6d 65 20 75 70 20 77 68 69  that come up whi
e7e0: 6c 65 20 63 6f 6d 6d 69 74 74 69 6e 67 20 0a 23  le committing .#
e7f0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 3a 0a 23   transactions:.#
e800: 0a 23 20 20 20 70 61 67 65 72 31 2d 32 30 2e 31  .#   pager1-20.1
e810: 2e 2a 3a 20 43 6f 6d 6d 69 74 74 69 6e 67 20 61  .*: Committing a
e820: 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
e830: 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  base transaction
e840: 20 77 68 65 6e 20 74 68 65 20 0a 23 20 20 20 20   when the .#    
e850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61                da
e860: 74 61 62 61 73 65 20 68 61 73 20 6e 6f 74 20 62  tabase has not b
e870: 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 61 74 20  een modified at 
e880: 61 6c 6c 2e 0a 23 0a 23 20 20 20 70 61 67 65 72  all..#.#   pager
e890: 31 2d 32 30 2e 32 2e 2a 3a 20 41 73 20 61 62 6f  1-20.2.*: As abo
e8a0: 76 65 2c 20 62 75 74 20 77 69 74 68 20 61 20 6e  ve, but with a n
e8b0: 6f 72 6d 61 6c 20 64 62 20 69 6e 20 65 78 63 6c  ormal db in excl
e8c0: 75 73 69 76 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f  usive-locking mo
e8d0: 64 65 2e 0a 23 0a 23 20 20 20 70 61 67 65 72 31  de..#.#   pager1
e8e0: 2d 32 30 2e 33 2e 2a 3a 20 43 6f 6d 6d 69 74 74  -20.3.*: Committ
e8f0: 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ing a transactio
e900: 6e 20 69 6e 20 57 41 4c 20 6d 6f 64 65 20 77 68  n in WAL mode wh
e910: 65 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ere the database
e920: 20 68 61 73 0a 23 20 20 20 20 20 20 20 20 20 20   has.#          
e930: 20 20 20 20 20 20 20 20 62 65 65 6e 20 6d 6f 64          been mod
e940: 69 66 69 65 64 2c 20 62 75 74 20 61 6c 6c 20 64  ified, but all d
e950: 69 72 74 79 20 70 61 67 65 73 20 68 61 76 65 20  irty pages have 
e960: 62 65 65 6e 20 66 6c 75 73 68 65 64 20 74 6f 20  been flushed to 
e970: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
e980: 20 20 20 20 64 69 73 6b 20 62 65 66 6f 72 65 20      disk before 
e990: 74 68 65 20 63 6f 6d 6d 69 74 2e 0a 23 0a 64 6f  the commit..#.do
e9a0: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 30 2e  _test pager1-20.
e9b0: 31 2e 31 20 7b 0a 20 20 63 61 74 63 68 20 7b 64  1.1 {.  catch {d
e9c0: 62 20 63 6c 6f 73 65 7d 0a 20 20 73 71 6c 69 74  b close}.  sqlit
e9d0: 65 33 20 64 62 20 3a 6d 65 6d 6f 72 79 3a 0a 20  e3 db :memory:. 
e9e0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43   execsql {.    C
e9f0: 52 45 41 54 45 20 54 41 42 4c 45 20 6f 6e 65 28  REATE TABLE one(
ea00: 74 77 6f 2c 20 74 68 72 65 65 29 3b 0a 20 20 20  two, three);.   
ea10: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 6f 6e 65   INSERT INTO one
ea20: 20 56 41 4c 55 45 53 28 27 61 27 2c 20 27 62 27   VALUES('a', 'b'
ea30: 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74  );.  }.} {}.do_t
ea40: 65 73 74 20 70 61 67 65 72 31 2d 32 30 2e 31 2e  est pager1-20.1.
ea50: 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  2 {.  execsql {.
ea60: 20 20 20 20 42 45 47 49 4e 20 45 58 43 4c 55 53      BEGIN EXCLUS
ea70: 49 56 45 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b  IVE;.    COMMIT;
ea80: 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74 65  .  }.} {}..do_te
ea90: 73 74 20 70 61 67 65 72 31 2d 32 30 2e 32 2e 31  st pager1-20.2.1
eaa0: 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65   {.  faultsim_de
eab0: 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a  lete_and_reopen.
eac0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
ead0: 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d  PRAGMA locking_m
eae0: 6f 64 65 20 3d 20 65 78 63 6c 75 73 69 76 65 3b  ode = exclusive;
eaf0: 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72  .    PRAGMA jour
eb00: 6e 61 6c 5f 6d 6f 64 65 20 3d 20 70 65 72 73 69  nal_mode = persi
eb10: 73 74 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  st;.    CREATE T
eb20: 41 42 4c 45 20 6f 6e 65 28 74 77 6f 2c 20 74 68  ABLE one(two, th
eb30: 72 65 65 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  ree);.    INSERT
eb40: 20 49 4e 54 4f 20 6f 6e 65 20 56 41 4c 55 45 53   INTO one VALUES
eb50: 28 27 61 27 2c 20 27 62 27 29 3b 0a 20 20 7d 0a  ('a', 'b');.  }.
eb60: 7d 20 7b 65 78 63 6c 75 73 69 76 65 20 70 65 72  } {exclusive per
eb70: 73 69 73 74 7d 0a 64 6f 5f 74 65 73 74 20 70 61  sist}.do_test pa
eb80: 67 65 72 31 2d 32 30 2e 32 2e 32 20 7b 0a 20 20  ger1-20.2.2 {.  
eb90: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42 45  execsql {.    BE
eba0: 47 49 4e 20 45 58 43 4c 55 53 49 56 45 3b 0a 20  GIN EXCLUSIVE;. 
ebb0: 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 7d     COMMIT;.  }.}
ebc0: 20 7b 7d 0a 0a 69 66 63 61 70 61 62 6c 65 20 77   {}..ifcapable w
ebd0: 61 6c 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 70  al {.  do_test p
ebe0: 61 67 65 72 31 2d 32 30 2e 33 2e 31 20 7b 0a 20  ager1-20.3.1 {. 
ebf0: 20 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65     faultsim_dele
ec00: 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20  te_and_reopen.  
ec10: 20 20 64 62 20 66 75 6e 63 20 61 5f 73 74 72 69    db func a_stri
ec20: 6e 67 20 61 5f 73 74 72 69 6e 67 0a 20 20 20 20  ng a_string.    
ec30: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20  execsql {.      
ec40: 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a  PRAGMA cache_siz
ec50: 65 20 3d 20 31 30 3b 0a 20 20 20 20 20 20 50 52  e = 10;.      PR
ec60: 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
ec70: 65 20 3d 20 77 61 6c 3b 0a 20 20 20 20 20 20 42  e = wal;.      B
ec80: 45 47 49 4e 3b 0a 20 20 20 20 20 20 20 20 43 52  EGIN;.        CR
ec90: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 78 29  EATE TABLE t1(x)
eca0: 3b 0a 20 20 20 20 20 20 20 20 43 52 45 41 54 45  ;.        CREATE
ecb0: 20 54 41 42 4c 45 20 74 32 28 79 29 3b 0a 20 20   TABLE t2(y);.  
ecc0: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
ecd0: 4f 20 74 31 20 56 41 4c 55 45 53 28 61 5f 73 74  O t1 VALUES(a_st
ece0: 72 69 6e 67 28 38 30 30 29 29 3b 0a 20 20 20 20  ring(800));.    
ecf0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
ed00: 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69  t1 SELECT a_stri
ed10: 6e 67 28 38 30 30 29 20 46 52 4f 4d 20 74 31 3b  ng(800) FROM t1;
ed20: 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20 32 20           /*   2 
ed30: 2a 2f 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52  */.        INSER
ed40: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
ed50: 20 61 5f 73 74 72 69 6e 67 28 38 30 30 29 20 46   a_string(800) F
ed60: 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 20 20  ROM t1;         
ed70: 2f 2a 20 20 20 34 20 2a 2f 0a 20 20 20 20 20 20  /*   4 */.      
ed80: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
ed90: 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67   SELECT a_string
eda0: 28 38 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20  (800) FROM t1;  
edb0: 20 20 20 20 20 20 20 2f 2a 20 20 20 38 20 2a 2f         /*   8 */
edc0: 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20  .        INSERT 
edd0: 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61  INTO t1 SELECT a
ede0: 5f 73 74 72 69 6e 67 28 38 30 30 29 20 46 52 4f  _string(800) FRO
edf0: 4d 20 74 31 3b 20 20 20 20 20 20 20 20 20 2f 2a  M t1;         /*
ee00: 20 20 31 36 20 2a 2f 0a 20 20 20 20 20 20 20 20    16 */.        
ee10: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
ee20: 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 38  ELECT a_string(8
ee30: 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20  00) FROM t1;    
ee40: 20 20 20 20 20 2f 2a 20 20 33 32 20 2a 2f 0a 20       /*  32 */. 
ee50: 20 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 20       COMMIT;.   
ee60: 20 7d 0a 20 20 7d 20 7b 77 61 6c 7d 0a 20 20 64   }.  } {wal}.  d
ee70: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 30  o_test pager1-20
ee80: 2e 33 2e 32 20 7b 0a 20 20 20 20 65 78 65 63 73  .3.2 {.    execs
ee90: 71 6c 20 7b 0a 20 20 20 20 20 20 42 45 47 49 4e  ql {.      BEGIN
eea0: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
eeb0: 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 27 78  NTO t2 VALUES('x
eec0: 78 78 78 27 29 3b 0a 20 20 20 20 7d 0a 20 20 20  xxx');.    }.   
eed0: 20 72 65 63 75 72 73 69 76 65 5f 73 65 6c 65 63   recursive_selec
eee0: 74 20 33 32 20 74 31 0a 20 20 20 20 65 78 65 63  t 32 t1.    exec
eef0: 73 71 6c 20 43 4f 4d 4d 49 54 0a 20 20 7d 20 7b  sql COMMIT.  } {
ef00: 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }.}..#----------
ef10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ef20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ef30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ef40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
ef50: 23 20 54 65 73 74 20 74 68 61 74 20 61 20 57 41  # Test that a WA
ef60: 4c 20 64 61 74 61 62 61 73 65 20 6d 61 79 20 6e  L database may n
ef70: 6f 74 20 62 65 20 6f 70 65 6e 65 64 20 69 66 3a  ot be opened if:
ef80: 0a 23 0a 23 20 20 20 70 61 67 65 72 31 2d 32 31  .#.#   pager1-21
ef90: 2e 31 2e 2a 3a 20 54 68 65 20 56 46 53 20 68 61  .1.*: The VFS ha
efa0: 73 20 61 6e 20 69 56 65 72 73 69 6f 6e 20 6c 65  s an iVersion le
efb0: 73 73 20 74 68 61 6e 20 32 2c 20 6f 72 0a 23 20  ss than 2, or.# 
efc0: 20 20 70 61 67 65 72 31 2d 32 31 2e 32 2e 2a 3a    pager1-21.2.*:
efd0: 20 54 68 65 20 56 46 53 20 64 6f 65 73 20 6e 6f   The VFS does no
efe0: 74 20 70 72 6f 76 69 64 65 20 78 53 68 6d 58 58  t provide xShmXX
eff0: 58 28 29 20 6d 65 74 68 6f 64 73 2e 0a 23 0a 69  X() methods..#.i
f000: 66 63 61 70 61 62 6c 65 20 77 61 6c 20 7b 0a 20  fcapable wal {. 
f010: 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
f020: 32 31 2e 30 20 7b 0a 20 20 20 20 66 61 75 6c 74  21.0 {.    fault
f030: 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72  sim_delete_and_r
f040: 65 6f 70 65 6e 0a 20 20 20 20 65 78 65 63 73 71  eopen.    execsq
f050: 6c 20 7b 0a 20 20 20 20 20 20 50 52 41 47 4d 41  l {.      PRAGMA
f060: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20   journal_mode = 
f070: 57 41 4c 3b 0a 20 20 20 20 20 20 43 52 45 41 54  WAL;.      CREAT
f080: 45 20 54 41 42 4c 45 20 6b 6f 28 63 20 44 45 46  E TABLE ko(c DEF
f090: 41 55 4c 54 20 27 61 62 63 27 2c 20 62 20 44 45  AULT 'abc', b DE
f0a0: 46 41 55 4c 54 20 27 64 65 66 27 29 3b 0a 20 20  FAULT 'def');.  
f0b0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
f0c0: 6b 6f 20 44 45 46 41 55 4c 54 20 56 41 4c 55 45  ko DEFAULT VALUE
f0d0: 53 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 77 61  S;.    }.  } {wa
f0e0: 6c 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67  l}.  do_test pag
f0f0: 65 72 31 2d 32 31 2e 31 20 7b 0a 20 20 20 20 74  er1-21.1 {.    t
f100: 65 73 74 76 66 73 20 74 76 20 2d 6e 6f 73 68 6d  estvfs tv -noshm
f110: 20 31 0a 20 20 20 20 73 71 6c 69 74 65 33 20 64   1.    sqlite3 d
f120: 62 32 20 74 65 73 74 2e 64 62 20 2d 76 66 73 20  b2 test.db -vfs 
f130: 74 76 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20  tv.    catchsql 
f140: 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  { SELECT * FROM 
f150: 6b 6f 20 7d 20 64 62 32 0a 20 20 7d 20 7b 31 20  ko } db2.  } {1 
f160: 7b 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20  {unable to open 
f170: 64 61 74 61 62 61 73 65 20 66 69 6c 65 7d 7d 0a  database file}}.
f180: 20 20 64 62 32 20 63 6c 6f 73 65 0a 20 20 74 76    db2 close.  tv
f190: 20 64 65 6c 65 74 65 0a 20 20 64 6f 5f 74 65 73   delete.  do_tes
f1a0: 74 20 70 61 67 65 72 31 2d 32 31 2e 32 20 7b 0a  t pager1-21.2 {.
f1b0: 20 20 20 20 74 65 73 74 76 66 73 20 74 76 20 2d      testvfs tv -
f1c0: 69 76 65 72 73 69 6f 6e 20 31 0a 20 20 20 20 73  iversion 1.    s
f1d0: 71 6c 69 74 65 33 20 64 62 32 20 74 65 73 74 2e  qlite3 db2 test.
f1e0: 64 62 20 2d 76 66 73 20 74 76 0a 20 20 20 20 63  db -vfs tv.    c
f1f0: 61 74 63 68 73 71 6c 20 7b 20 53 45 4c 45 43 54  atchsql { SELECT
f200: 20 2a 20 46 52 4f 4d 20 6b 6f 20 7d 20 64 62 32   * FROM ko } db2
f210: 0a 20 20 7d 20 7b 31 20 7b 75 6e 61 62 6c 65 20  .  } {1 {unable 
f220: 74 6f 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65  to open database
f230: 20 66 69 6c 65 7d 7d 0a 20 20 64 62 32 20 63 6c   file}}.  db2 cl
f240: 6f 73 65 0a 20 20 74 76 20 64 65 6c 65 74 65 0a  ose.  tv delete.
f250: 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }..#------------
f260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f270: 2d 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 0a 23 20  -------------.# 
f2a0: 54 65 73 74 20 74 68 61 74 20 61 20 22 50 52 41  Test that a "PRA
f2b0: 47 4d 41 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69  GMA wal_checkpoi
f2c0: 6e 74 22 3a 0a 23 0a 23 20 20 20 70 61 67 65 72  nt":.#.#   pager
f2d0: 31 2d 32 32 2e 31 2e 2a 3a 20 69 73 20 61 20 6e  1-22.1.*: is a n
f2e0: 6f 2d 6f 70 20 6f 6e 20 61 20 6e 6f 6e 2d 57 41  o-op on a non-WA
f2f0: 4c 20 64 62 2c 20 61 6e 64 0a 23 20 20 20 70 61  L db, and.#   pa
f300: 67 65 72 31 2d 32 32 2e 32 2e 2a 3a 20 64 6f 65  ger1-22.2.*: doe
f310: 73 20 6e 6f 74 20 63 61 75 73 65 20 78 53 79 6e  s not cause xSyn
f320: 63 20 63 61 6c 6c 73 20 77 69 74 68 20 61 20 73  c calls with a s
f330: 79 6e 63 68 72 6f 6e 6f 75 73 3d 6f 66 66 20 64  ynchronous=off d
f340: 62 2e 0a 23 0a 69 66 63 61 70 61 62 6c 65 20 77  b..#.ifcapable w
f350: 61 6c 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 70  al {.  do_test p
f360: 61 67 65 72 31 2d 32 32 2e 31 2e 31 20 7b 0a 20  ager1-22.1.1 {. 
f370: 20 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65     faultsim_dele
f380: 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20  te_and_reopen.  
f390: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
f3a0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 6b    CREATE TABLE k
f3b0: 6f 28 63 20 44 45 46 41 55 4c 54 20 27 61 62 63  o(c DEFAULT 'abc
f3c0: 27 2c 20 62 20 44 45 46 41 55 4c 54 20 27 64 65  ', b DEFAULT 'de
f3d0: 66 27 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  f');.      INSER
f3e0: 54 20 49 4e 54 4f 20 6b 6f 20 44 45 46 41 55 4c  T INTO ko DEFAUL
f3f0: 54 20 56 41 4c 55 45 53 3b 0a 20 20 20 20 7d 0a  T VALUES;.    }.
f400: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52      execsql { PR
f410: 41 47 4d 41 20 77 61 6c 5f 63 68 65 63 6b 70 6f  AGMA wal_checkpo
f420: 69 6e 74 20 7d 0a 20 20 7d 20 7b 30 20 2d 31 20  int }.  } {0 -1 
f430: 2d 31 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61  -1}.  do_test pa
f440: 67 65 72 31 2d 32 32 2e 32 2e 31 20 7b 0a 20 20  ger1-22.2.1 {.  
f450: 20 20 74 65 73 74 76 66 73 20 74 76 20 2d 64 65    testvfs tv -de
f460: 66 61 75 6c 74 20 31 0a 20 20 20 20 74 76 20 66  fault 1.    tv f
f470: 69 6c 74 65 72 20 78 53 79 6e 63 0a 20 20 20 20  ilter xSync.    
f480: 74 76 20 73 63 72 69 70 74 20 78 53 79 6e 63 43  tv script xSyncC
f490: 62 0a 20 20 20 20 70 72 6f 63 20 78 53 79 6e 63  b.    proc xSync
f4a0: 43 62 20 7b 61 72 67 73 7d 20 7b 69 6e 63 72 20  Cb {args} {incr 
f4b0: 3a 3a 73 79 6e 63 63 6f 75 6e 74 7d 0a 20 20 20  ::synccount}.   
f4c0: 20 73 65 74 20 3a 3a 73 79 6e 63 63 6f 75 6e 74   set ::synccount
f4d0: 20 30 0a 20 20 20 20 73 71 6c 69 74 65 33 20 64   0.    sqlite3 d
f4e0: 62 20 74 65 73 74 2e 64 62 0a 20 20 20 20 65 78  b test.db.    ex
f4f0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 50 52  ecsql {.      PR
f500: 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73  AGMA synchronous
f510: 20 3d 20 6f 66 66 3b 0a 20 20 20 20 20 20 50 52   = off;.      PR
f520: 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
f530: 65 20 3d 20 57 41 4c 3b 0a 20 20 20 20 20 20 49  e = WAL;.      I
f540: 4e 53 45 52 54 20 49 4e 54 4f 20 6b 6f 20 44 45  NSERT INTO ko DE
f550: 46 41 55 4c 54 20 56 41 4c 55 45 53 3b 0a 20 20  FAULT VALUES;.  
f560: 20 20 7d 0a 20 20 20 20 65 78 65 63 73 71 6c 20    }.    execsql 
f570: 7b 20 50 52 41 47 4d 41 20 77 61 6c 5f 63 68 65  { PRAGMA wal_che
f580: 63 6b 70 6f 69 6e 74 20 7d 0a 20 20 20 20 73 65  ckpoint }.    se
f590: 74 20 73 79 6e 63 63 6f 75 6e 74 0a 20 20 7d 20  t synccount.  } 
f5a0: 7b 30 7d 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20  {0}.  db close. 
f5b0: 20 74 76 20 64 65 6c 65 74 65 0a 7d 0a 0a 23 2d   tv delete.}..#-
f5c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f5d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f5e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f5f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f600: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 73  --------.# Tests
f610: 20 66 6f 72 20 63 68 61 6e 67 69 6e 67 20 6a 6f   for changing jo
f620: 75 72 6e 61 6c 20 6d 6f 64 65 2e 0a 23 0a 23 20  urnal mode..#.# 
f630: 20 20 70 61 67 65 72 31 2d 32 33 2e 31 2e 2a 3a    pager1-23.1.*:
f640: 20 54 65 73 74 20 74 68 61 74 20 77 68 65 6e 20   Test that when 
f650: 63 68 61 6e 67 69 6e 67 20 66 72 6f 6d 20 50 45  changing from PE
f660: 52 53 49 53 54 20 74 6f 20 44 45 4c 45 54 45 20  RSIST to DELETE 
f670: 6d 6f 64 65 2c 0a 23 20 20 20 20 20 20 20 20 20  mode,.#         
f680: 20 20 20 20 20 20 20 20 20 74 68 65 20 6a 6f 75           the jou
f690: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 64 65 6c  rnal file is del
f6a0: 65 74 65 64 2e 0a 23 0a 23 20 20 20 70 61 67 65  eted..#.#   page
f6b0: 72 31 2d 32 33 2e 32 2e 2a 3a 20 53 61 6d 65 20  r1-23.2.*: Same 
f6c0: 74 65 73 74 20 61 73 20 61 62 6f 76 65 2c 20 62  test as above, b
f6d0: 75 74 20 77 68 69 6c 65 20 61 20 73 68 61 72 65  ut while a share
f6e0: 64 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 0a 23  d lock is held.#
f6f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f700: 20 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73    on the databas
f710: 65 20 66 69 6c 65 2e 0a 23 0a 23 20 20 20 70 61  e file..#.#   pa
f720: 67 65 72 31 2d 32 33 2e 33 2e 2a 3a 20 53 61 6d  ger1-23.3.*: Sam
f730: 65 20 74 65 73 74 20 61 73 20 61 62 6f 76 65 2c  e test as above,
f740: 20 62 75 74 20 77 68 69 6c 65 20 61 20 72 65 73   but while a res
f750: 65 72 76 65 64 20 6c 6f 63 6b 20 69 73 20 68 65  erved lock is he
f760: 6c 64 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  ld.#            
f770: 20 20 20 20 20 20 6f 6e 20 74 68 65 20 64 61 74        on the dat
f780: 61 62 61 73 65 20 66 69 6c 65 2e 0a 23 0a 23 20  abase file..#.# 
f790: 20 20 70 61 67 65 72 31 2d 32 33 2e 34 2e 2a 3a    pager1-23.4.*:
f7a0: 20 41 6e 64 2c 20 66 6f 72 20 66 75 6e 2c 20 77   And, for fun, w
f7b0: 68 69 6c 65 20 68 6f 6c 64 69 6e 67 20 61 6e 20  hile holding an 
f7c0: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 0a  exclusive lock..
f7d0: 23 0a 23 20 20 20 70 61 67 65 72 31 2d 32 33 2e  #.#   pager1-23.
f7e0: 35 2e 2a 3a 20 54 72 79 20 74 6f 20 73 65 74 20  5.*: Try to set 
f7f0: 76 61 72 69 6f 75 73 20 64 69 66 66 65 72 65 6e  various differen
f800: 74 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 73 20  t journal modes 
f810: 77 69 74 68 20 61 6e 0a 23 20 20 20 20 20 20 20  with an.#       
f820: 20 20 20 20 20 20 20 20 20 20 20 69 6e 2d 6d 65             in-me
f830: 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 28 6f  mory database (o
f840: 6e 6c 79 20 4d 45 4d 4f 52 59 20 61 6e 64 20 4f  nly MEMORY and O
f850: 46 46 20 73 68 6f 75 6c 64 20 77 6f 72 6b 29 2e  FF should work).
f860: 0a 23 0a 23 20 20 20 70 61 67 65 72 31 2d 32 33  .#.#   pager1-23
f870: 2e 36 2e 2a 3a 20 54 72 79 20 74 6f 20 73 65 74  .6.*: Try to set
f880: 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 6e 6f   locking_mode=no
f890: 72 6d 61 6c 20 6f 6e 20 61 6e 20 69 6e 2d 6d 65  rmal on an in-me
f8a0: 6d 6f 72 79 20 64 61 74 61 62 61 73 65 0a 23 20  mory database.# 
f8b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f8c0: 20 28 64 6f 65 73 6e 27 74 20 77 6f 72 6b 20 2d   (doesn't work -
f8d0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
f8e0: 61 73 65 73 20 61 6c 77 61 79 73 20 75 73 65 0a  ases always use.
f8f0: 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  #               
f900: 20 20 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d     locking_mode=
f910: 65 78 63 6c 75 73 69 76 65 29 2e 0a 23 0a 64 6f  exclusive)..#.do
f920: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 33 2e  _test pager1-23.
f930: 31 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d  1.1 {.  faultsim
f940: 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70  _delete_and_reop
f950: 65 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  en.  execsql {. 
f960: 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61     PRAGMA journa
f970: 6c 5f 6d 6f 64 65 20 3d 20 50 45 52 53 49 53 54  l_mode = PERSIST
f980: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
f990: 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 7d  LE t1(a, b);.  }
f9a0: 0a 20 20 66 69 6c 65 20 65 78 69 73 74 73 20 74  .  file exists t
f9b0: 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 7d  est.db-journal.}
f9c0: 20 7b 31 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67   {1}.do_test pag
f9d0: 65 72 31 2d 32 33 2e 31 2e 32 20 7b 0a 20 20 65  er1-23.1.2 {.  e
f9e0: 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20  xecsql { PRAGMA 
f9f0: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44  journal_mode = D
fa00: 45 4c 45 54 45 20 7d 0a 20 20 66 69 6c 65 20 65  ELETE }.  file e
fa10: 78 69 73 74 73 20 74 65 73 74 2e 64 62 2d 6a 6f  xists test.db-jo
fa20: 75 72 6e 61 6c 0a 7d 20 7b 30 7d 0a 0a 64 6f 5f  urnal.} {0}..do_
fa30: 74 65 73 74 20 70 61 67 65 72 31 2d 32 33 2e 32  test pager1-23.2
fa40: 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .1 {.  execsql {
fa50: 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72  .    PRAGMA jour
fa60: 6e 61 6c 5f 6d 6f 64 65 20 3d 20 50 45 52 53 49  nal_mode = PERSI
fa70: 53 54 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ST;.    INSERT I
fa80: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27 43  NTO t1 VALUES('C
fa90: 61 6e 62 65 72 72 61 27 2c 20 27 41 43 54 27 29  anberra', 'ACT')
faa0: 3b 0a 20 20 7d 0a 20 20 64 62 20 65 76 61 6c 20  ;.  }.  db eval 
fab0: 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  { SELECT * FROM 
fac0: 74 31 20 7d 20 7b 0a 20 20 20 20 64 62 20 65 76  t1 } {.    db ev
fad0: 61 6c 20 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72  al { PRAGMA jour
fae0: 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c 45 54  nal_mode = DELET
faf0: 45 20 7d 0a 20 20 7d 0a 20 20 65 78 65 63 73 71  E }.  }.  execsq
fb00: 6c 20 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e  l { PRAGMA journ
fb10: 61 6c 5f 6d 6f 64 65 20 7d 0a 7d 20 7b 64 65 6c  al_mode }.} {del
fb20: 65 74 65 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67  ete}.do_test pag
fb30: 65 72 31 2d 32 33 2e 32 2e 32 20 7b 0a 20 20 66  er1-23.2.2 {.  f
fb40: 69 6c 65 20 65 78 69 73 74 73 20 74 65 73 74 2e  ile exists test.
fb50: 64 62 2d 6a 6f 75 72 6e 61 6c 0a 7d 20 7b 30 7d  db-journal.} {0}
fb60: 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  ..do_test pager1
fb70: 2d 32 33 2e 33 2e 31 20 7b 0a 20 20 65 78 65 63  -23.3.1 {.  exec
fb80: 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41  sql {.    PRAGMA
fb90: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20   journal_mode = 
fba0: 50 45 52 53 49 53 54 3b 0a 20 20 20 20 49 4e 53  PERSIST;.    INS
fbb0: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
fbc0: 45 53 28 27 44 61 72 77 69 6e 27 2c 20 27 4e 54  ES('Darwin', 'NT
fbd0: 27 29 3b 0a 20 20 20 20 42 45 47 49 4e 20 49 4d  ');.    BEGIN IM
fbe0: 4d 45 44 49 41 54 45 3b 0a 20 20 7d 0a 20 20 64  MEDIATE;.  }.  d
fbf0: 62 20 65 76 61 6c 20 7b 20 50 52 41 47 4d 41 20  b eval { PRAGMA 
fc00: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44  journal_mode = D
fc10: 45 4c 45 54 45 20 7d 0a 20 20 65 78 65 63 73 71  ELETE }.  execsq
fc20: 6c 20 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e  l { PRAGMA journ
fc30: 61 6c 5f 6d 6f 64 65 20 7d 0a 7d 20 7b 64 65 6c  al_mode }.} {del
fc40: 65 74 65 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67  ete}.do_test pag
fc50: 65 72 31 2d 32 33 2e 33 2e 32 20 7b 0a 20 20 66  er1-23.3.2 {.  f
fc60: 69 6c 65 20 65 78 69 73 74 73 20 74 65 73 74 2e  ile exists test.
fc70: 64 62 2d 6a 6f 75 72 6e 61 6c 0a 7d 20 7b 30 7d  db-journal.} {0}
fc80: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
fc90: 32 33 2e 33 2e 33 20 7b 0a 20 20 65 78 65 63 73  23.3.3 {.  execs
fca0: 71 6c 20 43 4f 4d 4d 49 54 0a 7d 20 7b 7d 0a 0a  ql COMMIT.} {}..
fcb0: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32  do_test pager1-2
fcc0: 33 2e 34 2e 31 20 7b 0a 20 20 65 78 65 63 73 71  3.4.1 {.  execsq
fcd0: 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a  l {.    PRAGMA j
fce0: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 50 45  ournal_mode = PE
fcf0: 52 53 49 53 54 3b 0a 20 20 20 20 49 4e 53 45 52  RSIST;.    INSER
fd00: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
fd10: 28 27 41 64 65 6c 61 69 64 65 27 2c 20 27 53 41  ('Adelaide', 'SA
fd20: 27 29 3b 0a 20 20 20 20 42 45 47 49 4e 20 45 58  ');.    BEGIN EX
fd30: 43 4c 55 53 49 56 45 3b 0a 20 20 7d 0a 20 20 64  CLUSIVE;.  }.  d
fd40: 62 20 65 76 61 6c 20 7b 20 50 52 41 47 4d 41 20  b eval { PRAGMA 
fd50: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44  journal_mode = D
fd60: 45 4c 45 54 45 20 7d 0a 20 20 65 78 65 63 73 71  ELETE }.  execsq
fd70: 6c 20 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e  l { PRAGMA journ
fd80: 61 6c 5f 6d 6f 64 65 20 7d 0a 7d 20 7b 64 65 6c  al_mode }.} {del
fd90: 65 74 65 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67  ete}.do_test pag
fda0: 65 72 31 2d 32 33 2e 34 2e 32 20 7b 0a 20 20 66  er1-23.4.2 {.  f
fdb0: 69 6c 65 20 65 78 69 73 74 73 20 74 65 73 74 2e  ile exists test.
fdc0: 64 62 2d 6a 6f 75 72 6e 61 6c 0a 7d 20 7b 30 7d  db-journal.} {0}
fdd0: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
fde0: 32 33 2e 34 2e 33 20 7b 0a 20 20 65 78 65 63 73  23.4.3 {.  execs
fdf0: 71 6c 20 43 4f 4d 4d 49 54 0a 7d 20 7b 7d 0a 0a  ql COMMIT.} {}..
fe00: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32  do_test pager1-2
fe10: 33 2e 35 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73  3.5.1 {.  faults
fe20: 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65  im_delete_and_re
fe30: 6f 70 65 6e 0a 20 20 73 71 6c 69 74 65 33 20 64  open.  sqlite3 d
fe40: 62 20 3a 6d 65 6d 6f 72 79 3a 0a 7d 20 7b 7d 0a  b :memory:.} {}.
fe50: 66 6f 72 65 61 63 68 20 7b 74 6e 20 6d 6f 64 65  foreach {tn mode
fe60: 20 70 6f 73 73 69 62 6c 65 7d 20 7b 0a 20 20 32   possible} {.  2
fe70: 20 20 6f 66 66 20 20 20 20 20 20 31 0a 20 20 33    off      1.  3
fe80: 20 20 6d 65 6d 6f 72 79 20 20 20 31 0a 20 20 34    memory   1.  4
fe90: 20 20 70 65 72 73 69 73 74 20 20 30 0a 20 20 35    persist  0.  5
fea0: 20 20 64 65 6c 65 74 65 20 20 20 30 0a 20 20 36    delete   0.  6
feb0: 20 20 77 61 6c 20 20 20 20 20 20 30 0a 20 20 37    wal      0.  7
fec0: 20 20 74 72 75 6e 63 61 74 65 20 30 0a 7d 20 7b    truncate 0.} {
fed0: 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72  .  do_test pager
fee0: 31 2d 32 33 2e 35 2e 24 74 6e 2e 31 20 7b 0a 20  1-23.5.$tn.1 {. 
fef0: 20 20 20 65 78 65 63 73 71 6c 20 22 50 52 41 47     execsql "PRAG
ff00: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  MA journal_mode 
ff10: 3d 20 6f 66 66 22 0a 20 20 20 20 65 78 65 63 73  = off".    execs
ff20: 71 6c 20 22 50 52 41 47 4d 41 20 6a 6f 75 72 6e  ql "PRAGMA journ
ff30: 61 6c 5f 6d 6f 64 65 20 3d 20 24 6d 6f 64 65 22  al_mode = $mode"
ff40: 0a 20 20 7d 20 5b 69 66 20 24 70 6f 73 73 69 62  .  } [if $possib
ff50: 6c 65 20 7b 6c 69 73 74 20 24 6d 6f 64 65 7d 20  le {list $mode} 
ff60: 7b 6c 69 73 74 20 6f 66 66 7d 5d 0a 20 20 64 6f  {list off}].  do
ff70: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 33 2e  _test pager1-23.
ff80: 35 2e 24 74 6e 2e 32 20 7b 0a 20 20 20 20 65 78  5.$tn.2 {.    ex
ff90: 65 63 73 71 6c 20 22 50 52 41 47 4d 41 20 6a 6f  ecsql "PRAGMA jo
ffa0: 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 6d 65 6d  urnal_mode = mem
ffb0: 6f 72 79 22 0a 20 20 20 20 65 78 65 63 73 71 6c  ory".    execsql
ffc0: 20 22 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c   "PRAGMA journal
ffd0: 5f 6d 6f 64 65 20 3d 20 24 6d 6f 64 65 22 0a 20  _mode = $mode". 
ffe0: 20 7d 20 5b 69 66 20 24 70 6f 73 73 69 62 6c 65   } [if $possible
fff0: 20 7b 6c 69 73 74 20 24 6d 6f 64 65 7d 20 7b 6c   {list $mode} {l
10000 69 73 74 20 6d 65 6d 6f 72 79 7d 5d 0a 7d 0a 64  ist memory}].}.d
10010 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 33  o_test pager1-23
10020 2e 36 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c  .6.1 {.  execsql
10030 20 7b 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67   {PRAGMA locking
10040 5f 6d 6f 64 65 20 3d 20 6e 6f 72 6d 61 6c 7d 0a  _mode = normal}.
10050 7d 20 7b 65 78 63 6c 75 73 69 76 65 7d 0a 64 6f  } {exclusive}.do
10060 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 33 2e  _test pager1-23.
10070 36 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  6.2 {.  execsql 
10080 7b 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f  {PRAGMA locking_
10090 6d 6f 64 65 20 3d 20 65 78 63 6c 75 73 69 76 65  mode = exclusive
100a0 7d 0a 7d 20 7b 65 78 63 6c 75 73 69 76 65 7d 0a  }.} {exclusive}.
100b0 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32  do_test pager1-2
100c0 33 2e 36 2e 33 20 7b 0a 20 20 65 78 65 63 73 71  3.6.3 {.  execsq
100d0 6c 20 7b 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e  l {PRAGMA lockin
100e0 67 5f 6d 6f 64 65 7d 0a 7d 20 7b 65 78 63 6c 75  g_mode}.} {exclu
100f0 73 69 76 65 7d 0a 64 6f 5f 74 65 73 74 20 70 61  sive}.do_test pa
10100 67 65 72 31 2d 32 33 2e 36 2e 34 20 7b 0a 20 20  ger1-23.6.4 {.  
10110 65 78 65 63 73 71 6c 20 7b 50 52 41 47 4d 41 20  execsql {PRAGMA 
10120 6d 61 69 6e 2e 6c 6f 63 6b 69 6e 67 5f 6d 6f 64  main.locking_mod
10130 65 7d 0a 7d 20 7b 65 78 63 6c 75 73 69 76 65 7d  e}.} {exclusive}
10140 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
10150 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10160 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10170 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10180 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 0a 64  ------------.#.d
10190 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 34  o_test pager1-24
101a0 2e 31 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73 69  .1.1 {.  faultsi
101b0 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f  m_delete_and_reo
101c0 70 65 6e 0a 20 20 64 62 20 66 75 6e 63 20 61 5f  pen.  db func a_
101d0 73 74 72 69 6e 67 20 61 5f 73 74 72 69 6e 67 0a  string a_string.
101e0 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
101f0 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a  PRAGMA cache_siz
10200 65 20 3d 20 31 30 3b 0a 20 20 20 20 50 52 41 47  e = 10;.    PRAG
10210 4d 41 20 61 75 74 6f 5f 76 61 63 75 75 6d 20 3d  MA auto_vacuum =
10220 20 46 55 4c 4c 3b 0a 20 20 20 20 43 52 45 41 54   FULL;.    CREAT
10230 45 20 54 41 42 4c 45 20 78 31 28 78 2c 20 79 2c  E TABLE x1(x, y,
10240 20 7a 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 28   z, PRIMARY KEY(
10250 79 2c 20 7a 29 29 3b 0a 20 20 20 20 43 52 45 41  y, z));.    CREA
10260 54 45 20 54 41 42 4c 45 20 78 32 28 78 2c 20 79  TE TABLE x2(x, y
10270 2c 20 7a 2c 20 50 52 49 4d 41 52 59 20 4b 45 59  , z, PRIMARY KEY
10280 28 79 2c 20 7a 29 29 3b 0a 20 20 20 20 49 4e 53  (y, z));.    INS
10290 45 52 54 20 49 4e 54 4f 20 78 32 20 56 41 4c 55  ERT INTO x2 VALU
102a0 45 53 28 61 5f 73 74 72 69 6e 67 28 34 30 30 29  ES(a_string(400)
102b0 2c 20 61 5f 73 74 72 69 6e 67 28 35 30 30 29 2c  , a_string(500),
102c0 20 61 5f 73 74 72 69 6e 67 28 36 30 30 29 29 3b   a_string(600));
102d0 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
102e0 20 78 32 20 53 45 4c 45 43 54 20 61 5f 73 74 72   x2 SELECT a_str
102f0 69 6e 67 28 36 30 30 29 2c 20 61 5f 73 74 72 69  ing(600), a_stri
10300 6e 67 28 34 30 30 29 2c 20 61 5f 73 74 72 69 6e  ng(400), a_strin
10310 67 28 35 30 30 29 20 46 52 4f 4d 20 78 32 3b 0a  g(500) FROM x2;.
10320 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
10330 78 32 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69  x2 SELECT a_stri
10340 6e 67 28 35 30 30 29 2c 20 61 5f 73 74 72 69 6e  ng(500), a_strin
10350 67 28 36 30 30 29 2c 20 61 5f 73 74 72 69 6e 67  g(600), a_string
10360 28 34 30 30 29 20 46 52 4f 4d 20 78 32 3b 0a 20  (400) FROM x2;. 
10370 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78     INSERT INTO x
10380 32 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e  2 SELECT a_strin
10390 67 28 34 30 30 29 2c 20 61 5f 73 74 72 69 6e 67  g(400), a_string
103a0 28 35 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28  (500), a_string(
103b0 36 30 30 29 20 46 52 4f 4d 20 78 32 3b 0a 20 20  600) FROM x2;.  
103c0 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 32    INSERT INTO x2
103d0 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67   SELECT a_string
103e0 28 36 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28  (600), a_string(
103f0 34 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 35  400), a_string(5
10400 30 30 29 20 46 52 4f 4d 20 78 32 3b 0a 20 20 20  00) FROM x2;.   
10410 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 32 20   INSERT INTO x2 
10420 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28  SELECT a_string(
10430 35 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 36  500), a_string(6
10440 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 34 30  00), a_string(40
10450 30 29 20 46 52 4f 4d 20 78 32 3b 0a 20 20 20 20  0) FROM x2;.    
10460 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 32 20 53  INSERT INTO x2 S
10470 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 34  ELECT a_string(4
10480 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 35 30  00), a_string(50
10490 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 36 30 30  0), a_string(600
104a0 29 20 46 52 4f 4d 20 78 32 3b 0a 20 20 20 20 49  ) FROM x2;.    I
104b0 4e 53 45 52 54 20 49 4e 54 4f 20 78 31 20 53 45  NSERT INTO x1 SE
104c0 4c 45 43 54 20 2a 20 46 52 4f 4d 20 78 32 3b 0a  LECT * FROM x2;.
104d0 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74    }.} {}.do_test
104e0 20 70 61 67 65 72 31 2d 32 34 2e 31 2e 32 20 7b   pager1-24.1.2 {
104f0 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
10500 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 44 45   BEGIN;.      DE
10510 4c 45 54 45 20 46 52 4f 4d 20 78 31 20 57 48 45  LETE FROM x1 WHE
10520 52 45 20 72 6f 77 69 64 3c 33 32 3b 0a 20 20 7d  RE rowid<32;.  }
10530 0a 20 20 72 65 63 75 72 73 69 76 65 5f 73 65 6c  .  recursive_sel
10540 65 63 74 20 36 34 20 78 32 0a 7d 20 7b 7d 0a 64  ect 64 x2.} {}.d
10550 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 34  o_test pager1-24
10560 2e 31 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c  .1.3 {.  execsql
10570 20 7b 20 0a 20 20 20 20 20 20 55 50 44 41 54 45   { .      UPDATE
10580 20 78 31 20 53 45 54 20 7a 20 3d 20 61 5f 73 74   x1 SET z = a_st
10590 72 69 6e 67 28 33 30 30 29 20 57 48 45 52 45 20  ring(300) WHERE 
105a0 72 6f 77 69 64 3e 34 30 3b 0a 20 20 20 20 43 4f  rowid>40;.    CO
105b0 4d 4d 49 54 3b 0a 20 20 20 20 50 52 41 47 4d 41  MMIT;.    PRAGMA
105c0 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b   integrity_check
105d0 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75  ;.    SELECT cou
105e0 6e 74 28 2a 29 20 46 52 4f 4d 20 78 31 3b 0a 20  nt(*) FROM x1;. 
105f0 20 7d 0a 7d 20 7b 6f 6b 20 33 33 7d 0a 0a 64 6f   }.} {ok 33}..do
10600 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 34 2e  _test pager1-24.
10610 31 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  1.4 {.  execsql 
10620 7b 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f  {.    DELETE FRO
10630 4d 20 78 31 3b 0a 20 20 20 20 49 4e 53 45 52 54  M x1;.    INSERT
10640 20 49 4e 54 4f 20 78 31 20 53 45 4c 45 43 54 20   INTO x1 SELECT 
10650 2a 20 46 52 4f 4d 20 78 32 3b 0a 20 20 20 20 42  * FROM x2;.    B
10660 45 47 49 4e 3b 0a 20 20 20 20 20 20 44 45 4c 45  EGIN;.      DELE
10670 54 45 20 46 52 4f 4d 20 78 31 20 57 48 45 52 45  TE FROM x1 WHERE
10680 20 72 6f 77 69 64 3c 33 32 3b 0a 20 20 20 20 20   rowid<32;.     
10690 20 55 50 44 41 54 45 20 78 31 20 53 45 54 20 7a   UPDATE x1 SET z
106a0 20 3d 20 61 5f 73 74 72 69 6e 67 28 32 39 39 29   = a_string(299)
106b0 20 57 48 45 52 45 20 72 6f 77 69 64 3e 34 30 3b   WHERE rowid>40;
106c0 0a 20 20 7d 0a 20 20 72 65 63 75 72 73 69 76 65  .  }.  recursive
106d0 5f 73 65 6c 65 63 74 20 36 34 20 78 32 20 7b 64  _select 64 x2 {d
106e0 62 20 65 76 61 6c 20 43 4f 4d 4d 49 54 7d 0a 20  b eval COMMIT}. 
106f0 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50   execsql {.    P
10700 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f  RAGMA integrity_
10710 63 68 65 63 6b 3b 0a 20 20 20 20 53 45 4c 45 43  check;.    SELEC
10720 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
10730 78 31 3b 0a 20 20 7d 0a 7d 20 7b 6f 6b 20 33 33  x1;.  }.} {ok 33
10740 7d 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  }..do_test pager
10750 31 2d 32 34 2e 31 2e 35 20 7b 0a 20 20 65 78 65  1-24.1.5 {.  exe
10760 63 73 71 6c 20 7b 0a 20 20 20 20 44 45 4c 45 54  csql {.    DELET
10770 45 20 46 52 4f 4d 20 78 31 3b 0a 20 20 20 20 49  E FROM x1;.    I
10780 4e 53 45 52 54 20 49 4e 54 4f 20 78 31 20 53 45  NSERT INTO x1 SE
10790 4c 45 43 54 20 2a 20 46 52 4f 4d 20 78 32 3b 0a  LECT * FROM x2;.
107a0 20 20 7d 0a 20 20 72 65 63 75 72 73 69 76 65 5f    }.  recursive_
107b0 73 65 6c 65 63 74 20 36 34 20 78 32 20 7b 20 64  select 64 x2 { d
107c0 62 20 65 76 61 6c 20 7b 43 52 45 41 54 45 20 54  b eval {CREATE T
107d0 41 42 4c 45 20 78 33 28 78 2c 20 79 2c 20 7a 29  ABLE x3(x, y, z)
107e0 7d 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  } }.  execsql { 
107f0 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 78 33  SELECT * FROM x3
10800 20 7d 0a 7d 20 7b 7d 0a 0a 23 2d 2d 2d 2d 2d 2d   }.} {}..#------
10810 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10820 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10830 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10840 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10850 2d 2d 2d 0a 23 0a 64 6f 5f 74 65 73 74 20 70 61  ---.#.do_test pa
10860 67 65 72 31 2d 32 35 2d 31 20 7b 0a 20 20 66 61  ger1-25-1 {.  fa
10870 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e  ultsim_delete_an
10880 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65 63 73  d_reopen.  execs
10890 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a  ql {.    BEGIN;.
108a0 20 20 20 20 20 20 53 41 56 45 50 4f 49 4e 54 20        SAVEPOINT 
108b0 61 62 63 3b 0a 20 20 20 20 20 20 20 20 43 52 45  abc;.        CRE
108c0 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20  ATE TABLE t1(a, 
108d0 62 29 3b 0a 20 20 20 20 20 20 52 4f 4c 4c 42 41  b);.      ROLLBA
108e0 43 4b 20 54 4f 20 61 62 63 3b 0a 20 20 20 20 43  CK TO abc;.    C
108f0 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 20 20 64 62 20  OMMIT;.  }.  db 
10900 63 6c 6f 73 65 0a 7d 20 7b 7d 0a 62 72 65 61 6b  close.} {}.break
10910 70 6f 69 6e 74 0a 64 6f 5f 74 65 73 74 20 70 61  point.do_test pa
10920 67 65 72 31 2d 32 35 2d 32 20 7b 0a 20 20 66 61  ger1-25-2 {.  fa
10930 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e  ultsim_delete_an
10940 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65 63 73  d_reopen.  execs
10950 71 6c 20 7b 0a 20 20 20 20 53 41 56 45 50 4f 49  ql {.    SAVEPOI
10960 4e 54 20 61 62 63 3b 0a 20 20 20 20 20 20 43 52  NT abc;.      CR
10970 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c  EATE TABLE t1(a,
10980 20 62 29 3b 0a 20 20 20 20 52 4f 4c 4c 42 41 43   b);.    ROLLBAC
10990 4b 20 54 4f 20 61 62 63 3b 0a 20 20 20 20 43 4f  K TO abc;.    CO
109a0 4d 4d 49 54 3b 0a 20 20 7d 0a 20 20 64 62 20 63  MMIT;.  }.  db c
109b0 6c 6f 73 65 0a 7d 20 7b 7d 0a 0a 23 2d 2d 2d 2d  lose.} {}..#----
109c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
109d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
109e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
109f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10a00 2d 2d 2d 2d 2d 0a 23 20 53 65 63 74 6f 72 2d 73  -----.# Sector-s
10a10 69 7a 65 20 74 65 73 74 73 2e 0a 23 0a 64 6f 5f  ize tests..#.do_
10a20 74 65 73 74 20 70 61 67 65 72 31 2d 32 36 2e 31  test pager1-26.1
10a30 20 7b 0a 20 20 74 65 73 74 76 66 73 20 74 76 20   {.  testvfs tv 
10a40 2d 64 65 66 61 75 6c 74 20 31 0a 20 20 74 76 20  -default 1.  tv 
10a50 73 65 63 74 6f 72 73 69 7a 65 20 34 30 39 36 0a  sectorsize 4096.
10a60 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74    faultsim_delet
10a70 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 64  e_and_reopen.  d
10a80 62 20 66 75 6e 63 20 61 5f 73 74 72 69 6e 67 20  b func a_string 
10a90 61 5f 73 74 72 69 6e 67 0a 20 20 65 78 65 63 73  a_string.  execs
10aa0 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20  ql {.    PRAGMA 
10ab0 70 61 67 65 5f 73 69 7a 65 20 3d 20 35 31 32 3b  page_size = 512;
10ac0 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
10ad0 45 20 74 62 6c 28 61 20 50 52 49 4d 41 52 59 20  E tbl(a PRIMARY 
10ae0 4b 45 59 2c 20 62 20 55 4e 49 51 55 45 29 3b 0a  KEY, b UNIQUE);.
10af0 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20      BEGIN;.     
10b00 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 62 6c   INSERT INTO tbl
10b10 20 56 41 4c 55 45 53 28 61 5f 73 74 72 69 6e 67   VALUES(a_string
10b20 28 32 35 29 2c 20 61 5f 73 74 72 69 6e 67 28 36  (25), a_string(6
10b30 30 30 29 29 3b 0a 20 20 20 20 20 20 49 4e 53 45  00));.      INSE
10b40 52 54 20 49 4e 54 4f 20 74 62 6c 20 53 45 4c 45  RT INTO tbl SELE
10b50 43 54 20 61 5f 73 74 72 69 6e 67 28 32 35 29 2c  CT a_string(25),
10b60 20 61 5f 73 74 72 69 6e 67 28 36 30 30 29 20 46   a_string(600) F
10b70 52 4f 4d 20 74 62 6c 3b 0a 20 20 20 20 20 20 49  ROM tbl;.      I
10b80 4e 53 45 52 54 20 49 4e 54 4f 20 74 62 6c 20 53  NSERT INTO tbl S
10b90 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 32  ELECT a_string(2
10ba0 35 29 2c 20 61 5f 73 74 72 69 6e 67 28 36 30 30  5), a_string(600
10bb0 29 20 46 52 4f 4d 20 74 62 6c 3b 0a 20 20 20 20  ) FROM tbl;.    
10bc0 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 62    INSERT INTO tb
10bd0 6c 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e  l SELECT a_strin
10be0 67 28 32 35 29 2c 20 61 5f 73 74 72 69 6e 67 28  g(25), a_string(
10bf0 36 30 30 29 20 46 52 4f 4d 20 74 62 6c 3b 0a 20  600) FROM tbl;. 
10c00 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
10c10 20 74 62 6c 20 53 45 4c 45 43 54 20 61 5f 73 74   tbl SELECT a_st
10c20 72 69 6e 67 28 32 35 29 2c 20 61 5f 73 74 72 69  ring(25), a_stri
10c30 6e 67 28 36 30 30 29 20 46 52 4f 4d 20 74 62 6c  ng(600) FROM tbl
10c40 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
10c50 4e 54 4f 20 74 62 6c 20 53 45 4c 45 43 54 20 61  NTO tbl SELECT a
10c60 5f 73 74 72 69 6e 67 28 32 35 29 2c 20 61 5f 73  _string(25), a_s
10c70 74 72 69 6e 67 28 36 30 30 29 20 46 52 4f 4d 20  tring(600) FROM 
10c80 74 62 6c 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  tbl;.      INSER
10c90 54 20 49 4e 54 4f 20 74 62 6c 20 53 45 4c 45 43  T INTO tbl SELEC
10ca0 54 20 61 5f 73 74 72 69 6e 67 28 32 35 29 2c 20  T a_string(25), 
10cb0 61 5f 73 74 72 69 6e 67 28 36 30 30 29 20 46 52  a_string(600) FR
10cc0 4f 4d 20 74 62 6c 3b 0a 20 20 20 20 20 20 49 4e  OM tbl;.      IN
10cd0 53 45 52 54 20 49 4e 54 4f 20 74 62 6c 20 53 45  SERT INTO tbl SE
10ce0 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 32 35  LECT a_string(25
10cf0 29 2c 20 61 5f 73 74 72 69 6e 67 28 36 30 30 29  ), a_string(600)
10d00 20 46 52 4f 4d 20 74 62 6c 3b 0a 20 20 20 20 43   FROM tbl;.    C
10d10 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a  OMMIT;.  }.} {}.
10d20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
10d30 70 61 67 65 72 31 2d 32 36 2e 31 20 7b 0a 20 20  pager1-26.1 {.  
10d40 55 50 44 41 54 45 20 74 62 6c 20 53 45 54 20 62  UPDATE tbl SET b
10d50 20 3d 20 61 5f 73 74 72 69 6e 67 28 35 35 30 29   = a_string(550)
10d60 3b 0a 7d 20 7b 7d 0a 64 62 20 63 6c 6f 73 65 0a  ;.} {}.db close.
10d70 74 76 20 64 65 6c 65 74 65 0a 0a 23 2d 2d 2d 2d  tv delete..#----
10d80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10d90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10da0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10db0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10dc0 2d 2d 2d 2d 2d 0a 23 0a 64 6f 5f 74 65 73 74 20  -----.#.do_test 
10dd0 70 61 67 65 72 31 2e 32 37 2e 31 20 7b 0a 20 20  pager1.27.1 {.  
10de0 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f  faultsim_delete_
10df0 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 73 71 6c  and_reopen.  sql
10e00 69 74 65 33 5f 70 61 67 65 72 5f 72 65 66 63 6f  ite3_pager_refco
10e10 75 6e 74 73 20 64 62 0a 20 20 65 78 65 63 73 71  unts db.  execsq
10e20 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20  l {.    BEGIN;. 
10e30 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c       CREATE TABL
10e40 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 7d 0a  E t1(a, b);.  }.
10e50 20 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f    sqlite3_pager_
10e60 72 65 66 63 6f 75 6e 74 73 20 64 62 0a 20 20 65  refcounts db.  e
10e70 78 65 63 73 71 6c 20 43 4f 4d 4d 49 54 0a 7d 20  xecsql COMMIT.} 
10e80 7b 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  {}..#-----------
10e90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10ea0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10eb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10ec0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
10ed0 20 54 65 73 74 20 74 68 61 74 20 61 74 74 65 6d   Test that attem
10ee0 70 74 69 6e 67 20 74 6f 20 6f 70 65 6e 20 61 20  pting to open a 
10ef0 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
10f00 6e 20 77 69 74 68 20 0a 23 20 6c 6f 63 6b 69 6e  n with .# lockin
10f10 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65  g_mode=exclusive
10f20 20 69 6e 20 57 41 4c 20 6d 6f 64 65 20 66 61 69   in WAL mode fai
10f30 6c 73 20 69 66 20 74 68 65 72 65 20 61 72 65 20  ls if there are 
10f40 6f 74 68 65 72 20 63 6c 69 65 6e 74 73 20 6f 6e  other clients on
10f50 20 0a 23 20 74 68 65 20 73 61 6d 65 20 64 61 74   .# the same dat
10f60 61 62 61 73 65 2e 0a 23 0a 63 61 74 63 68 20 7b  abase..#.catch {
10f70 20 64 62 20 63 6c 6f 73 65 20 7d 0a 69 66 63 61   db close }.ifca
10f80 70 61 62 6c 65 20 77 61 6c 20 7b 0a 20 20 64 6f  pable wal {.  do
10f90 5f 6d 75 6c 74 69 63 6c 69 65 6e 74 5f 74 65 73  _multiclient_tes
10fa0 74 20 74 6e 20 7b 0a 20 20 20 20 64 6f 5f 74 65  t tn {.    do_te
10fb0 73 74 20 70 61 67 65 72 31 2d 32 38 2e 24 74 6e  st pager1-28.$tn
10fc0 2e 31 20 7b 0a 20 20 20 20 20 20 73 71 6c 31 20  .1 {.      sql1 
10fd0 7b 20 0a 20 20 20 20 20 20 20 20 50 52 41 47 4d  { .        PRAGM
10fe0 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d  A journal_mode =
10ff0 20 57 41 4c 3b 0a 20 20 20 20 20 20 20 20 43 52   WAL;.        CR
11000 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c  EATE TABLE t1(a,
11010 20 62 29 3b 0a 20 20 20 20 20 20 20 20 49 4e 53   b);.        INS
11020 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
11030 45 53 28 27 61 27 2c 20 27 62 27 29 3b 0a 20 20  ES('a', 'b');.  
11040 20 20 20 20 7d 0a 20 20 20 20 7d 20 7b 77 61 6c      }.    } {wal
11050 7d 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 70 61  }.    do_test pa
11060 67 65 72 31 2d 32 38 2e 24 74 6e 2e 32 20 7b 20  ger1-28.$tn.2 { 
11070 73 71 6c 32 20 7b 20 53 45 4c 45 43 54 20 2a 20  sql2 { SELECT * 
11080 46 52 4f 4d 20 74 31 20 7d 20 7d 20 7b 61 20 62  FROM t1 } } {a b
11090 7d 0a 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 70  }..    do_test p
110a0 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e 33 20 7b  ager1-28.$tn.3 {
110b0 20 73 71 6c 31 20 7b 20 50 52 41 47 4d 41 20 6c   sql1 { PRAGMA l
110c0 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c  ocking_mode=excl
110d0 75 73 69 76 65 20 7d 20 7d 20 7b 65 78 63 6c 75  usive } } {exclu
110e0 73 69 76 65 7d 0a 20 20 20 20 64 6f 5f 74 65 73  sive}.    do_tes
110f0 74 20 70 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e  t pager1-28.$tn.
11100 34 20 7b 20 0a 20 20 20 20 20 20 63 73 71 6c 31  4 { .      csql1
11110 20 7b 20 42 45 47 49 4e 3b 20 49 4e 53 45 52 54   { BEGIN; INSERT
11120 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
11130 27 63 27 2c 20 27 64 27 29 3b 20 7d 0a 20 20 20  'c', 'd'); }.   
11140 20 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20   } {1 {database 
11150 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 20 20 20 20  is locked}}.    
11160 63 6f 64 65 32 20 7b 20 64 62 32 20 63 6c 6f 73  code2 { db2 clos
11170 65 20 3b 20 73 71 6c 69 74 65 33 20 64 62 32 20  e ; sqlite3 db2 
11180 74 65 73 74 2e 64 62 20 7d 0a 20 20 20 20 64 6f  test.db }.    do
11190 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 38 2e  _test pager1-28.
111a0 24 74 6e 2e 34 20 7b 20 0a 20 20 20 20 20 20 73  $tn.4 { .      s
111b0 71 6c 31 20 7b 20 49 4e 53 45 52 54 20 49 4e 54  ql1 { INSERT INT
111c0 4f 20 74 31 20 56 41 4c 55 45 53 28 27 63 27 2c  O t1 VALUES('c',
111d0 20 27 64 27 29 3b 20 43 4f 4d 4d 49 54 20 7d 0a   'd'); COMMIT }.
111e0 20 20 20 20 7d 20 7b 7d 0a 20 20 7d 0a 7d 0a 0a      } {}.  }.}..
111f0 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
11200 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11210 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11220 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11230 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 4e 6f 72  ----------.# Nor
11240 6d 61 6c 6c 79 2c 20 77 68 65 6e 20 63 68 61 6e  mally, when chan
11250 67 69 6e 67 20 66 72 6f 6d 20 6a 6f 75 72 6e 61  ging from journa
11260 6c 5f 6d 6f 64 65 3d 50 45 52 53 49 53 54 20 74  l_mode=PERSIST t
11270 6f 20 44 45 4c 45 54 45 20 74 68 65 20 70 61 67  o DELETE the pag
11280 65 72 0a 23 20 61 74 74 65 6d 70 74 73 20 74 6f  er.# attempts to
11290 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72   delete the jour
112a0 6e 61 6c 20 66 69 6c 65 2e 20 48 6f 77 65 76 65  nal file. Howeve
112b0 72 2c 20 69 66 20 69 74 20 63 61 6e 6e 6f 74 20  r, if it cannot 
112c0 6f 62 74 61 69 6e 20 61 0a 23 20 52 45 53 45 52  obtain a.# RESER
112d0 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  VED lock on the 
112e0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74  database file, t
112f0 68 69 73 20 73 74 65 70 20 69 73 20 73 6b 69 70  his step is skip
11300 70 65 64 2e 0a 23 0a 64 6f 5f 6d 75 6c 74 69 63  ped..#.do_multic
11310 6c 69 65 6e 74 5f 74 65 73 74 20 74 6e 20 7b 0a  lient_test tn {.
11320 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
11330 2d 32 38 2e 24 74 6e 2e 31 20 7b 0a 20 20 20 20  -28.$tn.1 {.    
11340 73 71 6c 31 20 7b 20 0a 20 20 20 20 20 20 50 52  sql1 { .      PR
11350 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
11360 65 20 3d 20 50 45 52 53 49 53 54 3b 0a 20 20 20  e = PERSIST;.   
11370 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
11380 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 20 20  t1(a, b);.      
11390 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
113a0 41 4c 55 45 53 28 27 61 27 2c 20 27 62 27 29 3b  ALUES('a', 'b');
113b0 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 70 65 72 73  .    }.  } {pers
113c0 69 73 74 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70  ist}.  do_test p
113d0 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e 32 20 7b  ager1-28.$tn.2 {
113e0 20 66 69 6c 65 20 65 78 69 73 74 73 20 74 65 73   file exists tes
113f0 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 7d 20 31  t.db-journal } 1
11400 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72  .  do_test pager
11410 31 2d 32 38 2e 24 74 6e 2e 33 20 7b 20 73 71 6c  1-28.$tn.3 { sql
11420 31 20 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e  1 { PRAGMA journ
11430 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c 45 54 45  al_mode = DELETE
11440 20 7d 20 7d 20 64 65 6c 65 74 65 0a 20 20 64 6f   } } delete.  do
11450 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 38 2e  _test pager1-28.
11460 24 74 6e 2e 34 20 7b 20 66 69 6c 65 20 65 78 69  $tn.4 { file exi
11470 73 74 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72  sts test.db-jour
11480 6e 61 6c 20 7d 20 30 0a 0a 20 20 64 6f 5f 74 65  nal } 0..  do_te
11490 73 74 20 70 61 67 65 72 31 2d 32 38 2e 24 74 6e  st pager1-28.$tn
114a0 2e 35 20 7b 0a 20 20 20 20 73 71 6c 31 20 7b 20  .5 {.    sql1 { 
114b0 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 6a 6f  .      PRAGMA jo
114c0 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 50 45 52  urnal_mode = PER
114d0 53 49 53 54 3b 0a 20 20 20 20 20 20 49 4e 53 45  SIST;.      INSE
114e0 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
114f0 53 28 27 63 27 2c 20 27 64 27 29 3b 0a 20 20 20  S('c', 'd');.   
11500 20 7d 0a 20 20 7d 20 7b 70 65 72 73 69 73 74 7d   }.  } {persist}
11510 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72  .  do_test pager
11520 31 2d 32 38 2e 24 74 6e 2e 36 20 7b 20 66 69 6c  1-28.$tn.6 { fil
11530 65 20 65 78 69 73 74 73 20 74 65 73 74 2e 64 62  e exists test.db
11540 2d 6a 6f 75 72 6e 61 6c 20 7d 20 31 0a 20 20 64  -journal } 1.  d
11550 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 38  o_test pager1-28
11560 2e 24 74 6e 2e 37 20 7b 0a 20 20 20 20 73 71 6c  .$tn.7 {.    sql
11570 32 20 7b 20 42 45 47 49 4e 3b 20 49 4e 53 45 52  2 { BEGIN; INSER
11580 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
11590 28 27 65 27 2c 20 27 66 27 29 3b 20 7d 0a 20 20  ('e', 'f'); }.  
115a0 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70  } {}.  do_test p
115b0 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e 38 20 20  ager1-28.$tn.8  
115c0 7b 20 66 69 6c 65 20 65 78 69 73 74 73 20 74 65  { file exists te
115d0 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 7d 20  st.db-journal } 
115e0 31 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65  1.  do_test page
115f0 72 31 2d 32 38 2e 24 74 6e 2e 39 20 20 7b 20 73  r1-28.$tn.9  { s
11600 71 6c 31 20 7b 20 50 52 41 47 4d 41 20 6a 6f 75  ql1 { PRAGMA jou
11610 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c 45  rnal_mode = DELE
11620 54 45 20 7d 20 7d 20 64 65 6c 65 74 65 0a 20 20  TE } } delete.  
11630 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32  do_test pager1-2
11640 38 2e 24 74 6e 2e 31 30 20 7b 20 66 69 6c 65 20  8.$tn.10 { file 
11650 65 78 69 73 74 73 20 74 65 73 74 2e 64 62 2d 6a  exists test.db-j
11660 6f 75 72 6e 61 6c 20 7d 20 31 0a 0a 20 20 64 6f  ournal } 1..  do
11670 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 38 2e  _test pager1-28.
11680 24 74 6e 2e 31 31 20 7b 20 73 71 6c 32 20 43 4f  $tn.11 { sql2 CO
11690 4d 4d 49 54 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74  MMIT } {}.  do_t
116a0 65 73 74 20 70 61 67 65 72 31 2d 32 38 2e 24 74  est pager1-28.$t
116b0 6e 2e 31 32 20 7b 20 66 69 6c 65 20 65 78 69 73  n.12 { file exis
116c0 74 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e  ts test.db-journ
116d0 61 6c 20 7d 20 30 0a 0a 20 20 64 6f 5f 74 65 73  al } 0..  do_tes
116e0 74 20 70 61 67 65 72 31 2d 32 38 2d 24 74 6e 2e  t pager1-28-$tn.
116f0 31 33 20 7b 0a 20 20 20 20 63 6f 64 65 31 20 7b  13 {.    code1 {
11700 20 73 65 74 20 63 68 61 6e 6e 65 6c 20 5b 64 62   set channel [db
11710 20 69 6e 63 72 62 6c 6f 62 20 2d 72 65 61 64 6f   incrblob -reado
11720 6e 6c 79 20 74 31 20 61 20 32 5d 20 7d 0a 20 20  nly t1 a 2] }.  
11730 20 20 73 71 6c 31 20 7b 0a 20 20 20 20 20 20 50    sql1 {.      P
11740 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
11750 64 65 20 3d 20 50 45 52 53 49 53 54 3b 0a 20 20  de = PERSIST;.  
11760 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
11770 74 31 20 56 41 4c 55 45 53 28 27 67 27 2c 20 27  t1 VALUES('g', '
11780 68 27 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b  h');.    }.  } {
11790 70 65 72 73 69 73 74 7d 0a 20 20 64 6f 5f 74 65  persist}.  do_te
117a0 73 74 20 70 61 67 65 72 31 2d 32 38 2e 24 74 6e  st pager1-28.$tn
117b0 2e 31 34 20 7b 20 66 69 6c 65 20 65 78 69 73 74  .14 { file exist
117c0 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61  s test.db-journa
117d0 6c 20 7d 20 31 0a 20 20 64 6f 5f 74 65 73 74 20  l } 1.  do_test 
117e0 70 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e 31 35  pager1-28.$tn.15
117f0 20 7b 0a 20 20 20 20 73 71 6c 32 20 7b 20 42 45   {.    sql2 { BE
11800 47 49 4e 3b 20 49 4e 53 45 52 54 20 49 4e 54 4f  GIN; INSERT INTO
11810 20 74 31 20 56 41 4c 55 45 53 28 27 65 27 2c 20   t1 VALUES('e', 
11820 27 66 27 29 3b 20 7d 0a 20 20 7d 20 7b 7d 0a 20  'f'); }.  } {}. 
11830 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
11840 32 38 2e 24 74 6e 2e 31 36 20 7b 20 73 71 6c 31  28.$tn.16 { sql1
11850 20 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61   { PRAGMA journa
11860 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c 45 54 45 20  l_mode = DELETE 
11870 7d 20 7d 20 64 65 6c 65 74 65 0a 20 20 64 6f 5f  } } delete.  do_
11880 74 65 73 74 20 70 61 67 65 72 31 2d 32 38 2e 24  test pager1-28.$
11890 74 6e 2e 31 37 20 7b 20 66 69 6c 65 20 65 78 69  tn.17 { file exi
118a0 73 74 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72  sts test.db-jour
118b0 6e 61 6c 20 7d 20 31 0a 0a 20 20 64 6f 5f 74 65  nal } 1..  do_te
118c0 73 74 20 70 61 67 65 72 31 2d 32 38 2e 24 74 6e  st pager1-28.$tn
118d0 2e 31 37 20 7b 20 63 73 71 6c 32 20 7b 20 43 4f  .17 { csql2 { CO
118e0 4d 4d 49 54 20 7d 20 7d 20 7b 31 20 7b 64 61 74  MMIT } } {1 {dat
118f0 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 7d  abase is locked}
11900 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65  }.  do_test page
11910 72 31 2d 32 38 2d 24 74 6e 2e 31 38 20 7b 20 63  r1-28-$tn.18 { c
11920 6f 64 65 31 20 7b 20 72 65 61 64 20 24 63 68 61  ode1 { read $cha
11930 6e 6e 65 6c 20 7d 20 7d 20 63 0a 20 20 64 6f 5f  nnel } } c.  do_
11940 74 65 73 74 20 70 61 67 65 72 31 2d 32 38 2d 24  test pager1-28-$
11950 74 6e 2e 31 39 20 7b 20 63 6f 64 65 31 20 7b 20  tn.19 { code1 { 
11960 63 6c 6f 73 65 20 24 63 68 61 6e 6e 65 6c 20 7d  close $channel }
11970 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74 20   } {}.  do_test 
11980 70 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e 32 30  pager1-28.$tn.20
11990 20 7b 20 73 71 6c 32 20 7b 20 43 4f 4d 4d 49 54   { sql2 { COMMIT
119a0 20 7d 20 7d 20 7b 7d 0a 7d 0a 0a 64 6f 5f 74 65   } } {}.}..do_te
119b0 73 74 20 70 61 67 65 72 31 2d 32 39 2e 31 20 7b  st pager1-29.1 {
119c0 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65  .  faultsim_dele
119d0 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20  te_and_reopen.  
119e0 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52  execsql {.    PR
119f0 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d  AGMA page_size =
11a00 20 31 30 32 34 3b 0a 20 20 20 20 50 52 41 47 4d   1024;.    PRAGM
11a10 41 20 61 75 74 6f 5f 76 61 63 75 75 6d 20 3d 20  A auto_vacuum = 
11a20 66 75 6c 6c 3b 0a 20 20 20 20 50 52 41 47 4d 41  full;.    PRAGMA
11a30 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78   locking_mode=ex
11a40 63 6c 75 73 69 76 65 3b 0a 20 20 20 20 43 52 45  clusive;.    CRE
11a50 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20  ATE TABLE t1(a, 
11a60 62 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  b);.    INSERT I
11a70 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c  NTO t1 VALUES(1,
11a80 20 32 29 3b 0a 20 20 7d 0a 20 20 66 69 6c 65 20   2);.  }.  file 
11a90 73 69 7a 65 20 74 65 73 74 2e 64 62 0a 7d 20 5b  size test.db.} [
11aa0 65 78 70 72 20 31 30 32 34 2a 33 5d 0a 64 6f 5f  expr 1024*3].do_
11ab0 74 65 73 74 20 70 61 67 65 72 31 2d 32 39 2e 32  test pager1-29.2
11ac0 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
11ad0 20 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73     PRAGMA page_s
11ae0 69 7a 65 20 3d 20 34 30 39 36 3b 0a 20 20 20 20  ize = 4096;.    
11af0 56 41 43 55 55 4d 3b 0a 20 20 7d 0a 20 20 66 69  VACUUM;.  }.  fi
11b00 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 0a  le size test.db.
11b10 7d 20 5b 65 78 70 72 20 34 30 39 36 2a 33 5d 0a  } [expr 4096*3].
11b20 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
11b30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11b40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11b50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11b60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65  -----------.# Te
11b70 73 74 20 74 68 61 74 20 69 66 20 61 6e 20 65 6d  st that if an em
11b80 70 74 79 20 64 61 74 61 62 61 73 65 20 66 69 6c  pty database fil
11b90 65 20 28 73 69 7a 65 20 30 20 62 79 74 65 73 29  e (size 0 bytes)
11ba0 20 69 73 20 6f 70 65 6e 65 64 20 69 6e 20 0a 23   is opened in .#
11bb0 20 65 78 63 6c 75 73 69 76 65 2d 6c 6f 63 6b 69   exclusive-locki
11bc0 6e 67 20 6d 6f 64 65 2c 20 61 6e 79 20 6a 6f 75  ng mode, any jou
11bd0 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 64 65 6c  rnal file is del
11be0 65 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66 69  eted from the fi
11bf0 6c 65 2d 73 79 73 74 65 6d 0a 23 20 77 69 74 68  le-system.# with
11c00 6f 75 74 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64  out being rolled
11c10 20 62 61 63 6b 2e 20 41 6e 64 20 74 68 61 74 20   back. And that 
11c20 74 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63  the RESERVED loc
11c30 6b 20 6f 62 74 61 69 6e 65 64 20 77 68 69 6c 65  k obtained while
11c40 0a 23 20 64 6f 69 6e 67 20 74 68 69 73 20 69 73  .# doing this is
11c50 20 6e 6f 74 20 72 65 6c 65 61 73 65 64 2e 0a 23   not released..#
11c60 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
11c70 33 30 2e 31 20 7b 0a 20 20 64 62 20 63 6c 6f 73  30.1 {.  db clos
11c80 65 0a 20 20 64 65 6c 65 74 65 5f 66 69 6c 65 20  e.  delete_file 
11c90 74 65 73 74 2e 64 62 0a 20 20 64 65 6c 65 74 65  test.db.  delete
11ca0 5f 66 69 6c 65 20 74 65 73 74 2e 64 62 2d 6a 6f  _file test.db-jo
11cb0 75 72 6e 61 6c 0a 20 20 73 65 74 20 66 64 20 5b  urnal.  set fd [
11cc0 6f 70 65 6e 20 74 65 73 74 2e 64 62 2d 6a 6f 75  open test.db-jou
11cd0 72 6e 61 6c 20 77 5d 0a 20 20 73 65 65 6b 20 24  rnal w].  seek $
11ce0 66 64 20 5b 65 78 70 72 20 35 31 32 2b 31 30 33  fd [expr 512+103
11cf0 32 2a 32 5d 0a 20 20 70 75 74 73 20 2d 6e 6f 6e  2*2].  puts -non
11d00 65 77 6c 69 6e 65 20 24 66 64 20 78 0a 20 20 63  ewline $fd x.  c
11d10 6c 6f 73 65 20 24 66 64 0a 0a 20 20 73 71 6c 69  lose $fd..  sqli
11d20 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20  te3 db test.db. 
11d30 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50   execsql {.    P
11d40 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  RAGMA locking_mo
11d50 64 65 3d 45 58 43 4c 55 53 49 56 45 3b 0a 20 20  de=EXCLUSIVE;.  
11d60 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a    SELECT count(*
11d70 29 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61  ) FROM sqlite_ma
11d80 73 74 65 72 3b 0a 20 20 20 20 50 52 41 47 4d 41  ster;.    PRAGMA
11d90 20 6c 6f 63 6b 5f 73 74 61 74 75 73 3b 0a 20 20   lock_status;.  
11da0 7d 0a 7d 20 7b 65 78 63 6c 75 73 69 76 65 20 30  }.} {exclusive 0
11db0 20 6d 61 69 6e 20 72 65 73 65 72 76 65 64 20 74   main reserved t
11dc0 65 6d 70 20 63 6c 6f 73 65 64 7d 0a 0a 23 2d 2d  emp closed}..#--
11dd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11de0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11df0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11e00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11e10 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74  -------.# Test t
11e20 68 61 74 20 69 66 20 74 68 65 20 22 70 61 67 65  hat if the "page
11e30 2d 73 69 7a 65 22 20 66 69 65 6c 64 20 69 6e 20  -size" field in 
11e40 61 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72  a journal-header
11e50 20 69 73 20 30 2c 20 74 68 65 20 6a 6f 75 72 6e   is 0, the journ
11e60 61 6c 0a 23 20 66 69 6c 65 20 63 61 6e 20 73 74  al.# file can st
11e70 69 6c 6c 20 62 65 20 72 6f 6c 6c 65 64 20 62 61  ill be rolled ba
11e80 63 6b 2e 20 54 68 69 73 20 69 73 20 72 65 71 75  ck. This is requ
11e90 69 72 65 64 20 66 6f 72 20 62 61 63 6b 77 61 72  ired for backwar
11ea0 64 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20  d compatibility 
11eb0 2d 0a 23 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  -.# versions of 
11ec0 53 51 4c 69 74 65 20 70 72 69 6f 72 20 74 6f 20  SQLite prior to 
11ed0 33 2e 35 2e 38 20 61 6c 77 61 79 73 20 73 65 74  3.5.8 always set
11ee0 20 74 68 69 73 20 66 69 65 6c 64 20 74 6f 20 7a   this field to z
11ef0 65 72 6f 2e 0a 23 0a 69 66 20 7b 24 74 63 6c 5f  ero..#.if {$tcl_
11f00 70 6c 61 74 66 6f 72 6d 28 70 6c 61 74 66 6f 72  platform(platfor
11f10 6d 29 3d 3d 22 75 6e 69 78 22 7d 20 7b 0a 64 6f  m)=="unix"} {.do
11f20 5f 74 65 73 74 20 70 61 67 65 72 31 2d 33 31 2e  _test pager1-31.
11f30 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64  1 {.  faultsim_d
11f40 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e  elete_and_reopen
11f50 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
11f60 20 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69   PRAGMA cache_si
11f70 7a 65 20 3d 20 31 30 3b 0a 20 20 20 20 50 52 41  ze = 10;.    PRA
11f80 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20  GMA page_size = 
11f90 31 30 32 34 3b 0a 20 20 20 20 43 52 45 41 54 45  1024;.    CREATE
11fa0 20 54 41 42 4c 45 20 74 31 28 78 2c 20 79 2c 20   TABLE t1(x, y, 
11fb0 55 4e 49 51 55 45 28 78 2c 20 79 29 29 3b 0a 20  UNIQUE(x, y));. 
11fc0 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
11fd0 31 20 56 41 4c 55 45 53 28 72 61 6e 64 6f 6d 62  1 VALUES(randomb
11fe0 6c 6f 62 28 31 35 30 30 29 2c 20 72 61 6e 64 6f  lob(1500), rando
11ff0 6d 62 6c 6f 62 28 31 35 30 30 29 29 3b 0a 20 20  mblob(1500));.  
12000 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
12010 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c   SELECT randombl
12020 6f 62 28 31 35 30 30 29 2c 20 72 61 6e 64 6f 6d  ob(1500), random
12030 62 6c 6f 62 28 31 35 30 30 29 20 46 52 4f 4d 20  blob(1500) FROM 
12040 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  t1;.    INSERT I
12050 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61  NTO t1 SELECT ra
12060 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 2c 20  ndomblob(1500), 
12070 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29  randomblob(1500)
12080 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e   FROM t1;.    IN
12090 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
120a0 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31  ECT randomblob(1
120b0 35 30 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62  500), randomblob
120c0 28 31 35 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a  (1500) FROM t1;.
120d0 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
120e0 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d  t1 SELECT random
120f0 62 6c 6f 62 28 31 35 30 30 29 2c 20 72 61 6e 64  blob(1500), rand
12100 6f 6d 62 6c 6f 62 28 31 35 30 30 29 20 46 52 4f  omblob(1500) FRO
12110 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54  M t1;.    INSERT
12120 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
12130 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29  randomblob(1500)
12140 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30  , randomblob(150
12150 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20  0) FROM t1;.    
12160 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
12170 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62  ELECT randomblob
12180 28 31 35 30 30 29 2c 20 72 61 6e 64 6f 6d 62 6c  (1500), randombl
12190 6f 62 28 31 35 30 30 29 20 46 52 4f 4d 20 74 31  ob(1500) FROM t1
121a0 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
121b0 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64  O t1 SELECT rand
121c0 6f 6d 62 6c 6f 62 28 31 35 30 30 29 2c 20 72 61  omblob(1500), ra
121d0 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 20 46  ndomblob(1500) F
121e0 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45  ROM t1;.    INSE
121f0 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
12200 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30  T randomblob(150
12210 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31  0), randomblob(1
12220 35 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20  500) FROM t1;.  
12230 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
12240 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c   SELECT randombl
12250 6f 62 28 31 35 30 30 29 2c 20 72 61 6e 64 6f 6d  ob(1500), random
12260 62 6c 6f 62 28 31 35 30 30 29 20 46 52 4f 4d 20  blob(1500) FROM 
12270 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  t1;.    INSERT I
12280 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61  NTO t1 SELECT ra
12290 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 2c 20  ndomblob(1500), 
122a0 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29  randomblob(1500)
122b0 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 42 45   FROM t1;.    BE
122c0 47 49 4e 3b 0a 20 20 20 20 20 20 55 50 44 41 54  GIN;.      UPDAT
122d0 45 20 74 31 20 53 45 54 20 79 20 3d 20 72 61 6e  E t1 SET y = ran
122e0 64 6f 6d 62 6c 6f 62 28 31 34 39 39 29 3b 0a 20  domblob(1499);. 
122f0 20 7d 0a 20 20 63 6f 70 79 5f 66 69 6c 65 20 74   }.  copy_file t
12300 65 73 74 2e 64 62 20 74 65 73 74 2e 64 62 32 0a  est.db test.db2.
12310 20 20 63 6f 70 79 5f 66 69 6c 65 20 74 65 73 74    copy_file test
12320 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 74 65 73 74  .db-journal test
12330 2e 64 62 32 2d 6a 6f 75 72 6e 61 6c 0a 20 20 0a  .db2-journal.  .
12340 20 20 68 65 78 69 6f 5f 77 72 69 74 65 20 74 65    hexio_write te
12350 73 74 2e 64 62 32 2d 6a 6f 75 72 6e 61 6c 20 32  st.db2-journal 2
12360 34 20 30 30 30 30 30 30 30 30 0a 20 20 73 71 6c  4 00000000.  sql
12370 69 74 65 33 20 64 62 32 20 74 65 73 74 2e 64 62  ite3 db2 test.db
12380 32 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52  2.  execsql { PR
12390 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63  AGMA integrity_c
123a0 68 65 63 6b 20 7d 20 64 62 32 0a 7d 20 7b 6f 6b  heck } db2.} {ok
123b0 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }.}..#----------
123c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
123d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
123e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
123f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
12400 23 20 54 65 73 74 20 74 68 61 74 20 61 20 64 61  # Test that a da
12410 74 61 62 61 73 65 20 66 69 6c 65 20 63 61 6e 20  tabase file can 
12420 62 65 20 22 70 72 65 2d 68 69 6e 74 65 64 22 20  be "pre-hinted" 
12430 74 6f 20 61 20 63 65 72 74 61 69 6e 20 73 69 7a  to a certain siz
12440 65 20 61 6e 64 20 74 68 61 74 0a 23 20 73 75 62  e and that.# sub
12450 73 65 71 75 65 6e 74 20 73 70 69 6c 6c 69 6e 67  sequent spilling
12460 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 63 61   of the pager ca
12470 63 68 65 20 64 6f 65 73 20 6e 6f 74 20 72 65 73  che does not res
12480 75 6c 74 20 69 6e 20 74 68 65 20 64 61 74 61 62  ult in the datab
12490 61 73 65 0a 23 20 66 69 6c 65 20 62 65 69 6e 67  ase.# file being
124a0 20 73 68 72 75 6e 6b 2e 0a 23 0a 63 61 74 63 68   shrunk..#.catch
124b0 20 7b 64 62 20 63 6c 6f 73 65 7d 0a 66 6f 72 63   {db close}.forc
124c0 65 64 65 6c 65 74 65 20 74 65 73 74 2e 64 62 0a  edelete test.db.
124d0 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
124e0 33 32 2e 31 20 7b 0a 20 20 73 71 6c 69 74 65 33  32.1 {.  sqlite3
124f0 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20 65 78   db test.db.  ex
12500 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41  ecsql {.    CREA
12510 54 45 20 54 41 42 4c 45 20 74 31 28 78 2c 20 79  TE TABLE t1(x, y
12520 29 3b 0a 20 20 7d 0a 20 20 64 62 20 63 6c 6f 73  );.  }.  db clos
12530 65 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 74  e.  sqlite3 db t
12540 65 73 74 2e 64 62 0a 20 20 65 78 65 63 73 71 6c  est.db.  execsql
12550 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20   {.    BEGIN;.  
12560 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
12570 20 56 41 4c 55 45 53 28 31 2c 20 72 61 6e 64 6f   VALUES(1, rando
12580 6d 62 6c 6f 62 28 31 30 30 30 30 29 29 3b 0a 20  mblob(10000));. 
12590 20 7d 0a 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f   }.  file_contro
125a0 6c 5f 63 68 75 6e 6b 73 69 7a 65 5f 74 65 73 74  l_chunksize_test
125b0 20 64 62 20 6d 61 69 6e 20 31 30 32 34 0a 20 20   db main 1024.  
125c0 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 73 69 7a  file_control_siz
125d0 65 68 69 6e 74 5f 74 65 73 74 20 64 62 20 6d 61  ehint_test db ma
125e0 69 6e 20 32 30 39 37 31 35 32 30 3b 20 23 20 32  in 20971520; # 2
125f0 30 4d 42 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  0MB.  execsql {.
12600 20 20 20 20 50 52 41 47 4d 41 20 63 61 63 68 65      PRAGMA cache
12610 5f 73 69 7a 65 20 3d 20 31 30 3b 0a 20 20 20 20  _size = 10;.    
12620 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
12630 41 4c 55 45 53 28 31 2c 20 72 61 6e 64 6f 6d 62  ALUES(1, randomb
12640 6c 6f 62 28 31 30 30 30 30 29 29 3b 0a 20 20 20  lob(10000));.   
12650 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
12660 56 41 4c 55 45 53 28 32 2c 20 72 61 6e 64 6f 6d  VALUES(2, random
12670 62 6c 6f 62 28 31 30 30 30 30 29 29 3b 0a 20 20  blob(10000));.  
12680 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
12690 20 53 45 4c 45 43 54 20 78 2b 32 2c 20 72 61 6e   SELECT x+2, ran
126a0 64 6f 6d 62 6c 6f 62 28 31 30 30 30 30 29 20 66  domblob(10000) f
126b0 72 6f 6d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45  rom t1;.    INSE
126c0 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
126d0 54 20 78 2b 34 2c 20 72 61 6e 64 6f 6d 62 6c 6f  T x+4, randomblo
126e0 62 28 31 30 30 30 30 29 20 66 72 6f 6d 20 74 31  b(10000) from t1
126f0 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
12700 4f 20 74 31 20 53 45 4c 45 43 54 20 78 2b 38 2c  O t1 SELECT x+8,
12710 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 30 30 30   randomblob(1000
12720 30 29 20 66 72 6f 6d 20 74 31 3b 0a 20 20 20 20  0) from t1;.    
12730 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
12740 45 4c 45 43 54 20 78 2b 31 36 2c 20 72 61 6e 64  ELECT x+16, rand
12750 6f 6d 62 6c 6f 62 28 31 30 30 30 30 29 20 66 72  omblob(10000) fr
12760 6f 6d 20 74 31 3b 0a 20 20 20 20 53 45 4c 45 43  om t1;.    SELEC
12770 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
12780 74 31 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a  t1;.    COMMIT;.
12790 20 20 7d 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20    }.  db close. 
127a0 20 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e   file size test.
127b0 64 62 0a 7d 20 7b 32 30 39 37 31 35 32 30 7d 0a  db.} {20971520}.
127c0 0a 23 20 43 6c 65 61 6e 75 70 20 32 30 4d 42 20  .# Cleanup 20MB 
127d0 66 69 6c 65 20 6c 65 66 74 20 62 79 20 74 68 65  file left by the
127e0 20 70 72 65 76 69 6f 75 73 20 74 65 73 74 2e 0a   previous test..
127f0 66 6f 72 63 65 64 65 6c 65 74 65 20 74 65 73 74  forcedelete test
12800 2e 64 62 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .db..#----------
12810 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12820 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12830 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12840 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
12850 23 20 54 65 73 74 20 74 68 61 74 20 69 66 20 61  # Test that if a
12860 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
12870 63 6f 6d 6d 69 74 74 65 64 20 69 6e 20 6a 6f 75  committed in jou
12880 72 6e 61 6c 5f 6d 6f 64 65 3d 44 45 4c 45 54 45  rnal_mode=DELETE
12890 20 6d 6f 64 65 2c 0a 23 20 61 6e 64 20 74 68 65   mode,.# and the
128a0 20 63 61 6c 6c 20 74 6f 20 75 6e 6c 69 6e 6b 28   call to unlink(
128b0 29 20 72 65 74 75 72 6e 73 20 61 6e 20 45 4e 4f  ) returns an ENO
128c0 45 4e 54 20 65 72 72 6f 72 2c 20 74 68 65 20 43  ENT error, the C
128d0 4f 4d 4d 49 54 20 64 6f 65 73 20 6e 6f 74 0a 23  OMMIT does not.#
128e0 20 73 75 63 63 65 65 64 2e 0a 23 0a 69 66 20 7b   succeed..#.if {
128f0 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28  $::tcl_platform(
12900 70 6c 61 74 66 6f 72 6d 29 3d 3d 22 75 6e 69 78  platform)=="unix
12910 22 7d 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 70  "} {.  do_test p
12920 61 67 65 72 31 2d 33 33 2e 31 20 7b 0a 20 20 20  ager1-33.1 {.   
12930 20 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74   sqlite3 db test
12940 2e 64 62 0a 20 20 20 20 65 78 65 63 73 71 6c 20  .db.    execsql 
12950 7b 0a 20 20 20 20 20 20 43 52 45 41 54 45 20 54  {.      CREATE T
12960 41 42 4c 45 20 74 31 28 78 29 3b 0a 20 20 20 20  ABLE t1(x);.    
12970 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
12980 20 56 41 4c 55 45 53 28 27 6f 6e 65 27 29 3b 0a   VALUES('one');.
12990 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
129a0 4f 20 74 31 20 56 41 4c 55 45 53 28 27 74 77 6f  O t1 VALUES('two
129b0 27 29 3b 0a 20 20 20 20 20 20 42 45 47 49 4e 3b  ');.      BEGIN;
129c0 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20  .        INSERT 
129d0 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27  INTO t1 VALUES('
129e0 74 68 72 65 65 27 29 3b 0a 20 20 20 20 20 20 20  three');.       
129f0 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
12a00 56 41 4c 55 45 53 28 27 66 6f 75 72 27 29 3b 0a  VALUES('four');.
12a10 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 63 65 64      }.    forced
12a20 65 6c 65 74 65 20 62 61 6b 2d 6a 6f 75 72 6e 61  elete bak-journa
12a30 6c 0a 20 20 20 20 66 69 6c 65 20 72 65 6e 61 6d  l.    file renam
12a40 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61  e test.db-journa
12a50 6c 20 62 61 6b 2d 6a 6f 75 72 6e 61 6c 0a 0a 20  l bak-journal.. 
12a60 20 20 20 63 61 74 63 68 73 71 6c 20 43 4f 4d 4d     catchsql COMM
12a70 49 54 0a 20 20 7d 20 7b 31 20 7b 64 69 73 6b 20  IT.  } {1 {disk 
12a80 49 2f 4f 20 65 72 72 6f 72 7d 7d 0a 0a 20 20 64  I/O error}}..  d
12a90 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 33 33  o_test pager1-33
12aa0 2e 32 20 7b 0a 20 20 20 20 66 69 6c 65 20 72 65  .2 {.    file re
12ab0 6e 61 6d 65 20 62 61 6b 2d 6a 6f 75 72 6e 61 6c  name bak-journal
12ac0 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c   test.db-journal
12ad0 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 53  .    execsql { S
12ae0 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
12af0 7d 0a 20 20 7d 20 7b 6f 6e 65 20 74 77 6f 7d 0a  }.  } {one two}.
12b00 7d 0a 0a 66 69 6e 69 73 68 5f 74 65 73 74 0a     }..finish_test.