/ Hex Artifact Content
Login

Artifact 101032cb9d8093806600b343fdcf78ba51c1e3e9:


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 32 30 5d 20 31 32 33 34 35 36 0a 20 20  l]-20] 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 32 30 5d 20 31 32 33 34 35 36 0a  nal]-20] 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 74 65 73  le-system..#.tes
4330: 74 76 66 73 20 74 76 20 2d 64 65 66 61 75 6c 74  tvfs tv -default
4340: 20 31 0a 74 76 20 73 63 72 69 70 74 20 63 6f 70   1.tv script cop
4350: 79 5f 6f 6e 5f 6d 6a 5f 64 65 6c 65 74 65 0a 73  y_on_mj_delete.s
4360: 65 74 20 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65  et ::mj_filename
4370: 5f 6c 65 6e 67 74 68 20 30 0a 70 72 6f 63 20 63  _length 0.proc c
4380: 6f 70 79 5f 6f 6e 5f 6d 6a 5f 64 65 6c 65 74 65  opy_on_mj_delete
4390: 20 7b 6d 65 74 68 6f 64 20 66 69 6c 65 6e 61 6d   {method filenam
43a0: 65 20 61 72 67 73 7d 20 7b 0a 20 20 69 66 20 7b  e args} {.  if {
43b0: 5b 73 74 72 69 6e 67 20 6d 61 74 63 68 20 2a 6d  [string match *m
43c0: 6a 2a 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 66  j* [file tail $f
43d0: 69 6c 65 6e 61 6d 65 5d 5d 7d 20 7b 20 0a 20 20  ilename]]} { .  
43e0: 20 20 73 65 74 20 3a 3a 6d 6a 5f 66 69 6c 65 6e    set ::mj_filen
43f0: 61 6d 65 5f 6c 65 6e 67 74 68 20 5b 73 74 72 69  ame_length [stri
4400: 6e 67 20 6c 65 6e 67 74 68 20 24 66 69 6c 65 6e  ng length $filen
4410: 61 6d 65 5d 0a 20 20 20 20 66 61 75 6c 74 73 69  ame].    faultsi
4420: 6d 5f 73 61 76 65 20 0a 20 20 7d 0a 20 20 72 65  m_save .  }.  re
4430: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 7d  turn SQLITE_OK.}
4440: 0a 0a 73 65 74 20 70 77 64 20 5b 67 65 74 5f 70  ..set pwd [get_p
4450: 77 64 5d 0a 66 6f 72 65 61 63 68 20 7b 74 6e 31  wd].foreach {tn1
4460: 20 74 63 6c 7d 20 7b 0a 20 20 31 20 7b 20 73 65   tcl} {.  1 { se
4470: 74 20 70 72 65 66 69 78 20 22 74 65 73 74 2e 64  t prefix "test.d
4480: 62 22 20 7d 0a 20 20 32 20 7b 20 0a 20 20 20 20  b" }.  2 { .    
4490: 23 20 54 68 69 73 20 74 65 73 74 20 64 65 70 65  # This test depe
44a0: 6e 64 73 20 6f 6e 20 74 68 65 20 75 6e 64 65 72  nds on the under
44b0: 6c 79 69 6e 67 20 56 46 53 20 62 65 69 6e 67 20  lying VFS being 
44c0: 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 70 61 74  able to open pat
44d0: 68 73 0a 20 20 20 20 23 20 35 31 32 20 62 79 74  hs.    # 512 byt
44e0: 65 73 20 69 6e 20 6c 65 6e 67 74 68 2e 20 54 68  es in length. Th
44f0: 65 20 69 64 65 61 20 69 73 20 74 6f 20 63 72 65  e idea is to cre
4500: 61 74 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  ate a hot-journa
4510: 6c 20 66 69 6c 65 20 74 68 61 74 0a 20 20 20 20  l file that.    
4520: 23 20 63 6f 6e 74 61 69 6e 73 20 61 20 6d 61 73  # contains a mas
4530: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  ter-journal poin
4540: 74 65 72 20 73 6f 20 6c 61 72 67 65 20 74 68 61  ter so large tha
4550: 74 20 69 74 20 63 6f 75 6c 64 20 63 6f 6e 74 61  t it could conta
4560: 69 6e 0a 20 20 20 20 23 20 61 20 76 61 6c 69 64  in.    # a valid
4570: 20 70 61 67 65 20 72 65 63 6f 72 64 20 28 69 66   page record (if
4580: 20 74 68 65 20 66 69 6c 65 20 70 61 67 65 2d 73   the file page-s
4590: 69 7a 65 20 69 73 20 35 31 32 20 62 79 74 65 73  ize is 512 bytes
45a0: 29 2e 20 53 6f 20 61 73 20 74 6f 0a 20 20 20 20  ). So as to.    
45b0: 23 20 6d 61 6b 65 20 73 75 72 65 20 53 51 4c 69  # make sure SQLi
45c0: 74 65 20 64 6f 65 73 6e 27 74 20 67 65 74 20 63  te doesn't get c
45d0: 6f 6e 66 75 73 65 64 20 62 79 20 74 68 69 73 2e  onfused by this.
45e0: 0a 20 20 20 20 23 0a 20 20 20 20 73 65 74 20 6e  .    #.    set n
45f0: 50 61 64 64 69 6e 67 20 5b 65 78 70 72 20 35 31  Padding [expr 51
4600: 31 20 2d 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61  1 - $::mj_filena
4610: 6d 65 5f 6c 65 6e 67 74 68 5d 0a 20 20 20 20 69  me_length].    i
4620: 66 20 7b 24 74 63 6c 5f 70 6c 61 74 66 6f 72 6d  f {$tcl_platform
4630: 28 70 6c 61 74 66 6f 72 6d 29 3d 3d 22 77 69 6e  (platform)=="win
4640: 64 6f 77 73 22 7d 20 7b 0a 20 20 20 20 20 20 23  dows"} {.      #
4650: 20 54 42 44 20 6e 65 65 64 20 74 6f 20 66 69 67   TBD need to fig
4660: 75 72 65 20 6f 75 74 20 68 6f 77 20 74 6f 20 64  ure out how to d
4670: 6f 20 74 68 69 73 20 63 6f 72 72 65 63 74 6c 79  o this correctly
4680: 20 66 6f 72 20 57 69 6e 64 6f 77 73 21 21 21 0a   for Windows!!!.
4690: 20 20 20 20 20 20 73 65 74 20 6e 50 61 64 64 69        set nPaddi
46a0: 6e 67 20 5b 65 78 70 72 20 32 35 35 20 2d 20 24  ng [expr 255 - $
46b0: 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 5f 6c 65  ::mj_filename_le
46c0: 6e 67 74 68 5d 0a 20 20 20 20 7d 0a 0a 20 20 20  ngth].    }..   
46d0: 20 23 20 57 65 20 63 61 6e 6e 6f 74 20 6a 75 73   # We cannot jus
46e0: 74 20 63 72 65 61 74 65 20 61 20 72 65 61 6c 6c  t create a reall
46f0: 79 20 6c 6f 6e 67 20 64 61 74 61 62 61 73 65 20  y long database 
4700: 66 69 6c 65 20 6e 61 6d 65 20 74 6f 20 6f 70 65  file name to ope
4710: 6e 2c 20 61 73 0a 20 20 20 20 23 20 4c 69 6e 75  n, as.    # Linu
4720: 78 20 6c 69 6d 69 74 73 20 61 20 73 69 6e 67 6c  x limits a singl
4730: 65 20 63 6f 6d 70 6f 6e 65 6e 74 20 6f 66 20 61  e component of a
4740: 20 70 61 74 68 20 74 6f 20 32 35 35 20 62 79 74   path to 255 byt
4750: 65 73 20 62 79 20 64 65 66 61 75 6c 74 0a 20 20  es by default.  
4760: 20 20 23 20 28 61 6e 64 20 70 72 65 73 75 6d 61    # (and presuma
4770: 62 6c 79 20 6f 74 68 65 72 20 73 79 73 74 65 6d  bly other system
4780: 73 20 68 61 76 65 20 6c 69 6d 69 74 73 20 74 6f  s have limits to
4790: 6f 29 2e 20 53 6f 20 63 72 65 61 74 65 20 61 20  o). So create a 
47a0: 64 69 72 65 63 74 6f 72 79 0a 20 20 20 20 23 20  directory.    # 
47b0: 68 69 65 72 61 72 63 68 79 20 74 6f 20 77 6f 72  hierarchy to wor
47c0: 6b 20 69 6e 2e 0a 20 20 20 20 23 0a 20 20 20 20  k in..    #.    
47d0: 73 65 74 20 64 69 72 6e 61 6d 65 20 22 64 31 32  set dirname "d12
47e0: 33 34 35 36 37 38 39 30 31 32 33 34 35 36 37 38  3456789012345678
47f0: 39 30 31 32 33 34 35 36 37 38 39 30 2f 22 0a 20  901234567890/". 
4800: 20 20 20 73 65 74 20 6e 44 69 72 20 5b 65 78 70     set nDir [exp
4810: 72 20 24 6e 50 61 64 64 69 6e 67 20 2f 20 33 32  r $nPadding / 32
4820: 5d 0a 20 20 20 20 69 66 20 7b 20 24 6e 44 69 72  ].    if { $nDir
4830: 20 7d 20 7b 0a 20 20 20 20 20 20 73 65 74 20 70   } {.      set p
4840: 20 5b 73 74 72 69 6e 67 20 72 65 70 65 61 74 20   [string repeat 
4850: 24 64 69 72 6e 61 6d 65 20 24 6e 44 69 72 5d 0a  $dirname $nDir].
4860: 20 20 20 20 20 20 66 69 6c 65 20 6d 6b 64 69 72        file mkdir
4870: 20 24 70 0a 20 20 20 20 20 20 63 64 20 24 70 0a   $p.      cd $p.
4880: 20 20 20 20 7d 0a 0a 20 20 20 20 73 65 74 20 70      }..    set p
4890: 61 64 64 69 6e 67 20 5b 73 74 72 69 6e 67 20 72  adding [string r
48a0: 65 70 65 61 74 20 78 20 5b 65 78 70 72 20 24 6e  epeat x [expr $n
48b0: 50 61 64 64 69 6e 67 20 25 33 32 5d 5d 0a 20 20  Padding %32]].  
48c0: 20 20 73 65 74 20 70 72 65 66 69 78 20 22 74 65    set prefix "te
48d0: 73 74 2e 64 62 24 7b 70 61 64 64 69 6e 67 7d 22  st.db${padding}"
48e0: 0a 20 20 7d 0a 7d 20 7b 0a 20 20 65 76 61 6c 20  .  }.} {.  eval 
48f0: 24 74 63 6c 0a 20 20 66 6f 72 65 61 63 68 20 7b  $tcl.  foreach {
4900: 74 6e 32 20 73 71 6c 7d 20 7b 0a 20 20 20 20 6f  tn2 sql} {.    o
4910: 20 7b 20 0a 20 20 20 20 20 20 50 52 41 47 4d 41   { .      PRAGMA
4920: 20 6d 61 69 6e 2e 73 79 6e 63 68 72 6f 6e 6f 75   main.synchronou
4930: 73 3d 4f 46 46 3b 0a 20 20 20 20 20 20 50 52 41  s=OFF;.      PRA
4940: 47 4d 41 20 61 75 78 2e 73 79 6e 63 68 72 6f 6e  GMA aux.synchron
4950: 6f 75 73 3d 4f 46 46 3b 0a 20 20 20 20 20 20 50  ous=OFF;.      P
4960: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
4970: 64 65 20 3d 20 44 45 4c 45 54 45 3b 0a 20 20 20  de = DELETE;.   
4980: 20 7d 0a 20 20 20 20 6f 35 31 32 20 7b 20 0a 20   }.    o512 { . 
4990: 20 20 20 20 20 50 52 41 47 4d 41 20 6d 61 69 6e       PRAGMA main
49a0: 2e 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46 46  .synchronous=OFF
49b0: 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 61  ;.      PRAGMA a
49c0: 75 78 2e 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f  ux.synchronous=O
49d0: 46 46 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41  FF;.      PRAGMA
49e0: 20 6d 61 69 6e 2e 70 61 67 65 5f 73 69 7a 65 20   main.page_size 
49f0: 3d 20 35 31 32 3b 0a 20 20 20 20 20 20 50 52 41  = 512;.      PRA
4a00: 47 4d 41 20 61 75 78 2e 70 61 67 65 5f 73 69 7a  GMA aux.page_siz
4a10: 65 20 3d 20 35 31 32 3b 0a 20 20 20 20 20 20 50  e = 512;.      P
4a20: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
4a30: 64 65 20 3d 20 44 45 4c 45 54 45 3b 0a 20 20 20  de = DELETE;.   
4a40: 20 7d 0a 20 20 20 20 6e 20 7b 20 0a 20 20 20 20   }.    n { .    
4a50: 20 20 50 52 41 47 4d 41 20 6d 61 69 6e 2e 73 79    PRAGMA main.sy
4a60: 6e 63 68 72 6f 6e 6f 75 73 3d 4e 4f 52 4d 41 4c  nchronous=NORMAL
4a70: 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 61  ;.      PRAGMA a
4a80: 75 78 2e 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4e  ux.synchronous=N
4a90: 4f 52 4d 41 4c 3b 0a 20 20 20 20 20 20 50 52 41  ORMAL;.      PRA
4aa0: 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
4ab0: 20 3d 20 44 45 4c 45 54 45 3b 0a 20 20 20 20 7d   = DELETE;.    }
4ac0: 0a 20 20 20 20 66 20 7b 20 0a 20 20 20 20 20 20  .    f { .      
4ad0: 50 52 41 47 4d 41 20 6d 61 69 6e 2e 73 79 6e 63  PRAGMA main.sync
4ae0: 68 72 6f 6e 6f 75 73 3d 46 55 4c 4c 3b 0a 20 20  hronous=FULL;.  
4af0: 20 20 20 20 50 52 41 47 4d 41 20 61 75 78 2e 73      PRAGMA aux.s
4b00: 79 6e 63 68 72 6f 6e 6f 75 73 3d 46 55 4c 4c 3b  ynchronous=FULL;
4b10: 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 6a 6f  .      PRAGMA jo
4b20: 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c  urnal_mode = DEL
4b30: 45 54 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b  ETE;.    }.  } {
4b40: 0a 0a 20 20 20 20 73 65 74 20 74 6e 20 22 24 7b  ..    set tn "${
4b50: 74 6e 31 7d 2e 24 7b 74 6e 32 7d 22 0a 20 20 0a  tn1}.${tn2}".  .
4b60: 20 20 20 20 23 20 53 65 74 20 75 70 20 61 20 63      # Set up a c
4b70: 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 68 61 76  onnection to hav
4b80: 65 20 74 77 6f 20 64 61 74 61 62 61 73 65 73 2c  e two databases,
4b90: 20 74 65 73 74 2e 64 62 20 28 6d 61 69 6e 29 20   test.db (main) 
4ba0: 61 6e 64 20 0a 20 20 20 20 23 20 74 65 73 74 2e  and .    # test.
4bb0: 64 62 32 20 28 61 75 78 29 2e 20 54 68 65 6e 20  db2 (aux). Then 
4bc0: 72 75 6e 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65  run a multi-file
4bd0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20   transaction on 
4be0: 74 68 65 6d 2e 20 54 68 65 0a 20 20 20 20 23 20  them. The.    # 
4bf0: 56 46 53 20 77 69 6c 6c 20 73 6e 61 70 73 68 6f  VFS will snapsho
4c00: 74 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  t the file-syste
4c10: 6d 20 6a 75 73 74 20 62 65 66 6f 72 65 20 74 68  m just before th
4c20: 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  e master-journal
4c30: 0a 20 20 20 20 23 20 66 69 6c 65 20 69 73 20 64  .    # file is d
4c40: 65 6c 65 74 65 64 20 74 6f 20 63 6f 6d 6d 69 74  eleted to commit
4c50: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
4c60: 2e 0a 20 20 20 20 23 0a 20 20 20 20 74 76 20 66  ..    #.    tv f
4c70: 69 6c 74 65 72 20 78 44 65 6c 65 74 65 0a 20 20  ilter xDelete.  
4c80: 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
4c90: 2d 34 2e 34 2e 24 74 6e 2e 31 20 7b 0a 20 20 20  -4.4.$tn.1 {.   
4ca0: 20 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65     faultsim_dele
4cb0: 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 20 24 70  te_and_reopen $p
4cc0: 72 65 66 69 78 0a 20 20 20 20 20 20 65 78 65 63  refix.      exec
4cd0: 73 71 6c 20 22 0a 20 20 20 20 20 20 20 20 41 54  sql ".        AT
4ce0: 54 41 43 48 20 27 24 7b 70 72 65 66 69 78 7d 32  TACH '${prefix}2
4cf0: 27 20 41 53 20 61 75 78 3b 0a 20 20 20 20 20 20  ' AS aux;.      
4d00: 20 20 24 73 71 6c 0a 20 20 20 20 20 20 20 20 43    $sql.        C
4d10: 52 45 41 54 45 20 54 41 42 4c 45 20 61 28 78 29  REATE TABLE a(x)
4d20: 3b 0a 20 20 20 20 20 20 20 20 43 52 45 41 54 45  ;.        CREATE
4d30: 20 54 41 42 4c 45 20 61 75 78 2e 62 28 78 29 3b   TABLE aux.b(x);
4d40: 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20  .        INSERT 
4d50: 49 4e 54 4f 20 61 20 56 41 4c 55 45 53 28 27 64  INTO a VALUES('d
4d60: 6f 75 62 6c 65 2d 79 6f 75 27 29 3b 0a 20 20 20  ouble-you');.   
4d70: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
4d80: 20 61 20 56 41 4c 55 45 53 28 27 77 68 79 27 29   a VALUES('why')
4d90: 3b 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54  ;.        INSERT
4da0: 20 49 4e 54 4f 20 61 20 56 41 4c 55 45 53 28 27   INTO a VALUES('
4db0: 7a 65 64 27 29 3b 0a 20 20 20 20 20 20 20 20 49  zed');.        I
4dc0: 4e 53 45 52 54 20 49 4e 54 4f 20 62 20 56 41 4c  NSERT INTO b VAL
4dd0: 55 45 53 28 27 77 6f 6e 27 29 3b 0a 20 20 20 20  UES('won');.    
4de0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
4df0: 62 20 56 41 4c 55 45 53 28 27 74 6f 6f 27 29 3b  b VALUES('too');
4e00: 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20  .        INSERT 
4e10: 49 4e 54 4f 20 62 20 56 41 4c 55 45 53 28 27 66  INTO b VALUES('f
4e20: 72 65 65 27 29 3b 0a 20 20 20 20 20 20 22 0a 20  ree');.      ". 
4e30: 20 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20       execsql {. 
4e40: 20 20 20 20 20 20 20 42 45 47 49 4e 3b 0a 20 20         BEGIN;.  
4e50: 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49          INSERT I
4e60: 4e 54 4f 20 61 20 53 45 4c 45 43 54 20 2a 20 46  NTO a SELECT * F
4e70: 52 4f 4d 20 62 20 57 48 45 52 45 20 72 6f 77 69  ROM b WHERE rowi
4e80: 64 3c 3d 33 3b 0a 20 20 20 20 20 20 20 20 20 20  d<=3;.          
4e90: 49 4e 53 45 52 54 20 49 4e 54 4f 20 62 20 53 45  INSERT INTO b SE
4ea0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 61 20 57 48  LECT * FROM a WH
4eb0: 45 52 45 20 72 6f 77 69 64 3c 3d 33 3b 0a 20 20  ERE rowid<=3;.  
4ec0: 20 20 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20        COMMIT;.  
4ed0: 20 20 20 20 7d 0a 20 20 20 20 7d 20 7b 7d 0a 20      }.    } {}. 
4ee0: 20 20 20 74 76 20 66 69 6c 74 65 72 20 7b 7d 0a     tv filter {}.
4ef0: 20 20 20 20 0a 20 20 20 20 23 20 43 68 65 63 6b      .    # Check
4f00: 20 74 68 61 74 20 74 68 65 20 74 72 61 6e 73 61   that the transa
4f10: 63 74 69 6f 6e 20 77 61 73 20 63 6f 6d 6d 69 74  ction was commit
4f20: 74 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ted successfully
4f30: 2e 0a 20 20 20 20 23 0a 20 20 20 20 64 6f 5f 65  ..    #.    do_e
4f40: 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65  xecsql_test page
4f50: 72 31 2d 34 2e 34 2e 24 74 6e 2e 32 20 7b 0a 20  r1-4.4.$tn.2 {. 
4f60: 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52       SELECT * FR
4f70: 4f 4d 20 61 0a 20 20 20 20 7d 20 7b 64 6f 75 62  OM a.    } {doub
4f80: 6c 65 2d 79 6f 75 20 77 68 79 20 7a 65 64 20 77  le-you why zed w
4f90: 6f 6e 20 74 6f 6f 20 66 72 65 65 7d 0a 20 20 20  on too free}.   
4fa0: 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74   do_execsql_test
4fb0: 20 70 61 67 65 72 31 2d 34 2e 34 2e 24 74 6e 2e   pager1-4.4.$tn.
4fc0: 33 20 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54  3 {.      SELECT
4fd0: 20 2a 20 46 52 4f 4d 20 62 0a 20 20 20 20 7d 20   * FROM b.    } 
4fe0: 7b 77 6f 6e 20 74 6f 6f 20 66 72 65 65 20 64 6f  {won too free do
4ff0: 75 62 6c 65 2d 79 6f 75 20 77 68 79 20 7a 65 64  uble-you why zed
5000: 7d 0a 20 20 20 20 0a 20 20 20 20 23 20 52 65 73  }.    .    # Res
5010: 74 6f 72 65 20 74 68 65 20 66 69 6c 65 2d 73 79  tore the file-sy
5020: 73 74 65 6d 20 61 6e 64 20 72 65 6f 70 65 6e 20  stem and reopen 
5030: 74 68 65 20 64 61 74 61 62 61 73 65 73 2e 20 43  the databases. C
5040: 68 65 63 6b 20 74 68 61 74 20 69 74 20 6e 6f 77  heck that it now
5050: 0a 20 20 20 20 23 20 61 70 70 65 61 72 73 20 74  .    # appears t
5060: 68 61 74 20 74 68 65 20 74 72 61 6e 73 61 63 74  hat the transact
5070: 69 6f 6e 20 77 61 73 20 6e 6f 74 20 63 6f 6d 6d  ion was not comm
5080: 69 74 74 65 64 20 28 62 65 63 61 75 73 65 20 74  itted (because t
5090: 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 0a 20  he file-system. 
50a0: 20 20 20 23 20 77 61 73 20 72 65 73 74 6f 72 65     # was restore
50b0: 64 20 74 6f 20 74 68 65 20 73 74 61 74 65 20 77  d to the state w
50c0: 68 65 72 65 20 69 74 20 68 61 64 20 6e 6f 74 20  here it had not 
50d0: 62 65 65 6e 29 2e 0a 20 20 20 20 23 0a 20 20 20  been)..    #.   
50e0: 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
50f0: 34 2e 34 2e 24 74 6e 2e 34 20 7b 0a 20 20 20 20  4.4.$tn.4 {.    
5100: 20 20 66 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f    faultsim_resto
5110: 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 20 24 70  re_and_reopen $p
5120: 72 65 66 69 78 0a 20 20 20 20 20 20 65 78 65 63  refix.      exec
5130: 73 71 6c 20 22 41 54 54 41 43 48 20 27 24 7b 70  sql "ATTACH '${p
5140: 72 65 66 69 78 7d 32 27 20 41 53 20 61 75 78 22  refix}2' AS aux"
5150: 0a 20 20 20 20 7d 20 7b 7d 0a 20 20 20 20 64 6f  .    } {}.    do
5160: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61  _execsql_test pa
5170: 67 65 72 31 2d 34 2e 34 2e 24 74 6e 2e 35 20 7b  ger1-4.4.$tn.5 {
5180: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 61 7d  SELECT * FROM a}
5190: 20 7b 64 6f 75 62 6c 65 2d 79 6f 75 20 77 68 79   {double-you why
51a0: 20 7a 65 64 7d 0a 20 20 20 20 64 6f 5f 65 78 65   zed}.    do_exe
51b0: 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31  csql_test pager1
51c0: 2d 34 2e 34 2e 24 74 6e 2e 36 20 7b 53 45 4c 45  -4.4.$tn.6 {SELE
51d0: 43 54 20 2a 20 46 52 4f 4d 20 62 7d 20 7b 77 6f  CT * FROM b} {wo
51e0: 6e 20 74 6f 6f 20 66 72 65 65 7d 0a 20 20 20 20  n too free}.    
51f0: 0a 20 20 20 20 23 20 52 65 73 74 6f 72 65 20 74  .    # Restore t
5200: 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 61  he file-system a
5210: 67 61 69 6e 2e 20 54 68 69 73 20 74 69 6d 65 2c  gain. This time,
5220: 20 62 65 66 6f 72 65 20 72 65 6f 70 65 6e 69 6e   before reopenin
5230: 67 20 74 68 65 20 64 61 74 61 62 61 73 65 73 2c  g the databases,
5240: 0a 20 20 20 20 23 20 64 65 6c 65 74 65 20 74 68  .    # delete th
5250: 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  e master-journal
5260: 20 66 69 6c 65 20 66 72 6f 6d 20 74 68 65 20 66   file from the f
5270: 69 6c 65 2d 73 79 73 74 65 6d 2e 20 49 74 20 6e  ile-system. It n
5280: 6f 77 20 61 70 70 65 61 72 73 20 74 68 61 74 0a  ow appears that.
5290: 20 20 20 20 23 20 74 68 65 20 74 72 61 6e 73 61      # the transa
52a0: 63 74 69 6f 6e 20 77 61 73 20 63 6f 6d 6d 69 74  ction was commit
52b0: 74 65 64 20 28 6e 6f 20 6d 61 73 74 65 72 2d 6a  ted (no master-j
52c0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 3d 3d 20 6e  ournal file == n
52d0: 6f 20 72 6f 6c 6c 62 61 63 6b 29 2e 0a 20 20 20  o rollback)..   
52e0: 20 23 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 70   #.    do_test p
52f0: 61 67 65 72 31 2d 34 2e 34 2e 24 74 6e 2e 37 20  ager1-4.4.$tn.7 
5300: 7b 0a 20 20 20 20 20 20 66 61 75 6c 74 73 69 6d  {.      faultsim
5310: 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f  _restore_and_reo
5320: 70 65 6e 20 24 70 72 65 66 69 78 0a 20 20 20 20  pen $prefix.    
5330: 20 20 66 6f 72 65 61 63 68 20 66 20 5b 67 6c 6f    foreach f [glo
5340: 62 20 24 7b 70 72 65 66 69 78 7d 2d 6d 6a 2a 5d  b ${prefix}-mj*]
5350: 20 7b 20 66 6f 72 63 65 64 65 6c 65 74 65 20 24   { forcedelete $
5360: 66 20 7d 0a 20 20 20 20 20 20 65 78 65 63 73 71  f }.      execsq
5370: 6c 20 22 41 54 54 41 43 48 20 27 24 7b 70 72 65  l "ATTACH '${pre
5380: 66 69 78 7d 32 27 20 41 53 20 61 75 78 22 0a 20  fix}2' AS aux". 
5390: 20 20 20 7d 20 7b 7d 0a 20 20 20 20 64 6f 5f 65     } {}.    do_e
53a0: 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65  xecsql_test page
53b0: 72 31 2d 34 2e 34 2e 24 74 6e 2e 38 20 7b 0a 20  r1-4.4.$tn.8 {. 
53c0: 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52       SELECT * FR
53d0: 4f 4d 20 61 0a 20 20 20 20 7d 20 7b 64 6f 75 62  OM a.    } {doub
53e0: 6c 65 2d 79 6f 75 20 77 68 79 20 7a 65 64 20 77  le-you why zed w
53f0: 6f 6e 20 74 6f 6f 20 66 72 65 65 7d 0a 20 20 20  on too free}.   
5400: 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74   do_execsql_test
5410: 20 70 61 67 65 72 31 2d 34 2e 34 2e 24 74 6e 2e   pager1-4.4.$tn.
5420: 39 20 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54  9 {.      SELECT
5430: 20 2a 20 46 52 4f 4d 20 62 0a 20 20 20 20 7d 20   * FROM b.    } 
5440: 7b 77 6f 6e 20 74 6f 6f 20 66 72 65 65 20 64 6f  {won too free do
5450: 75 62 6c 65 2d 79 6f 75 20 77 68 79 20 7a 65 64  uble-you why zed
5460: 7d 0a 20 20 7d 0a 0a 20 20 63 64 20 24 70 77 64  }.  }..  cd $pwd
5470: 0a 7d 0a 64 62 20 63 6c 6f 73 65 0a 74 76 20 64  .}.db close.tv d
5480: 65 6c 65 74 65 0a 66 6f 72 63 65 64 65 6c 65 74  elete.forcedelet
5490: 65 20 24 64 69 72 6e 61 6d 65 0a 0a 0a 23 20 53  e $dirname...# S
54a0: 65 74 20 75 70 20 61 20 56 46 53 20 74 6f 20 6d  et up a VFS to m
54b0: 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ake a copy of th
54c0: 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 6a 75  e file-system ju
54d0: 73 74 20 62 65 66 6f 72 65 20 64 65 6c 65 74 69  st before deleti
54e0: 6e 67 20 61 0a 23 20 6a 6f 75 72 6e 61 6c 20 66  ng a.# journal f
54f0: 69 6c 65 20 74 6f 20 63 6f 6d 6d 69 74 20 61 20  ile to commit a 
5500: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65  transaction. The
5510: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 6f 64   transaction mod
5520: 69 66 69 65 73 20 65 78 61 63 74 6c 79 0a 23 20  ifies exactly.# 
5530: 74 77 6f 20 64 61 74 61 62 61 73 65 20 70 61 67  two database pag
5540: 65 73 20 28 61 6e 64 20 70 61 67 65 20 31 20 2d  es (and page 1 -
5550: 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e   the change coun
5560: 74 65 72 29 2e 0a 23 0a 74 65 73 74 76 66 73 20  ter)..#.testvfs 
5570: 74 76 20 2d 64 65 66 61 75 6c 74 20 31 0a 74 76  tv -default 1.tv
5580: 20 73 65 63 74 6f 72 73 69 7a 65 20 35 31 32 0a   sectorsize 512.
5590: 74 76 20 73 63 72 69 70 74 20 63 6f 70 79 5f 6f  tv script copy_o
55a0: 6e 5f 6a 6f 75 72 6e 61 6c 5f 64 65 6c 65 74 65  n_journal_delete
55b0: 0a 74 76 20 66 69 6c 74 65 72 20 78 44 65 6c 65  .tv filter xDele
55c0: 74 65 0a 70 72 6f 63 20 63 6f 70 79 5f 6f 6e 5f  te.proc copy_on_
55d0: 6a 6f 75 72 6e 61 6c 5f 64 65 6c 65 74 65 20 7b  journal_delete {
55e0: 6d 65 74 68 6f 64 20 66 69 6c 65 6e 61 6d 65 20  method filename 
55f0: 61 72 67 73 7d 20 7b 0a 20 20 69 66 20 7b 5b 73  args} {.  if {[s
5600: 74 72 69 6e 67 20 6d 61 74 63 68 20 2a 6a 6f 75  tring match *jou
5610: 72 6e 61 6c 20 24 66 69 6c 65 6e 61 6d 65 5d 7d  rnal $filename]}
5620: 20 66 61 75 6c 74 73 69 6d 5f 73 61 76 65 20 0a   faultsim_save .
5630: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
5640: 4f 4b 0a 7d 0a 66 61 75 6c 74 73 69 6d 5f 64 65  OK.}.faultsim_de
5650: 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a  lete_and_reopen.
5660: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
5670: 70 61 67 65 72 31 2e 34 2e 35 2e 31 20 7b 0a 20  pager1.4.5.1 {. 
5680: 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f   PRAGMA journal_
5690: 6d 6f 64 65 20 3d 20 44 45 4c 45 54 45 3b 0a 20  mode = DELETE;. 
56a0: 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a   PRAGMA page_siz
56b0: 65 20 3d 20 31 30 32 34 3b 0a 20 20 43 52 45 41  e = 1024;.  CREA
56c0: 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62  TE TABLE t1(a, b
56d0: 29 3b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c  );.  CREATE TABL
56e0: 45 20 74 32 28 61 2c 20 62 29 3b 0a 20 20 49 4e  E t2(a, b);.  IN
56f0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
5700: 55 45 53 28 27 49 27 2c 20 27 49 49 27 29 3b 0a  UES('I', 'II');.
5710: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32    INSERT INTO t2
5720: 20 56 41 4c 55 45 53 28 27 49 49 49 27 2c 20 27   VALUES('III', '
5730: 49 56 27 29 3b 0a 20 20 42 45 47 49 4e 3b 0a 20  IV');.  BEGIN;. 
5740: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
5750: 31 20 56 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a  1 VALUES(1, 2);.
5760: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
5770: 74 32 20 56 41 4c 55 45 53 28 33 2c 20 34 29 3b  t2 VALUES(3, 4);
5780: 0a 20 20 43 4f 4d 4d 49 54 3b 0a 7d 20 7b 64 65  .  COMMIT;.} {de
5790: 6c 65 74 65 7d 0a 74 76 20 66 69 6c 74 65 72 20  lete}.tv filter 
57a0: 7b 7d 0a 0a 23 20 43 68 65 63 6b 20 74 68 65 20  {}..# Check the 
57b0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
57c0: 63 6f 6d 6d 69 74 74 65 64 3a 0a 23 0a 64 6f 5f  committed:.#.do_
57d0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67  execsql_test pag
57e0: 65 72 31 2e 34 2e 35 2e 32 20 7b 0a 20 20 53 45  er1.4.5.2 {.  SE
57f0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a  LECT * FROM t1;.
5800: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
5810: 74 32 3b 0a 7d 20 7b 49 20 49 49 20 31 20 32 20  t2;.} {I II 1 2 
5820: 49 49 49 20 49 56 20 33 20 34 7d 0a 0a 23 20 4e  III IV 3 4}..# N
5830: 6f 77 20 74 72 79 20 66 6f 75 72 20 74 65 73 74  ow try four test
5840: 73 3a 0a 23 0a 23 20 20 70 61 67 65 72 31 2d 34  s:.#.#  pager1-4
5850: 2e 35 2e 33 3a 20 52 65 73 74 6f 72 65 20 74 68  .5.3: Restore th
5860: 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e 20 43  e file-system. C
5870: 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 77 68  heck that the wh
5880: 6f 6c 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ole transaction 
5890: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
58a0: 20 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b    is rolled back
58b0: 2e 0a 23 0a 23 20 20 70 61 67 65 72 31 2d 34 2e  ..#.#  pager1-4.
58c0: 35 2e 34 3a 20 52 65 73 74 6f 72 65 20 74 68 65  5.4: Restore the
58d0: 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e 20 43 6f   file-system. Co
58e0: 72 72 75 70 74 20 74 68 65 20 66 69 72 73 74 20  rrupt the first 
58f0: 72 65 63 6f 72 64 20 69 6e 20 74 68 65 0a 23 20  record in the.# 
5900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6a                 j
5910: 6f 75 72 6e 61 6c 2e 20 43 68 65 63 6b 20 74 68  ournal. Check th
5920: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
5930: 20 6e 6f 74 20 72 6f 6c 6c 65 64 20 62 61 63 6b   not rolled back
5940: 2e 0a 23 0a 23 20 20 70 61 67 65 72 31 2d 34 2e  ..#.#  pager1-4.
5950: 35 2e 35 3a 20 52 65 73 74 6f 72 65 20 74 68 65  5.5: Restore the
5960: 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e 20 43 6f   file-system. Co
5970: 72 72 75 70 74 20 74 68 65 20 73 65 63 6f 6e 64  rrupt the second
5980: 20 72 65 63 6f 72 64 20 69 6e 20 74 68 65 0a 23   record in the.#
5990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
59a0: 6a 6f 75 72 6e 61 6c 2e 20 43 68 65 63 6b 20 74  journal. Check t
59b0: 68 61 74 20 74 68 65 20 66 69 72 73 74 20 72 65  hat the first re
59c0: 63 6f 72 64 20 69 6e 20 74 68 65 20 74 72 61 6e  cord in the tran
59d0: 73 61 63 74 69 6f 6e 20 69 73 20 0a 23 20 20 20  saction is .#   
59e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 6c 61               pla
59f0: 79 65 64 20 62 61 63 6b 2c 20 62 75 74 20 6e 6f  yed back, but no
5a00: 74 20 74 68 65 20 73 65 63 6f 6e 64 2e 0a 23 0a  t the second..#.
5a10: 23 20 20 70 61 67 65 72 31 2d 34 2e 35 2e 36 3a  #  pager1-4.5.6:
5a20: 20 52 65 73 74 6f 72 65 20 74 68 65 20 66 69 6c   Restore the fil
5a30: 65 2d 73 79 73 74 65 6d 2e 20 54 72 79 20 74 6f  e-system. Try to
5a40: 20 6f 70 65 6e 20 74 68 65 20 64 61 74 61 62 61   open the databa
5a50: 73 65 20 77 69 74 68 20 61 0a 23 20 20 20 20 20  se with a.#     
5a60: 20 20 20 20 20 20 20 20 20 20 20 72 65 61 64 6f             reado
5a70: 6e 6c 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20  nly connection. 
5a80: 54 68 69 73 20 73 68 6f 75 6c 64 20 66 61 69 6c  This should fail
5a90: 2c 20 61 73 20 61 20 72 65 61 64 2d 6f 6e 6c 79  , as a read-only
5aa0: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
5ab0: 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 61 6e    connection can
5ac0: 6e 6f 74 20 72 6f 6c 6c 20 62 61 63 6b 20 74 68  not roll back th
5ad0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
5ae0: 0a 23 0a 66 61 75 6c 74 73 69 6d 5f 72 65 73 74  .#.faultsim_rest
5af0: 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 64  ore_and_reopen.d
5b00: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70  o_execsql_test p
5b10: 61 67 65 72 31 2e 34 2e 35 2e 33 20 7b 0a 20 20  ager1.4.5.3 {.  
5b20: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
5b30: 3b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  ;.  SELECT * FRO
5b40: 4d 20 74 32 3b 0a 7d 20 7b 49 20 49 49 20 49 49  M t2;.} {I II II
5b50: 49 20 49 56 7d 0a 66 61 75 6c 74 73 69 6d 5f 72  I IV}.faultsim_r
5b60: 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65  estore_and_reope
5b70: 6e 0a 68 65 78 69 6f 5f 77 72 69 74 65 20 74 65  n.hexio_write te
5b80: 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 5b 65  st.db-journal [e
5b90: 78 70 72 20 35 31 32 2b 34 2b 31 30 32 34 20 2d  xpr 512+4+1024 -
5ba0: 20 32 30 32 5d 20 30 31 32 33 34 35 36 37 38 39   202] 0123456789
5bb0: 41 42 43 44 45 46 0a 64 6f 5f 65 78 65 63 73 71  ABCDEF.do_execsq
5bc0: 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e  l_test pager1.4.
5bd0: 35 2e 34 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a  5.4 {.  SELECT *
5be0: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 53 45 4c 45   FROM t1;.  SELE
5bf0: 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 7d 20  CT * FROM t2;.} 
5c00: 7b 49 20 49 49 20 31 20 32 20 49 49 49 20 49 56  {I II 1 2 III IV
5c10: 20 33 20 34 7d 0a 66 61 75 6c 74 73 69 6d 5f 72   3 4}.faultsim_r
5c20: 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65  estore_and_reope
5c30: 6e 0a 68 65 78 69 6f 5f 77 72 69 74 65 20 74 65  n.hexio_write te
5c40: 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 5b 65  st.db-journal [e
5c50: 78 70 72 20 35 31 32 2b 34 2b 31 30 32 34 2b 34  xpr 512+4+1024+4
5c60: 2b 34 2b 31 30 32 34 20 2d 20 32 30 32 5d 20 30  +4+1024 - 202] 0
5c70: 31 32 33 34 35 36 37 38 39 41 42 43 44 45 46 0a  123456789ABCDEF.
5c80: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
5c90: 70 61 67 65 72 31 2e 34 2e 35 2e 35 20 7b 0a 20  pager1.4.5.5 {. 
5ca0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
5cb0: 31 3b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52  1;.  SELECT * FR
5cc0: 4f 4d 20 74 32 3b 0a 7d 20 7b 49 20 49 49 20 49  OM t2;.} {I II I
5cd0: 49 49 20 49 56 20 33 20 34 7d 0a 0a 66 61 75 6c  II IV 3 4}..faul
5ce0: 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64  tsim_restore_and
5cf0: 5f 72 65 6f 70 65 6e 0a 64 62 20 63 6c 6f 73 65  _reopen.db close
5d00: 0a 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74  .sqlite3 db test
5d10: 2e 64 62 20 2d 72 65 61 64 6f 6e 6c 79 20 31 0a  .db -readonly 1.
5d20: 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74 65 73 74  do_catchsql_test
5d30: 20 70 61 67 65 72 31 2e 34 2e 35 2e 36 20 7b 0a   pager1.4.5.6 {.
5d40: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
5d50: 74 31 3b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46  t1;.  SELECT * F
5d60: 52 4f 4d 20 74 32 3b 0a 7d 20 7b 31 20 7b 64 69  ROM t2;.} {1 {di
5d70: 73 6b 20 49 2f 4f 20 65 72 72 6f 72 7d 7d 0a 64  sk I/O error}}.d
5d80: 62 20 63 6c 6f 73 65 0a 0a 23 20 53 6e 61 70 73  b close..# Snaps
5d90: 68 6f 74 20 74 68 65 20 66 69 6c 65 2d 73 79 73  hot the file-sys
5da0: 74 65 6d 20 6a 75 73 74 20 62 65 66 6f 72 65 20  tem just before 
5db0: 6d 75 6c 74 69 2d 66 69 6c 65 20 63 6f 6d 6d 69  multi-file commi
5dc0: 74 2e 20 53 61 76 65 20 74 68 65 20 6e 61 6d 65  t. Save the name
5dd0: 0a 23 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72  .# of the master
5de0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e   journal file in
5df0: 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 2e   $::mj_filename.
5e00: 0a 23 0a 74 76 20 73 63 72 69 70 74 20 63 6f 70  .#.tv script cop
5e10: 79 5f 6f 6e 5f 6d 6a 5f 64 65 6c 65 74 65 0a 74  y_on_mj_delete.t
5e20: 76 20 66 69 6c 74 65 72 20 78 44 65 6c 65 74 65  v filter xDelete
5e30: 0a 70 72 6f 63 20 63 6f 70 79 5f 6f 6e 5f 6d 6a  .proc copy_on_mj
5e40: 5f 64 65 6c 65 74 65 20 7b 6d 65 74 68 6f 64 20  _delete {method 
5e50: 66 69 6c 65 6e 61 6d 65 20 61 72 67 73 7d 20 7b  filename args} {
5e60: 0a 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6d  .  if {[string m
5e70: 61 74 63 68 20 2a 6d 6a 2a 20 5b 66 69 6c 65 20  atch *mj* [file 
5e80: 74 61 69 6c 20 24 66 69 6c 65 6e 61 6d 65 5d 5d  tail $filename]]
5e90: 7d 20 7b 20 0a 20 20 20 20 73 65 74 20 3a 3a 6d  } { .    set ::m
5ea0: 6a 5f 66 69 6c 65 6e 61 6d 65 20 24 66 69 6c 65  j_filename $file
5eb0: 6e 61 6d 65 0a 20 20 20 20 66 61 75 6c 74 73 69  name.    faultsi
5ec0: 6d 5f 73 61 76 65 20 0a 20 20 7d 0a 20 20 72 65  m_save .  }.  re
5ed0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 7d  turn SQLITE_OK.}
5ee0: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2e  .do_test pager1.
5ef0: 34 2e 36 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73  4.6.1 {.  faults
5f00: 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65  im_delete_and_re
5f10: 6f 70 65 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b  open.  execsql {
5f20: 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72  .    PRAGMA jour
5f30: 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c 45 54  nal_mode = DELET
5f40: 45 3b 0a 20 20 20 20 41 54 54 41 43 48 20 27 74  E;.    ATTACH 't
5f50: 65 73 74 2e 64 62 32 27 20 41 53 20 74 77 6f 3b  est.db2' AS two;
5f60: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
5f70: 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20  E t1(a, b);.    
5f80: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 77 6f  CREATE TABLE two
5f90: 2e 74 32 28 61 2c 20 62 29 3b 0a 20 20 20 20 49  .t2(a, b);.    I
5fa0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
5fb0: 4c 55 45 53 28 31 2c 20 27 74 31 2e 31 27 29 3b  LUES(1, 't1.1');
5fc0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
5fd0: 20 74 32 20 56 41 4c 55 45 53 28 31 2c 20 27 74   t2 VALUES(1, 't
5fe0: 32 2e 31 27 29 3b 0a 20 20 20 20 42 45 47 49 4e  2.1');.    BEGIN
5ff0: 3b 0a 20 20 20 20 20 20 55 50 44 41 54 45 20 74  ;.      UPDATE t
6000: 31 20 53 45 54 20 62 20 3d 20 27 74 31 2e 32 27  1 SET b = 't1.2'
6010: 3b 0a 20 20 20 20 20 20 55 50 44 41 54 45 20 74  ;.      UPDATE t
6020: 32 20 53 45 54 20 62 20 3d 20 27 74 32 2e 32 27  2 SET b = 't2.2'
6030: 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20  ;.    COMMIT;.  
6040: 7d 0a 20 20 74 76 20 66 69 6c 74 65 72 20 7b 7d  }.  tv filter {}
6050: 0a 20 20 64 62 20 63 6c 6f 73 65 0a 7d 20 7b 7d  .  db close.} {}
6060: 0a 0a 66 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f  ..faultsim_resto
6070: 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 64 6f  re_and_reopen.do
6080: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61  _execsql_test pa
6090: 67 65 72 31 2e 34 2e 36 2e 32 20 7b 20 53 45 4c  ger1.4.6.2 { SEL
60a0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20  ECT * FROM t1 } 
60b0: 20 20 20 20 20 20 20 20 20 20 7b 31 20 74 31 2e            {1 t1.
60c0: 31 7d 0a 64 6f 5f 74 65 73 74 20 20 20 20 20 20  1}.do_test      
60d0: 20 20 20 70 61 67 65 72 31 2e 34 2e 36 2e 33 20     pager1.4.6.3 
60e0: 7b 20 66 69 6c 65 20 65 78 69 73 74 73 20 24 3a  { file exists $:
60f0: 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 20 7d 20 7b  :mj_filename } {
6100: 31 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  1}.do_execsql_te
6110: 73 74 20 70 61 67 65 72 31 2e 34 2e 36 2e 34 20  st pager1.4.6.4 
6120: 7b 0a 20 20 41 54 54 41 43 48 20 27 74 65 73 74  {.  ATTACH 'test
6130: 2e 64 62 32 27 20 41 53 20 74 77 6f 3b 0a 20 20  .db2' AS two;.  
6140: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32  SELECT * FROM t2
6150: 3b 0a 7d 20 7b 31 20 74 32 2e 31 7d 0a 64 6f 5f  ;.} {1 t2.1}.do_
6160: 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e 36 2e  test pager1.4.6.
6170: 35 20 7b 20 66 69 6c 65 20 65 78 69 73 74 73 20  5 { file exists 
6180: 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 20 7d  $::mj_filename }
6190: 20 7b 30 7d 0a 0a 66 61 75 6c 74 73 69 6d 5f 72   {0}..faultsim_r
61a0: 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65  estore_and_reope
61b0: 6e 0a 64 62 20 63 6c 6f 73 65 0a 64 6f 5f 74 65  n.db close.do_te
61c0: 73 74 20 70 61 67 65 72 31 2e 34 2e 36 2e 38 20  st pager1.4.6.8 
61d0: 7b 0a 20 20 73 65 74 20 3a 3a 6d 6a 5f 66 69 6c  {.  set ::mj_fil
61e0: 65 6e 61 6d 65 31 20 24 3a 3a 6d 6a 5f 66 69 6c  ename1 $::mj_fil
61f0: 65 6e 61 6d 65 0a 20 20 74 76 20 66 69 6c 74 65  ename.  tv filte
6200: 72 20 78 44 65 6c 65 74 65 0a 20 20 73 71 6c 69  r xDelete.  sqli
6210: 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 32 0a  te3 db test.db2.
6220: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
6230: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
6240: 6f 64 65 20 3d 20 44 45 4c 45 54 45 3b 0a 20 20  ode = DELETE;.  
6250: 20 20 41 54 54 41 43 48 20 27 74 65 73 74 2e 64    ATTACH 'test.d
6260: 62 33 27 20 41 53 20 74 68 72 65 65 3b 0a 20 20  b3' AS three;.  
6270: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
6280: 68 72 65 65 2e 74 33 28 61 2c 20 62 29 3b 0a 20  hree.t3(a, b);. 
6290: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
62a0: 33 20 56 41 4c 55 45 53 28 31 2c 20 27 74 33 2e  3 VALUES(1, 't3.
62b0: 31 27 29 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a  1');.    BEGIN;.
62c0: 20 20 20 20 20 20 55 50 44 41 54 45 20 74 32 20        UPDATE t2 
62d0: 53 45 54 20 62 20 3d 20 27 74 32 2e 33 27 3b 0a  SET b = 't2.3';.
62e0: 20 20 20 20 20 20 55 50 44 41 54 45 20 74 33 20        UPDATE t3 
62f0: 53 45 54 20 62 20 3d 20 27 74 33 2e 33 27 3b 0a  SET b = 't3.3';.
6300: 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a      COMMIT;.  }.
6310: 20 20 65 78 70 72 20 7b 24 3a 3a 6d 6a 5f 66 69    expr {$::mj_fi
6320: 6c 65 6e 61 6d 65 31 20 21 3d 20 24 3a 3a 6d 6a  lename1 != $::mj
6330: 5f 66 69 6c 65 6e 61 6d 65 7d 0a 7d 20 7b 31 7d  _filename}.} {1}
6340: 0a 66 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72  .faultsim_restor
6350: 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 74 76 20  e_and_reopen.tv 
6360: 66 69 6c 74 65 72 20 7b 7d 0a 0a 23 20 54 68 65  filter {}..# The
6370: 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 6e 6f 77   file-system now
6380: 20 63 6f 6e 74 61 69 6e 73 3a 0a 23 0a 23 20 20   contains:.#.#  
6390: 20 2a 20 74 68 72 65 65 20 64 61 74 61 62 61 73   * three databas
63a0: 65 73 0a 23 20 20 20 2a 20 74 68 72 65 65 20 68  es.#   * three h
63b0: 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  ot-journal files
63c0: 0a 23 20 20 20 2a 20 74 77 6f 20 6d 61 73 74 65  .#   * two maste
63d0: 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e  r-journal files.
63e0: 0a 23 0a 23 20 54 68 65 20 68 6f 74 2d 6a 6f 75  .#.# The hot-jou
63f0: 72 6e 61 6c 73 20 61 73 73 6f 63 69 61 74 65 64  rnals associated
6400: 20 77 69 74 68 20 74 65 73 74 2e 64 62 32 20 61   with test.db2 a
6410: 6e 64 20 74 65 73 74 2e 64 62 33 20 70 6f 69 6e  nd test.db3 poin
6420: 74 20 74 6f 0a 23 20 6d 61 73 74 65 72 20 6a 6f  t to.# master jo
6430: 75 72 6e 61 6c 20 24 3a 3a 6d 6a 5f 66 69 6c 65  urnal $::mj_file
6440: 6e 61 6d 65 2e 20 54 68 65 20 68 6f 74 2d 6a 6f  name. The hot-jo
6450: 75 72 6e 61 6c 20 66 69 6c 65 20 61 73 73 6f 63  urnal file assoc
6460: 69 61 74 65 64 20 77 69 74 68 0a 23 20 74 65 73  iated with.# tes
6470: 74 2e 64 62 20 70 6f 69 6e 74 73 20 74 6f 20 6d  t.db points to m
6480: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 24 3a  aster journal $:
6490: 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 31 2e 20 53  :mj_filename1. S
64a0: 6f 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 0a 23  o reading from.#
64b0: 20 74 65 73 74 2e 64 62 20 73 68 6f 75 6c 64 20   test.db should 
64c0: 64 65 6c 65 74 65 20 24 3a 3a 6d 6a 5f 66 69 6c  delete $::mj_fil
64d0: 65 6e 61 6d 65 31 2e 0a 23 0a 64 6f 5f 74 65 73  ename1..#.do_tes
64e0: 74 20 70 61 67 65 72 31 2e 34 2e 36 2e 39 20 7b  t pager1.4.6.9 {
64f0: 0a 20 20 6c 73 6f 72 74 20 5b 67 6c 6f 62 20 74  .  lsort [glob t
6500: 65 73 74 2e 64 62 2a 5d 0a 7d 20 5b 6c 73 6f 72  est.db*].} [lsor
6510: 74 20 5b 6c 69 73 74 20 20 20 20 20 20 20 20 20  t [list         
6520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6540: 20 20 5c 0a 20 20 74 65 73 74 2e 64 62 20 74 65    \.  test.db te
6550: 73 74 2e 64 62 32 20 74 65 73 74 2e 64 62 33 20  st.db2 test.db3 
6560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6570: 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
6580: 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c   test.db-journal
6590: 20 74 65 73 74 2e 64 62 32 2d 6a 6f 75 72 6e 61   test.db2-journa
65a0: 6c 20 74 65 73 74 2e 64 62 33 2d 6a 6f 75 72 6e  l test.db3-journ
65b0: 61 6c 20 20 20 20 20 20 5c 0a 20 20 5b 66 69 6c  al      \.  [fil
65c0: 65 20 74 61 69 6c 20 24 3a 3a 6d 6a 5f 66 69 6c  e tail $::mj_fil
65d0: 65 6e 61 6d 65 5d 20 5b 66 69 6c 65 20 74 61 69  ename] [file tai
65e0: 6c 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65  l $::mj_filename
65f0: 31 5d 0a 5d 5d 0a 0a 23 20 54 68 65 20 6d 61 73  1].]]..# The mas
6600: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 24 3a 3a 6d  ter-journal $::m
6610: 6a 5f 66 69 6c 65 6e 61 6d 65 31 20 63 6f 6e 74  j_filename1 cont
6620: 61 69 6e 73 20 70 6f 69 6e 74 65 72 73 20 74 6f  ains pointers to
6630: 20 74 65 73 74 2e 64 62 20 61 6e 64 20 0a 23 20   test.db and .# 
6640: 74 65 73 74 2e 64 62 32 2e 20 48 6f 77 65 76 65  test.db2. Howeve
6650: 72 20 74 68 65 20 68 6f 74 2d 6a 6f 75 72 6e 61  r the hot-journa
6660: 6c 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  l associated wit
6670: 68 20 74 65 73 74 2e 64 62 32 20 70 6f 69 6e 74  h test.db2 point
6680: 73 20 74 6f 0a 23 20 61 20 64 69 66 66 65 72 65  s to.# a differe
6690: 6e 74 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  nt master-journa
66a0: 6c 2e 20 54 68 65 72 65 66 6f 72 65 2c 20 72 65  l. Therefore, re
66b0: 61 64 69 6e 67 20 66 72 6f 6d 20 74 65 73 74 2e  ading from test.
66c0: 64 62 20 6f 6e 6c 79 20 73 68 6f 75 6c 64 0a 23  db only should.#
66d0: 20 62 65 20 65 6e 6f 75 67 68 20 74 6f 20 63 61   be enough to ca
66e0: 75 73 65 20 53 51 4c 69 74 65 20 74 6f 20 64 65  use SQLite to de
66f0: 6c 65 74 65 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e  lete $::mj_filen
6700: 61 6d 65 31 2e 0a 23 0a 64 6f 5f 74 65 73 74 20  ame1..#.do_test 
6710: 20 20 20 20 20 20 20 20 70 61 67 65 72 31 2e 34          pager1.4
6720: 2e 36 2e 31 30 20 7b 20 66 69 6c 65 20 65 78 69  .6.10 { file exi
6730: 73 74 73 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61  sts $::mj_filena
6740: 6d 65 20 20 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73  me  } {1}.do_tes
6750: 74 20 20 20 20 20 20 20 20 20 70 61 67 65 72 31  t         pager1
6760: 2e 34 2e 36 2e 31 31 20 7b 20 66 69 6c 65 20 65  .4.6.11 { file e
6770: 78 69 73 74 73 20 24 3a 3a 6d 6a 5f 66 69 6c 65  xists $::mj_file
6780: 6e 61 6d 65 31 20 7d 20 7b 31 7d 0a 64 6f 5f 65  name1 } {1}.do_e
6790: 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65  xecsql_test page
67a0: 72 31 2e 34 2e 36 2e 31 32 20 7b 20 53 45 4c 45  r1.4.6.12 { SELE
67b0: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7b  CT * FROM t1 } {
67c0: 31 20 74 31 2e 31 7d 0a 64 6f 5f 74 65 73 74 20  1 t1.1}.do_test 
67d0: 20 20 20 20 20 20 20 20 70 61 67 65 72 31 2e 34          pager1.4
67e0: 2e 36 2e 31 33 20 7b 20 66 69 6c 65 20 65 78 69  .6.13 { file exi
67f0: 73 74 73 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61  sts $::mj_filena
6800: 6d 65 20 20 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73  me  } {1}.do_tes
6810: 74 20 20 20 20 20 20 20 20 20 70 61 67 65 72 31  t         pager1
6820: 2e 34 2e 36 2e 31 34 20 7b 20 66 69 6c 65 20 65  .4.6.14 { file e
6830: 78 69 73 74 73 20 24 3a 3a 6d 6a 5f 66 69 6c 65  xists $::mj_file
6840: 6e 61 6d 65 31 20 7d 20 7b 30 7d 0a 0a 64 6f 5f  name1 } {0}..do_
6850: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67  execsql_test pag
6860: 65 72 31 2e 34 2e 36 2e 31 32 20 7b 0a 20 20 41  er1.4.6.12 {.  A
6870: 54 54 41 43 48 20 27 74 65 73 74 2e 64 62 32 27  TTACH 'test.db2'
6880: 20 41 53 20 74 77 6f 3b 0a 20 20 53 45 4c 45 43   AS two;.  SELEC
6890: 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 7d 20 7b  T * FROM t2;.} {
68a0: 31 20 74 32 2e 31 7d 0a 64 6f 5f 74 65 73 74 20  1 t2.1}.do_test 
68b0: 20 20 20 20 20 20 20 20 70 61 67 65 72 31 2e 34          pager1.4
68c0: 2e 36 2e 31 33 20 7b 20 66 69 6c 65 20 65 78 69  .6.13 { file exi
68d0: 73 74 73 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61  sts $::mj_filena
68e0: 6d 65 20 7d 20 20 7b 31 7d 0a 64 6f 5f 65 78 65  me }  {1}.do_exe
68f0: 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31  csql_test pager1
6900: 2e 34 2e 36 2e 31 34 20 7b 0a 20 20 41 54 54 41  .4.6.14 {.  ATTA
6910: 43 48 20 27 74 65 73 74 2e 64 62 33 27 20 41 53  CH 'test.db3' AS
6920: 20 74 68 72 65 65 3b 0a 20 20 53 45 4c 45 43 54   three;.  SELECT
6930: 20 2a 20 46 52 4f 4d 20 74 33 3b 0a 7d 20 7b 31   * FROM t3;.} {1
6940: 20 74 33 2e 31 7d 0a 64 6f 5f 74 65 73 74 20 20   t3.1}.do_test  
6950: 20 20 20 20 20 20 20 70 61 67 65 72 31 2e 34 2e         pager1.4.
6960: 36 2e 31 35 20 7b 20 66 69 6c 65 20 65 78 69 73  6.15 { file exis
6970: 74 73 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d  ts $::mj_filenam
6980: 65 20 7d 20 20 7b 30 7d 0a 0a 64 62 20 63 6c 6f  e }  {0}..db clo
6990: 73 65 0a 74 76 20 64 65 6c 65 74 65 0a 0a 74 65  se.tv delete..te
69a0: 73 74 76 66 73 20 74 76 20 2d 64 65 66 61 75 6c  stvfs tv -defaul
69b0: 74 20 31 0a 74 76 20 73 65 63 74 6f 72 73 69 7a  t 1.tv sectorsiz
69c0: 65 20 35 31 32 0a 74 76 20 73 63 72 69 70 74 20  e 512.tv script 
69d0: 63 6f 70 79 5f 6f 6e 5f 6a 6f 75 72 6e 61 6c 5f  copy_on_journal_
69e0: 64 65 6c 65 74 65 0a 74 76 20 66 69 6c 74 65 72  delete.tv filter
69f0: 20 78 44 65 6c 65 74 65 0a 70 72 6f 63 20 63 6f   xDelete.proc co
6a00: 70 79 5f 6f 6e 5f 6a 6f 75 72 6e 61 6c 5f 64 65  py_on_journal_de
6a10: 6c 65 74 65 20 7b 6d 65 74 68 6f 64 20 66 69 6c  lete {method fil
6a20: 65 6e 61 6d 65 20 61 72 67 73 7d 20 7b 0a 20 20  ename args} {.  
6a30: 69 66 20 7b 5b 73 74 72 69 6e 67 20 6d 61 74 63  if {[string matc
6a40: 68 20 2a 6a 6f 75 72 6e 61 6c 20 24 66 69 6c 65  h *journal $file
6a50: 6e 61 6d 65 5d 7d 20 66 61 75 6c 74 73 69 6d 5f  name]} faultsim_
6a60: 73 61 76 65 20 0a 20 20 72 65 74 75 72 6e 20 53  save .  return S
6a70: 51 4c 49 54 45 5f 4f 4b 0a 7d 0a 66 61 75 6c 74  QLITE_OK.}.fault
6a80: 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72  sim_delete_and_r
6a90: 65 6f 70 65 6e 0a 64 6f 5f 65 78 65 63 73 71 6c  eopen.do_execsql
6aa0: 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e 37  _test pager1.4.7
6ab0: 2e 31 20 7b 0a 20 20 50 52 41 47 4d 41 20 6a 6f  .1 {.  PRAGMA jo
6ac0: 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c  urnal_mode = DEL
6ad0: 45 54 45 3b 0a 20 20 43 52 45 41 54 45 20 54 41  ETE;.  CREATE TA
6ae0: 42 4c 45 20 74 31 28 78 20 50 52 49 4d 41 52 59  BLE t1(x PRIMARY
6af0: 20 4b 45 59 2c 20 79 29 3b 0a 20 20 43 52 45 41   KEY, y);.  CREA
6b00: 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74  TE INDEX i1 ON t
6b10: 31 28 79 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  1(y);.  INSERT I
6b20: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27 49  NTO t1 VALUES('I
6b30: 27 2c 20 20 20 27 6f 6e 65 27 29 3b 0a 20 20 49  ',   'one');.  I
6b40: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
6b50: 4c 55 45 53 28 27 49 49 27 2c 20 20 27 66 6f 75  LUES('II',  'fou
6b60: 72 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e  r');.  INSERT IN
6b70: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27 49 49  TO t1 VALUES('II
6b80: 49 27 2c 20 27 6e 69 6e 65 27 29 3b 0a 20 20 42  I', 'nine');.  B
6b90: 45 47 49 4e 3b 0a 20 20 20 20 49 4e 53 45 52 54  EGIN;.    INSERT
6ba0: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
6bb0: 27 49 56 27 2c 20 27 73 69 78 74 65 65 6e 27 29  'IV', 'sixteen')
6bc0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
6bd0: 4f 20 74 31 20 56 41 4c 55 45 53 28 27 56 27 20  O t1 VALUES('V' 
6be0: 2c 20 27 74 77 65 6e 74 79 66 69 76 65 27 29 3b  , 'twentyfive');
6bf0: 0a 20 20 43 4f 4d 4d 49 54 3b 0a 7d 20 7b 64 65  .  COMMIT;.} {de
6c00: 6c 65 74 65 7d 0a 74 76 20 66 69 6c 74 65 72 20  lete}.tv filter 
6c10: 7b 7d 0a 64 62 20 63 6c 6f 73 65 0a 74 76 20 64  {}.db close.tv d
6c20: 65 6c 65 74 65 20 0a 64 6f 5f 74 65 73 74 20 70  elete .do_test p
6c30: 61 67 65 72 31 2e 34 2e 37 2e 32 20 7b 0a 20 20  ager1.4.7.2 {.  
6c40: 66 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65  faultsim_restore
6c50: 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 63 61  _and_reopen.  ca
6c60: 74 63 68 20 7b 66 69 6c 65 20 61 74 74 72 69 62  tch {file attrib
6c70: 75 74 65 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75  utes test.db-jou
6c80: 72 6e 61 6c 20 2d 70 65 72 6d 69 73 73 69 6f 6e  rnal -permission
6c90: 73 20 72 2d 2d 2d 2d 2d 2d 2d 2d 7d 0a 20 20 63  s r--------}.  c
6ca0: 61 74 63 68 20 7b 66 69 6c 65 20 61 74 74 72 69  atch {file attri
6cb0: 62 75 74 65 73 20 74 65 73 74 2e 64 62 2d 6a 6f  butes test.db-jo
6cc0: 75 72 6e 61 6c 20 2d 72 65 61 64 6f 6e 6c 79 20  urnal -readonly 
6cd0: 31 7d 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20  1}.  catchsql { 
6ce0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
6cf0: 20 7d 0a 7d 20 7b 31 20 7b 75 6e 61 62 6c 65 20   }.} {1 {unable 
6d00: 74 6f 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65  to open database
6d10: 20 66 69 6c 65 7d 7d 0a 64 6f 5f 74 65 73 74 20   file}}.do_test 
6d20: 70 61 67 65 72 31 2e 34 2e 37 2e 33 20 7b 0a 20  pager1.4.7.3 {. 
6d30: 20 64 62 20 63 6c 6f 73 65 0a 20 20 63 61 74 63   db close.  catc
6d40: 68 20 7b 66 69 6c 65 20 61 74 74 72 69 62 75 74  h {file attribut
6d50: 65 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e  es test.db-journ
6d60: 61 6c 20 2d 70 65 72 6d 69 73 73 69 6f 6e 73 20  al -permissions 
6d70: 72 77 2d 72 77 2d 72 77 2d 7d 0a 20 20 63 61 74  rw-rw-rw-}.  cat
6d80: 63 68 20 7b 66 69 6c 65 20 61 74 74 72 69 62 75  ch {file attribu
6d90: 74 65 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72  tes test.db-jour
6da0: 6e 61 6c 20 2d 72 65 61 64 6f 6e 6c 79 20 30 7d  nal -readonly 0}
6db0: 0a 20 20 64 65 6c 65 74 65 5f 66 69 6c 65 20 74  .  delete_file t
6dc0: 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 20  est.db-journal. 
6dd0: 20 66 69 6c 65 20 65 78 69 73 74 73 20 74 65 73   file exists tes
6de0: 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 7d 20 7b  t.db-journal.} {
6df0: 30 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  0}..#-----------
6e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
6e40: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   The following t
6e50: 65 73 74 73 20 64 65 61 6c 20 77 69 74 68 20 6d  ests deal with m
6e60: 75 6c 74 69 2d 66 69 6c 65 20 63 6f 6d 6d 69 74  ulti-file commit
6e70: 73 2e 0a 23 0a 23 20 70 61 67 65 72 31 2d 35 2e  s..#.# pager1-5.
6e80: 31 2e 2a 3a 20 54 68 65 20 63 61 73 65 20 77 68  1.*: The case wh
6e90: 65 72 65 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65  ere a multi-file
6ea0: 20 63 61 6e 6e 6f 74 20 62 65 20 63 6f 6d 6d 69   cannot be commi
6eb0: 74 74 65 64 20 62 65 63 61 75 73 65 0a 23 20 20  tted because.#  
6ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 6e 6f               ano
6ed0: 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ther connection 
6ee0: 69 73 20 68 6f 6c 64 69 6e 67 20 61 20 53 48 41  is holding a SHA
6ef0: 52 45 44 20 6c 6f 63 6b 20 6f 6e 20 6f 6e 65 20  RED lock on one 
6f00: 6f 66 20 74 68 65 0a 23 20 20 20 20 20 20 20 20  of the.#        
6f10: 20 20 20 20 20 20 20 66 69 6c 65 73 2e 20 41 66         files. Af
6f20: 74 65 72 20 74 68 65 20 53 48 41 52 45 44 20 6c  ter the SHARED l
6f30: 6f 63 6b 20 69 73 20 72 65 6d 6f 76 65 64 2c 20  ock is removed, 
6f40: 74 68 65 20 43 4f 4d 4d 49 54 20 73 75 63 63 65  the COMMIT succe
6f50: 65 64 73 2e 0a 23 0a 23 20 70 61 67 65 72 31 2d  eds..#.# pager1-
6f60: 35 2e 32 2e 2a 3a 20 4d 75 6c 74 69 2d 66 69 6c  5.2.*: Multi-fil
6f70: 65 20 63 6f 6d 6d 69 74 73 20 77 69 74 68 20 6a  e commits with j
6f80: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 6d 65 6d 6f  ournal_mode=memo
6f90: 72 79 2e 0a 23 0a 23 20 70 61 67 65 72 31 2d 35  ry..#.# pager1-5
6fa0: 2e 33 2e 2a 3a 20 4d 75 6c 74 69 2d 66 69 6c 65  .3.*: Multi-file
6fb0: 20 63 6f 6d 6d 69 74 73 20 77 69 74 68 20 6a 6f   commits with jo
6fc0: 75 72 6e 61 6c 5f 6d 6f 64 65 3d 6d 65 6d 6f 72  urnal_mode=memor
6fd0: 79 2e 0a 23 0a 23 20 70 61 67 65 72 31 2d 35 2e  y..#.# pager1-5.
6fe0: 34 2e 2a 3a 20 43 68 65 63 6b 20 74 68 61 74 20  4.*: Check that 
6ff0: 77 69 74 68 20 73 79 6e 63 68 72 6f 6e 6f 75 73  with synchronous
7000: 3d 6e 6f 72 6d 61 6c 2c 20 74 68 65 20 6d 61 73  =normal, the mas
7010: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter-journal file
7020: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
7030: 20 6e 61 6d 65 20 69 73 20 61 64 64 65 64 20 74   name is added t
7040: 6f 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  o a journal file
7050: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74   immediately aft
7060: 65 72 20 74 68 65 20 6c 61 73 74 0a 23 20 20 20  er the last.#   
7070: 20 20 20 20 20 20 20 20 20 20 20 20 6a 6f 75 72              jour
7080: 6e 61 6c 20 72 65 63 6f 72 64 2e 20 42 75 74 20  nal record. But 
7090: 77 69 74 68 20 73 79 6e 63 68 72 6f 6e 6f 75 73  with synchronous
70a0: 3d 66 75 6c 6c 2c 20 65 78 74 72 61 20 75 6e 75  =full, extra unu
70b0: 73 65 64 20 73 70 61 63 65 0a 23 20 20 20 20 20  sed space.#     
70c0: 20 20 20 20 20 20 20 20 20 20 69 73 20 61 6c 6c            is all
70d0: 6f 63 61 74 65 64 20 62 65 74 77 65 65 6e 20 74  ocated between t
70e0: 68 65 20 6c 61 73 74 20 6a 6f 75 72 6e 61 6c 20  he last journal 
70f0: 72 65 63 6f 72 64 20 61 6e 64 20 74 68 65 20 0a  record and the .
7100: 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  #               
7110: 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66  master-journal f
7120: 69 6c 65 20 6e 61 6d 65 20 73 6f 20 74 68 61 74  ile name so that
7130: 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72   the master-jour
7140: 6e 61 6c 20 66 69 6c 65 0a 23 20 20 20 20 20 20  nal file.#      
7150: 20 20 20 20 20 20 20 20 20 6e 61 6d 65 20 64 6f           name do
7160: 65 73 20 6e 6f 74 20 6c 69 65 20 6f 6e 20 74 68  es not lie on th
7170: 65 20 73 61 6d 65 20 73 65 63 74 6f 72 20 61 73  e same sector as
7180: 20 74 68 65 20 6c 61 73 74 20 6a 6f 75 72 6e 61   the last journa
7190: 6c 20 66 69 6c 65 0a 23 20 20 20 20 20 20 20 20  l file.#        
71a0: 20 20 20 20 20 20 20 72 65 63 6f 72 64 2e 0a 23         record..#
71b0: 0a 23 20 70 61 67 65 72 31 2d 35 2e 35 2e 2a 3a  .# pager1-5.5.*:
71c0: 20 43 68 65 63 6b 20 74 68 61 74 20 69 6e 20 6a   Check that in j
71d0: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 50 45 52 53  ournal_mode=PERS
71e0: 49 53 54 20 6d 6f 64 65 2c 20 61 20 6a 6f 75 72  IST mode, a jour
71f0: 6e 61 6c 20 66 69 6c 65 20 69 73 0a 23 20 20 20  nal file is.#   
7200: 20 20 20 20 20 20 20 20 20 20 20 20 74 72 75 6e              trun
7210: 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 62 79  cated to zero by
7220: 74 65 73 20 77 68 65 6e 20 61 20 6d 75 6c 74 69  tes when a multi
7230: 2d 66 69 6c 65 20 74 72 61 6e 73 61 63 74 69 6f  -file transactio
7240: 6e 20 69 73 20 0a 23 20 20 20 20 20 20 20 20 20  n is .#         
7250: 20 20 20 20 20 20 63 6f 6d 6d 69 74 74 65 64 20        committed 
7260: 28 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20  (instead of the 
7270: 66 69 72 73 74 20 63 6f 75 70 6c 65 20 6f 66 20  first couple of 
7280: 62 79 74 65 73 20 62 65 69 6e 67 20 7a 65 72 6f  bytes being zero
7290: 65 64 29 2e 0a 23 0a 23 0a 64 6f 5f 74 65 73 74  ed)..#.#.do_test
72a0: 20 70 61 67 65 72 31 2d 35 2e 31 2e 31 20 7b 0a   pager1-5.1.1 {.
72b0: 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74    faultsim_delet
72c0: 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65  e_and_reopen.  e
72d0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 41 54 54  xecsql {.    ATT
72e0: 41 43 48 20 27 74 65 73 74 2e 64 62 32 27 20 41  ACH 'test.db2' A
72f0: 53 20 61 75 78 3b 0a 20 20 20 20 43 52 45 41 54  S aux;.    CREAT
7300: 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29  E TABLE t1(a, b)
7310: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
7320: 4c 45 20 61 75 78 2e 74 32 28 61 2c 20 62 29 3b  LE aux.t2(a, b);
7330: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
7340: 20 74 31 20 56 41 4c 55 45 53 28 31 37 2c 20 27   t1 VALUES(17, '
7350: 4c 65 6e 69 6e 27 29 3b 0a 20 20 20 20 49 4e 53  Lenin');.    INS
7360: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
7370: 45 53 28 32 32 2c 20 27 53 74 61 6c 69 6e 27 29  ES(22, 'Stalin')
7380: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
7390: 4f 20 74 31 20 56 41 4c 55 45 53 28 35 33 2c 20  O t1 VALUES(53, 
73a0: 27 4b 68 72 75 73 68 63 68 65 76 27 29 3b 0a 20  'Khrushchev');. 
73b0: 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20   }.} {}.do_test 
73c0: 70 61 67 65 72 31 2d 35 2e 31 2e 32 20 7b 0a 20  pager1-5.1.2 {. 
73d0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42   execsql {.    B
73e0: 45 47 49 4e 3b 0a 20 20 20 20 20 20 49 4e 53 45  EGIN;.      INSE
73f0: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
7400: 53 28 36 34 2c 20 27 42 72 65 7a 68 6e 65 76 27  S(64, 'Brezhnev'
7410: 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  );.      INSERT 
7420: 49 4e 54 4f 20 74 32 20 53 45 4c 45 43 54 20 2a  INTO t2 SELECT *
7430: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a 20 20   FROM t1;.  }.  
7440: 73 71 6c 69 74 65 33 20 64 62 32 20 74 65 73 74  sqlite3 db2 test
7450: 2e 64 62 32 0a 20 20 65 78 65 63 73 71 6c 20 7b  .db2.  execsql {
7460: 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20  .    BEGIN;.    
7470: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
7480: 74 32 3b 0a 20 20 7d 20 64 62 32 0a 7d 20 7b 7d  t2;.  } db2.} {}
7490: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
74a0: 35 2e 31 2e 33 20 7b 0a 20 20 63 61 74 63 68 73  5.1.3 {.  catchs
74b0: 71 6c 20 43 4f 4d 4d 49 54 0a 7d 20 7b 31 20 7b  ql COMMIT.} {1 {
74c0: 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b  database is lock
74d0: 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67  ed}}.do_test pag
74e0: 65 72 31 2d 35 2e 31 2e 34 20 7b 0a 20 20 65 78  er1-5.1.4 {.  ex
74f0: 65 63 73 71 6c 20 43 4f 4d 4d 49 54 20 64 62 32  ecsql COMMIT db2
7500: 0a 20 20 65 78 65 63 73 71 6c 20 43 4f 4d 4d 49  .  execsql COMMI
7510: 54 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45  T.  execsql { SE
7520: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 20 7d  LECT * FROM t2 }
7530: 20 64 62 32 0a 7d 20 7b 31 37 20 4c 65 6e 69 6e   db2.} {17 Lenin
7540: 20 32 32 20 53 74 61 6c 69 6e 20 35 33 20 4b 68   22 Stalin 53 Kh
7550: 72 75 73 68 63 68 65 76 20 36 34 20 42 72 65 7a  rushchev 64 Brez
7560: 68 6e 65 76 7d 0a 64 6f 5f 74 65 73 74 20 70 61  hnev}.do_test pa
7570: 67 65 72 31 2d 35 2e 31 2e 35 20 7b 0a 20 20 64  ger1-5.1.5 {.  d
7580: 62 32 20 63 6c 6f 73 65 0a 7d 20 7b 7d 0a 0a 64  b2 close.} {}..d
7590: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 35 2e  o_test pager1-5.
75a0: 32 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  2.1 {.  execsql 
75b0: 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75  {.    PRAGMA jou
75c0: 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 6d 65 6d 6f  rnal_mode = memo
75d0: 72 79 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20  ry;.    BEGIN;. 
75e0: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
75f0: 20 74 31 20 56 41 4c 55 45 53 28 38 34 2c 20 27   t1 VALUES(84, '
7600: 41 6e 64 72 6f 70 6f 76 27 29 3b 0a 20 20 20 20  Andropov');.    
7610: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32    INSERT INTO t2
7620: 20 56 41 4c 55 45 53 28 38 34 2c 20 27 41 6e 64   VALUES(84, 'And
7630: 72 6f 70 6f 76 27 29 3b 0a 20 20 20 20 43 4f 4d  ropov');.    COM
7640: 4d 49 54 3b 0a 20 20 7d 0a 7d 20 7b 6d 65 6d 6f  MIT;.  }.} {memo
7650: 72 79 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  ry}.do_test page
7660: 72 31 2d 35 2e 33 2e 31 20 7b 0a 20 20 65 78 65  r1-5.3.1 {.  exe
7670: 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d  csql {.    PRAGM
7680: 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d  A journal_mode =
7690: 20 6f 66 66 3b 0a 20 20 20 20 42 45 47 49 4e 3b   off;.    BEGIN;
76a0: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
76b0: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 38 35 2c  TO t1 VALUES(85,
76c0: 20 27 47 6f 72 62 61 63 68 65 76 27 29 3b 0a 20   'Gorbachev');. 
76d0: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
76e0: 20 74 32 20 56 41 4c 55 45 53 28 38 35 2c 20 27   t2 VALUES(85, '
76f0: 47 6f 72 62 61 63 68 65 76 27 29 3b 0a 20 20 20  Gorbachev');.   
7700: 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 7d 20 7b   COMMIT;.  }.} {
7710: 6f 66 66 7d 0a 0a 64 6f 5f 74 65 73 74 20 70 61  off}..do_test pa
7720: 67 65 72 31 2d 35 2e 34 2e 31 20 7b 0a 20 20 64  ger1-5.4.1 {.  d
7730: 62 20 63 6c 6f 73 65 0a 20 20 74 65 73 74 76 66  b close.  testvf
7740: 73 20 74 76 0a 20 20 73 71 6c 69 74 65 33 20 64  s tv.  sqlite3 d
7750: 62 20 74 65 73 74 2e 64 62 20 2d 76 66 73 20 74  b test.db -vfs t
7760: 76 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 41 54  v.  execsql { AT
7770: 54 41 43 48 20 27 74 65 73 74 2e 64 62 32 27 20  TACH 'test.db2' 
7780: 41 53 20 61 75 78 20 7d 0a 0a 20 20 74 76 20 66  AS aux }..  tv f
7790: 69 6c 74 65 72 20 78 44 65 6c 65 74 65 0a 20 20  ilter xDelete.  
77a0: 74 76 20 73 63 72 69 70 74 20 6d 61 78 5f 6a 6f  tv script max_jo
77b0: 75 72 6e 61 6c 5f 73 69 7a 65 0a 20 20 74 76 20  urnal_size.  tv 
77c0: 73 65 63 74 6f 72 73 69 7a 65 20 35 31 32 0a 20  sectorsize 512. 
77d0: 20 73 65 74 20 3a 3a 6d 61 78 5f 6a 6f 75 72 6e   set ::max_journ
77e0: 61 6c 20 30 0a 20 20 70 72 6f 63 20 6d 61 78 5f  al 0.  proc max_
77f0: 6a 6f 75 72 6e 61 6c 5f 73 69 7a 65 20 7b 6d 65  journal_size {me
7800: 74 68 6f 64 20 61 72 67 73 7d 20 7b 0a 20 20 20  thod args} {.   
7810: 20 73 65 74 20 73 7a 20 30 0a 20 20 20 20 63 61   set sz 0.    ca
7820: 74 63 68 20 7b 20 73 65 74 20 73 7a 20 5b 66 69  tch { set sz [fi
7830: 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 2d  le size test.db-
7840: 6a 6f 75 72 6e 61 6c 5d 20 7d 0a 20 20 20 20 69  journal] }.    i
7850: 66 20 7b 24 73 7a 20 3e 20 24 3a 3a 6d 61 78 5f  f {$sz > $::max_
7860: 6a 6f 75 72 6e 61 6c 7d 20 7b 0a 20 20 20 20 20  journal} {.     
7870: 20 73 65 74 20 3a 3a 6d 61 78 5f 6a 6f 75 72 6e   set ::max_journ
7880: 61 6c 20 24 73 7a 0a 20 20 20 20 7d 0a 20 20 20  al $sz.    }.   
7890: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
78a0: 4b 0a 20 20 7d 0a 20 20 65 78 65 63 73 71 6c 20  K.  }.  execsql 
78b0: 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75  {.    PRAGMA jou
78c0: 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c 45  rnal_mode = DELE
78d0: 54 45 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 73  TE;.    PRAGMA s
78e0: 79 6e 63 68 72 6f 6e 6f 75 73 20 3d 20 4e 4f 52  ynchronous = NOR
78f0: 4d 41 4c 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a  MAL;.    BEGIN;.
7900: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
7910: 4f 20 74 31 20 56 41 4c 55 45 53 28 38 35 2c 20  O t1 VALUES(85, 
7920: 27 47 6f 72 62 61 63 68 65 76 27 29 3b 0a 20 20  'Gorbachev');.  
7930: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
7940: 74 32 20 56 41 4c 55 45 53 28 38 35 2c 20 27 47  t2 VALUES(85, 'G
7950: 6f 72 62 61 63 68 65 76 27 29 3b 0a 20 20 20 20  orbachev');.    
7960: 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 0a 20 20 23  COMMIT;.  }..  #
7970: 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   The size of the
7980: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
7990: 20 6e 6f 77 3a 0a 20 20 23 20 0a 20 20 23 20 20   now:.  # .  #  
79a0: 20 31 29 20 35 31 32 20 62 79 74 65 20 68 65 61   1) 512 byte hea
79b0: 64 65 72 20 2b 0a 20 20 23 20 20 20 32 29 20 32  der +.  #   2) 2
79c0: 20 2a 20 28 31 30 32 34 2b 38 29 20 62 79 74 65   * (1024+8) byte
79d0: 20 72 65 63 6f 72 64 73 20 2b 0a 20 20 23 20 20   records +.  #  
79e0: 20 33 29 20 32 30 2b 4e 20 62 79 74 65 73 20 6f   3) 20+N bytes o
79f0: 66 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  f master-journal
7a00: 20 70 6f 69 6e 74 65 72 2c 20 77 68 65 72 65 20   pointer, where 
7a10: 4e 20 69 73 20 74 68 65 20 73 69 7a 65 20 6f 66  N is the size of
7a20: 20 0a 20 20 23 20 20 20 20 20 20 74 68 65 20 6d   .  #      the m
7a30: 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61  aster-journal na
7a40: 6d 65 20 65 6e 63 6f 64 65 64 20 61 73 20 75 74  me encoded as ut
7a50: 66 2d 38 20 77 69 74 68 20 6e 6f 20 6e 75 6c 20  f-8 with no nul 
7a60: 74 65 72 6d 2e 0a 20 20 23 0a 20 20 73 65 74 20  term..  #.  set 
7a70: 6d 6a 5f 70 6f 69 6e 74 65 72 20 5b 65 78 70 72  mj_pointer [expr
7a80: 20 7b 0a 20 20 20 20 32 30 20 2b 20 5b 73 74 72   {.    20 + [str
7a90: 69 6e 67 20 6c 65 6e 67 74 68 20 5b 67 65 74 5f  ing length [get_
7aa0: 70 77 64 5d 5d 20 2b 20 5b 73 74 72 69 6e 67 20  pwd]] + [string 
7ab0: 6c 65 6e 67 74 68 20 22 2f 74 65 73 74 2e 64 62  length "/test.db
7ac0: 2d 6d 6a 58 58 58 58 58 58 39 58 58 22 5d 0a 20  -mjXXXXXX9XX"]. 
7ad0: 20 7d 5d 0a 20 20 65 78 70 72 20 7b 24 3a 3a 6d   }].  expr {$::m
7ae0: 61 78 5f 6a 6f 75 72 6e 61 6c 3d 3d 28 35 31 32  ax_journal==(512
7af0: 2b 32 2a 28 31 30 32 34 2b 38 29 2b 24 6d 6a 5f  +2*(1024+8)+$mj_
7b00: 70 6f 69 6e 74 65 72 29 7d 0a 7d 20 31 0a 64 6f  pointer)}.} 1.do
7b10: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 35 2e 34  _test pager1-5.4
7b20: 2e 32 20 7b 0a 20 20 73 65 74 20 3a 3a 6d 61 78  .2 {.  set ::max
7b30: 5f 6a 6f 75 72 6e 61 6c 20 30 0a 20 20 65 78 65  _journal 0.  exe
7b40: 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d  csql {.    PRAGM
7b50: 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 3d 20  A synchronous = 
7b60: 66 75 6c 6c 3b 0a 20 20 20 20 42 45 47 49 4e 3b  full;.    BEGIN;
7b70: 0a 20 20 20 20 20 20 44 45 4c 45 54 45 20 46 52  .      DELETE FR
7b80: 4f 4d 20 74 31 20 57 48 45 52 45 20 62 20 3d 20  OM t1 WHERE b = 
7b90: 27 4c 65 6e 69 6e 27 3b 0a 20 20 20 20 20 20 44  'Lenin';.      D
7ba0: 45 4c 45 54 45 20 46 52 4f 4d 20 74 32 20 57 48  ELETE FROM t2 WH
7bb0: 45 52 45 20 62 20 3d 20 27 4c 65 6e 69 6e 27 3b  ERE b = 'Lenin';
7bc0: 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d  .    COMMIT;.  }
7bd0: 0a 0a 20 20 23 20 49 6e 20 73 79 6e 63 68 72 6f  ..  # In synchro
7be0: 6e 6f 75 73 3d 66 75 6c 6c 20 6d 6f 64 65 2c 20  nous=full mode, 
7bf0: 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e  the master-journ
7c00: 61 6c 20 70 6f 69 6e 74 65 72 20 69 73 20 6e 6f  al pointer is no
7c10: 74 20 77 72 69 74 74 65 6e 0a 20 20 23 20 64 69  t written.  # di
7c20: 72 65 63 74 6c 79 20 61 66 74 65 72 20 74 68 65  rectly after the
7c30: 20 6c 61 73 74 20 72 65 63 6f 72 64 20 69 6e 20   last record in 
7c40: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
7c50: 2e 20 49 6e 73 74 65 61 64 2c 20 69 74 20 69 73  . Instead, it is
7c60: 0a 20 20 23 20 77 72 69 74 74 65 6e 20 73 74 61  .  # written sta
7c70: 72 74 69 6e 67 20 61 74 20 74 68 65 20 6e 65 78  rting at the nex
7c80: 74 20 28 69 6e 20 74 68 69 73 20 63 61 73 65 20  t (in this case 
7c90: 35 31 32 20 62 79 74 65 29 20 73 65 63 74 6f 72  512 byte) sector
7ca0: 20 62 6f 75 6e 64 61 72 79 2e 0a 20 20 23 0a 20   boundary..  #. 
7cb0: 20 73 65 74 20 6d 6a 5f 70 6f 69 6e 74 65 72 20   set mj_pointer 
7cc0: 5b 65 78 70 72 20 7b 0a 20 20 20 20 32 30 20 2b  [expr {.    20 +
7cd0: 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20   [string length 
7ce0: 5b 67 65 74 5f 70 77 64 5d 5d 20 2b 20 5b 73 74  [get_pwd]] + [st
7cf0: 72 69 6e 67 20 6c 65 6e 67 74 68 20 22 2f 74 65  ring length "/te
7d00: 73 74 2e 64 62 2d 6d 6a 58 58 58 58 58 58 39 58  st.db-mjXXXXXX9X
7d10: 58 22 5d 0a 20 20 7d 5d 0a 20 20 65 78 70 72 20  X"].  }].  expr 
7d20: 7b 24 3a 3a 6d 61 78 5f 6a 6f 75 72 6e 61 6c 3d  {$::max_journal=
7d30: 3d 28 28 28 35 31 32 2b 32 2a 28 31 30 32 34 2b  =(((512+2*(1024+
7d40: 38 29 2b 35 31 31 29 2f 35 31 32 29 2a 35 31 32  8)+511)/512)*512
7d50: 20 2b 20 24 6d 6a 5f 70 6f 69 6e 74 65 72 29 7d   + $mj_pointer)}
7d60: 0a 7d 20 31 0a 64 62 20 63 6c 6f 73 65 0a 74 76  .} 1.db close.tv
7d70: 20 64 65 6c 65 74 65 0a 0a 64 6f 5f 74 65 73 74   delete..do_test
7d80: 20 70 61 67 65 72 31 2d 35 2e 35 2e 31 20 7b 0a   pager1-5.5.1 {.
7d90: 20 20 73 71 6c 69 74 65 33 20 64 62 20 74 65 73    sqlite3 db tes
7da0: 74 2e 64 62 0a 20 20 65 78 65 63 73 71 6c 20 7b  t.db.  execsql {
7db0: 20 0a 20 20 20 20 41 54 54 41 43 48 20 27 74 65   .    ATTACH 'te
7dc0: 73 74 2e 64 62 32 27 20 41 53 20 61 75 78 3b 0a  st.db2' AS aux;.
7dd0: 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e      PRAGMA journ
7de0: 61 6c 5f 6d 6f 64 65 20 3d 20 50 45 52 53 49 53  al_mode = PERSIS
7df0: 54 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  T;.    CREATE TA
7e00: 42 4c 45 20 74 33 28 61 2c 20 62 29 3b 0a 20 20  BLE t3(a, b);.  
7e10: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33    INSERT INTO t3
7e20: 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c   SELECT randombl
7e30: 6f 62 28 31 35 30 30 29 2c 20 72 61 6e 64 6f 6d  ob(1500), random
7e40: 62 6c 6f 62 28 31 35 30 30 29 20 46 52 4f 4d 20  blob(1500) FROM 
7e50: 74 31 3b 0a 20 20 20 20 55 50 44 41 54 45 20 74  t1;.    UPDATE t
7e60: 33 20 53 45 54 20 62 20 3d 20 72 61 6e 64 6f 6d  3 SET b = random
7e70: 62 6c 6f 62 28 31 35 30 30 29 3b 0a 20 20 7d 0a  blob(1500);.  }.
7e80: 20 20 65 78 70 72 20 5b 66 69 6c 65 20 73 69 7a    expr [file siz
7e90: 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61  e test.db-journa
7ea0: 6c 5d 20 3e 20 31 35 30 30 30 0a 7d 20 7b 31 7d  l] > 15000.} {1}
7eb0: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
7ec0: 35 2e 35 2e 32 20 7b 0a 20 20 65 78 65 63 73 71  5.5.2 {.  execsq
7ed0: 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 73  l {.    PRAGMA s
7ee0: 79 6e 63 68 72 6f 6e 6f 75 73 20 3d 20 66 75 6c  ynchronous = ful
7ef0: 6c 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20  l;.    BEGIN;.  
7f00: 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20      DELETE FROM 
7f10: 74 31 20 57 48 45 52 45 20 62 20 3d 20 27 53 74  t1 WHERE b = 'St
7f20: 61 6c 69 6e 27 3b 0a 20 20 20 20 20 20 44 45 4c  alin';.      DEL
7f30: 45 54 45 20 46 52 4f 4d 20 74 32 20 57 48 45 52  ETE FROM t2 WHER
7f40: 45 20 62 20 3d 20 27 53 74 61 6c 69 6e 27 3b 0a  E b = 'Stalin';.
7f50: 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a      COMMIT;.  }.
7f60: 20 20 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74    file size test
7f70: 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 7d 20 7b 30  .db-journal.} {0
7f80: 7d 0a 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }...#-----------
7f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
7fd0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   The following t
7fe0: 65 73 74 73 20 77 6f 72 6b 20 77 69 74 68 20 22  ests work with "
7ff0: 50 52 41 47 4d 41 20 6d 61 78 5f 70 61 67 65 5f  PRAGMA max_page_
8000: 63 6f 75 6e 74 22 0a 23 0a 64 6f 5f 74 65 73 74  count".#.do_test
8010: 20 70 61 67 65 72 31 2d 36 2e 31 20 7b 0a 20 20   pager1-6.1 {.  
8020: 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f  faultsim_delete_
8030: 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65  and_reopen.  exe
8040: 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d  csql {.    PRAGM
8050: 41 20 61 75 74 6f 5f 76 61 63 75 75 6d 20 3d 20  A auto_vacuum = 
8060: 6e 6f 6e 65 3b 0a 20 20 20 20 50 52 41 47 4d 41  none;.    PRAGMA
8070: 20 6d 61 78 5f 70 61 67 65 5f 63 6f 75 6e 74 20   max_page_count 
8080: 3d 20 31 30 3b 0a 20 20 20 20 43 52 45 41 54 45  = 10;.    CREATE
8090: 20 54 41 42 4c 45 20 74 32 28 61 2c 20 62 29 3b   TABLE t2(a, b);
80a0: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
80b0: 45 20 74 33 28 61 2c 20 62 29 3b 0a 20 20 20 20  E t3(a, b);.    
80c0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 34 28  CREATE TABLE t4(
80d0: 61 2c 20 62 29 3b 0a 20 20 20 20 43 52 45 41 54  a, b);.    CREAT
80e0: 45 20 54 41 42 4c 45 20 74 35 28 61 2c 20 62 29  E TABLE t5(a, b)
80f0: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
8100: 4c 45 20 74 36 28 61 2c 20 62 29 3b 0a 20 20 20  LE t6(a, b);.   
8110: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 37   CREATE TABLE t7
8120: 28 61 2c 20 62 29 3b 0a 20 20 20 20 43 52 45 41  (a, b);.    CREA
8130: 54 45 20 54 41 42 4c 45 20 74 38 28 61 2c 20 62  TE TABLE t8(a, b
8140: 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  );.    CREATE TA
8150: 42 4c 45 20 74 39 28 61 2c 20 62 29 3b 0a 20 20  BLE t9(a, b);.  
8160: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
8170: 31 30 28 61 2c 20 62 29 3b 0a 20 20 7d 0a 7d 20  10(a, b);.  }.} 
8180: 7b 31 30 7d 0a 64 6f 5f 63 61 74 63 68 73 71 6c  {10}.do_catchsql
8190: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 36 2e 32  _test pager1-6.2
81a0: 20 7b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c   {.  CREATE TABL
81b0: 45 20 74 31 31 28 61 2c 20 62 29 0a 7d 20 7b 31  E t11(a, b).} {1
81c0: 20 7b 64 61 74 61 62 61 73 65 20 6f 72 20 64 69   {database or di
81d0: 73 6b 20 69 73 20 66 75 6c 6c 7d 7d 0a 64 6f 5f  sk is full}}.do_
81e0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67  execsql_test pag
81f0: 65 72 31 2d 36 2e 34 20 7b 20 50 52 41 47 4d 41  er1-6.4 { PRAGMA
8200: 20 6d 61 78 5f 70 61 67 65 5f 63 6f 75 6e 74 20   max_page_count 
8210: 20 20 20 20 20 7d 20 7b 31 30 7d 0a 64 6f 5f 65       } {10}.do_e
8220: 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65  xecsql_test page
8230: 72 31 2d 36 2e 35 20 7b 20 50 52 41 47 4d 41 20  r1-6.5 { PRAGMA 
8240: 6d 61 78 5f 70 61 67 65 5f 63 6f 75 6e 74 20 3d  max_page_count =
8250: 20 31 35 20 7d 20 7b 31 35 7d 0a 64 6f 5f 65 78   15 } {15}.do_ex
8260: 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72  ecsql_test pager
8270: 31 2d 36 2e 36 20 7b 20 43 52 45 41 54 45 20 54  1-6.6 { CREATE T
8280: 41 42 4c 45 20 74 31 31 28 61 2c 20 62 29 20 20  ABLE t11(a, b)  
8290: 20 20 20 7d 20 7b 7d 0a 64 6f 5f 65 78 65 63 73     } {}.do_execs
82a0: 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 36  ql_test pager1-6
82b0: 2e 37 20 7b 0a 20 20 42 45 47 49 4e 3b 0a 20 20  .7 {.  BEGIN;.  
82c0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
82d0: 31 20 56 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a  1 VALUES(1, 2);.
82e0: 20 20 20 20 50 52 41 47 4d 41 20 6d 61 78 5f 70      PRAGMA max_p
82f0: 61 67 65 5f 63 6f 75 6e 74 20 3d 20 31 33 3b 0a  age_count = 13;.
8300: 7d 20 7b 31 33 7d 0a 64 6f 5f 65 78 65 63 73 71  } {13}.do_execsq
8310: 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 36 2e  l_test pager1-6.
8320: 38 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  8 {.    INSERT I
8330: 4e 54 4f 20 74 31 31 20 56 41 4c 55 45 53 28 33  NTO t11 VALUES(3
8340: 2c 20 34 29 3b 0a 20 20 20 20 50 52 41 47 4d 41  , 4);.    PRAGMA
8350: 20 6d 61 78 5f 70 61 67 65 5f 63 6f 75 6e 74 20   max_page_count 
8360: 3d 20 31 30 3b 0a 7d 20 7b 31 31 7d 0a 64 6f 5f  = 10;.} {11}.do_
8370: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67  execsql_test pag
8380: 65 72 31 2d 36 2e 39 20 7b 20 43 4f 4d 4d 49 54  er1-6.9 { COMMIT
8390: 20 7d 20 7b 7d 0a 0a 64 6f 5f 65 78 65 63 73 71   } {}..do_execsq
83a0: 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 36 2e  l_test pager1-6.
83b0: 31 30 20 7b 20 50 52 41 47 4d 41 20 6d 61 78 5f  10 { PRAGMA max_
83c0: 70 61 67 65 5f 63 6f 75 6e 74 20 3d 20 31 30 20  page_count = 10 
83d0: 7d 20 7b 31 31 7d 0a 64 6f 5f 65 78 65 63 73 71  } {11}.do_execsq
83e0: 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 36 2e  l_test pager1-6.
83f0: 31 31 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52  11 { SELECT * FR
8400: 4f 4d 20 74 31 31 20 7d 20 20 20 20 20 20 20 20  OM t11 }        
8410: 20 20 7b 31 20 32 20 33 20 34 7d 0a 64 6f 5f 65    {1 2 3 4}.do_e
8420: 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65  xecsql_test page
8430: 72 31 2d 36 2e 31 32 20 7b 20 50 52 41 47 4d 41  r1-6.12 { PRAGMA
8440: 20 6d 61 78 5f 70 61 67 65 5f 63 6f 75 6e 74 20   max_page_count 
8450: 7d 20 20 20 20 20 20 7b 31 31 7d 0a 0a 0a 23 2d  }      {11}...#-
8460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
84a0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 65 20 66  --------.# The f
84b0: 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74 73 20 77  ollowing tests w
84c0: 6f 72 6b 20 77 69 74 68 20 22 50 52 41 47 4d 41  ork with "PRAGMA
84d0: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 54 52   journal_mode=TR
84e0: 55 4e 43 41 54 45 22 20 61 6e 64 0a 23 20 22 50  UNCATE" and.# "P
84f0: 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  RAGMA locking_mo
8500: 64 65 3d 45 58 43 4c 55 53 49 56 45 22 2e 0a 23  de=EXCLUSIVE"..#
8510: 0a 23 20 45 61 63 68 20 74 65 73 74 20 69 73 20  .# Each test is 
8520: 73 70 65 63 69 66 69 65 64 20 77 69 74 68 20 35  specified with 5
8530: 20 76 61 72 69 61 62 6c 65 73 2e 20 41 73 20 66   variables. As f
8540: 6f 6c 6c 6f 77 73 3a 0a 23 0a 23 20 20 20 24 74  ollows:.#.#   $t
8550: 6e 3a 20 20 54 65 73 74 20 4e 75 6d 62 65 72 2e  n:  Test Number.
8560: 20 55 73 65 64 20 61 73 20 70 61 72 74 20 6f 66   Used as part of
8570: 20 74 68 65 20 5b 64 6f 5f 74 65 73 74 5d 20 74   the [do_test] t
8580: 65 73 74 20 6e 61 6d 65 73 2e 0a 23 20 20 20 24  est names..#   $
8590: 73 71 6c 3a 20 53 51 4c 20 74 6f 20 65 78 65 63  sql: SQL to exec
85a0: 75 74 65 2e 0a 23 20 20 20 24 72 65 73 3a 20 45  ute..#   $res: E
85b0: 78 70 65 63 74 65 64 20 72 65 73 75 6c 74 20 6f  xpected result o
85c0: 66 20 65 78 65 63 75 74 69 6e 67 20 24 73 71 6c  f executing $sql
85d0: 2e 0a 23 20 20 20 24 6a 73 3a 20 20 54 68 65 20  ..#   $js:  The 
85e0: 65 78 70 65 63 74 65 64 20 73 69 7a 65 20 6f 66  expected size of
85f0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
8600: 65 2c 20 69 6e 20 62 79 74 65 73 2c 20 61 66 74  e, in bytes, aft
8610: 65 72 20 65 78 65 63 75 74 69 6e 67 0a 23 20 20  er executing.#  
8620: 20 20 20 20 20 20 20 74 68 65 20 53 51 4c 20 73         the SQL s
8630: 63 72 69 70 74 2e 20 4f 72 20 2d 31 20 69 66 20  cript. Or -1 if 
8640: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6e  the journal is n
8650: 6f 74 20 65 78 70 65 63 74 65 64 20 74 6f 20 65  ot expected to e
8660: 78 69 73 74 2e 0a 23 20 20 20 24 77 73 3a 20 20  xist..#   $ws:  
8670: 54 68 65 20 65 78 70 65 63 74 65 64 20 73 69 7a  The expected siz
8680: 65 20 6f 66 20 74 68 65 20 57 41 4c 20 66 69 6c  e of the WAL fil
8690: 65 2c 20 69 6e 20 62 79 74 65 73 2c 20 61 66 74  e, in bytes, aft
86a0: 65 72 20 65 78 65 63 75 74 69 6e 67 0a 23 20 20  er executing.#  
86b0: 20 20 20 20 20 20 20 74 68 65 20 53 51 4c 20 73         the SQL s
86c0: 63 72 69 70 74 2e 20 4f 72 20 2d 31 20 69 66 20  cript. Or -1 if 
86d0: 74 68 65 20 57 41 4c 20 69 73 20 6e 6f 74 20 65  the WAL is not e
86e0: 78 70 65 63 74 65 64 20 74 6f 20 65 78 69 73 74  xpected to exist
86f0: 2e 0a 23 0a 69 66 63 61 70 61 62 6c 65 20 77 61  ..#.ifcapable wa
8700: 6c 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64  l {.  faultsim_d
8710: 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e  elete_and_reopen
8720: 0a 20 20 66 6f 72 65 61 63 68 20 7b 74 6e 20 73  .  foreach {tn s
8730: 71 6c 20 72 65 73 20 6a 73 20 77 73 7d 20 5b 73  ql res js ws} [s
8740: 75 62 73 74 20 7b 0a 20 20 0a 20 20 20 20 31 20  ubst {.  .    1 
8750: 20 7b 0a 20 20 20 20 20 20 43 52 45 41 54 45 20   {.      CREATE 
8760: 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a  TABLE t1(a, b);.
8770: 20 20 20 20 20 20 50 52 41 47 4d 41 20 61 75 74        PRAGMA aut
8780: 6f 5f 76 61 63 75 75 6d 3d 4f 46 46 3b 0a 20 20  o_vacuum=OFF;.  
8790: 20 20 20 20 50 52 41 47 4d 41 20 73 79 6e 63 68      PRAGMA synch
87a0: 72 6f 6e 6f 75 73 3d 4e 4f 52 4d 41 4c 3b 0a 20  ronous=NORMAL;. 
87b0: 20 20 20 20 20 50 52 41 47 4d 41 20 70 61 67 65       PRAGMA page
87c0: 5f 73 69 7a 65 3d 31 30 32 34 3b 0a 20 20 20 20  _size=1024;.    
87d0: 20 20 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67    PRAGMA locking
87e0: 5f 6d 6f 64 65 3d 45 58 43 4c 55 53 49 56 45 3b  _mode=EXCLUSIVE;
87f0: 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 6a 6f  .      PRAGMA jo
8800: 75 72 6e 61 6c 5f 6d 6f 64 65 3d 54 52 55 4e 43  urnal_mode=TRUNC
8810: 41 54 45 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  ATE;.      INSER
8820: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
8830: 28 31 2c 20 32 29 3b 0a 20 20 20 20 7d 20 7b 65  (1, 2);.    } {e
8840: 78 63 6c 75 73 69 76 65 20 74 72 75 6e 63 61 74  xclusive truncat
8850: 65 7d 20 30 20 2d 31 0a 20 20 0a 20 20 20 20 32  e} 0 -1.  .    2
8860: 20 20 7b 0a 20 20 20 20 20 20 42 45 47 49 4e 20    {.      BEGIN 
8870: 49 4d 4d 45 44 49 41 54 45 3b 0a 20 20 20 20 20  IMMEDIATE;.     
8880: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
8890: 20 74 31 3b 0a 20 20 20 20 20 20 43 4f 4d 4d 49   t1;.      COMMI
88a0: 54 3b 0a 20 20 20 20 7d 20 7b 31 20 32 7d 20 30  T;.    } {1 2} 0
88b0: 20 2d 31 0a 20 20 0a 20 20 20 20 33 20 20 7b 0a   -1.  .    3  {.
88c0: 20 20 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20        BEGIN;.   
88d0: 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52       SELECT * FR
88e0: 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20 43 4f 4d  OM t1;.      COM
88f0: 4d 49 54 3b 0a 20 20 20 20 7d 20 7b 31 20 32 7d  MIT;.    } {1 2}
8900: 20 30 20 2d 31 0a 20 20 0a 20 20 20 20 34 20 20   0 -1.  .    4  
8910: 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c  { PRAGMA journal
8920: 5f 6d 6f 64 65 20 3d 20 57 41 4c 20 7d 20 20 20  _mode = WAL }   
8930: 20 77 61 6c 20 20 20 20 20 20 20 2d 31 20 2d 31   wal       -1 -1
8940: 0a 20 20 20 20 35 20 20 7b 20 49 4e 53 45 52 54  .    5  { INSERT
8950: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
8960: 33 2c 20 34 29 20 7d 20 20 7b 7d 20 20 20 20 20  3, 4) }  {}     
8970: 20 20 20 2d 31 20 5b 77 61 6c 5f 66 69 6c 65 5f     -1 [wal_file_
8980: 73 69 7a 65 20 31 20 31 30 32 34 5d 0a 20 20 20  size 1 1024].   
8990: 20 36 20 20 7b 20 50 52 41 47 4d 41 20 6c 6f 63   6  { PRAGMA loc
89a0: 6b 69 6e 67 5f 6d 6f 64 65 20 3d 20 4e 4f 52 4d  king_mode = NORM
89b0: 41 4c 20 7d 20 65 78 63 6c 75 73 69 76 65 20 2d  AL } exclusive -
89c0: 31 20 5b 77 61 6c 5f 66 69 6c 65 5f 73 69 7a 65  1 [wal_file_size
89d0: 20 31 20 31 30 32 34 5d 0a 20 20 20 20 37 20 20   1 1024].    7  
89e0: 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31  { INSERT INTO t1
89f0: 20 56 41 4c 55 45 53 28 35 2c 20 36 29 3b 20 7d   VALUES(5, 6); }
8a00: 20 7b 7d 20 20 20 20 20 20 20 20 2d 31 20 5b 77   {}        -1 [w
8a10: 61 6c 5f 66 69 6c 65 5f 73 69 7a 65 20 32 20 31  al_file_size 2 1
8a20: 30 32 34 5d 0a 20 20 0a 20 20 20 20 38 20 20 7b  024].  .    8  {
8a30: 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f   PRAGMA journal_
8a40: 6d 6f 64 65 20 3d 20 54 52 55 4e 43 41 54 45 20  mode = TRUNCATE 
8a50: 7d 20 74 72 75 6e 63 61 74 65 20 20 20 20 20 20  } truncate      
8a60: 20 20 20 20 30 20 2d 31 0a 20 20 20 20 39 20 20      0 -1.    9  
8a70: 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31  { INSERT INTO t1
8a80: 20 56 41 4c 55 45 53 28 37 2c 20 38 29 20 7d 20   VALUES(7, 8) } 
8a90: 20 20 20 7b 7d 20 20 20 20 20 20 20 20 20 20 20     {}           
8aa0: 20 20 20 20 20 30 20 2d 31 0a 20 20 20 20 31 30       0 -1.    10
8ab0: 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d   { SELECT * FROM
8ac0: 20 74 31 20 7d 20 20 20 20 20 20 20 20 20 20 20   t1 }           
8ad0: 20 20 20 20 7b 31 20 32 20 33 20 34 20 35 20 36      {1 2 3 4 5 6
8ae0: 20 37 20 38 7d 20 30 20 2d 31 0a 20 20 0a 20 20   7 8} 0 -1.  .  
8af0: 7d 5d 20 7b 0a 20 20 20 20 64 6f 5f 65 78 65 63  }] {.    do_exec
8b00: 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d  sql_test pager1-
8b10: 37 2e 31 2e 24 74 6e 2e 31 20 24 73 71 6c 20 24  7.1.$tn.1 $sql $
8b20: 72 65 73 0a 20 20 20 20 63 61 74 63 68 20 7b 20  res.    catch { 
8b30: 73 65 74 20 4a 20 2d 31 20 3b 20 73 65 74 20 4a  set J -1 ; set J
8b40: 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74   [file size test
8b50: 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5d 20 7d 0a 20  .db-journal] }. 
8b60: 20 20 20 63 61 74 63 68 20 7b 20 73 65 74 20 57     catch { set W
8b70: 20 2d 31 20 3b 20 73 65 74 20 57 20 5b 66 69 6c   -1 ; set W [fil
8b80: 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 2d 77  e size test.db-w
8b90: 61 6c 5d 20 7d 0a 20 20 20 20 64 6f 5f 74 65 73  al] }.    do_tes
8ba0: 74 20 70 61 67 65 72 31 2d 37 2e 31 2e 24 74 6e  t pager1-7.1.$tn
8bb0: 2e 32 20 7b 20 6c 69 73 74 20 24 4a 20 24 57 20  .2 { list $J $W 
8bc0: 7d 20 5b 6c 69 73 74 20 24 6a 73 20 24 77 73 5d  } [list $js $ws]
8bd0: 0a 20 20 7d 0a 7d 0a 0a 64 6f 5f 74 65 73 74 20  .  }.}..do_test 
8be0: 70 61 67 65 72 31 2d 37 2e 32 2e 31 20 7b 0a 20  pager1-7.2.1 {. 
8bf0: 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65   faultsim_delete
8c00: 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78  _and_reopen.  ex
8c10: 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47  ecsql {.    PRAG
8c20: 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 20  MA locking_mode 
8c30: 3d 20 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20  = EXCLUSIVE;.   
8c40: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
8c50: 28 61 2c 20 62 29 3b 0a 20 20 20 20 42 45 47 49  (a, b);.    BEGI
8c60: 4e 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20  N;.      PRAGMA 
8c70: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 64  journal_mode = d
8c80: 65 6c 65 74 65 3b 0a 20 20 20 20 20 20 50 52 41  elete;.      PRA
8c90: 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
8ca0: 20 3d 20 74 72 75 6e 63 61 74 65 3b 0a 20 20 7d   = truncate;.  }
8cb0: 0a 7d 20 7b 65 78 63 6c 75 73 69 76 65 20 64 65  .} {exclusive de
8cc0: 6c 65 74 65 20 74 72 75 6e 63 61 74 65 7d 0a 64  lete truncate}.d
8cd0: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 37 2e  o_test pager1-7.
8ce0: 32 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  2.2 {.  execsql 
8cf0: 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31  { INSERT INTO t1
8d00: 20 56 41 4c 55 45 53 28 31 2c 20 32 29 20 7d 0a   VALUES(1, 2) }.
8d10: 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47    execsql { PRAG
8d20: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  MA journal_mode 
8d30: 3d 20 70 65 72 73 69 73 74 20 7d 0a 7d 20 7b 74  = persist }.} {t
8d40: 72 75 6e 63 61 74 65 7d 0a 64 6f 5f 74 65 73 74  runcate}.do_test
8d50: 20 70 61 67 65 72 31 2d 37 2e 32 2e 33 20 7b 0a   pager1-7.2.3 {.
8d60: 20 20 65 78 65 63 73 71 6c 20 7b 20 43 4f 4d 4d    execsql { COMM
8d70: 49 54 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b  IT }.  execsql {
8d80: 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72  .    PRAGMA jour
8d90: 6e 61 6c 5f 6d 6f 64 65 20 3d 20 70 65 72 73 69  nal_mode = persi
8da0: 73 74 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a  st;.    PRAGMA j
8db0: 6f 75 72 6e 61 6c 5f 73 69 7a 65 5f 6c 69 6d 69  ournal_size_limi
8dc0: 74 3b 0a 20 20 7d 0a 7d 20 7b 70 65 72 73 69 73  t;.  }.} {persis
8dd0: 74 20 2d 31 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  t -1}..#--------
8de0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8df0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8e20: 2d 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  -.# The followin
8e30: 67 20 74 65 73 74 73 2c 20 70 61 67 65 72 31 2d  g tests, pager1-
8e40: 38 2e 2a 2c 20 74 65 73 74 20 74 68 61 74 20 74  8.*, test that t
8e50: 68 65 20 73 70 65 63 69 61 6c 20 66 69 6c 65 6e  he special filen
8e60: 61 6d 65 73 20 0a 23 20 22 3a 6d 65 6d 6f 72 79  ames .# ":memory
8e70: 3a 22 20 61 6e 64 20 22 22 20 6f 70 65 6e 20 74  :" and "" open t
8e80: 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73  emporary databas
8e90: 65 73 2e 0a 23 0a 66 6f 72 65 61 63 68 20 7b 74  es..#.foreach {t
8ea0: 6e 20 66 69 6c 65 6e 61 6d 65 7d 20 7b 0a 20 20  n filename} {.  
8eb0: 31 20 3a 6d 65 6d 6f 72 79 3a 0a 20 20 32 20 22  1 :memory:.  2 "
8ec0: 22 0a 7d 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20  ".} {.  do_test 
8ed0: 70 61 67 65 72 31 2d 38 2e 24 74 6e 2e 31 20 7b  pager1-8.$tn.1 {
8ee0: 0a 20 20 20 20 66 61 75 6c 74 73 69 6d 5f 64 65  .    faultsim_de
8ef0: 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a  lete_and_reopen.
8f00: 20 20 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 20      db close.   
8f10: 20 73 71 6c 69 74 65 33 20 64 62 20 24 66 69 6c   sqlite3 db $fil
8f20: 65 6e 61 6d 65 0a 20 20 20 20 65 78 65 63 73 71  ename.    execsq
8f30: 6c 20 7b 0a 20 20 20 20 20 20 50 52 41 47 4d 41  l {.      PRAGMA
8f40: 20 61 75 74 6f 5f 76 61 63 75 75 6d 20 3d 20 31   auto_vacuum = 1
8f50: 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45 20 54  ;.      CREATE T
8f60: 41 42 4c 45 20 78 31 28 78 29 3b 0a 20 20 20 20  ABLE x1(x);.    
8f70: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 31    INSERT INTO x1
8f80: 20 56 41 4c 55 45 53 28 27 43 68 61 72 6c 65 73   VALUES('Charles
8f90: 27 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  ');.      INSERT
8fa0: 20 49 4e 54 4f 20 78 31 20 56 41 4c 55 45 53 28   INTO x1 VALUES(
8fb0: 27 4a 61 6d 65 73 27 29 3b 0a 20 20 20 20 20 20  'James');.      
8fc0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 31 20 56  INSERT INTO x1 V
8fd0: 41 4c 55 45 53 28 27 4d 61 72 79 27 29 3b 0a 20  ALUES('Mary');. 
8fe0: 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52       SELECT * FR
8ff0: 4f 4d 20 78 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  OM x1;.    }.  }
9000: 20 7b 43 68 61 72 6c 65 73 20 4a 61 6d 65 73 20   {Charles James 
9010: 4d 61 72 79 7d 0a 0a 20 20 64 6f 5f 74 65 73 74  Mary}..  do_test
9020: 20 70 61 67 65 72 31 2d 38 2e 24 74 6e 2e 32 20   pager1-8.$tn.2 
9030: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 64 62  {.    sqlite3 db
9040: 32 20 24 66 69 6c 65 6e 61 6d 65 0a 20 20 20 20  2 $filename.    
9050: 63 61 74 63 68 73 71 6c 20 7b 20 53 45 4c 45 43  catchsql { SELEC
9060: 54 20 2a 20 46 52 4f 4d 20 78 31 20 7d 20 64 62  T * FROM x1 } db
9070: 32 0a 20 20 7d 20 7b 31 20 7b 6e 6f 20 73 75 63  2.  } {1 {no suc
9080: 68 20 74 61 62 6c 65 3a 20 78 31 7d 7d 0a 0a 20  h table: x1}}.. 
9090: 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74   do_execsql_test
90a0: 20 70 61 67 65 72 31 2d 38 2e 24 74 6e 2e 33 20   pager1-8.$tn.3 
90b0: 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20  {.    BEGIN;.   
90c0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78     INSERT INTO x
90d0: 31 20 56 41 4c 55 45 53 28 27 57 69 6c 6c 69 61  1 VALUES('Willia
90e0: 6d 27 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  m');.      INSER
90f0: 54 20 49 4e 54 4f 20 78 31 20 56 41 4c 55 45 53  T INTO x1 VALUES
9100: 28 27 41 6e 6e 65 27 29 3b 0a 20 20 20 20 52 4f  ('Anne');.    RO
9110: 4c 4c 42 41 43 4b 3b 0a 20 20 7d 20 7b 7d 0a 7d  LLBACK;.  } {}.}
9120: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
9130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54  ------------.# T
9170: 68 65 20 6e 65 78 74 20 62 6c 6f 63 6b 20 6f 66  he next block of
9180: 20 74 65 73 74 73 20 2d 20 70 61 67 65 72 31 2d   tests - pager1-
9190: 39 2e 2a 20 2d 20 64 65 61 6c 20 77 69 74 68 20  9.* - deal with 
91a0: 69 6e 74 65 72 61 63 74 69 6f 6e 73 20 62 65 74  interactions bet
91b0: 77 65 65 6e 0a 23 20 74 68 65 20 70 61 67 65 72  ween.# the pager
91c0: 20 61 6e 64 20 74 68 65 20 62 61 63 6b 75 70 20   and the backup 
91d0: 41 50 49 2e 20 54 65 73 74 20 63 61 73 65 73 3a  API. Test cases:
91e0: 0a 23 0a 23 20 20 20 70 61 67 65 72 31 2d 39 2e  .#.#   pager1-9.
91f0: 31 2e 2a 3a 20 54 65 73 74 20 74 68 61 74 20 61  1.*: Test that a
9200: 20 62 61 63 6b 75 70 20 63 6f 6d 70 6c 65 74 65   backup complete
9210: 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 65  s successfully e
9220: 76 65 6e 20 69 66 20 74 68 65 0a 23 20 20 20 20  ven if the.#    
9230: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 6f 75               sou
9240: 72 63 65 20 64 62 20 69 73 20 77 72 69 74 74 65  rce db is writte
9250: 6e 20 74 6f 20 64 75 72 69 6e 67 20 74 68 65 20  n to during the 
9260: 62 61 63 6b 75 70 20 6f 70 2e 0a 23 0a 23 20 20  backup op..#.#  
9270: 20 70 61 67 65 72 31 2d 39 2e 32 2e 2a 3a 20 54   pager1-9.2.*: T
9280: 65 73 74 20 74 68 61 74 20 61 20 62 61 63 6b 75  est that a backu
9290: 70 20 63 6f 6d 70 6c 65 74 65 73 20 73 75 63 63  p completes succ
92a0: 65 73 73 66 75 6c 6c 79 20 65 76 65 6e 20 69 66  essfully even if
92b0: 20 74 68 65 0a 23 20 20 20 20 20 20 20 20 20 20   the.#          
92c0: 20 20 20 20 20 20 20 73 6f 75 72 63 65 20 64 62         source db
92d0: 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 61   is written to a
92e0: 6e 64 20 74 68 65 6e 20 72 6f 6c 6c 65 64 20 62  nd then rolled b
92f0: 61 63 6b 20 64 75 72 69 6e 67 20 61 20 0a 23 20  ack during a .# 
9300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9310: 62 61 63 6b 75 70 20 6f 70 65 72 61 74 69 6f 6e  backup operation
9320: 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  ..#.do_test page
9330: 72 31 2d 39 2e 30 2e 31 20 7b 0a 20 20 66 61 75  r1-9.0.1 {.  fau
9340: 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64  ltsim_delete_and
9350: 5f 72 65 6f 70 65 6e 0a 20 20 64 62 20 66 75 6e  _reopen.  db fun
9360: 63 20 61 5f 73 74 72 69 6e 67 20 61 5f 73 74 72  c a_string a_str
9370: 69 6e 67 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  ing.  execsql {.
9380: 20 20 20 20 50 52 41 47 4d 41 20 63 61 63 68 65      PRAGMA cache
9390: 5f 73 69 7a 65 20 3d 20 31 30 3b 0a 20 20 20 20  _size = 10;.    
93a0: 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 43 52 45  BEGIN;.      CRE
93b0: 41 54 45 20 54 41 42 4c 45 20 61 62 28 61 2c 20  ATE TABLE ab(a, 
93c0: 62 2c 20 55 4e 49 51 55 45 28 61 2c 20 62 29 29  b, UNIQUE(a, b))
93d0: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
93e0: 4e 54 4f 20 61 62 20 56 41 4c 55 45 53 28 20 61  NTO ab VALUES( a
93f0: 5f 73 74 72 69 6e 67 28 32 30 30 29 2c 20 61 5f  _string(200), a_
9400: 73 74 72 69 6e 67 28 33 30 30 29 20 29 3b 0a 20  string(300) );. 
9410: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
9420: 20 61 62 20 53 45 4c 45 43 54 20 61 5f 73 74 72   ab SELECT a_str
9430: 69 6e 67 28 32 30 30 29 2c 20 61 5f 73 74 72 69  ing(200), a_stri
9440: 6e 67 28 33 30 30 29 20 46 52 4f 4d 20 61 62 3b  ng(300) FROM ab;
9450: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
9460: 54 4f 20 61 62 20 53 45 4c 45 43 54 20 61 5f 73  TO ab SELECT a_s
9470: 74 72 69 6e 67 28 32 30 30 29 2c 20 61 5f 73 74  tring(200), a_st
9480: 72 69 6e 67 28 33 30 30 29 20 46 52 4f 4d 20 61  ring(300) FROM a
9490: 62 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  b;.      INSERT 
94a0: 49 4e 54 4f 20 61 62 20 53 45 4c 45 43 54 20 61  INTO ab SELECT a
94b0: 5f 73 74 72 69 6e 67 28 32 30 30 29 2c 20 61 5f  _string(200), a_
94c0: 73 74 72 69 6e 67 28 33 30 30 29 20 46 52 4f 4d  string(300) FROM
94d0: 20 61 62 3b 0a 20 20 20 20 20 20 49 4e 53 45 52   ab;.      INSER
94e0: 54 20 49 4e 54 4f 20 61 62 20 53 45 4c 45 43 54  T INTO ab SELECT
94f0: 20 61 5f 73 74 72 69 6e 67 28 32 30 30 29 2c 20   a_string(200), 
9500: 61 5f 73 74 72 69 6e 67 28 33 30 30 29 20 46 52  a_string(300) FR
9510: 4f 4d 20 61 62 3b 0a 20 20 20 20 20 20 49 4e 53  OM ab;.      INS
9520: 45 52 54 20 49 4e 54 4f 20 61 62 20 53 45 4c 45  ERT INTO ab SELE
9530: 43 54 20 61 5f 73 74 72 69 6e 67 28 32 30 30 29  CT a_string(200)
9540: 2c 20 61 5f 73 74 72 69 6e 67 28 33 30 30 29 20  , a_string(300) 
9550: 46 52 4f 4d 20 61 62 3b 0a 20 20 20 20 20 20 49  FROM ab;.      I
9560: 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 20 53 45  NSERT INTO ab SE
9570: 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 32 30  LECT a_string(20
9580: 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 33 30 30  0), a_string(300
9590: 29 20 46 52 4f 4d 20 61 62 3b 0a 20 20 20 20 20  ) FROM ab;.     
95a0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 20   INSERT INTO ab 
95b0: 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28  SELECT a_string(
95c0: 32 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 33  200), a_string(3
95d0: 30 30 29 20 46 52 4f 4d 20 61 62 3b 0a 20 20 20  00) FROM ab;.   
95e0: 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 7d 20 7b   COMMIT;.  }.} {
95f0: 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  }.do_test pager1
9600: 2d 39 2e 30 2e 32 20 7b 0a 20 20 73 71 6c 69 74  -9.0.2 {.  sqlit
9610: 65 33 20 64 62 32 20 74 65 73 74 2e 64 62 32 0a  e3 db2 test.db2.
9620: 20 20 64 62 32 20 65 76 61 6c 20 7b 20 50 52 41    db2 eval { PRA
9630: 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 20 3d  GMA cache_size =
9640: 20 31 30 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f   10 }.  sqlite3_
9650: 62 61 63 6b 75 70 20 42 20 64 62 32 20 6d 61 69  backup B db2 mai
9660: 6e 20 64 62 20 6d 61 69 6e 0a 20 20 6c 69 73 74  n db main.  list
9670: 20 5b 42 20 73 74 65 70 20 31 30 30 30 30 5d 20   [B step 10000] 
9680: 5b 42 20 66 69 6e 69 73 68 5d 0a 7d 20 7b 53 51  [B finish].} {SQ
9690: 4c 49 54 45 5f 44 4f 4e 45 20 53 51 4c 49 54 45  LITE_DONE SQLITE
96a0: 5f 4f 4b 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67  _OK}.do_test pag
96b0: 65 72 31 2d 39 2e 30 2e 33 20 7b 0a 20 64 62 20  er1-9.0.3 {. db 
96c0: 6f 6e 65 20 7b 53 45 4c 45 43 54 20 6d 64 35 73  one {SELECT md5s
96d0: 75 6d 28 61 2c 20 62 29 20 46 52 4f 4d 20 61 62  um(a, b) FROM ab
96e0: 7d 0a 7d 20 5b 64 62 32 20 6f 6e 65 20 7b 53 45  }.} [db2 one {SE
96f0: 4c 45 43 54 20 6d 64 35 73 75 6d 28 61 2c 20 62  LECT md5sum(a, b
9700: 29 20 46 52 4f 4d 20 61 62 7d 5d 0a 0a 64 6f 5f  ) FROM ab}]..do_
9710: 74 65 73 74 20 70 61 67 65 72 31 2d 39 2e 31 2e  test pager1-9.1.
9720: 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  1 {.  execsql { 
9730: 55 50 44 41 54 45 20 61 62 20 53 45 54 20 61 20  UPDATE ab SET a 
9740: 3d 20 61 5f 73 74 72 69 6e 67 28 32 30 31 29 20  = a_string(201) 
9750: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b  }.  sqlite3_back
9760: 75 70 20 42 20 64 62 32 20 6d 61 69 6e 20 64 62  up B db2 main db
9770: 20 6d 61 69 6e 0a 20 20 42 20 73 74 65 70 20 33   main.  B step 3
9780: 30 0a 7d 20 7b 53 51 4c 49 54 45 5f 4f 4b 7d 0a  0.} {SQLITE_OK}.
9790: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 39  do_test pager1-9
97a0: 2e 31 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c  .1.2 {.  execsql
97b0: 20 7b 20 55 50 44 41 54 45 20 61 62 20 53 45 54   { UPDATE ab SET
97c0: 20 62 20 3d 20 61 5f 73 74 72 69 6e 67 28 33 30   b = a_string(30
97d0: 31 29 20 7d 0a 20 20 6c 69 73 74 20 5b 42 20 73  1) }.  list [B s
97e0: 74 65 70 20 31 30 30 30 30 5d 20 5b 42 20 66 69  tep 10000] [B fi
97f0: 6e 69 73 68 5d 0a 7d 20 7b 53 51 4c 49 54 45 5f  nish].} {SQLITE_
9800: 44 4f 4e 45 20 53 51 4c 49 54 45 5f 4f 4b 7d 0a  DONE SQLITE_OK}.
9810: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 39  do_test pager1-9
9820: 2e 31 2e 33 20 7b 0a 20 64 62 20 6f 6e 65 20 7b  .1.3 {. db one {
9830: 53 45 4c 45 43 54 20 6d 64 35 73 75 6d 28 61 2c  SELECT md5sum(a,
9840: 20 62 29 20 46 52 4f 4d 20 61 62 7d 0a 7d 20 5b   b) FROM ab}.} [
9850: 64 62 32 20 6f 6e 65 20 7b 53 45 4c 45 43 54 20  db2 one {SELECT 
9860: 6d 64 35 73 75 6d 28 61 2c 20 62 29 20 46 52 4f  md5sum(a, b) FRO
9870: 4d 20 61 62 7d 5d 0a 64 6f 5f 74 65 73 74 20 70  M ab}].do_test p
9880: 61 67 65 72 31 2d 39 2e 31 2e 34 20 7b 20 65 78  ager1-9.1.4 { ex
9890: 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 63  ecsql { SELECT c
98a0: 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 61 62 20  ount(*) FROM ab 
98b0: 7d 20 7d 20 7b 31 32 38 7d 0a 0a 64 6f 5f 74 65  } } {128}..do_te
98c0: 73 74 20 70 61 67 65 72 31 2d 39 2e 32 2e 31 20  st pager1-9.2.1 
98d0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 55 50  {.  execsql { UP
98e0: 44 41 54 45 20 61 62 20 53 45 54 20 61 20 3d 20  DATE ab SET a = 
98f0: 61 5f 73 74 72 69 6e 67 28 32 30 32 29 20 7d 0a  a_string(202) }.
9900: 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70    sqlite3_backup
9910: 20 42 20 64 62 32 20 6d 61 69 6e 20 64 62 20 6d   B db2 main db m
9920: 61 69 6e 0a 20 20 42 20 73 74 65 70 20 33 30 0a  ain.  B step 30.
9930: 7d 20 7b 53 51 4c 49 54 45 5f 4f 4b 7d 0a 64 6f  } {SQLITE_OK}.do
9940: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 39 2e 32  _test pager1-9.2
9950: 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .2 {.  execsql {
9960: 20 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20   .    BEGIN;.   
9970: 20 20 20 55 50 44 41 54 45 20 61 62 20 53 45 54     UPDATE ab SET
9980: 20 62 20 3d 20 61 5f 73 74 72 69 6e 67 28 33 30   b = a_string(30
9990: 31 29 3b 0a 20 20 20 20 52 4f 4c 4c 42 41 43 4b  1);.    ROLLBACK
99a0: 3b 0a 20 20 7d 0a 20 20 6c 69 73 74 20 5b 42 20  ;.  }.  list [B 
99b0: 73 74 65 70 20 31 30 30 30 30 5d 20 5b 42 20 66  step 10000] [B f
99c0: 69 6e 69 73 68 5d 0a 7d 20 7b 53 51 4c 49 54 45  inish].} {SQLITE
99d0: 5f 44 4f 4e 45 20 53 51 4c 49 54 45 5f 4f 4b 7d  _DONE SQLITE_OK}
99e0: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
99f0: 39 2e 32 2e 33 20 7b 0a 20 64 62 20 6f 6e 65 20  9.2.3 {. db one 
9a00: 7b 53 45 4c 45 43 54 20 6d 64 35 73 75 6d 28 61  {SELECT md5sum(a
9a10: 2c 20 62 29 20 46 52 4f 4d 20 61 62 7d 0a 7d 20  , b) FROM ab}.} 
9a20: 5b 64 62 32 20 6f 6e 65 20 7b 53 45 4c 45 43 54  [db2 one {SELECT
9a30: 20 6d 64 35 73 75 6d 28 61 2c 20 62 29 20 46 52   md5sum(a, b) FR
9a40: 4f 4d 20 61 62 7d 5d 0a 64 6f 5f 74 65 73 74 20  OM ab}].do_test 
9a50: 70 61 67 65 72 31 2d 39 2e 32 2e 34 20 7b 20 65  pager1-9.2.4 { e
9a60: 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20  xecsql { SELECT 
9a70: 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 61 62  count(*) FROM ab
9a80: 20 7d 20 7d 20 7b 31 32 38 7d 0a 64 62 20 63 6c   } } {128}.db cl
9a90: 6f 73 65 0a 64 62 32 20 63 6c 6f 73 65 0a 0a 64  ose.db2 close..d
9aa0: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 39 2e  o_test pager1-9.
9ab0: 33 2e 31 20 7b 0a 20 20 74 65 73 74 76 66 73 20  3.1 {.  testvfs 
9ac0: 74 76 20 2d 64 65 66 61 75 6c 74 20 31 0a 20 20  tv -default 1.  
9ad0: 74 76 20 73 65 63 74 6f 72 73 69 7a 65 20 34 30  tv sectorsize 40
9ae0: 39 36 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65  96.  faultsim_de
9af0: 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a  lete_and_reopen.
9b00: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41  .  execsql { PRA
9b10: 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20  GMA page_size = 
9b20: 31 30 32 34 20 7d 0a 20 20 66 6f 72 20 7b 73 65  1024 }.  for {se
9b30: 74 20 69 69 20 30 7d 20 7b 24 69 69 20 3c 20 34  t ii 0} {$ii < 4
9b40: 7d 20 7b 69 6e 63 72 20 69 69 7d 20 7b 20 65 78  } {incr ii} { ex
9b50: 65 63 73 71 6c 20 22 43 52 45 41 54 45 20 54 41  ecsql "CREATE TA
9b60: 42 4c 45 20 74 24 7b 69 69 7d 28 61 2c 20 62 29  BLE t${ii}(a, b)
9b70: 22 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74  " }.} {}.do_test
9b80: 20 70 61 67 65 72 31 2d 39 2e 33 2e 32 20 7b 0a   pager1-9.3.2 {.
9b90: 20 20 73 71 6c 69 74 65 33 20 64 62 32 20 74 65    sqlite3 db2 te
9ba0: 73 74 2e 64 62 32 0a 0a 20 20 65 78 65 63 73 71  st.db2..  execsq
9bb0: 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 70  l {.    PRAGMA p
9bc0: 61 67 65 5f 73 69 7a 65 20 3d 20 34 30 39 36 3b  age_size = 4096;
9bd0: 0a 20 20 20 20 50 52 41 47 4d 41 20 73 79 6e 63  .    PRAGMA sync
9be0: 68 72 6f 6e 6f 75 73 20 3d 20 4f 46 46 3b 0a 20  hronous = OFF;. 
9bf0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
9c00: 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 43 52  t1(a, b);.    CR
9c10: 45 41 54 45 20 54 41 42 4c 45 20 74 32 28 61 2c  EATE TABLE t2(a,
9c20: 20 62 29 3b 0a 20 20 7d 20 64 62 32 0a 0a 20 20   b);.  } db2..  
9c30: 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 42  sqlite3_backup B
9c40: 20 64 62 32 20 6d 61 69 6e 20 64 62 20 6d 61 69   db2 main db mai
9c50: 6e 0a 20 20 42 20 73 74 65 70 20 33 30 0a 20 20  n.  B step 30.  
9c60: 6c 69 73 74 20 5b 42 20 73 74 65 70 20 31 30 30  list [B step 100
9c70: 30 30 5d 20 5b 42 20 66 69 6e 69 73 68 5d 0a 7d  00] [B finish].}
9c80: 20 7b 53 51 4c 49 54 45 5f 44 4f 4e 45 20 53 51   {SQLITE_DONE SQ
9c90: 4c 49 54 45 5f 4f 4b 7d 0a 64 6f 5f 74 65 73 74  LITE_OK}.do_test
9ca0: 20 70 61 67 65 72 31 2d 39 2e 33 2e 33 20 7b 0a   pager1-9.3.3 {.
9cb0: 20 20 64 62 32 20 63 6c 6f 73 65 0a 20 20 64 62    db2 close.  db
9cc0: 20 63 6c 6f 73 65 0a 20 20 74 76 20 64 65 6c 65   close.  tv dele
9cd0: 74 65 0a 20 20 66 69 6c 65 20 73 69 7a 65 20 74  te.  file size t
9ce0: 65 73 74 2e 64 62 32 0a 7d 20 5b 66 69 6c 65 20  est.db2.} [file 
9cf0: 73 69 7a 65 20 74 65 73 74 2e 64 62 5d 0a 0a 64  size test.db]..d
9d00: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 39 2e  o_test pager1-9.
9d10: 34 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d  4.1 {.  faultsim
9d20: 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70  _delete_and_reop
9d30: 65 6e 0a 20 20 73 71 6c 69 74 65 33 20 64 62 32  en.  sqlite3 db2
9d40: 20 74 65 73 74 2e 64 62 32 0a 20 20 65 78 65 63   test.db2.  exec
9d50: 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41  sql {.    PRAGMA
9d60: 20 70 61 67 65 5f 73 69 7a 65 20 3d 20 34 30 39   page_size = 409
9d70: 36 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  6;.    CREATE TA
9d80: 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20  BLE t1(a, b);.  
9d90: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
9da0: 32 28 61 2c 20 62 29 3b 0a 20 20 7d 20 64 62 32  2(a, b);.  } db2
9db0: 0a 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75  .  sqlite3_backu
9dc0: 70 20 42 20 64 62 32 20 6d 61 69 6e 20 64 62 20  p B db2 main db 
9dd0: 6d 61 69 6e 0a 20 20 6c 69 73 74 20 5b 42 20 73  main.  list [B s
9de0: 74 65 70 20 31 30 30 30 30 5d 20 5b 42 20 66 69  tep 10000] [B fi
9df0: 6e 69 73 68 5d 0a 7d 20 7b 53 51 4c 49 54 45 5f  nish].} {SQLITE_
9e00: 44 4f 4e 45 20 53 51 4c 49 54 45 5f 4f 4b 7d 0a  DONE SQLITE_OK}.
9e10: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 39  do_test pager1-9
9e20: 2e 34 2e 32 20 7b 0a 20 20 6c 69 73 74 20 5b 66  .4.2 {.  list [f
9e30: 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62  ile size test.db
9e40: 32 5d 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65  2] [file size te
9e50: 73 74 2e 64 62 5d 0a 7d 20 7b 30 20 30 7d 0a 64  st.db].} {0 0}.d
9e60: 62 32 20 63 6c 6f 73 65 0a 0a 23 2d 2d 2d 2d 2d  b2 close..#-----
9e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9eb0: 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68 61 74  ----.# Test that
9ec0: 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74   regardless of t
9ed0: 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
9ee0: 64 20 62 79 20 78 53 65 63 74 6f 72 53 69 7a 65  d by xSectorSize
9ef0: 28 29 2c 20 74 68 65 0a 23 20 6d 69 6e 69 6d 75  (), the.# minimu
9f00: 6d 20 65 66 66 65 63 74 69 76 65 20 73 65 63 74  m effective sect
9f10: 6f 72 2d 73 69 7a 65 20 69 73 20 35 31 32 20 61  or-size is 512 a
9f20: 6e 64 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 36  nd the maximum 6
9f30: 35 35 33 36 20 62 79 74 65 73 2e 0a 23 0a 74 65  5536 bytes..#.te
9f40: 73 74 76 66 73 20 74 76 20 2d 64 65 66 61 75 6c  stvfs tv -defaul
9f50: 74 20 31 0a 66 6f 72 65 61 63 68 20 73 65 63 74  t 1.foreach sect
9f60: 6f 72 73 69 7a 65 20 7b 0a 20 20 20 20 33 32 20  orsize {.    32 
9f70: 20 20 36 34 20 20 20 31 32 38 20 20 20 32 35 36    64   128   256
9f80: 20 20 20 35 31 32 20 20 20 31 30 32 34 20 20 20     512   1024   
9f90: 32 30 34 38 20 0a 20 20 20 20 34 30 39 36 20 38  2048 .    4096 8
9fa0: 31 39 32 20 31 36 33 38 34 20 33 32 37 36 38 20  192 16384 32768 
9fb0: 36 35 35 33 36 20 31 33 31 30 37 32 20 32 36 32  65536 131072 262
9fc0: 31 34 34 0a 7d 20 7b 0a 20 20 74 76 20 73 65 63  144.} {.  tv sec
9fd0: 74 6f 72 73 69 7a 65 20 24 73 65 63 74 6f 72 73  torsize $sectors
9fe0: 69 7a 65 0a 20 20 74 76 20 64 65 76 63 68 61 72  ize.  tv devchar
9ff0: 20 7b 7d 0a 20 20 73 65 74 20 65 66 66 20 24 73   {}.  set eff $s
a000: 65 63 74 6f 72 73 69 7a 65 0a 20 20 69 66 20 7b  ectorsize.  if {
a010: 24 73 65 63 74 6f 72 73 69 7a 65 20 3c 20 35 31  $sectorsize < 51
a020: 32 7d 20 20 20 7b 20 73 65 74 20 65 66 66 20 35  2}   { set eff 5
a030: 31 32 20 7d 0a 20 20 69 66 20 7b 24 73 65 63 74  12 }.  if {$sect
a040: 6f 72 73 69 7a 65 20 3e 20 36 35 35 33 36 7d 20  orsize > 65536} 
a050: 7b 20 73 65 74 20 65 66 66 20 36 35 35 33 36 20  { set eff 65536 
a060: 7d 0a 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67  }..  do_test pag
a070: 65 72 31 2d 31 30 2e 24 73 65 63 74 6f 72 73 69  er1-10.$sectorsi
a080: 7a 65 2e 31 20 7b 0a 20 20 20 20 66 61 75 6c 74  ze.1 {.    fault
a090: 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72  sim_delete_and_r
a0a0: 65 6f 70 65 6e 0a 20 20 20 20 64 62 20 66 75 6e  eopen.    db fun
a0b0: 63 20 61 5f 73 74 72 69 6e 67 20 61 5f 73 74 72  c a_string a_str
a0c0: 69 6e 67 0a 20 20 20 20 65 78 65 63 73 71 6c 20  ing.    execsql 
a0d0: 7b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 6a  {.      PRAGMA j
a0e0: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 50 45  ournal_mode = PE
a0f0: 52 53 49 53 54 3b 0a 20 20 20 20 20 20 50 52 41  RSIST;.      PRA
a100: 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20  GMA page_size = 
a110: 31 30 32 34 3b 0a 20 20 20 20 20 20 42 45 47 49  1024;.      BEGI
a120: 4e 3b 0a 20 20 20 20 20 20 20 20 43 52 45 41 54  N;.        CREAT
a130: 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29  E TABLE t1(a, b)
a140: 3b 0a 20 20 20 20 20 20 20 20 43 52 45 41 54 45  ;.        CREATE
a150: 20 54 41 42 4c 45 20 74 32 28 61 2c 20 62 29 3b   TABLE t2(a, b);
a160: 0a 20 20 20 20 20 20 20 20 43 52 45 41 54 45 20  .        CREATE 
a170: 54 41 42 4c 45 20 74 33 28 61 2c 20 62 29 3b 0a  TABLE t3(a, b);.
a180: 20 20 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20        COMMIT;.  
a190: 20 20 7d 0a 20 20 20 20 66 69 6c 65 20 73 69 7a    }.    file siz
a1a0: 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61  e test.db-journa
a1b0: 6c 0a 20 20 7d 20 5b 65 78 70 72 20 24 73 65 63  l.  } [expr $sec
a1c0: 74 6f 72 73 69 7a 65 20 3e 20 36 35 35 33 36 20  torsize > 65536 
a1d0: 3f 20 36 35 35 33 36 20 3a 20 24 73 65 63 74 6f  ? 65536 : $secto
a1e0: 72 73 69 7a 65 5d 0a 0a 20 20 64 6f 5f 74 65 73  rsize]..  do_tes
a1f0: 74 20 70 61 67 65 72 31 2d 31 30 2e 24 73 65 63  t pager1-10.$sec
a200: 74 6f 72 73 69 7a 65 2e 32 20 7b 0a 20 20 20 20  torsize.2 {.    
a210: 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 20  execsql { .     
a220: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 20   INSERT INTO t3 
a230: 56 41 4c 55 45 53 28 61 5f 73 74 72 69 6e 67 28  VALUES(a_string(
a240: 33 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 33  300), a_string(3
a250: 30 30 29 29 3b 0a 20 20 20 20 20 20 49 4e 53 45  00));.      INSE
a260: 52 54 20 49 4e 54 4f 20 74 33 20 53 45 4c 45 43  RT INTO t3 SELEC
a270: 54 20 2a 20 46 52 4f 4d 20 74 33 3b 20 20 20 20  T * FROM t3;    
a280: 20 20 20 20 2f 2a 20 20 32 20 2a 2f 0a 20 20 20      /*  2 */.   
a290: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
a2a0: 33 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  3 SELECT * FROM 
a2b0: 74 33 3b 20 20 20 20 20 20 20 20 2f 2a 20 20 34  t3;        /*  4
a2c0: 20 2a 2f 0a 20 20 20 20 20 20 49 4e 53 45 52 54   */.      INSERT
a2d0: 20 49 4e 54 4f 20 74 33 20 53 45 4c 45 43 54 20   INTO t3 SELECT 
a2e0: 2a 20 46 52 4f 4d 20 74 33 3b 20 20 20 20 20 20  * FROM t3;      
a2f0: 20 20 2f 2a 20 20 38 20 2a 2f 0a 20 20 20 20 20    /*  8 */.     
a300: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 20   INSERT INTO t3 
a310: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 33  SELECT * FROM t3
a320: 3b 20 20 20 20 20 20 20 20 2f 2a 20 31 36 20 2a  ;        /* 16 *
a330: 2f 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  /.      INSERT I
a340: 4e 54 4f 20 74 33 20 53 45 4c 45 43 54 20 2a 20  NTO t3 SELECT * 
a350: 46 52 4f 4d 20 74 33 3b 20 20 20 20 20 20 20 20  FROM t3;        
a360: 2f 2a 20 33 32 20 2a 2f 0a 20 20 20 20 7d 0a 20  /* 32 */.    }. 
a370: 20 7d 20 7b 7d 0a 0a 20 20 64 6f 5f 74 65 73 74   } {}..  do_test
a380: 20 70 61 67 65 72 31 2d 31 30 2e 24 73 65 63 74   pager1-10.$sect
a390: 6f 72 73 69 7a 65 2e 33 20 7b 0a 20 20 20 20 64  orsize.3 {.    d
a3a0: 62 20 63 6c 6f 73 65 0a 20 20 20 20 73 71 6c 69  b close.    sqli
a3b0: 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20  te3 db test.db. 
a3c0: 20 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20     execsql { .  
a3d0: 20 20 20 20 50 52 41 47 4d 41 20 63 61 63 68 65      PRAGMA cache
a3e0: 5f 73 69 7a 65 20 3d 20 31 30 3b 0a 20 20 20 20  _size = 10;.    
a3f0: 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 7d 0a 20    BEGIN;.    }. 
a400: 20 20 20 72 65 63 75 72 73 69 76 65 5f 73 65 6c     recursive_sel
a410: 65 63 74 20 33 32 20 74 33 20 7b 64 62 20 65 76  ect 32 t3 {db ev
a420: 61 6c 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20  al "INSERT INTO 
a430: 74 32 20 56 41 4c 55 45 53 28 31 2c 20 32 29 22  t2 VALUES(1, 2)"
a440: 7d 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a  }.    execsql {.
a450: 20 20 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20        COMMIT;.  
a460: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
a470: 4d 20 74 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 20  M t2;.    }.  } 
a480: 7b 31 20 32 7d 0a 0a 20 20 64 6f 5f 74 65 73 74  {1 2}..  do_test
a490: 20 70 61 67 65 72 31 2d 31 30 2e 24 73 65 63 74   pager1-10.$sect
a4a0: 6f 72 73 69 7a 65 2e 34 20 7b 0a 20 20 20 20 65  orsize.4 {.    e
a4b0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 43  xecsql {.      C
a4c0: 52 45 41 54 45 20 54 41 42 4c 45 20 74 36 28 61  REATE TABLE t6(a
a4d0: 2c 20 62 29 3b 0a 20 20 20 20 20 20 43 52 45 41  , b);.      CREA
a4e0: 54 45 20 54 41 42 4c 45 20 74 37 28 61 2c 20 62  TE TABLE t7(a, b
a4f0: 29 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45 20  );.      CREATE 
a500: 54 41 42 4c 45 20 74 35 28 61 2c 20 62 29 3b 0a  TABLE t5(a, b);.
a510: 20 20 20 20 20 20 44 52 4f 50 20 54 41 42 4c 45        DROP TABLE
a520: 20 74 36 3b 0a 20 20 20 20 20 20 44 52 4f 50 20   t6;.      DROP 
a530: 54 41 42 4c 45 20 74 37 3b 0a 20 20 20 20 7d 0a  TABLE t7;.    }.
a540: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20      execsql {.  
a550: 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20      BEGIN;.     
a560: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
a570: 74 36 28 61 2c 20 62 29 3b 0a 20 20 20 20 7d 0a  t6(a, b);.    }.
a580: 20 20 20 20 72 65 63 75 72 73 69 76 65 5f 73 65      recursive_se
a590: 6c 65 63 74 20 33 32 20 74 33 20 7b 64 62 20 65  lect 32 t3 {db e
a5a0: 76 61 6c 20 22 49 4e 53 45 52 54 20 49 4e 54 4f  val "INSERT INTO
a5b0: 20 74 35 20 56 41 4c 55 45 53 28 31 2c 20 32 29   t5 VALUES(1, 2)
a5c0: 22 7d 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b  "}.    execsql {
a5d0: 0a 20 20 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20  .      COMMIT;. 
a5e0: 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52       SELECT * FR
a5f0: 4f 4d 20 74 35 3b 0a 20 20 20 20 7d 0a 20 20 7d  OM t5;.    }.  }
a600: 20 7b 31 20 32 7d 0a 20 20 0a 7d 0a 64 62 20 63   {1 2}.  .}.db c
a610: 6c 6f 73 65 0a 0a 74 76 20 73 65 63 74 6f 72 73  lose..tv sectors
a620: 69 7a 65 20 34 30 39 36 0a 64 6f 5f 74 65 73 74  ize 4096.do_test
a630: 20 70 61 67 65 72 31 2e 31 30 2e 78 2e 31 20 7b   pager1.10.x.1 {
a640: 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65  .  faultsim_dele
a650: 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20  te_and_reopen.  
a660: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52  execsql {.    PR
a670: 41 47 4d 41 20 61 75 74 6f 5f 76 61 63 75 75 6d  AGMA auto_vacuum
a680: 20 3d 20 6e 6f 6e 65 3b 0a 20 20 20 20 50 52 41   = none;.    PRA
a690: 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20  GMA page_size = 
a6a0: 31 30 32 34 3b 0a 20 20 20 20 43 52 45 41 54 45  1024;.    CREATE
a6b0: 20 54 41 42 4c 45 20 74 31 28 78 29 3b 0a 20 20   TABLE t1(x);.  
a6c0: 7d 0a 20 20 66 6f 72 20 7b 73 65 74 20 69 20 30  }.  for {set i 0
a6d0: 7d 20 7b 24 69 3c 33 30 7d 20 7b 69 6e 63 72 20  } {$i<30} {incr 
a6e0: 69 7d 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c  i} {.    execsql
a6f0: 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74   { INSERT INTO t
a700: 31 20 56 41 4c 55 45 53 28 7a 65 72 6f 62 6c 6f  1 VALUES(zeroblo
a710: 62 28 39 30 30 29 29 20 7d 0a 20 20 7d 0a 20 20  b(900)) }.  }.  
a720: 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64  file size test.d
a730: 62 0a 7d 20 7b 33 32 37 36 38 7d 0a 64 6f 5f 74  b.} {32768}.do_t
a740: 65 73 74 20 70 61 67 65 72 31 2e 31 30 2e 78 2e  est pager1.10.x.
a750: 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  2 {.  execsql {.
a760: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
a770: 20 74 32 28 78 29 3b 0a 20 20 20 20 44 52 4f 50   t2(x);.    DROP
a780: 20 54 41 42 4c 45 20 74 32 3b 0a 20 20 7d 0a 20   TABLE t2;.  }. 
a790: 20 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e   file size test.
a7a0: 64 62 0a 7d 20 7b 33 33 37 39 32 7d 0a 64 6f 5f  db.} {33792}.do_
a7b0: 74 65 73 74 20 70 61 67 65 72 31 2e 31 30 2e 78  test pager1.10.x
a7c0: 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .3 {.  execsql {
a7d0: 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20  .    BEGIN;.    
a7e0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32 28  CREATE TABLE t2(
a7f0: 78 29 3b 0a 20 20 7d 0a 20 20 72 65 63 75 72 73  x);.  }.  recurs
a800: 69 76 65 5f 73 65 6c 65 63 74 20 33 30 20 74 31  ive_select 30 t1
a810: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
a820: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 33   CREATE TABLE t3
a830: 28 78 29 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b  (x);.    COMMIT;
a840: 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 64 62 20 63 6c  .  }.} {}..db cl
a850: 6f 73 65 0a 74 76 20 64 65 6c 65 74 65 0a 0a 74  ose.tv delete..t
a860: 65 73 74 76 66 73 20 74 76 20 2d 64 65 66 61 75  estvfs tv -defau
a870: 6c 74 20 31 0a 66 61 75 6c 74 73 69 6d 5f 64 65  lt 1.faultsim_de
a880: 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a  lete_and_reopen.
a890: 64 62 20 66 75 6e 63 20 61 5f 73 74 72 69 6e 67  db func a_string
a8a0: 20 61 5f 73 74 72 69 6e 67 0a 64 6f 5f 65 78 65   a_string.do_exe
a8b0: 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31  csql_test pager1
a8c0: 2d 31 31 2e 31 20 7b 0a 20 20 50 52 41 47 4d 41  -11.1 {.  PRAGMA
a8d0: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20   journal_mode = 
a8e0: 44 45 4c 45 54 45 3b 0a 20 20 50 52 41 47 4d 41  DELETE;.  PRAGMA
a8f0: 20 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 31 30   cache_size = 10
a900: 3b 0a 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 43  ;.  BEGIN;.    C
a910: 52 45 41 54 45 20 54 41 42 4c 45 20 7a 7a 28 74  REATE TABLE zz(t
a920: 6f 70 20 50 52 49 4d 41 52 59 20 4b 45 59 29 3b  op PRIMARY KEY);
a930: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
a940: 20 7a 7a 20 56 41 4c 55 45 53 28 61 5f 73 74 72   zz VALUES(a_str
a950: 69 6e 67 28 32 32 32 29 29 3b 0a 20 20 20 20 49  ing(222));.    I
a960: 4e 53 45 52 54 20 49 4e 54 4f 20 7a 7a 20 53 45  NSERT INTO zz SE
a970: 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 28 53  LECT a_string((S
a980: 45 4c 45 43 54 20 32 32 32 2b 6d 61 78 28 72 6f  ELECT 222+max(ro
a990: 77 69 64 29 20 46 52 4f 4d 20 7a 7a 29 29 20 46  wid) FROM zz)) F
a9a0: 52 4f 4d 20 7a 7a 3b 0a 20 20 20 20 49 4e 53 45  ROM zz;.    INSE
a9b0: 52 54 20 49 4e 54 4f 20 7a 7a 20 53 45 4c 45 43  RT INTO zz SELEC
a9c0: 54 20 61 5f 73 74 72 69 6e 67 28 28 53 45 4c 45  T a_string((SELE
a9d0: 43 54 20 32 32 32 2b 6d 61 78 28 72 6f 77 69 64  CT 222+max(rowid
a9e0: 29 20 46 52 4f 4d 20 7a 7a 29 29 20 46 52 4f 4d  ) FROM zz)) FROM
a9f0: 20 7a 7a 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   zz;.    INSERT 
aa00: 49 4e 54 4f 20 7a 7a 20 53 45 4c 45 43 54 20 61  INTO zz SELECT a
aa10: 5f 73 74 72 69 6e 67 28 28 53 45 4c 45 43 54 20  _string((SELECT 
aa20: 32 32 32 2b 6d 61 78 28 72 6f 77 69 64 29 20 46  222+max(rowid) F
aa30: 52 4f 4d 20 7a 7a 29 29 20 46 52 4f 4d 20 7a 7a  ROM zz)) FROM zz
aa40: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
aa50: 4f 20 7a 7a 20 53 45 4c 45 43 54 20 61 5f 73 74  O zz SELECT a_st
aa60: 72 69 6e 67 28 28 53 45 4c 45 43 54 20 32 32 32  ring((SELECT 222
aa70: 2b 6d 61 78 28 72 6f 77 69 64 29 20 46 52 4f 4d  +max(rowid) FROM
aa80: 20 7a 7a 29 29 20 46 52 4f 4d 20 7a 7a 3b 0a 20   zz)) FROM zz;. 
aa90: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a     INSERT INTO z
aaa0: 7a 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e  z SELECT a_strin
aab0: 67 28 28 53 45 4c 45 43 54 20 32 32 32 2b 6d 61  g((SELECT 222+ma
aac0: 78 28 72 6f 77 69 64 29 20 46 52 4f 4d 20 7a 7a  x(rowid) FROM zz
aad0: 29 29 20 46 52 4f 4d 20 7a 7a 3b 0a 20 20 43 4f  )) FROM zz;.  CO
aae0: 4d 4d 49 54 3b 0a 20 20 42 45 47 49 4e 3b 0a 20  MMIT;.  BEGIN;. 
aaf0: 20 20 20 55 50 44 41 54 45 20 7a 7a 20 53 45 54     UPDATE zz SET
ab00: 20 74 6f 70 20 3d 20 61 5f 73 74 72 69 6e 67 28   top = a_string(
ab10: 33 34 35 29 3b 0a 7d 20 7b 64 65 6c 65 74 65 7d  345);.} {delete}
ab20: 0a 0a 70 72 6f 63 20 6c 6f 63 6b 6f 75 74 20 7b  ..proc lockout {
ab30: 6d 65 74 68 6f 64 20 61 72 67 73 7d 20 7b 20 72  method args} { r
ab40: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
ab50: 52 52 20 7d 0a 74 76 20 73 63 72 69 70 74 20 6c  RR }.tv script l
ab60: 6f 63 6b 6f 75 74 0a 74 76 20 66 69 6c 74 65 72  ockout.tv filter
ab70: 20 7b 78 57 72 69 74 65 20 78 54 72 75 6e 63 61   {xWrite xTrunca
ab80: 74 65 20 78 53 79 6e 63 7d 0a 64 6f 5f 63 61 74  te xSync}.do_cat
ab90: 63 68 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72  chsql_test pager
aba0: 31 2d 31 31 2e 32 20 7b 20 43 4f 4d 4d 49 54 20  1-11.2 { COMMIT 
abb0: 7d 20 7b 31 20 7b 64 69 73 6b 20 49 2f 4f 20 65  } {1 {disk I/O e
abc0: 72 72 6f 72 7d 7d 0a 0a 74 76 20 73 63 72 69 70  rror}}..tv scrip
abd0: 74 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67  t {}.do_test pag
abe0: 65 72 31 2d 31 31 2e 33 20 7b 0a 20 20 73 71 6c  er1-11.3 {.  sql
abf0: 69 74 65 33 20 64 62 32 20 74 65 73 74 2e 64 62  ite3 db2 test.db
ac00: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
ac10: 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f   PRAGMA journal_
ac20: 6d 6f 64 65 20 3d 20 54 52 55 4e 43 41 54 45 3b  mode = TRUNCATE;
ac30: 0a 20 20 20 20 50 52 41 47 4d 41 20 69 6e 74 65  .    PRAGMA inte
ac40: 67 72 69 74 79 5f 63 68 65 63 6b 3b 0a 20 20 7d  grity_check;.  }
ac50: 20 64 62 32 0a 7d 20 7b 74 72 75 6e 63 61 74 65   db2.} {truncate
ac60: 20 6f 6b 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67   ok}.do_test pag
ac70: 65 72 31 2d 31 31 2e 34 20 7b 0a 20 20 64 62 32  er1-11.4 {.  db2
ac80: 20 63 6c 6f 73 65 0a 20 20 66 69 6c 65 20 65 78   close.  file ex
ac90: 69 73 74 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75  ists test.db-jou
aca0: 72 6e 61 6c 0a 7d 20 7b 30 7d 0a 64 6f 5f 65 78  rnal.} {0}.do_ex
acb0: 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72  ecsql_test pager
acc0: 31 2d 31 31 2e 35 20 7b 20 53 45 4c 45 43 54 20  1-11.5 { SELECT 
acd0: 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 7a 7a  count(*) FROM zz
ace0: 20 7d 20 7b 33 32 7d 0a 64 62 20 63 6c 6f 73 65   } {32}.db close
acf0: 0a 74 76 20 64 65 6c 65 74 65 0a 20 20 0a 23 2d  .tv delete.  .#-
ad00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ad10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ad20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ad30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ad40: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20  --------.# Test 
ad50: 22 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a  "PRAGMA page_siz
ad60: 65 22 0a 23 0a 74 65 73 74 76 66 73 20 74 76 20  e".#.testvfs tv 
ad70: 2d 64 65 66 61 75 6c 74 20 31 0a 74 76 20 73 65  -default 1.tv se
ad80: 63 74 6f 72 73 69 7a 65 20 31 30 32 34 0a 66 6f  ctorsize 1024.fo
ad90: 72 65 61 63 68 20 70 61 67 65 73 69 7a 65 20 7b  reach pagesize {
ada0: 0a 20 20 20 20 35 31 32 20 20 20 31 30 32 34 20  .    512   1024 
adb0: 20 20 32 30 34 38 20 34 30 39 36 20 38 31 39 32    2048 4096 8192
adc0: 20 31 36 33 38 34 20 33 32 37 36 38 20 0a 7d 20   16384 32768 .} 
add0: 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c  {.  faultsim_del
ade0: 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 0a  ete_and_reopen..
adf0: 20 20 23 20 54 68 65 20 73 65 63 74 6f 72 2d 73    # The sector-s
ae00: 69 7a 65 20 28 61 63 63 6f 72 64 69 6e 67 20 74  ize (according t
ae10: 6f 20 74 68 65 20 56 46 53 29 20 69 73 20 31 30  o the VFS) is 10
ae20: 32 34 20 62 79 74 65 73 2e 20 53 6f 20 69 66 20  24 bytes. So if 
ae30: 74 68 65 0a 20 20 23 20 70 61 67 65 2d 73 69 7a  the.  # page-siz
ae40: 65 20 72 65 71 75 65 73 74 65 64 20 75 73 69 6e  e requested usin
ae50: 67 20 22 50 52 41 47 4d 41 20 70 61 67 65 5f 73  g "PRAGMA page_s
ae60: 69 7a 65 22 20 69 73 20 67 72 65 61 74 65 72 20  ize" is greater 
ae70: 74 68 61 6e 20 74 68 65 0a 20 20 23 20 63 6f 6d  than the.  # com
ae80: 70 69 6c 65 20 74 69 6d 65 20 76 61 6c 75 65 20  pile time value 
ae90: 6f 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41  of SQLITE_MAX_PA
aea0: 47 45 5f 53 49 5a 45 2c 20 74 68 65 6e 20 74 68  GE_SIZE, then th
aeb0: 65 20 65 66 66 65 63 74 69 76 65 20 0a 20 20 23  e effective .  #
aec0: 20 70 61 67 65 2d 73 69 7a 65 20 72 65 6d 61 69   page-size remai
aed0: 6e 73 20 31 30 32 34 20 62 79 74 65 73 2e 0a 20  ns 1024 bytes.. 
aee0: 20 23 0a 20 20 73 65 74 20 65 66 66 20 24 70 61   #.  set eff $pa
aef0: 67 65 73 69 7a 65 0a 20 20 69 66 20 7b 24 65 66  gesize.  if {$ef
af00: 66 20 3e 20 24 3a 3a 53 51 4c 49 54 45 5f 4d 41  f > $::SQLITE_MA
af10: 58 5f 50 41 47 45 5f 53 49 5a 45 7d 20 7b 20 73  X_PAGE_SIZE} { s
af20: 65 74 20 65 66 66 20 31 30 32 34 20 7d 0a 0a 20  et eff 1024 }.. 
af30: 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
af40: 31 32 2e 24 70 61 67 65 73 69 7a 65 2e 31 20 7b  12.$pagesize.1 {
af50: 0a 20 20 20 20 73 71 6c 69 74 65 33 20 64 62 32  .    sqlite3 db2
af60: 20 74 65 73 74 2e 64 62 0a 20 20 20 20 65 78 65   test.db.    exe
af70: 63 73 71 6c 20 22 0a 20 20 20 20 20 20 50 52 41  csql ".      PRA
af80: 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20  GMA page_size = 
af90: 24 70 61 67 65 73 69 7a 65 3b 0a 20 20 20 20 20  $pagesize;.     
afa0: 20 43 52 45 41 54 45 20 56 49 45 57 20 76 20 41   CREATE VIEW v A
afb0: 53 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  S SELECT * FROM 
afc0: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 3b 0a 20  sqlite_master;. 
afd0: 20 20 20 22 20 64 62 32 0a 20 20 20 20 66 69 6c     " db2.    fil
afe0: 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 0a 20  e size test.db. 
aff0: 20 7d 20 24 65 66 66 0a 20 20 64 6f 5f 74 65 73   } $eff.  do_tes
b000: 74 20 70 61 67 65 72 31 2d 31 32 2e 24 70 61 67  t pager1-12.$pag
b010: 65 73 69 7a 65 2e 32 20 7b 0a 20 20 20 20 73 71  esize.2 {.    sq
b020: 6c 69 74 65 33 20 64 62 32 20 74 65 73 74 2e 64  lite3 db2 test.d
b030: 62 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20  b.    execsql { 
b040: 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 63 6f  .      SELECT co
b050: 75 6e 74 28 2a 29 20 46 52 4f 4d 20 76 3b 0a 20  unt(*) FROM v;. 
b060: 20 20 20 20 20 50 52 41 47 4d 41 20 6d 61 69 6e       PRAGMA main
b070: 2e 70 61 67 65 5f 73 69 7a 65 3b 0a 20 20 20 20  .page_size;.    
b080: 7d 20 64 62 32 0a 20 20 7d 20 5b 6c 69 73 74 20  } db2.  } [list 
b090: 31 20 24 65 66 66 5d 0a 20 20 64 6f 5f 74 65 73  1 $eff].  do_tes
b0a0: 74 20 70 61 67 65 72 31 2d 31 32 2e 24 70 61 67  t pager1-12.$pag
b0b0: 65 73 69 7a 65 2e 33 20 7b 0a 20 20 20 20 65 78  esize.3 {.    ex
b0c0: 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 20 20 53  ecsql { .      S
b0d0: 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
b0e0: 52 4f 4d 20 76 3b 0a 20 20 20 20 20 20 50 52 41  ROM v;.      PRA
b0f0: 47 4d 41 20 6d 61 69 6e 2e 70 61 67 65 5f 73 69  GMA main.page_si
b100: 7a 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 5b 6c  ze;.    }.  } [l
b110: 69 73 74 20 31 20 24 65 66 66 5d 0a 20 20 64 62  ist 1 $eff].  db
b120: 32 20 63 6c 6f 73 65 0a 7d 0a 64 62 20 63 6c 6f  2 close.}.db clo
b130: 73 65 0a 74 76 20 64 65 6c 65 74 65 0a 0a 23 2d  se.tv delete..#-
b140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b180: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20  --------.# Test 
b190: 73 70 65 63 61 6c 20 22 50 52 41 47 4d 41 20 6a  specal "PRAGMA j
b1a0: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 50 45 52 53  ournal_mode=PERS
b1b0: 49 53 54 22 20 74 65 73 74 20 63 61 73 65 73 2e  IST" test cases.
b1c0: 0a 23 0a 23 20 70 61 67 65 72 31 2d 31 33 2e 31  .#.# pager1-13.1
b1d0: 2e 2a 3a 20 54 68 69 73 20 74 65 73 74 73 20 61  .*: This tests a
b1e0: 20 73 70 65 63 69 61 6c 20 63 61 73 65 20 65 6e   special case en
b1f0: 63 6f 75 6e 74 65 72 65 64 20 69 6e 20 70 65 72  countered in per
b200: 73 69 73 74 65 6e 74 20 0a 23 20 20 20 20 20 20  sistent .#      
b210: 20 20 20 20 20 20 20 20 20 20 6a 6f 75 72 6e 61            journa
b220: 6c 20 6d 6f 64 65 3a 20 49 66 20 74 68 65 20 6a  l mode: If the j
b230: 6f 75 72 6e 61 6c 20 61 73 73 6f 63 69 61 74 65  ournal associate
b240: 64 20 77 69 74 68 20 61 20 74 72 61 6e 73 61 63  d with a transac
b250: 74 69 6f 6e 0a 23 20 20 20 20 20 20 20 20 20 20  tion.#          
b260: 20 20 20 20 20 20 69 73 20 73 6d 61 6c 6c 65 72        is smaller
b270: 20 74 68 61 6e 20 74 68 65 20 6a 6f 75 72 6e 61   than the journa
b280: 6c 20 66 69 6c 65 20 28 62 65 63 61 75 73 65 20  l file (because 
b290: 61 20 70 72 65 76 69 6f 75 73 20 0a 23 20 20 20  a previous .#   
b2a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72 61               tra
b2b0: 6e 73 61 63 74 69 6f 6e 20 6c 65 66 74 20 61 20  nsaction left a 
b2c0: 76 65 72 79 20 6c 61 72 67 65 20 6e 6f 6e 2d 68  very large non-h
b2d0: 6f 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ot journal file 
b2e0: 69 6e 20 74 68 65 0a 23 20 20 20 20 20 20 20 20  in the.#        
b2f0: 20 20 20 20 20 20 20 20 66 69 6c 65 2d 73 79 73          file-sys
b300: 74 65 6d 29 2c 20 74 68 65 6e 20 53 51 4c 69 74  tem), then SQLit
b310: 65 20 68 61 73 20 74 6f 20 62 65 20 63 61 72 65  e has to be care
b320: 66 75 6c 20 74 68 61 74 20 74 68 65 72 65 20 69  ful that there i
b330: 73 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20  s.#             
b340: 20 20 20 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c     not a journal
b350: 2d 68 65 61 64 65 72 20 6c 65 66 74 20 6f 76 65  -header left ove
b360: 72 20 66 72 6f 6d 20 61 20 70 72 65 76 69 6f 75  r from a previou
b370: 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 23 20  s transaction.# 
b380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
b390: 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f  mmediately follo
b3a0: 77 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c  wing the journal
b3b0: 20 63 6f 6e 74 65 6e 74 20 6a 75 73 74 20 77 72   content just wr
b3c0: 69 74 74 65 6e 2e 0a 23 20 20 20 20 20 20 20 20  itten..#        
b3d0: 20 20 20 20 20 20 20 20 49 66 20 74 68 65 72 65          If there
b3e0: 20 69 73 2c 20 61 6e 64 20 74 68 65 20 70 72 6f   is, and the pro
b3f0: 63 65 73 73 20 63 72 61 73 68 65 73 20 73 6f 20  cess crashes so 
b400: 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  that the journal
b410: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
b420: 20 20 62 65 63 6f 6d 65 73 20 61 20 68 6f 74 2d    becomes a hot-
b430: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 6d 75 73 74  journal and must
b440: 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20   be rolled back 
b450: 62 79 20 61 6e 6f 74 68 65 72 0a 23 20 20 20 20  by another.#    
b460: 20 20 20 20 20 20 20 20 20 20 20 20 70 72 6f 63              proc
b470: 65 73 73 2c 20 74 68 65 72 65 20 69 73 20 61 20  ess, there is a 
b480: 64 61 6e 67 65 72 20 74 68 61 74 20 74 68 65 20  danger that the 
b490: 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 6d 61  other process ma
b4a0: 79 20 72 6f 6c 6c 0a 23 20 20 20 20 20 20 20 20  y roll.#        
b4b0: 20 20 20 20 20 20 20 20 62 61 63 6b 20 74 68 65          back the
b4c0: 20 61 62 6f 72 74 65 64 20 74 72 61 6e 73 61 63   aborted transac
b4d0: 74 69 6f 6e 2c 20 74 68 65 6e 20 63 6f 6e 74 69  tion, then conti
b4e0: 6e 75 65 20 63 6f 70 79 69 6e 67 20 64 61 74 61  nue copying data
b4f0: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
b500: 20 20 66 72 6f 6d 20 61 6e 20 6f 6c 64 65 72 20    from an older 
b510: 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 72 6f 6d  transaction from
b520: 20 74 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f   the remainder o
b530: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 23  f the journal..#
b540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b550: 53 65 65 20 74 68 65 20 73 79 6e 63 4a 6f 75 72  See the syncJour
b560: 6e 61 6c 28 29 20 66 75 6e 63 74 69 6f 6e 20 66  nal() function f
b570: 6f 72 20 64 65 74 61 69 6c 73 2e 0a 23 0a 23 20  or details..#.# 
b580: 70 61 67 65 72 31 2d 31 33 2e 32 2e 2a 3a 20 53  pager1-13.2.*: S
b590: 61 6d 65 20 74 65 73 74 20 61 73 20 74 68 65 20  ame test as the 
b5a0: 70 72 65 76 69 6f 75 73 2e 20 54 68 69 73 20 74  previous. This t
b5b0: 69 6d 65 2c 20 74 68 72 6f 77 20 61 6e 20 69 6e  ime, throw an in
b5c0: 64 65 78 20 69 6e 74 6f 0a 23 20 20 20 20 20 20  dex into.#      
b5d0: 20 20 20 20 20 20 20 20 20 20 74 68 65 20 6d 69            the mi
b5e0: 78 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 69 6e  x to make the in
b5f0: 74 65 67 72 69 74 79 2d 63 68 65 63 6b 20 6d 6f  tegrity-check mo
b600: 72 65 20 6c 69 6b 65 6c 79 20 74 6f 20 63 61 74  re likely to cat
b610: 63 68 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  ch.#            
b620: 20 20 20 20 65 72 72 6f 72 73 2e 0a 23 0a 74 65      errors..#.te
b630: 73 74 76 66 73 20 74 76 20 2d 64 65 66 61 75 6c  stvfs tv -defaul
b640: 74 20 31 0a 74 76 20 73 63 72 69 70 74 20 78 53  t 1.tv script xS
b650: 79 6e 63 43 62 0a 74 76 20 66 69 6c 74 65 72 20  yncCb.tv filter 
b660: 78 53 79 6e 63 0a 70 72 6f 63 20 78 53 79 6e 63  xSync.proc xSync
b670: 43 62 20 7b 6d 65 74 68 6f 64 20 66 69 6c 65 6e  Cb {method filen
b680: 61 6d 65 20 61 72 67 73 7d 20 7b 0a 20 20 73 65  ame args} {.  se
b690: 74 20 74 20 5b 66 69 6c 65 20 74 61 69 6c 20 24  t t [file tail $
b6a0: 66 69 6c 65 6e 61 6d 65 5d 0a 20 20 69 66 20 7b  filename].  if {
b6b0: 24 74 20 3d 3d 20 22 74 65 73 74 2e 64 62 22 7d  $t == "test.db"}
b6c0: 20 66 61 75 6c 74 73 69 6d 5f 73 61 76 65 0a 20   faultsim_save. 
b6d0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
b6e0: 4b 0a 7d 0a 66 61 75 6c 74 73 69 6d 5f 64 65 6c  K.}.faultsim_del
b6f0: 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 64  ete_and_reopen.d
b700: 62 20 66 75 6e 63 20 61 5f 73 74 72 69 6e 67 20  b func a_string 
b710: 61 5f 73 74 72 69 6e 67 0a 0a 23 20 54 68 65 20  a_string..# The 
b720: 55 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74  UPDATE statement
b730: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
b740: 68 69 73 20 74 65 73 74 20 63 61 73 65 20 63 72  his test case cr
b750: 65 61 74 65 73 20 61 20 72 65 61 6c 6c 79 20 62  eates a really b
b760: 69 67 0a 23 20 6a 6f 75 72 6e 61 6c 2e 20 53 69  ig.# journal. Si
b770: 6e 63 65 20 74 68 65 20 63 61 63 68 65 2d 73 69  nce the cache-si
b780: 7a 65 20 69 73 20 6f 6e 6c 79 20 31 30 20 70 61  ze is only 10 pa
b790: 67 65 73 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ges, the journal
b7a0: 20 63 6f 6e 74 61 69 6e 73 20 0a 23 20 66 72 65   contains .# fre
b7b0: 71 75 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 68 65  quent journal he
b7c0: 61 64 65 72 73 2e 0a 23 0a 64 6f 5f 65 78 65 63  aders..#.do_exec
b7d0: 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d  sql_test pager1-
b7e0: 31 33 2e 31 2e 31 20 7b 0a 20 20 50 52 41 47 4d  13.1.1 {.  PRAGM
b7f0: 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20 31 30  A page_size = 10
b800: 32 34 3b 0a 20 20 50 52 41 47 4d 41 20 6a 6f 75  24;.  PRAGMA jou
b810: 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 50 45 52 53  rnal_mode = PERS
b820: 49 53 54 3b 0a 20 20 50 52 41 47 4d 41 20 63 61  IST;.  PRAGMA ca
b830: 63 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b 0a 20  che_size = 10;. 
b840: 20 42 45 47 49 4e 3b 0a 20 20 20 20 43 52 45 41   BEGIN;.    CREA
b850: 54 45 20 54 41 42 4c 45 20 74 31 28 61 20 49 4e  TE TABLE t1(a IN
b860: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
b870: 59 2c 20 62 20 42 4c 4f 42 29 3b 0a 20 20 20 20  Y, b BLOB);.    
b880: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
b890: 41 4c 55 45 53 28 4e 55 4c 4c 2c 20 61 5f 73 74  ALUES(NULL, a_st
b8a0: 72 69 6e 67 28 34 30 30 29 29 3b 0a 20 20 20 20  ring(400));.    
b8b0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
b8c0: 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 61 5f 73 74  ELECT NULL, a_st
b8d0: 72 69 6e 67 28 34 30 30 29 20 46 52 4f 4d 20 74  ring(400) FROM t
b8e0: 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20  1;          /*  
b8f0: 20 32 20 2a 2f 0a 20 20 20 20 49 4e 53 45 52 54   2 */.    INSERT
b900: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
b910: 4e 55 4c 4c 2c 20 61 5f 73 74 72 69 6e 67 28 34  NULL, a_string(4
b920: 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20  00) FROM t1;    
b930: 20 20 20 20 20 20 2f 2a 20 20 20 34 20 2a 2f 0a        /*   4 */.
b940: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
b950: 74 31 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20  t1 SELECT NULL, 
b960: 61 5f 73 74 72 69 6e 67 28 34 30 30 29 20 46 52  a_string(400) FR
b970: 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 20 20 20  OM t1;          
b980: 2f 2a 20 20 20 38 20 2a 2f 0a 20 20 20 20 49 4e  /*   8 */.    IN
b990: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
b9a0: 45 43 54 20 4e 55 4c 4c 2c 20 61 5f 73 74 72 69  ECT NULL, a_stri
b9b0: 6e 67 28 34 30 30 29 20 46 52 4f 4d 20 74 31 3b  ng(400) FROM t1;
b9c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20 31 36            /*  16
b9d0: 20 2a 2f 0a 20 20 20 20 49 4e 53 45 52 54 20 49   */.    INSERT I
b9e0: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 4e 55  NTO t1 SELECT NU
b9f0: 4c 4c 2c 20 61 5f 73 74 72 69 6e 67 28 34 30 30  LL, a_string(400
ba00: 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20  ) FROM t1;      
ba10: 20 20 20 20 2f 2a 20 20 33 32 20 2a 2f 0a 20 20      /*  32 */.  
ba20: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
ba30: 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 61 5f   SELECT NULL, a_
ba40: 73 74 72 69 6e 67 28 34 30 30 29 20 46 52 4f 4d  string(400) FROM
ba50: 20 74 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a   t1;          /*
ba60: 20 20 36 34 20 2a 2f 0a 20 20 20 20 49 4e 53 45    64 */.    INSE
ba70: 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
ba80: 54 20 4e 55 4c 4c 2c 20 61 5f 73 74 72 69 6e 67  T NULL, a_string
ba90: 28 34 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20  (400) FROM t1;  
baa0: 20 20 20 20 20 20 20 20 2f 2a 20 31 32 38 20 2a          /* 128 *
bab0: 2f 0a 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 55 50  /.  COMMIT;.  UP
bac0: 44 41 54 45 20 74 31 20 53 45 54 20 62 20 3d 20  DATE t1 SET b = 
bad0: 61 5f 73 74 72 69 6e 67 28 34 30 30 29 3b 0a 7d  a_string(400);.}
bae0: 20 7b 70 65 72 73 69 73 74 7d 0a 0a 69 66 20 7b   {persist}..if {
baf0: 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28  $::tcl_platform(
bb00: 70 6c 61 74 66 6f 72 6d 29 21 3d 22 77 69 6e 64  platform)!="wind
bb10: 6f 77 73 22 7d 20 7b 0a 23 20 52 75 6e 20 74 72  ows"} {.# Run tr
bb20: 61 6e 73 61 63 74 69 6f 6e 73 20 6f 66 20 69 6e  ansactions of in
bb30: 63 72 65 61 73 69 6e 67 20 73 69 7a 65 73 2e 20  creasing sizes. 
bb40: 45 76 65 6e 74 75 61 6c 6c 79 2c 20 6f 6e 65 20  Eventually, one 
bb50: 28 6f 72 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  (or more than on
bb60: 65 29 0a 23 20 6f 66 20 74 68 65 73 65 20 77 69  e).# of these wi
bb70: 6c 6c 20 77 72 69 74 65 20 6a 75 73 74 20 65 6e  ll write just en
bb80: 6f 75 67 68 20 63 6f 6e 74 65 6e 74 20 74 68 61  ough content tha
bb90: 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 6f 6c 64  t one of the old
bba0: 20 68 65 61 64 65 72 73 20 63 72 65 61 74 65 64   headers created
bbb0: 20 0a 23 20 62 79 20 74 68 65 20 74 72 61 6e 73   .# by the trans
bbc0: 61 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 62 6c  action in the bl
bbd0: 6f 63 6b 20 61 62 6f 76 65 20 6c 69 65 73 20 69  ock above lies i
bbe0: 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72  mmediately after
bbf0: 20 74 68 65 20 63 6f 6e 74 65 6e 74 0a 23 20 6a   the content.# j
bc00: 6f 75 72 6e 61 6c 6c 65 64 20 62 79 20 74 68 65  ournalled by the
bc10: 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
bc20: 74 69 6f 6e 2e 0a 23 0a 66 6f 72 20 7b 73 65 74  tion..#.for {set
bc30: 20 6e 55 70 20 31 7d 20 7b 24 6e 55 70 3c 36 34   nUp 1} {$nUp<64
bc40: 7d 20 7b 69 6e 63 72 20 6e 55 70 7d 20 7b 0a 20  } {incr nUp} {. 
bc50: 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74   do_execsql_test
bc60: 20 70 61 67 65 72 31 2d 31 33 2e 31 2e 32 2e 24   pager1-13.1.2.$
bc70: 6e 55 70 2e 31 20 7b 20 0a 20 20 20 20 55 50 44  nUp.1 { .    UPD
bc80: 41 54 45 20 74 31 20 53 45 54 20 62 20 3d 20 61  ATE t1 SET b = a
bc90: 5f 73 74 72 69 6e 67 28 33 39 39 29 20 57 48 45  _string(399) WHE
bca0: 52 45 20 61 20 3c 3d 20 24 6e 55 70 0a 20 20 7d  RE a <= $nUp.  }
bcb0: 20 7b 7d 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c   {}.  do_execsql
bcc0: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 33 2e  _test pager1-13.
bcd0: 31 2e 32 2e 24 6e 55 70 2e 32 20 7b 20 50 52 41  1.2.$nUp.2 { PRA
bce0: 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68  GMA integrity_ch
bcf0: 65 63 6b 20 7d 20 7b 6f 6b 7d 20 0a 0a 20 20 23  eck } {ok} ..  #
bd00: 20 54 72 79 20 74 6f 20 61 63 63 65 73 73 20 74   Try to access t
bd10: 68 65 20 73 6e 61 70 73 68 6f 74 20 6f 66 20 74  he snapshot of t
bd20: 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e 0a  he file-system..
bd30: 20 20 23 0a 20 20 73 71 6c 69 74 65 33 20 64 62    #.  sqlite3 db
bd40: 32 20 73 76 5f 74 65 73 74 2e 64 62 0a 20 20 64  2 sv_test.db.  d
bd50: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 33  o_test pager1-13
bd60: 2e 31 2e 32 2e 24 6e 55 70 2e 33 20 7b 0a 20 20  .1.2.$nUp.3 {.  
bd70: 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45    execsql { SELE
bd80: 43 54 20 73 75 6d 28 6c 65 6e 67 74 68 28 62 29  CT sum(length(b)
bd90: 29 20 46 52 4f 4d 20 74 31 20 7d 20 64 62 32 0a  ) FROM t1 } db2.
bda0: 20 20 7d 20 5b 65 78 70 72 20 7b 31 32 38 2a 34    } [expr {128*4
bdb0: 30 30 20 2d 20 28 24 6e 55 70 2d 31 29 7d 5d 0a  00 - ($nUp-1)}].
bdc0: 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
bdd0: 2d 31 33 2e 31 2e 32 2e 24 6e 55 70 2e 34 20 7b  -13.1.2.$nUp.4 {
bde0: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 50  .    execsql { P
bdf0: 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f  RAGMA integrity_
be00: 63 68 65 63 6b 20 7d 20 64 62 32 0a 20 20 7d 20  check } db2.  } 
be10: 7b 6f 6b 7d 0a 20 20 64 62 32 20 63 6c 6f 73 65  {ok}.  db2 close
be20: 0a 7d 0a 7d 0a 0a 69 66 20 7b 24 3a 3a 74 63 6c  .}.}..if {$::tcl
be30: 5f 70 6c 61 74 66 6f 72 6d 28 70 6c 61 74 66 6f  _platform(platfo
be40: 72 6d 29 21 3d 22 77 69 6e 64 6f 77 73 22 7d 20  rm)!="windows"} 
be50: 7b 0a 23 20 53 61 6d 65 20 74 65 73 74 20 61 73  {.# Same test as
be60: 20 61 62 6f 76 65 2e 20 42 75 74 20 74 68 69 73   above. But this
be70: 20 74 69 6d 65 20 77 69 74 68 20 61 6e 20 69 6e   time with an in
be80: 64 65 78 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  dex on the table
be90: 2e 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  ..#.do_execsql_t
bea0: 65 73 74 20 70 61 67 65 72 31 2d 31 33 2e 32 2e  est pager1-13.2.
beb0: 31 20 7b 0a 20 20 43 52 45 41 54 45 20 49 4e 44  1 {.  CREATE IND
bec0: 45 58 20 69 31 20 4f 4e 20 74 31 28 62 29 3b 0a  EX i1 ON t1(b);.
bed0: 20 20 55 50 44 41 54 45 20 74 31 20 53 45 54 20    UPDATE t1 SET 
bee0: 62 20 3d 20 61 5f 73 74 72 69 6e 67 28 34 30 30  b = a_string(400
bef0: 29 3b 0a 7d 20 7b 7d 0a 66 6f 72 20 7b 73 65 74  );.} {}.for {set
bf00: 20 6e 55 70 20 31 7d 20 7b 24 6e 55 70 3c 36 34   nUp 1} {$nUp<64
bf10: 7d 20 7b 69 6e 63 72 20 6e 55 70 7d 20 7b 0a 20  } {incr nUp} {. 
bf20: 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74   do_execsql_test
bf30: 20 70 61 67 65 72 31 2d 31 33 2e 32 2e 32 2e 24   pager1-13.2.2.$
bf40: 6e 55 70 2e 31 20 7b 20 0a 20 20 20 20 55 50 44  nUp.1 { .    UPD
bf50: 41 54 45 20 74 31 20 53 45 54 20 62 20 3d 20 61  ATE t1 SET b = a
bf60: 5f 73 74 72 69 6e 67 28 33 39 39 29 20 57 48 45  _string(399) WHE
bf70: 52 45 20 61 20 3c 3d 20 24 6e 55 70 0a 20 20 7d  RE a <= $nUp.  }
bf80: 20 7b 7d 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c   {}.  do_execsql
bf90: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 33 2e  _test pager1-13.
bfa0: 32 2e 32 2e 24 6e 55 70 2e 32 20 7b 20 50 52 41  2.2.$nUp.2 { PRA
bfb0: 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68  GMA integrity_ch
bfc0: 65 63 6b 20 7d 20 7b 6f 6b 7d 20 0a 20 20 73 71  eck } {ok} .  sq
bfd0: 6c 69 74 65 33 20 64 62 32 20 73 76 5f 74 65 73  lite3 db2 sv_tes
bfe0: 74 2e 64 62 0a 20 20 64 6f 5f 74 65 73 74 20 70  t.db.  do_test p
bff0: 61 67 65 72 31 2d 31 33 2e 32 2e 32 2e 24 6e 55  ager1-13.2.2.$nU
c000: 70 2e 33 20 7b 0a 20 20 20 20 65 78 65 63 73 71  p.3 {.    execsq
c010: 6c 20 7b 20 53 45 4c 45 43 54 20 73 75 6d 28 6c  l { SELECT sum(l
c020: 65 6e 67 74 68 28 62 29 29 20 46 52 4f 4d 20 74  ength(b)) FROM t
c030: 31 20 7d 20 64 62 32 0a 20 20 7d 20 5b 65 78 70  1 } db2.  } [exp
c040: 72 20 7b 31 32 38 2a 34 30 30 20 2d 20 28 24 6e  r {128*400 - ($n
c050: 55 70 2d 31 29 7d 5d 0a 20 20 64 6f 5f 74 65 73  Up-1)}].  do_tes
c060: 74 20 70 61 67 65 72 31 2d 31 33 2e 32 2e 32 2e  t pager1-13.2.2.
c070: 24 6e 55 70 2e 34 20 7b 0a 20 20 20 20 65 78 65  $nUp.4 {.    exe
c080: 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 69 6e  csql { PRAGMA in
c090: 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 7d 20  tegrity_check } 
c0a0: 64 62 32 0a 20 20 7d 20 7b 6f 6b 7d 0a 20 20 64  db2.  } {ok}.  d
c0b0: 62 32 20 63 6c 6f 73 65 0a 7d 0a 7d 0a 0a 64 62  b2 close.}.}..db
c0c0: 20 63 6c 6f 73 65 0a 74 76 20 64 65 6c 65 74 65   close.tv delete
c0d0: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
c0e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c0f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54  ------------.# T
c120: 65 73 74 20 73 70 65 63 61 6c 20 22 50 52 41 47  est specal "PRAG
c130: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  MA journal_mode=
c140: 4f 46 46 22 20 74 65 73 74 20 63 61 73 65 73 2e  OFF" test cases.
c150: 0a 23 0a 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65  .#.faultsim_dele
c160: 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 64 6f  te_and_reopen.do
c170: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61  _execsql_test pa
c180: 67 65 72 31 2d 31 34 2e 31 2e 31 20 7b 0a 20 20  ger1-14.1.1 {.  
c190: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
c1a0: 6f 64 65 20 3d 20 4f 46 46 3b 0a 20 20 43 52 45  ode = OFF;.  CRE
c1b0: 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20  ATE TABLE t1(a, 
c1c0: 62 29 3b 0a 20 20 42 45 47 49 4e 3b 0a 20 20 20  b);.  BEGIN;.   
c1d0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
c1e0: 56 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20 20  VALUES(1, 2);.  
c1f0: 43 4f 4d 4d 49 54 3b 0a 20 20 53 45 4c 45 43 54  COMMIT;.  SELECT
c200: 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 7d 20 7b 6f   * FROM t1;.} {o
c210: 66 66 20 31 20 32 7d 0a 64 6f 5f 63 61 74 63 68  ff 1 2}.do_catch
c220: 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d  sql_test pager1-
c230: 31 34 2e 31 2e 32 20 7b 0a 20 20 42 45 47 49 4e  14.1.2 {.  BEGIN
c240: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
c250: 4f 20 74 31 20 56 41 4c 55 45 53 28 33 2c 20 34  O t1 VALUES(3, 4
c260: 29 3b 0a 20 20 52 4f 4c 4c 42 41 43 4b 3b 0a 7d  );.  ROLLBACK;.}
c270: 20 7b 30 20 7b 7d 7d 0a 64 6f 5f 65 78 65 63 73   {0 {}}.do_execs
c280: 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31  ql_test pager1-1
c290: 34 2e 31 2e 33 20 7b 0a 20 20 53 45 4c 45 43 54  4.1.3 {.  SELECT
c2a0: 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 7d 20 7b 31   * FROM t1;.} {1
c2b0: 20 32 7d 0a 64 6f 5f 63 61 74 63 68 73 71 6c 5f   2}.do_catchsql_
c2c0: 74 65 73 74 20 70 61 67 65 72 31 2d 31 34 2e 31  test pager1-14.1
c2d0: 2e 34 20 7b 0a 20 20 42 45 47 49 4e 3b 0a 20 20  .4 {.  BEGIN;.  
c2e0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
c2f0: 28 72 6f 77 69 64 2c 20 61 2c 20 62 29 20 53 45  (rowid, a, b) SE
c300: 4c 45 43 54 20 61 2b 33 2c 20 62 2c 20 62 20 46  LECT a+3, b, b F
c310: 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45  ROM t1;.    INSE
c320: 52 54 20 49 4e 54 4f 20 74 31 28 72 6f 77 69 64  RT INTO t1(rowid
c330: 2c 20 61 2c 20 62 29 20 53 45 4c 45 43 54 20 61  , a, b) SELECT a
c340: 2b 33 2c 20 62 2c 20 62 20 46 52 4f 4d 20 74 31  +3, b, b FROM t1
c350: 3b 0a 7d 20 7b 31 20 7b 50 52 49 4d 41 52 59 20  ;.} {1 {PRIMARY 
c360: 4b 45 59 20 6d 75 73 74 20 62 65 20 75 6e 69 71  KEY must be uniq
c370: 75 65 7d 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  ue}}.do_execsql_
c380: 74 65 73 74 20 70 61 67 65 72 31 2d 31 34 2e 31  test pager1-14.1
c390: 2e 35 20 7b 0a 20 20 43 4f 4d 4d 49 54 3b 0a 20  .5 {.  COMMIT;. 
c3a0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
c3b0: 31 3b 0a 7d 20 7b 31 20 32 20 32 20 32 7d 0a 0a  1;.} {1 2 2 2}..
c3c0: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
c3d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c3e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c3f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73  ----------.# Tes
c410: 74 20 6f 70 65 6e 69 6e 67 20 61 6e 64 20 63 6c  t opening and cl
c420: 6f 73 69 6e 67 20 74 68 65 20 70 61 67 65 72 20  osing the pager 
c430: 73 75 62 2d 73 79 73 74 65 6d 20 77 69 74 68 20  sub-system with 
c440: 64 69 66 66 65 72 65 6e 74 20 76 61 6c 75 65 73  different values
c450: 0a 23 20 66 6f 72 20 74 68 65 20 73 71 6c 69 74  .# for the sqlit
c460: 65 33 5f 76 66 73 2e 73 7a 4f 73 46 69 6c 65 20  e3_vfs.szOsFile 
c470: 76 61 72 69 61 62 6c 65 2e 0a 23 0a 66 61 75 6c  variable..#.faul
c480: 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f  tsim_delete_and_
c490: 72 65 6f 70 65 6e 0a 64 6f 5f 65 78 65 63 73 71  reopen.do_execsq
c4a0: 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 35  l_test pager1-15
c4b0: 2e 30 20 7b 0a 20 20 43 52 45 41 54 45 20 54 41  .0 {.  CREATE TA
c4c0: 42 4c 45 20 74 78 28 79 2c 20 7a 29 3b 0a 20 20  BLE tx(y, z);.  
c4d0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 78 20 56  INSERT INTO tx V
c4e0: 41 4c 55 45 53 28 27 41 79 75 74 74 68 61 79 61  ALUES('Ayutthaya
c4f0: 27 2c 20 27 42 65 69 6a 69 6e 67 27 29 3b 0a 20  ', 'Beijing');. 
c500: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 78 20   INSERT INTO tx 
c510: 56 41 4c 55 45 53 28 27 4c 6f 6e 64 6f 6e 27 2c  VALUES('London',
c520: 20 27 54 6f 6b 79 6f 27 29 3b 0a 7d 20 7b 7d 0a   'Tokyo');.} {}.
c530: 64 62 20 63 6c 6f 73 65 0a 66 6f 72 20 7b 73 65  db close.for {se
c540: 74 20 69 20 30 7d 20 7b 24 69 3c 35 31 33 7d 20  t i 0} {$i<513} 
c550: 7b 69 6e 63 72 20 69 20 33 7d 20 7b 0a 20 20 74  {incr i 3} {.  t
c560: 65 73 74 76 66 73 20 74 76 20 2d 64 65 66 61 75  estvfs tv -defau
c570: 6c 74 20 31 20 2d 73 7a 6f 73 66 69 6c 65 20 24  lt 1 -szosfile $
c580: 69 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 74  i.  sqlite3 db t
c590: 65 73 74 2e 64 62 0a 20 20 64 6f 5f 65 78 65 63  est.db.  do_exec
c5a0: 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d  sql_test pager1-
c5b0: 31 35 2e 24 69 2e 31 20 7b 0a 20 20 20 20 53 45  15.$i.1 {.    SE
c5c0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 78 3b 0a  LECT * FROM tx;.
c5d0: 20 20 7d 20 7b 41 79 75 74 74 68 61 79 61 20 42    } {Ayutthaya B
c5e0: 65 69 6a 69 6e 67 20 4c 6f 6e 64 6f 6e 20 54 6f  eijing London To
c5f0: 6b 79 6f 7d 0a 20 20 64 62 20 63 6c 6f 73 65 0a  kyo}.  db close.
c600: 20 20 74 76 20 64 65 6c 65 74 65 0a 7d 0a 0a 23    tv delete.}..#
c610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 43 68 65 63  ---------.# Chec
c660: 6b 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74  k that it is not
c670: 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 6f 70 65   possible to ope
c680: 6e 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  n a database fil
c690: 65 20 69 66 20 74 68 65 20 66 75 6c 6c 20 70 61  e if the full pa
c6a0: 74 68 0a 23 20 74 6f 20 74 68 65 20 61 73 73 6f  th.# to the asso
c6b0: 63 69 61 74 65 64 20 6a 6f 75 72 6e 61 6c 20 66  ciated journal f
c6c0: 69 6c 65 20 77 69 6c 6c 20 62 65 20 6c 6f 6e 67  ile will be long
c6d0: 65 72 20 74 68 61 6e 20 73 71 6c 69 74 65 33 5f  er than sqlite3_
c6e0: 76 66 73 2e 6d 78 50 61 74 68 6e 61 6d 65 2e 0a  vfs.mxPathname..
c6f0: 23 0a 74 65 73 74 76 66 73 20 74 76 20 2d 64 65  #.testvfs tv -de
c700: 66 61 75 6c 74 20 31 0a 74 76 20 73 63 72 69 70  fault 1.tv scrip
c710: 74 20 78 4f 70 65 6e 43 62 0a 74 76 20 66 69 6c  t xOpenCb.tv fil
c720: 74 65 72 20 78 4f 70 65 6e 0a 70 72 6f 63 20 78  ter xOpen.proc x
c730: 4f 70 65 6e 43 62 20 7b 6d 65 74 68 6f 64 20 66  OpenCb {method f
c740: 69 6c 65 6e 61 6d 65 20 61 72 67 73 7d 20 7b 0a  ilename args} {.
c750: 20 20 73 65 74 20 3a 3a 66 69 6c 65 5f 6c 65 6e    set ::file_len
c760: 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20   [string length 
c770: 24 66 69 6c 65 6e 61 6d 65 5d 0a 7d 0a 73 71 6c  $filename].}.sql
c780: 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a  ite3 db test.db.
c790: 64 62 20 63 6c 6f 73 65 0a 74 76 20 64 65 6c 65  db close.tv dele
c7a0: 74 65 0a 0a 66 6f 72 20 7b 73 65 74 20 69 69 20  te..for {set ii 
c7b0: 5b 65 78 70 72 20 24 3a 3a 66 69 6c 65 5f 6c 65  [expr $::file_le
c7c0: 6e 2d 35 5d 7d 20 7b 24 69 69 20 3c 20 5b 65 78  n-5]} {$ii < [ex
c7d0: 70 72 20 24 3a 3a 66 69 6c 65 5f 6c 65 6e 2b 32  pr $::file_len+2
c7e0: 30 5d 7d 20 7b 69 6e 63 72 20 69 69 7d 20 7b 0a  0]} {incr ii} {.
c7f0: 20 20 74 65 73 74 76 66 73 20 74 76 20 2d 64 65    testvfs tv -de
c800: 66 61 75 6c 74 20 31 20 2d 6d 78 70 61 74 68 6e  fault 1 -mxpathn
c810: 61 6d 65 20 24 69 69 0a 0a 20 20 23 20 54 68 65  ame $ii..  # The
c820: 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 66   length of the f
c830: 75 6c 6c 20 70 61 74 68 20 74 6f 20 66 69 6c 65  ull path to file
c840: 20 22 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61   "test.db-journa
c850: 6c 22 20 69 73 20 28 24 3a 3a 66 69 6c 65 5f 6c  l" is ($::file_l
c860: 65 6e 2b 38 29 2e 0a 20 20 23 20 49 66 20 74 68  en+8)..  # If th
c870: 65 20 63 6f 6e 66 69 67 75 72 65 64 20 73 71 6c  e configured sql
c880: 69 74 65 33 5f 76 66 73 2e 6d 78 50 61 74 68 6e  ite3_vfs.mxPathn
c890: 61 6d 65 20 76 61 6c 75 65 20 67 72 65 61 74 65  ame value greate
c8a0: 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  r than or equal 
c8b0: 74 6f 0a 20 20 23 20 74 68 69 73 2c 20 74 68 65  to.  # this, the
c8c0: 6e 20 74 68 65 20 66 69 6c 65 20 63 61 6e 20 62  n the file can b
c8d0: 65 20 6f 70 65 6e 65 64 2e 20 4f 74 68 65 72 77  e opened. Otherw
c8e0: 69 73 65 2c 20 69 74 20 63 61 6e 6e 6f 74 2e 0a  ise, it cannot..
c8f0: 20 20 23 0a 20 20 69 66 20 7b 24 69 69 20 3e 3d    #.  if {$ii >=
c900: 20 5b 65 78 70 72 20 24 3a 3a 66 69 6c 65 5f 6c   [expr $::file_l
c910: 65 6e 2b 38 5d 7d 20 7b 0a 20 20 20 20 73 65 74  en+8]} {.    set
c920: 20 72 65 73 20 7b 30 20 7b 7d 7d 0a 20 20 7d 20   res {0 {}}.  } 
c930: 65 6c 73 65 20 7b 0a 20 20 20 20 73 65 74 20 72  else {.    set r
c940: 65 73 20 7b 31 20 7b 75 6e 61 62 6c 65 20 74 6f  es {1 {unable to
c950: 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 66   open database f
c960: 69 6c 65 7d 7d 0a 20 20 7d 0a 0a 20 20 64 6f 5f  ile}}.  }..  do_
c970: 74 65 73 74 20 70 61 67 65 72 31 2d 31 36 2e 31  test pager1-16.1
c980: 2e 24 69 69 20 7b 0a 20 20 20 20 6c 69 73 74 20  .$ii {.    list 
c990: 5b 63 61 74 63 68 20 7b 20 73 71 6c 69 74 65 33  [catch { sqlite3
c9a0: 20 64 62 20 74 65 73 74 2e 64 62 20 7d 20 6d 73   db test.db } ms
c9b0: 67 5d 20 24 6d 73 67 0a 20 20 7d 20 24 72 65 73  g] $msg.  } $res
c9c0: 0a 0a 20 20 63 61 74 63 68 20 7b 64 62 20 63 6c  ..  catch {db cl
c9d0: 6f 73 65 7d 0a 20 20 74 76 20 64 65 6c 65 74 65  ose}.  tv delete
c9e0: 0a 7d 0a 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .}...#----------
c9f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ca00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ca10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ca20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
ca30: 23 20 54 65 73 74 20 74 68 65 20 70 61 67 65 72  # Test the pager
ca40: 73 20 72 65 73 70 6f 6e 73 65 20 74 6f 20 74 68  s response to th
ca50: 65 20 62 2d 74 72 65 65 20 6c 61 79 65 72 20 72  e b-tree layer r
ca60: 65 71 75 65 73 74 69 6e 67 20 69 6c 6c 65 67 61  equesting illega
ca70: 6c 20 70 61 67 65 20 0a 23 20 6e 75 6d 62 65 72  l page .# number
ca80: 73 3a 0a 23 0a 23 20 20 20 2b 20 54 68 65 20 6c  s:.#.#   + The l
ca90: 6f 63 6b 69 6e 67 20 70 61 67 65 2c 0a 23 20 20  ocking page,.#  
caa0: 20 2b 20 50 61 67 65 20 30 2c 0a 23 20 20 20 2b   + Page 0,.#   +
cab0: 20 41 20 70 61 67 65 20 77 69 74 68 20 61 20 70   A page with a p
cac0: 61 67 65 20 6e 75 6d 62 65 72 20 67 72 65 61 74  age number great
cad0: 65 72 20 74 68 61 6e 20 28 32 5e 33 31 2d 31 29  er than (2^31-1)
cae0: 2e 0a 23 0a 23 20 54 68 65 73 65 20 74 65 73 74  ..#.# These test
caf0: 73 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20  s will not work 
cb00: 69 66 20 53 51 4c 49 54 45 5f 44 49 52 45 43 54  if SQLITE_DIRECT
cb10: 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44 20 69  _OVERFLOW_READ i
cb20: 73 20 64 65 66 69 6e 65 64 2e 20 49 6e 0a 23 20  s defined. In.# 
cb30: 74 68 61 74 20 63 61 73 65 20 49 4f 20 65 72 72  that case IO err
cb40: 6f 72 73 20 61 72 65 20 73 6f 6d 65 74 69 6d 65  ors are sometime
cb50: 73 20 72 65 70 6f 72 74 65 64 20 69 6e 73 74 65  s reported inste
cb60: 61 64 20 6f 66 20 53 51 4c 49 54 45 5f 43 4f 52  ad of SQLITE_COR
cb70: 52 55 50 54 2e 0a 23 0a 69 66 63 61 70 61 62 6c  RUPT..#.ifcapabl
cb80: 65 20 21 64 69 72 65 63 74 5f 72 65 61 64 20 7b  e !direct_read {
cb90: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
cba0: 31 38 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73 69  18.1 {.  faultsi
cbb0: 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f  m_delete_and_reo
cbc0: 70 65 6e 0a 20 20 64 62 20 66 75 6e 63 20 61 5f  pen.  db func a_
cbd0: 73 74 72 69 6e 67 20 61 5f 73 74 72 69 6e 67 0a  string a_string.
cbe0: 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20    execsql { .   
cbf0: 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a   PRAGMA page_siz
cc00: 65 20 3d 20 31 30 32 34 3b 0a 20 20 20 20 43 52  e = 1024;.    CR
cc10: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c  EATE TABLE t1(a,
cc20: 20 62 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   b);.    INSERT 
cc30: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 61  INTO t1 VALUES(a
cc40: 5f 73 74 72 69 6e 67 28 35 30 30 29 2c 20 61 5f  _string(500), a_
cc50: 73 74 72 69 6e 67 28 32 30 30 29 29 3b 0a 20 20  string(200));.  
cc60: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
cc70: 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67   SELECT a_string
cc80: 28 35 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28  (500), a_string(
cc90: 32 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20  200) FROM t1;.  
cca0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
ccb0: 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67   SELECT a_string
ccc0: 28 35 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28  (500), a_string(
ccd0: 32 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20  200) FROM t1;.  
cce0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
ccf0: 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67   SELECT a_string
cd00: 28 35 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28  (500), a_string(
cd10: 32 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20  200) FROM t1;.  
cd20: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
cd30: 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67   SELECT a_string
cd40: 28 35 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28  (500), a_string(
cd50: 32 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20  200) FROM t1;.  
cd60: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
cd70: 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67   SELECT a_string
cd80: 28 35 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28  (500), a_string(
cd90: 32 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20  200) FROM t1;.  
cda0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
cdb0: 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67   SELECT a_string
cdc0: 28 35 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28  (500), a_string(
cdd0: 32 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20  200) FROM t1;.  
cde0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
cdf0: 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67   SELECT a_string
ce00: 28 35 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28  (500), a_string(
ce10: 32 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20  200) FROM t1;.  
ce20: 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 70  }.} {}.do_test p
ce30: 61 67 65 72 31 2d 31 38 2e 32 20 7b 0a 20 20 73  ager1-18.2 {.  s
ce40: 65 74 20 72 6f 6f 74 20 5b 64 62 20 6f 6e 65 20  et root [db one 
ce50: 22 53 45 4c 45 43 54 20 72 6f 6f 74 70 61 67 65  "SELECT rootpage
ce60: 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73   FROM sqlite_mas
ce70: 74 65 72 22 5d 0a 20 20 73 65 74 20 6c 6f 63 6b  ter"].  set lock
ce80: 69 6e 67 70 61 67 65 20 5b 65 78 70 72 20 28 30  ingpage [expr (0
ce90: 78 31 30 30 30 30 2f 31 30 32 34 29 20 2b 20 31  x10000/1024) + 1
cea0: 5d 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  ].  execsql {.  
ceb0: 20 20 50 52 41 47 4d 41 20 77 72 69 74 61 62 6c    PRAGMA writabl
cec0: 65 5f 73 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20  e_schema = 1;.  
ced0: 20 20 55 50 44 41 54 45 20 73 71 6c 69 74 65 5f    UPDATE sqlite_
cee0: 6d 61 73 74 65 72 20 53 45 54 20 72 6f 6f 74 70  master SET rootp
cef0: 61 67 65 20 3d 20 24 6c 6f 63 6b 69 6e 67 70 61  age = $lockingpa
cf00: 67 65 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  ge;.  }.  sqlite
cf10: 33 20 64 62 32 20 74 65 73 74 2e 64 62 0a 20 20  3 db2 test.db.  
cf20: 63 61 74 63 68 73 71 6c 20 7b 20 53 45 4c 45 43  catchsql { SELEC
cf30: 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
cf40: 74 31 20 7d 20 64 62 32 0a 7d 20 7b 31 20 7b 64  t1 } db2.} {1 {d
cf50: 61 74 61 62 61 73 65 20 64 69 73 6b 20 69 6d 61  atabase disk ima
cf60: 67 65 20 69 73 20 6d 61 6c 66 6f 72 6d 65 64 7d  ge is malformed}
cf70: 7d 0a 64 62 32 20 63 6c 6f 73 65 0a 64 6f 5f 74  }.db2 close.do_t
cf80: 65 73 74 20 70 61 67 65 72 31 2d 31 38 2e 33 20  est pager1-18.3 
cf90: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
cfa0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
cfb0: 32 28 78 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  2(x);.    INSERT
cfc0: 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28   INTO t2 VALUES(
cfd0: 61 5f 73 74 72 69 6e 67 28 35 30 30 30 29 29 3b  a_string(5000));
cfe0: 0a 20 20 7d 0a 20 20 73 65 74 20 70 67 6e 6f 20  .  }.  set pgno 
cff0: 5b 65 78 70 72 20 28 5b 66 69 6c 65 20 73 69 7a  [expr ([file siz
d000: 65 20 74 65 73 74 2e 64 62 5d 20 2f 20 31 30 32  e test.db] / 102
d010: 34 29 2d 32 5d 0a 20 20 68 65 78 69 6f 5f 77 72  4)-2].  hexio_wr
d020: 69 74 65 20 74 65 73 74 2e 64 62 20 5b 65 78 70  ite test.db [exp
d030: 72 20 28 24 70 67 6e 6f 2d 31 29 2a 31 30 32 34  r ($pgno-1)*1024
d040: 5d 20 30 30 30 30 30 30 30 30 0a 20 20 73 71 6c  ] 00000000.  sql
d050: 69 74 65 33 20 64 62 32 20 74 65 73 74 2e 64 62  ite3 db2 test.db
d060: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20 53 45  .  catchsql { SE
d070: 4c 45 43 54 20 6c 65 6e 67 74 68 28 78 29 20 46  LECT length(x) F
d080: 52 4f 4d 20 74 32 20 7d 20 64 62 32 0a 7d 20 7b  ROM t2 } db2.} {
d090: 31 20 7b 64 61 74 61 62 61 73 65 20 64 69 73 6b  1 {database disk
d0a0: 20 69 6d 61 67 65 20 69 73 20 6d 61 6c 66 6f 72   image is malfor
d0b0: 6d 65 64 7d 7d 0a 64 62 32 20 63 6c 6f 73 65 0a  med}}.db2 close.
d0c0: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31  do_test pager1-1
d0d0: 38 2e 34 20 7b 0a 20 20 68 65 78 69 6f 5f 77 72  8.4 {.  hexio_wr
d0e0: 69 74 65 20 74 65 73 74 2e 64 62 20 5b 65 78 70  ite test.db [exp
d0f0: 72 20 28 24 70 67 6e 6f 2d 31 29 2a 31 30 32 34  r ($pgno-1)*1024
d100: 5d 20 39 30 30 30 30 30 30 30 0a 20 20 73 71 6c  ] 90000000.  sql
d110: 69 74 65 33 20 64 62 32 20 74 65 73 74 2e 64 62  ite3 db2 test.db
d120: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20 53 45  .  catchsql { SE
d130: 4c 45 43 54 20 6c 65 6e 67 74 68 28 78 29 20 46  LECT length(x) F
d140: 52 4f 4d 20 74 32 20 7d 20 64 62 32 0a 7d 20 7b  ROM t2 } db2.} {
d150: 31 20 7b 64 61 74 61 62 61 73 65 20 64 69 73 6b  1 {database disk
d160: 20 69 6d 61 67 65 20 69 73 20 6d 61 6c 66 6f 72   image is malfor
d170: 6d 65 64 7d 7d 0a 64 62 32 20 63 6c 6f 73 65 0a  med}}.db2 close.
d180: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31  do_test pager1-1
d190: 38 2e 35 20 7b 0a 20 20 73 71 6c 69 74 65 33 20  8.5 {.  sqlite3 
d1a0: 64 62 20 22 22 0a 20 20 65 78 65 63 73 71 6c 20  db "".  execsql 
d1b0: 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  {.    CREATE TAB
d1c0: 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20  LE t1(a, b);.   
d1d0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32   CREATE TABLE t2
d1e0: 28 61 2c 20 62 29 3b 0a 20 20 20 20 50 52 41 47  (a, b);.    PRAG
d1f0: 4d 41 20 77 72 69 74 61 62 6c 65 5f 73 63 68 65  MA writable_sche
d200: 6d 61 20 3d 20 31 3b 0a 20 20 20 20 55 50 44 41  ma = 1;.    UPDA
d210: 54 45 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  TE sqlite_master
d220: 20 53 45 54 20 72 6f 6f 74 70 61 67 65 3d 35 20   SET rootpage=5 
d230: 57 48 45 52 45 20 74 62 6c 5f 6e 61 6d 65 20 3d  WHERE tbl_name =
d240: 20 27 74 31 27 3b 0a 20 20 20 20 50 52 41 47 4d   't1';.    PRAGM
d250: 41 20 77 72 69 74 61 62 6c 65 5f 73 63 68 65 6d  A writable_schem
d260: 61 20 3d 20 30 3b 0a 20 20 20 20 41 4c 54 45 52  a = 0;.    ALTER
d270: 20 54 41 42 4c 45 20 74 31 20 52 45 4e 41 4d 45   TABLE t1 RENAME
d280: 20 54 4f 20 78 31 3b 0a 20 20 7d 0a 20 20 63 61   TO x1;.  }.  ca
d290: 74 63 68 73 71 6c 20 7b 20 53 45 4c 45 43 54 20  tchsql { SELECT 
d2a0: 2a 20 46 52 4f 4d 20 78 31 20 7d 0a 7d 20 7b 31  * FROM x1 }.} {1
d2b0: 20 7b 64 61 74 61 62 61 73 65 20 64 69 73 6b 20   {database disk 
d2c0: 69 6d 61 67 65 20 69 73 20 6d 61 6c 66 6f 72 6d  image is malform
d2d0: 65 64 7d 7d 0a 64 62 20 63 6c 6f 73 65 0a 0a 64  ed}}.db close..d
d2e0: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 38  o_test pager1-18
d2f0: 2e 36 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f  .6 {.  faultsim_
d300: 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65  delete_and_reope
d310: 6e 0a 20 20 64 62 20 66 75 6e 63 20 61 5f 73 74  n.  db func a_st
d320: 72 69 6e 67 20 61 5f 73 74 72 69 6e 67 0a 20 20  ring a_string.  
d330: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52  execsql {.    PR
d340: 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d  AGMA page_size =
d350: 20 31 30 32 34 3b 0a 20 20 20 20 43 52 45 41 54   1024;.    CREAT
d360: 45 20 54 41 42 4c 45 20 74 31 28 78 29 3b 0a 20  E TABLE t1(x);. 
d370: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
d380: 31 20 56 41 4c 55 45 53 28 61 5f 73 74 72 69 6e  1 VALUES(a_strin
d390: 67 28 38 30 30 29 29 3b 0a 20 20 20 20 49 4e 53  g(800));.    INS
d3a0: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
d3b0: 45 53 28 61 5f 73 74 72 69 6e 67 28 38 30 30 29  ES(a_string(800)
d3c0: 29 3b 0a 20 20 7d 0a 0a 20 20 73 65 74 20 72 6f  );.  }..  set ro
d3d0: 6f 74 20 5b 64 62 20 6f 6e 65 20 22 53 45 4c 45  ot [db one "SELE
d3e0: 43 54 20 72 6f 6f 74 70 61 67 65 20 46 52 4f 4d  CT rootpage FROM
d3f0: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 5d   sqlite_master"]
d400: 0a 20 20 64 62 20 63 6c 6f 73 65 0a 0a 20 20 68  .  db close..  h
d410: 65 78 69 6f 5f 77 72 69 74 65 20 74 65 73 74 2e  exio_write test.
d420: 64 62 20 5b 65 78 70 72 20 28 24 72 6f 6f 74 2d  db [expr ($root-
d430: 31 29 2a 31 30 32 34 20 2b 20 38 5d 20 30 30 30  1)*1024 + 8] 000
d440: 30 30 30 30 30 0a 20 20 73 71 6c 69 74 65 33 20  00000.  sqlite3 
d450: 64 62 20 74 65 73 74 2e 64 62 0a 20 20 63 61 74  db test.db.  cat
d460: 63 68 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 6c  chsql { SELECT l
d470: 65 6e 67 74 68 28 78 29 20 46 52 4f 4d 20 74 31  ength(x) FROM t1
d480: 20 7d 0a 7d 20 7b 31 20 7b 64 61 74 61 62 61 73   }.} {1 {databas
d490: 65 20 64 69 73 6b 20 69 6d 61 67 65 20 69 73 20  e disk image is 
d4a0: 6d 61 6c 66 6f 72 6d 65 64 7d 7d 0a 7d 0a 0a 64  malformed}}.}..d
d4b0: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 39  o_test pager1-19
d4c0: 2e 31 20 7b 0a 20 20 73 71 6c 69 74 65 33 20 64  .1 {.  sqlite3 d
d4d0: 62 20 22 22 0a 20 20 64 62 20 66 75 6e 63 20 61  b "".  db func a
d4e0: 5f 73 74 72 69 6e 67 20 61 5f 73 74 72 69 6e 67  _string a_string
d4f0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
d500: 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a   PRAGMA page_siz
d510: 65 20 3d 20 35 31 32 3b 0a 20 20 20 20 50 52 41  e = 512;.    PRA
d520: 47 4d 41 20 61 75 74 6f 5f 76 61 63 75 75 6d 20  GMA auto_vacuum 
d530: 3d 20 31 3b 0a 20 20 20 20 43 52 45 41 54 45 20  = 1;.    CREATE 
d540: 54 41 42 4c 45 20 74 31 28 61 61 2c 20 61 62 2c  TABLE t1(aa, ab,
d550: 20 61 63 2c 20 61 64 2c 20 61 65 2c 20 61 66 2c   ac, ad, ae, af,
d560: 20 61 67 2c 20 61 68 2c 20 61 69 2c 20 61 6a 2c   ag, ah, ai, aj,
d570: 20 61 6b 2c 20 61 6c 2c 20 61 6d 2c 20 61 6e 2c   ak, al, am, an,
d580: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
d590: 20 20 20 20 20 62 61 2c 20 62 62 2c 20 62 63 2c       ba, bb, bc,
d5a0: 20 62 64 2c 20 62 65 2c 20 62 66 2c 20 62 67 2c   bd, be, bf, bg,
d5b0: 20 62 68 2c 20 62 69 2c 20 62 6a 2c 20 62 6b 2c   bh, bi, bj, bk,
d5c0: 20 62 6c 2c 20 62 6d 2c 20 62 6e 2c 0a 20 20 20   bl, bm, bn,.   
d5d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d5e0: 20 63 61 2c 20 63 62 2c 20 63 63 2c 20 63 64 2c   ca, cb, cc, cd,
d5f0: 20 63 65 2c 20 63 66 2c 20 63 67 2c 20 63 68 2c   ce, cf, cg, ch,
d600: 20 63 69 2c 20 63 6a 2c 20 63 6b 2c 20 63 6c 2c   ci, cj, ck, cl,
d610: 20 63 6d 2c 20 63 6e 2c 0a 20 20 20 20 20 20 20   cm, cn,.       
d620: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61 2c               da,
d630: 20 64 62 2c 20 64 63 2c 20 64 64 2c 20 64 65 2c   db, dc, dd, de,
d640: 20 64 66 2c 20 64 67 2c 20 64 68 2c 20 64 69 2c   df, dg, dh, di,
d650: 20 64 6a 2c 20 64 6b 2c 20 64 6c 2c 20 64 6d 2c   dj, dk, dl, dm,
d660: 20 64 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20   dn,.           
d670: 20 20 20 20 20 20 20 20 20 65 61 2c 20 65 62 2c           ea, eb,
d680: 20 65 63 2c 20 65 64 2c 20 65 65 2c 20 65 66 2c   ec, ed, ee, ef,
d690: 20 65 67 2c 20 65 68 2c 20 65 69 2c 20 65 6a 2c   eg, eh, ei, ej,
d6a0: 20 65 6b 2c 20 65 6c 2c 20 65 6d 2c 20 65 6e 2c   ek, el, em, en,
d6b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
d6c0: 20 20 20 20 20 66 61 2c 20 66 62 2c 20 66 63 2c       fa, fb, fc,
d6d0: 20 66 64 2c 20 66 65 2c 20 66 66 2c 20 66 67 2c   fd, fe, ff, fg,
d6e0: 20 66 68 2c 20 66 69 2c 20 66 6a 2c 20 66 6b 2c   fh, fi, fj, fk,
d6f0: 20 66 6c 2c 20 66 6d 2c 20 66 6e 2c 0a 20 20 20   fl, fm, fn,.   
d700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d710: 20 67 61 2c 20 67 62 2c 20 67 63 2c 20 67 64 2c   ga, gb, gc, gd,
d720: 20 67 65 2c 20 67 66 2c 20 67 67 2c 20 67 68 2c   ge, gf, gg, gh,
d730: 20 67 69 2c 20 67 6a 2c 20 67 6b 2c 20 67 6c 2c   gi, gj, gk, gl,
d740: 20 67 6d 2c 20 67 6e 2c 0a 20 20 20 20 20 20 20   gm, gn,.       
d750: 20 20 20 20 20 20 20 20 20 20 20 20 20 68 61 2c               ha,
d760: 20 68 62 2c 20 68 63 2c 20 68 64 2c 20 68 65 2c   hb, hc, hd, he,
d770: 20 68 66 2c 20 68 67 2c 20 68 68 2c 20 68 69 2c   hf, hg, hh, hi,
d780: 20 68 6a 2c 20 68 6b 2c 20 68 6c 2c 20 68 6d 2c   hj, hk, hl, hm,
d790: 20 68 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20   hn,.           
d7a0: 20 20 20 20 20 20 20 20 20 69 61 2c 20 69 62 2c           ia, ib,
d7b0: 20 69 63 2c 20 69 64 2c 20 69 65 2c 20 69 66 2c   ic, id, ie, if,
d7c0: 20 69 67 2c 20 69 68 2c 20 69 69 2c 20 69 6a 2c   ig, ih, ii, ij,
d7d0: 20 69 6b 2c 20 69 6c 2c 20 69 6d 2c 20 69 78 2c   ik, il, im, ix,
d7e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
d7f0: 20 20 20 20 20 6a 61 2c 20 6a 62 2c 20 6a 63 2c       ja, jb, jc,
d800: 20 6a 64 2c 20 6a 65 2c 20 6a 66 2c 20 6a 67 2c   jd, je, jf, jg,
d810: 20 6a 68 2c 20 6a 69 2c 20 6a 6a 2c 20 6a 6b 2c   jh, ji, jj, jk,
d820: 20 6a 6c 2c 20 6a 6d 2c 20 6a 6e 2c 0a 20 20 20   jl, jm, jn,.   
d830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d840: 20 6b 61 2c 20 6b 62 2c 20 6b 63 2c 20 6b 64 2c   ka, kb, kc, kd,
d850: 20 6b 65 2c 20 6b 66 2c 20 6b 67 2c 20 6b 68 2c   ke, kf, kg, kh,
d860: 20 6b 69 2c 20 6b 6a 2c 20 6b 6b 2c 20 6b 6c 2c   ki, kj, kk, kl,
d870: 20 6b 6d 2c 20 6b 6e 2c 0a 20 20 20 20 20 20 20   km, kn,.       
d880: 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 61 2c               la,
d890: 20 6c 62 2c 20 6c 63 2c 20 6c 64 2c 20 6c 65 2c   lb, lc, ld, le,
d8a0: 20 6c 66 2c 20 6c 67 2c 20 6c 68 2c 20 6c 69 2c   lf, lg, lh, li,
d8b0: 20 6c 6a 2c 20 6c 6b 2c 20 6c 6c 2c 20 6c 6d 2c   lj, lk, ll, lm,
d8c0: 20 6c 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20   ln,.           
d8d0: 20 20 20 20 20 20 20 20 20 6d 61 2c 20 6d 62 2c           ma, mb,
d8e0: 20 6d 63 2c 20 6d 64 2c 20 6d 65 2c 20 6d 66 2c   mc, md, me, mf,
d8f0: 20 6d 67 2c 20 6d 68 2c 20 6d 69 2c 20 6d 6a 2c   mg, mh, mi, mj,
d900: 20 6d 6b 2c 20 6d 6c 2c 20 6d 6d 2c 20 6d 6e 0a   mk, ml, mm, mn.
d910: 20 20 20 20 29 3b 0a 20 20 20 20 43 52 45 41 54      );.    CREAT
d920: 45 20 54 41 42 4c 45 20 74 32 28 61 61 2c 20 61  E TABLE t2(aa, a
d930: 62 2c 20 61 63 2c 20 61 64 2c 20 61 65 2c 20 61  b, ac, ad, ae, a
d940: 66 2c 20 61 67 2c 20 61 68 2c 20 61 69 2c 20 61  f, ag, ah, ai, a
d950: 6a 2c 20 61 6b 2c 20 61 6c 2c 20 61 6d 2c 20 61  j, ak, al, am, a
d960: 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n,.             
d970: 20 20 20 20 20 20 20 62 61 2c 20 62 62 2c 20 62         ba, bb, b
d980: 63 2c 20 62 64 2c 20 62 65 2c 20 62 66 2c 20 62  c, bd, be, bf, b
d990: 67 2c 20 62 68 2c 20 62 69 2c 20 62 6a 2c 20 62  g, bh, bi, bj, b
d9a0: 6b 2c 20 62 6c 2c 20 62 6d 2c 20 62 6e 2c 0a 20  k, bl, bm, bn,. 
d9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d9c0: 20 20 20 63 61 2c 20 63 62 2c 20 63 63 2c 20 63     ca, cb, cc, c
d9d0: 64 2c 20 63 65 2c 20 63 66 2c 20 63 67 2c 20 63  d, ce, cf, cg, c
d9e0: 68 2c 20 63 69 2c 20 63 6a 2c 20 63 6b 2c 20 63  h, ci, cj, ck, c
d9f0: 6c 2c 20 63 6d 2c 20 63 6e 2c 0a 20 20 20 20 20  l, cm, cn,.     
da00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
da10: 61 2c 20 64 62 2c 20 64 63 2c 20 64 64 2c 20 64  a, db, dc, dd, d
da20: 65 2c 20 64 66 2c 20 64 67 2c 20 64 68 2c 20 64  e, df, dg, dh, d
da30: 69 2c 20 64 6a 2c 20 64 6b 2c 20 64 6c 2c 20 64  i, dj, dk, dl, d
da40: 6d 2c 20 64 6e 2c 0a 20 20 20 20 20 20 20 20 20  m, dn,.         
da50: 20 20 20 20 20 20 20 20 20 20 20 65 61 2c 20 65             ea, e
da60: 62 2c 20 65 63 2c 20 65 64 2c 20 65 65 2c 20 65  b, ec, ed, ee, e
da70: 66 2c 20 65 67 2c 20 65 68 2c 20 65 69 2c 20 65  f, eg, eh, ei, e
da80: 6a 2c 20 65 6b 2c 20 65 6c 2c 20 65 6d 2c 20 65  j, ek, el, em, e
da90: 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n,.             
daa0: 20 20 20 20 20 20 20 66 61 2c 20 66 62 2c 20 66         fa, fb, f
dab0: 63 2c 20 66 64 2c 20 66 65 2c 20 66 66 2c 20 66  c, fd, fe, ff, f
dac0: 67 2c 20 66 68 2c 20 66 69 2c 20 66 6a 2c 20 66  g, fh, fi, fj, f
dad0: 6b 2c 20 66 6c 2c 20 66 6d 2c 20 66 6e 2c 0a 20  k, fl, fm, fn,. 
dae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
daf0: 20 20 20 67 61 2c 20 67 62 2c 20 67 63 2c 20 67     ga, gb, gc, g
db00: 64 2c 20 67 65 2c 20 67 66 2c 20 67 67 2c 20 67  d, ge, gf, gg, g
db10: 68 2c 20 67 69 2c 20 67 6a 2c 20 67 6b 2c 20 67  h, gi, gj, gk, g
db20: 6c 2c 20 67 6d 2c 20 67 6e 2c 0a 20 20 20 20 20  l, gm, gn,.     
db30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 68                 h
db40: 61 2c 20 68 62 2c 20 68 63 2c 20 68 64 2c 20 68  a, hb, hc, hd, h
db50: 65 2c 20 68 66 2c 20 68 67 2c 20 68 68 2c 20 68  e, hf, hg, hh, h
db60: 69 2c 20 68 6a 2c 20 68 6b 2c 20 68 6c 2c 20 68  i, hj, hk, hl, h
db70: 6d 2c 20 68 6e 2c 0a 20 20 20 20 20 20 20 20 20  m, hn,.         
db80: 20 20 20 20 20 20 20 20 20 20 20 69 61 2c 20 69             ia, i
db90: 62 2c 20 69 63 2c 20 69 64 2c 20 69 65 2c 20 69  b, ic, id, ie, i
dba0: 66 2c 20 69 67 2c 20 69 68 2c 20 69 69 2c 20 69  f, ig, ih, ii, i
dbb0: 6a 2c 20 69 6b 2c 20 69 6c 2c 20 69 6d 2c 20 69  j, ik, il, im, i
dbc0: 78 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  x,.             
dbd0: 20 20 20 20 20 20 20 6a 61 2c 20 6a 62 2c 20 6a         ja, jb, j
dbe0: 63 2c 20 6a 64 2c 20 6a 65 2c 20 6a 66 2c 20 6a  c, jd, je, jf, j
dbf0: 67 2c 20 6a 68 2c 20 6a 69 2c 20 6a 6a 2c 20 6a  g, jh, ji, jj, j
dc00: 6b 2c 20 6a 6c 2c 20 6a 6d 2c 20 6a 6e 2c 0a 20  k, jl, jm, jn,. 
dc10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc20: 20 20 20 6b 61 2c 20 6b 62 2c 20 6b 63 2c 20 6b     ka, kb, kc, k
dc30: 64 2c 20 6b 65 2c 20 6b 66 2c 20 6b 67 2c 20 6b  d, ke, kf, kg, k
dc40: 68 2c 20 6b 69 2c 20 6b 6a 2c 20 6b 6b 2c 20 6b  h, ki, kj, kk, k
dc50: 6c 2c 20 6b 6d 2c 20 6b 6e 2c 0a 20 20 20 20 20  l, km, kn,.     
dc60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c                 l
dc70: 61 2c 20 6c 62 2c 20 6c 63 2c 20 6c 64 2c 20 6c  a, lb, lc, ld, l
dc80: 65 2c 20 6c 66 2c 20 6c 67 2c 20 6c 68 2c 20 6c  e, lf, lg, lh, l
dc90: 69 2c 20 6c 6a 2c 20 6c 6b 2c 20 6c 6c 2c 20 6c  i, lj, lk, ll, l
dca0: 6d 2c 20 6c 6e 2c 0a 20 20 20 20 20 20 20 20 20  m, ln,.         
dcb0: 20 20 20 20 20 20 20 20 20 20 20 6d 61 2c 20 6d             ma, m
dcc0: 62 2c 20 6d 63 2c 20 6d 64 2c 20 6d 65 2c 20 6d  b, mc, md, me, m
dcd0: 66 2c 20 6d 67 2c 20 6d 68 2c 20 6d 69 2c 20 6d  f, mg, mh, mi, m
dce0: 6a 2c 20 6d 6b 2c 20 6d 6c 2c 20 6d 6d 2c 20 6d  j, mk, ml, mm, m
dcf0: 6e 0a 20 20 20 20 29 3b 0a 20 20 20 20 49 4e 53  n.    );.    INS
dd00: 45 52 54 20 49 4e 54 4f 20 74 31 28 61 61 29 20  ERT INTO t1(aa) 
dd10: 56 41 4c 55 45 53 28 20 61 5f 73 74 72 69 6e 67  VALUES( a_string
dd20: 28 31 30 30 30 30 30 29 20 29 3b 0a 20 20 20 20  (100000) );.    
dd30: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 28 61  INSERT INTO t2(a
dd40: 61 29 20 56 41 4c 55 45 53 28 20 61 5f 73 74 72  a) VALUES( a_str
dd50: 69 6e 67 28 31 30 30 30 30 30 29 20 29 3b 0a 20  ing(100000) );. 
dd60: 20 20 20 56 41 43 55 55 4d 3b 0a 20 20 7d 0a 7d     VACUUM;.  }.}
dd70: 20 7b 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   {}..#----------
dd80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
dd90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
dda0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ddb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
ddc0: 23 20 54 65 73 74 20 61 20 63 6f 75 70 6c 65 20  # Test a couple 
ddd0: 6f 66 20 73 70 65 63 69 61 6c 20 63 61 73 65 73  of special cases
dde0: 20 74 68 61 74 20 63 6f 6d 65 20 75 70 20 77 68   that come up wh
ddf0: 69 6c 65 20 63 6f 6d 6d 69 74 74 69 6e 67 20 0a  ile committing .
de00: 23 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 3a 0a  # transactions:.
de10: 23 0a 23 20 20 20 70 61 67 65 72 31 2d 32 30 2e  #.#   pager1-20.
de20: 31 2e 2a 3a 20 43 6f 6d 6d 69 74 74 69 6e 67 20  1.*: Committing 
de30: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
de40: 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f  abase transactio
de50: 6e 20 77 68 65 6e 20 74 68 65 20 0a 23 20 20 20  n when the .#   
de60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
de70: 61 74 61 62 61 73 65 20 68 61 73 20 6e 6f 74 20  atabase has not 
de80: 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 61 74  been modified at
de90: 20 61 6c 6c 2e 0a 23 0a 23 20 20 20 70 61 67 65   all..#.#   page
dea0: 72 31 2d 32 30 2e 32 2e 2a 3a 20 41 73 20 61 62  r1-20.2.*: As ab
deb0: 6f 76 65 2c 20 62 75 74 20 77 69 74 68 20 61 20  ove, but with a 
dec0: 6e 6f 72 6d 61 6c 20 64 62 20 69 6e 20 65 78 63  normal db in exc
ded0: 6c 75 73 69 76 65 2d 6c 6f 63 6b 69 6e 67 20 6d  lusive-locking m
dee0: 6f 64 65 2e 0a 23 0a 23 20 20 20 70 61 67 65 72  ode..#.#   pager
def0: 31 2d 32 30 2e 33 2e 2a 3a 20 43 6f 6d 6d 69 74  1-20.3.*: Commit
df00: 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69  ting a transacti
df10: 6f 6e 20 69 6e 20 57 41 4c 20 6d 6f 64 65 20 77  on in WAL mode w
df20: 68 65 72 65 20 74 68 65 20 64 61 74 61 62 61 73  here the databas
df30: 65 20 68 61 73 0a 23 20 20 20 20 20 20 20 20 20  e has.#         
df40: 20 20 20 20 20 20 20 20 20 62 65 65 6e 20 6d 6f           been mo
df50: 64 69 66 69 65 64 2c 20 62 75 74 20 61 6c 6c 20  dified, but all 
df60: 64 69 72 74 79 20 70 61 67 65 73 20 68 61 76 65  dirty pages have
df70: 20 62 65 65 6e 20 66 6c 75 73 68 65 64 20 74 6f   been flushed to
df80: 20 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20   .#             
df90: 20 20 20 20 20 64 69 73 6b 20 62 65 66 6f 72 65       disk before
dfa0: 20 74 68 65 20 63 6f 6d 6d 69 74 2e 0a 23 0a 64   the commit..#.d
dfb0: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 30  o_test pager1-20
dfc0: 2e 31 2e 31 20 7b 0a 20 20 63 61 74 63 68 20 7b  .1.1 {.  catch {
dfd0: 64 62 20 63 6c 6f 73 65 7d 0a 20 20 73 71 6c 69  db close}.  sqli
dfe0: 74 65 33 20 64 62 20 3a 6d 65 6d 6f 72 79 3a 0a  te3 db :memory:.
dff0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
e000: 43 52 45 41 54 45 20 54 41 42 4c 45 20 6f 6e 65  CREATE TABLE one
e010: 28 74 77 6f 2c 20 74 68 72 65 65 29 3b 0a 20 20  (two, three);.  
e020: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 6f 6e    INSERT INTO on
e030: 65 20 56 41 4c 55 45 53 28 27 61 27 2c 20 27 62  e VALUES('a', 'b
e040: 27 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f  ');.  }.} {}.do_
e050: 74 65 73 74 20 70 61 67 65 72 31 2d 32 30 2e 31  test pager1-20.1
e060: 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .2 {.  execsql {
e070: 0a 20 20 20 20 42 45 47 49 4e 20 45 58 43 4c 55  .    BEGIN EXCLU
e080: 53 49 56 45 3b 0a 20 20 20 20 43 4f 4d 4d 49 54  SIVE;.    COMMIT
e090: 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74  ;.  }.} {}..do_t
e0a0: 65 73 74 20 70 61 67 65 72 31 2d 32 30 2e 32 2e  est pager1-20.2.
e0b0: 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64  1 {.  faultsim_d
e0c0: 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e  elete_and_reopen
e0d0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
e0e0: 20 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f   PRAGMA locking_
e0f0: 6d 6f 64 65 20 3d 20 65 78 63 6c 75 73 69 76 65  mode = exclusive
e100: 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75  ;.    PRAGMA jou
e110: 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 70 65 72 73  rnal_mode = pers
e120: 69 73 74 3b 0a 20 20 20 20 43 52 45 41 54 45 20  ist;.    CREATE 
e130: 54 41 42 4c 45 20 6f 6e 65 28 74 77 6f 2c 20 74  TABLE one(two, t
e140: 68 72 65 65 29 3b 0a 20 20 20 20 49 4e 53 45 52  hree);.    INSER
e150: 54 20 49 4e 54 4f 20 6f 6e 65 20 56 41 4c 55 45  T INTO one VALUE
e160: 53 28 27 61 27 2c 20 27 62 27 29 3b 0a 20 20 7d  S('a', 'b');.  }
e170: 0a 7d 20 7b 65 78 63 6c 75 73 69 76 65 20 70 65  .} {exclusive pe
e180: 72 73 69 73 74 7d 0a 64 6f 5f 74 65 73 74 20 70  rsist}.do_test p
e190: 61 67 65 72 31 2d 32 30 2e 32 2e 32 20 7b 0a 20  ager1-20.2.2 {. 
e1a0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42   execsql {.    B
e1b0: 45 47 49 4e 20 45 58 43 4c 55 53 49 56 45 3b 0a  EGIN EXCLUSIVE;.
e1c0: 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a      COMMIT;.  }.
e1d0: 7d 20 7b 7d 0a 0a 69 66 63 61 70 61 62 6c 65 20  } {}..ifcapable 
e1e0: 77 61 6c 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20  wal {.  do_test 
e1f0: 70 61 67 65 72 31 2d 32 30 2e 33 2e 31 20 7b 0a  pager1-20.3.1 {.
e200: 20 20 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c      faultsim_del
e210: 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20  ete_and_reopen. 
e220: 20 20 20 64 62 20 66 75 6e 63 20 61 5f 73 74 72     db func a_str
e230: 69 6e 67 20 61 5f 73 74 72 69 6e 67 0a 20 20 20  ing a_string.   
e240: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20   execsql {.     
e250: 20 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69   PRAGMA cache_si
e260: 7a 65 20 3d 20 31 30 3b 0a 20 20 20 20 20 20 50  ze = 10;.      P
e270: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
e280: 64 65 20 3d 20 77 61 6c 3b 0a 20 20 20 20 20 20  de = wal;.      
e290: 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 20 20 43  BEGIN;.        C
e2a0: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 78  REATE TABLE t1(x
e2b0: 29 3b 0a 20 20 20 20 20 20 20 20 43 52 45 41 54  );.        CREAT
e2c0: 45 20 54 41 42 4c 45 20 74 32 28 79 29 3b 0a 20  E TABLE t2(y);. 
e2d0: 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e         INSERT IN
e2e0: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 61 5f 73  TO t1 VALUES(a_s
e2f0: 74 72 69 6e 67 28 38 30 30 29 29 3b 0a 20 20 20  tring(800));.   
e300: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
e310: 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74 72   t1 SELECT a_str
e320: 69 6e 67 28 38 30 30 29 20 46 52 4f 4d 20 74 31  ing(800) FROM t1
e330: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20 32  ;         /*   2
e340: 20 2a 2f 0a 20 20 20 20 20 20 20 20 49 4e 53 45   */.        INSE
e350: 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
e360: 54 20 61 5f 73 74 72 69 6e 67 28 38 30 30 29 20  T a_string(800) 
e370: 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 20  FROM t1;        
e380: 20 2f 2a 20 20 20 34 20 2a 2f 0a 20 20 20 20 20   /*   4 */.     
e390: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
e3a0: 31 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e  1 SELECT a_strin
e3b0: 67 28 38 30 30 29 20 46 52 4f 4d 20 74 31 3b 20  g(800) FROM t1; 
e3c0: 20 20 20 20 20 20 20 20 2f 2a 20 20 20 38 20 2a          /*   8 *
e3d0: 2f 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54  /.        INSERT
e3e0: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
e3f0: 61 5f 73 74 72 69 6e 67 28 38 30 30 29 20 46 52  a_string(800) FR
e400: 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 20 20 2f  OM t1;         /
e410: 2a 20 20 31 36 20 2a 2f 0a 20 20 20 20 20 20 20  *  16 */.       
e420: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
e430: 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28  SELECT a_string(
e440: 38 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20  800) FROM t1;   
e450: 20 20 20 20 20 20 2f 2a 20 20 33 32 20 2a 2f 0a        /*  32 */.
e460: 20 20 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20        COMMIT;.  
e470: 20 20 7d 0a 20 20 7d 20 7b 77 61 6c 7d 0a 20 20    }.  } {wal}.  
e480: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32  do_test pager1-2
e490: 30 2e 33 2e 32 20 7b 0a 20 20 20 20 65 78 65 63  0.3.2 {.    exec
e4a0: 73 71 6c 20 7b 0a 20 20 20 20 20 20 42 45 47 49  sql {.      BEGI
e4b0: 4e 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  N;.      INSERT 
e4c0: 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 27  INTO t2 VALUES('
e4d0: 78 78 78 78 27 29 3b 0a 20 20 20 20 7d 0a 20 20  xxxx');.    }.  
e4e0: 20 20 72 65 63 75 72 73 69 76 65 5f 73 65 6c 65    recursive_sele
e4f0: 63 74 20 33 32 20 74 31 0a 20 20 20 20 65 78 65  ct 32 t1.    exe
e500: 63 73 71 6c 20 43 4f 4d 4d 49 54 0a 20 20 7d 20  csql COMMIT.  } 
e510: 7b 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  {}.}..#---------
e520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e560: 0a 23 20 54 65 73 74 20 74 68 61 74 20 61 20 57  .# Test that a W
e570: 41 4c 20 64 61 74 61 62 61 73 65 20 6d 61 79 20  AL database may 
e580: 6e 6f 74 20 62 65 20 6f 70 65 6e 65 64 20 69 66  not be opened if
e590: 3a 0a 23 0a 23 20 20 20 70 61 67 65 72 31 2d 32  :.#.#   pager1-2
e5a0: 31 2e 31 2e 2a 3a 20 54 68 65 20 56 46 53 20 68  1.1.*: The VFS h
e5b0: 61 73 20 61 6e 20 69 56 65 72 73 69 6f 6e 20 6c  as an iVersion l
e5c0: 65 73 73 20 74 68 61 6e 20 32 2c 20 6f 72 0a 23  ess than 2, or.#
e5d0: 20 20 20 70 61 67 65 72 31 2d 32 31 2e 32 2e 2a     pager1-21.2.*
e5e0: 3a 20 54 68 65 20 56 46 53 20 64 6f 65 73 20 6e  : The VFS does n
e5f0: 6f 74 20 70 72 6f 76 69 64 65 20 78 53 68 6d 58  ot provide xShmX
e600: 58 58 28 29 20 6d 65 74 68 6f 64 73 2e 0a 23 0a  XX() methods..#.
e610: 69 66 63 61 70 61 62 6c 65 20 77 61 6c 20 7b 0a  ifcapable wal {.
e620: 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
e630: 2d 32 31 2e 30 20 7b 0a 20 20 20 20 66 61 75 6c  -21.0 {.    faul
e640: 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f  tsim_delete_and_
e650: 72 65 6f 70 65 6e 0a 20 20 20 20 65 78 65 63 73  reopen.    execs
e660: 71 6c 20 7b 0a 20 20 20 20 20 20 50 52 41 47 4d  ql {.      PRAGM
e670: 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d  A journal_mode =
e680: 20 57 41 4c 3b 0a 20 20 20 20 20 20 43 52 45 41   WAL;.      CREA
e690: 54 45 20 54 41 42 4c 45 20 6b 6f 28 63 20 44 45  TE TABLE ko(c DE
e6a0: 46 41 55 4c 54 20 27 61 62 63 27 2c 20 62 20 44  FAULT 'abc', b D
e6b0: 45 46 41 55 4c 54 20 27 64 65 66 27 29 3b 0a 20  EFAULT 'def');. 
e6c0: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
e6d0: 20 6b 6f 20 44 45 46 41 55 4c 54 20 56 41 4c 55   ko DEFAULT VALU
e6e0: 45 53 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 77  ES;.    }.  } {w
e6f0: 61 6c 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61  al}.  do_test pa
e700: 67 65 72 31 2d 32 31 2e 31 20 7b 0a 20 20 20 20  ger1-21.1 {.    
e710: 74 65 73 74 76 66 73 20 74 76 20 2d 6e 6f 73 68  testvfs tv -nosh
e720: 6d 20 31 0a 20 20 20 20 73 71 6c 69 74 65 33 20  m 1.    sqlite3 
e730: 64 62 32 20 74 65 73 74 2e 64 62 20 2d 76 66 73  db2 test.db -vfs
e740: 20 74 76 0a 20 20 20 20 63 61 74 63 68 73 71 6c   tv.    catchsql
e750: 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d   { SELECT * FROM
e760: 20 6b 6f 20 7d 20 64 62 32 0a 20 20 7d 20 7b 31   ko } db2.  } {1
e770: 20 7b 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e   {unable to open
e780: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 7d 7d   database file}}
e790: 0a 20 20 64 62 32 20 63 6c 6f 73 65 0a 20 20 74  .  db2 close.  t
e7a0: 76 20 64 65 6c 65 74 65 0a 20 20 64 6f 5f 74 65  v delete.  do_te
e7b0: 73 74 20 70 61 67 65 72 31 2d 32 31 2e 32 20 7b  st pager1-21.2 {
e7c0: 0a 20 20 20 20 74 65 73 74 76 66 73 20 74 76 20  .    testvfs tv 
e7d0: 2d 69 76 65 72 73 69 6f 6e 20 31 0a 20 20 20 20  -iversion 1.    
e7e0: 73 71 6c 69 74 65 33 20 64 62 32 20 74 65 73 74  sqlite3 db2 test
e7f0: 2e 64 62 20 2d 76 66 73 20 74 76 0a 20 20 20 20  .db -vfs tv.    
e800: 63 61 74 63 68 73 71 6c 20 7b 20 53 45 4c 45 43  catchsql { SELEC
e810: 54 20 2a 20 46 52 4f 4d 20 6b 6f 20 7d 20 64 62  T * FROM ko } db
e820: 32 0a 20 20 7d 20 7b 31 20 7b 75 6e 61 62 6c 65  2.  } {1 {unable
e830: 20 74 6f 20 6f 70 65 6e 20 64 61 74 61 62 61 73   to open databas
e840: 65 20 66 69 6c 65 7d 7d 0a 20 20 64 62 32 20 63  e file}}.  db2 c
e850: 6c 6f 73 65 0a 20 20 74 76 20 64 65 6c 65 74 65  lose.  tv delete
e860: 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .}..#-----------
e870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e8a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
e8b0: 20 54 65 73 74 20 74 68 61 74 20 61 20 22 50 52   Test that a "PR
e8c0: 41 47 4d 41 20 77 61 6c 5f 63 68 65 63 6b 70 6f  AGMA wal_checkpo
e8d0: 69 6e 74 22 3a 0a 23 0a 23 20 20 20 70 61 67 65  int":.#.#   page
e8e0: 72 31 2d 32 32 2e 31 2e 2a 3a 20 69 73 20 61 20  r1-22.1.*: is a 
e8f0: 6e 6f 2d 6f 70 20 6f 6e 20 61 20 6e 6f 6e 2d 57  no-op on a non-W
e900: 41 4c 20 64 62 2c 20 61 6e 64 0a 23 20 20 20 70  AL db, and.#   p
e910: 61 67 65 72 31 2d 32 32 2e 32 2e 2a 3a 20 64 6f  ager1-22.2.*: do
e920: 65 73 20 6e 6f 74 20 63 61 75 73 65 20 78 53 79  es not cause xSy
e930: 6e 63 20 63 61 6c 6c 73 20 77 69 74 68 20 61 20  nc calls with a 
e940: 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 6f 66 66 20  synchronous=off 
e950: 64 62 2e 0a 23 0a 69 66 63 61 70 61 62 6c 65 20  db..#.ifcapable 
e960: 77 61 6c 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20  wal {.  do_test 
e970: 70 61 67 65 72 31 2d 32 32 2e 31 2e 31 20 7b 0a  pager1-22.1.1 {.
e980: 20 20 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c      faultsim_del
e990: 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20  ete_and_reopen. 
e9a0: 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20     execsql {.   
e9b0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
e9c0: 6b 6f 28 63 20 44 45 46 41 55 4c 54 20 27 61 62  ko(c DEFAULT 'ab
e9d0: 63 27 2c 20 62 20 44 45 46 41 55 4c 54 20 27 64  c', b DEFAULT 'd
e9e0: 65 66 27 29 3b 0a 20 20 20 20 20 20 49 4e 53 45  ef');.      INSE
e9f0: 52 54 20 49 4e 54 4f 20 6b 6f 20 44 45 46 41 55  RT INTO ko DEFAU
ea00: 4c 54 20 56 41 4c 55 45 53 3b 0a 20 20 20 20 7d  LT VALUES;.    }
ea10: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 50  .    execsql { P
ea20: 52 41 47 4d 41 20 77 61 6c 5f 63 68 65 63 6b 70  RAGMA wal_checkp
ea30: 6f 69 6e 74 20 7d 0a 20 20 7d 20 7b 30 20 2d 31  oint }.  } {0 -1
ea40: 20 2d 31 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70   -1}.  do_test p
ea50: 61 67 65 72 31 2d 32 32 2e 32 2e 31 20 7b 0a 20  ager1-22.2.1 {. 
ea60: 20 20 20 74 65 73 74 76 66 73 20 74 76 20 2d 64     testvfs tv -d
ea70: 65 66 61 75 6c 74 20 31 0a 20 20 20 20 74 76 20  efault 1.    tv 
ea80: 66 69 6c 74 65 72 20 78 53 79 6e 63 0a 20 20 20  filter xSync.   
ea90: 20 74 76 20 73 63 72 69 70 74 20 78 53 79 6e 63   tv script xSync
eaa0: 43 62 0a 20 20 20 20 70 72 6f 63 20 78 53 79 6e  Cb.    proc xSyn
eab0: 63 43 62 20 7b 61 72 67 73 7d 20 7b 69 6e 63 72  cCb {args} {incr
eac0: 20 3a 3a 73 79 6e 63 63 6f 75 6e 74 7d 0a 20 20   ::synccount}.  
ead0: 20 20 73 65 74 20 3a 3a 73 79 6e 63 63 6f 75 6e    set ::synccoun
eae0: 74 20 30 0a 20 20 20 20 73 71 6c 69 74 65 33 20  t 0.    sqlite3 
eaf0: 64 62 20 74 65 73 74 2e 64 62 0a 20 20 20 20 65  db test.db.    e
eb00: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 50  xecsql {.      P
eb10: 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75  RAGMA synchronou
eb20: 73 20 3d 20 6f 66 66 3b 0a 20 20 20 20 20 20 50  s = off;.      P
eb30: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
eb40: 64 65 20 3d 20 57 41 4c 3b 0a 20 20 20 20 20 20  de = WAL;.      
eb50: 49 4e 53 45 52 54 20 49 4e 54 4f 20 6b 6f 20 44  INSERT INTO ko D
eb60: 45 46 41 55 4c 54 20 56 41 4c 55 45 53 3b 0a 20  EFAULT VALUES;. 
eb70: 20 20 20 7d 0a 20 20 20 20 65 78 65 63 73 71 6c     }.    execsql
eb80: 20 7b 20 50 52 41 47 4d 41 20 77 61 6c 5f 63 68   { PRAGMA wal_ch
eb90: 65 63 6b 70 6f 69 6e 74 20 7d 0a 20 20 20 20 73  eckpoint }.    s
eba0: 65 74 20 73 79 6e 63 63 6f 75 6e 74 0a 20 20 7d  et synccount.  }
ebb0: 20 7b 30 7d 0a 20 20 64 62 20 63 6c 6f 73 65 0a   {0}.  db close.
ebc0: 20 20 74 76 20 64 65 6c 65 74 65 0a 7d 0a 0a 23    tv delete.}..#
ebd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ebe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ebf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ec00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ec10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74  ---------.# Test
ec20: 73 20 66 6f 72 20 63 68 61 6e 67 69 6e 67 20 6a  s for changing j
ec30: 6f 75 72 6e 61 6c 20 6d 6f 64 65 2e 0a 23 0a 23  ournal mode..#.#
ec40: 20 20 20 70 61 67 65 72 31 2d 32 33 2e 31 2e 2a     pager1-23.1.*
ec50: 3a 20 54 65 73 74 20 74 68 61 74 20 77 68 65 6e  : Test that when
ec60: 20 63 68 61 6e 67 69 6e 67 20 66 72 6f 6d 20 50   changing from P
ec70: 45 52 53 49 53 54 20 74 6f 20 44 45 4c 45 54 45  ERSIST to DELETE
ec80: 20 6d 6f 64 65 2c 0a 23 20 20 20 20 20 20 20 20   mode,.#        
ec90: 20 20 20 20 20 20 20 20 20 20 74 68 65 20 6a 6f            the jo
eca0: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 64 65  urnal file is de
ecb0: 6c 65 74 65 64 2e 0a 23 0a 23 20 20 20 70 61 67  leted..#.#   pag
ecc0: 65 72 31 2d 32 33 2e 32 2e 2a 3a 20 53 61 6d 65  er1-23.2.*: Same
ecd0: 20 74 65 73 74 20 61 73 20 61 62 6f 76 65 2c 20   test as above, 
ece0: 62 75 74 20 77 68 69 6c 65 20 61 20 73 68 61 72  but while a shar
ecf0: 65 64 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 0a  ed lock is held.
ed00: 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  #               
ed10: 20 20 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61     on the databa
ed20: 73 65 20 66 69 6c 65 2e 0a 23 0a 23 20 20 20 70  se file..#.#   p
ed30: 61 67 65 72 31 2d 32 33 2e 33 2e 2a 3a 20 53 61  ager1-23.3.*: Sa
ed40: 6d 65 20 74 65 73 74 20 61 73 20 61 62 6f 76 65  me test as above
ed50: 2c 20 62 75 74 20 77 68 69 6c 65 20 61 20 72 65  , but while a re
ed60: 73 65 72 76 65 64 20 6c 6f 63 6b 20 69 73 20 68  served lock is h
ed70: 65 6c 64 0a 23 20 20 20 20 20 20 20 20 20 20 20  eld.#           
ed80: 20 20 20 20 20 20 20 6f 6e 20 74 68 65 20 64 61         on the da
ed90: 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 23 0a 23  tabase file..#.#
eda0: 20 20 20 70 61 67 65 72 31 2d 32 33 2e 34 2e 2a     pager1-23.4.*
edb0: 3a 20 41 6e 64 2c 20 66 6f 72 20 66 75 6e 2c 20  : And, for fun, 
edc0: 77 68 69 6c 65 20 68 6f 6c 64 69 6e 67 20 61 6e  while holding an
edd0: 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e   exclusive lock.
ede0: 0a 23 0a 23 20 20 20 70 61 67 65 72 31 2d 32 33  .#.#   pager1-23
edf0: 2e 35 2e 2a 3a 20 54 72 79 20 74 6f 20 73 65 74  .5.*: Try to set
ee00: 20 76 61 72 69 6f 75 73 20 64 69 66 66 65 72 65   various differe
ee10: 6e 74 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 73  nt journal modes
ee20: 20 77 69 74 68 20 61 6e 0a 23 20 20 20 20 20 20   with an.#      
ee30: 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 2d 6d              in-m
ee40: 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 28  emory database (
ee50: 6f 6e 6c 79 20 4d 45 4d 4f 52 59 20 61 6e 64 20  only MEMORY and 
ee60: 4f 46 46 20 73 68 6f 75 6c 64 20 77 6f 72 6b 29  OFF should work)
ee70: 2e 0a 23 0a 23 20 20 20 70 61 67 65 72 31 2d 32  ..#.#   pager1-2
ee80: 33 2e 36 2e 2a 3a 20 54 72 79 20 74 6f 20 73 65  3.6.*: Try to se
ee90: 74 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 6e  t locking_mode=n
eea0: 6f 72 6d 61 6c 20 6f 6e 20 61 6e 20 69 6e 2d 6d  ormal on an in-m
eeb0: 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 0a 23  emory database.#
eec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eed0: 20 20 28 64 6f 65 73 6e 27 74 20 77 6f 72 6b 20    (doesn't work 
eee0: 2d 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  - in-memory data
eef0: 62 61 73 65 73 20 61 6c 77 61 79 73 20 75 73 65  bases always use
ef00: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
ef10: 20 20 20 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65      locking_mode
ef20: 3d 65 78 63 6c 75 73 69 76 65 29 2e 0a 23 0a 64  =exclusive)..#.d
ef30: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 33  o_test pager1-23
ef40: 2e 31 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73 69  .1.1 {.  faultsi
ef50: 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f  m_delete_and_reo
ef60: 70 65 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  pen.  execsql {.
ef70: 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e      PRAGMA journ
ef80: 61 6c 5f 6d 6f 64 65 20 3d 20 50 45 52 53 49 53  al_mode = PERSIS
ef90: 54 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  T;.    CREATE TA
efa0: 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20  BLE t1(a, b);.  
efb0: 7d 0a 20 20 66 69 6c 65 20 65 78 69 73 74 73 20  }.  file exists 
efc0: 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a  test.db-journal.
efd0: 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73 74 20 70 61  } {1}.do_test pa
efe0: 67 65 72 31 2d 32 33 2e 31 2e 32 20 7b 0a 20 20  ger1-23.1.2 {.  
eff0: 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41  execsql { PRAGMA
f000: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20   journal_mode = 
f010: 44 45 4c 45 54 45 20 7d 0a 20 20 66 69 6c 65 20  DELETE }.  file 
f020: 65 78 69 73 74 73 20 74 65 73 74 2e 64 62 2d 6a  exists test.db-j
f030: 6f 75 72 6e 61 6c 0a 7d 20 7b 30 7d 0a 0a 64 6f  ournal.} {0}..do
f040: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 33 2e  _test pager1-23.
f050: 32 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  2.1 {.  execsql 
f060: 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75  {.    PRAGMA jou
f070: 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 50 45 52 53  rnal_mode = PERS
f080: 49 53 54 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  IST;.    INSERT 
f090: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27  INTO t1 VALUES('
f0a0: 43 61 6e 62 65 72 72 61 27 2c 20 27 41 43 54 27  Canberra', 'ACT'
f0b0: 29 3b 0a 20 20 7d 0a 20 20 64 62 20 65 76 61 6c  );.  }.  db eval
f0c0: 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d   { SELECT * FROM
f0d0: 20 74 31 20 7d 20 7b 0a 20 20 20 20 64 62 20 65   t1 } {.    db e
f0e0: 76 61 6c 20 7b 20 50 52 41 47 4d 41 20 6a 6f 75  val { PRAGMA jou
f0f0: 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c 45  rnal_mode = DELE
f100: 54 45 20 7d 0a 20 20 7d 0a 20 20 65 78 65 63 73  TE }.  }.  execs
f110: 71 6c 20 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72  ql { PRAGMA jour
f120: 6e 61 6c 5f 6d 6f 64 65 20 7d 0a 7d 20 7b 64 65  nal_mode }.} {de
f130: 6c 65 74 65 7d 0a 64 6f 5f 74 65 73 74 20 70 61  lete}.do_test pa
f140: 67 65 72 31 2d 32 33 2e 32 2e 32 20 7b 0a 20 20  ger1-23.2.2 {.  
f150: 66 69 6c 65 20 65 78 69 73 74 73 20 74 65 73 74  file exists test
f160: 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 7d 20 7b 30  .db-journal.} {0
f170: 7d 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  }..do_test pager
f180: 31 2d 32 33 2e 33 2e 31 20 7b 0a 20 20 65 78 65  1-23.3.1 {.  exe
f190: 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d  csql {.    PRAGM
f1a0: 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d  A journal_mode =
f1b0: 20 50 45 52 53 49 53 54 3b 0a 20 20 20 20 49 4e   PERSIST;.    IN
f1c0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
f1d0: 55 45 53 28 27 44 61 72 77 69 6e 27 2c 20 27 4e  UES('Darwin', 'N
f1e0: 54 27 29 3b 0a 20 20 20 20 42 45 47 49 4e 20 49  T');.    BEGIN I
f1f0: 4d 4d 45 44 49 41 54 45 3b 0a 20 20 7d 0a 20 20  MMEDIATE;.  }.  
f200: 64 62 20 65 76 61 6c 20 7b 20 50 52 41 47 4d 41  db eval { PRAGMA
f210: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20   journal_mode = 
f220: 44 45 4c 45 54 45 20 7d 0a 20 20 65 78 65 63 73  DELETE }.  execs
f230: 71 6c 20 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72  ql { PRAGMA jour
f240: 6e 61 6c 5f 6d 6f 64 65 20 7d 0a 7d 20 7b 64 65  nal_mode }.} {de
f250: 6c 65 74 65 7d 0a 64 6f 5f 74 65 73 74 20 70 61  lete}.do_test pa
f260: 67 65 72 31 2d 32 33 2e 33 2e 32 20 7b 0a 20 20  ger1-23.3.2 {.  
f270: 66 69 6c 65 20 65 78 69 73 74 73 20 74 65 73 74  file exists test
f280: 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 7d 20 7b 30  .db-journal.} {0
f290: 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  }.do_test pager1
f2a0: 2d 32 33 2e 33 2e 33 20 7b 0a 20 20 65 78 65 63  -23.3.3 {.  exec
f2b0: 73 71 6c 20 43 4f 4d 4d 49 54 0a 7d 20 7b 7d 0a  sql COMMIT.} {}.
f2c0: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
f2d0: 32 33 2e 34 2e 31 20 7b 0a 20 20 65 78 65 63 73  23.4.1 {.  execs
f2e0: 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20  ql {.    PRAGMA 
f2f0: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 50  journal_mode = P
f300: 45 52 53 49 53 54 3b 0a 20 20 20 20 49 4e 53 45  ERSIST;.    INSE
f310: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
f320: 53 28 27 41 64 65 6c 61 69 64 65 27 2c 20 27 53  S('Adelaide', 'S
f330: 41 27 29 3b 0a 20 20 20 20 42 45 47 49 4e 20 45  A');.    BEGIN E
f340: 58 43 4c 55 53 49 56 45 3b 0a 20 20 7d 0a 20 20  XCLUSIVE;.  }.  
f350: 64 62 20 65 76 61 6c 20 7b 20 50 52 41 47 4d 41  db eval { PRAGMA
f360: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20   journal_mode = 
f370: 44 45 4c 45 54 45 20 7d 0a 20 20 65 78 65 63 73  DELETE }.  execs
f380: 71 6c 20 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72  ql { PRAGMA jour
f390: 6e 61 6c 5f 6d 6f 64 65 20 7d 0a 7d 20 7b 64 65  nal_mode }.} {de
f3a0: 6c 65 74 65 7d 0a 64 6f 5f 74 65 73 74 20 70 61  lete}.do_test pa
f3b0: 67 65 72 31 2d 32 33 2e 34 2e 32 20 7b 0a 20 20  ger1-23.4.2 {.  
f3c0: 66 69 6c 65 20 65 78 69 73 74 73 20 74 65 73 74  file exists test
f3d0: 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 7d 20 7b 30  .db-journal.} {0
f3e0: 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  }.do_test pager1
f3f0: 2d 32 33 2e 34 2e 33 20 7b 0a 20 20 65 78 65 63  -23.4.3 {.  exec
f400: 73 71 6c 20 43 4f 4d 4d 49 54 0a 7d 20 7b 7d 0a  sql COMMIT.} {}.
f410: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
f420: 32 33 2e 35 2e 31 20 7b 0a 20 20 66 61 75 6c 74  23.5.1 {.  fault
f430: 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72  sim_delete_and_r
f440: 65 6f 70 65 6e 0a 20 20 73 71 6c 69 74 65 33 20  eopen.  sqlite3 
f450: 64 62 20 3a 6d 65 6d 6f 72 79 3a 0a 7d 20 7b 7d  db :memory:.} {}
f460: 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20 6d 6f 64  .foreach {tn mod
f470: 65 20 70 6f 73 73 69 62 6c 65 7d 20 7b 0a 20 20  e possible} {.  
f480: 32 20 20 6f 66 66 20 20 20 20 20 20 31 0a 20 20  2  off      1.  
f490: 33 20 20 6d 65 6d 6f 72 79 20 20 20 31 0a 20 20  3  memory   1.  
f4a0: 34 20 20 70 65 72 73 69 73 74 20 20 30 0a 20 20  4  persist  0.  
f4b0: 35 20 20 64 65 6c 65 74 65 20 20 20 30 0a 20 20  5  delete   0.  
f4c0: 36 20 20 77 61 6c 20 20 20 20 20 20 30 0a 20 20  6  wal      0.  
f4d0: 37 20 20 74 72 75 6e 63 61 74 65 20 30 0a 7d 20  7  truncate 0.} 
f4e0: 7b 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65  {.  do_test page
f4f0: 72 31 2d 32 33 2e 35 2e 24 74 6e 2e 31 20 7b 0a  r1-23.5.$tn.1 {.
f500: 20 20 20 20 65 78 65 63 73 71 6c 20 22 50 52 41      execsql "PRA
f510: 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
f520: 20 3d 20 6f 66 66 22 0a 20 20 20 20 65 78 65 63   = off".    exec
f530: 73 71 6c 20 22 50 52 41 47 4d 41 20 6a 6f 75 72  sql "PRAGMA jour
f540: 6e 61 6c 5f 6d 6f 64 65 20 3d 20 24 6d 6f 64 65  nal_mode = $mode
f550: 22 0a 20 20 7d 20 5b 69 66 20 24 70 6f 73 73 69  ".  } [if $possi
f560: 62 6c 65 20 7b 6c 69 73 74 20 24 6d 6f 64 65 7d  ble {list $mode}
f570: 20 7b 6c 69 73 74 20 6f 66 66 7d 5d 0a 20 20 64   {list off}].  d
f580: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 33  o_test pager1-23
f590: 2e 35 2e 24 74 6e 2e 32 20 7b 0a 20 20 20 20 65  .5.$tn.2 {.    e
f5a0: 78 65 63 73 71 6c 20 22 50 52 41 47 4d 41 20 6a  xecsql "PRAGMA j
f5b0: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 6d 65  ournal_mode = me
f5c0: 6d 6f 72 79 22 0a 20 20 20 20 65 78 65 63 73 71  mory".    execsq
f5d0: 6c 20 22 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61  l "PRAGMA journa
f5e0: 6c 5f 6d 6f 64 65 20 3d 20 24 6d 6f 64 65 22 0a  l_mode = $mode".
f5f0: 20 20 7d 20 5b 69 66 20 24 70 6f 73 73 69 62 6c    } [if $possibl
f600: 65 20 7b 6c 69 73 74 20 24 6d 6f 64 65 7d 20 7b  e {list $mode} {
f610: 6c 69 73 74 20 6d 65 6d 6f 72 79 7d 5d 0a 7d 0a  list memory}].}.
f620: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32  do_test pager1-2
f630: 33 2e 36 2e 31 20 7b 0a 20 20 65 78 65 63 73 71  3.6.1 {.  execsq
f640: 6c 20 7b 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e  l {PRAGMA lockin
f650: 67 5f 6d 6f 64 65 20 3d 20 6e 6f 72 6d 61 6c 7d  g_mode = normal}
f660: 0a 7d 20 7b 65 78 63 6c 75 73 69 76 65 7d 0a 64  .} {exclusive}.d
f670: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 33  o_test pager1-23
f680: 2e 36 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c  .6.2 {.  execsql
f690: 20 7b 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67   {PRAGMA locking
f6a0: 5f 6d 6f 64 65 20 3d 20 65 78 63 6c 75 73 69 76  _mode = exclusiv
f6b0: 65 7d 0a 7d 20 7b 65 78 63 6c 75 73 69 76 65 7d  e}.} {exclusive}
f6c0: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
f6d0: 32 33 2e 36 2e 33 20 7b 0a 20 20 65 78 65 63 73  23.6.3 {.  execs
f6e0: 71 6c 20 7b 50 52 41 47 4d 41 20 6c 6f 63 6b 69  ql {PRAGMA locki
f6f0: 6e 67 5f 6d 6f 64 65 7d 0a 7d 20 7b 65 78 63 6c  ng_mode}.} {excl
f700: 75 73 69 76 65 7d 0a 64 6f 5f 74 65 73 74 20 70  usive}.do_test p
f710: 61 67 65 72 31 2d 32 33 2e 36 2e 34 20 7b 0a 20  ager1-23.6.4 {. 
f720: 20 65 78 65 63 73 71 6c 20 7b 50 52 41 47 4d 41   execsql {PRAGMA
f730: 20 6d 61 69 6e 2e 6c 6f 63 6b 69 6e 67 5f 6d 6f   main.locking_mo
f740: 64 65 7d 0a 7d 20 7b 65 78 63 6c 75 73 69 76 65  de}.} {exclusive
f750: 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }..#------------
f760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 0a  -------------.#.
f7a0: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32  do_test pager1-2
f7b0: 34 2e 31 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73  4.1.1 {.  faults
f7c0: 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65  im_delete_and_re
f7d0: 6f 70 65 6e 0a 20 20 64 62 20 66 75 6e 63 20 61  open.  db func a
f7e0: 5f 73 74 72 69 6e 67 20 61 5f 73 74 72 69 6e 67  _string a_string
f7f0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
f800: 20 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69   PRAGMA cache_si
f810: 7a 65 20 3d 20 31 30 3b 0a 20 20 20 20 50 52 41  ze = 10;.    PRA
f820: 47 4d 41 20 61 75 74 6f 5f 76 61 63 75 75 6d 20  GMA auto_vacuum 
f830: 3d 20 46 55 4c 4c 3b 0a 20 20 20 20 43 52 45 41  = FULL;.    CREA
f840: 54 45 20 54 41 42 4c 45 20 78 31 28 78 2c 20 79  TE TABLE x1(x, y
f850: 2c 20 7a 2c 20 50 52 49 4d 41 52 59 20 4b 45 59  , z, PRIMARY KEY
f860: 28 79 2c 20 7a 29 29 3b 0a 20 20 20 20 43 52 45  (y, z));.    CRE
f870: 41 54 45 20 54 41 42 4c 45 20 78 32 28 78 2c 20  ATE TABLE x2(x, 
f880: 79 2c 20 7a 2c 20 50 52 49 4d 41 52 59 20 4b 45  y, z, PRIMARY KE
f890: 59 28 79 2c 20 7a 29 29 3b 0a 20 20 20 20 49 4e  Y(y, z));.    IN
f8a0: 53 45 52 54 20 49 4e 54 4f 20 78 32 20 56 41 4c  SERT INTO x2 VAL
f8b0: 55 45 53 28 61 5f 73 74 72 69 6e 67 28 34 30 30  UES(a_string(400
f8c0: 29 2c 20 61 5f 73 74 72 69 6e 67 28 35 30 30 29  ), a_string(500)
f8d0: 2c 20 61 5f 73 74 72 69 6e 67 28 36 30 30 29 29  , a_string(600))
f8e0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
f8f0: 4f 20 78 32 20 53 45 4c 45 43 54 20 61 5f 73 74  O x2 SELECT a_st
f900: 72 69 6e 67 28 36 30 30 29 2c 20 61 5f 73 74 72  ring(600), a_str
f910: 69 6e 67 28 34 30 30 29 2c 20 61 5f 73 74 72 69  ing(400), a_stri
f920: 6e 67 28 35 30 30 29 20 46 52 4f 4d 20 78 32 3b  ng(500) FROM x2;
f930: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
f940: 20 78 32 20 53 45 4c 45 43 54 20 61 5f 73 74 72   x2 SELECT a_str
f950: 69 6e 67 28 35 30 30 29 2c 20 61 5f 73 74 72 69  ing(500), a_stri
f960: 6e 67 28 36 30 30 29 2c 20 61 5f 73 74 72 69 6e  ng(600), a_strin
f970: 67 28 34 30 30 29 20 46 52 4f 4d 20 78 32 3b 0a  g(400) FROM x2;.
f980: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
f990: 78 32 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69  x2 SELECT a_stri
f9a0: 6e 67 28 34 30 30 29 2c 20 61 5f 73 74 72 69 6e  ng(400), a_strin
f9b0: 67 28 35 30 30 29 2c 20 61 5f 73 74 72 69 6e 67  g(500), a_string
f9c0: 28 36 30 30 29 20 46 52 4f 4d 20 78 32 3b 0a 20  (600) FROM x2;. 
f9d0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78     INSERT INTO x
f9e0: 32 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e  2 SELECT a_strin
f9f0: 67 28 36 30 30 29 2c 20 61 5f 73 74 72 69 6e 67  g(600), a_string
fa00: 28 34 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28  (400), a_string(
fa10: 35 30 30 29 20 46 52 4f 4d 20 78 32 3b 0a 20 20  500) FROM x2;.  
fa20: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 32    INSERT INTO x2
fa30: 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67   SELECT a_string
fa40: 28 35 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28  (500), a_string(
fa50: 36 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 34  600), a_string(4
fa60: 30 30 29 20 46 52 4f 4d 20 78 32 3b 0a 20 20 20  00) FROM x2;.   
fa70: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 32 20   INSERT INTO x2 
fa80: 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28  SELECT a_string(
fa90: 34 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 35  400), a_string(5
faa0: 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 36 30  00), a_string(60
fab0: 30 29 20 46 52 4f 4d 20 78 32 3b 0a 20 20 20 20  0) FROM x2;.    
fac0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 31 20 53  INSERT INTO x1 S
fad0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 78 32 3b  ELECT * FROM x2;
fae0: 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73  .  }.} {}.do_tes
faf0: 74 20 70 61 67 65 72 31 2d 32 34 2e 31 2e 32 20  t pager1-24.1.2 
fb00: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
fb10: 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 44    BEGIN;.      D
fb20: 45 4c 45 54 45 20 46 52 4f 4d 20 78 31 20 57 48  ELETE FROM x1 WH
fb30: 45 52 45 20 72 6f 77 69 64 3c 33 32 3b 0a 20 20  ERE rowid<32;.  
fb40: 7d 0a 20 20 72 65 63 75 72 73 69 76 65 5f 73 65  }.  recursive_se
fb50: 6c 65 63 74 20 36 34 20 78 32 0a 7d 20 7b 7d 0a  lect 64 x2.} {}.
fb60: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32  do_test pager1-2
fb70: 34 2e 31 2e 33 20 7b 0a 20 20 65 78 65 63 73 71  4.1.3 {.  execsq
fb80: 6c 20 7b 20 0a 20 20 20 20 20 20 55 50 44 41 54  l { .      UPDAT
fb90: 45 20 78 31 20 53 45 54 20 7a 20 3d 20 61 5f 73  E x1 SET z = a_s
fba0: 74 72 69 6e 67 28 33 30 30 29 20 57 48 45 52 45  tring(300) WHERE
fbb0: 20 72 6f 77 69 64 3e 34 30 3b 0a 20 20 20 20 43   rowid>40;.    C
fbc0: 4f 4d 4d 49 54 3b 0a 20 20 20 20 50 52 41 47 4d  OMMIT;.    PRAGM
fbd0: 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63  A integrity_chec
fbe0: 6b 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 63 6f  k;.    SELECT co
fbf0: 75 6e 74 28 2a 29 20 46 52 4f 4d 20 78 31 3b 0a  unt(*) FROM x1;.
fc00: 20 20 7d 0a 7d 20 7b 6f 6b 20 33 33 7d 0a 0a 64    }.} {ok 33}..d
fc10: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 34  o_test pager1-24
fc20: 2e 31 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c  .1.4 {.  execsql
fc30: 20 7b 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52   {.    DELETE FR
fc40: 4f 4d 20 78 31 3b 0a 20 20 20 20 49 4e 53 45 52  OM x1;.    INSER
fc50: 54 20 49 4e 54 4f 20 78 31 20 53 45 4c 45 43 54  T INTO x1 SELECT
fc60: 20 2a 20 46 52 4f 4d 20 78 32 3b 0a 20 20 20 20   * FROM x2;.    
fc70: 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 44 45 4c  BEGIN;.      DEL
fc80: 45 54 45 20 46 52 4f 4d 20 78 31 20 57 48 45 52  ETE FROM x1 WHER
fc90: 45 20 72 6f 77 69 64 3c 33 32 3b 0a 20 20 20 20  E rowid<32;.    
fca0: 20 20 55 50 44 41 54 45 20 78 31 20 53 45 54 20    UPDATE x1 SET 
fcb0: 7a 20 3d 20 61 5f 73 74 72 69 6e 67 28 32 39 39  z = a_string(299
fcc0: 29 20 57 48 45 52 45 20 72 6f 77 69 64 3e 34 30  ) WHERE rowid>40
fcd0: 3b 0a 20 20 7d 0a 20 20 72 65 63 75 72 73 69 76  ;.  }.  recursiv
fce0: 65 5f 73 65 6c 65 63 74 20 36 34 20 78 32 20 7b  e_select 64 x2 {
fcf0: 64 62 20 65 76 61 6c 20 43 4f 4d 4d 49 54 7d 0a  db eval COMMIT}.
fd00: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
fd10: 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79  PRAGMA integrity
fd20: 5f 63 68 65 63 6b 3b 0a 20 20 20 20 53 45 4c 45  _check;.    SELE
fd30: 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
fd40: 20 78 31 3b 0a 20 20 7d 0a 7d 20 7b 6f 6b 20 33   x1;.  }.} {ok 3
fd50: 33 7d 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  3}..do_test page
fd60: 72 31 2d 32 34 2e 31 2e 35 20 7b 0a 20 20 65 78  r1-24.1.5 {.  ex
fd70: 65 63 73 71 6c 20 7b 0a 20 20 20 20 44 45 4c 45  ecsql {.    DELE
fd80: 54 45 20 46 52 4f 4d 20 78 31 3b 0a 20 20 20 20  TE FROM x1;.    
fd90: 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 31 20 53  INSERT INTO x1 S
fda0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 78 32 3b  ELECT * FROM x2;
fdb0: 0a 20 20 7d 0a 20 20 72 65 63 75 72 73 69 76 65  .  }.  recursive
fdc0: 5f 73 65 6c 65 63 74 20 36 34 20 78 32 20 7b 20  _select 64 x2 { 
fdd0: 64 62 20 65 76 61 6c 20 7b 43 52 45 41 54 45 20  db eval {CREATE 
fde0: 54 41 42 4c 45 20 78 33 28 78 2c 20 79 2c 20 7a  TABLE x3(x, y, z
fdf0: 29 7d 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b  )} }.  execsql {
fe00: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 78   SELECT * FROM x
fe10: 33 20 7d 0a 7d 20 7b 7d 0a 0a 23 2d 2d 2d 2d 2d  3 }.} {}..#-----
fe20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fe30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fe40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fe50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fe60: 2d 2d 2d 2d 0a 23 0a 64 6f 5f 74 65 73 74 20 70  ----.#.do_test p
fe70: 61 67 65 72 31 2d 32 35 2d 31 20 7b 0a 20 20 66  ager1-25-1 {.  f
fe80: 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61  aultsim_delete_a
fe90: 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65 63  nd_reopen.  exec
fea0: 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b  sql {.    BEGIN;
feb0: 0a 20 20 20 20 20 20 53 41 56 45 50 4f 49 4e 54  .      SAVEPOINT
fec0: 20 61 62 63 3b 0a 20 20 20 20 20 20 20 20 43 52   abc;.        CR
fed0: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c  EATE TABLE t1(a,
fee0: 20 62 29 3b 0a 20 20 20 20 20 20 52 4f 4c 4c 42   b);.      ROLLB
fef0: 41 43 4b 20 54 4f 20 61 62 63 3b 0a 20 20 20 20  ACK TO abc;.    
ff00: 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 20 20 64 62  COMMIT;.  }.  db
ff10: 20 63 6c 6f 73 65 0a 7d 20 7b 7d 0a 62 72 65 61   close.} {}.brea
ff20: 6b 70 6f 69 6e 74 0a 64 6f 5f 74 65 73 74 20 70  kpoint.do_test p
ff30: 61 67 65 72 31 2d 32 35 2d 32 20 7b 0a 20 20 66  ager1-25-2 {.  f
ff40: 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61  aultsim_delete_a
ff50: 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65 63  nd_reopen.  exec
ff60: 73 71 6c 20 7b 0a 20 20 20 20 53 41 56 45 50 4f  sql {.    SAVEPO
ff70: 49 4e 54 20 61 62 63 3b 0a 20 20 20 20 20 20 43  INT abc;.      C
ff80: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61  REATE TABLE t1(a
ff90: 2c 20 62 29 3b 0a 20 20 20 20 52 4f 4c 4c 42 41  , b);.    ROLLBA
ffa0: 43 4b 20 54 4f 20 61 62 63 3b 0a 20 20 20 20 43  CK TO abc;.    C
ffb0: 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 20 20 64 62 20  OMMIT;.  }.  db 
ffc0: 63 6c 6f 73 65 0a 7d 20 7b 7d 0a 0a 23 2d 2d 2d  close.} {}..#---
ffd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ffe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10000 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10010 2d 2d 2d 2d 2d 2d 0a 23 20 53 65 63 74 6f 72 2d  ------.# Sector-
10020 73 69 7a 65 20 74 65 73 74 73 2e 0a 23 0a 64 6f  size tests..#.do
10030 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 36 2e  _test pager1-26.
10040 31 20 7b 0a 20 20 74 65 73 74 76 66 73 20 74 76  1 {.  testvfs tv
10050 20 2d 64 65 66 61 75 6c 74 20 31 0a 20 20 74 76   -default 1.  tv
10060 20 73 65 63 74 6f 72 73 69 7a 65 20 34 30 39 36   sectorsize 4096
10070 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65  .  faultsim_dele
10080 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20  te_and_reopen.  
10090 64 62 20 66 75 6e 63 20 61 5f 73 74 72 69 6e 67  db func a_string
100a0 20 61 5f 73 74 72 69 6e 67 0a 20 20 65 78 65 63   a_string.  exec
100b0 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41  sql {.    PRAGMA
100c0 20 70 61 67 65 5f 73 69 7a 65 20 3d 20 35 31 32   page_size = 512
100d0 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
100e0 4c 45 20 74 62 6c 28 61 20 50 52 49 4d 41 52 59  LE tbl(a PRIMARY
100f0 20 4b 45 59 2c 20 62 20 55 4e 49 51 55 45 29 3b   KEY, b UNIQUE);
10100 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20  .    BEGIN;.    
10110 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 62    INSERT INTO tb
10120 6c 20 56 41 4c 55 45 53 28 61 5f 73 74 72 69 6e  l VALUES(a_strin
10130 67 28 32 35 29 2c 20 61 5f 73 74 72 69 6e 67 28  g(25), a_string(
10140 36 30 30 29 29 3b 0a 20 20 20 20 20 20 49 4e 53  600));.      INS
10150 45 52 54 20 49 4e 54 4f 20 74 62 6c 20 53 45 4c  ERT INTO tbl SEL
10160 45 43 54 20 61 5f 73 74 72 69 6e 67 28 32 35 29  ECT a_string(25)
10170 2c 20 61 5f 73 74 72 69 6e 67 28 36 30 30 29 20  , a_string(600) 
10180 46 52 4f 4d 20 74 62 6c 3b 0a 20 20 20 20 20 20  FROM tbl;.      
10190 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 62 6c 20  INSERT INTO tbl 
101a0 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28  SELECT a_string(
101b0 32 35 29 2c 20 61 5f 73 74 72 69 6e 67 28 36 30  25), a_string(60
101c0 30 29 20 46 52 4f 4d 20 74 62 6c 3b 0a 20 20 20  0) FROM tbl;.   
101d0 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
101e0 62 6c 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69  bl SELECT a_stri
101f0 6e 67 28 32 35 29 2c 20 61 5f 73 74 72 69 6e 67  ng(25), a_string
10200 28 36 30 30 29 20 46 52 4f 4d 20 74 62 6c 3b 0a  (600) FROM tbl;.
10210 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
10220 4f 20 74 62 6c 20 53 45 4c 45 43 54 20 61 5f 73  O tbl SELECT a_s
10230 74 72 69 6e 67 28 32 35 29 2c 20 61 5f 73 74 72  tring(25), a_str
10240 69 6e 67 28 36 30 30 29 20 46 52 4f 4d 20 74 62  ing(600) FROM tb
10250 6c 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  l;.      INSERT 
10260 49 4e 54 4f 20 74 62 6c 20 53 45 4c 45 43 54 20  INTO tbl SELECT 
10270 61 5f 73 74 72 69 6e 67 28 32 35 29 2c 20 61 5f  a_string(25), a_
10280 73 74 72 69 6e 67 28 36 30 30 29 20 46 52 4f 4d  string(600) FROM
10290 20 74 62 6c 3b 0a 20 20 20 20 20 20 49 4e 53 45   tbl;.      INSE
102a0 52 54 20 49 4e 54 4f 20 74 62 6c 20 53 45 4c 45  RT INTO tbl SELE
102b0 43 54 20 61 5f 73 74 72 69 6e 67 28 32 35 29 2c  CT a_string(25),
102c0 20 61 5f 73 74 72 69 6e 67 28 36 30 30 29 20 46   a_string(600) F
102d0 52 4f 4d 20 74 62 6c 3b 0a 20 20 20 20 20 20 49  ROM tbl;.      I
102e0 4e 53 45 52 54 20 49 4e 54 4f 20 74 62 6c 20 53  NSERT INTO tbl S
102f0 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 32  ELECT a_string(2
10300 35 29 2c 20 61 5f 73 74 72 69 6e 67 28 36 30 30  5), a_string(600
10310 29 20 46 52 4f 4d 20 74 62 6c 3b 0a 20 20 20 20  ) FROM tbl;.    
10320 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 7d 20 7b 7d  COMMIT;.  }.} {}
10330 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
10340 20 70 61 67 65 72 31 2d 32 36 2e 31 20 7b 0a 20   pager1-26.1 {. 
10350 20 55 50 44 41 54 45 20 74 62 6c 20 53 45 54 20   UPDATE tbl SET 
10360 62 20 3d 20 61 5f 73 74 72 69 6e 67 28 35 35 30  b = a_string(550
10370 29 3b 0a 7d 20 7b 7d 0a 64 62 20 63 6c 6f 73 65  );.} {}.db close
10380 0a 74 76 20 64 65 6c 65 74 65 0a 0a 23 2d 2d 2d  .tv delete..#---
10390 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
103a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
103b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
103c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
103d0 2d 2d 2d 2d 2d 2d 0a 23 0a 64 6f 5f 74 65 73 74  ------.#.do_test
103e0 20 70 61 67 65 72 31 2e 32 37 2e 31 20 7b 0a 20   pager1.27.1 {. 
103f0 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65   faultsim_delete
10400 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 73 71  _and_reopen.  sq
10410 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65 66 63  lite3_pager_refc
10420 6f 75 6e 74 73 20 64 62 0a 20 20 65 78 65 63 73  ounts db.  execs
10430 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a  ql {.    BEGIN;.
10440 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42        CREATE TAB
10450 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 7d  LE t1(a, b);.  }
10460 0a 20 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72  .  sqlite3_pager
10470 5f 72 65 66 63 6f 75 6e 74 73 20 64 62 0a 20 20  _refcounts db.  
10480 65 78 65 63 73 71 6c 20 43 4f 4d 4d 49 54 0a 7d  execsql COMMIT.}
10490 20 7b 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   {}..#----------
104a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
104b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
104c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
104d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
104e0 23 20 54 65 73 74 20 74 68 61 74 20 61 74 74 65  # Test that atte
104f0 6d 70 74 69 6e 67 20 74 6f 20 6f 70 65 6e 20 61  mpting to open a
10500 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
10510 6f 6e 20 77 69 74 68 20 0a 23 20 6c 6f 63 6b 69  on with .# locki
10520 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76  ng_mode=exclusiv
10530 65 20 69 6e 20 57 41 4c 20 6d 6f 64 65 20 66 61  e in WAL mode fa
10540 69 6c 73 20 69 66 20 74 68 65 72 65 20 61 72 65  ils if there are
10550 20 6f 74 68 65 72 20 63 6c 69 65 6e 74 73 20 6f   other clients o
10560 6e 20 0a 23 20 74 68 65 20 73 61 6d 65 20 64 61  n .# the same da
10570 74 61 62 61 73 65 2e 0a 23 0a 63 61 74 63 68 20  tabase..#.catch 
10580 7b 20 64 62 20 63 6c 6f 73 65 20 7d 0a 69 66 63  { db close }.ifc
10590 61 70 61 62 6c 65 20 77 61 6c 20 7b 0a 20 20 64  apable wal {.  d
105a0 6f 5f 6d 75 6c 74 69 63 6c 69 65 6e 74 5f 74 65  o_multiclient_te
105b0 73 74 20 74 6e 20 7b 0a 20 20 20 20 64 6f 5f 74  st tn {.    do_t
105c0 65 73 74 20 70 61 67 65 72 31 2d 32 38 2e 24 74  est pager1-28.$t
105d0 6e 2e 31 20 7b 0a 20 20 20 20 20 20 73 71 6c 31  n.1 {.      sql1
105e0 20 7b 20 0a 20 20 20 20 20 20 20 20 50 52 41 47   { .        PRAG
105f0 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  MA journal_mode 
10600 3d 20 57 41 4c 3b 0a 20 20 20 20 20 20 20 20 43  = WAL;.        C
10610 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61  REATE TABLE t1(a
10620 2c 20 62 29 3b 0a 20 20 20 20 20 20 20 20 49 4e  , b);.        IN
10630 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
10640 55 45 53 28 27 61 27 2c 20 27 62 27 29 3b 0a 20  UES('a', 'b');. 
10650 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 7b 77 61       }.    } {wa
10660 6c 7d 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 70  l}.    do_test p
10670 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e 32 20 7b  ager1-28.$tn.2 {
10680 20 73 71 6c 32 20 7b 20 53 45 4c 45 43 54 20 2a   sql2 { SELECT *
10690 20 46 52 4f 4d 20 74 31 20 7d 20 7d 20 7b 61 20   FROM t1 } } {a 
106a0 62 7d 0a 0a 20 20 20 20 64 6f 5f 74 65 73 74 20  b}..    do_test 
106b0 70 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e 33 20  pager1-28.$tn.3 
106c0 7b 20 73 71 6c 31 20 7b 20 50 52 41 47 4d 41 20  { sql1 { PRAGMA 
106d0 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63  locking_mode=exc
106e0 6c 75 73 69 76 65 20 7d 20 7d 20 7b 65 78 63 6c  lusive } } {excl
106f0 75 73 69 76 65 7d 0a 20 20 20 20 64 6f 5f 74 65  usive}.    do_te
10700 73 74 20 70 61 67 65 72 31 2d 32 38 2e 24 74 6e  st pager1-28.$tn
10710 2e 34 20 7b 20 0a 20 20 20 20 20 20 63 73 71 6c  .4 { .      csql
10720 31 20 7b 20 42 45 47 49 4e 3b 20 49 4e 53 45 52  1 { BEGIN; INSER
10730 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
10740 28 27 63 27 2c 20 27 64 27 29 3b 20 7d 0a 20 20  ('c', 'd'); }.  
10750 20 20 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65    } {1 {database
10760 20 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 20 20 20   is locked}}.   
10770 20 63 6f 64 65 32 20 7b 20 64 62 32 20 63 6c 6f   code2 { db2 clo
10780 73 65 20 3b 20 73 71 6c 69 74 65 33 20 64 62 32  se ; sqlite3 db2
10790 20 74 65 73 74 2e 64 62 20 7d 0a 20 20 20 20 64   test.db }.    d
107a0 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 38  o_test pager1-28
107b0 2e 24 74 6e 2e 34 20 7b 20 0a 20 20 20 20 20 20  .$tn.4 { .      
107c0 73 71 6c 31 20 7b 20 49 4e 53 45 52 54 20 49 4e  sql1 { INSERT IN
107d0 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27 63 27  TO t1 VALUES('c'
107e0 2c 20 27 64 27 29 3b 20 43 4f 4d 4d 49 54 20 7d  , 'd'); COMMIT }
107f0 0a 20 20 20 20 7d 20 7b 7d 0a 20 20 7d 0a 7d 0a  .    } {}.  }.}.
10800 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 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 0a 23 20 4e 6f  -----------.# No
10850 72 6d 61 6c 6c 79 2c 20 77 68 65 6e 20 63 68 61  rmally, when cha
10860 6e 67 69 6e 67 20 66 72 6f 6d 20 6a 6f 75 72 6e  nging from journ
10870 61 6c 5f 6d 6f 64 65 3d 50 45 52 53 49 53 54 20  al_mode=PERSIST 
10880 74 6f 20 44 45 4c 45 54 45 20 74 68 65 20 70 61  to DELETE the pa
10890 67 65 72 0a 23 20 61 74 74 65 6d 70 74 73 20 74  ger.# attempts t
108a0 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75  o delete the jou
108b0 72 6e 61 6c 20 66 69 6c 65 2e 20 48 6f 77 65 76  rnal file. Howev
108c0 65 72 2c 20 69 66 20 69 74 20 63 61 6e 6e 6f 74  er, if it cannot
108d0 20 6f 62 74 61 69 6e 20 61 0a 23 20 52 45 53 45   obtain a.# RESE
108e0 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  RVED lock on the
108f0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
10900 74 68 69 73 20 73 74 65 70 20 69 73 20 73 6b 69  this step is ski
10910 70 70 65 64 2e 0a 23 0a 64 6f 5f 6d 75 6c 74 69  pped..#.do_multi
10920 63 6c 69 65 6e 74 5f 74 65 73 74 20 74 6e 20 7b  client_test tn {
10930 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72  .  do_test pager
10940 31 2d 32 38 2e 24 74 6e 2e 31 20 7b 0a 20 20 20  1-28.$tn.1 {.   
10950 20 73 71 6c 31 20 7b 20 0a 20 20 20 20 20 20 50   sql1 { .      P
10960 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
10970 64 65 20 3d 20 50 45 52 53 49 53 54 3b 0a 20 20  de = PERSIST;.  
10980 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
10990 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 20   t1(a, b);.     
109a0 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
109b0 56 41 4c 55 45 53 28 27 61 27 2c 20 27 62 27 29  VALUES('a', 'b')
109c0 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 70 65 72  ;.    }.  } {per
109d0 73 69 73 74 7d 0a 20 20 64 6f 5f 74 65 73 74 20  sist}.  do_test 
109e0 70 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e 32 20  pager1-28.$tn.2 
109f0 7b 20 66 69 6c 65 20 65 78 69 73 74 73 20 74 65  { file exists te
10a00 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 7d 20  st.db-journal } 
10a10 31 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65  1.  do_test page
10a20 72 31 2d 32 38 2e 24 74 6e 2e 33 20 7b 20 73 71  r1-28.$tn.3 { sq
10a30 6c 31 20 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72  l1 { PRAGMA jour
10a40 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c 45 54  nal_mode = DELET
10a50 45 20 7d 20 7d 20 64 65 6c 65 74 65 0a 20 20 64  E } } delete.  d
10a60 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 38  o_test pager1-28
10a70 2e 24 74 6e 2e 34 20 7b 20 66 69 6c 65 20 65 78  .$tn.4 { file ex
10a80 69 73 74 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75  ists test.db-jou
10a90 72 6e 61 6c 20 7d 20 30 0a 0a 20 20 64 6f 5f 74  rnal } 0..  do_t
10aa0 65 73 74 20 70 61 67 65 72 31 2d 32 38 2e 24 74  est pager1-28.$t
10ab0 6e 2e 35 20 7b 0a 20 20 20 20 73 71 6c 31 20 7b  n.5 {.    sql1 {
10ac0 20 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 6a   .      PRAGMA j
10ad0 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 50 45  ournal_mode = PE
10ae0 52 53 49 53 54 3b 0a 20 20 20 20 20 20 49 4e 53  RSIST;.      INS
10af0 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
10b00 45 53 28 27 63 27 2c 20 27 64 27 29 3b 0a 20 20  ES('c', 'd');.  
10b10 20 20 7d 0a 20 20 7d 20 7b 70 65 72 73 69 73 74    }.  } {persist
10b20 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65  }.  do_test page
10b30 72 31 2d 32 38 2e 24 74 6e 2e 36 20 7b 20 66 69  r1-28.$tn.6 { fi
10b40 6c 65 20 65 78 69 73 74 73 20 74 65 73 74 2e 64  le exists test.d
10b50 62 2d 6a 6f 75 72 6e 61 6c 20 7d 20 31 0a 20 20  b-journal } 1.  
10b60 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32  do_test pager1-2
10b70 38 2e 24 74 6e 2e 37 20 7b 0a 20 20 20 20 73 71  8.$tn.7 {.    sq
10b80 6c 32 20 7b 20 42 45 47 49 4e 3b 20 49 4e 53 45  l2 { BEGIN; INSE
10b90 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
10ba0 53 28 27 65 27 2c 20 27 66 27 29 3b 20 7d 0a 20  S('e', 'f'); }. 
10bb0 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74 20   } {}.  do_test 
10bc0 70 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e 38 20  pager1-28.$tn.8 
10bd0 20 7b 20 66 69 6c 65 20 65 78 69 73 74 73 20 74   { file exists t
10be0 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 7d  est.db-journal }
10bf0 20 31 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67   1.  do_test pag
10c00 65 72 31 2d 32 38 2e 24 74 6e 2e 39 20 20 7b 20  er1-28.$tn.9  { 
10c10 73 71 6c 31 20 7b 20 50 52 41 47 4d 41 20 6a 6f  sql1 { PRAGMA jo
10c20 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c  urnal_mode = DEL
10c30 45 54 45 20 7d 20 7d 20 64 65 6c 65 74 65 0a 20  ETE } } delete. 
10c40 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
10c50 32 38 2e 24 74 6e 2e 31 30 20 7b 20 66 69 6c 65  28.$tn.10 { file
10c60 20 65 78 69 73 74 73 20 74 65 73 74 2e 64 62 2d   exists test.db-
10c70 6a 6f 75 72 6e 61 6c 20 7d 20 31 0a 0a 20 20 64  journal } 1..  d
10c80 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 38  o_test pager1-28
10c90 2e 24 74 6e 2e 31 31 20 7b 20 73 71 6c 32 20 43  .$tn.11 { sql2 C
10ca0 4f 4d 4d 49 54 20 7d 20 7b 7d 0a 20 20 64 6f 5f  OMMIT } {}.  do_
10cb0 74 65 73 74 20 70 61 67 65 72 31 2d 32 38 2e 24  test pager1-28.$
10cc0 74 6e 2e 31 32 20 7b 20 66 69 6c 65 20 65 78 69  tn.12 { file exi
10cd0 73 74 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72  sts test.db-jour
10ce0 6e 61 6c 20 7d 20 30 0a 0a 20 20 64 6f 5f 74 65  nal } 0..  do_te
10cf0 73 74 20 70 61 67 65 72 31 2d 32 38 2d 24 74 6e  st pager1-28-$tn
10d00 2e 31 33 20 7b 0a 20 20 20 20 63 6f 64 65 31 20  .13 {.    code1 
10d10 7b 20 73 65 74 20 63 68 61 6e 6e 65 6c 20 5b 64  { set channel [d
10d20 62 20 69 6e 63 72 62 6c 6f 62 20 2d 72 65 61 64  b incrblob -read
10d30 6f 6e 6c 79 20 74 31 20 61 20 32 5d 20 7d 0a 20  only t1 a 2] }. 
10d40 20 20 20 73 71 6c 31 20 7b 0a 20 20 20 20 20 20     sql1 {.      
10d50 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
10d60 6f 64 65 20 3d 20 50 45 52 53 49 53 54 3b 0a 20  ode = PERSIST;. 
10d70 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
10d80 20 74 31 20 56 41 4c 55 45 53 28 27 67 27 2c 20   t1 VALUES('g', 
10d90 27 68 27 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 20  'h');.    }.  } 
10da0 7b 70 65 72 73 69 73 74 7d 0a 20 20 64 6f 5f 74  {persist}.  do_t
10db0 65 73 74 20 70 61 67 65 72 31 2d 32 38 2e 24 74  est pager1-28.$t
10dc0 6e 2e 31 34 20 7b 20 66 69 6c 65 20 65 78 69 73  n.14 { file exis
10dd0 74 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e  ts test.db-journ
10de0 61 6c 20 7d 20 31 0a 20 20 64 6f 5f 74 65 73 74  al } 1.  do_test
10df0 20 70 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e 31   pager1-28.$tn.1
10e00 35 20 7b 0a 20 20 20 20 73 71 6c 32 20 7b 20 42  5 {.    sql2 { B
10e10 45 47 49 4e 3b 20 49 4e 53 45 52 54 20 49 4e 54  EGIN; INSERT INT
10e20 4f 20 74 31 20 56 41 4c 55 45 53 28 27 65 27 2c  O t1 VALUES('e',
10e30 20 27 66 27 29 3b 20 7d 0a 20 20 7d 20 7b 7d 0a   'f'); }.  } {}.
10e40 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
10e50 2d 32 38 2e 24 74 6e 2e 31 36 20 7b 20 73 71 6c  -28.$tn.16 { sql
10e60 31 20 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e  1 { PRAGMA journ
10e70 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c 45 54 45  al_mode = DELETE
10e80 20 7d 20 7d 20 64 65 6c 65 74 65 0a 20 20 64 6f   } } delete.  do
10e90 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 38 2e  _test pager1-28.
10ea0 24 74 6e 2e 31 37 20 7b 20 66 69 6c 65 20 65 78  $tn.17 { file ex
10eb0 69 73 74 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75  ists test.db-jou
10ec0 72 6e 61 6c 20 7d 20 31 0a 0a 20 20 64 6f 5f 74  rnal } 1..  do_t
10ed0 65 73 74 20 70 61 67 65 72 31 2d 32 38 2e 24 74  est pager1-28.$t
10ee0 6e 2e 31 37 20 7b 20 63 73 71 6c 32 20 7b 20 43  n.17 { csql2 { C
10ef0 4f 4d 4d 49 54 20 7d 20 7d 20 7b 31 20 7b 64 61  OMMIT } } {1 {da
10f00 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64  tabase is locked
10f10 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67  }}.  do_test pag
10f20 65 72 31 2d 32 38 2d 24 74 6e 2e 31 38 20 7b 20  er1-28-$tn.18 { 
10f30 63 6f 64 65 31 20 7b 20 72 65 61 64 20 24 63 68  code1 { read $ch
10f40 61 6e 6e 65 6c 20 7d 20 7d 20 63 0a 20 20 64 6f  annel } } c.  do
10f50 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 38 2d  _test pager1-28-
10f60 24 74 6e 2e 31 39 20 7b 20 63 6f 64 65 31 20 7b  $tn.19 { code1 {
10f70 20 63 6c 6f 73 65 20 24 63 68 61 6e 6e 65 6c 20   close $channel 
10f80 7d 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74  } } {}.  do_test
10f90 20 70 61 67 65 72 31 2d 32 38 2e 24 74 6e 2e 32   pager1-28.$tn.2
10fa0 30 20 7b 20 73 71 6c 32 20 7b 20 43 4f 4d 4d 49  0 { sql2 { COMMI
10fb0 54 20 7d 20 7d 20 7b 7d 0a 7d 0a 0a 64 6f 5f 74  T } } {}.}..do_t
10fc0 65 73 74 20 70 61 67 65 72 31 2d 32 39 2e 31 20  est pager1-29.1 
10fd0 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c  {.  faultsim_del
10fe0 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20  ete_and_reopen. 
10ff0 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50   execsql {.    P
11000 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20  RAGMA page_size 
11010 3d 20 31 30 32 34 3b 0a 20 20 20 20 50 52 41 47  = 1024;.    PRAG
11020 4d 41 20 61 75 74 6f 5f 76 61 63 75 75 6d 20 3d  MA auto_vacuum =
11030 20 66 75 6c 6c 3b 0a 20 20 20 20 50 52 41 47 4d   full;.    PRAGM
11040 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65  A locking_mode=e
11050 78 63 6c 75 73 69 76 65 3b 0a 20 20 20 20 43 52  xclusive;.    CR
11060 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c  EATE TABLE t1(a,
11070 20 62 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   b);.    INSERT 
11080 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31  INTO t1 VALUES(1
11090 2c 20 32 29 3b 0a 20 20 7d 0a 20 20 66 69 6c 65  , 2);.  }.  file
110a0 20 73 69 7a 65 20 74 65 73 74 2e 64 62 0a 7d 20   size test.db.} 
110b0 5b 65 78 70 72 20 31 30 32 34 2a 33 5d 0a 64 6f  [expr 1024*3].do
110c0 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 39 2e  _test pager1-29.
110d0 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  2 {.  execsql {.
110e0 20 20 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f      PRAGMA page_
110f0 73 69 7a 65 20 3d 20 34 30 39 36 3b 0a 20 20 20  size = 4096;.   
11100 20 56 41 43 55 55 4d 3b 0a 20 20 7d 0a 20 20 66   VACUUM;.  }.  f
11110 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62  ile size test.db
11120 0a 7d 20 5b 65 78 70 72 20 34 30 39 36 2a 33 5d  .} [expr 4096*3]
11130 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
11140 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11150 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11160 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11170 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54  ------------.# T
11180 65 73 74 20 74 68 61 74 20 69 66 20 61 6e 20 65  est that if an e
11190 6d 70 74 79 20 64 61 74 61 62 61 73 65 20 66 69  mpty database fi
111a0 6c 65 20 28 73 69 7a 65 20 30 20 62 79 74 65 73  le (size 0 bytes
111b0 29 20 69 73 20 6f 70 65 6e 65 64 20 69 6e 20 0a  ) is opened in .
111c0 23 20 65 78 63 6c 75 73 69 76 65 2d 6c 6f 63 6b  # exclusive-lock
111d0 69 6e 67 20 6d 6f 64 65 2c 20 61 6e 79 20 6a 6f  ing mode, any jo
111e0 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 64 65  urnal file is de
111f0 6c 65 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66  leted from the f
11200 69 6c 65 2d 73 79 73 74 65 6d 0a 23 20 77 69 74  ile-system.# wit
11210 68 6f 75 74 20 62 65 69 6e 67 20 72 6f 6c 6c 65  hout being rolle
11220 64 20 62 61 63 6b 2e 20 41 6e 64 20 74 68 61 74  d back. And that
11230 20 74 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f   the RESERVED lo
11240 63 6b 20 6f 62 74 61 69 6e 65 64 20 77 68 69 6c  ck obtained whil
11250 65 0a 23 20 64 6f 69 6e 67 20 74 68 69 73 20 69  e.# doing this i
11260 73 20 6e 6f 74 20 72 65 6c 65 61 73 65 64 2e 0a  s not released..
11270 23 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  #.do_test pager1
11280 2d 33 30 2e 31 20 7b 0a 20 20 64 62 20 63 6c 6f  -30.1 {.  db clo
11290 73 65 0a 20 20 64 65 6c 65 74 65 5f 66 69 6c 65  se.  delete_file
112a0 20 74 65 73 74 2e 64 62 0a 20 20 64 65 6c 65 74   test.db.  delet
112b0 65 5f 66 69 6c 65 20 74 65 73 74 2e 64 62 2d 6a  e_file test.db-j
112c0 6f 75 72 6e 61 6c 0a 20 20 73 65 74 20 66 64 20  ournal.  set fd 
112d0 5b 6f 70 65 6e 20 74 65 73 74 2e 64 62 2d 6a 6f  [open test.db-jo
112e0 75 72 6e 61 6c 20 77 5d 0a 20 20 73 65 65 6b 20  urnal w].  seek 
112f0 24 66 64 20 5b 65 78 70 72 20 35 31 32 2b 31 30  $fd [expr 512+10
11300 33 32 2a 32 5d 0a 20 20 70 75 74 73 20 2d 6e 6f  32*2].  puts -no
11310 6e 65 77 6c 69 6e 65 20 24 66 64 20 78 0a 20 20  newline $fd x.  
11320 63 6c 6f 73 65 20 24 66 64 0a 0a 20 20 73 71 6c  close $fd..  sql
11330 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a  ite3 db test.db.
11340 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
11350 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d  PRAGMA locking_m
11360 6f 64 65 3d 45 58 43 4c 55 53 49 56 45 3b 0a 20  ode=EXCLUSIVE;. 
11370 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28     SELECT count(
11380 2a 29 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d  *) FROM sqlite_m
11390 61 73 74 65 72 3b 0a 20 20 20 20 50 52 41 47 4d  aster;.    PRAGM
113a0 41 20 6c 6f 63 6b 5f 73 74 61 74 75 73 3b 0a 20  A lock_status;. 
113b0 20 7d 0a 7d 20 7b 65 78 63 6c 75 73 69 76 65 20   }.} {exclusive 
113c0 30 20 6d 61 69 6e 20 72 65 73 65 72 76 65 64 20  0 main reserved 
113d0 74 65 6d 70 20 63 6c 6f 73 65 64 7d 0a 0a 23 2d  temp closed}..#-
113e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
113f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11400 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11410 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11420 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20  --------.# Test 
11430 74 68 61 74 20 69 66 20 74 68 65 20 22 70 61 67  that if the "pag
11440 65 2d 73 69 7a 65 22 20 66 69 65 6c 64 20 69 6e  e-size" field in
11450 20 61 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65   a journal-heade
11460 72 20 69 73 20 30 2c 20 74 68 65 20 6a 6f 75 72  r is 0, the jour
11470 6e 61 6c 0a 23 20 66 69 6c 65 20 63 61 6e 20 73  nal.# file can s
11480 74 69 6c 6c 20 62 65 20 72 6f 6c 6c 65 64 20 62  till be rolled b
11490 61 63 6b 2e 20 54 68 69 73 20 69 73 20 72 65 71  ack. This is req
114a0 75 69 72 65 64 20 66 6f 72 20 62 61 63 6b 77 61  uired for backwa
114b0 72 64 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79  rd compatibility
114c0 20 2d 0a 23 20 76 65 72 73 69 6f 6e 73 20 6f 66   -.# versions of
114d0 20 53 51 4c 69 74 65 20 70 72 69 6f 72 20 74 6f   SQLite prior to
114e0 20 33 2e 35 2e 38 20 61 6c 77 61 79 73 20 73 65   3.5.8 always se
114f0 74 20 74 68 69 73 20 66 69 65 6c 64 20 74 6f 20  t this field to 
11500 7a 65 72 6f 2e 0a 23 0a 69 66 20 7b 24 74 63 6c  zero..#.if {$tcl
11510 5f 70 6c 61 74 66 6f 72 6d 28 70 6c 61 74 66 6f  _platform(platfo
11520 72 6d 29 3d 3d 22 75 6e 69 78 22 7d 20 7b 0a 64  rm)=="unix"} {.d
11530 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 33 31  o_test pager1-31
11540 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f  .1 {.  faultsim_
11550 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65  delete_and_reope
11560 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  n.  execsql {.  
11570 20 20 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73    PRAGMA cache_s
11580 69 7a 65 20 3d 20 31 30 3b 0a 20 20 20 20 50 52  ize = 10;.    PR
11590 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d  AGMA page_size =
115a0 20 31 30 32 34 3b 0a 20 20 20 20 43 52 45 41 54   1024;.    CREAT
115b0 45 20 54 41 42 4c 45 20 74 31 28 78 2c 20 79 2c  E TABLE t1(x, y,
115c0 20 55 4e 49 51 55 45 28 78 2c 20 79 29 29 3b 0a   UNIQUE(x, y));.
115d0 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
115e0 74 31 20 56 41 4c 55 45 53 28 72 61 6e 64 6f 6d  t1 VALUES(random
115f0 62 6c 6f 62 28 31 35 30 30 29 2c 20 72 61 6e 64  blob(1500), rand
11600 6f 6d 62 6c 6f 62 28 31 35 30 30 29 29 3b 0a 20  omblob(1500));. 
11610 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
11620 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62  1 SELECT randomb
11630 6c 6f 62 28 31 35 30 30 29 2c 20 72 61 6e 64 6f  lob(1500), rando
11640 6d 62 6c 6f 62 28 31 35 30 30 29 20 46 52 4f 4d  mblob(1500) FROM
11650 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   t1;.    INSERT 
11660 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72  INTO t1 SELECT r
11670 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 2c  andomblob(1500),
11680 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30   randomblob(1500
11690 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49  ) FROM t1;.    I
116a0 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
116b0 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  LECT randomblob(
116c0 31 35 30 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f  1500), randomblo
116d0 62 28 31 35 30 30 29 20 46 52 4f 4d 20 74 31 3b  b(1500) FROM t1;
116e0 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
116f0 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f   t1 SELECT rando
11700 6d 62 6c 6f 62 28 31 35 30 30 29 2c 20 72 61 6e  mblob(1500), ran
11710 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 20 46 52  domblob(1500) FR
11720 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52  OM t1;.    INSER
11730 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
11740 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30   randomblob(1500
11750 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35  ), randomblob(15
11760 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20  00) FROM t1;.   
11770 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
11780 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f  SELECT randomblo
11790 62 28 31 35 30 30 29 2c 20 72 61 6e 64 6f 6d 62  b(1500), randomb
117a0 6c 6f 62 28 31 35 30 30 29 20 46 52 4f 4d 20 74  lob(1500) FROM t
117b0 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  1;.    INSERT IN
117c0 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e  TO t1 SELECT ran
117d0 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 2c 20 72  domblob(1500), r
117e0 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 20  andomblob(1500) 
117f0 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53  FROM t1;.    INS
11800 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
11810 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35  CT randomblob(15
11820 30 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  00), randomblob(
11830 31 35 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20  1500) FROM t1;. 
11840 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
11850 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62  1 SELECT randomb
11860 6c 6f 62 28 31 35 30 30 29 2c 20 72 61 6e 64 6f  lob(1500), rando
11870 6d 62 6c 6f 62 28 31 35 30 30 29 20 46 52 4f 4d  mblob(1500) FROM
11880 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   t1;.    INSERT 
11890 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72  INTO t1 SELECT r
118a0 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 2c  andomblob(1500),
118b0 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30   randomblob(1500
118c0 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 42  ) FROM t1;.    B
118d0 45 47 49 4e 3b 0a 20 20 20 20 20 20 55 50 44 41  EGIN;.      UPDA
118e0 54 45 20 74 31 20 53 45 54 20 79 20 3d 20 72 61  TE t1 SET y = ra
118f0 6e 64 6f 6d 62 6c 6f 62 28 31 34 39 39 29 3b 0a  ndomblob(1499);.
11900 20 20 7d 0a 20 20 63 6f 70 79 5f 66 69 6c 65 20    }.  copy_file 
11910 74 65 73 74 2e 64 62 20 74 65 73 74 2e 64 62 32  test.db test.db2
11920 0a 20 20 63 6f 70 79 5f 66 69 6c 65 20 74 65 73  .  copy_file tes
11930 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 74 65 73  t.db-journal tes
11940 74 2e 64 62 32 2d 6a 6f 75 72 6e 61 6c 0a 20 20  t.db2-journal.  
11950 0a 20 20 68 65 78 69 6f 5f 77 72 69 74 65 20 74  .  hexio_write t
11960 65 73 74 2e 64 62 32 2d 6a 6f 75 72 6e 61 6c 20  est.db2-journal 
11970 32 34 20 30 30 30 30 30 30 30 30 0a 20 20 73 71  24 00000000.  sq
11980 6c 69 74 65 33 20 64 62 32 20 74 65 73 74 2e 64  lite3 db2 test.d
11990 62 32 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 50  b2.  execsql { P
119a0 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f  RAGMA integrity_
119b0 63 68 65 63 6b 20 7d 20 64 62 32 0a 7d 20 7b 6f  check } db2.} {o
119c0 6b 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  k}.}..#---------
119d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
119e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
119f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11a00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11a10 0a 23 20 54 65 73 74 20 74 68 61 74 20 61 20 64  .# Test that a d
11a20 61 74 61 62 61 73 65 20 66 69 6c 65 20 63 61 6e  atabase file can
11a30 20 62 65 20 22 70 72 65 2d 68 69 6e 74 65 64 22   be "pre-hinted"
11a40 20 74 6f 20 61 20 63 65 72 74 61 69 6e 20 73 69   to a certain si
11a50 7a 65 20 61 6e 64 20 74 68 61 74 0a 23 20 73 75  ze and that.# su
11a60 62 73 65 71 75 65 6e 74 20 73 70 69 6c 6c 69 6e  bsequent spillin
11a70 67 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 63  g of the pager c
11a80 61 63 68 65 20 64 6f 65 73 20 6e 6f 74 20 72 65  ache does not re
11a90 73 75 6c 74 20 69 6e 20 74 68 65 20 64 61 74 61  sult in the data
11aa0 62 61 73 65 0a 23 20 66 69 6c 65 20 62 65 69 6e  base.# file bein
11ab0 67 20 73 68 72 75 6e 6b 2e 0a 23 0a 63 61 74 63  g shrunk..#.catc
11ac0 68 20 7b 64 62 20 63 6c 6f 73 65 7d 0a 66 6f 72  h {db close}.for
11ad0 63 65 64 65 6c 65 74 65 20 74 65 73 74 2e 64 62  cedelete test.db
11ae0 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  ..do_test pager1
11af0 2d 33 32 2e 31 20 7b 0a 20 20 73 71 6c 69 74 65  -32.1 {.  sqlite
11b00 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20 65  3 db test.db.  e
11b10 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45  xecsql {.    CRE
11b20 41 54 45 20 54 41 42 4c 45 20 74 31 28 78 2c 20  ATE TABLE t1(x, 
11b30 79 29 3b 0a 20 20 7d 0a 20 20 64 62 20 63 6c 6f  y);.  }.  db clo
11b40 73 65 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20  se.  sqlite3 db 
11b50 74 65 73 74 2e 64 62 0a 20 20 65 78 65 63 73 71  test.db.  execsq
11b60 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20  l {.    BEGIN;. 
11b70 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
11b80 31 20 56 41 4c 55 45 53 28 31 2c 20 72 61 6e 64  1 VALUES(1, rand
11b90 6f 6d 62 6c 6f 62 28 31 30 30 30 30 29 29 3b 0a  omblob(10000));.
11ba0 20 20 7d 0a 20 20 66 69 6c 65 5f 63 6f 6e 74 72    }.  file_contr
11bb0 6f 6c 5f 63 68 75 6e 6b 73 69 7a 65 5f 74 65 73  ol_chunksize_tes
11bc0 74 20 64 62 20 6d 61 69 6e 20 31 30 32 34 0a 20  t db main 1024. 
11bd0 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 73 69   file_control_si
11be0 7a 65 68 69 6e 74 5f 74 65 73 74 20 64 62 20 6d  zehint_test db m
11bf0 61 69 6e 20 32 30 39 37 31 35 32 30 3b 20 23 20  ain 20971520; # 
11c00 32 30 4d 42 0a 20 20 65 78 65 63 73 71 6c 20 7b  20MB.  execsql {
11c10 0a 20 20 20 20 50 52 41 47 4d 41 20 63 61 63 68  .    PRAGMA cach
11c20 65 5f 73 69 7a 65 20 3d 20 31 30 3b 0a 20 20 20  e_size = 10;.   
11c30 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
11c40 56 41 4c 55 45 53 28 31 2c 20 72 61 6e 64 6f 6d  VALUES(1, random
11c50 62 6c 6f 62 28 31 30 30 30 30 29 29 3b 0a 20 20  blob(10000));.  
11c60 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
11c70 20 56 41 4c 55 45 53 28 32 2c 20 72 61 6e 64 6f   VALUES(2, rando
11c80 6d 62 6c 6f 62 28 31 30 30 30 30 29 29 3b 0a 20  mblob(10000));. 
11c90 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
11ca0 31 20 53 45 4c 45 43 54 20 78 2b 32 2c 20 72 61  1 SELECT x+2, ra
11cb0 6e 64 6f 6d 62 6c 6f 62 28 31 30 30 30 30 29 20  ndomblob(10000) 
11cc0 66 72 6f 6d 20 74 31 3b 0a 20 20 20 20 49 4e 53  from t1;.    INS
11cd0 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
11ce0 43 54 20 78 2b 34 2c 20 72 61 6e 64 6f 6d 62 6c  CT x+4, randombl
11cf0 6f 62 28 31 30 30 30 30 29 20 66 72 6f 6d 20 74  ob(10000) from t
11d00 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  1;.    INSERT IN
11d10 54 4f 20 74 31 20 53 45 4c 45 43 54 20 78 2b 38  TO t1 SELECT x+8
11d20 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 30 30  , randomblob(100
11d30 30 30 29 20 66 72 6f 6d 20 74 31 3b 0a 20 20 20  00) from t1;.   
11d40 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
11d50 53 45 4c 45 43 54 20 78 2b 31 36 2c 20 72 61 6e  SELECT x+16, ran
11d60 64 6f 6d 62 6c 6f 62 28 31 30 30 30 30 29 20 66  domblob(10000) f
11d70 72 6f 6d 20 74 31 3b 0a 20 20 20 20 53 45 4c 45  rom t1;.    SELE
11d80 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
11d90 20 74 31 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b   t1;.    COMMIT;
11da0 0a 20 20 7d 0a 20 20 64 62 20 63 6c 6f 73 65 0a  .  }.  db close.
11db0 20 20 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74    file size test
11dc0 2e 64 62 0a 7d 20 7b 32 30 39 37 31 35 32 30 7d  .db.} {20971520}
11dd0 0a 0a 23 20 43 6c 65 61 6e 75 70 20 32 30 4d 42  ..# Cleanup 20MB
11de0 20 66 69 6c 65 20 6c 65 66 74 20 62 79 20 74 68   file left by th
11df0 65 20 70 72 65 76 69 6f 75 73 20 74 65 73 74 2e  e previous test.
11e00 0a 66 6f 72 63 65 64 65 6c 65 74 65 20 74 65 73  .forcedelete tes
11e10 74 2e 64 62 0a 0a 66 69 6e 69 73 68 5f 74 65 73  t.db..finish_tes
11e20 74 0a                                            t.