/ Hex Artifact Content
Login

Artifact c3a0c973a5b5a5a21376957bdf963c3a3cae9a8b:


0000: 23 20 32 30 31 30 20 4a 75 6e 65 20 31 35 0a 23  # 2010 June 15.#
0010: 0a 23 20 54 68 65 20 61 75 74 68 6f 72 20 64 69  .# The author di
0020: 73 63 6c 61 69 6d 73 20 63 6f 70 79 72 69 67 68  sclaims copyrigh
0030: 74 20 74 6f 20 74 68 69 73 20 73 6f 75 72 63 65  t to this source
0040: 20 63 6f 64 65 2e 20 20 49 6e 20 70 6c 61 63 65   code.  In place
0050: 20 6f 66 0a 23 20 61 20 6c 65 67 61 6c 20 6e 6f   of.# a legal no
0060: 74 69 63 65 2c 20 68 65 72 65 20 69 73 20 61 20  tice, here is a 
0070: 62 6c 65 73 73 69 6e 67 3a 0a 23 0a 23 20 20 20  blessing:.#.#   
0080: 20 4d 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64   May you do good
0090: 20 61 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 23   and not evil..#
00a0: 20 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64      May you find
00b0: 20 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72   forgiveness for
00c0: 20 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f   yourself and fo
00d0: 72 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 23 20  rgive others..# 
00e0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
00f0: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0100: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0110: 79 6f 75 20 67 69 76 65 2e 0a 23 0a 23 2a 2a 2a  you give..#.#***
0120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 0a 23 0a 0a 73 65 74 20 74 65 73 74  ****.#..set test
0170: 64 69 72 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d  dir [file dirnam
0180: 65 20 24 61 72 67 76 30 5d 0a 73 6f 75 72 63 65  e $argv0].source
0190: 20 24 74 65 73 74 64 69 72 2f 74 65 73 74 65 72   $testdir/tester
01a0: 2e 74 63 6c 0a 73 6f 75 72 63 65 20 24 74 65 73  .tcl.source $tes
01b0: 74 64 69 72 2f 6c 6f 63 6b 5f 63 6f 6d 6d 6f 6e  tdir/lock_common
01c0: 2e 74 63 6c 0a 73 6f 75 72 63 65 20 24 74 65 73  .tcl.source $tes
01d0: 74 64 69 72 2f 6d 61 6c 6c 6f 63 5f 63 6f 6d 6d  tdir/malloc_comm
01e0: 6f 6e 2e 74 63 6c 0a 73 6f 75 72 63 65 20 24 74  on.tcl.source $t
01f0: 65 73 74 64 69 72 2f 77 61 6c 5f 63 6f 6d 6d 6f  estdir/wal_commo
0200: 6e 2e 74 63 6c 0a 20 0a 23 20 44 6f 20 6e 6f 74  n.tcl. .# Do not
0210: 20 75 73 65 20 61 20 63 6f 64 65 63 20 66 6f 72   use a codec for
0220: 20 74 65 73 74 73 20 69 6e 20 74 68 69 73 20 66   tests in this f
0230: 69 6c 65 2c 20 61 73 20 74 68 65 20 64 61 74 61  ile, as the data
0240: 62 61 73 65 20 66 69 6c 65 20 69 73 0a 23 20 6d  base file is.# m
0250: 61 6e 69 70 75 6c 61 74 65 64 20 64 69 72 65 63  anipulated direc
0260: 74 6c 79 20 75 73 69 6e 67 20 74 63 6c 20 73 63  tly using tcl sc
0270: 72 69 70 74 73 20 28 75 73 69 6e 67 20 74 68 65  ripts (using the
0280: 20 5b 68 65 78 69 6f 5f 77 72 69 74 65 5d 20 63   [hexio_write] c
0290: 6f 6d 6d 61 6e 64 29 2e 0a 23 0a 64 6f 5f 6e 6f  ommand)..#.do_no
02a0: 74 5f 75 73 65 5f 63 6f 64 65 63 0a 0a 23 0a 23  t_use_codec..#.#
02b0: 20 70 61 67 65 72 31 2d 31 2e 2a 3a 20 54 65 73   pager1-1.*: Tes
02c0: 74 20 69 6e 74 65 72 2d 70 72 6f 63 65 73 73 20  t inter-process 
02d0: 6c 6f 63 6b 69 6e 67 20 28 63 6c 69 65 6e 74 73  locking (clients
02e0: 20 69 6e 20 6d 75 6c 74 69 70 6c 65 20 70 72 6f   in multiple pro
02f0: 63 65 73 73 65 73 29 2e 0a 23 0a 23 20 70 61 67  cesses)..#.# pag
0300: 65 72 31 2d 32 2e 2a 3a 20 54 65 73 74 20 69 6e  er1-2.*: Test in
0310: 74 72 61 2d 70 72 6f 63 65 73 73 20 6c 6f 63 6b  tra-process lock
0320: 69 6e 67 20 28 6d 75 6c 74 69 70 6c 65 20 63 6c  ing (multiple cl
0330: 69 65 6e 74 73 20 69 6e 20 74 68 69 73 20 70 72  ients in this pr
0340: 6f 63 65 73 73 29 2e 0a 23 0a 23 20 70 61 67 65  ocess)..#.# page
0350: 72 31 2d 33 2e 2a 3a 20 53 61 76 65 70 6f 69 6e  r1-3.*: Savepoin
0360: 74 20 72 65 6c 61 74 65 64 20 74 65 73 74 73 2e  t related tests.
0370: 0a 23 0a 23 20 70 61 67 65 72 31 2d 34 2e 2a 3a  .#.# pager1-4.*:
0380: 20 48 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 65 6c   Hot-journal rel
0390: 61 74 65 64 20 74 65 73 74 73 2e 0a 23 0a 23 20  ated tests..#.# 
03a0: 70 61 67 65 72 31 2d 35 2e 2a 3a 20 43 61 73 65  pager1-5.*: Case
03b0: 73 20 72 65 6c 61 74 65 64 20 74 6f 20 6d 75 6c  s related to mul
03c0: 74 69 2d 66 69 6c 65 20 63 6f 6d 6d 69 74 73 2e  ti-file commits.
03d0: 0a 23 0a 23 20 70 61 67 65 72 31 2d 36 2e 2a 3a  .#.# pager1-6.*:
03e0: 20 43 61 73 65 73 20 72 65 6c 61 74 65 64 20 74   Cases related t
03f0: 6f 20 22 50 52 41 47 4d 41 20 6d 61 78 5f 70 61  o "PRAGMA max_pa
0400: 67 65 5f 63 6f 75 6e 74 22 0a 23 0a 23 20 70 61  ge_count".#.# pa
0410: 67 65 72 31 2d 37 2e 2a 3a 20 43 61 73 65 73 20  ger1-7.*: Cases 
0420: 73 70 65 63 69 66 69 63 20 74 6f 20 22 50 52 41  specific to "PRA
0430: 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
0440: 3d 54 52 55 4e 43 41 54 45 22 0a 23 0a 23 20 70  =TRUNCATE".#.# p
0450: 61 67 65 72 31 2d 38 2e 2a 3a 20 43 61 73 65 73  ager1-8.*: Cases
0460: 20 75 73 69 6e 67 20 74 65 6d 70 6f 72 61 72 79   using temporary
0470: 20 61 6e 64 20 69 6e 2d 6d 65 6d 6f 72 79 20 64   and in-memory d
0480: 61 74 61 62 61 73 65 73 2e 0a 23 0a 23 20 70 61  atabases..#.# pa
0490: 67 65 72 31 2d 39 2e 2a 3a 20 54 65 73 74 73 20  ger1-9.*: Tests 
04a0: 72 65 6c 61 74 65 64 20 74 6f 20 74 68 65 20 62  related to the b
04b0: 61 63 6b 75 70 20 41 50 49 2e 0a 23 0a 23 20 70  ackup API..#.# p
04c0: 61 67 65 72 31 2d 31 30 2e 2a 3a 20 54 65 73 74  ager1-10.*: Test
04d0: 20 74 68 61 74 20 74 68 65 20 61 73 73 75 6d 65   that the assume
04e0: 64 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73 65  d file-system se
04f0: 63 74 6f 72 2d 73 69 7a 65 20 69 73 20 6c 69 6d  ctor-size is lim
0500: 69 74 65 64 20 74 6f 0a 23 20 20 20 20 20 20 20  ited to.#       
0510: 20 20 20 20 20 20 20 36 34 4b 42 2e 0a 23 0a 23         64KB..#.#
0520: 20 70 61 67 65 72 31 2d 31 32 2e 2a 3a 20 54 65   pager1-12.*: Te
0530: 73 74 73 20 69 6e 76 6f 6c 76 69 6e 67 20 22 50  sts involving "P
0540: 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 22  RAGMA page_size"
0550: 0a 23 0a 23 20 70 61 67 65 72 31 2d 31 33 2e 2a  .#.# pager1-13.*
0560: 3a 20 43 61 73 65 73 20 73 70 65 63 69 66 69 63  : Cases specific
0570: 20 74 6f 20 22 50 52 41 47 4d 41 20 6a 6f 75 72   to "PRAGMA jour
0580: 6e 61 6c 5f 6d 6f 64 65 3d 50 45 52 53 49 53 54  nal_mode=PERSIST
0590: 22 0a 23 0a 23 20 70 61 67 65 72 31 2d 31 34 2e  ".#.# pager1-14.
05a0: 2a 3a 20 43 61 73 65 73 20 73 70 65 63 69 66 69  *: Cases specifi
05b0: 63 20 74 6f 20 22 50 52 41 47 4d 41 20 6a 6f 75  c to "PRAGMA jou
05c0: 72 6e 61 6c 5f 6d 6f 64 65 3d 4f 46 46 22 0a 23  rnal_mode=OFF".#
05d0: 0a 23 20 70 61 67 65 72 31 2d 31 35 2e 2a 3a 20  .# pager1-15.*: 
05e0: 56 61 72 79 69 6e 67 20 73 71 6c 69 74 65 33 5f  Varying sqlite3_
05f0: 76 66 73 2e 73 7a 4f 73 46 69 6c 65 0a 23 0a 23  vfs.szOsFile.#.#
0600: 20 70 61 67 65 72 31 2d 31 36 2e 2a 3a 20 56 61   pager1-16.*: Va
0610: 72 79 69 6e 67 20 73 71 6c 69 74 65 33 5f 76 66  rying sqlite3_vf
0620: 73 2e 6d 78 50 61 74 68 6e 61 6d 65 0a 23 0a 23  s.mxPathname.#.#
0630: 20 70 61 67 65 72 31 2d 31 37 2e 2a 3a 20 54 65   pager1-17.*: Te
0640: 73 74 73 20 72 65 6c 61 74 65 64 20 74 6f 20 22  sts related to "
0650: 50 52 41 47 4d 41 20 6f 6d 69 74 5f 72 65 61 64  PRAGMA omit_read
0660: 6c 6f 63 6b 22 0a 23 0a 23 20 70 61 67 65 72 31  lock".#.# pager1
0670: 2d 31 38 2e 2a 3a 20 54 65 73 74 20 74 68 61 74  -18.*: Test that
0680: 20 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72   the pager layer
0690: 20 72 65 73 70 6f 6e 64 73 20 63 6f 72 72 65 63   responds correc
06a0: 74 6c 79 20 69 66 20 74 68 65 20 62 2d 74 72 65  tly if the b-tre
06b0: 65 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20  e.#             
06c0: 20 72 65 71 75 65 73 74 73 20 61 6e 20 69 6e 76   requests an inv
06d0: 61 6c 69 64 20 70 61 67 65 20 6e 75 6d 62 65 72  alid page number
06e0: 20 28 64 75 65 20 74 6f 20 64 62 20 63 6f 72 72   (due to db corr
06f0: 75 70 74 69 6f 6e 29 2e 0a 23 0a 0a 70 72 6f 63  uption)..#..proc
0700: 20 72 65 63 75 72 73 69 76 65 5f 73 65 6c 65 63   recursive_selec
0710: 74 20 7b 69 64 20 74 61 62 6c 65 20 7b 73 63 72  t {id table {scr
0720: 69 70 74 20 7b 7d 7d 7d 20 7b 0a 20 20 73 65 74  ipt {}}} {.  set
0730: 20 63 6e 74 20 30 0a 20 20 64 62 20 65 76 61 6c   cnt 0.  db eval
0740: 20 22 53 45 4c 45 43 54 20 72 6f 77 69 64 2c 20   "SELECT rowid, 
0750: 2a 20 46 52 4f 4d 20 24 74 61 62 6c 65 20 57 48  * FROM $table WH
0760: 45 52 45 20 72 6f 77 69 64 20 3d 20 28 24 69 64  ERE rowid = ($id
0770: 2d 31 29 22 20 7b 0a 20 20 20 20 72 65 63 75 72  -1)" {.    recur
0780: 73 69 76 65 5f 73 65 6c 65 63 74 20 24 72 6f 77  sive_select $row
0790: 69 64 20 24 74 61 62 6c 65 20 24 73 63 72 69 70  id $table $scrip
07a0: 74 0a 20 20 20 20 69 6e 63 72 20 63 6e 74 0a 20  t.    incr cnt. 
07b0: 20 7d 0a 20 20 69 66 20 7b 24 63 6e 74 3d 3d 30   }.  if {$cnt==0
07c0: 7d 20 7b 20 65 76 61 6c 20 24 73 63 72 69 70 74  } { eval $script
07d0: 20 7d 0a 7d 0a 0a 73 65 74 20 61 5f 73 74 72 69   }.}..set a_stri
07e0: 6e 67 5f 63 6f 75 6e 74 65 72 20 31 0a 70 72 6f  ng_counter 1.pro
07f0: 63 20 61 5f 73 74 72 69 6e 67 20 7b 6e 7d 20 7b  c a_string {n} {
0800: 0a 20 20 67 6c 6f 62 61 6c 20 61 5f 73 74 72 69  .  global a_stri
0810: 6e 67 5f 63 6f 75 6e 74 65 72 0a 20 20 69 6e 63  ng_counter.  inc
0820: 72 20 61 5f 73 74 72 69 6e 67 5f 63 6f 75 6e 74  r a_string_count
0830: 65 72 0a 20 20 73 74 72 69 6e 67 20 72 61 6e 67  er.  string rang
0840: 65 20 5b 73 74 72 69 6e 67 20 72 65 70 65 61 74  e [string repeat
0850: 20 22 24 7b 61 5f 73 74 72 69 6e 67 5f 63 6f 75   "${a_string_cou
0860: 6e 74 65 72 7d 2e 22 20 24 6e 5d 20 31 20 24 6e  nter}." $n] 1 $n
0870: 0a 7d 0a 64 62 20 66 75 6e 63 20 61 5f 73 74 72  .}.db func a_str
0880: 69 6e 67 20 61 5f 73 74 72 69 6e 67 0a 0a 64 6f  ing a_string..do
0890: 5f 6d 75 6c 74 69 63 6c 69 65 6e 74 5f 74 65 73  _multiclient_tes
08a0: 74 20 74 6e 20 7b 0a 0a 20 20 23 20 43 72 65 61  t tn {..  # Crea
08b0: 74 65 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 20  te and populate 
08c0: 61 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65  a database table
08d0: 20 75 73 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f   using connectio
08e0: 6e 20 5b 64 62 5d 2e 20 43 68 65 63 6b 20 0a 20  n [db]. Check . 
08f0: 20 23 20 74 68 61 74 20 63 6f 6e 6e 65 63 74 69   # that connecti
0900: 6f 6e 73 20 5b 64 62 32 5d 20 61 6e 64 20 5b 64  ons [db2] and [d
0910: 62 33 5d 20 63 61 6e 20 73 65 65 20 74 68 65 20  b3] can see the 
0920: 73 63 68 65 6d 61 20 61 6e 64 20 63 6f 6e 74 65  schema and conte
0930: 6e 74 2e 0a 20 20 23 0a 20 20 64 6f 5f 74 65 73  nt..  #.  do_tes
0940: 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 31 20 7b  t pager1-$tn.1 {
0950: 0a 20 20 20 20 73 71 6c 31 20 7b 0a 20 20 20 20  .    sql1 {.    
0960: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
0970: 31 28 61 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  1(a PRIMARY KEY,
0980: 20 62 29 3b 0a 20 20 20 20 20 20 43 52 45 41 54   b);.      CREAT
0990: 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31  E INDEX i1 ON t1
09a0: 28 62 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  (b);.      INSER
09b0: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
09c0: 28 31 2c 20 27 6f 6e 65 27 29 3b 20 49 4e 53 45  (1, 'one'); INSE
09d0: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
09e0: 53 28 32 2c 20 27 74 77 6f 27 29 3b 0a 20 20 20  S(2, 'two');.   
09f0: 20 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74   }.  } {}.  do_t
0a00: 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 32  est pager1-$tn.2
0a10: 20 7b 20 73 71 6c 32 20 7b 20 53 45 4c 45 43 54   { sql2 { SELECT
0a20: 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7d 20 7b   * FROM t1 } } {
0a30: 31 20 6f 6e 65 20 32 20 74 77 6f 7d 0a 20 20 64  1 one 2 two}.  d
0a40: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24 74  o_test pager1-$t
0a50: 6e 2e 33 20 7b 20 73 71 6c 33 20 7b 20 53 45 4c  n.3 { sql3 { SEL
0a60: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20  ECT * FROM t1 } 
0a70: 7d 20 7b 31 20 6f 6e 65 20 32 20 74 77 6f 7d 0a  } {1 one 2 two}.
0a80: 0a 20 20 23 20 4f 70 65 6e 20 61 20 74 72 61 6e  .  # Open a tran
0a90: 73 61 63 74 69 6f 6e 20 61 6e 64 20 61 64 64 20  saction and add 
0aa0: 61 20 72 6f 77 20 75 73 69 6e 67 20 5b 64 62 5d  a row using [db]
0ab0: 2e 20 54 68 69 73 20 70 75 74 73 20 5b 64 62 5d  . This puts [db]
0ac0: 20 69 6e 0a 20 20 23 20 52 45 53 45 52 56 45 44   in.  # RESERVED
0ad0: 20 73 74 61 74 65 2e 20 43 68 65 63 6b 20 74 68   state. Check th
0ae0: 61 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 5b  at connections [
0af0: 64 62 32 5d 20 61 6e 64 20 5b 64 62 33 5d 20 63  db2] and [db3] c
0b00: 61 6e 20 73 74 69 6c 6c 0a 20 20 23 20 72 65 61  an still.  # rea
0b10: 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  d the database c
0b20: 6f 6e 74 65 6e 74 20 61 73 20 69 74 20 77 61 73  ontent as it was
0b30: 20 62 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e   before the tran
0b40: 73 61 63 74 69 6f 6e 20 77 61 73 0a 20 20 23 20  saction was.  # 
0b50: 6f 70 65 6e 65 64 2e 20 5b 64 62 5d 20 73 68 6f  opened. [db] sho
0b60: 75 6c 64 20 73 65 65 20 74 68 65 20 69 6e 73 65  uld see the inse
0b70: 72 74 65 64 20 72 6f 77 2e 0a 20 20 23 0a 20 20  rted row..  #.  
0b80: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24  do_test pager1-$
0b90: 74 6e 2e 34 20 7b 0a 20 20 20 20 73 71 6c 31 20  tn.4 {.    sql1 
0ba0: 7b 0a 20 20 20 20 20 20 42 45 47 49 4e 3b 0a 20  {.      BEGIN;. 
0bb0: 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e         INSERT IN
0bc0: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 33 2c 20  TO t1 VALUES(3, 
0bd0: 27 74 68 72 65 65 27 29 3b 0a 20 20 20 20 7d 0a  'three');.    }.
0be0: 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74    } {}.  do_test
0bf0: 20 70 61 67 65 72 31 2d 24 74 6e 2e 35 20 7b 20   pager1-$tn.5 { 
0c00: 73 71 6c 32 20 7b 20 53 45 4c 45 43 54 20 2a 20  sql2 { SELECT * 
0c10: 46 52 4f 4d 20 74 31 20 7d 20 7d 20 7b 31 20 6f  FROM t1 } } {1 o
0c20: 6e 65 20 32 20 74 77 6f 7d 0a 20 20 64 6f 5f 74  ne 2 two}.  do_t
0c30: 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 37  est pager1-$tn.7
0c40: 20 7b 20 73 71 6c 31 20 7b 20 53 45 4c 45 43 54   { sql1 { SELECT
0c50: 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7d 20 7b   * FROM t1 } } {
0c60: 31 20 6f 6e 65 20 32 20 74 77 6f 20 33 20 74 68  1 one 2 two 3 th
0c70: 72 65 65 7d 0a 0a 20 20 23 20 5b 64 62 5d 20 73  ree}..  # [db] s
0c80: 74 69 6c 6c 20 68 61 73 20 61 6e 20 6f 70 65 6e  till has an open
0c90: 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
0ca0: 6f 6e 2e 20 43 68 65 63 6b 20 74 68 61 74 20 74  on. Check that t
0cb0: 68 69 73 20 70 72 65 76 65 6e 74 73 0a 20 20 23  his prevents.  #
0cc0: 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f   other connectio
0cd0: 6e 73 20 28 73 70 65 63 69 66 69 63 61 6c 6c 79  ns (specifically
0ce0: 20 5b 64 62 32 5d 29 20 66 72 6f 6d 20 77 72 69   [db2]) from wri
0cf0: 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61  ting to the data
0d00: 62 61 73 65 2e 0a 20 20 23 0a 20 20 23 20 45 76  base..  #.  # Ev
0d10: 65 6e 20 69 66 20 5b 64 62 32 5d 20 6f 70 65 6e  en if [db2] open
0d20: 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  s a transaction 
0d30: 66 69 72 73 74 2c 20 69 74 20 6d 61 79 20 6e 6f  first, it may no
0d40: 74 20 77 72 69 74 65 20 74 6f 20 74 68 65 0a 20  t write to the. 
0d50: 20 23 20 64 61 74 61 62 61 73 65 2e 20 41 66 74   # database. Aft
0d60: 65 72 20 74 68 65 20 61 74 74 65 6d 70 74 20 74  er the attempt t
0d70: 6f 20 77 72 69 74 65 20 74 68 65 20 64 62 20 77  o write the db w
0d80: 69 74 68 69 6e 20 61 20 74 72 61 6e 73 61 63 74  ithin a transact
0d90: 69 6f 6e 2c 20 0a 20 20 23 20 5b 64 62 32 5d 20  ion, .  # [db2] 
0da0: 69 73 20 6c 65 66 74 20 77 69 74 68 20 61 6e 20  is left with an 
0db0: 6f 70 65 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e  open transaction
0dc0: 2c 20 62 75 74 20 6e 6f 74 20 61 20 72 65 61 64  , but not a read
0dd0: 2d 6c 6f 63 6b 20 6f 6e 0a 20 20 23 20 74 68 65  -lock on.  # the
0de0: 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 2e 20   main database. 
0df0: 53 6f 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 70  So it does not p
0e00: 72 65 76 65 6e 74 20 5b 64 62 5d 20 66 72 6f 6d  revent [db] from
0e10: 20 63 6f 6d 6d 69 74 74 69 6e 67 2e 0a 20 20 23   committing..  #
0e20: 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72  .  do_test pager
0e30: 31 2d 24 74 6e 2e 38 20 7b 20 0a 20 20 20 20 63  1-$tn.8 { .    c
0e40: 73 71 6c 32 20 7b 20 55 50 44 41 54 45 20 74 31  sql2 { UPDATE t1
0e50: 20 53 45 54 20 61 20 3d 20 61 20 2b 20 31 30 20   SET a = a + 10 
0e60: 7d 0a 20 20 7d 20 7b 31 20 7b 64 61 74 61 62 61  }.  } {1 {databa
0e70: 73 65 20 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 20  se is locked}}. 
0e80: 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
0e90: 24 74 6e 2e 39 20 7b 20 0a 20 20 20 20 63 73 71  $tn.9 { .    csq
0ea0: 6c 32 20 7b 20 0a 20 20 20 20 20 20 42 45 47 49  l2 { .      BEGI
0eb0: 4e 3b 0a 20 20 20 20 20 20 55 50 44 41 54 45 20  N;.      UPDATE 
0ec0: 74 31 20 53 45 54 20 61 20 3d 20 61 20 2b 20 31  t1 SET a = a + 1
0ed0: 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 31 20  0;.    }.  } {1 
0ee0: 7b 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63  {database is loc
0ef0: 6b 65 64 7d 7d 0a 0a 20 20 23 20 48 61 76 65 20  ked}}..  # Have 
0f00: 5b 64 62 5d 20 63 6f 6d 6d 69 74 20 69 74 73 20  [db] commit its 
0f10: 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e 20 43 68  transactions. Ch
0f20: 65 63 6b 20 74 68 65 20 6f 74 68 65 72 20 63 6f  eck the other co
0f30: 6e 6e 65 63 74 69 6f 6e 73 20 63 61 6e 0a 20 20  nnections can.  
0f40: 23 20 6e 6f 77 20 73 65 65 20 74 68 65 20 6e 65  # now see the ne
0f50: 77 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 65  w database conte
0f60: 6e 74 2e 0a 20 20 23 0a 20 20 64 6f 5f 74 65 73  nt..  #.  do_tes
0f70: 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 31 30 20  t pager1-$tn.10 
0f80: 7b 20 73 71 6c 31 20 7b 20 43 4f 4d 4d 49 54 20  { sql1 { COMMIT 
0f90: 7d 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74  } } {}.  do_test
0fa0: 20 70 61 67 65 72 31 2d 24 74 6e 2e 31 31 20 7b   pager1-$tn.11 {
0fb0: 20 73 71 6c 31 20 7b 20 53 45 4c 45 43 54 20 2a   sql1 { SELECT *
0fc0: 20 46 52 4f 4d 20 74 31 20 7d 20 7d 20 7b 31 20   FROM t1 } } {1 
0fd0: 6f 6e 65 20 32 20 74 77 6f 20 33 20 74 68 72 65  one 2 two 3 thre
0fe0: 65 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67  e}.  do_test pag
0ff0: 65 72 31 2d 24 74 6e 2e 31 32 20 7b 20 73 71 6c  er1-$tn.12 { sql
1000: 32 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  2 { SELECT * FRO
1010: 4d 20 74 31 20 7d 20 7d 20 7b 31 20 6f 6e 65 20  M t1 } } {1 one 
1020: 32 20 74 77 6f 20 33 20 74 68 72 65 65 7d 0a 20  2 two 3 three}. 
1030: 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
1040: 24 74 6e 2e 31 33 20 7b 20 73 71 6c 33 20 7b 20  $tn.13 { sql3 { 
1050: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
1060: 20 7d 20 7d 20 7b 31 20 6f 6e 65 20 32 20 74 77   } } {1 one 2 tw
1070: 6f 20 33 20 74 68 72 65 65 7d 0a 0a 20 20 23 20  o 3 three}..  # 
1080: 43 68 65 63 6b 20 74 68 61 74 2c 20 61 73 20 6e  Check that, as n
1090: 6f 74 65 64 20 61 62 6f 76 65 2c 20 5b 64 62 32  oted above, [db2
10a0: 5d 20 72 65 61 6c 6c 79 20 64 69 64 20 6b 65 65  ] really did kee
10b0: 70 20 61 6e 20 6f 70 65 6e 20 74 72 61 6e 73 61  p an open transa
10c0: 63 74 69 6f 6e 0a 20 20 23 20 61 66 74 65 72 20  ction.  # after 
10d0: 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 77  the attempt to w
10e0: 72 69 74 65 20 74 68 65 20 64 61 74 61 62 61 73  rite the databas
10f0: 65 20 66 61 69 6c 65 64 2e 0a 20 20 23 0a 20 20  e failed..  #.  
1100: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24  do_test pager1-$
1110: 74 6e 2e 31 34 20 7b 20 0a 20 20 20 20 63 73 71  tn.14 { .    csq
1120: 6c 32 20 7b 20 42 45 47 49 4e 20 7d 20 0a 20 20  l2 { BEGIN } .  
1130: 7d 20 7b 31 20 7b 63 61 6e 6e 6f 74 20 73 74 61  } {1 {cannot sta
1140: 72 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  rt a transaction
1150: 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73 61   within a transa
1160: 63 74 69 6f 6e 7d 7d 0a 20 20 64 6f 5f 74 65 73  ction}}.  do_tes
1170: 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 31 35 20  t pager1-$tn.15 
1180: 7b 20 73 71 6c 32 20 7b 20 52 4f 4c 4c 42 41 43  { sql2 { ROLLBAC
1190: 4b 20 7d 20 7d 20 7b 7d 0a 0a 20 20 23 20 48 61  K } } {}..  # Ha
11a0: 76 65 20 5b 64 62 32 5d 20 6f 70 65 6e 20 61 20  ve [db2] open a 
11b0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20  transaction and 
11c0: 74 61 6b 65 20 61 20 72 65 61 64 2d 6c 6f 63 6b  take a read-lock
11d0: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
11e0: 2e 0a 20 20 23 20 43 68 65 63 6b 20 74 68 61 74  ..  # Check that
11f0: 20 74 68 69 73 20 70 72 65 76 65 6e 74 73 20 5b   this prevents [
1200: 64 62 5d 20 66 72 6f 6d 20 77 72 69 74 69 6e 67  db] from writing
1210: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
1220: 20 28 6f 75 74 73 69 64 65 0a 20 20 23 20 6f 66   (outside.  # of
1230: 20 61 6e 79 20 74 72 61 6e 73 61 63 74 69 6f 6e   any transaction
1240: 29 2e 20 41 66 74 65 72 20 74 68 69 73 20 66 61  ). After this fa
1250: 69 6c 73 2c 20 63 68 65 63 6b 20 74 68 61 74 20  ils, check that 
1260: 5b 64 62 33 5d 20 63 61 6e 20 72 65 61 64 0a 20  [db3] can read. 
1270: 20 23 20 74 68 65 20 64 62 20 28 73 68 6f 77 69   # the db (showi
1280: 6e 67 20 74 68 61 74 20 5b 64 62 5d 20 64 69 64  ng that [db] did
1290: 20 6e 6f 74 20 74 61 6b 65 20 61 20 50 45 4e 44   not take a PEND
12a0: 49 4e 47 20 6c 6f 63 6b 20 65 74 63 2e 29 0a 20  ING lock etc.). 
12b0: 20 23 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67   #.  do_test pag
12c0: 65 72 31 2d 24 74 6e 2e 31 35 20 7b 20 0a 20 20  er1-$tn.15 { .  
12d0: 20 20 73 71 6c 32 20 7b 20 42 45 47 49 4e 3b 20    sql2 { BEGIN; 
12e0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
12f0: 3b 20 7d 0a 20 20 7d 20 7b 31 20 6f 6e 65 20 32  ; }.  } {1 one 2
1300: 20 74 77 6f 20 33 20 74 68 72 65 65 7d 0a 20 20   two 3 three}.  
1310: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24  do_test pager1-$
1320: 74 6e 2e 31 36 20 7b 20 0a 20 20 20 20 63 73 71  tn.16 { .    csq
1330: 6c 31 20 7b 20 55 50 44 41 54 45 20 74 31 20 53  l1 { UPDATE t1 S
1340: 45 54 20 61 20 3d 20 61 20 2b 20 31 30 20 7d 0a  ET a = a + 10 }.
1350: 20 20 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65    } {1 {database
1360: 20 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 20 20 64   is locked}}.  d
1370: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24 74  o_test pager1-$t
1380: 6e 2e 31 37 20 7b 20 73 71 6c 33 20 7b 20 53 45  n.17 { sql3 { SE
1390: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d  LECT * FROM t1 }
13a0: 20 7d 20 7b 31 20 6f 6e 65 20 32 20 74 77 6f 20   } {1 one 2 two 
13b0: 33 20 74 68 72 65 65 7d 0a 0a 20 20 23 20 54 68  3 three}..  # Th
13c0: 69 73 20 74 69 6d 65 2c 20 68 61 76 65 20 5b 64  is time, have [d
13d0: 62 5d 20 6f 70 65 6e 20 61 20 74 72 61 6e 73 61  b] open a transa
13e0: 63 74 69 6f 6e 20 62 65 66 6f 72 65 20 77 72 69  ction before wri
13f0: 74 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ting the databas
1400: 65 2e 0a 20 20 23 20 54 68 69 73 20 77 6f 72 6b  e..  # This work
1410: 73 20 2d 20 5b 64 62 5d 20 67 65 74 73 20 61 20  s - [db] gets a 
1420: 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 77 68  RESERVED lock wh
1430: 69 63 68 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e  ich does not con
1440: 66 6c 69 63 74 20 77 69 74 68 0a 20 20 23 20 74  flict with.  # t
1450: 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 5b  he SHARED lock [
1460: 64 62 32 5d 20 69 73 20 68 6f 6c 64 69 6e 67 2e  db2] is holding.
1470: 0a 20 20 23 0a 20 20 64 6f 5f 74 65 73 74 20 70  .  #.  do_test p
1480: 61 67 65 72 31 2d 24 74 6e 2e 31 38 20 7b 20 0a  ager1-$tn.18 { .
1490: 20 20 20 20 73 71 6c 31 20 7b 20 0a 20 20 20 20      sql1 { .    
14a0: 20 20 42 45 47 49 4e 3b 20 20 0a 20 20 20 20 20    BEGIN;  .     
14b0: 20 55 50 44 41 54 45 20 74 31 20 53 45 54 20 61   UPDATE t1 SET a
14c0: 20 3d 20 61 20 2b 20 31 30 3b 20 0a 20 20 20 20   = a + 10; .    
14d0: 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65  }.  } {}.  do_te
14e0: 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2d 31 39  st pager1-$tn-19
14f0: 20 7b 20 0a 20 20 20 20 73 71 6c 31 20 7b 20 50   { .    sql1 { P
1500: 52 41 47 4d 41 20 6c 6f 63 6b 5f 73 74 61 74 75  RAGMA lock_statu
1510: 73 20 7d 20 0a 20 20 7d 20 7b 6d 61 69 6e 20 72  s } .  } {main r
1520: 65 73 65 72 76 65 64 20 74 65 6d 70 20 63 6c 6f  eserved temp clo
1530: 73 65 64 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70  sed}.  do_test p
1540: 61 67 65 72 31 2d 24 74 6e 2d 32 30 20 7b 20 0a  ager1-$tn-20 { .
1550: 20 20 20 20 73 71 6c 32 20 7b 20 50 52 41 47 4d      sql2 { PRAGM
1560: 41 20 6c 6f 63 6b 5f 73 74 61 74 75 73 20 7d 20  A lock_status } 
1570: 0a 20 20 7d 20 7b 6d 61 69 6e 20 73 68 61 72 65  .  } {main share
1580: 64 20 74 65 6d 70 20 63 6c 6f 73 65 64 7d 0a 0a  d temp closed}..
1590: 20 20 23 20 43 68 65 63 6b 20 74 68 61 74 20 61    # Check that a
15a0: 6c 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 63  ll connections c
15b0: 61 6e 20 73 74 69 6c 6c 20 72 65 61 64 20 74 68  an still read th
15c0: 65 20 64 61 74 61 62 61 73 65 2e 20 4f 6e 6c 79  e database. Only
15d0: 20 5b 64 62 5d 20 73 65 65 73 0a 20 20 23 20 74   [db] sees.  # t
15e0: 68 65 20 75 70 64 61 74 65 64 20 63 6f 6e 74 65  he updated conte
15f0: 6e 74 20 28 61 73 20 74 68 65 20 74 72 61 6e 73  nt (as the trans
1600: 61 63 74 69 6f 6e 20 68 61 73 20 6e 6f 74 20 62  action has not b
1610: 65 65 6e 20 63 6f 6d 6d 69 74 74 65 64 20 79 65  een committed ye
1620: 74 29 2e 0a 20 20 23 0a 20 20 64 6f 5f 74 65 73  t)..  #.  do_tes
1630: 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 32 31 20  t pager1-$tn.21 
1640: 7b 20 73 71 6c 31 20 7b 20 53 45 4c 45 43 54 20  { sql1 { SELECT 
1650: 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7d 20 7b 31  * FROM t1 } } {1
1660: 31 20 6f 6e 65 20 31 32 20 74 77 6f 20 31 33 20  1 one 12 two 13 
1670: 74 68 72 65 65 7d 0a 20 20 64 6f 5f 74 65 73 74  three}.  do_test
1680: 20 70 61 67 65 72 31 2d 24 74 6e 2e 32 32 20 7b   pager1-$tn.22 {
1690: 20 73 71 6c 32 20 7b 20 53 45 4c 45 43 54 20 2a   sql2 { SELECT *
16a0: 20 46 52 4f 4d 20 74 31 20 7d 20 7d 20 7b 31 20   FROM t1 } } {1 
16b0: 6f 6e 65 20 32 20 74 77 6f 20 33 20 74 68 72 65  one 2 two 3 thre
16c0: 65 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67  e}.  do_test pag
16d0: 65 72 31 2d 24 74 6e 2e 32 33 20 7b 20 73 71 6c  er1-$tn.23 { sql
16e0: 33 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  3 { SELECT * FRO
16f0: 4d 20 74 31 20 7d 20 7d 20 7b 31 20 6f 6e 65 20  M t1 } } {1 one 
1700: 32 20 74 77 6f 20 33 20 74 68 72 65 65 7d 0a 0a  2 two 3 three}..
1710: 20 20 23 20 42 65 63 61 75 73 65 20 5b 64 62 32    # Because [db2
1720: 5d 20 73 74 69 6c 6c 20 68 61 73 20 74 68 65 20  ] still has the 
1730: 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 5b 64 62  SHARED lock, [db
1740: 5d 20 69 73 20 75 6e 61 62 6c 65 20 74 6f 20 63  ] is unable to c
1750: 6f 6d 6d 69 74 20 74 68 65 0a 20 20 23 20 74 72  ommit the.  # tr
1760: 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 69 74  ansaction. If it
1770: 20 74 72 69 65 73 2c 20 61 6e 20 65 72 72 6f 72   tries, an error
1780: 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
1790: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
17a0: 0a 20 20 23 20 75 70 67 72 61 64 65 73 20 74 6f  .  # upgrades to
17b0: 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 2e   a PENDING lock.
17c0: 0a 20 20 23 0a 20 20 23 20 4f 6e 63 65 20 74 68  .  #.  # Once th
17d0: 69 73 20 68 61 70 70 65 6e 73 2c 20 5b 64 62 5d  is happens, [db]
17e0: 20 63 61 6e 20 72 65 61 64 20 74 68 65 20 64 61   can read the da
17f0: 74 61 62 61 73 65 20 61 6e 64 20 73 65 65 20 74  tabase and see t
1800: 68 65 20 6e 65 77 20 63 6f 6e 74 65 6e 74 2c 0a  he new content,.
1810: 20 20 23 20 5b 64 62 32 5d 20 28 73 74 69 6c 6c    # [db2] (still
1820: 20 68 6f 6c 64 69 6e 67 20 53 48 41 52 45 44 29   holding SHARED)
1830: 20 63 61 6e 20 73 74 69 6c 6c 20 72 65 61 64 20   can still read 
1840: 74 68 65 20 6f 6c 64 20 63 6f 6e 74 65 6e 74 2c  the old content,
1850: 20 62 75 74 20 5b 64 62 33 5d 0a 20 20 23 20 28   but [db3].  # (
1860: 6e 6f 74 20 68 6f 6c 64 69 6e 67 20 61 6e 79 20  not holding any 
1870: 6c 6f 63 6b 29 20 69 73 20 70 72 65 76 65 6e 74  lock) is prevent
1880: 65 64 20 62 79 20 5b 64 62 5d 27 73 20 50 45 4e  ed by [db]'s PEN
1890: 44 49 4e 47 20 66 72 6f 6d 20 72 65 61 64 69 6e  DING from readin
18a0: 67 0a 20 20 23 20 74 68 65 20 64 61 74 61 62 61  g.  # the databa
18b0: 73 65 2e 0a 20 20 23 0a 20 20 64 6f 5f 74 65 73  se..  #.  do_tes
18c0: 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 32 34 20  t pager1-$tn.24 
18d0: 7b 20 63 73 71 6c 31 20 7b 20 43 4f 4d 4d 49 54  { csql1 { COMMIT
18e0: 20 7d 20 7d 20 7b 31 20 7b 64 61 74 61 62 61 73   } } {1 {databas
18f0: 65 20 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 20 20  e is locked}}.  
1900: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24  do_test pager1-$
1910: 74 6e 2d 32 35 20 7b 20 0a 20 20 20 20 73 71 6c  tn-25 { .    sql
1920: 31 20 7b 20 50 52 41 47 4d 41 20 6c 6f 63 6b 5f  1 { PRAGMA lock_
1930: 73 74 61 74 75 73 20 7d 20 0a 20 20 7d 20 7b 6d  status } .  } {m
1940: 61 69 6e 20 70 65 6e 64 69 6e 67 20 74 65 6d 70  ain pending temp
1950: 20 63 6c 6f 73 65 64 7d 0a 20 20 64 6f 5f 74 65   closed}.  do_te
1960: 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 32 36  st pager1-$tn.26
1970: 20 7b 20 73 71 6c 31 20 7b 20 53 45 4c 45 43 54   { sql1 { SELECT
1980: 20 2a 20 46 52 4f 4d 20 74 31 20 20 7d 20 7d 20   * FROM t1  } } 
1990: 7b 31 31 20 6f 6e 65 20 31 32 20 74 77 6f 20 31  {11 one 12 two 1
19a0: 33 20 74 68 72 65 65 7d 0a 20 20 64 6f 5f 74 65  3 three}.  do_te
19b0: 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 32 37  st pager1-$tn.27
19c0: 20 7b 20 73 71 6c 32 20 7b 20 53 45 4c 45 43 54   { sql2 { SELECT
19d0: 20 2a 20 46 52 4f 4d 20 74 31 20 20 7d 20 7d 20   * FROM t1  } } 
19e0: 7b 31 20 6f 6e 65 20 32 20 74 77 6f 20 33 20 74  {1 one 2 two 3 t
19f0: 68 72 65 65 7d 0a 20 20 64 6f 5f 74 65 73 74 20  hree}.  do_test 
1a00: 70 61 67 65 72 31 2d 24 74 6e 2e 32 38 20 7b 20  pager1-$tn.28 { 
1a10: 63 73 71 6c 33 20 7b 20 53 45 4c 45 43 54 20 2a  csql3 { SELECT *
1a20: 20 46 52 4f 4d 20 74 31 20 7d 20 7d 20 7b 31 20   FROM t1 } } {1 
1a30: 7b 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63  {database is loc
1a40: 6b 65 64 7d 7d 0a 0a 20 20 23 20 48 61 76 65 20  ked}}..  # Have 
1a50: 5b 64 62 32 5d 20 63 6f 6d 6d 69 74 20 69 74 73  [db2] commit its
1a60: 20 72 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f   read transactio
1a70: 6e 2c 20 72 65 6c 65 61 73 69 6e 67 20 74 68 65  n, releasing the
1a80: 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 74 0a   SHARED lock it.
1a90: 20 20 23 20 69 73 20 68 6f 6c 64 69 6e 67 2e 20    # is holding. 
1aa0: 4e 6f 77 2c 20 6e 65 69 74 68 65 72 20 5b 64 62  Now, neither [db
1ab0: 32 5d 20 6e 6f 72 20 5b 64 62 33 5d 20 6d 61 79  2] nor [db3] may
1ac0: 20 72 65 61 64 20 74 68 65 20 64 61 74 61 62 61   read the databa
1ad0: 73 65 20 28 61 73 20 5b 64 62 5d 0a 20 20 23 20  se (as [db].  # 
1ae0: 69 73 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67  is still holding
1af0: 20 61 20 50 45 4e 44 49 4e 47 29 2e 0a 20 20 23   a PENDING)..  #
1b00: 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72  .  do_test pager
1b10: 31 2d 24 74 6e 2e 32 39 20 7b 20 73 71 6c 32 20  1-$tn.29 { sql2 
1b20: 7b 20 43 4f 4d 4d 49 54 20 7d 20 7d 20 7b 7d 0a  { COMMIT } } {}.
1b30: 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
1b40: 2d 24 74 6e 2e 33 30 20 7b 20 63 73 71 6c 32 20  -$tn.30 { csql2 
1b50: 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  { SELECT * FROM 
1b60: 74 31 20 7d 20 7d 20 7b 31 20 7b 64 61 74 61 62  t1 } } {1 {datab
1b70: 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a  ase is locked}}.
1b80: 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
1b90: 2d 24 74 6e 2e 33 31 20 7b 20 63 73 71 6c 33 20  -$tn.31 { csql3 
1ba0: 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  { SELECT * FROM 
1bb0: 74 31 20 7d 20 7d 20 7b 31 20 7b 64 61 74 61 62  t1 } } {1 {datab
1bc0: 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a  ase is locked}}.
1bd0: 0a 20 20 23 20 5b 64 62 5d 20 69 73 20 6e 6f 77  .  # [db] is now
1be0: 20 61 62 6c 65 20 74 6f 20 63 6f 6d 6d 69 74 20   able to commit 
1bf0: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
1c00: 20 4f 6e 63 65 20 74 68 65 20 74 72 61 6e 73 61   Once the transa
1c10: 63 74 69 6f 6e 20 69 73 20 0a 20 20 23 20 63 6f  ction is .  # co
1c20: 6d 6d 69 74 74 65 64 2c 20 61 6c 6c 20 74 68 72  mmitted, all thr
1c30: 65 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 63  ee connections c
1c40: 61 6e 20 72 65 61 64 20 74 68 65 20 6e 65 77 20  an read the new 
1c50: 63 6f 6e 74 65 6e 74 2e 0a 20 20 23 0a 20 20 64  content..  #.  d
1c60: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24 74  o_test pager1-$t
1c70: 6e 2e 32 35 20 7b 20 73 71 6c 31 20 7b 20 55 50  n.25 { sql1 { UP
1c80: 44 41 54 45 20 74 31 20 53 45 54 20 61 20 3d 20  DATE t1 SET a = 
1c90: 61 2b 31 30 20 7d 20 7d 20 7b 7d 0a 20 20 64 6f  a+10 } } {}.  do
1ca0: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e  _test pager1-$tn
1cb0: 2e 32 36 20 7b 20 73 71 6c 31 20 7b 20 43 4f 4d  .26 { sql1 { COM
1cc0: 4d 49 54 20 7d 20 7d 20 7b 7d 0a 20 20 64 6f 5f  MIT } } {}.  do_
1cd0: 74 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e  test pager1-$tn.
1ce0: 32 37 20 7b 20 73 71 6c 31 20 7b 20 53 45 4c 45  27 { sql1 { SELE
1cf0: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7d  CT * FROM t1 } }
1d00: 20 7b 32 31 20 6f 6e 65 20 32 32 20 74 77 6f 20   {21 one 22 two 
1d10: 32 33 20 74 68 72 65 65 7d 0a 20 20 64 6f 5f 74  23 three}.  do_t
1d20: 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 32  est pager1-$tn.2
1d30: 37 20 7b 20 73 71 6c 32 20 7b 20 53 45 4c 45 43  7 { sql2 { SELEC
1d40: 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7d 20  T * FROM t1 } } 
1d50: 7b 32 31 20 6f 6e 65 20 32 32 20 74 77 6f 20 32  {21 one 22 two 2
1d60: 33 20 74 68 72 65 65 7d 0a 20 20 64 6f 5f 74 65  3 three}.  do_te
1d70: 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 32 38  st pager1-$tn.28
1d80: 20 7b 20 73 71 6c 33 20 7b 20 53 45 4c 45 43 54   { sql3 { SELECT
1d90: 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7d 20 7b   * FROM t1 } } {
1da0: 32 31 20 6f 6e 65 20 32 32 20 74 77 6f 20 32 33  21 one 22 two 23
1db0: 20 74 68 72 65 65 7d 0a 0a 20 20 23 20 49 6e 73   three}..  # Ins
1dc0: 74 61 6c 6c 20 61 20 62 75 73 79 2d 68 61 6e 64  tall a busy-hand
1dd0: 6c 65 72 20 66 6f 72 20 63 6f 6e 6e 65 63 74 69  ler for connecti
1de0: 6f 6e 20 5b 64 62 5d 2e 0a 20 20 23 0a 20 20 73  on [db]..  #.  s
1df0: 65 74 20 3a 3a 6e 62 75 73 79 20 5b 6c 69 73 74  et ::nbusy [list
1e00: 5d 0a 20 20 70 72 6f 63 20 62 75 73 79 20 7b 6e  ].  proc busy {n
1e10: 7d 20 7b 0a 20 20 20 20 6c 61 70 70 65 6e 64 20  } {.    lappend 
1e20: 3a 3a 6e 62 75 73 79 20 24 6e 0a 20 20 20 20 69  ::nbusy $n.    i
1e30: 66 20 7b 24 6e 3e 35 7d 20 7b 20 73 71 6c 32 20  f {$n>5} { sql2 
1e40: 43 4f 4d 4d 49 54 20 7d 0a 20 20 20 20 72 65 74  COMMIT }.    ret
1e50: 75 72 6e 20 30 0a 20 20 7d 0a 20 20 64 62 20 62  urn 0.  }.  db b
1e60: 75 73 79 20 62 75 73 79 0a 0a 20 20 64 6f 5f 74  usy busy..  do_t
1e70: 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 32  est pager1-$tn.2
1e80: 39 20 7b 20 0a 20 20 20 20 73 71 6c 31 20 7b 20  9 { .    sql1 { 
1e90: 42 45 47 49 4e 20 3b 20 49 4e 53 45 52 54 20 49  BEGIN ; INSERT I
1ea0: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27 78  NTO t1 VALUES('x
1eb0: 27 2c 20 27 79 27 29 20 7d 20 0a 20 20 7d 20 7b  ', 'y') } .  } {
1ec0: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65  }.  do_test page
1ed0: 72 31 2d 24 74 6e 2e 33 30 20 7b 20 0a 20 20 20  r1-$tn.30 { .   
1ee0: 20 73 71 6c 32 20 7b 20 42 45 47 49 4e 20 3b 20   sql2 { BEGIN ; 
1ef0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
1f00: 20 7d 20 0a 20 20 7d 20 7b 32 31 20 6f 6e 65 20   } .  } {21 one 
1f10: 32 32 20 74 77 6f 20 32 33 20 74 68 72 65 65 7d  22 two 23 three}
1f20: 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72  .  do_test pager
1f30: 31 2d 24 74 6e 2e 33 31 20 7b 20 73 71 6c 31 20  1-$tn.31 { sql1 
1f40: 43 4f 4d 4d 49 54 20 7d 20 7b 7d 0a 20 20 64 6f  COMMIT } {}.  do
1f50: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e  _test pager1-$tn
1f60: 2e 33 32 20 7b 20 73 65 74 20 3a 3a 6e 62 75 73  .32 { set ::nbus
1f70: 79 20 7d 20 7b 30 20 31 20 32 20 33 20 34 20 35  y } {0 1 2 3 4 5
1f80: 20 36 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d   6}.}..#--------
1f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1fd0: 2d 0a 23 20 53 61 76 65 70 6f 69 6e 74 20 72 65  -.# Savepoint re
1fe0: 6c 61 74 65 64 20 74 65 73 74 20 63 61 73 65 73  lated test cases
1ff0: 2e 0a 23 0a 23 20 70 61 67 65 72 31 2d 33 2e 31  ..#.# pager1-3.1
2000: 2e 32 2e 2a 3a 20 46 6f 72 63 65 20 61 20 73 61  .2.*: Force a sa
2010: 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b  vepoint rollback
2020: 20 74 6f 20 63 61 75 73 65 20 74 68 65 20 64 61   to cause the da
2030: 74 61 62 61 73 65 20 66 69 6c 65 0a 23 20 20 20  tabase file.#   
2040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 6f                to
2050: 20 67 72 6f 77 2e 0a 23 0a 23 20 70 61 67 65 72   grow..#.# pager
2060: 31 2d 33 2e 31 2e 33 2e 2a 3a 20 55 73 65 20 61  1-3.1.3.*: Use a
2070: 20 6a 6f 75 72 6e 61 6c 20 63 72 65 61 74 65 64   journal created
2080: 20 69 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d   in synchronous=
2090: 6f 66 66 20 6d 6f 64 65 20 61 73 20 70 61 72 74  off mode as part
20a0: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
20b0: 20 20 20 6f 66 20 61 20 73 61 76 65 70 6f 69 6e     of a savepoin
20c0: 74 20 72 6f 6c 6c 62 61 63 6b 2e 0a 23 20 0a 64  t rollback..# .d
20d0: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 33 2e  o_test pager1-3.
20e0: 31 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d  1.1 {.  faultsim
20f0: 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70  _delete_and_reop
2100: 65 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  en.  execsql {. 
2110: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
2120: 74 31 28 61 20 50 52 49 4d 41 52 59 20 4b 45 59  t1(a PRIMARY KEY
2130: 2c 20 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45  , b);.    CREATE
2140: 20 54 41 42 4c 45 20 63 6f 75 6e 74 65 72 28 0a   TABLE counter(.
2150: 20 20 20 20 20 20 69 20 43 48 45 43 4b 20 28 69        i CHECK (i
2160: 3c 35 29 2c 20 0a 20 20 20 20 20 20 75 20 43 48  <5), .      u CH
2170: 45 43 4b 20 28 75 3c 31 30 29 0a 20 20 20 20 29  ECK (u<10).    )
2180: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
2190: 4f 20 63 6f 75 6e 74 65 72 20 56 41 4c 55 45 53  O counter VALUES
21a0: 28 30 2c 20 30 29 3b 0a 20 20 20 20 43 52 45 41  (0, 0);.    CREA
21b0: 54 45 20 54 52 49 47 47 45 52 20 74 72 31 20 41  TE TRIGGER tr1 A
21c0: 46 54 45 52 20 49 4e 53 45 52 54 20 4f 4e 20 74  FTER INSERT ON t
21d0: 31 20 42 45 47 49 4e 0a 20 20 20 20 20 20 55 50  1 BEGIN.      UP
21e0: 44 41 54 45 20 63 6f 75 6e 74 65 72 20 53 45 54  DATE counter SET
21f0: 20 69 20 3d 20 69 2b 31 3b 0a 20 20 20 20 45 4e   i = i+1;.    EN
2200: 44 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 52  D;.    CREATE TR
2210: 49 47 47 45 52 20 74 72 32 20 41 46 54 45 52 20  IGGER tr2 AFTER 
2220: 55 50 44 41 54 45 20 4f 4e 20 74 31 20 42 45 47  UPDATE ON t1 BEG
2230: 49 4e 0a 20 20 20 20 20 20 55 50 44 41 54 45 20  IN.      UPDATE 
2240: 63 6f 75 6e 74 65 72 20 53 45 54 20 75 20 3d 20  counter SET u = 
2250: 75 2b 31 3b 0a 20 20 20 20 45 4e 44 3b 0a 20 20  u+1;.    END;.  
2260: 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45  }.  execsql { SE
2270: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 63 6f 75 6e  LECT * FROM coun
2280: 74 65 72 20 7d 0a 7d 20 7b 30 20 30 7d 0a 0a 64  ter }.} {0 0}..d
2290: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70  o_execsql_test p
22a0: 61 67 65 72 31 2d 33 2e 31 2e 32 20 7b 0a 20 20  ager1-3.1.2 {.  
22b0: 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a  PRAGMA cache_siz
22c0: 65 20 3d 20 31 30 3b 0a 20 20 42 45 47 49 4e 3b  e = 10;.  BEGIN;
22d0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
22e0: 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20 72 61   t1 VALUES(1, ra
22f0: 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 29 3b  ndomblob(1500));
2300: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
2310: 20 74 31 20 56 41 4c 55 45 53 28 32 2c 20 72 61   t1 VALUES(2, ra
2320: 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 29 3b  ndomblob(1500));
2330: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
2340: 20 74 31 20 56 41 4c 55 45 53 28 33 2c 20 72 61   t1 VALUES(3, ra
2350: 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 29 3b  ndomblob(1500));
2360: 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  .    SELECT * FR
2370: 4f 4d 20 63 6f 75 6e 74 65 72 3b 0a 7d 20 7b 33  OM counter;.} {3
2380: 20 30 7d 0a 64 6f 5f 63 61 74 63 68 73 71 6c 5f   0}.do_catchsql_
2390: 74 65 73 74 20 70 61 67 65 72 31 2d 33 2e 31 2e  test pager1-3.1.
23a0: 33 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  3 {.    INSERT I
23b0: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61 2b  NTO t1 SELECT a+
23c0: 33 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35  3, randomblob(15
23d0: 30 30 29 20 46 52 4f 4d 20 74 31 0a 7d 20 7b 31  00) FROM t1.} {1
23e0: 20 7b 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69   {constraint fai
23f0: 6c 65 64 7d 7d 0a 64 6f 5f 65 78 65 63 73 71 6c  led}}.do_execsql
2400: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 33 2e 34  _test pager1-3.4
2410: 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d   { SELECT * FROM
2420: 20 63 6f 75 6e 74 65 72 20 7d 20 7b 33 20 30 7d   counter } {3 0}
2430: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
2440: 20 70 61 67 65 72 31 2d 33 2e 35 20 7b 20 53 45   pager1-3.5 { SE
2450: 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31 20 7d  LECT a FROM t1 }
2460: 20 7b 31 20 32 20 33 7d 0a 64 6f 5f 65 78 65 63   {1 2 3}.do_exec
2470: 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d  sql_test pager1-
2480: 33 2e 36 20 7b 20 43 4f 4d 4d 49 54 20 7d 20 7b  3.6 { COMMIT } {
2490: 7d 0a 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20 73  }..foreach {tn s
24a0: 71 6c 20 74 63 6c 7d 20 7b 0a 20 20 37 20 20 7b  ql tcl} {.  7  {
24b0: 20 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e   PRAGMA synchron
24c0: 6f 75 73 20 3d 20 4e 4f 52 4d 41 4c 20 3b 20 50  ous = NORMAL ; P
24d0: 52 41 47 4d 41 20 74 65 6d 70 5f 73 74 6f 72 65  RAGMA temp_store
24e0: 20 3d 20 30 20 7d 20 7b 0a 20 20 20 20 74 65 73   = 0 } {.    tes
24f0: 74 76 66 73 20 74 76 20 2d 64 65 66 61 75 6c 74  tvfs tv -default
2500: 20 31 0a 20 20 20 20 74 76 20 64 65 76 63 68 61   1.    tv devcha
2510: 72 20 73 61 66 65 5f 61 70 70 65 6e 64 0a 20 20  r safe_append.  
2520: 7d 0a 20 20 38 20 20 7b 20 50 52 41 47 4d 41 20  }.  8  { PRAGMA 
2530: 73 79 6e 63 68 72 6f 6e 6f 75 73 20 3d 20 4e 4f  synchronous = NO
2540: 52 4d 41 4c 20 3b 20 50 52 41 47 4d 41 20 74 65  RMAL ; PRAGMA te
2550: 6d 70 5f 73 74 6f 72 65 20 3d 20 32 20 7d 20 7b  mp_store = 2 } {
2560: 0a 20 20 20 20 74 65 73 74 76 66 73 20 74 76 20  .    testvfs tv 
2570: 2d 64 65 66 61 75 6c 74 20 31 0a 20 20 20 20 74  -default 1.    t
2580: 76 20 64 65 76 63 68 61 72 20 73 65 71 75 65 6e  v devchar sequen
2590: 74 69 61 6c 0a 20 20 7d 0a 20 20 39 20 20 7b 20  tial.  }.  9  { 
25a0: 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f  PRAGMA synchrono
25b0: 75 73 20 3d 20 46 55 4c 4c 20 7d 20 7b 20 7d 0a  us = FULL } { }.
25c0: 20 20 31 30 20 7b 20 50 52 41 47 4d 41 20 73 79    10 { PRAGMA sy
25d0: 6e 63 68 72 6f 6e 6f 75 73 20 3d 20 4e 4f 52 4d  nchronous = NORM
25e0: 41 4c 20 7d 20 7b 20 7d 0a 20 20 31 31 20 7b 20  AL } { }.  11 { 
25f0: 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f  PRAGMA synchrono
2600: 75 73 20 3d 20 4f 46 46 20 7d 20 7b 20 7d 0a 20  us = OFF } { }. 
2610: 20 31 32 20 7b 20 50 52 41 47 4d 41 20 73 79 6e   12 { PRAGMA syn
2620: 63 68 72 6f 6e 6f 75 73 20 3d 20 46 55 4c 4c 20  chronous = FULL 
2630: 3b 20 50 52 41 47 4d 41 20 66 75 6c 6c 66 73 79  ; PRAGMA fullfsy
2640: 6e 63 20 3d 20 31 20 7d 20 7b 20 7d 0a 20 20 31  nc = 1 } { }.  1
2650: 33 20 7b 20 50 52 41 47 4d 41 20 73 79 6e 63 68  3 { PRAGMA synch
2660: 72 6f 6e 6f 75 73 20 3d 20 46 55 4c 4c 20 7d 20  ronous = FULL } 
2670: 7b 0a 20 20 20 20 74 65 73 74 76 66 73 20 74 76  {.    testvfs tv
2680: 20 2d 64 65 66 61 75 6c 74 20 31 0a 20 20 20 20   -default 1.    
2690: 74 76 20 64 65 76 63 68 61 72 20 73 65 71 75 65  tv devchar seque
26a0: 6e 74 69 61 6c 0a 20 20 7d 0a 20 20 31 34 20 7b  ntial.  }.  14 {
26b0: 20 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f   PRAGMA locking_
26c0: 6d 6f 64 65 20 3d 20 45 58 43 4c 55 53 49 56 45  mode = EXCLUSIVE
26d0: 20 7d 20 7b 0a 20 20 7d 0a 7d 20 7b 0a 20 20 64   } {.  }.} {.  d
26e0: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 33 2e  o_test pager1-3.
26f0: 24 74 6e 2e 31 20 7b 0a 20 20 20 20 65 76 61 6c  $tn.1 {.    eval
2700: 20 24 74 63 6c 0a 20 20 20 20 66 61 75 6c 74 73   $tcl.    faults
2710: 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65  im_delete_and_re
2720: 6f 70 65 6e 0a 20 20 20 20 64 62 20 66 75 6e 63  open.    db func
2730: 20 61 5f 73 74 72 69 6e 67 20 61 5f 73 74 72 69   a_string a_stri
2740: 6e 67 0a 20 20 20 20 65 78 65 63 73 71 6c 20 24  ng.    execsql $
2750: 73 71 6c 0a 20 20 20 20 65 78 65 63 73 71 6c 20  sql.    execsql 
2760: 7b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 61  {.      PRAGMA a
2770: 75 74 6f 5f 76 61 63 75 75 6d 20 3d 20 32 3b 0a  uto_vacuum = 2;.
2780: 20 20 20 20 20 20 50 52 41 47 4d 41 20 63 61 63        PRAGMA cac
2790: 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b 0a 20 20  he_size = 10;.  
27a0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
27b0: 20 7a 28 78 20 49 4e 54 45 47 45 52 20 50 52 49   z(x INTEGER PRI
27c0: 4d 41 52 59 20 4b 45 59 2c 20 79 29 3b 0a 20 20  MARY KEY, y);.  
27d0: 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20      BEGIN;.     
27e0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a     INSERT INTO z
27f0: 20 56 41 4c 55 45 53 28 4e 55 4c 4c 2c 20 61 5f   VALUES(NULL, a_
2800: 73 74 72 69 6e 67 28 38 30 30 29 29 3b 0a 20 20  string(800));.  
2810: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
2820: 4f 20 7a 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c  O z SELECT NULL,
2830: 20 61 5f 73 74 72 69 6e 67 28 38 30 30 29 20 46   a_string(800) F
2840: 52 4f 4d 20 7a 3b 20 20 20 20 20 2d 2d 20 20 20  ROM z;     --   
2850: 32 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54  2.        INSERT
2860: 20 49 4e 54 4f 20 7a 20 53 45 4c 45 43 54 20 4e   INTO z SELECT N
2870: 55 4c 4c 2c 20 61 5f 73 74 72 69 6e 67 28 38 30  ULL, a_string(80
2880: 30 29 20 46 52 4f 4d 20 7a 3b 20 20 20 20 20 2d  0) FROM z;     -
2890: 2d 20 20 20 34 0a 20 20 20 20 20 20 20 20 49 4e  -   4.        IN
28a0: 53 45 52 54 20 49 4e 54 4f 20 7a 20 53 45 4c 45  SERT INTO z SELE
28b0: 43 54 20 4e 55 4c 4c 2c 20 61 5f 73 74 72 69 6e  CT NULL, a_strin
28c0: 67 28 38 30 30 29 20 46 52 4f 4d 20 7a 3b 20 20  g(800) FROM z;  
28d0: 20 20 20 2d 2d 20 20 20 38 0a 20 20 20 20 20 20     --   8.      
28e0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a 20    INSERT INTO z 
28f0: 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 61 5f 73  SELECT NULL, a_s
2900: 74 72 69 6e 67 28 38 30 30 29 20 46 52 4f 4d 20  tring(800) FROM 
2910: 7a 3b 20 20 20 20 20 2d 2d 20 20 31 36 0a 20 20  z;     --  16.  
2920: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
2930: 4f 20 7a 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c  O z SELECT NULL,
2940: 20 61 5f 73 74 72 69 6e 67 28 38 30 30 29 20 46   a_string(800) F
2950: 52 4f 4d 20 7a 3b 20 20 20 20 20 2d 2d 20 20 33  ROM z;     --  3
2960: 32 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54  2.        INSERT
2970: 20 49 4e 54 4f 20 7a 20 53 45 4c 45 43 54 20 4e   INTO z SELECT N
2980: 55 4c 4c 2c 20 61 5f 73 74 72 69 6e 67 28 38 30  ULL, a_string(80
2990: 30 29 20 46 52 4f 4d 20 7a 3b 20 20 20 20 20 2d  0) FROM z;     -
29a0: 2d 20 20 36 34 0a 20 20 20 20 20 20 20 20 49 4e  -  64.        IN
29b0: 53 45 52 54 20 49 4e 54 4f 20 7a 20 53 45 4c 45  SERT INTO z SELE
29c0: 43 54 20 4e 55 4c 4c 2c 20 61 5f 73 74 72 69 6e  CT NULL, a_strin
29d0: 67 28 38 30 30 29 20 46 52 4f 4d 20 7a 3b 20 20  g(800) FROM z;  
29e0: 20 20 20 2d 2d 20 31 32 38 0a 20 20 20 20 20 20     -- 128.      
29f0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a 20    INSERT INTO z 
2a00: 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 61 5f 73  SELECT NULL, a_s
2a10: 74 72 69 6e 67 28 38 30 30 29 20 46 52 4f 4d 20  tring(800) FROM 
2a20: 7a 3b 20 20 20 20 20 2d 2d 20 32 35 36 0a 20 20  z;     -- 256.  
2a30: 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 20 20      COMMIT;.    
2a40: 7d 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20  }.    execsql { 
2a50: 50 52 41 47 4d 41 20 61 75 74 6f 5f 76 61 63 75  PRAGMA auto_vacu
2a60: 75 6d 20 7d 0a 20 20 7d 20 7b 32 7d 0a 20 20 64  um }.  } {2}.  d
2a70: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70  o_execsql_test p
2a80: 61 67 65 72 31 2d 33 2e 24 74 6e 2e 32 20 7b 0a  ager1-3.$tn.2 {.
2a90: 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20      BEGIN;.     
2aa0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a 20 56   INSERT INTO z V
2ab0: 41 4c 55 45 53 28 4e 55 4c 4c 2c 20 61 5f 73 74  ALUES(NULL, a_st
2ac0: 72 69 6e 67 28 38 30 30 29 29 3b 0a 20 20 20 20  ring(800));.    
2ad0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a 20    INSERT INTO z 
2ae0: 56 41 4c 55 45 53 28 4e 55 4c 4c 2c 20 61 5f 73  VALUES(NULL, a_s
2af0: 74 72 69 6e 67 28 38 30 30 29 29 3b 0a 20 20 20  tring(800));.   
2b00: 20 20 20 53 41 56 45 50 4f 49 4e 54 20 6f 6e 65     SAVEPOINT one
2b10: 3b 0a 20 20 20 20 20 20 20 20 55 50 44 41 54 45  ;.        UPDATE
2b20: 20 7a 20 53 45 54 20 79 20 3d 20 4e 55 4c 4c 20   z SET y = NULL 
2b30: 57 48 45 52 45 20 78 3e 32 35 36 3b 0a 20 20 20  WHERE x>256;.   
2b40: 20 20 20 20 20 50 52 41 47 4d 41 20 69 6e 63 72       PRAGMA incr
2b50: 65 6d 65 6e 74 61 6c 5f 76 61 63 75 75 6d 3b 0a  emental_vacuum;.
2b60: 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 63          SELECT c
2b70: 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 7a 20 57  ount(*) FROM z W
2b80: 48 45 52 45 20 78 20 3c 20 31 30 30 3b 0a 20 20  HERE x < 100;.  
2b90: 20 20 20 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20      ROLLBACK TO 
2ba0: 6f 6e 65 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b  one;.    COMMIT;
2bb0: 0a 20 20 7d 20 7b 39 39 7d 0a 0a 20 20 64 6f 5f  .  } {99}..  do_
2bc0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67  execsql_test pag
2bd0: 65 72 31 2d 33 2e 24 74 6e 2e 33 20 7b 0a 20 20  er1-3.$tn.3 {.  
2be0: 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 53    BEGIN;.      S
2bf0: 41 56 45 50 4f 49 4e 54 20 6f 6e 65 3b 0a 20 20  AVEPOINT one;.  
2c00: 20 20 20 20 20 20 55 50 44 41 54 45 20 7a 20 53        UPDATE z S
2c10: 45 54 20 79 20 3d 20 79 7c 7c 78 3b 0a 20 20 20  ET y = y||x;.   
2c20: 20 20 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 6f     ROLLBACK TO o
2c30: 6e 65 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a  ne;.    COMMIT;.
2c40: 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74      SELECT count
2c50: 28 2a 29 20 46 52 4f 4d 20 7a 3b 0a 20 20 7d 20  (*) FROM z;.  } 
2c60: 7b 32 35 38 7d 0a 0a 20 20 64 6f 5f 65 78 65 63  {258}..  do_exec
2c70: 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d  sql_test pager1-
2c80: 33 2e 24 74 6e 2e 34 20 7b 0a 20 20 20 20 53 41  3.$tn.4 {.    SA
2c90: 56 45 50 4f 49 4e 54 20 6f 6e 65 3b 0a 20 20 20  VEPOINT one;.   
2ca0: 20 20 20 55 50 44 41 54 45 20 7a 20 53 45 54 20     UPDATE z SET 
2cb0: 79 20 3d 20 79 7c 7c 78 3b 0a 20 20 20 20 52 4f  y = y||x;.    RO
2cc0: 4c 4c 42 41 43 4b 20 54 4f 20 6f 6e 65 3b 0a 20  LLBACK TO one;. 
2cd0: 20 7d 20 7b 7d 0a 20 20 64 6f 5f 65 78 65 63 73   } {}.  do_execs
2ce0: 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 33  ql_test pager1-3
2cf0: 2e 24 74 6e 2e 35 20 7b 0a 20 20 20 20 53 45 4c  .$tn.5 {.    SEL
2d00: 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
2d10: 4d 20 7a 3b 0a 20 20 20 20 52 45 4c 45 41 53 45  M z;.    RELEASE
2d20: 20 6f 6e 65 3b 0a 20 20 20 20 50 52 41 47 4d 41   one;.    PRAGMA
2d30: 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b   integrity_check
2d40: 3b 0a 20 20 7d 20 7b 32 35 38 20 6f 6b 7d 0a 0a  ;.  } {258 ok}..
2d50: 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 63 61 74    db close.  cat
2d60: 63 68 20 7b 20 74 76 20 64 65 6c 65 74 65 20 7d  ch { tv delete }
2d70: 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .}..#-----------
2d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2d90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2da0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2db0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
2dc0: 20 48 6f 74 20 6a 6f 75 72 6e 61 6c 20 72 6f 6c   Hot journal rol
2dd0: 6c 62 61 63 6b 20 72 65 6c 61 74 65 64 20 74 65  lback related te
2de0: 73 74 20 63 61 73 65 73 2e 0a 23 0a 23 20 70 61  st cases..#.# pa
2df0: 67 65 72 31 2e 34 2e 31 2e 2a 3a 20 54 65 73 74  ger1.4.1.*: Test
2e00: 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20   that the pager 
2e10: 6d 6f 64 75 6c 65 20 64 65 6c 65 74 65 73 20 76  module deletes v
2e20: 65 72 79 20 73 6d 61 6c 6c 20 69 6e 76 61 6c 69  ery small invali
2e30: 64 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20  d.#             
2e40: 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e    journal files.
2e50: 0a 23 0a 23 20 70 61 67 65 72 31 2e 34 2e 32 2e  .#.# pager1.4.2.
2e60: 2a 3a 20 54 65 73 74 20 74 68 61 74 20 69 66 20  *: Test that if 
2e70: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
2e80: 61 6c 20 70 6f 69 6e 74 65 72 20 61 74 20 74 68  al pointer at th
2e90: 65 20 65 6e 64 20 6f 66 20 61 0a 23 20 20 20 20  e end of a.#    
2ea0: 20 20 20 20 20 20 20 20 20 20 20 68 6f 74 2d 6a             hot-j
2eb0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 70 70 65  ournal file appe
2ec0: 61 72 73 20 74 6f 20 62 65 20 63 6f 72 72 75 70  ars to be corrup
2ed0: 74 20 28 63 68 65 63 6b 73 75 6d 20 64 6f 65 73  t (checksum does
2ee0: 20 6e 6f 74 0a 23 20 20 20 20 20 20 20 20 20 20   not.#          
2ef0: 20 20 20 20 20 63 6f 6d 70 75 74 65 29 20 74 68       compute) th
2f00: 65 20 61 73 73 6f 63 69 61 74 65 64 20 6a 6f 75  e associated jou
2f10: 72 6e 61 6c 20 69 73 20 72 6f 6c 6c 65 64 20 62  rnal is rolled b
2f20: 61 63 6b 20 28 61 6e 64 20 6e 6f 0a 23 20 20 20  ack (and no.#   
2f30: 20 20 20 20 20 20 20 20 20 20 20 20 78 41 63 63              xAcc
2f40: 65 73 73 28 29 20 63 61 6c 6c 20 74 6f 20 63 68  ess() call to ch
2f50: 65 63 6b 20 66 6f 72 20 74 68 65 20 70 72 65 73  eck for the pres
2f60: 65 6e 63 65 20 6f 66 20 61 6e 79 20 6d 61 73 74  ence of any mast
2f70: 65 72 20 0a 23 20 20 20 20 20 20 20 20 20 20 20  er .#           
2f80: 20 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65      journal file
2f90: 20 69 73 20 6d 61 64 65 29 2e 0a 23 0a 23 20 70   is made)..#.# p
2fa0: 61 67 65 72 31 2e 34 2e 33 2e 2a 3a 20 54 65 73  ager1.4.3.*: Tes
2fb0: 74 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65  t that the conte
2fc0: 6e 74 73 20 6f 66 20 61 20 68 6f 74 2d 6a 6f 75  nts of a hot-jou
2fd0: 72 6e 61 6c 20 61 72 65 20 69 67 6e 6f 72 65 64  rnal are ignored
2fe0: 20 69 66 20 74 68 65 0a 23 20 20 20 20 20 20 20   if the.#       
2ff0: 20 20 20 20 20 20 20 20 70 61 67 65 2d 73 69 7a          page-siz
3000: 65 20 6f 72 20 73 65 63 74 6f 72 2d 73 69 7a 65  e or sector-size
3010: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
3020: 68 65 61 64 65 72 20 61 70 70 65 61 72 20 74 6f  header appear to
3030: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
3040: 20 62 65 20 69 6e 76 61 6c 69 64 20 28 74 6f 6f   be invalid (too
3050: 20 6c 61 72 67 65 2c 20 74 6f 6f 20 73 6d 61 6c   large, too smal
3060: 6c 20 6f 72 20 6e 6f 74 20 61 20 70 6f 77 65 72  l or not a power
3070: 20 6f 66 20 32 29 2e 0a 23 0a 23 20 70 61 67 65   of 2)..#.# page
3080: 72 31 2e 34 2e 34 2e 2a 3a 20 54 65 73 74 20 68  r1.4.4.*: Test h
3090: 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
30a0: 61 63 6b 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 66  ack of journal f
30b0: 69 6c 65 20 77 69 74 68 20 61 20 6d 61 73 74 65  ile with a maste
30c0: 72 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20  r.#             
30d0: 20 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65    journal pointe
30e0: 72 20 67 65 6e 65 72 61 74 65 64 20 69 6e 20 76  r generated in v
30f0: 61 72 69 6f 75 73 20 22 50 52 41 47 4d 41 20 73  arious "PRAGMA s
3100: 79 6e 63 68 72 6f 6e 6f 75 73 22 0a 23 20 20 20  ynchronous".#   
3110: 20 20 20 20 20 20 20 20 20 20 20 20 6d 6f 64 65              mode
3120: 73 2e 0a 23 0a 23 20 70 61 67 65 72 31 2e 34 2e  s..#.# pager1.4.
3130: 35 2e 2a 3a 20 54 65 73 74 20 74 68 61 74 20 68  5.*: Test that h
3140: 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
3150: 61 63 6b 20 73 74 6f 70 73 20 69 66 20 69 74 20  ack stops if it 
3160: 65 6e 63 6f 75 6e 74 65 72 73 20 61 0a 23 20 20  encounters a.#  
3170: 20 20 20 20 20 20 20 20 20 20 20 20 20 6a 6f 75               jou
3180: 72 6e 61 6c 2d 72 65 63 6f 72 64 20 66 6f 72 20  rnal-record for 
3190: 77 68 69 63 68 20 74 68 65 20 63 68 65 63 6b 73  which the checks
31a0: 75 6d 20 66 61 69 6c 73 2e 0a 23 0a 23 20 70 61  um fails..#.# pa
31b0: 67 65 72 31 2e 34 2e 36 2e 2a 3a 20 54 65 73 74  ger1.4.6.*: Test
31c0: 20 74 68 61 74 20 77 68 65 6e 20 72 6f 6c 6c 69   that when rolli
31d0: 6e 67 20 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f  ng back a hot-jo
31e0: 75 72 6e 61 6c 20 74 68 61 74 20 63 6f 6e 74 61  urnal that conta
31f0: 69 6e 73 20 61 0a 23 20 20 20 20 20 20 20 20 20  ins a.#         
3200: 20 20 20 20 20 20 6d 61 73 74 65 72 20 6a 6f 75        master jou
3210: 72 6e 61 6c 20 70 6f 69 6e 74 65 72 2c 20 74 68  rnal pointer, th
3220: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
3230: 20 66 69 6c 65 20 69 73 20 64 65 6c 65 74 65 64   file is deleted
3240: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
3250: 20 61 66 74 65 72 20 61 6c 6c 20 74 68 65 20 68   after all the h
3260: 6f 74 2d 6a 6f 75 72 6e 61 6c 73 20 74 68 61 74  ot-journals that
3270: 20 72 65 66 65 72 20 74 6f 20 69 74 20 61 72 65   refer to it are
3280: 20 64 65 6c 65 74 65 64 2e 0a 23 0a 23 20 70 61   deleted..#.# pa
3290: 67 65 72 31 2e 34 2e 37 2e 2a 3a 20 54 65 73 74  ger1.4.7.*: Test
32a0: 20 74 68 61 74 20 69 66 20 61 20 68 6f 74 2d 6a   that if a hot-j
32b0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73  ournal file exis
32c0: 74 73 20 62 75 74 20 61 20 63 6c 69 65 6e 74 20  ts but a client 
32d0: 63 61 6e 0a 23 20 20 20 20 20 20 20 20 20 20 20  can.#           
32e0: 20 20 20 20 6f 70 65 6e 20 69 74 20 66 6f 72 20      open it for 
32f0: 72 65 61 64 69 6e 67 20 6f 6e 6c 79 2c 20 74 68  reading only, th
3300: 65 20 64 61 74 61 62 61 73 65 20 63 61 6e 6e 6f  e database canno
3310: 74 20 62 65 20 61 63 63 65 73 73 65 64 20 61 6e  t be accessed an
3320: 64 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20  d.#             
3330: 20 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45    SQLITE_CANTOPE
3340: 4e 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 23  N is returned..#
3350: 20 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31   .do_test pager1
3360: 2e 34 2e 31 2e 31 20 7b 0a 20 20 66 61 75 6c 74  .4.1.1 {.  fault
3370: 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72  sim_delete_and_r
3380: 65 6f 70 65 6e 0a 20 20 65 78 65 63 73 71 6c 20  eopen.  execsql 
3390: 7b 20 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  { .    CREATE TA
33a0: 42 4c 45 20 78 28 79 2c 20 7a 29 3b 0a 20 20 20  BLE x(y, z);.   
33b0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 20 56   INSERT INTO x V
33c0: 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20 20 7d  ALUES(1, 2);.  }
33d0: 0a 20 20 73 65 74 20 66 64 20 5b 6f 70 65 6e 20  .  set fd [open 
33e0: 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20  test.db-journal 
33f0: 77 5d 0a 20 20 70 75 74 73 20 2d 6e 6f 6e 65 77  w].  puts -nonew
3400: 6c 69 6e 65 20 24 66 64 20 22 68 65 6c 6c 6f 77  line $fd "hellow
3410: 6f 72 6c 64 22 0a 20 20 63 6c 6f 73 65 20 24 66  orld".  close $f
3420: 64 0a 20 20 66 69 6c 65 20 65 78 69 73 74 73 20  d.  file exists 
3430: 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a  test.db-journal.
3440: 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73 74 20 70 61  } {1}.do_test pa
3450: 67 65 72 31 2e 34 2e 31 2e 32 20 7b 20 65 78 65  ger1.4.1.2 { exe
3460: 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20  csql { SELECT * 
3470: 46 52 4f 4d 20 78 20 7d 20 7d 20 7b 31 20 32 7d  FROM x } } {1 2}
3480: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2e  .do_test pager1.
3490: 34 2e 31 2e 33 20 7b 20 66 69 6c 65 20 65 78 69  4.1.3 { file exi
34a0: 73 74 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72  sts test.db-jour
34b0: 6e 61 6c 20 7d 20 7b 30 7d 0a 0a 23 20 53 65 74  nal } {0}..# Set
34c0: 20 75 70 20 61 20 5b 74 65 73 74 76 66 73 5d 20   up a [testvfs] 
34d0: 74 6f 20 73 6e 61 70 73 68 6f 74 20 74 68 65 20  to snapshot the 
34e0: 66 69 6c 65 2d 73 79 73 74 65 6d 20 6a 75 73 74  file-system just
34f0: 20 62 65 66 6f 72 65 20 53 51 4c 69 74 65 0a 23   before SQLite.#
3500: 20 64 65 6c 65 74 65 73 20 74 68 65 20 6d 61 73   deletes the mas
3510: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 74 6f 20 63  ter-journal to c
3520: 6f 6d 6d 69 74 20 61 20 6d 75 6c 74 69 2d 66 69  ommit a multi-fi
3530: 6c 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  le transaction..
3540: 23 0a 23 20 49 6e 20 73 75 62 73 65 71 75 65 6e  #.# In subsequen
3550: 74 20 74 65 73 74 20 63 61 73 65 73 2c 20 69 6e  t test cases, in
3560: 76 6f 6b 69 6e 67 20 5b 66 61 75 6c 74 73 69 6d  voking [faultsim
3570: 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f  _restore_and_reo
3580: 70 65 6e 5d 20 73 65 74 73 0a 23 20 75 70 20 74  pen] sets.# up t
3590: 68 65 20 66 69 6c 65 20 73 79 73 74 65 6d 20 74  he file system t
35a0: 6f 20 63 6f 6e 74 61 69 6e 20 74 77 6f 20 64 61  o contain two da
35b0: 74 61 62 61 73 65 73 2c 20 74 77 6f 20 68 6f 74  tabases, two hot
35c0: 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 61  -journal files a
35d0: 6e 64 0a 23 20 61 20 6d 61 73 74 65 72 2d 6a 6f  nd.# a master-jo
35e0: 75 72 6e 61 6c 2e 0a 23 0a 64 6f 5f 74 65 73 74  urnal..#.do_test
35f0: 20 70 61 67 65 72 31 2e 34 2e 32 2e 31 20 7b 0a   pager1.4.2.1 {.
3600: 20 20 74 65 73 74 76 66 73 20 74 73 74 76 66 73    testvfs tstvfs
3610: 20 2d 64 65 66 61 75 6c 74 20 31 0a 20 20 74 73   -default 1.  ts
3620: 74 76 66 73 20 66 69 6c 74 65 72 20 78 44 65 6c  tvfs filter xDel
3630: 65 74 65 0a 20 20 74 73 74 76 66 73 20 73 63 72  ete.  tstvfs scr
3640: 69 70 74 20 78 44 65 6c 65 74 65 43 61 6c 6c 62  ipt xDeleteCallb
3650: 61 63 6b 0a 20 20 70 72 6f 63 20 78 44 65 6c 65  ack.  proc xDele
3660: 74 65 43 61 6c 6c 62 61 63 6b 20 7b 6d 65 74 68  teCallback {meth
3670: 6f 64 20 66 69 6c 65 20 61 72 67 73 7d 20 7b 0a  od file args} {.
3680: 20 20 20 20 73 65 74 20 66 69 6c 65 20 5b 66 69      set file [fi
3690: 6c 65 20 74 61 69 6c 20 24 66 69 6c 65 5d 0a 20  le tail $file]. 
36a0: 20 20 20 69 66 20 7b 20 5b 73 74 72 69 6e 67 20     if { [string 
36b0: 6d 61 74 63 68 20 2a 6d 6a 2a 20 24 66 69 6c 65  match *mj* $file
36c0: 5d 20 7d 20 7b 20 66 61 75 6c 74 73 69 6d 5f 73  ] } { faultsim_s
36d0: 61 76 65 20 7d 0a 20 20 7d 0a 20 20 66 61 75 6c  ave }.  }.  faul
36e0: 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f  tsim_delete_and_
36f0: 72 65 6f 70 65 6e 0a 20 20 64 62 20 66 75 6e 63  reopen.  db func
3700: 20 61 5f 73 74 72 69 6e 67 20 61 5f 73 74 72 69   a_string a_stri
3710: 6e 67 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  ng.  execsql {. 
3720: 20 20 20 41 54 54 41 43 48 20 27 74 65 73 74 2e     ATTACH 'test.
3730: 64 62 32 27 20 41 53 20 61 75 78 3b 0a 20 20 20  db2' AS aux;.   
3740: 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f   PRAGMA journal_
3750: 6d 6f 64 65 20 3d 20 44 45 4c 45 54 45 3b 0a 20  mode = DELETE;. 
3760: 20 20 20 50 52 41 47 4d 41 20 6d 61 69 6e 2e 63     PRAGMA main.c
3770: 61 63 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b 0a  ache_size = 10;.
3780: 20 20 20 20 50 52 41 47 4d 41 20 61 75 78 2e 63      PRAGMA aux.c
3790: 61 63 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b 0a  ache_size = 10;.
37a0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
37b0: 20 74 31 28 61 20 55 4e 49 51 55 45 2c 20 62 20   t1(a UNIQUE, b 
37c0: 55 4e 49 51 55 45 29 3b 0a 20 20 20 20 43 52 45  UNIQUE);.    CRE
37d0: 41 54 45 20 54 41 42 4c 45 20 61 75 78 2e 74 32  ATE TABLE aux.t2
37e0: 28 61 20 55 4e 49 51 55 45 2c 20 62 20 55 4e 49  (a UNIQUE, b UNI
37f0: 51 55 45 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  QUE);.    INSERT
3800: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
3810: 61 5f 73 74 72 69 6e 67 28 32 30 30 29 2c 20 61  a_string(200), a
3820: 5f 73 74 72 69 6e 67 28 33 30 30 29 29 3b 0a 20  _string(300));. 
3830: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
3840: 31 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e  1 SELECT a_strin
3850: 67 28 32 30 30 29 2c 20 61 5f 73 74 72 69 6e 67  g(200), a_string
3860: 28 33 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20  (300) FROM t1;. 
3870: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
3880: 31 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e  1 SELECT a_strin
3890: 67 28 32 30 30 29 2c 20 61 5f 73 74 72 69 6e 67  g(200), a_string
38a0: 28 33 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20  (300) FROM t1;. 
38b0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
38c0: 32 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  2 SELECT * FROM 
38d0: 74 31 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20  t1;.    BEGIN;. 
38e0: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
38f0: 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74 72   t1 SELECT a_str
3900: 69 6e 67 28 32 30 31 29 2c 20 61 5f 73 74 72 69  ing(201), a_stri
3910: 6e 67 28 33 30 31 29 20 46 52 4f 4d 20 74 31 3b  ng(301) FROM t1;
3920: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
3930: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73  TO t1 SELECT a_s
3940: 74 72 69 6e 67 28 32 30 32 29 2c 20 61 5f 73 74  tring(202), a_st
3950: 72 69 6e 67 28 33 30 32 29 20 46 52 4f 4d 20 74  ring(302) FROM t
3960: 31 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  1;.      INSERT 
3970: 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61  INTO t1 SELECT a
3980: 5f 73 74 72 69 6e 67 28 32 30 33 29 2c 20 61 5f  _string(203), a_
3990: 73 74 72 69 6e 67 28 33 30 33 29 20 46 52 4f 4d  string(303) FROM
39a0: 20 74 31 3b 0a 20 20 20 20 20 20 49 4e 53 45 52   t1;.      INSER
39b0: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
39c0: 20 61 5f 73 74 72 69 6e 67 28 32 30 34 29 2c 20   a_string(204), 
39d0: 61 5f 73 74 72 69 6e 67 28 33 30 34 29 20 46 52  a_string(304) FR
39e0: 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20 52 45 50  OM t1;.      REP
39f0: 4c 41 43 45 20 49 4e 54 4f 20 74 32 20 53 45 4c  LACE INTO t2 SEL
3a00: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20  ECT * FROM t1;. 
3a10: 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 20     COMMIT;.  }. 
3a20: 20 64 62 20 63 6c 6f 73 65 0a 20 20 74 73 74 76   db close.  tstv
3a30: 66 73 20 64 65 6c 65 74 65 0a 7d 20 7b 7d 0a 64  fs delete.} {}.d
3a40: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e  o_test pager1.4.
3a50: 32 2e 32 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d  2.2 {.  faultsim
3a60: 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f  _restore_and_reo
3a70: 70 65 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  pen.  execsql {.
3a80: 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74      SELECT count
3a90: 28 2a 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20  (*) FROM t1;.   
3aa0: 20 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74   PRAGMA integrit
3ab0: 79 5f 63 68 65 63 6b 3b 0a 20 20 7d 0a 7d 20 7b  y_check;.  }.} {
3ac0: 34 20 6f 6b 7d 0a 64 6f 5f 74 65 73 74 20 70 61  4 ok}.do_test pa
3ad0: 67 65 72 31 2e 34 2e 32 2e 33 20 7b 0a 20 20 66  ger1.4.2.3 {.  f
3ae0: 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f  aultsim_restore_
3af0: 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 66 6f 72  and_reopen.  for
3b00: 65 61 63 68 20 66 20 5b 67 6c 6f 62 20 74 65 73  each f [glob tes
3b10: 74 2e 64 62 2d 6d 6a 2a 5d 20 7b 20 66 69 6c 65  t.db-mj*] { file
3b20: 20 64 65 6c 65 74 65 20 2d 66 6f 72 63 65 20 24   delete -force $
3b30: 66 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  f }.  execsql {.
3b40: 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74      SELECT count
3b50: 28 2a 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20  (*) FROM t1;.   
3b60: 20 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74   PRAGMA integrit
3b70: 79 5f 63 68 65 63 6b 3b 0a 20 20 7d 0a 7d 20 7b  y_check;.  }.} {
3b80: 36 34 20 6f 6b 7d 0a 64 6f 5f 74 65 73 74 20 70  64 ok}.do_test p
3b90: 61 67 65 72 31 2e 34 2e 32 2e 34 20 7b 0a 20 20  ager1.4.2.4 {.  
3ba0: 66 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65  faultsim_restore
3bb0: 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 68 65  _and_reopen.  he
3bc0: 78 69 6f 5f 77 72 69 74 65 20 74 65 73 74 2e 64  xio_write test.d
3bd0: 62 2d 6a 6f 75 72 6e 61 6c 20 5b 65 78 70 72 20  b-journal [expr 
3be0: 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e  [file size test.
3bf0: 64 62 2d 6a 6f 75 72 6e 61 6c 5d 2d 32 30 5d 20  db-journal]-20] 
3c00: 31 32 33 34 35 36 0a 20 20 65 78 65 63 73 71 6c  123456.  execsql
3c10: 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 63 6f   {.    SELECT co
3c20: 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31 3b 0a  unt(*) FROM t1;.
3c30: 20 20 20 20 50 52 41 47 4d 41 20 69 6e 74 65 67      PRAGMA integ
3c40: 72 69 74 79 5f 63 68 65 63 6b 3b 0a 20 20 7d 0a  rity_check;.  }.
3c50: 7d 20 7b 34 20 6f 6b 7d 0a 64 6f 5f 74 65 73 74  } {4 ok}.do_test
3c60: 20 70 61 67 65 72 31 2e 34 2e 32 2e 35 20 7b 0a   pager1.4.2.5 {.
3c70: 20 20 66 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f    faultsim_resto
3c80: 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20  re_and_reopen.  
3c90: 68 65 78 69 6f 5f 77 72 69 74 65 20 74 65 73 74  hexio_write test
3ca0: 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 5b 65 78 70  .db-journal [exp
3cb0: 72 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73  r [file size tes
3cc0: 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5d 2d 32 30  t.db-journal]-20
3cd0: 5d 20 31 32 33 34 35 36 0a 20 20 66 6f 72 65 61  ] 123456.  forea
3ce0: 63 68 20 66 20 5b 67 6c 6f 62 20 74 65 73 74 2e  ch f [glob test.
3cf0: 64 62 2d 6d 6a 2a 5d 20 7b 20 66 69 6c 65 20 64  db-mj*] { file d
3d00: 65 6c 65 74 65 20 2d 66 6f 72 63 65 20 24 66 20  elete -force $f 
3d10: 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  }.  execsql {.  
3d20: 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a    SELECT count(*
3d30: 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 50  ) FROM t1;.    P
3d40: 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f  RAGMA integrity_
3d50: 63 68 65 63 6b 3b 0a 20 20 7d 0a 7d 20 7b 34 20  check;.  }.} {4 
3d60: 6f 6b 7d 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67  ok}..do_test pag
3d70: 65 72 31 2e 34 2e 33 2e 31 20 7b 0a 20 20 74 65  er1.4.3.1 {.  te
3d80: 73 74 76 66 73 20 74 73 74 76 66 73 20 2d 64 65  stvfs tstvfs -de
3d90: 66 61 75 6c 74 20 31 0a 20 20 74 73 74 76 66 73  fault 1.  tstvfs
3da0: 20 66 69 6c 74 65 72 20 78 53 79 6e 63 0a 20 20   filter xSync.  
3db0: 74 73 74 76 66 73 20 73 63 72 69 70 74 20 78 53  tstvfs script xS
3dc0: 79 6e 63 43 61 6c 6c 62 61 63 6b 0a 20 20 70 72  yncCallback.  pr
3dd0: 6f 63 20 78 53 79 6e 63 43 61 6c 6c 62 61 63 6b  oc xSyncCallback
3de0: 20 7b 6d 65 74 68 6f 64 20 66 69 6c 65 20 61 72   {method file ar
3df0: 67 73 7d 20 7b 0a 20 20 20 20 73 65 74 20 66 69  gs} {.    set fi
3e00: 6c 65 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 66  le [file tail $f
3e10: 69 6c 65 5d 0a 20 20 20 20 69 66 20 7b 20 30 3d  ile].    if { 0=
3e20: 3d 5b 73 74 72 69 6e 67 20 6d 61 74 63 68 20 2a  =[string match *
3e30: 6a 6f 75 72 6e 61 6c 20 24 66 69 6c 65 5d 20 7d  journal $file] }
3e40: 20 7b 20 66 61 75 6c 74 73 69 6d 5f 73 61 76 65   { faultsim_save
3e50: 20 7d 0a 20 20 7d 0a 20 20 66 61 75 6c 74 73 69   }.  }.  faultsi
3e60: 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f  m_delete_and_reo
3e70: 70 65 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  pen.  execsql {.
3e80: 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e      PRAGMA journ
3e90: 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c 45 54 45  al_mode = DELETE
3ea0: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
3eb0: 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20  LE t1(a, b);.   
3ec0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
3ed0: 56 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20 20  VALUES(1, 2);.  
3ee0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
3ef0: 20 56 41 4c 55 45 53 28 33 2c 20 34 29 3b 0a 20   VALUES(3, 4);. 
3f00: 20 7d 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20   }.  db close.  
3f10: 74 73 74 76 66 73 20 64 65 6c 65 74 65 0a 7d 20  tstvfs delete.} 
3f20: 7b 7d 0a 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20  {}..foreach {tn 
3f30: 6f 66 73 74 20 76 61 6c 75 65 20 72 65 73 75 6c  ofst value resul
3f40: 74 7d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 32  t} {.          2
3f50: 20 20 20 32 30 20 20 20 20 33 31 20 20 20 20 20     20    31     
3f60: 20 20 7b 31 20 32 20 33 20 34 7d 0a 20 20 20 20    {1 2 3 4}.    
3f70: 20 20 20 20 20 20 33 20 20 20 32 30 20 20 20 20        3   20    
3f80: 33 32 20 20 20 20 20 20 20 7b 31 20 32 20 33 20  32       {1 2 3 
3f90: 34 7d 0a 20 20 20 20 20 20 20 20 20 20 34 20 20  4}.          4  
3fa0: 20 32 30 20 20 20 20 33 33 20 20 20 20 20 20 20   20    33       
3fb0: 7b 31 20 32 20 33 20 34 7d 0a 20 20 20 20 20 20  {1 2 3 4}.      
3fc0: 20 20 20 20 35 20 20 20 32 30 20 20 20 20 36 35      5   20    65
3fd0: 35 33 36 20 20 20 20 7b 31 20 32 20 33 20 34 7d  536    {1 2 3 4}
3fe0: 0a 20 20 20 20 20 20 20 20 20 20 36 20 20 20 32  .          6   2
3ff0: 30 20 20 20 20 31 33 31 30 37 32 20 20 20 7b 31  0    131072   {1
4000: 20 32 20 33 20 34 7d 0a 0a 20 20 20 20 20 20 20   2 3 4}..       
4010: 20 20 20 37 20 20 20 32 34 20 20 20 20 35 31 31     7   24    511
4020: 20 20 20 20 20 20 7b 31 20 32 20 33 20 34 7d 0a        {1 2 3 4}.
4030: 20 20 20 20 20 20 20 20 20 20 38 20 20 20 32 34            8   24
4040: 20 20 20 20 35 31 33 20 20 20 20 20 20 7b 31 20      513      {1 
4050: 32 20 33 20 34 7d 0a 20 20 20 20 20 20 20 20 20  2 3 4}.         
4060: 20 39 20 20 20 32 34 20 20 20 20 36 35 35 33 36   9   24    65536
4070: 20 20 20 20 7b 31 20 32 20 33 20 34 7d 0a 0a 20      {1 2 3 4}.. 
4080: 20 20 20 20 20 20 20 20 31 30 20 20 20 33 32 20          10   32 
4090: 20 20 20 36 35 35 33 36 20 20 20 20 7b 31 20 32     65536    {1 2
40a0: 7d 0a 7d 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20  }.} {.  do_test 
40b0: 70 61 67 65 72 31 2e 34 2e 33 2e 24 74 6e 20 7b  pager1.4.3.$tn {
40c0: 0a 20 20 20 20 66 61 75 6c 74 73 69 6d 5f 72 65  .    faultsim_re
40d0: 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e  store_and_reopen
40e0: 0a 20 20 20 20 68 65 78 69 6f 5f 77 72 69 74 65  .    hexio_write
40f0: 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c   test.db-journal
4100: 20 24 6f 66 73 74 20 5b 66 6f 72 6d 61 74 20 25   $ofst [format %
4110: 2e 38 78 20 24 76 61 6c 75 65 5d 0a 20 20 20 20  .8x $value].    
4120: 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54  execsql { SELECT
4130: 20 2a 20 46 52 4f 4d 20 74 31 20 7d 0a 20 20 7d   * FROM t1 }.  }
4140: 20 24 72 65 73 75 6c 74 0a 7d 0a 64 62 20 63 6c   $result.}.db cl
4150: 6f 73 65 0a 0a 23 20 53 65 74 20 75 70 20 61 20  ose..# Set up a 
4160: 56 46 53 20 74 68 61 74 20 73 6e 61 70 73 68 6f  VFS that snapsho
4170: 74 73 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  ts the file-syst
4180: 65 6d 20 6a 75 73 74 20 62 65 66 6f 72 65 20 61  em just before a
4190: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a   master journal.
41a0: 23 20 66 69 6c 65 20 69 73 20 64 65 6c 65 74 65  # file is delete
41b0: 64 20 74 6f 20 63 6f 6d 6d 69 74 20 61 20 6d 75  d to commit a mu
41c0: 6c 74 69 2d 66 69 6c 65 20 74 72 61 6e 73 61 63  lti-file transac
41d0: 74 69 6f 6e 2e 20 53 70 65 63 69 66 69 63 61 6c  tion. Specifical
41e0: 6c 79 2c 20 74 68 65 0a 23 20 66 69 6c 65 2d 73  ly, the.# file-s
41f0: 79 73 74 65 6d 20 69 73 20 73 61 76 65 64 20 6a  ystem is saved j
4200: 75 73 74 20 62 65 66 6f 72 65 20 74 68 65 20 78  ust before the x
4210: 44 65 6c 65 74 65 28 29 20 63 61 6c 6c 20 74 6f  Delete() call to
4220: 20 72 65 6d 6f 76 65 20 74 68 65 20 0a 23 20 6d   remove the .# m
4230: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
4240: 6c 65 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65  le from the file
4250: 2d 73 79 73 74 65 6d 2e 0a 23 0a 74 65 73 74 76  -system..#.testv
4260: 66 73 20 74 76 20 2d 64 65 66 61 75 6c 74 20 31  fs tv -default 1
4270: 0a 74 76 20 73 63 72 69 70 74 20 63 6f 70 79 5f  .tv script copy_
4280: 6f 6e 5f 6d 6a 5f 64 65 6c 65 74 65 0a 73 65 74  on_mj_delete.set
4290: 20 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 5f 6c   ::mj_filename_l
42a0: 65 6e 67 74 68 20 30 0a 70 72 6f 63 20 63 6f 70  ength 0.proc cop
42b0: 79 5f 6f 6e 5f 6d 6a 5f 64 65 6c 65 74 65 20 7b  y_on_mj_delete {
42c0: 6d 65 74 68 6f 64 20 66 69 6c 65 6e 61 6d 65 20  method filename 
42d0: 61 72 67 73 7d 20 7b 0a 20 20 69 66 20 7b 5b 73  args} {.  if {[s
42e0: 74 72 69 6e 67 20 6d 61 74 63 68 20 2a 6d 6a 2a  tring match *mj*
42f0: 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 66 69 6c   [file tail $fil
4300: 65 6e 61 6d 65 5d 5d 7d 20 7b 20 0a 20 20 20 20  ename]]} { .    
4310: 73 65 74 20 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d  set ::mj_filenam
4320: 65 5f 6c 65 6e 67 74 68 20 5b 73 74 72 69 6e 67  e_length [string
4330: 20 6c 65 6e 67 74 68 20 24 66 69 6c 65 6e 61 6d   length $filenam
4340: 65 5d 0a 20 20 20 20 66 61 75 6c 74 73 69 6d 5f  e].    faultsim_
4350: 73 61 76 65 20 0a 20 20 7d 0a 20 20 72 65 74 75  save .  }.  retu
4360: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 7d 0a 0a  rn SQLITE_OK.}..
4370: 73 65 74 20 70 77 64 20 5b 70 77 64 5d 0a 66 6f  set pwd [pwd].fo
4380: 72 65 61 63 68 20 7b 74 6e 31 20 74 63 6c 7d 20  reach {tn1 tcl} 
4390: 7b 0a 20 20 31 20 7b 20 73 65 74 20 70 72 65 66  {.  1 { set pref
43a0: 69 78 20 22 74 65 73 74 2e 64 62 22 20 7d 0a 20  ix "test.db" }. 
43b0: 20 32 20 7b 20 0a 20 20 20 20 23 20 54 68 69 73   2 { .    # This
43c0: 20 74 65 73 74 20 64 65 70 65 6e 64 73 20 6f 6e   test depends on
43d0: 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
43e0: 56 46 53 20 62 65 69 6e 67 20 61 62 6c 65 20 74  VFS being able t
43f0: 6f 20 6f 70 65 6e 20 70 61 74 68 73 0a 20 20 20  o open paths.   
4400: 20 23 20 35 31 32 20 62 79 74 65 73 20 69 6e 20   # 512 bytes in 
4410: 6c 65 6e 67 74 68 2e 20 54 68 65 20 69 64 65 61  length. The idea
4420: 20 69 73 20 74 6f 20 63 72 65 61 74 65 20 61 20   is to create a 
4430: 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  hot-journal file
4440: 20 74 68 61 74 0a 20 20 20 20 23 20 63 6f 6e 74   that.    # cont
4450: 61 69 6e 73 20 61 20 6d 61 73 74 65 72 2d 6a 6f  ains a master-jo
4460: 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 73 6f  urnal pointer so
4470: 20 6c 61 72 67 65 20 74 68 61 74 20 69 74 20 63   large that it c
4480: 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 0a 20 20 20  ould contain.   
4490: 20 23 20 61 20 76 61 6c 69 64 20 70 61 67 65 20   # a valid page 
44a0: 72 65 63 6f 72 64 20 28 69 66 20 74 68 65 20 66  record (if the f
44b0: 69 6c 65 20 70 61 67 65 2d 73 69 7a 65 20 69 73  ile page-size is
44c0: 20 35 31 32 20 62 79 74 65 73 29 2e 20 53 6f 20   512 bytes). So 
44d0: 61 73 20 74 6f 0a 20 20 20 20 23 20 6d 61 6b 65  as to.    # make
44e0: 20 73 75 72 65 20 53 51 4c 69 74 65 20 64 6f 65   sure SQLite doe
44f0: 73 6e 27 74 20 67 65 74 20 63 6f 6e 66 75 73 65  sn't get confuse
4500: 64 20 62 79 20 74 68 69 73 2e 0a 20 20 20 20 23  d by this..    #
4510: 0a 20 20 20 20 73 65 74 20 6e 50 61 64 64 69 6e  .    set nPaddin
4520: 67 20 5b 65 78 70 72 20 35 31 31 20 2d 20 24 3a  g [expr 511 - $:
4530: 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 5f 6c 65 6e  :mj_filename_len
4540: 67 74 68 5d 0a 20 20 20 20 69 66 20 7b 24 74 63  gth].    if {$tc
4550: 6c 5f 70 6c 61 74 66 6f 72 6d 28 70 6c 61 74 66  l_platform(platf
4560: 6f 72 6d 29 3d 3d 22 77 69 6e 64 6f 77 73 22 7d  orm)=="windows"}
4570: 20 7b 0a 20 20 20 20 20 20 23 20 54 42 44 20 6e   {.      # TBD n
4580: 65 65 64 20 74 6f 20 66 69 67 75 72 65 20 6f 75  eed to figure ou
4590: 74 20 68 6f 77 20 74 6f 20 64 6f 20 74 68 69 73  t how to do this
45a0: 20 63 6f 72 72 65 63 74 6c 79 20 66 6f 72 20 57   correctly for W
45b0: 69 6e 64 6f 77 73 21 21 21 0a 20 20 20 20 20 20  indows!!!.      
45c0: 73 65 74 20 6e 50 61 64 64 69 6e 67 20 5b 65 78  set nPadding [ex
45d0: 70 72 20 32 35 35 20 2d 20 24 3a 3a 6d 6a 5f 66  pr 255 - $::mj_f
45e0: 69 6c 65 6e 61 6d 65 5f 6c 65 6e 67 74 68 5d 0a  ilename_length].
45f0: 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 57 65 20      }..    # We 
4600: 63 61 6e 6e 6f 74 20 6a 75 73 74 20 63 72 65 61  cannot just crea
4610: 74 65 20 61 20 72 65 61 6c 6c 79 20 6c 6f 6e 67  te a really long
4620: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e   database file n
4630: 61 6d 65 20 74 6f 20 6f 70 65 6e 2c 20 61 73 0a  ame to open, as.
4640: 20 20 20 20 23 20 4c 69 6e 75 78 20 6c 69 6d 69      # Linux limi
4650: 74 73 20 61 20 73 69 6e 67 6c 65 20 63 6f 6d 70  ts a single comp
4660: 6f 6e 65 6e 74 20 6f 66 20 61 20 70 61 74 68 20  onent of a path 
4670: 74 6f 20 32 35 35 20 62 79 74 65 73 20 62 79 20  to 255 bytes by 
4680: 64 65 66 61 75 6c 74 0a 20 20 20 20 23 20 28 61  default.    # (a
4690: 6e 64 20 70 72 65 73 75 6d 61 62 6c 79 20 6f 74  nd presumably ot
46a0: 68 65 72 20 73 79 73 74 65 6d 73 20 68 61 76 65  her systems have
46b0: 20 6c 69 6d 69 74 73 20 74 6f 6f 29 2e 20 53 6f   limits too). So
46c0: 20 63 72 65 61 74 65 20 61 20 64 69 72 65 63 74   create a direct
46d0: 6f 72 79 0a 20 20 20 20 23 20 68 69 65 72 61 72  ory.    # hierar
46e0: 63 68 79 20 74 6f 20 77 6f 72 6b 20 69 6e 2e 0a  chy to work in..
46f0: 20 20 20 20 23 0a 20 20 20 20 73 65 74 20 64 69      #.    set di
4700: 72 6e 61 6d 65 20 22 64 31 32 33 34 35 36 37 38  rname "d12345678
4710: 39 30 31 32 33 34 35 36 37 38 39 30 31 32 33 34  9012345678901234
4720: 35 36 37 38 39 30 2f 22 0a 20 20 20 20 73 65 74  567890/".    set
4730: 20 6e 44 69 72 20 5b 65 78 70 72 20 24 6e 50 61   nDir [expr $nPa
4740: 64 64 69 6e 67 20 2f 20 33 32 5d 0a 20 20 20 20  dding / 32].    
4750: 69 66 20 7b 20 24 6e 44 69 72 20 7d 20 7b 0a 20  if { $nDir } {. 
4760: 20 20 20 20 20 73 65 74 20 70 20 5b 73 74 72 69       set p [stri
4770: 6e 67 20 72 65 70 65 61 74 20 24 64 69 72 6e 61  ng repeat $dirna
4780: 6d 65 20 24 6e 44 69 72 5d 0a 20 20 20 20 20 20  me $nDir].      
4790: 66 69 6c 65 20 6d 6b 64 69 72 20 24 70 0a 20 20  file mkdir $p.  
47a0: 20 20 20 20 63 64 20 24 70 0a 20 20 20 20 7d 0a      cd $p.    }.
47b0: 0a 20 20 20 20 73 65 74 20 70 61 64 64 69 6e 67  .    set padding
47c0: 20 5b 73 74 72 69 6e 67 20 72 65 70 65 61 74 20   [string repeat 
47d0: 78 20 5b 65 78 70 72 20 24 6e 50 61 64 64 69 6e  x [expr $nPaddin
47e0: 67 20 25 33 32 5d 5d 0a 20 20 20 20 73 65 74 20  g %32]].    set 
47f0: 70 72 65 66 69 78 20 22 74 65 73 74 2e 64 62 24  prefix "test.db$
4800: 7b 70 61 64 64 69 6e 67 7d 22 0a 20 20 7d 0a 7d  {padding}".  }.}
4810: 20 7b 0a 20 20 65 76 61 6c 20 24 74 63 6c 0a 20   {.  eval $tcl. 
4820: 20 66 6f 72 65 61 63 68 20 7b 74 6e 32 20 73 71   foreach {tn2 sq
4830: 6c 7d 20 7b 0a 20 20 20 20 6f 20 7b 20 0a 20 20  l} {.    o { .  
4840: 20 20 20 20 50 52 41 47 4d 41 20 6d 61 69 6e 2e      PRAGMA main.
4850: 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46 46 3b  synchronous=OFF;
4860: 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 61 75  .      PRAGMA au
4870: 78 2e 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46  x.synchronous=OF
4880: 46 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20  F;.      PRAGMA 
4890: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44  journal_mode = D
48a0: 45 4c 45 54 45 3b 0a 20 20 20 20 7d 0a 20 20 20  ELETE;.    }.   
48b0: 20 6f 35 31 32 20 7b 20 0a 20 20 20 20 20 20 50   o512 { .      P
48c0: 52 41 47 4d 41 20 6d 61 69 6e 2e 73 79 6e 63 68  RAGMA main.synch
48d0: 72 6f 6e 6f 75 73 3d 4f 46 46 3b 0a 20 20 20 20  ronous=OFF;.    
48e0: 20 20 50 52 41 47 4d 41 20 61 75 78 2e 73 79 6e    PRAGMA aux.syn
48f0: 63 68 72 6f 6e 6f 75 73 3d 4f 46 46 3b 0a 20 20  chronous=OFF;.  
4900: 20 20 20 20 50 52 41 47 4d 41 20 6d 61 69 6e 2e      PRAGMA main.
4910: 70 61 67 65 5f 73 69 7a 65 20 3d 20 35 31 32 3b  page_size = 512;
4920: 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 61 75  .      PRAGMA au
4930: 78 2e 70 61 67 65 5f 73 69 7a 65 20 3d 20 35 31  x.page_size = 51
4940: 32 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20  2;.      PRAGMA 
4950: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44  journal_mode = D
4960: 45 4c 45 54 45 3b 0a 20 20 20 20 7d 0a 20 20 20  ELETE;.    }.   
4970: 20 6e 20 7b 20 0a 20 20 20 20 20 20 50 52 41 47   n { .      PRAG
4980: 4d 41 20 6d 61 69 6e 2e 73 79 6e 63 68 72 6f 6e  MA main.synchron
4990: 6f 75 73 3d 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20  ous=NORMAL;.    
49a0: 20 20 50 52 41 47 4d 41 20 61 75 78 2e 73 79 6e    PRAGMA aux.syn
49b0: 63 68 72 6f 6e 6f 75 73 3d 4e 4f 52 4d 41 4c 3b  chronous=NORMAL;
49c0: 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 6a 6f  .      PRAGMA jo
49d0: 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c  urnal_mode = DEL
49e0: 45 54 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  ETE;.    }.    f
49f0: 20 7b 20 0a 20 20 20 20 20 20 50 52 41 47 4d 41   { .      PRAGMA
4a00: 20 6d 61 69 6e 2e 73 79 6e 63 68 72 6f 6e 6f 75   main.synchronou
4a10: 73 3d 46 55 4c 4c 3b 0a 20 20 20 20 20 20 50 52  s=FULL;.      PR
4a20: 41 47 4d 41 20 61 75 78 2e 73 79 6e 63 68 72 6f  AGMA aux.synchro
4a30: 6e 6f 75 73 3d 46 55 4c 4c 3b 0a 20 20 20 20 20  nous=FULL;.     
4a40: 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f   PRAGMA journal_
4a50: 6d 6f 64 65 20 3d 20 44 45 4c 45 54 45 3b 0a 20  mode = DELETE;. 
4a60: 20 20 20 7d 0a 20 20 7d 20 7b 0a 0a 20 20 20 20     }.  } {..    
4a70: 73 65 74 20 74 6e 20 22 24 7b 74 6e 31 7d 2e 24  set tn "${tn1}.$
4a80: 7b 74 6e 32 7d 22 0a 20 20 0a 20 20 20 20 23 20  {tn2}".  .    # 
4a90: 53 65 74 20 75 70 20 61 20 63 6f 6e 6e 65 63 74  Set up a connect
4aa0: 69 6f 6e 20 74 6f 20 68 61 76 65 20 74 77 6f 20  ion to have two 
4ab0: 64 61 74 61 62 61 73 65 73 2c 20 74 65 73 74 2e  databases, test.
4ac0: 64 62 20 28 6d 61 69 6e 29 20 61 6e 64 20 0a 20  db (main) and . 
4ad0: 20 20 20 23 20 74 65 73 74 2e 64 62 32 20 28 61     # test.db2 (a
4ae0: 75 78 29 2e 20 54 68 65 6e 20 72 75 6e 20 61 20  ux). Then run a 
4af0: 6d 75 6c 74 69 2d 66 69 6c 65 20 74 72 61 6e 73  multi-file trans
4b00: 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 6d 2e 20  action on them. 
4b10: 54 68 65 0a 20 20 20 20 23 20 56 46 53 20 77 69  The.    # VFS wi
4b20: 6c 6c 20 73 6e 61 70 73 68 6f 74 20 74 68 65 20  ll snapshot the 
4b30: 66 69 6c 65 2d 73 79 73 74 65 6d 20 6a 75 73 74  file-system just
4b40: 20 62 65 66 6f 72 65 20 74 68 65 20 6d 61 73 74   before the mast
4b50: 65 72 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 23  er-journal.    #
4b60: 20 66 69 6c 65 20 69 73 20 64 65 6c 65 74 65 64   file is deleted
4b70: 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65 20 74   to commit the t
4b80: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20  ransaction..    
4b90: 23 0a 20 20 20 20 74 76 20 66 69 6c 74 65 72 20  #.    tv filter 
4ba0: 78 44 65 6c 65 74 65 0a 20 20 20 20 64 6f 5f 74  xDelete.    do_t
4bb0: 65 73 74 20 70 61 67 65 72 31 2d 34 2e 34 2e 24  est pager1-4.4.$
4bc0: 74 6e 2e 31 20 7b 0a 20 20 20 20 20 20 66 61 75  tn.1 {.      fau
4bd0: 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64  ltsim_delete_and
4be0: 5f 72 65 6f 70 65 6e 20 24 70 72 65 66 69 78 0a  _reopen $prefix.
4bf0: 20 20 20 20 20 20 65 78 65 63 73 71 6c 20 22 0a        execsql ".
4c00: 20 20 20 20 20 20 20 20 41 54 54 41 43 48 20 27          ATTACH '
4c10: 24 7b 70 72 65 66 69 78 7d 32 27 20 41 53 20 61  ${prefix}2' AS a
4c20: 75 78 3b 0a 20 20 20 20 20 20 20 20 24 73 71 6c  ux;.        $sql
4c30: 0a 20 20 20 20 20 20 20 20 43 52 45 41 54 45 20  .        CREATE 
4c40: 54 41 42 4c 45 20 61 28 78 29 3b 0a 20 20 20 20  TABLE a(x);.    
4c50: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
4c60: 20 61 75 78 2e 62 28 78 29 3b 0a 20 20 20 20 20   aux.b(x);.     
4c70: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61     INSERT INTO a
4c80: 20 56 41 4c 55 45 53 28 27 64 6f 75 62 6c 65 2d   VALUES('double-
4c90: 79 6f 75 27 29 3b 0a 20 20 20 20 20 20 20 20 49  you');.        I
4ca0: 4e 53 45 52 54 20 49 4e 54 4f 20 61 20 56 41 4c  NSERT INTO a VAL
4cb0: 55 45 53 28 27 77 68 79 27 29 3b 0a 20 20 20 20  UES('why');.    
4cc0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
4cd0: 61 20 56 41 4c 55 45 53 28 27 7a 65 64 27 29 3b  a VALUES('zed');
4ce0: 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20  .        INSERT 
4cf0: 49 4e 54 4f 20 62 20 56 41 4c 55 45 53 28 27 77  INTO b VALUES('w
4d00: 6f 6e 27 29 3b 0a 20 20 20 20 20 20 20 20 49 4e  on');.        IN
4d10: 53 45 52 54 20 49 4e 54 4f 20 62 20 56 41 4c 55  SERT INTO b VALU
4d20: 45 53 28 27 74 6f 6f 27 29 3b 0a 20 20 20 20 20  ES('too');.     
4d30: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 62     INSERT INTO b
4d40: 20 56 41 4c 55 45 53 28 27 66 72 65 65 27 29 3b   VALUES('free');
4d50: 0a 20 20 20 20 20 20 22 0a 20 20 20 20 20 20 65  .      ".      e
4d60: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 20  xecsql {.       
4d70: 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 20 20   BEGIN;.        
4d80: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 20    INSERT INTO a 
4d90: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 62 20  SELECT * FROM b 
4da0: 57 48 45 52 45 20 72 6f 77 69 64 3c 3d 33 3b 0a  WHERE rowid<=3;.
4db0: 20 20 20 20 20 20 20 20 20 20 49 4e 53 45 52 54            INSERT
4dc0: 20 49 4e 54 4f 20 62 20 53 45 4c 45 43 54 20 2a   INTO b SELECT *
4dd0: 20 46 52 4f 4d 20 61 20 57 48 45 52 45 20 72 6f   FROM a WHERE ro
4de0: 77 69 64 3c 3d 33 3b 0a 20 20 20 20 20 20 20 20  wid<=3;.        
4df0: 43 4f 4d 4d 49 54 3b 0a 20 20 20 20 20 20 7d 0a  COMMIT;.      }.
4e00: 20 20 20 20 7d 20 7b 7d 0a 20 20 20 20 74 76 20      } {}.    tv 
4e10: 66 69 6c 74 65 72 20 7b 7d 0a 20 20 20 20 0a 20  filter {}.    . 
4e20: 20 20 20 23 20 43 68 65 63 6b 20 74 68 61 74 20     # Check that 
4e30: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
4e40: 77 61 73 20 63 6f 6d 6d 69 74 74 65 64 20 73 75  was committed su
4e50: 63 63 65 73 73 66 75 6c 6c 79 2e 0a 20 20 20 20  ccessfully..    
4e60: 23 0a 20 20 20 20 64 6f 5f 65 78 65 63 73 71 6c  #.    do_execsql
4e70: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 34 2e 34  _test pager1-4.4
4e80: 2e 24 74 6e 2e 32 20 7b 0a 20 20 20 20 20 20 53  .$tn.2 {.      S
4e90: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 61 0a 20  ELECT * FROM a. 
4ea0: 20 20 20 7d 20 7b 64 6f 75 62 6c 65 2d 79 6f 75     } {double-you
4eb0: 20 77 68 79 20 7a 65 64 20 77 6f 6e 20 74 6f 6f   why zed won too
4ec0: 20 66 72 65 65 7d 0a 20 20 20 20 64 6f 5f 65 78   free}.    do_ex
4ed0: 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72  ecsql_test pager
4ee0: 31 2d 34 2e 34 2e 24 74 6e 2e 33 20 7b 0a 20 20  1-4.4.$tn.3 {.  
4ef0: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
4f00: 4d 20 62 0a 20 20 20 20 7d 20 7b 77 6f 6e 20 74  M b.    } {won t
4f10: 6f 6f 20 66 72 65 65 20 64 6f 75 62 6c 65 2d 79  oo free double-y
4f20: 6f 75 20 77 68 79 20 7a 65 64 7d 0a 20 20 20 20  ou why zed}.    
4f30: 0a 20 20 20 20 23 20 52 65 73 74 6f 72 65 20 74  .    # Restore t
4f40: 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 61  he file-system a
4f50: 6e 64 20 72 65 6f 70 65 6e 20 74 68 65 20 64 61  nd reopen the da
4f60: 74 61 62 61 73 65 73 2e 20 43 68 65 63 6b 20 74  tabases. Check t
4f70: 68 61 74 20 69 74 20 6e 6f 77 0a 20 20 20 20 23  hat it now.    #
4f80: 20 61 70 70 65 61 72 73 20 74 68 61 74 20 74 68   appears that th
4f90: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  e transaction wa
4fa0: 73 20 6e 6f 74 20 63 6f 6d 6d 69 74 74 65 64 20  s not committed 
4fb0: 28 62 65 63 61 75 73 65 20 74 68 65 20 66 69 6c  (because the fil
4fc0: 65 2d 73 79 73 74 65 6d 0a 20 20 20 20 23 20 77  e-system.    # w
4fd0: 61 73 20 72 65 73 74 6f 72 65 64 20 74 6f 20 74  as restored to t
4fe0: 68 65 20 73 74 61 74 65 20 77 68 65 72 65 20 69  he state where i
4ff0: 74 20 68 61 64 20 6e 6f 74 20 62 65 65 6e 29 2e  t had not been).
5000: 0a 20 20 20 20 23 0a 20 20 20 20 64 6f 5f 74 65  .    #.    do_te
5010: 73 74 20 70 61 67 65 72 31 2d 34 2e 34 2e 24 74  st pager1-4.4.$t
5020: 6e 2e 34 20 7b 0a 20 20 20 20 20 20 66 61 75 6c  n.4 {.      faul
5030: 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64  tsim_restore_and
5040: 5f 72 65 6f 70 65 6e 20 24 70 72 65 66 69 78 0a  _reopen $prefix.
5050: 20 20 20 20 20 20 65 78 65 63 73 71 6c 20 22 41        execsql "A
5060: 54 54 41 43 48 20 27 24 7b 70 72 65 66 69 78 7d  TTACH '${prefix}
5070: 32 27 20 41 53 20 61 75 78 22 0a 20 20 20 20 7d  2' AS aux".    }
5080: 20 7b 7d 0a 20 20 20 20 64 6f 5f 65 78 65 63 73   {}.    do_execs
5090: 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 34  ql_test pager1-4
50a0: 2e 34 2e 24 74 6e 2e 35 20 7b 53 45 4c 45 43 54  .4.$tn.5 {SELECT
50b0: 20 2a 20 46 52 4f 4d 20 61 7d 20 7b 64 6f 75 62   * FROM a} {doub
50c0: 6c 65 2d 79 6f 75 20 77 68 79 20 7a 65 64 7d 0a  le-you why zed}.
50d0: 20 20 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74      do_execsql_t
50e0: 65 73 74 20 70 61 67 65 72 31 2d 34 2e 34 2e 24  est pager1-4.4.$
50f0: 74 6e 2e 36 20 7b 53 45 4c 45 43 54 20 2a 20 46  tn.6 {SELECT * F
5100: 52 4f 4d 20 62 7d 20 7b 77 6f 6e 20 74 6f 6f 20  ROM b} {won too 
5110: 66 72 65 65 7d 0a 20 20 20 20 0a 20 20 20 20 23  free}.    .    #
5120: 20 52 65 73 74 6f 72 65 20 74 68 65 20 66 69 6c   Restore the fil
5130: 65 2d 73 79 73 74 65 6d 20 61 67 61 69 6e 2e 20  e-system again. 
5140: 54 68 69 73 20 74 69 6d 65 2c 20 62 65 66 6f 72  This time, befor
5150: 65 20 72 65 6f 70 65 6e 69 6e 67 20 74 68 65 20  e reopening the 
5160: 64 61 74 61 62 61 73 65 73 2c 0a 20 20 20 20 23  databases,.    #
5170: 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74   delete the mast
5180: 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er-journal file 
5190: 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 2d 73 79  from the file-sy
51a0: 73 74 65 6d 2e 20 49 74 20 6e 6f 77 20 61 70 70  stem. It now app
51b0: 65 61 72 73 20 74 68 61 74 0a 20 20 20 20 23 20  ears that.    # 
51c0: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
51d0: 77 61 73 20 63 6f 6d 6d 69 74 74 65 64 20 28 6e  was committed (n
51e0: 6f 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  o master-journal
51f0: 20 66 69 6c 65 20 3d 3d 20 6e 6f 20 72 6f 6c 6c   file == no roll
5200: 62 61 63 6b 29 2e 0a 20 20 20 20 23 0a 20 20 20  back)..    #.   
5210: 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
5220: 34 2e 34 2e 24 74 6e 2e 37 20 7b 0a 20 20 20 20  4.4.$tn.7 {.    
5230: 20 20 66 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f    faultsim_resto
5240: 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 20 24 70  re_and_reopen $p
5250: 72 65 66 69 78 0a 20 20 20 20 20 20 66 6f 72 65  refix.      fore
5260: 61 63 68 20 66 20 5b 67 6c 6f 62 20 24 7b 70 72  ach f [glob ${pr
5270: 65 66 69 78 7d 2d 6d 6a 2a 5d 20 7b 20 66 69 6c  efix}-mj*] { fil
5280: 65 20 64 65 6c 65 74 65 20 2d 66 6f 72 63 65 20  e delete -force 
5290: 24 66 20 7d 0a 20 20 20 20 20 20 65 78 65 63 73  $f }.      execs
52a0: 71 6c 20 22 41 54 54 41 43 48 20 27 24 7b 70 72  ql "ATTACH '${pr
52b0: 65 66 69 78 7d 32 27 20 41 53 20 61 75 78 22 0a  efix}2' AS aux".
52c0: 20 20 20 20 7d 20 7b 7d 0a 20 20 20 20 64 6f 5f      } {}.    do_
52d0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67  execsql_test pag
52e0: 65 72 31 2d 34 2e 34 2e 24 74 6e 2e 38 20 7b 0a  er1-4.4.$tn.8 {.
52f0: 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46        SELECT * F
5300: 52 4f 4d 20 61 0a 20 20 20 20 7d 20 7b 64 6f 75  ROM a.    } {dou
5310: 62 6c 65 2d 79 6f 75 20 77 68 79 20 7a 65 64 20  ble-you why zed 
5320: 77 6f 6e 20 74 6f 6f 20 66 72 65 65 7d 0a 20 20  won too free}.  
5330: 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73    do_execsql_tes
5340: 74 20 70 61 67 65 72 31 2d 34 2e 34 2e 24 74 6e  t pager1-4.4.$tn
5350: 2e 39 20 7b 0a 20 20 20 20 20 20 53 45 4c 45 43  .9 {.      SELEC
5360: 54 20 2a 20 46 52 4f 4d 20 62 0a 20 20 20 20 7d  T * FROM b.    }
5370: 20 7b 77 6f 6e 20 74 6f 6f 20 66 72 65 65 20 64   {won too free d
5380: 6f 75 62 6c 65 2d 79 6f 75 20 77 68 79 20 7a 65  ouble-you why ze
5390: 64 7d 0a 20 20 7d 0a 0a 20 20 63 64 20 24 70 77  d}.  }..  cd $pw
53a0: 64 0a 7d 0a 64 62 20 63 6c 6f 73 65 0a 74 76 20  d.}.db close.tv 
53b0: 64 65 6c 65 74 65 0a 66 69 6c 65 20 64 65 6c 65  delete.file dele
53c0: 74 65 20 2d 66 6f 72 63 65 20 24 64 69 72 6e 61  te -force $dirna
53d0: 6d 65 0a 0a 0a 23 20 53 65 74 20 75 70 20 61 20  me...# Set up a 
53e0: 56 46 53 20 74 6f 20 6d 61 6b 65 20 61 20 63 6f  VFS to make a co
53f0: 70 79 20 6f 66 20 74 68 65 20 66 69 6c 65 2d 73  py of the file-s
5400: 79 73 74 65 6d 20 6a 75 73 74 20 62 65 66 6f 72  ystem just befor
5410: 65 20 64 65 6c 65 74 69 6e 67 20 61 0a 23 20 6a  e deleting a.# j
5420: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 63  ournal file to c
5430: 6f 6d 6d 69 74 20 61 20 74 72 61 6e 73 61 63 74  ommit a transact
5440: 69 6f 6e 2e 20 54 68 65 20 74 72 61 6e 73 61 63  ion. The transac
5450: 74 69 6f 6e 20 6d 6f 64 69 66 69 65 73 20 65 78  tion modifies ex
5460: 61 63 74 6c 79 0a 23 20 74 77 6f 20 64 61 74 61  actly.# two data
5470: 62 61 73 65 20 70 61 67 65 73 20 28 61 6e 64 20  base pages (and 
5480: 70 61 67 65 20 31 20 2d 20 74 68 65 20 63 68 61  page 1 - the cha
5490: 6e 67 65 20 63 6f 75 6e 74 65 72 29 2e 0a 23 0a  nge counter)..#.
54a0: 74 65 73 74 76 66 73 20 74 76 20 2d 64 65 66 61  testvfs tv -defa
54b0: 75 6c 74 20 31 0a 74 76 20 73 65 63 74 6f 72 73  ult 1.tv sectors
54c0: 69 7a 65 20 35 31 32 0a 74 76 20 73 63 72 69 70  ize 512.tv scrip
54d0: 74 20 63 6f 70 79 5f 6f 6e 5f 6a 6f 75 72 6e 61  t copy_on_journa
54e0: 6c 5f 64 65 6c 65 74 65 0a 74 76 20 66 69 6c 74  l_delete.tv filt
54f0: 65 72 20 78 44 65 6c 65 74 65 0a 70 72 6f 63 20  er xDelete.proc 
5500: 63 6f 70 79 5f 6f 6e 5f 6a 6f 75 72 6e 61 6c 5f  copy_on_journal_
5510: 64 65 6c 65 74 65 20 7b 6d 65 74 68 6f 64 20 66  delete {method f
5520: 69 6c 65 6e 61 6d 65 20 61 72 67 73 7d 20 7b 0a  ilename args} {.
5530: 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6d 61    if {[string ma
5540: 74 63 68 20 2a 6a 6f 75 72 6e 61 6c 20 24 66 69  tch *journal $fi
5550: 6c 65 6e 61 6d 65 5d 7d 20 66 61 75 6c 74 73 69  lename]} faultsi
5560: 6d 5f 73 61 76 65 20 0a 20 20 72 65 74 75 72 6e  m_save .  return
5570: 20 53 51 4c 49 54 45 5f 4f 4b 0a 7d 0a 66 61 75   SQLITE_OK.}.fau
5580: 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64  ltsim_delete_and
5590: 5f 72 65 6f 70 65 6e 0a 64 6f 5f 65 78 65 63 73  _reopen.do_execs
55a0: 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34  ql_test pager1.4
55b0: 2e 35 2e 31 20 7b 0a 20 20 50 52 41 47 4d 41 20  .5.1 {.  PRAGMA 
55c0: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44  journal_mode = D
55d0: 45 4c 45 54 45 3b 0a 20 20 50 52 41 47 4d 41 20  ELETE;.  PRAGMA 
55e0: 70 61 67 65 5f 73 69 7a 65 20 3d 20 31 30 32 34  page_size = 1024
55f0: 3b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  ;.  CREATE TABLE
5600: 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 43 52 45   t1(a, b);.  CRE
5610: 41 54 45 20 54 41 42 4c 45 20 74 32 28 61 2c 20  ATE TABLE t2(a, 
5620: 62 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  b);.  INSERT INT
5630: 4f 20 74 31 20 56 41 4c 55 45 53 28 27 49 27 2c  O t1 VALUES('I',
5640: 20 27 49 49 27 29 3b 0a 20 20 49 4e 53 45 52 54   'II');.  INSERT
5650: 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28   INTO t2 VALUES(
5660: 27 49 49 49 27 2c 20 27 49 56 27 29 3b 0a 20 20  'III', 'IV');.  
5670: 42 45 47 49 4e 3b 0a 20 20 20 20 49 4e 53 45 52  BEGIN;.    INSER
5680: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
5690: 28 31 2c 20 32 29 3b 0a 20 20 20 20 49 4e 53 45  (1, 2);.    INSE
56a0: 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45  RT INTO t2 VALUE
56b0: 53 28 33 2c 20 34 29 3b 0a 20 20 43 4f 4d 4d 49  S(3, 4);.  COMMI
56c0: 54 3b 0a 7d 20 7b 64 65 6c 65 74 65 7d 0a 74 76  T;.} {delete}.tv
56d0: 20 66 69 6c 74 65 72 20 7b 7d 0a 0a 23 20 43 68   filter {}..# Ch
56e0: 65 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74  eck the transact
56f0: 69 6f 6e 20 77 61 73 20 63 6f 6d 6d 69 74 74 65  ion was committe
5700: 64 3a 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  d:.#.do_execsql_
5710: 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e 35 2e  test pager1.4.5.
5720: 32 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46  2 {.  SELECT * F
5730: 52 4f 4d 20 74 31 3b 0a 20 20 53 45 4c 45 43 54  ROM t1;.  SELECT
5740: 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 7d 20 7b 49   * FROM t2;.} {I
5750: 20 49 49 20 31 20 32 20 49 49 49 20 49 56 20 33   II 1 2 III IV 3
5760: 20 34 7d 0a 0a 23 20 4e 6f 77 20 74 72 79 20 66   4}..# Now try f
5770: 6f 75 72 20 74 65 73 74 73 3a 0a 23 0a 23 20 20  our tests:.#.#  
5780: 70 61 67 65 72 31 2d 34 2e 35 2e 33 3a 20 52 65  pager1-4.5.3: Re
5790: 73 74 6f 72 65 20 74 68 65 20 66 69 6c 65 2d 73  store the file-s
57a0: 79 73 74 65 6d 2e 20 43 68 65 63 6b 20 74 68 61  ystem. Check tha
57b0: 74 20 74 68 65 20 77 68 6f 6c 65 20 74 72 61 6e  t the whole tran
57c0: 73 61 63 74 69 6f 6e 20 0a 23 20 20 20 20 20 20  saction .#      
57d0: 20 20 20 20 20 20 20 20 20 20 69 73 20 72 6f 6c            is rol
57e0: 6c 65 64 20 62 61 63 6b 2e 0a 23 0a 23 20 20 70  led back..#.#  p
57f0: 61 67 65 72 31 2d 34 2e 35 2e 34 3a 20 52 65 73  ager1-4.5.4: Res
5800: 74 6f 72 65 20 74 68 65 20 66 69 6c 65 2d 73 79  tore the file-sy
5810: 73 74 65 6d 2e 20 43 6f 72 72 75 70 74 20 74 68  stem. Corrupt th
5820: 65 20 66 69 72 73 74 20 72 65 63 6f 72 64 20 69  e first record i
5830: 6e 20 74 68 65 0a 23 20 20 20 20 20 20 20 20 20  n the.#         
5840: 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 2e 20         journal. 
5850: 43 68 65 63 6b 20 74 68 65 20 74 72 61 6e 73 61  Check the transa
5860: 63 74 69 6f 6e 20 69 73 20 6e 6f 74 20 72 6f 6c  ction is not rol
5870: 6c 65 64 20 62 61 63 6b 2e 0a 23 0a 23 20 20 70  led back..#.#  p
5880: 61 67 65 72 31 2d 34 2e 35 2e 35 3a 20 52 65 73  ager1-4.5.5: Res
5890: 74 6f 72 65 20 74 68 65 20 66 69 6c 65 2d 73 79  tore the file-sy
58a0: 73 74 65 6d 2e 20 43 6f 72 72 75 70 74 20 74 68  stem. Corrupt th
58b0: 65 20 73 65 63 6f 6e 64 20 72 65 63 6f 72 64 20  e second record 
58c0: 69 6e 20 74 68 65 0a 23 20 20 20 20 20 20 20 20  in the.#        
58d0: 20 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 2e          journal.
58e0: 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   Check that the 
58f0: 66 69 72 73 74 20 72 65 63 6f 72 64 20 69 6e 20  first record in 
5900: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
5910: 69 73 20 0a 23 20 20 20 20 20 20 20 20 20 20 20  is .#           
5920: 20 20 20 20 20 70 6c 61 79 65 64 20 62 61 63 6b       played back
5930: 2c 20 62 75 74 20 6e 6f 74 20 74 68 65 20 73 65  , but not the se
5940: 63 6f 6e 64 2e 0a 23 0a 23 20 20 70 61 67 65 72  cond..#.#  pager
5950: 31 2d 34 2e 35 2e 36 3a 20 52 65 73 74 6f 72 65  1-4.5.6: Restore
5960: 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
5970: 2e 20 54 72 79 20 74 6f 20 6f 70 65 6e 20 74 68  . Try to open th
5980: 65 20 64 61 74 61 62 61 73 65 20 77 69 74 68 20  e database with 
5990: 61 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20  a.#             
59a0: 20 20 20 72 65 61 64 6f 6e 6c 79 20 63 6f 6e 6e     readonly conn
59b0: 65 63 74 69 6f 6e 2e 20 54 68 69 73 20 73 68 6f  ection. This sho
59c0: 75 6c 64 20 66 61 69 6c 2c 20 61 73 20 61 20 72  uld fail, as a r
59d0: 65 61 64 2d 6f 6e 6c 79 0a 23 20 20 20 20 20 20  ead-only.#      
59e0: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 6e 65 63            connec
59f0: 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 72 6f 6c 6c  tion cannot roll
5a00: 20 62 61 63 6b 20 74 68 65 20 64 61 74 61 62 61   back the databa
5a10: 73 65 20 66 69 6c 65 2e 0a 23 0a 66 61 75 6c 74  se file..#.fault
5a20: 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f  sim_restore_and_
5a30: 72 65 6f 70 65 6e 0a 64 6f 5f 65 78 65 63 73 71  reopen.do_execsq
5a40: 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e  l_test pager1.4.
5a50: 35 2e 33 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a  5.3 {.  SELECT *
5a60: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 53 45 4c 45   FROM t1;.  SELE
5a70: 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 7d 20  CT * FROM t2;.} 
5a80: 7b 49 20 49 49 20 49 49 49 20 49 56 7d 0a 66 61  {I II III IV}.fa
5a90: 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61  ultsim_restore_a
5aa0: 6e 64 5f 72 65 6f 70 65 6e 0a 68 65 78 69 6f 5f  nd_reopen.hexio_
5ab0: 77 72 69 74 65 20 74 65 73 74 2e 64 62 2d 6a 6f  write test.db-jo
5ac0: 75 72 6e 61 6c 20 5b 65 78 70 72 20 35 31 32 2b  urnal [expr 512+
5ad0: 34 2b 31 30 32 34 20 2d 20 32 30 32 5d 20 30 31  4+1024 - 202] 01
5ae0: 32 33 34 35 36 37 38 39 41 42 43 44 45 46 0a 64  23456789ABCDEF.d
5af0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70  o_execsql_test p
5b00: 61 67 65 72 31 2e 34 2e 35 2e 34 20 7b 0a 20 20  ager1.4.5.4 {.  
5b10: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
5b20: 3b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  ;.  SELECT * FRO
5b30: 4d 20 74 32 3b 0a 7d 20 7b 49 20 49 49 20 31 20  M t2;.} {I II 1 
5b40: 32 20 49 49 49 20 49 56 20 33 20 34 7d 0a 66 61  2 III IV 3 4}.fa
5b50: 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61  ultsim_restore_a
5b60: 6e 64 5f 72 65 6f 70 65 6e 0a 68 65 78 69 6f 5f  nd_reopen.hexio_
5b70: 77 72 69 74 65 20 74 65 73 74 2e 64 62 2d 6a 6f  write test.db-jo
5b80: 75 72 6e 61 6c 20 5b 65 78 70 72 20 35 31 32 2b  urnal [expr 512+
5b90: 34 2b 31 30 32 34 2b 34 2b 34 2b 31 30 32 34 20  4+1024+4+4+1024 
5ba0: 2d 20 32 30 32 5d 20 30 31 32 33 34 35 36 37 38  - 202] 012345678
5bb0: 39 41 42 43 44 45 46 0a 64 6f 5f 65 78 65 63 73  9ABCDEF.do_execs
5bc0: 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34  ql_test pager1.4
5bd0: 2e 35 2e 35 20 7b 0a 20 20 53 45 4c 45 43 54 20  .5.5 {.  SELECT 
5be0: 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 53 45 4c  * FROM t1;.  SEL
5bf0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 7d  ECT * FROM t2;.}
5c00: 20 7b 49 20 49 49 20 49 49 49 20 49 56 20 33 20   {I II III IV 3 
5c10: 34 7d 0a 0a 66 61 75 6c 74 73 69 6d 5f 72 65 73  4}..faultsim_res
5c20: 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a  tore_and_reopen.
5c30: 64 62 20 63 6c 6f 73 65 0a 73 71 6c 69 74 65 33  db close.sqlite3
5c40: 20 64 62 20 74 65 73 74 2e 64 62 20 2d 72 65 61   db test.db -rea
5c50: 64 6f 6e 6c 79 20 31 0a 64 6f 5f 63 61 74 63 68  donly 1.do_catch
5c60: 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2e  sql_test pager1.
5c70: 34 2e 35 2e 36 20 7b 0a 20 20 53 45 4c 45 43 54  4.5.6 {.  SELECT
5c80: 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 53 45   * FROM t1;.  SE
5c90: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a  LECT * FROM t2;.
5ca0: 7d 20 7b 31 20 7b 64 69 73 6b 20 49 2f 4f 20 65  } {1 {disk I/O e
5cb0: 72 72 6f 72 7d 7d 0a 64 62 20 63 6c 6f 73 65 0a  rror}}.db close.
5cc0: 0a 23 20 53 6e 61 70 73 68 6f 74 20 74 68 65 20  .# Snapshot the 
5cd0: 66 69 6c 65 2d 73 79 73 74 65 6d 20 6a 75 73 74  file-system just
5ce0: 20 62 65 66 6f 72 65 20 6d 75 6c 74 69 2d 66 69   before multi-fi
5cf0: 6c 65 20 63 6f 6d 6d 69 74 2e 20 53 61 76 65 20  le commit. Save 
5d00: 74 68 65 20 6e 61 6d 65 0a 23 20 6f 66 20 74 68  the name.# of th
5d10: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
5d20: 20 66 69 6c 65 20 69 6e 20 24 3a 3a 6d 6a 5f 66   file in $::mj_f
5d30: 69 6c 65 6e 61 6d 65 2e 0a 23 0a 74 76 20 73 63  ilename..#.tv sc
5d40: 72 69 70 74 20 63 6f 70 79 5f 6f 6e 5f 6d 6a 5f  ript copy_on_mj_
5d50: 64 65 6c 65 74 65 0a 74 76 20 66 69 6c 74 65 72  delete.tv filter
5d60: 20 78 44 65 6c 65 74 65 0a 70 72 6f 63 20 63 6f   xDelete.proc co
5d70: 70 79 5f 6f 6e 5f 6d 6a 5f 64 65 6c 65 74 65 20  py_on_mj_delete 
5d80: 7b 6d 65 74 68 6f 64 20 66 69 6c 65 6e 61 6d 65  {method filename
5d90: 20 61 72 67 73 7d 20 7b 0a 20 20 69 66 20 7b 5b   args} {.  if {[
5da0: 73 74 72 69 6e 67 20 6d 61 74 63 68 20 2a 6d 6a  string match *mj
5db0: 2a 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 66 69  * [file tail $fi
5dc0: 6c 65 6e 61 6d 65 5d 5d 7d 20 7b 20 0a 20 20 20  lename]]} { .   
5dd0: 20 73 65 74 20 3a 3a 6d 6a 5f 66 69 6c 65 6e 61   set ::mj_filena
5de0: 6d 65 20 24 66 69 6c 65 6e 61 6d 65 0a 20 20 20  me $filename.   
5df0: 20 66 61 75 6c 74 73 69 6d 5f 73 61 76 65 20 0a   faultsim_save .
5e00: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
5e10: 49 54 45 5f 4f 4b 0a 7d 0a 64 6f 5f 74 65 73 74  ITE_OK.}.do_test
5e20: 20 70 61 67 65 72 31 2e 34 2e 36 2e 31 20 7b 0a   pager1.4.6.1 {.
5e30: 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74    faultsim_delet
5e40: 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65  e_and_reopen.  e
5e50: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41  xecsql {.    PRA
5e60: 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
5e70: 20 3d 20 44 45 4c 45 54 45 3b 0a 20 20 20 20 41   = DELETE;.    A
5e80: 54 54 41 43 48 20 27 74 65 73 74 2e 64 62 32 27  TTACH 'test.db2'
5e90: 20 41 53 20 74 77 6f 3b 0a 20 20 20 20 43 52 45   AS two;.    CRE
5ea0: 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20  ATE TABLE t1(a, 
5eb0: 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  b);.    CREATE T
5ec0: 41 42 4c 45 20 74 77 6f 2e 74 32 28 61 2c 20 62  ABLE two.t2(a, b
5ed0: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
5ee0: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20  TO t1 VALUES(1, 
5ef0: 27 74 31 2e 31 27 29 3b 0a 20 20 20 20 49 4e 53  't1.1');.    INS
5f00: 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55  ERT INTO t2 VALU
5f10: 45 53 28 31 2c 20 27 74 32 2e 31 27 29 3b 0a 20  ES(1, 't2.1');. 
5f20: 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20     BEGIN;.      
5f30: 55 50 44 41 54 45 20 74 31 20 53 45 54 20 62 20  UPDATE t1 SET b 
5f40: 3d 20 27 74 31 2e 32 27 3b 0a 20 20 20 20 20 20  = 't1.2';.      
5f50: 55 50 44 41 54 45 20 74 32 20 53 45 54 20 62 20  UPDATE t2 SET b 
5f60: 3d 20 27 74 32 2e 32 27 3b 0a 20 20 20 20 43 4f  = 't2.2';.    CO
5f70: 4d 4d 49 54 3b 0a 20 20 7d 0a 20 20 74 76 20 66  MMIT;.  }.  tv f
5f80: 69 6c 74 65 72 20 7b 7d 0a 20 20 64 62 20 63 6c  ilter {}.  db cl
5f90: 6f 73 65 0a 7d 20 7b 7d 0a 0a 66 61 75 6c 74 73  ose.} {}..faults
5fa0: 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72  im_restore_and_r
5fb0: 65 6f 70 65 6e 0a 64 6f 5f 65 78 65 63 73 71 6c  eopen.do_execsql
5fc0: 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e 36  _test pager1.4.6
5fd0: 2e 32 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52  .2 { SELECT * FR
5fe0: 4f 4d 20 74 31 20 7d 20 20 20 20 20 20 20 20 20  OM t1 }         
5ff0: 20 20 7b 31 20 74 31 2e 31 7d 0a 64 6f 5f 74 65    {1 t1.1}.do_te
6000: 73 74 20 20 20 20 20 20 20 20 20 70 61 67 65 72  st         pager
6010: 31 2e 34 2e 36 2e 33 20 7b 20 66 69 6c 65 20 65  1.4.6.3 { file e
6020: 78 69 73 74 73 20 24 3a 3a 6d 6a 5f 66 69 6c 65  xists $::mj_file
6030: 6e 61 6d 65 20 7d 20 7b 31 7d 0a 64 6f 5f 65 78  name } {1}.do_ex
6040: 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72  ecsql_test pager
6050: 31 2e 34 2e 36 2e 34 20 7b 0a 20 20 41 54 54 41  1.4.6.4 {.  ATTA
6060: 43 48 20 27 74 65 73 74 2e 64 62 32 27 20 41 53  CH 'test.db2' AS
6070: 20 74 77 6f 3b 0a 20 20 53 45 4c 45 43 54 20 2a   two;.  SELECT *
6080: 20 46 52 4f 4d 20 74 32 3b 0a 7d 20 7b 31 20 74   FROM t2;.} {1 t
6090: 32 2e 31 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67  2.1}.do_test pag
60a0: 65 72 31 2e 34 2e 36 2e 35 20 7b 20 66 69 6c 65  er1.4.6.5 { file
60b0: 20 65 78 69 73 74 73 20 24 3a 3a 6d 6a 5f 66 69   exists $::mj_fi
60c0: 6c 65 6e 61 6d 65 20 7d 20 7b 30 7d 0a 0a 66 61  lename } {0}..fa
60d0: 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61  ultsim_restore_a
60e0: 6e 64 5f 72 65 6f 70 65 6e 0a 64 62 20 63 6c 6f  nd_reopen.db clo
60f0: 73 65 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  se.do_test pager
6100: 31 2e 34 2e 36 2e 38 20 7b 0a 20 20 73 65 74 20  1.4.6.8 {.  set 
6110: 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 31 20 24  ::mj_filename1 $
6120: 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 0a 20 20  ::mj_filename.  
6130: 74 76 20 66 69 6c 74 65 72 20 78 44 65 6c 65 74  tv filter xDelet
6140: 65 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 74  e.  sqlite3 db t
6150: 65 73 74 2e 64 62 32 0a 20 20 65 78 65 63 73 71  est.db2.  execsq
6160: 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a  l {.    PRAGMA j
6170: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45  ournal_mode = DE
6180: 4c 45 54 45 3b 0a 20 20 20 20 41 54 54 41 43 48  LETE;.    ATTACH
6190: 20 27 74 65 73 74 2e 64 62 33 27 20 41 53 20 74   'test.db3' AS t
61a0: 68 72 65 65 3b 0a 20 20 20 20 43 52 45 41 54 45  hree;.    CREATE
61b0: 20 54 41 42 4c 45 20 74 68 72 65 65 2e 74 33 28   TABLE three.t3(
61c0: 61 2c 20 62 29 3b 0a 20 20 20 20 49 4e 53 45 52  a, b);.    INSER
61d0: 54 20 49 4e 54 4f 20 74 33 20 56 41 4c 55 45 53  T INTO t3 VALUES
61e0: 28 31 2c 20 27 74 33 2e 31 27 29 3b 0a 20 20 20  (1, 't3.1');.   
61f0: 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 55 50   BEGIN;.      UP
6200: 44 41 54 45 20 74 32 20 53 45 54 20 62 20 3d 20  DATE t2 SET b = 
6210: 27 74 32 2e 33 27 3b 0a 20 20 20 20 20 20 55 50  't2.3';.      UP
6220: 44 41 54 45 20 74 33 20 53 45 54 20 62 20 3d 20  DATE t3 SET b = 
6230: 27 74 33 2e 33 27 3b 0a 20 20 20 20 43 4f 4d 4d  't3.3';.    COMM
6240: 49 54 3b 0a 20 20 7d 0a 20 20 65 78 70 72 20 7b  IT;.  }.  expr {
6250: 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 31 20  $::mj_filename1 
6260: 21 3d 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d  != $::mj_filenam
6270: 65 7d 0a 7d 20 7b 31 7d 0a 66 61 75 6c 74 73 69  e}.} {1}.faultsi
6280: 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65  m_restore_and_re
6290: 6f 70 65 6e 0a 74 76 20 66 69 6c 74 65 72 20 7b  open.tv filter {
62a0: 7d 0a 0a 23 20 54 68 65 20 66 69 6c 65 2d 73 79  }..# The file-sy
62b0: 73 74 65 6d 20 6e 6f 77 20 63 6f 6e 74 61 69 6e  stem now contain
62c0: 73 3a 0a 23 0a 23 20 20 20 2a 20 74 68 72 65 65  s:.#.#   * three
62d0: 20 64 61 74 61 62 61 73 65 73 0a 23 20 20 20 2a   databases.#   *
62e0: 20 74 68 72 65 65 20 68 6f 74 2d 6a 6f 75 72 6e   three hot-journ
62f0: 61 6c 20 66 69 6c 65 73 0a 23 20 20 20 2a 20 74  al files.#   * t
6300: 77 6f 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  wo master-journa
6310: 6c 20 66 69 6c 65 73 2e 0a 23 0a 23 20 54 68 65  l files..#.# The
6320: 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 73 20 61 73   hot-journals as
6330: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 65  sociated with te
6340: 73 74 2e 64 62 32 20 61 6e 64 20 74 65 73 74 2e  st.db2 and test.
6350: 64 62 33 20 70 6f 69 6e 74 20 74 6f 0a 23 20 6d  db3 point to.# m
6360: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 24 3a  aster journal $:
6370: 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 2e 20 54 68  :mj_filename. Th
6380: 65 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69  e hot-journal fi
6390: 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  le associated wi
63a0: 74 68 0a 23 20 74 65 73 74 2e 64 62 20 70 6f 69  th.# test.db poi
63b0: 6e 74 73 20 74 6f 20 6d 61 73 74 65 72 20 6a 6f  nts to master jo
63c0: 75 72 6e 61 6c 20 24 3a 3a 6d 6a 5f 66 69 6c 65  urnal $::mj_file
63d0: 6e 61 6d 65 31 2e 20 53 6f 20 72 65 61 64 69 6e  name1. So readin
63e0: 67 20 66 72 6f 6d 0a 23 20 74 65 73 74 2e 64 62  g from.# test.db
63f0: 20 73 68 6f 75 6c 64 20 64 65 6c 65 74 65 20 24   should delete $
6400: 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 31 2e 0a  ::mj_filename1..
6410: 23 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  #.do_test pager1
6420: 2e 34 2e 36 2e 39 20 7b 0a 20 20 6c 73 6f 72 74  .4.6.9 {.  lsort
6430: 20 5b 67 6c 6f 62 20 74 65 73 74 2e 64 62 2a 5d   [glob test.db*]
6440: 0a 7d 20 5b 6c 73 6f 72 74 20 5b 6c 69 73 74 20  .} [lsort [list 
6450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6470: 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 74 65            \.  te
6480: 73 74 2e 64 62 20 74 65 73 74 2e 64 62 32 20 74  st.db test.db2 t
6490: 65 73 74 2e 64 62 33 20 20 20 20 20 20 20 20 20  est.db3         
64a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
64b0: 20 20 20 20 20 5c 0a 20 20 74 65 73 74 2e 64 62       \.  test.db
64c0: 2d 6a 6f 75 72 6e 61 6c 20 74 65 73 74 2e 64 62  -journal test.db
64d0: 32 2d 6a 6f 75 72 6e 61 6c 20 74 65 73 74 2e 64  2-journal test.d
64e0: 62 33 2d 6a 6f 75 72 6e 61 6c 20 20 20 20 20 20  b3-journal      
64f0: 5c 0a 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24  \.  [file tail $
6500: 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 5d 20 5b  ::mj_filename] [
6510: 66 69 6c 65 20 74 61 69 6c 20 24 3a 3a 6d 6a 5f  file tail $::mj_
6520: 66 69 6c 65 6e 61 6d 65 31 5d 0a 5d 5d 0a 0a 23  filename1].]]..#
6530: 20 54 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72   The master-jour
6540: 6e 61 6c 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61  nal $::mj_filena
6550: 6d 65 31 20 63 6f 6e 74 61 69 6e 73 20 70 6f 69  me1 contains poi
6560: 6e 74 65 72 73 20 74 6f 20 74 65 73 74 2e 64 62  nters to test.db
6570: 20 61 6e 64 20 0a 23 20 74 65 73 74 2e 64 62 32   and .# test.db2
6580: 2e 20 48 6f 77 65 76 65 72 20 74 68 65 20 68 6f  . However the ho
6590: 74 2d 6a 6f 75 72 6e 61 6c 20 61 73 73 6f 63 69  t-journal associ
65a0: 61 74 65 64 20 77 69 74 68 20 74 65 73 74 2e 64  ated with test.d
65b0: 62 32 20 70 6f 69 6e 74 73 20 74 6f 0a 23 20 61  b2 points to.# a
65c0: 20 64 69 66 66 65 72 65 6e 74 20 6d 61 73 74 65   different maste
65d0: 72 2d 6a 6f 75 72 6e 61 6c 2e 20 54 68 65 72 65  r-journal. There
65e0: 66 6f 72 65 2c 20 72 65 61 64 69 6e 67 20 66 72  fore, reading fr
65f0: 6f 6d 20 74 65 73 74 2e 64 62 20 6f 6e 6c 79 20  om test.db only 
6600: 73 68 6f 75 6c 64 0a 23 20 62 65 20 65 6e 6f 75  should.# be enou
6610: 67 68 20 74 6f 20 63 61 75 73 65 20 53 51 4c 69  gh to cause SQLi
6620: 74 65 20 74 6f 20 64 65 6c 65 74 65 20 24 3a 3a  te to delete $::
6630: 6d 6a 5f 66 69 6c 65 6e 61 6d 65 31 2e 0a 23 0a  mj_filename1..#.
6640: 64 6f 5f 74 65 73 74 20 20 20 20 20 20 20 20 20  do_test         
6650: 70 61 67 65 72 31 2e 34 2e 36 2e 31 30 20 7b 20  pager1.4.6.10 { 
6660: 66 69 6c 65 20 65 78 69 73 74 73 20 24 3a 3a 6d  file exists $::m
6670: 6a 5f 66 69 6c 65 6e 61 6d 65 20 20 7d 20 7b 31  j_filename  } {1
6680: 7d 0a 64 6f 5f 74 65 73 74 20 20 20 20 20 20 20  }.do_test       
6690: 20 20 70 61 67 65 72 31 2e 34 2e 36 2e 31 31 20    pager1.4.6.11 
66a0: 7b 20 66 69 6c 65 20 65 78 69 73 74 73 20 24 3a  { file exists $:
66b0: 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 31 20 7d 20  :mj_filename1 } 
66c0: 7b 31 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  {1}.do_execsql_t
66d0: 65 73 74 20 70 61 67 65 72 31 2e 34 2e 36 2e 31  est pager1.4.6.1
66e0: 32 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  2 { SELECT * FRO
66f0: 4d 20 74 31 20 7d 20 7b 31 20 74 31 2e 31 7d 0a  M t1 } {1 t1.1}.
6700: 64 6f 5f 74 65 73 74 20 20 20 20 20 20 20 20 20  do_test         
6710: 70 61 67 65 72 31 2e 34 2e 36 2e 31 33 20 7b 20  pager1.4.6.13 { 
6720: 66 69 6c 65 20 65 78 69 73 74 73 20 24 3a 3a 6d  file exists $::m
6730: 6a 5f 66 69 6c 65 6e 61 6d 65 20 20 7d 20 7b 31  j_filename  } {1
6740: 7d 0a 64 6f 5f 74 65 73 74 20 20 20 20 20 20 20  }.do_test       
6750: 20 20 70 61 67 65 72 31 2e 34 2e 36 2e 31 34 20    pager1.4.6.14 
6760: 7b 20 66 69 6c 65 20 65 78 69 73 74 73 20 24 3a  { file exists $:
6770: 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 31 20 7d 20  :mj_filename1 } 
6780: 7b 30 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  {0}..do_execsql_
6790: 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e 36 2e  test pager1.4.6.
67a0: 31 32 20 7b 0a 20 20 41 54 54 41 43 48 20 27 74  12 {.  ATTACH 't
67b0: 65 73 74 2e 64 62 32 27 20 41 53 20 74 77 6f 3b  est.db2' AS two;
67c0: 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  .  SELECT * FROM
67d0: 20 74 32 3b 0a 7d 20 7b 31 20 74 32 2e 31 7d 0a   t2;.} {1 t2.1}.
67e0: 64 6f 5f 74 65 73 74 20 20 20 20 20 20 20 20 20  do_test         
67f0: 70 61 67 65 72 31 2e 34 2e 36 2e 31 33 20 7b 20  pager1.4.6.13 { 
6800: 66 69 6c 65 20 65 78 69 73 74 73 20 24 3a 3a 6d  file exists $::m
6810: 6a 5f 66 69 6c 65 6e 61 6d 65 20 7d 20 20 7b 31  j_filename }  {1
6820: 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  }.do_execsql_tes
6830: 74 20 70 61 67 65 72 31 2e 34 2e 36 2e 31 34 20  t pager1.4.6.14 
6840: 7b 0a 20 20 41 54 54 41 43 48 20 27 74 65 73 74  {.  ATTACH 'test
6850: 2e 64 62 33 27 20 41 53 20 74 68 72 65 65 3b 0a  .db3' AS three;.
6860: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
6870: 74 33 3b 0a 7d 20 7b 31 20 74 33 2e 31 7d 0a 64  t3;.} {1 t3.1}.d
6880: 6f 5f 74 65 73 74 20 20 20 20 20 20 20 20 20 70  o_test         p
6890: 61 67 65 72 31 2e 34 2e 36 2e 31 35 20 7b 20 66  ager1.4.6.15 { f
68a0: 69 6c 65 20 65 78 69 73 74 73 20 24 3a 3a 6d 6a  ile exists $::mj
68b0: 5f 66 69 6c 65 6e 61 6d 65 20 7d 20 20 7b 30 7d  _filename }  {0}
68c0: 0a 0a 64 62 20 63 6c 6f 73 65 0a 74 76 20 64 65  ..db close.tv de
68d0: 6c 65 74 65 0a 0a 74 65 73 74 76 66 73 20 74 76  lete..testvfs tv
68e0: 20 2d 64 65 66 61 75 6c 74 20 31 0a 74 76 20 73   -default 1.tv s
68f0: 65 63 74 6f 72 73 69 7a 65 20 35 31 32 0a 74 76  ectorsize 512.tv
6900: 20 73 63 72 69 70 74 20 63 6f 70 79 5f 6f 6e 5f   script copy_on_
6910: 6a 6f 75 72 6e 61 6c 5f 64 65 6c 65 74 65 0a 74  journal_delete.t
6920: 76 20 66 69 6c 74 65 72 20 78 44 65 6c 65 74 65  v filter xDelete
6930: 0a 70 72 6f 63 20 63 6f 70 79 5f 6f 6e 5f 6a 6f  .proc copy_on_jo
6940: 75 72 6e 61 6c 5f 64 65 6c 65 74 65 20 7b 6d 65  urnal_delete {me
6950: 74 68 6f 64 20 66 69 6c 65 6e 61 6d 65 20 61 72  thod filename ar
6960: 67 73 7d 20 7b 0a 20 20 69 66 20 7b 5b 73 74 72  gs} {.  if {[str
6970: 69 6e 67 20 6d 61 74 63 68 20 2a 6a 6f 75 72 6e  ing match *journ
6980: 61 6c 20 24 66 69 6c 65 6e 61 6d 65 5d 7d 20 66  al $filename]} f
6990: 61 75 6c 74 73 69 6d 5f 73 61 76 65 20 0a 20 20  aultsim_save .  
69a0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
69b0: 0a 7d 0a 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65  .}.faultsim_dele
69c0: 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 64 6f  te_and_reopen.do
69d0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61  _execsql_test pa
69e0: 67 65 72 31 2e 34 2e 37 2e 31 20 7b 0a 20 20 50  ger1.4.7.1 {.  P
69f0: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
6a00: 64 65 20 3d 20 44 45 4c 45 54 45 3b 0a 20 20 43  de = DELETE;.  C
6a10: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 78  REATE TABLE t1(x
6a20: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 79 29   PRIMARY KEY, y)
6a30: 3b 0a 20 20 43 52 45 41 54 45 20 49 4e 44 45 58  ;.  CREATE INDEX
6a40: 20 69 31 20 4f 4e 20 74 31 28 79 29 3b 0a 20 20   i1 ON t1(y);.  
6a50: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
6a60: 41 4c 55 45 53 28 27 49 27 2c 20 20 20 27 6f 6e  ALUES('I',   'on
6a70: 65 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e  e');.  INSERT IN
6a80: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27 49 49  TO t1 VALUES('II
6a90: 27 2c 20 20 27 66 6f 75 72 27 29 3b 0a 20 20 49  ',  'four');.  I
6aa0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
6ab0: 4c 55 45 53 28 27 49 49 49 27 2c 20 27 6e 69 6e  LUES('III', 'nin
6ac0: 65 27 29 3b 0a 20 20 42 45 47 49 4e 3b 0a 20 20  e');.  BEGIN;.  
6ad0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
6ae0: 20 56 41 4c 55 45 53 28 27 49 56 27 2c 20 27 73   VALUES('IV', 's
6af0: 69 78 74 65 65 6e 27 29 3b 0a 20 20 20 20 49 4e  ixteen');.    IN
6b00: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
6b10: 55 45 53 28 27 56 27 20 2c 20 27 74 77 65 6e 74  UES('V' , 'twent
6b20: 79 66 69 76 65 27 29 3b 0a 20 20 43 4f 4d 4d 49  yfive');.  COMMI
6b30: 54 3b 0a 7d 20 7b 64 65 6c 65 74 65 7d 0a 74 76  T;.} {delete}.tv
6b40: 20 66 69 6c 74 65 72 20 7b 7d 0a 64 62 20 63 6c   filter {}.db cl
6b50: 6f 73 65 0a 74 76 20 64 65 6c 65 74 65 20 0a 64  ose.tv delete .d
6b60: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e  o_test pager1.4.
6b70: 37 2e 32 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d  7.2 {.  faultsim
6b80: 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f  _restore_and_reo
6b90: 70 65 6e 0a 20 20 63 61 74 63 68 20 7b 66 69 6c  pen.  catch {fil
6ba0: 65 20 61 74 74 72 69 62 75 74 65 73 20 74 65 73  e attributes tes
6bb0: 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 2d 70 65  t.db-journal -pe
6bc0: 72 6d 69 73 73 69 6f 6e 73 20 72 2d 2d 2d 2d 2d  rmissions r-----
6bd0: 2d 2d 2d 7d 0a 20 20 63 61 74 63 68 20 7b 66 69  ---}.  catch {fi
6be0: 6c 65 20 61 74 74 72 69 62 75 74 65 73 20 74 65  le attributes te
6bf0: 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 2d 72  st.db-journal -r
6c00: 65 61 64 6f 6e 6c 79 20 31 7d 0a 20 20 63 61 74  eadonly 1}.  cat
6c10: 63 68 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a  chsql { SELECT *
6c20: 20 46 52 4f 4d 20 74 31 20 7d 0a 7d 20 7b 31 20   FROM t1 }.} {1 
6c30: 7b 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20  {unable to open 
6c40: 64 61 74 61 62 61 73 65 20 66 69 6c 65 7d 7d 0a  database file}}.
6c50: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34  do_test pager1.4
6c60: 2e 37 2e 33 20 7b 0a 20 20 64 62 20 63 6c 6f 73  .7.3 {.  db clos
6c70: 65 0a 20 20 63 61 74 63 68 20 7b 66 69 6c 65 20  e.  catch {file 
6c80: 61 74 74 72 69 62 75 74 65 73 20 74 65 73 74 2e  attributes test.
6c90: 64 62 2d 6a 6f 75 72 6e 61 6c 20 2d 70 65 72 6d  db-journal -perm
6ca0: 69 73 73 69 6f 6e 73 20 72 77 2d 72 77 2d 72 77  issions rw-rw-rw
6cb0: 2d 7d 0a 20 20 63 61 74 63 68 20 7b 66 69 6c 65  -}.  catch {file
6cc0: 20 61 74 74 72 69 62 75 74 65 73 20 74 65 73 74   attributes test
6cd0: 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 2d 72 65 61  .db-journal -rea
6ce0: 64 6f 6e 6c 79 20 30 7d 0a 20 20 66 69 6c 65 20  donly 0}.  file 
6cf0: 64 65 6c 65 74 65 20 74 65 73 74 2e 64 62 2d 6a  delete test.db-j
6d00: 6f 75 72 6e 61 6c 0a 20 20 66 69 6c 65 20 65 78  ournal.  file ex
6d10: 69 73 74 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75  ists test.db-jou
6d20: 72 6e 61 6c 0a 7d 20 7b 30 7d 0a 0a 23 2d 2d 2d  rnal.} {0}..#---
6d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6d70: 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 65 20 66 6f 6c  ------.# The fol
6d80: 6c 6f 77 69 6e 67 20 74 65 73 74 73 20 64 65 61  lowing tests dea
6d90: 6c 20 77 69 74 68 20 6d 75 6c 74 69 2d 66 69 6c  l with multi-fil
6da0: 65 20 63 6f 6d 6d 69 74 73 2e 0a 23 0a 23 20 70  e commits..#.# p
6db0: 61 67 65 72 31 2d 35 2e 31 2e 2a 3a 20 54 68 65  ager1-5.1.*: The
6dc0: 20 63 61 73 65 20 77 68 65 72 65 20 61 20 6d 75   case where a mu
6dd0: 6c 74 69 2d 66 69 6c 65 20 63 61 6e 6e 6f 74 20  lti-file cannot 
6de0: 62 65 20 63 6f 6d 6d 69 74 74 65 64 20 62 65 63  be committed bec
6df0: 61 75 73 65 0a 23 20 20 20 20 20 20 20 20 20 20  ause.#          
6e00: 20 20 20 20 20 61 6e 6f 74 68 65 72 20 63 6f 6e       another con
6e10: 6e 65 63 74 69 6f 6e 20 69 73 20 68 6f 6c 64 69  nection is holdi
6e20: 6e 67 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  ng a SHARED lock
6e30: 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 0a 23   on one of the.#
6e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
6e50: 69 6c 65 73 2e 20 41 66 74 65 72 20 74 68 65 20  iles. After the 
6e60: 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 73 20 72  SHARED lock is r
6e70: 65 6d 6f 76 65 64 2c 20 74 68 65 20 43 4f 4d 4d  emoved, the COMM
6e80: 49 54 20 73 75 63 63 65 65 64 73 2e 0a 23 0a 23  IT succeeds..#.#
6e90: 20 70 61 67 65 72 31 2d 35 2e 32 2e 2a 3a 20 4d   pager1-5.2.*: M
6ea0: 75 6c 74 69 2d 66 69 6c 65 20 63 6f 6d 6d 69 74  ulti-file commit
6eb0: 73 20 77 69 74 68 20 6a 6f 75 72 6e 61 6c 5f 6d  s with journal_m
6ec0: 6f 64 65 3d 6d 65 6d 6f 72 79 2e 0a 23 0a 23 20  ode=memory..#.# 
6ed0: 70 61 67 65 72 31 2d 35 2e 33 2e 2a 3a 20 4d 75  pager1-5.3.*: Mu
6ee0: 6c 74 69 2d 66 69 6c 65 20 63 6f 6d 6d 69 74 73  lti-file commits
6ef0: 20 77 69 74 68 20 6a 6f 75 72 6e 61 6c 5f 6d 6f   with journal_mo
6f00: 64 65 3d 6d 65 6d 6f 72 79 2e 0a 23 0a 23 20 70  de=memory..#.# p
6f10: 61 67 65 72 31 2d 35 2e 34 2e 2a 3a 20 43 68 65  ager1-5.4.*: Che
6f20: 63 6b 20 74 68 61 74 20 77 69 74 68 20 73 79 6e  ck that with syn
6f30: 63 68 72 6f 6e 6f 75 73 3d 6e 6f 72 6d 61 6c 2c  chronous=normal,
6f40: 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72   the master-jour
6f50: 6e 61 6c 20 66 69 6c 65 0a 23 20 20 20 20 20 20  nal file.#      
6f60: 20 20 20 20 20 20 20 20 20 6e 61 6d 65 20 69 73           name is
6f70: 20 61 64 64 65 64 20 74 6f 20 61 20 6a 6f 75 72   added to a jour
6f80: 6e 61 6c 20 66 69 6c 65 20 69 6d 6d 65 64 69 61  nal file immedia
6f90: 74 65 6c 79 20 61 66 74 65 72 20 74 68 65 20 6c  tely after the l
6fa0: 61 73 74 0a 23 20 20 20 20 20 20 20 20 20 20 20  ast.#           
6fb0: 20 20 20 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f      journal reco
6fc0: 72 64 2e 20 42 75 74 20 77 69 74 68 20 73 79 6e  rd. But with syn
6fd0: 63 68 72 6f 6e 6f 75 73 3d 66 75 6c 6c 2c 20 65  chronous=full, e
6fe0: 78 74 72 61 20 75 6e 75 73 65 64 20 73 70 61 63  xtra unused spac
6ff0: 65 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20  e.#             
7000: 20 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 62    is allocated b
7010: 65 74 77 65 65 6e 20 74 68 65 20 6c 61 73 74 20  etween the last 
7020: 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 61  journal record a
7030: 6e 64 20 74 68 65 20 0a 23 20 20 20 20 20 20 20  nd the .#       
7040: 20 20 20 20 20 20 20 20 6d 61 73 74 65 72 2d 6a          master-j
7050: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
7060: 20 73 6f 20 74 68 61 74 20 74 68 65 20 6d 61 73   so that the mas
7070: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter-journal file
7080: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
7090: 20 6e 61 6d 65 20 64 6f 65 73 20 6e 6f 74 20 6c   name does not l
70a0: 69 65 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 73  ie on the same s
70b0: 65 63 74 6f 72 20 61 73 20 74 68 65 20 6c 61 73  ector as the las
70c0: 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 23  t journal file.#
70d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
70e0: 65 63 6f 72 64 2e 0a 23 0a 23 20 70 61 67 65 72  ecord..#.# pager
70f0: 31 2d 35 2e 35 2e 2a 3a 20 43 68 65 63 6b 20 74  1-5.5.*: Check t
7100: 68 61 74 20 69 6e 20 6a 6f 75 72 6e 61 6c 5f 6d  hat in journal_m
7110: 6f 64 65 3d 50 45 52 53 49 53 54 20 6d 6f 64 65  ode=PERSIST mode
7120: 2c 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  , a journal file
7130: 20 69 73 0a 23 20 20 20 20 20 20 20 20 20 20 20   is.#           
7140: 20 20 20 20 74 72 75 6e 63 61 74 65 64 20 74 6f      truncated to
7150: 20 7a 65 72 6f 20 62 79 74 65 73 20 77 68 65 6e   zero bytes when
7160: 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 74 72   a multi-file tr
7170: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 0a 23 20  ansaction is .# 
7180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
7190: 6d 6d 69 74 74 65 64 20 28 69 6e 73 74 65 61 64  mmitted (instead
71a0: 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 63 6f   of the first co
71b0: 75 70 6c 65 20 6f 66 20 62 79 74 65 73 20 62 65  uple of bytes be
71c0: 69 6e 67 20 7a 65 72 6f 65 64 29 2e 0a 23 0a 23  ing zeroed)..#.#
71d0: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
71e0: 35 2e 31 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73  5.1.1 {.  faults
71f0: 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65  im_delete_and_re
7200: 6f 70 65 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b  open.  execsql {
7210: 0a 20 20 20 20 41 54 54 41 43 48 20 27 74 65 73  .    ATTACH 'tes
7220: 74 2e 64 62 32 27 20 41 53 20 61 75 78 3b 0a 20  t.db2' AS aux;. 
7230: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
7240: 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 43 52  t1(a, b);.    CR
7250: 45 41 54 45 20 54 41 42 4c 45 20 61 75 78 2e 74  EATE TABLE aux.t
7260: 32 28 61 2c 20 62 29 3b 0a 20 20 20 20 49 4e 53  2(a, b);.    INS
7270: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
7280: 45 53 28 31 37 2c 20 27 4c 65 6e 69 6e 27 29 3b  ES(17, 'Lenin');
7290: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
72a0: 20 74 31 20 56 41 4c 55 45 53 28 32 32 2c 20 27   t1 VALUES(22, '
72b0: 53 74 61 6c 69 6e 27 29 3b 0a 20 20 20 20 49 4e  Stalin');.    IN
72c0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
72d0: 55 45 53 28 35 33 2c 20 27 4b 68 72 75 73 68 63  UES(53, 'Khrushc
72e0: 68 65 76 27 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a  hev');.  }.} {}.
72f0: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 35  do_test pager1-5
7300: 2e 31 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c  .1.2 {.  execsql
7310: 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20   {.    BEGIN;.  
7320: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
7330: 74 31 20 56 41 4c 55 45 53 28 36 34 2c 20 27 42  t1 VALUES(64, 'B
7340: 72 65 7a 68 6e 65 76 27 29 3b 0a 20 20 20 20 20  rezhnev');.     
7350: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20   INSERT INTO t2 
7360: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
7370: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 20  ;.  }.  sqlite3 
7380: 64 62 32 20 74 65 73 74 2e 64 62 32 0a 20 20 65  db2 test.db2.  e
7390: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42 45 47  xecsql {.    BEG
73a0: 49 4e 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54  IN;.      SELECT
73b0: 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 20 20 7d 20   * FROM t2;.  } 
73c0: 64 62 32 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74  db2.} {}.do_test
73d0: 20 70 61 67 65 72 31 2d 35 2e 31 2e 33 20 7b 0a   pager1-5.1.3 {.
73e0: 20 20 63 61 74 63 68 73 71 6c 20 43 4f 4d 4d 49    catchsql COMMI
73f0: 54 0a 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65  T.} {1 {database
7400: 20 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 64 6f 5f   is locked}}.do_
7410: 74 65 73 74 20 70 61 67 65 72 31 2d 35 2e 31 2e  test pager1-5.1.
7420: 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 43 4f  4 {.  execsql CO
7430: 4d 4d 49 54 20 64 62 32 0a 20 20 65 78 65 63 73  MMIT db2.  execs
7440: 71 6c 20 43 4f 4d 4d 49 54 0a 20 20 65 78 65 63  ql COMMIT.  exec
7450: 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46  sql { SELECT * F
7460: 52 4f 4d 20 74 32 20 7d 20 64 62 32 0a 7d 20 7b  ROM t2 } db2.} {
7470: 31 37 20 4c 65 6e 69 6e 20 32 32 20 53 74 61 6c  17 Lenin 22 Stal
7480: 69 6e 20 35 33 20 4b 68 72 75 73 68 63 68 65 76  in 53 Khrushchev
7490: 20 36 34 20 42 72 65 7a 68 6e 65 76 7d 0a 64 6f   64 Brezhnev}.do
74a0: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 35 2e 31  _test pager1-5.1
74b0: 2e 35 20 7b 0a 20 20 64 62 32 20 63 6c 6f 73 65  .5 {.  db2 close
74c0: 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74 20 70  .} {}..do_test p
74d0: 61 67 65 72 31 2d 35 2e 32 2e 31 20 7b 0a 20 20  ager1-5.2.1 {.  
74e0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52  execsql {.    PR
74f0: 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
7500: 65 20 3d 20 6d 65 6d 6f 72 79 3b 0a 20 20 20 20  e = memory;.    
7510: 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 49 4e 53  BEGIN;.      INS
7520: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
7530: 45 53 28 38 34 2c 20 27 41 6e 64 72 6f 70 6f 76  ES(84, 'Andropov
7540: 27 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  ');.      INSERT
7550: 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28   INTO t2 VALUES(
7560: 38 34 2c 20 27 41 6e 64 72 6f 70 6f 76 27 29 3b  84, 'Andropov');
7570: 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d  .    COMMIT;.  }
7580: 0a 7d 20 7b 6d 65 6d 6f 72 79 7d 0a 64 6f 5f 74  .} {memory}.do_t
7590: 65 73 74 20 70 61 67 65 72 31 2d 35 2e 33 2e 31  est pager1-5.3.1
75a0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
75b0: 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61     PRAGMA journa
75c0: 6c 5f 6d 6f 64 65 20 3d 20 6f 66 66 3b 0a 20 20  l_mode = off;.  
75d0: 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 49    BEGIN;.      I
75e0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
75f0: 4c 55 45 53 28 38 35 2c 20 27 47 6f 72 62 61 63  LUES(85, 'Gorbac
7600: 68 65 76 27 29 3b 0a 20 20 20 20 20 20 49 4e 53  hev');.      INS
7610: 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55  ERT INTO t2 VALU
7620: 45 53 28 38 35 2c 20 27 47 6f 72 62 61 63 68 65  ES(85, 'Gorbache
7630: 76 27 29 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b  v');.    COMMIT;
7640: 0a 20 20 7d 0a 7d 20 7b 6f 66 66 7d 0a 0a 64 6f  .  }.} {off}..do
7650: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 35 2e 34  _test pager1-5.4
7660: 2e 31 20 7b 0a 20 20 64 62 20 63 6c 6f 73 65 0a  .1 {.  db close.
7670: 20 20 74 65 73 74 76 66 73 20 74 76 0a 20 20 73    testvfs tv.  s
7680: 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64  qlite3 db test.d
7690: 62 20 2d 76 66 73 20 74 76 0a 20 20 65 78 65 63  b -vfs tv.  exec
76a0: 73 71 6c 20 7b 20 41 54 54 41 43 48 20 27 74 65  sql { ATTACH 'te
76b0: 73 74 2e 64 62 32 27 20 41 53 20 61 75 78 20 7d  st.db2' AS aux }
76c0: 0a 0a 20 20 74 76 20 66 69 6c 74 65 72 20 78 44  ..  tv filter xD
76d0: 65 6c 65 74 65 0a 20 20 74 76 20 73 63 72 69 70  elete.  tv scrip
76e0: 74 20 6d 61 78 5f 6a 6f 75 72 6e 61 6c 5f 73 69  t max_journal_si
76f0: 7a 65 0a 20 20 74 76 20 73 65 63 74 6f 72 73 69  ze.  tv sectorsi
7700: 7a 65 20 35 31 32 0a 20 20 73 65 74 20 3a 3a 6d  ze 512.  set ::m
7710: 61 78 5f 6a 6f 75 72 6e 61 6c 20 30 0a 20 20 70  ax_journal 0.  p
7720: 72 6f 63 20 6d 61 78 5f 6a 6f 75 72 6e 61 6c 5f  roc max_journal_
7730: 73 69 7a 65 20 7b 6d 65 74 68 6f 64 20 61 72 67  size {method arg
7740: 73 7d 20 7b 0a 20 20 20 20 73 65 74 20 73 7a 20  s} {.    set sz 
7750: 30 0a 20 20 20 20 63 61 74 63 68 20 7b 20 73 65  0.    catch { se
7760: 74 20 73 7a 20 5b 66 69 6c 65 20 73 69 7a 65 20  t sz [file size 
7770: 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5d  test.db-journal]
7780: 20 7d 0a 20 20 20 20 69 66 20 7b 24 73 7a 20 3e   }.    if {$sz >
7790: 20 24 3a 3a 6d 61 78 5f 6a 6f 75 72 6e 61 6c 7d   $::max_journal}
77a0: 20 7b 0a 20 20 20 20 20 20 73 65 74 20 3a 3a 6d   {.      set ::m
77b0: 61 78 5f 6a 6f 75 72 6e 61 6c 20 24 73 7a 0a 20  ax_journal $sz. 
77c0: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
77d0: 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 7d 0a 20 20  SQLITE_OK.  }.  
77e0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52  execsql {.    PR
77f0: 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
7800: 65 20 3d 20 44 45 4c 45 54 45 3b 0a 20 20 20 20  e = DELETE;.    
7810: 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f  PRAGMA synchrono
7820: 75 73 20 3d 20 4e 4f 52 4d 41 4c 3b 0a 20 20 20  us = NORMAL;.   
7830: 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 49 4e   BEGIN;.      IN
7840: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
7850: 55 45 53 28 38 35 2c 20 27 47 6f 72 62 61 63 68  UES(85, 'Gorbach
7860: 65 76 27 29 3b 0a 20 20 20 20 20 20 49 4e 53 45  ev');.      INSE
7870: 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45  RT INTO t2 VALUE
7880: 53 28 38 35 2c 20 27 47 6f 72 62 61 63 68 65 76  S(85, 'Gorbachev
7890: 27 29 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a  ');.    COMMIT;.
78a0: 20 20 7d 0a 20 20 73 65 74 20 3a 3a 6d 61 78 5f    }.  set ::max_
78b0: 6a 6f 75 72 6e 61 6c 0a 7d 20 5b 65 78 70 72 20  journal.} [expr 
78c0: 32 36 31 35 2b 5b 73 74 72 69 6e 67 20 6c 65 6e  2615+[string len
78d0: 67 74 68 20 5b 70 77 64 5d 5d 5d 0a 64 6f 5f 74  gth [pwd]]].do_t
78e0: 65 73 74 20 70 61 67 65 72 31 2d 35 2e 34 2e 32  est pager1-5.4.2
78f0: 20 7b 0a 20 20 73 65 74 20 3a 3a 6d 61 78 5f 6a   {.  set ::max_j
7900: 6f 75 72 6e 61 6c 20 30 0a 20 20 65 78 65 63 73  ournal 0.  execs
7910: 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20  ql {.    PRAGMA 
7920: 73 79 6e 63 68 72 6f 6e 6f 75 73 20 3d 20 66 75  synchronous = fu
7930: 6c 6c 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20  ll;.    BEGIN;. 
7940: 20 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d       DELETE FROM
7950: 20 74 31 20 57 48 45 52 45 20 62 20 3d 20 27 4c   t1 WHERE b = 'L
7960: 65 6e 69 6e 27 3b 0a 20 20 20 20 20 20 44 45 4c  enin';.      DEL
7970: 45 54 45 20 46 52 4f 4d 20 74 32 20 57 48 45 52  ETE FROM t2 WHER
7980: 45 20 62 20 3d 20 27 4c 65 6e 69 6e 27 3b 0a 20  E b = 'Lenin';. 
7990: 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 20     COMMIT;.  }. 
79a0: 20 73 65 74 20 3a 3a 6d 61 78 5f 6a 6f 75 72 6e   set ::max_journ
79b0: 61 6c 0a 7d 20 5b 65 78 70 72 20 33 31 31 31 2b  al.} [expr 3111+
79c0: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 5b  [string length [
79d0: 70 77 64 5d 5d 5d 0a 64 62 20 63 6c 6f 73 65 0a  pwd]]].db close.
79e0: 74 76 20 64 65 6c 65 74 65 0a 0a 64 6f 5f 74 65  tv delete..do_te
79f0: 73 74 20 70 61 67 65 72 31 2d 35 2e 35 2e 31 20  st pager1-5.5.1 
7a00: 7b 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 74  {.  sqlite3 db t
7a10: 65 73 74 2e 64 62 0a 20 20 65 78 65 63 73 71 6c  est.db.  execsql
7a20: 20 7b 20 0a 20 20 20 20 41 54 54 41 43 48 20 27   { .    ATTACH '
7a30: 74 65 73 74 2e 64 62 32 27 20 41 53 20 61 75 78  test.db2' AS aux
7a40: 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75  ;.    PRAGMA jou
7a50: 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 50 45 52 53  rnal_mode = PERS
7a60: 49 53 54 3b 0a 20 20 20 20 43 52 45 41 54 45 20  IST;.    CREATE 
7a70: 54 41 42 4c 45 20 74 33 28 61 2c 20 62 29 3b 0a  TABLE t3(a, b);.
7a80: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
7a90: 74 33 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d  t3 SELECT random
7aa0: 62 6c 6f 62 28 31 35 30 30 29 2c 20 72 61 6e 64  blob(1500), rand
7ab0: 6f 6d 62 6c 6f 62 28 31 35 30 30 29 20 46 52 4f  omblob(1500) FRO
7ac0: 4d 20 74 31 3b 0a 20 20 20 20 55 50 44 41 54 45  M t1;.    UPDATE
7ad0: 20 74 33 20 53 45 54 20 62 20 3d 20 72 61 6e 64   t3 SET b = rand
7ae0: 6f 6d 62 6c 6f 62 28 31 35 30 30 29 3b 0a 20 20  omblob(1500);.  
7af0: 7d 0a 20 20 65 78 70 72 20 5b 66 69 6c 65 20 73  }.  expr [file s
7b00: 69 7a 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72  ize test.db-jour
7b10: 6e 61 6c 5d 20 3e 20 31 35 30 30 30 0a 7d 20 7b  nal] > 15000.} {
7b20: 31 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  1}.do_test pager
7b30: 31 2d 35 2e 35 2e 32 20 7b 0a 20 20 65 78 65 63  1-5.5.2 {.  exec
7b40: 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41  sql {.    PRAGMA
7b50: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 3d 20 66   synchronous = f
7b60: 75 6c 6c 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a  ull;.    BEGIN;.
7b70: 20 20 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f        DELETE FRO
7b80: 4d 20 74 31 20 57 48 45 52 45 20 62 20 3d 20 27  M t1 WHERE b = '
7b90: 53 74 61 6c 69 6e 27 3b 0a 20 20 20 20 20 20 44  Stalin';.      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 53 74 61 6c 69 6e 27  ERE b = 'Stalin'
7bc0: 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20  ;.    COMMIT;.  
7bd0: 7d 0a 20 20 66 69 6c 65 20 73 69 7a 65 20 74 65  }.  file size te
7be0: 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 7d 20  st.db-journal.} 
7bf0: 7b 30 7d 0a 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  {0}...#---------
7c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7c10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7c20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7c30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7c40: 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .# The following
7c50: 20 74 65 73 74 73 20 77 6f 72 6b 20 77 69 74 68   tests work with
7c60: 20 22 50 52 41 47 4d 41 20 6d 61 78 5f 70 61 67   "PRAGMA max_pag
7c70: 65 5f 63 6f 75 6e 74 22 0a 23 0a 64 6f 5f 74 65  e_count".#.do_te
7c80: 73 74 20 70 61 67 65 72 31 2d 36 2e 31 20 7b 0a  st pager1-6.1 {.
7c90: 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74    faultsim_delet
7ca0: 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65  e_and_reopen.  e
7cb0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41  xecsql {.    PRA
7cc0: 47 4d 41 20 61 75 74 6f 5f 76 61 63 75 75 6d 20  GMA auto_vacuum 
7cd0: 3d 20 6e 6f 6e 65 3b 0a 20 20 20 20 50 52 41 47  = none;.    PRAG
7ce0: 4d 41 20 6d 61 78 5f 70 61 67 65 5f 63 6f 75 6e  MA max_page_coun
7cf0: 74 20 3d 20 31 30 3b 0a 20 20 20 20 43 52 45 41  t = 10;.    CREA
7d00: 54 45 20 54 41 42 4c 45 20 74 32 28 61 2c 20 62  TE TABLE t2(a, b
7d10: 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  );.    CREATE TA
7d20: 42 4c 45 20 74 33 28 61 2c 20 62 29 3b 0a 20 20  BLE t3(a, b);.  
7d30: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
7d40: 34 28 61 2c 20 62 29 3b 0a 20 20 20 20 43 52 45  4(a, b);.    CRE
7d50: 41 54 45 20 54 41 42 4c 45 20 74 35 28 61 2c 20  ATE TABLE t5(a, 
7d60: 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  b);.    CREATE T
7d70: 41 42 4c 45 20 74 36 28 61 2c 20 62 29 3b 0a 20  ABLE t6(a, b);. 
7d80: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
7d90: 74 37 28 61 2c 20 62 29 3b 0a 20 20 20 20 43 52  t7(a, b);.    CR
7da0: 45 41 54 45 20 54 41 42 4c 45 20 74 38 28 61 2c  EATE TABLE t8(a,
7db0: 20 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20   b);.    CREATE 
7dc0: 54 41 42 4c 45 20 74 39 28 61 2c 20 62 29 3b 0a  TABLE t9(a, b);.
7dd0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
7de0: 20 74 31 30 28 61 2c 20 62 29 3b 0a 20 20 7d 0a   t10(a, b);.  }.
7df0: 7d 20 7b 31 30 7d 0a 64 6f 5f 63 61 74 63 68 73  } {10}.do_catchs
7e00: 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 36  ql_test pager1-6
7e10: 2e 32 20 7b 0a 20 20 43 52 45 41 54 45 20 54 41  .2 {.  CREATE TA
7e20: 42 4c 45 20 74 31 31 28 61 2c 20 62 29 0a 7d 20  BLE t11(a, b).} 
7e30: 7b 31 20 7b 64 61 74 61 62 61 73 65 20 6f 72 20  {1 {database or 
7e40: 64 69 73 6b 20 69 73 20 66 75 6c 6c 7d 7d 0a 64  disk is full}}.d
7e50: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70  o_execsql_test p
7e60: 61 67 65 72 31 2d 36 2e 34 20 7b 20 50 52 41 47  ager1-6.4 { PRAG
7e70: 4d 41 20 6d 61 78 5f 70 61 67 65 5f 63 6f 75 6e  MA max_page_coun
7e80: 74 20 20 20 20 20 20 7d 20 7b 31 30 7d 0a 64 6f  t      } {10}.do
7e90: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61  _execsql_test pa
7ea0: 67 65 72 31 2d 36 2e 35 20 7b 20 50 52 41 47 4d  ger1-6.5 { PRAGM
7eb0: 41 20 6d 61 78 5f 70 61 67 65 5f 63 6f 75 6e 74  A max_page_count
7ec0: 20 3d 20 31 35 20 7d 20 7b 31 35 7d 0a 64 6f 5f   = 15 } {15}.do_
7ed0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67  execsql_test pag
7ee0: 65 72 31 2d 36 2e 36 20 7b 20 43 52 45 41 54 45  er1-6.6 { CREATE
7ef0: 20 54 41 42 4c 45 20 74 31 31 28 61 2c 20 62 29   TABLE t11(a, b)
7f00: 20 20 20 20 20 7d 20 7b 7d 0a 64 6f 5f 65 78 65       } {}.do_exe
7f10: 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31  csql_test pager1
7f20: 2d 36 2e 37 20 7b 0a 20 20 42 45 47 49 4e 3b 0a  -6.7 {.  BEGIN;.
7f30: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
7f40: 74 31 31 20 56 41 4c 55 45 53 28 31 2c 20 32 29  t11 VALUES(1, 2)
7f50: 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 6d 61 78  ;.    PRAGMA max
7f60: 5f 70 61 67 65 5f 63 6f 75 6e 74 20 3d 20 31 33  _page_count = 13
7f70: 3b 0a 7d 20 7b 31 33 7d 0a 64 6f 5f 65 78 65 63  ;.} {13}.do_exec
7f80: 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d  sql_test pager1-
7f90: 36 2e 38 20 7b 0a 20 20 20 20 49 4e 53 45 52 54  6.8 {.    INSERT
7fa0: 20 49 4e 54 4f 20 74 31 31 20 56 41 4c 55 45 53   INTO t11 VALUES
7fb0: 28 33 2c 20 34 29 3b 0a 20 20 20 20 50 52 41 47  (3, 4);.    PRAG
7fc0: 4d 41 20 6d 61 78 5f 70 61 67 65 5f 63 6f 75 6e  MA max_page_coun
7fd0: 74 20 3d 20 31 30 3b 0a 7d 20 7b 31 31 7d 0a 64  t = 10;.} {11}.d
7fe0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70  o_execsql_test p
7ff0: 61 67 65 72 31 2d 36 2e 39 20 7b 20 43 4f 4d 4d  ager1-6.9 { COMM
8000: 49 54 20 7d 20 7b 7d 0a 0a 0a 23 2d 2d 2d 2d 2d  IT } {}...#-----
8010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8050: 2d 2d 2d 2d 0a 23 20 54 68 65 20 66 6f 6c 6c 6f  ----.# The follo
8060: 77 69 6e 67 20 74 65 73 74 73 20 77 6f 72 6b 20  wing tests work 
8070: 77 69 74 68 20 22 50 52 41 47 4d 41 20 6a 6f 75  with "PRAGMA jou
8080: 72 6e 61 6c 5f 6d 6f 64 65 3d 54 52 55 4e 43 41  rnal_mode=TRUNCA
8090: 54 45 22 20 61 6e 64 0a 23 20 22 50 52 41 47 4d  TE" and.# "PRAGM
80a0: 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45  A locking_mode=E
80b0: 58 43 4c 55 53 49 56 45 22 2e 0a 23 0a 23 20 45  XCLUSIVE"..#.# E
80c0: 61 63 68 20 74 65 73 74 20 69 73 20 73 70 65 63  ach test is spec
80d0: 69 66 69 65 64 20 77 69 74 68 20 35 20 76 61 72  ified with 5 var
80e0: 69 61 62 6c 65 73 2e 20 41 73 20 66 6f 6c 6c 6f  iables. As follo
80f0: 77 73 3a 0a 23 0a 23 20 20 20 24 74 6e 3a 20 20  ws:.#.#   $tn:  
8100: 54 65 73 74 20 4e 75 6d 62 65 72 2e 20 55 73 65  Test Number. Use
8110: 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65  d as part of the
8120: 20 5b 64 6f 5f 74 65 73 74 5d 20 74 65 73 74 20   [do_test] test 
8130: 6e 61 6d 65 73 2e 0a 23 20 20 20 24 73 71 6c 3a  names..#   $sql:
8140: 20 53 51 4c 20 74 6f 20 65 78 65 63 75 74 65 2e   SQL to execute.
8150: 0a 23 20 20 20 24 72 65 73 3a 20 45 78 70 65 63  .#   $res: Expec
8160: 74 65 64 20 72 65 73 75 6c 74 20 6f 66 20 65 78  ted result of ex
8170: 65 63 75 74 69 6e 67 20 24 73 71 6c 2e 0a 23 20  ecuting $sql..# 
8180: 20 20 24 6a 73 3a 20 20 54 68 65 20 65 78 70 65    $js:  The expe
8190: 63 74 65 64 20 73 69 7a 65 20 6f 66 20 74 68 65  cted size of the
81a0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 69   journal file, i
81b0: 6e 20 62 79 74 65 73 2c 20 61 66 74 65 72 20 65  n bytes, after e
81c0: 78 65 63 75 74 69 6e 67 0a 23 20 20 20 20 20 20  xecuting.#      
81d0: 20 20 20 74 68 65 20 53 51 4c 20 73 63 72 69 70     the SQL scrip
81e0: 74 2e 20 4f 72 20 2d 31 20 69 66 20 74 68 65 20  t. Or -1 if the 
81f0: 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 65  journal is not e
8200: 78 70 65 63 74 65 64 20 74 6f 20 65 78 69 73 74  xpected to exist
8210: 2e 0a 23 20 20 20 24 77 73 3a 20 20 54 68 65 20  ..#   $ws:  The 
8220: 65 78 70 65 63 74 65 64 20 73 69 7a 65 20 6f 66  expected size of
8230: 20 74 68 65 20 57 41 4c 20 66 69 6c 65 2c 20 69   the WAL file, i
8240: 6e 20 62 79 74 65 73 2c 20 61 66 74 65 72 20 65  n bytes, after e
8250: 78 65 63 75 74 69 6e 67 0a 23 20 20 20 20 20 20  xecuting.#      
8260: 20 20 20 74 68 65 20 53 51 4c 20 73 63 72 69 70     the SQL scrip
8270: 74 2e 20 4f 72 20 2d 31 20 69 66 20 74 68 65 20  t. Or -1 if the 
8280: 57 41 4c 20 69 73 20 6e 6f 74 20 65 78 70 65 63  WAL is not expec
8290: 74 65 64 20 74 6f 20 65 78 69 73 74 2e 0a 23 0a  ted to exist..#.
82a0: 69 66 63 61 70 61 62 6c 65 20 77 61 6c 20 7b 0a  ifcapable wal {.
82b0: 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74    faultsim_delet
82c0: 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 66  e_and_reopen.  f
82d0: 6f 72 65 61 63 68 20 7b 74 6e 20 73 71 6c 20 72  oreach {tn sql r
82e0: 65 73 20 6a 73 20 77 73 7d 20 5b 73 75 62 73 74  es js ws} [subst
82f0: 20 7b 0a 20 20 0a 20 20 20 20 31 20 20 7b 0a 20   {.  .    1  {. 
8300: 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c       CREATE TABL
8310: 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20  E t1(a, b);.    
8320: 20 20 50 52 41 47 4d 41 20 61 75 74 6f 5f 76 61    PRAGMA auto_va
8330: 63 75 75 6d 3d 4f 46 46 3b 0a 20 20 20 20 20 20  cuum=OFF;.      
8340: 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f  PRAGMA synchrono
8350: 75 73 3d 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 20  us=NORMAL;.     
8360: 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a   PRAGMA page_siz
8370: 65 3d 31 30 32 34 3b 0a 20 20 20 20 20 20 50 52  e=1024;.      PR
8380: 41 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64  AGMA locking_mod
8390: 65 3d 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20  e=EXCLUSIVE;.   
83a0: 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61     PRAGMA journa
83b0: 6c 5f 6d 6f 64 65 3d 54 52 55 4e 43 41 54 45 3b  l_mode=TRUNCATE;
83c0: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
83d0: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20  TO t1 VALUES(1, 
83e0: 32 29 3b 0a 20 20 20 20 7d 20 7b 65 78 63 6c 75  2);.    } {exclu
83f0: 73 69 76 65 20 74 72 75 6e 63 61 74 65 7d 20 30  sive truncate} 0
8400: 20 2d 31 0a 20 20 0a 20 20 20 20 32 20 20 7b 0a   -1.  .    2  {.
8410: 20 20 20 20 20 20 42 45 47 49 4e 20 49 4d 4d 45        BEGIN IMME
8420: 44 49 41 54 45 3b 0a 20 20 20 20 20 20 20 20 53  DIATE;.        S
8430: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b  ELECT * FROM t1;
8440: 0a 20 20 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20  .      COMMIT;. 
8450: 20 20 20 7d 20 7b 31 20 32 7d 20 30 20 2d 31 0a     } {1 2} 0 -1.
8460: 20 20 0a 20 20 20 20 33 20 20 7b 0a 20 20 20 20    .    3  {.    
8470: 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 20    BEGIN;.       
8480: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
8490: 31 3b 0a 20 20 20 20 20 20 43 4f 4d 4d 49 54 3b  1;.      COMMIT;
84a0: 0a 20 20 20 20 7d 20 7b 31 20 32 7d 20 30 20 2d  .    } {1 2} 0 -
84b0: 31 0a 20 20 0a 20 20 20 20 34 20 20 7b 20 50 52  1.  .    4  { PR
84c0: 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
84d0: 65 20 3d 20 57 41 4c 20 7d 20 20 20 20 77 61 6c  e = WAL }    wal
84e0: 20 20 20 20 2d 31 20 2d 31 0a 20 20 20 20 35 20      -1 -1.    5 
84f0: 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74   { INSERT INTO t
8500: 31 20 56 41 4c 55 45 53 28 33 2c 20 34 29 20 7d  1 VALUES(3, 4) }
8510: 20 20 7b 7d 20 20 20 20 20 2d 31 20 5b 77 61 6c    {}     -1 [wal
8520: 5f 66 69 6c 65 5f 73 69 7a 65 20 31 20 31 30 32  _file_size 1 102
8530: 34 5d 0a 20 20 20 20 36 20 20 7b 20 50 52 41 47  4].    6  { PRAG
8540: 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 20  MA locking_mode 
8550: 3d 20 4e 4f 52 4d 41 4c 20 7d 20 6e 6f 72 6d 61  = NORMAL } norma
8560: 6c 20 2d 31 20 5b 77 61 6c 5f 66 69 6c 65 5f 73  l -1 [wal_file_s
8570: 69 7a 65 20 31 20 31 30 32 34 5d 0a 20 20 20 20  ize 1 1024].    
8580: 37 20 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f  7  { INSERT INTO
8590: 20 74 31 20 56 41 4c 55 45 53 28 35 2c 20 36 29   t1 VALUES(5, 6)
85a0: 3b 20 7d 20 7b 7d 20 20 20 20 20 2d 31 20 5b 77  ; } {}     -1 [w
85b0: 61 6c 5f 66 69 6c 65 5f 73 69 7a 65 20 32 20 31  al_file_size 2 1
85c0: 30 32 34 5d 0a 20 20 0a 20 20 20 20 38 20 20 7b  024].  .    8  {
85d0: 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f   PRAGMA journal_
85e0: 6d 6f 64 65 20 3d 20 54 52 55 4e 43 41 54 45 20  mode = TRUNCATE 
85f0: 7d 20 74 72 75 6e 63 61 74 65 20 20 20 20 20 20  } truncate      
8600: 20 20 20 20 30 20 2d 31 0a 20 20 20 20 39 20 20      0 -1.    9  
8610: 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31  { INSERT INTO t1
8620: 20 56 41 4c 55 45 53 28 37 2c 20 38 29 20 7d 20   VALUES(7, 8) } 
8630: 20 20 20 7b 7d 20 20 20 20 20 20 20 20 20 20 20     {}           
8640: 20 20 20 20 20 30 20 2d 31 0a 20 20 20 20 31 30       0 -1.    10
8650: 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d   { SELECT * FROM
8660: 20 74 31 20 7d 20 20 20 20 20 20 20 20 20 20 20   t1 }           
8670: 20 20 20 20 7b 31 20 32 20 33 20 34 20 35 20 36      {1 2 3 4 5 6
8680: 20 37 20 38 7d 20 30 20 2d 31 0a 20 20 0a 20 20   7 8} 0 -1.  .  
8690: 7d 5d 20 7b 0a 20 20 20 20 64 6f 5f 65 78 65 63  }] {.    do_exec
86a0: 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d  sql_test pager1-
86b0: 37 2e 31 2e 24 74 6e 2e 31 20 24 73 71 6c 20 24  7.1.$tn.1 $sql $
86c0: 72 65 73 0a 20 20 20 20 63 61 74 63 68 20 7b 20  res.    catch { 
86d0: 73 65 74 20 4a 20 2d 31 20 3b 20 73 65 74 20 4a  set J -1 ; set J
86e0: 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74   [file size test
86f0: 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5d 20 7d 0a 20  .db-journal] }. 
8700: 20 20 20 63 61 74 63 68 20 7b 20 73 65 74 20 57     catch { set W
8710: 20 2d 31 20 3b 20 73 65 74 20 57 20 5b 66 69 6c   -1 ; set W [fil
8720: 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 2d 77  e size test.db-w
8730: 61 6c 5d 20 7d 0a 20 20 20 20 64 6f 5f 74 65 73  al] }.    do_tes
8740: 74 20 70 61 67 65 72 31 2d 37 2e 31 2e 24 74 6e  t pager1-7.1.$tn
8750: 2e 32 20 7b 20 6c 69 73 74 20 24 4a 20 24 57 20  .2 { list $J $W 
8760: 7d 20 5b 6c 69 73 74 20 24 6a 73 20 24 77 73 5d  } [list $js $ws]
8770: 0a 20 20 7d 0a 7d 0a 0a 64 6f 5f 74 65 73 74 20  .  }.}..do_test 
8780: 70 61 67 65 72 31 2d 37 2e 32 2e 31 20 7b 0a 20  pager1-7.2.1 {. 
8790: 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65   faultsim_delete
87a0: 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78  _and_reopen.  ex
87b0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47  ecsql {.    PRAG
87c0: 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 20  MA locking_mode 
87d0: 3d 20 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20  = EXCLUSIVE;.   
87e0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
87f0: 28 61 2c 20 62 29 3b 0a 20 20 20 20 42 45 47 49  (a, b);.    BEGI
8800: 4e 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20  N;.      PRAGMA 
8810: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 64  journal_mode = d
8820: 65 6c 65 74 65 3b 0a 20 20 20 20 20 20 50 52 41  elete;.      PRA
8830: 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
8840: 20 3d 20 74 72 75 6e 63 61 74 65 3b 0a 20 20 7d   = truncate;.  }
8850: 0a 7d 20 7b 65 78 63 6c 75 73 69 76 65 20 64 65  .} {exclusive de
8860: 6c 65 74 65 20 74 72 75 6e 63 61 74 65 7d 0a 64  lete truncate}.d
8870: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 37 2e  o_test pager1-7.
8880: 32 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  2.2 {.  execsql 
8890: 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31  { INSERT INTO t1
88a0: 20 56 41 4c 55 45 53 28 31 2c 20 32 29 20 7d 0a   VALUES(1, 2) }.
88b0: 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47    execsql { PRAG
88c0: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  MA journal_mode 
88d0: 3d 20 70 65 72 73 69 73 74 20 7d 0a 7d 20 7b 74  = persist }.} {t
88e0: 72 75 6e 63 61 74 65 7d 0a 64 6f 5f 74 65 73 74  runcate}.do_test
88f0: 20 70 61 67 65 72 31 2d 37 2e 32 2e 33 20 7b 0a   pager1-7.2.3 {.
8900: 20 20 65 78 65 63 73 71 6c 20 7b 20 43 4f 4d 4d    execsql { COMM
8910: 49 54 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b  IT }.  execsql {
8920: 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72  .    PRAGMA jour
8930: 6e 61 6c 5f 6d 6f 64 65 20 3d 20 70 65 72 73 69  nal_mode = persi
8940: 73 74 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a  st;.    PRAGMA j
8950: 6f 75 72 6e 61 6c 5f 73 69 7a 65 5f 6c 69 6d 69  ournal_size_limi
8960: 74 3b 0a 20 20 7d 0a 7d 20 7b 70 65 72 73 69 73  t;.  }.} {persis
8970: 74 20 2d 31 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  t -1}..#--------
8980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
89a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
89b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
89c0: 2d 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  -.# The followin
89d0: 67 20 74 65 73 74 73 2c 20 70 61 67 65 72 31 2d  g tests, pager1-
89e0: 38 2e 2a 2c 20 74 65 73 74 20 74 68 61 74 20 74  8.*, test that t
89f0: 68 65 20 73 70 65 63 69 61 6c 20 66 69 6c 65 6e  he special filen
8a00: 61 6d 65 73 20 0a 23 20 22 3a 6d 65 6d 6f 72 79  ames .# ":memory
8a10: 3a 22 20 61 6e 64 20 22 22 20 6f 70 65 6e 20 74  :" and "" open t
8a20: 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73  emporary databas
8a30: 65 73 2e 0a 23 0a 66 6f 72 65 61 63 68 20 7b 74  es..#.foreach {t
8a40: 6e 20 66 69 6c 65 6e 61 6d 65 7d 20 7b 0a 20 20  n filename} {.  
8a50: 31 20 3a 6d 65 6d 6f 72 79 3a 0a 20 20 32 20 22  1 :memory:.  2 "
8a60: 22 0a 7d 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20  ".} {.  do_test 
8a70: 70 61 67 65 72 31 2d 38 2e 24 74 6e 2e 31 20 7b  pager1-8.$tn.1 {
8a80: 0a 20 20 20 20 66 61 75 6c 74 73 69 6d 5f 64 65  .    faultsim_de
8a90: 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a  lete_and_reopen.
8aa0: 20 20 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 20      db close.   
8ab0: 20 73 71 6c 69 74 65 33 20 64 62 20 24 66 69 6c   sqlite3 db $fil
8ac0: 65 6e 61 6d 65 0a 20 20 20 20 65 78 65 63 73 71  ename.    execsq
8ad0: 6c 20 7b 0a 20 20 20 20 20 20 50 52 41 47 4d 41  l {.      PRAGMA
8ae0: 20 61 75 74 6f 5f 76 61 63 75 75 6d 20 3d 20 31   auto_vacuum = 1
8af0: 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45 20 54  ;.      CREATE T
8b00: 41 42 4c 45 20 78 31 28 78 29 3b 0a 20 20 20 20  ABLE x1(x);.    
8b10: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 31    INSERT INTO x1
8b20: 20 56 41 4c 55 45 53 28 27 43 68 61 72 6c 65 73   VALUES('Charles
8b30: 27 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  ');.      INSERT
8b40: 20 49 4e 54 4f 20 78 31 20 56 41 4c 55 45 53 28   INTO x1 VALUES(
8b50: 27 4a 61 6d 65 73 27 29 3b 0a 20 20 20 20 20 20  'James');.      
8b60: 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 31 20 56  INSERT INTO x1 V
8b70: 41 4c 55 45 53 28 27 4d 61 72 79 27 29 3b 0a 20  ALUES('Mary');. 
8b80: 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52       SELECT * FR
8b90: 4f 4d 20 78 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  OM x1;.    }.  }
8ba0: 20 7b 43 68 61 72 6c 65 73 20 4a 61 6d 65 73 20   {Charles James 
8bb0: 4d 61 72 79 7d 0a 0a 20 20 64 6f 5f 74 65 73 74  Mary}..  do_test
8bc0: 20 70 61 67 65 72 31 2d 38 2e 24 74 6e 2e 32 20   pager1-8.$tn.2 
8bd0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 64 62  {.    sqlite3 db
8be0: 32 20 24 66 69 6c 65 6e 61 6d 65 0a 20 20 20 20  2 $filename.    
8bf0: 63 61 74 63 68 73 71 6c 20 7b 20 53 45 4c 45 43  catchsql { SELEC
8c00: 54 20 2a 20 46 52 4f 4d 20 78 31 20 7d 20 64 62  T * FROM x1 } db
8c10: 32 0a 20 20 7d 20 7b 31 20 7b 6e 6f 20 73 75 63  2.  } {1 {no suc
8c20: 68 20 74 61 62 6c 65 3a 20 78 31 7d 7d 0a 0a 20  h table: x1}}.. 
8c30: 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74   do_execsql_test
8c40: 20 70 61 67 65 72 31 2d 38 2e 24 74 6e 2e 33 20   pager1-8.$tn.3 
8c50: 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20  {.    BEGIN;.   
8c60: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78     INSERT INTO x
8c70: 31 20 56 41 4c 55 45 53 28 27 57 69 6c 6c 69 61  1 VALUES('Willia
8c80: 6d 27 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  m');.      INSER
8c90: 54 20 49 4e 54 4f 20 78 31 20 56 41 4c 55 45 53  T INTO x1 VALUES
8ca0: 28 27 41 6e 6e 65 27 29 3b 0a 20 20 20 20 52 4f  ('Anne');.    RO
8cb0: 4c 4c 42 41 43 4b 3b 0a 20 20 7d 20 7b 7d 0a 7d  LLBACK;.  } {}.}
8cc0: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
8cd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8ce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8cf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8d00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54  ------------.# T
8d10: 68 65 20 6e 65 78 74 20 62 6c 6f 63 6b 20 6f 66  he next block of
8d20: 20 74 65 73 74 73 20 2d 20 70 61 67 65 72 31 2d   tests - pager1-
8d30: 39 2e 2a 20 2d 20 64 65 61 6c 20 77 69 74 68 20  9.* - deal with 
8d40: 69 6e 74 65 72 61 63 74 69 6f 6e 73 20 62 65 74  interactions bet
8d50: 77 65 65 6e 0a 23 20 74 68 65 20 70 61 67 65 72  ween.# the pager
8d60: 20 61 6e 64 20 74 68 65 20 62 61 63 6b 75 70 20   and the backup 
8d70: 41 50 49 2e 20 54 65 73 74 20 63 61 73 65 73 3a  API. Test cases:
8d80: 0a 23 0a 23 20 20 20 70 61 67 65 72 31 2d 39 2e  .#.#   pager1-9.
8d90: 31 2e 2a 3a 20 54 65 73 74 20 74 68 61 74 20 61  1.*: Test that a
8da0: 20 62 61 63 6b 75 70 20 63 6f 6d 70 6c 65 74 65   backup complete
8db0: 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 65  s successfully e
8dc0: 76 65 6e 20 69 66 20 74 68 65 0a 23 20 20 20 20  ven if the.#    
8dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 6f 75               sou
8de0: 72 63 65 20 64 62 20 69 73 20 77 72 69 74 74 65  rce db is writte
8df0: 6e 20 74 6f 20 64 75 72 69 6e 67 20 74 68 65 20  n to during the 
8e00: 62 61 63 6b 75 70 20 6f 70 2e 0a 23 0a 23 20 20  backup op..#.#  
8e10: 20 70 61 67 65 72 31 2d 39 2e 32 2e 2a 3a 20 54   pager1-9.2.*: T
8e20: 65 73 74 20 74 68 61 74 20 61 20 62 61 63 6b 75  est that a backu
8e30: 70 20 63 6f 6d 70 6c 65 74 65 73 20 73 75 63 63  p completes succ
8e40: 65 73 73 66 75 6c 6c 79 20 65 76 65 6e 20 69 66  essfully even if
8e50: 20 74 68 65 0a 23 20 20 20 20 20 20 20 20 20 20   the.#          
8e60: 20 20 20 20 20 20 20 73 6f 75 72 63 65 20 64 62         source db
8e70: 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 61   is written to a
8e80: 6e 64 20 74 68 65 6e 20 72 6f 6c 6c 65 64 20 62  nd then rolled b
8e90: 61 63 6b 20 64 75 72 69 6e 67 20 61 20 0a 23 20  ack during a .# 
8ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8eb0: 62 61 63 6b 75 70 20 6f 70 65 72 61 74 69 6f 6e  backup operation
8ec0: 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  ..#.do_test page
8ed0: 72 31 2d 39 2e 30 2e 31 20 7b 0a 20 20 66 61 75  r1-9.0.1 {.  fau
8ee0: 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64  ltsim_delete_and
8ef0: 5f 72 65 6f 70 65 6e 0a 20 20 64 62 20 66 75 6e  _reopen.  db fun
8f00: 63 20 61 5f 73 74 72 69 6e 67 20 61 5f 73 74 72  c a_string a_str
8f10: 69 6e 67 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  ing.  execsql {.
8f20: 20 20 20 20 50 52 41 47 4d 41 20 63 61 63 68 65      PRAGMA cache
8f30: 5f 73 69 7a 65 20 3d 20 31 30 3b 0a 20 20 20 20  _size = 10;.    
8f40: 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 43 52 45  BEGIN;.      CRE
8f50: 41 54 45 20 54 41 42 4c 45 20 61 62 28 61 2c 20  ATE TABLE ab(a, 
8f60: 62 2c 20 55 4e 49 51 55 45 28 61 2c 20 62 29 29  b, UNIQUE(a, b))
8f70: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
8f80: 4e 54 4f 20 61 62 20 56 41 4c 55 45 53 28 20 61  NTO ab VALUES( a
8f90: 5f 73 74 72 69 6e 67 28 32 30 30 29 2c 20 61 5f  _string(200), a_
8fa0: 73 74 72 69 6e 67 28 33 30 30 29 20 29 3b 0a 20  string(300) );. 
8fb0: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
8fc0: 20 61 62 20 53 45 4c 45 43 54 20 61 5f 73 74 72   ab SELECT a_str
8fd0: 69 6e 67 28 32 30 30 29 2c 20 61 5f 73 74 72 69  ing(200), a_stri
8fe0: 6e 67 28 33 30 30 29 20 46 52 4f 4d 20 61 62 3b  ng(300) FROM ab;
8ff0: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
9000: 54 4f 20 61 62 20 53 45 4c 45 43 54 20 61 5f 73  TO ab SELECT a_s
9010: 74 72 69 6e 67 28 32 30 30 29 2c 20 61 5f 73 74  tring(200), a_st
9020: 72 69 6e 67 28 33 30 30 29 20 46 52 4f 4d 20 61  ring(300) FROM a
9030: 62 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  b;.      INSERT 
9040: 49 4e 54 4f 20 61 62 20 53 45 4c 45 43 54 20 61  INTO ab SELECT a
9050: 5f 73 74 72 69 6e 67 28 32 30 30 29 2c 20 61 5f  _string(200), a_
9060: 73 74 72 69 6e 67 28 33 30 30 29 20 46 52 4f 4d  string(300) FROM
9070: 20 61 62 3b 0a 20 20 20 20 20 20 49 4e 53 45 52   ab;.      INSER
9080: 54 20 49 4e 54 4f 20 61 62 20 53 45 4c 45 43 54  T INTO ab SELECT
9090: 20 61 5f 73 74 72 69 6e 67 28 32 30 30 29 2c 20   a_string(200), 
90a0: 61 5f 73 74 72 69 6e 67 28 33 30 30 29 20 46 52  a_string(300) FR
90b0: 4f 4d 20 61 62 3b 0a 20 20 20 20 20 20 49 4e 53  OM ab;.      INS
90c0: 45 52 54 20 49 4e 54 4f 20 61 62 20 53 45 4c 45  ERT INTO ab SELE
90d0: 43 54 20 61 5f 73 74 72 69 6e 67 28 32 30 30 29  CT a_string(200)
90e0: 2c 20 61 5f 73 74 72 69 6e 67 28 33 30 30 29 20  , a_string(300) 
90f0: 46 52 4f 4d 20 61 62 3b 0a 20 20 20 20 20 20 49  FROM ab;.      I
9100: 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 20 53 45  NSERT INTO ab SE
9110: 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 32 30  LECT a_string(20
9120: 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 33 30 30  0), a_string(300
9130: 29 20 46 52 4f 4d 20 61 62 3b 0a 20 20 20 20 20  ) FROM ab;.     
9140: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 20   INSERT INTO ab 
9150: 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28  SELECT a_string(
9160: 32 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 33  200), a_string(3
9170: 30 30 29 20 46 52 4f 4d 20 61 62 3b 0a 20 20 20  00) FROM ab;.   
9180: 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 7d 20 7b   COMMIT;.  }.} {
9190: 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  }.do_test pager1
91a0: 2d 39 2e 30 2e 32 20 7b 0a 20 20 73 71 6c 69 74  -9.0.2 {.  sqlit
91b0: 65 33 20 64 62 32 20 74 65 73 74 2e 64 62 32 0a  e3 db2 test.db2.
91c0: 20 20 64 62 32 20 65 76 61 6c 20 7b 20 50 52 41    db2 eval { PRA
91d0: 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 20 3d  GMA cache_size =
91e0: 20 31 30 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f   10 }.  sqlite3_
91f0: 62 61 63 6b 75 70 20 42 20 64 62 32 20 6d 61 69  backup B db2 mai
9200: 6e 20 64 62 20 6d 61 69 6e 0a 20 20 6c 69 73 74  n db main.  list
9210: 20 5b 42 20 73 74 65 70 20 31 30 30 30 30 5d 20   [B step 10000] 
9220: 5b 42 20 66 69 6e 69 73 68 5d 0a 7d 20 7b 53 51  [B finish].} {SQ
9230: 4c 49 54 45 5f 44 4f 4e 45 20 53 51 4c 49 54 45  LITE_DONE SQLITE
9240: 5f 4f 4b 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67  _OK}.do_test pag
9250: 65 72 31 2d 39 2e 30 2e 33 20 7b 0a 20 64 62 20  er1-9.0.3 {. db 
9260: 6f 6e 65 20 7b 53 45 4c 45 43 54 20 6d 64 35 73  one {SELECT md5s
9270: 75 6d 28 61 2c 20 62 29 20 46 52 4f 4d 20 61 62  um(a, b) FROM ab
9280: 7d 0a 7d 20 5b 64 62 32 20 6f 6e 65 20 7b 53 45  }.} [db2 one {SE
9290: 4c 45 43 54 20 6d 64 35 73 75 6d 28 61 2c 20 62  LECT md5sum(a, b
92a0: 29 20 46 52 4f 4d 20 61 62 7d 5d 0a 0a 64 6f 5f  ) FROM ab}]..do_
92b0: 74 65 73 74 20 70 61 67 65 72 31 2d 39 2e 31 2e  test pager1-9.1.
92c0: 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  1 {.  execsql { 
92d0: 55 50 44 41 54 45 20 61 62 20 53 45 54 20 61 20  UPDATE ab SET a 
92e0: 3d 20 61 5f 73 74 72 69 6e 67 28 32 30 31 29 20  = a_string(201) 
92f0: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b  }.  sqlite3_back
9300: 75 70 20 42 20 64 62 32 20 6d 61 69 6e 20 64 62  up B db2 main db
9310: 20 6d 61 69 6e 0a 20 20 42 20 73 74 65 70 20 33   main.  B step 3
9320: 30 0a 7d 20 7b 53 51 4c 49 54 45 5f 4f 4b 7d 0a  0.} {SQLITE_OK}.
9330: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 39  do_test pager1-9
9340: 2e 31 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c  .1.2 {.  execsql
9350: 20 7b 20 55 50 44 41 54 45 20 61 62 20 53 45 54   { UPDATE ab SET
9360: 20 62 20 3d 20 61 5f 73 74 72 69 6e 67 28 33 30   b = a_string(30
9370: 31 29 20 7d 0a 20 20 6c 69 73 74 20 5b 42 20 73  1) }.  list [B s
9380: 74 65 70 20 31 30 30 30 30 5d 20 5b 42 20 66 69  tep 10000] [B fi
9390: 6e 69 73 68 5d 0a 7d 20 7b 53 51 4c 49 54 45 5f  nish].} {SQLITE_
93a0: 44 4f 4e 45 20 53 51 4c 49 54 45 5f 4f 4b 7d 0a  DONE SQLITE_OK}.
93b0: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 39  do_test pager1-9
93c0: 2e 31 2e 33 20 7b 0a 20 64 62 20 6f 6e 65 20 7b  .1.3 {. db one {
93d0: 53 45 4c 45 43 54 20 6d 64 35 73 75 6d 28 61 2c  SELECT md5sum(a,
93e0: 20 62 29 20 46 52 4f 4d 20 61 62 7d 0a 7d 20 5b   b) FROM ab}.} [
93f0: 64 62 32 20 6f 6e 65 20 7b 53 45 4c 45 43 54 20  db2 one {SELECT 
9400: 6d 64 35 73 75 6d 28 61 2c 20 62 29 20 46 52 4f  md5sum(a, b) FRO
9410: 4d 20 61 62 7d 5d 0a 64 6f 5f 74 65 73 74 20 70  M ab}].do_test p
9420: 61 67 65 72 31 2d 39 2e 31 2e 34 20 7b 20 65 78  ager1-9.1.4 { ex
9430: 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 63  ecsql { SELECT c
9440: 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 61 62 20  ount(*) FROM ab 
9450: 7d 20 7d 20 7b 31 32 38 7d 0a 0a 64 6f 5f 74 65  } } {128}..do_te
9460: 73 74 20 70 61 67 65 72 31 2d 39 2e 32 2e 31 20  st pager1-9.2.1 
9470: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 55 50  {.  execsql { UP
9480: 44 41 54 45 20 61 62 20 53 45 54 20 61 20 3d 20  DATE ab SET a = 
9490: 61 5f 73 74 72 69 6e 67 28 32 30 32 29 20 7d 0a  a_string(202) }.
94a0: 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70    sqlite3_backup
94b0: 20 42 20 64 62 32 20 6d 61 69 6e 20 64 62 20 6d   B db2 main db m
94c0: 61 69 6e 0a 20 20 42 20 73 74 65 70 20 33 30 0a  ain.  B step 30.
94d0: 7d 20 7b 53 51 4c 49 54 45 5f 4f 4b 7d 0a 64 6f  } {SQLITE_OK}.do
94e0: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 39 2e 32  _test pager1-9.2
94f0: 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .2 {.  execsql {
9500: 20 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20   .    BEGIN;.   
9510: 20 20 20 55 50 44 41 54 45 20 61 62 20 53 45 54     UPDATE ab SET
9520: 20 62 20 3d 20 61 5f 73 74 72 69 6e 67 28 33 30   b = a_string(30
9530: 31 29 3b 0a 20 20 20 20 52 4f 4c 4c 42 41 43 4b  1);.    ROLLBACK
9540: 3b 0a 20 20 7d 0a 20 20 6c 69 73 74 20 5b 42 20  ;.  }.  list [B 
9550: 73 74 65 70 20 31 30 30 30 30 5d 20 5b 42 20 66  step 10000] [B f
9560: 69 6e 69 73 68 5d 0a 7d 20 7b 53 51 4c 49 54 45  inish].} {SQLITE
9570: 5f 44 4f 4e 45 20 53 51 4c 49 54 45 5f 4f 4b 7d  _DONE SQLITE_OK}
9580: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
9590: 39 2e 32 2e 33 20 7b 0a 20 64 62 20 6f 6e 65 20  9.2.3 {. db one 
95a0: 7b 53 45 4c 45 43 54 20 6d 64 35 73 75 6d 28 61  {SELECT md5sum(a
95b0: 2c 20 62 29 20 46 52 4f 4d 20 61 62 7d 0a 7d 20  , b) FROM ab}.} 
95c0: 5b 64 62 32 20 6f 6e 65 20 7b 53 45 4c 45 43 54  [db2 one {SELECT
95d0: 20 6d 64 35 73 75 6d 28 61 2c 20 62 29 20 46 52   md5sum(a, b) FR
95e0: 4f 4d 20 61 62 7d 5d 0a 64 6f 5f 74 65 73 74 20  OM ab}].do_test 
95f0: 70 61 67 65 72 31 2d 39 2e 32 2e 34 20 7b 20 65  pager1-9.2.4 { e
9600: 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20  xecsql { SELECT 
9610: 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 61 62  count(*) FROM ab
9620: 20 7d 20 7d 20 7b 31 32 38 7d 0a 64 62 20 63 6c   } } {128}.db cl
9630: 6f 73 65 0a 64 62 32 20 63 6c 6f 73 65 0a 0a 64  ose.db2 close..d
9640: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 39 2e  o_test pager1-9.
9650: 33 2e 31 20 7b 0a 20 20 74 65 73 74 76 66 73 20  3.1 {.  testvfs 
9660: 74 76 20 2d 64 65 66 61 75 6c 74 20 31 0a 20 20  tv -default 1.  
9670: 74 76 20 73 65 63 74 6f 72 73 69 7a 65 20 34 30  tv sectorsize 40
9680: 39 36 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65  96.  faultsim_de
9690: 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a  lete_and_reopen.
96a0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41  .  execsql { PRA
96b0: 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20  GMA page_size = 
96c0: 31 30 32 34 20 7d 0a 20 20 66 6f 72 20 7b 73 65  1024 }.  for {se
96d0: 74 20 69 69 20 30 7d 20 7b 24 69 69 20 3c 20 34  t ii 0} {$ii < 4
96e0: 7d 20 7b 69 6e 63 72 20 69 69 7d 20 7b 20 65 78  } {incr ii} { ex
96f0: 65 63 73 71 6c 20 22 43 52 45 41 54 45 20 54 41  ecsql "CREATE TA
9700: 42 4c 45 20 74 24 7b 69 69 7d 28 61 2c 20 62 29  BLE t${ii}(a, b)
9710: 22 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74  " }.} {}.do_test
9720: 20 70 61 67 65 72 31 2d 39 2e 33 2e 32 20 7b 0a   pager1-9.3.2 {.
9730: 20 20 73 71 6c 69 74 65 33 20 64 62 32 20 74 65    sqlite3 db2 te
9740: 73 74 2e 64 62 32 0a 0a 20 20 65 78 65 63 73 71  st.db2..  execsq
9750: 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 70  l {.    PRAGMA p
9760: 61 67 65 5f 73 69 7a 65 20 3d 20 34 30 39 36 3b  age_size = 4096;
9770: 0a 20 20 20 20 50 52 41 47 4d 41 20 73 79 6e 63  .    PRAGMA sync
9780: 68 72 6f 6e 6f 75 73 20 3d 20 4f 46 46 3b 0a 20  hronous = OFF;. 
9790: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
97a0: 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 43 52  t1(a, b);.    CR
97b0: 45 41 54 45 20 54 41 42 4c 45 20 74 32 28 61 2c  EATE TABLE t2(a,
97c0: 20 62 29 3b 0a 20 20 7d 20 64 62 32 0a 0a 20 20   b);.  } db2..  
97d0: 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 42  sqlite3_backup B
97e0: 20 64 62 32 20 6d 61 69 6e 20 64 62 20 6d 61 69   db2 main db mai
97f0: 6e 0a 20 20 42 20 73 74 65 70 20 33 30 0a 20 20  n.  B step 30.  
9800: 6c 69 73 74 20 5b 42 20 73 74 65 70 20 31 30 30  list [B step 100
9810: 30 30 5d 20 5b 42 20 66 69 6e 69 73 68 5d 0a 7d  00] [B finish].}
9820: 20 7b 53 51 4c 49 54 45 5f 44 4f 4e 45 20 53 51   {SQLITE_DONE SQ
9830: 4c 49 54 45 5f 4f 4b 7d 0a 64 6f 5f 74 65 73 74  LITE_OK}.do_test
9840: 20 70 61 67 65 72 31 2d 39 2e 33 2e 33 20 7b 0a   pager1-9.3.3 {.
9850: 20 20 64 62 32 20 63 6c 6f 73 65 0a 20 20 64 62    db2 close.  db
9860: 20 63 6c 6f 73 65 0a 20 20 74 76 20 64 65 6c 65   close.  tv dele
9870: 74 65 0a 20 20 66 69 6c 65 20 73 69 7a 65 20 74  te.  file size t
9880: 65 73 74 2e 64 62 32 0a 7d 20 5b 66 69 6c 65 20  est.db2.} [file 
9890: 73 69 7a 65 20 74 65 73 74 2e 64 62 5d 0a 0a 64  size test.db]..d
98a0: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 39 2e  o_test pager1-9.
98b0: 34 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d  4.1 {.  faultsim
98c0: 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70  _delete_and_reop
98d0: 65 6e 0a 20 20 73 71 6c 69 74 65 33 20 64 62 32  en.  sqlite3 db2
98e0: 20 74 65 73 74 2e 64 62 32 0a 20 20 65 78 65 63   test.db2.  exec
98f0: 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41  sql {.    PRAGMA
9900: 20 70 61 67 65 5f 73 69 7a 65 20 3d 20 34 30 39   page_size = 409
9910: 36 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  6;.    CREATE TA
9920: 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20  BLE t1(a, b);.  
9930: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
9940: 32 28 61 2c 20 62 29 3b 0a 20 20 7d 20 64 62 32  2(a, b);.  } db2
9950: 0a 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75  .  sqlite3_backu
9960: 70 20 42 20 64 62 32 20 6d 61 69 6e 20 64 62 20  p B db2 main db 
9970: 6d 61 69 6e 0a 20 20 6c 69 73 74 20 5b 42 20 73  main.  list [B s
9980: 74 65 70 20 31 30 30 30 30 5d 20 5b 42 20 66 69  tep 10000] [B fi
9990: 6e 69 73 68 5d 0a 7d 20 7b 53 51 4c 49 54 45 5f  nish].} {SQLITE_
99a0: 44 4f 4e 45 20 53 51 4c 49 54 45 5f 4f 4b 7d 0a  DONE SQLITE_OK}.
99b0: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 39  do_test pager1-9
99c0: 2e 34 2e 32 20 7b 0a 20 20 6c 69 73 74 20 5b 66  .4.2 {.  list [f
99d0: 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62  ile size test.db
99e0: 32 5d 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65  2] [file size te
99f0: 73 74 2e 64 62 5d 0a 7d 20 7b 30 20 30 7d 0a 64  st.db].} {0 0}.d
9a00: 62 32 20 63 6c 6f 73 65 0a 0a 23 2d 2d 2d 2d 2d  b2 close..#-----
9a10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9a20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9a40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9a50: 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68 61 74  ----.# Test that
9a60: 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74   regardless of t
9a70: 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
9a80: 64 20 62 79 20 78 53 65 63 74 6f 72 53 69 7a 65  d by xSectorSize
9a90: 28 29 2c 20 74 68 65 0a 23 20 6d 69 6e 69 6d 75  (), the.# minimu
9aa0: 6d 20 65 66 66 65 63 74 69 76 65 20 73 65 63 74  m effective sect
9ab0: 6f 72 2d 73 69 7a 65 20 69 73 20 35 31 32 20 61  or-size is 512 a
9ac0: 6e 64 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 36  nd the maximum 6
9ad0: 35 35 33 36 20 62 79 74 65 73 2e 0a 23 0a 74 65  5536 bytes..#.te
9ae0: 73 74 76 66 73 20 74 76 20 2d 64 65 66 61 75 6c  stvfs tv -defaul
9af0: 74 20 31 0a 66 6f 72 65 61 63 68 20 73 65 63 74  t 1.foreach sect
9b00: 6f 72 73 69 7a 65 20 7b 0a 20 20 20 20 33 32 20  orsize {.    32 
9b10: 20 20 36 34 20 20 20 31 32 38 20 20 20 32 35 36    64   128   256
9b20: 20 20 20 35 31 32 20 20 20 31 30 32 34 20 20 20     512   1024   
9b30: 32 30 34 38 20 0a 20 20 20 20 34 30 39 36 20 38  2048 .    4096 8
9b40: 31 39 32 20 31 36 33 38 34 20 33 32 37 36 38 20  192 16384 32768 
9b50: 36 35 35 33 36 20 31 33 31 30 37 32 20 32 36 32  65536 131072 262
9b60: 31 34 34 0a 7d 20 7b 0a 20 20 74 76 20 73 65 63  144.} {.  tv sec
9b70: 74 6f 72 73 69 7a 65 20 24 73 65 63 74 6f 72 73  torsize $sectors
9b80: 69 7a 65 0a 20 20 73 65 74 20 65 66 66 20 24 73  ize.  set eff $s
9b90: 65 63 74 6f 72 73 69 7a 65 0a 20 20 69 66 20 7b  ectorsize.  if {
9ba0: 24 73 65 63 74 6f 72 73 69 7a 65 20 3c 20 35 31  $sectorsize < 51
9bb0: 32 7d 20 20 20 7b 20 73 65 74 20 65 66 66 20 35  2}   { set eff 5
9bc0: 31 32 20 7d 0a 20 20 69 66 20 7b 24 73 65 63 74  12 }.  if {$sect
9bd0: 6f 72 73 69 7a 65 20 3e 20 36 35 35 33 36 7d 20  orsize > 65536} 
9be0: 7b 20 73 65 74 20 65 66 66 20 36 35 35 33 36 20  { set eff 65536 
9bf0: 7d 0a 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67  }..  do_test pag
9c00: 65 72 31 2d 31 30 2e 24 73 65 63 74 6f 72 73 69  er1-10.$sectorsi
9c10: 7a 65 2e 31 20 7b 0a 20 20 20 20 66 61 75 6c 74  ze.1 {.    fault
9c20: 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72  sim_delete_and_r
9c30: 65 6f 70 65 6e 0a 20 20 20 20 64 62 20 66 75 6e  eopen.    db fun
9c40: 63 20 61 5f 73 74 72 69 6e 67 20 61 5f 73 74 72  c a_string a_str
9c50: 69 6e 67 0a 20 20 20 20 65 78 65 63 73 71 6c 20  ing.    execsql 
9c60: 7b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 6a  {.      PRAGMA j
9c70: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 50 45  ournal_mode = PE
9c80: 52 53 49 53 54 3b 0a 20 20 20 20 20 20 50 52 41  RSIST;.      PRA
9c90: 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20  GMA page_size = 
9ca0: 31 30 32 34 3b 0a 20 20 20 20 20 20 42 45 47 49  1024;.      BEGI
9cb0: 4e 3b 0a 20 20 20 20 20 20 20 20 43 52 45 41 54  N;.        CREAT
9cc0: 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29  E TABLE t1(a, b)
9cd0: 3b 0a 20 20 20 20 20 20 20 20 43 52 45 41 54 45  ;.        CREATE
9ce0: 20 54 41 42 4c 45 20 74 32 28 61 2c 20 62 29 3b   TABLE t2(a, b);
9cf0: 0a 20 20 20 20 20 20 20 20 43 52 45 41 54 45 20  .        CREATE 
9d00: 54 41 42 4c 45 20 74 33 28 61 2c 20 62 29 3b 0a  TABLE t3(a, b);.
9d10: 20 20 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20        COMMIT;.  
9d20: 20 20 7d 0a 20 20 20 20 66 69 6c 65 20 73 69 7a    }.    file siz
9d30: 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61  e test.db-journa
9d40: 6c 0a 20 20 7d 20 5b 65 78 70 72 20 24 73 65 63  l.  } [expr $sec
9d50: 74 6f 72 73 69 7a 65 20 3e 20 36 35 35 33 36 20  torsize > 65536 
9d60: 3f 20 36 35 35 33 36 20 3a 20 24 73 65 63 74 6f  ? 65536 : $secto
9d70: 72 73 69 7a 65 5d 0a 0a 20 20 64 6f 5f 74 65 73  rsize]..  do_tes
9d80: 74 20 70 61 67 65 72 31 2d 31 30 2e 24 73 65 63  t pager1-10.$sec
9d90: 74 6f 72 73 69 7a 65 2e 32 20 7b 0a 20 20 20 20  torsize.2 {.    
9da0: 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 20  execsql { .     
9db0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 20   INSERT INTO t3 
9dc0: 56 41 4c 55 45 53 28 61 5f 73 74 72 69 6e 67 28  VALUES(a_string(
9dd0: 33 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 33  300), a_string(3
9de0: 30 30 29 29 3b 0a 20 20 20 20 20 20 49 4e 53 45  00));.      INSE
9df0: 52 54 20 49 4e 54 4f 20 74 33 20 53 45 4c 45 43  RT INTO t3 SELEC
9e00: 54 20 2a 20 46 52 4f 4d 20 74 33 3b 20 20 20 20  T * FROM t3;    
9e10: 20 20 20 20 2f 2a 20 20 32 20 2a 2f 0a 20 20 20      /*  2 */.   
9e20: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
9e30: 33 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  3 SELECT * FROM 
9e40: 74 33 3b 20 20 20 20 20 20 20 20 2f 2a 20 20 34  t3;        /*  4
9e50: 20 2a 2f 0a 20 20 20 20 20 20 49 4e 53 45 52 54   */.      INSERT
9e60: 20 49 4e 54 4f 20 74 33 20 53 45 4c 45 43 54 20   INTO t3 SELECT 
9e70: 2a 20 46 52 4f 4d 20 74 33 3b 20 20 20 20 20 20  * FROM t3;      
9e80: 20 20 2f 2a 20 20 38 20 2a 2f 0a 20 20 20 20 20    /*  8 */.     
9e90: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 20   INSERT INTO t3 
9ea0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 33  SELECT * FROM t3
9eb0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 31 36 20 2a  ;        /* 16 *
9ec0: 2f 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  /.      INSERT I
9ed0: 4e 54 4f 20 74 33 20 53 45 4c 45 43 54 20 2a 20  NTO t3 SELECT * 
9ee0: 46 52 4f 4d 20 74 33 3b 20 20 20 20 20 20 20 20  FROM t3;        
9ef0: 2f 2a 20 33 32 20 2a 2f 0a 20 20 20 20 7d 0a 20  /* 32 */.    }. 
9f00: 20 7d 20 7b 7d 0a 0a 20 20 64 6f 5f 74 65 73 74   } {}..  do_test
9f10: 20 70 61 67 65 72 31 2d 31 30 2e 24 73 65 63 74   pager1-10.$sect
9f20: 6f 72 73 69 7a 65 2e 33 20 7b 0a 20 20 20 20 64  orsize.3 {.    d
9f30: 62 20 63 6c 6f 73 65 0a 20 20 20 20 73 71 6c 69  b close.    sqli
9f40: 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20  te3 db test.db. 
9f50: 20 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20     execsql { .  
9f60: 20 20 20 20 50 52 41 47 4d 41 20 63 61 63 68 65      PRAGMA cache
9f70: 5f 73 69 7a 65 20 3d 20 31 30 3b 0a 20 20 20 20  _size = 10;.    
9f80: 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 7d 0a 20    BEGIN;.    }. 
9f90: 20 20 20 72 65 63 75 72 73 69 76 65 5f 73 65 6c     recursive_sel
9fa0: 65 63 74 20 33 32 20 74 33 20 7b 64 62 20 65 76  ect 32 t3 {db ev
9fb0: 61 6c 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20  al "INSERT INTO 
9fc0: 74 32 20 56 41 4c 55 45 53 28 31 2c 20 32 29 22  t2 VALUES(1, 2)"
9fd0: 7d 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a  }.    execsql {.
9fe0: 20 20 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20        COMMIT;.  
9ff0: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
a000: 4d 20 74 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 20  M t2;.    }.  } 
a010: 7b 31 20 32 7d 0a 0a 20 20 64 6f 5f 74 65 73 74  {1 2}..  do_test
a020: 20 70 61 67 65 72 31 2d 31 30 2e 24 73 65 63 74   pager1-10.$sect
a030: 6f 72 73 69 7a 65 2e 34 20 7b 0a 20 20 20 20 65  orsize.4 {.    e
a040: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 43  xecsql {.      C
a050: 52 45 41 54 45 20 54 41 42 4c 45 20 74 36 28 61  REATE TABLE t6(a
a060: 2c 20 62 29 3b 0a 20 20 20 20 20 20 43 52 45 41  , b);.      CREA
a070: 54 45 20 54 41 42 4c 45 20 74 37 28 61 2c 20 62  TE TABLE t7(a, b
a080: 29 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45 20  );.      CREATE 
a090: 54 41 42 4c 45 20 74 35 28 61 2c 20 62 29 3b 0a  TABLE t5(a, b);.
a0a0: 20 20 20 20 20 20 44 52 4f 50 20 54 41 42 4c 45        DROP TABLE
a0b0: 20 74 36 3b 0a 20 20 20 20 20 20 44 52 4f 50 20   t6;.      DROP 
a0c0: 54 41 42 4c 45 20 74 37 3b 0a 20 20 20 20 7d 0a  TABLE t7;.    }.
a0d0: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20      execsql {.  
a0e0: 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20      BEGIN;.     
a0f0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
a100: 74 36 28 61 2c 20 62 29 3b 0a 20 20 20 20 7d 0a  t6(a, b);.    }.
a110: 20 20 20 20 72 65 63 75 72 73 69 76 65 5f 73 65      recursive_se
a120: 6c 65 63 74 20 33 32 20 74 33 20 7b 64 62 20 65  lect 32 t3 {db e
a130: 76 61 6c 20 22 49 4e 53 45 52 54 20 49 4e 54 4f  val "INSERT INTO
a140: 20 74 35 20 56 41 4c 55 45 53 28 31 2c 20 32 29   t5 VALUES(1, 2)
a150: 22 7d 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b  "}.    execsql {
a160: 0a 20 20 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20  .      COMMIT;. 
a170: 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52       SELECT * FR
a180: 4f 4d 20 74 35 3b 0a 20 20 20 20 7d 0a 20 20 7d  OM t5;.    }.  }
a190: 20 7b 31 20 32 7d 0a 20 20 0a 7d 0a 64 62 20 63   {1 2}.  .}.db c
a1a0: 6c 6f 73 65 0a 0a 74 76 20 73 65 63 74 6f 72 73  lose..tv sectors
a1b0: 69 7a 65 20 34 30 39 36 0a 64 6f 5f 74 65 73 74  ize 4096.do_test
a1c0: 20 70 61 67 65 72 31 2e 31 30 2e 78 2e 31 20 7b   pager1.10.x.1 {
a1d0: 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65  .  faultsim_dele
a1e0: 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20  te_and_reopen.  
a1f0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52  execsql {.    PR
a200: 41 47 4d 41 20 61 75 74 6f 5f 76 61 63 75 75 6d  AGMA auto_vacuum
a210: 20 3d 20 6e 6f 6e 65 3b 0a 20 20 20 20 50 52 41   = none;.    PRA
a220: 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20  GMA page_size = 
a230: 31 30 32 34 3b 0a 20 20 20 20 43 52 45 41 54 45  1024;.    CREATE
a240: 20 54 41 42 4c 45 20 74 31 28 78 29 3b 0a 20 20   TABLE t1(x);.  
a250: 7d 0a 20 20 66 6f 72 20 7b 73 65 74 20 69 20 30  }.  for {set i 0
a260: 7d 20 7b 24 69 3c 33 30 7d 20 7b 69 6e 63 72 20  } {$i<30} {incr 
a270: 69 7d 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c  i} {.    execsql
a280: 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74   { INSERT INTO t
a290: 31 20 56 41 4c 55 45 53 28 7a 65 72 6f 62 6c 6f  1 VALUES(zeroblo
a2a0: 62 28 39 30 30 29 29 20 7d 0a 20 20 7d 0a 20 20  b(900)) }.  }.  
a2b0: 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64  file size test.d
a2c0: 62 0a 7d 20 7b 33 32 37 36 38 7d 0a 64 6f 5f 74  b.} {32768}.do_t
a2d0: 65 73 74 20 70 61 67 65 72 31 2e 31 30 2e 78 2e  est pager1.10.x.
a2e0: 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  2 {.  execsql {.
a2f0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
a300: 20 74 32 28 78 29 3b 0a 20 20 20 20 44 52 4f 50   t2(x);.    DROP
a310: 20 54 41 42 4c 45 20 74 32 3b 0a 20 20 7d 0a 20   TABLE t2;.  }. 
a320: 20 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e   file size test.
a330: 64 62 0a 7d 20 7b 33 33 37 39 32 7d 0a 64 6f 5f  db.} {33792}.do_
a340: 74 65 73 74 20 70 61 67 65 72 31 2e 31 30 2e 78  test pager1.10.x
a350: 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .3 {.  execsql {
a360: 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20  .    BEGIN;.    
a370: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32 28  CREATE TABLE t2(
a380: 78 29 3b 0a 20 20 7d 0a 20 20 72 65 63 75 72 73  x);.  }.  recurs
a390: 69 76 65 5f 73 65 6c 65 63 74 20 33 30 20 74 31  ive_select 30 t1
a3a0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
a3b0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 33   CREATE TABLE t3
a3c0: 28 78 29 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b  (x);.    COMMIT;
a3d0: 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 64 62 20 63 6c  .  }.} {}..db cl
a3e0: 6f 73 65 0a 74 76 20 64 65 6c 65 74 65 0a 0a 74  ose.tv delete..t
a3f0: 65 73 74 76 66 73 20 74 76 20 2d 64 65 66 61 75  estvfs tv -defau
a400: 6c 74 20 31 0a 66 61 75 6c 74 73 69 6d 5f 64 65  lt 1.faultsim_de
a410: 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a  lete_and_reopen.
a420: 64 62 20 66 75 6e 63 20 61 5f 73 74 72 69 6e 67  db func a_string
a430: 20 61 5f 73 74 72 69 6e 67 0a 64 6f 5f 65 78 65   a_string.do_exe
a440: 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31  csql_test pager1
a450: 2d 31 31 2e 31 20 7b 0a 20 20 50 52 41 47 4d 41  -11.1 {.  PRAGMA
a460: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20   journal_mode = 
a470: 44 45 4c 45 54 45 3b 0a 20 20 50 52 41 47 4d 41  DELETE;.  PRAGMA
a480: 20 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 31 30   cache_size = 10
a490: 3b 0a 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 43  ;.  BEGIN;.    C
a4a0: 52 45 41 54 45 20 54 41 42 4c 45 20 7a 7a 28 74  REATE TABLE zz(t
a4b0: 6f 70 20 50 52 49 4d 41 52 59 20 4b 45 59 29 3b  op PRIMARY KEY);
a4c0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
a4d0: 20 7a 7a 20 56 41 4c 55 45 53 28 61 5f 73 74 72   zz VALUES(a_str
a4e0: 69 6e 67 28 32 32 32 29 29 3b 0a 20 20 20 20 49  ing(222));.    I
a4f0: 4e 53 45 52 54 20 49 4e 54 4f 20 7a 7a 20 53 45  NSERT INTO zz SE
a500: 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 28 53  LECT a_string((S
a510: 45 4c 45 43 54 20 32 32 32 2b 6d 61 78 28 72 6f  ELECT 222+max(ro
a520: 77 69 64 29 20 46 52 4f 4d 20 7a 7a 29 29 20 46  wid) FROM zz)) F
a530: 52 4f 4d 20 7a 7a 3b 0a 20 20 20 20 49 4e 53 45  ROM zz;.    INSE
a540: 52 54 20 49 4e 54 4f 20 7a 7a 20 53 45 4c 45 43  RT INTO zz SELEC
a550: 54 20 61 5f 73 74 72 69 6e 67 28 28 53 45 4c 45  T a_string((SELE
a560: 43 54 20 32 32 32 2b 6d 61 78 28 72 6f 77 69 64  CT 222+max(rowid
a570: 29 20 46 52 4f 4d 20 7a 7a 29 29 20 46 52 4f 4d  ) FROM zz)) FROM
a580: 20 7a 7a 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   zz;.    INSERT 
a590: 49 4e 54 4f 20 7a 7a 20 53 45 4c 45 43 54 20 61  INTO zz SELECT a
a5a0: 5f 73 74 72 69 6e 67 28 28 53 45 4c 45 43 54 20  _string((SELECT 
a5b0: 32 32 32 2b 6d 61 78 28 72 6f 77 69 64 29 20 46  222+max(rowid) F
a5c0: 52 4f 4d 20 7a 7a 29 29 20 46 52 4f 4d 20 7a 7a  ROM zz)) FROM zz
a5d0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
a5e0: 4f 20 7a 7a 20 53 45 4c 45 43 54 20 61 5f 73 74  O zz SELECT a_st
a5f0: 72 69 6e 67 28 28 53 45 4c 45 43 54 20 32 32 32  ring((SELECT 222
a600: 2b 6d 61 78 28 72 6f 77 69 64 29 20 46 52 4f 4d  +max(rowid) FROM
a610: 20 7a 7a 29 29 20 46 52 4f 4d 20 7a 7a 3b 0a 20   zz)) FROM zz;. 
a620: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a     INSERT INTO z
a630: 7a 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e  z SELECT a_strin
a640: 67 28 28 53 45 4c 45 43 54 20 32 32 32 2b 6d 61  g((SELECT 222+ma
a650: 78 28 72 6f 77 69 64 29 20 46 52 4f 4d 20 7a 7a  x(rowid) FROM zz
a660: 29 29 20 46 52 4f 4d 20 7a 7a 3b 0a 20 20 43 4f  )) FROM zz;.  CO
a670: 4d 4d 49 54 3b 0a 20 20 42 45 47 49 4e 3b 0a 20  MMIT;.  BEGIN;. 
a680: 20 20 20 55 50 44 41 54 45 20 7a 7a 20 53 45 54     UPDATE zz SET
a690: 20 74 6f 70 20 3d 20 61 5f 73 74 72 69 6e 67 28   top = a_string(
a6a0: 33 34 35 29 3b 0a 7d 20 7b 64 65 6c 65 74 65 7d  345);.} {delete}
a6b0: 0a 0a 70 72 6f 63 20 6c 6f 63 6b 6f 75 74 20 7b  ..proc lockout {
a6c0: 6d 65 74 68 6f 64 20 61 72 67 73 7d 20 7b 20 72  method args} { r
a6d0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
a6e0: 52 52 20 7d 0a 74 76 20 73 63 72 69 70 74 20 6c  RR }.tv script l
a6f0: 6f 63 6b 6f 75 74 0a 74 76 20 66 69 6c 74 65 72  ockout.tv filter
a700: 20 7b 78 57 72 69 74 65 20 78 54 72 75 6e 63 61   {xWrite xTrunca
a710: 74 65 20 78 53 79 6e 63 7d 0a 64 6f 5f 63 61 74  te xSync}.do_cat
a720: 63 68 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72  chsql_test pager
a730: 31 2d 31 31 2e 32 20 7b 20 43 4f 4d 4d 49 54 20  1-11.2 { COMMIT 
a740: 7d 20 7b 31 20 7b 64 69 73 6b 20 49 2f 4f 20 65  } {1 {disk I/O e
a750: 72 72 6f 72 7d 7d 0a 0a 74 76 20 73 63 72 69 70  rror}}..tv scrip
a760: 74 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67  t {}.do_test pag
a770: 65 72 31 2d 31 31 2e 33 20 7b 0a 20 20 73 71 6c  er1-11.3 {.  sql
a780: 69 74 65 33 20 64 62 32 20 74 65 73 74 2e 64 62  ite3 db2 test.db
a790: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
a7a0: 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f   PRAGMA journal_
a7b0: 6d 6f 64 65 20 3d 20 54 52 55 4e 43 41 54 45 3b  mode = TRUNCATE;
a7c0: 0a 20 20 20 20 50 52 41 47 4d 41 20 69 6e 74 65  .    PRAGMA inte
a7d0: 67 72 69 74 79 5f 63 68 65 63 6b 3b 0a 20 20 7d  grity_check;.  }
a7e0: 20 64 62 32 0a 7d 20 7b 74 72 75 6e 63 61 74 65   db2.} {truncate
a7f0: 20 6f 6b 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67   ok}.do_test pag
a800: 65 72 31 2d 31 31 2e 34 20 7b 0a 20 20 64 62 32  er1-11.4 {.  db2
a810: 20 63 6c 6f 73 65 0a 20 20 66 69 6c 65 20 73 69   close.  file si
a820: 7a 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e  ze test.db-journ
a830: 61 6c 0a 7d 20 7b 30 7d 0a 64 6f 5f 65 78 65 63  al.} {0}.do_exec
a840: 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d  sql_test pager1-
a850: 31 31 2e 35 20 7b 20 53 45 4c 45 43 54 20 63 6f  11.5 { SELECT co
a860: 75 6e 74 28 2a 29 20 46 52 4f 4d 20 7a 7a 20 7d  unt(*) FROM zz }
a870: 20 7b 33 32 7d 0a 64 62 20 63 6c 6f 73 65 0a 74   {32}.db close.t
a880: 76 20 64 65 6c 65 74 65 0a 20 20 0a 23 2d 2d 2d  v delete.  .#---
a890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a8a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a8b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a8c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a8d0: 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 22 50  ------.# Test "P
a8e0: 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 22  RAGMA page_size"
a8f0: 0a 23 0a 74 65 73 74 76 66 73 20 74 76 20 2d 64  .#.testvfs tv -d
a900: 65 66 61 75 6c 74 20 31 0a 74 76 20 73 65 63 74  efault 1.tv sect
a910: 6f 72 73 69 7a 65 20 31 30 32 34 0a 66 6f 72 65  orsize 1024.fore
a920: 61 63 68 20 70 61 67 65 73 69 7a 65 20 7b 0a 20  ach pagesize {. 
a930: 20 20 20 35 31 32 20 20 20 31 30 32 34 20 20 20     512   1024   
a940: 32 30 34 38 20 34 30 39 36 20 38 31 39 32 20 31  2048 4096 8192 1
a950: 36 33 38 34 20 33 32 37 36 38 20 0a 7d 20 7b 0a  6384 32768 .} {.
a960: 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74    faultsim_delet
a970: 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 0a 20 20  e_and_reopen..  
a980: 23 20 54 68 65 20 73 65 63 74 6f 72 2d 73 69 7a  # The sector-siz
a990: 65 20 28 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  e (according to 
a9a0: 74 68 65 20 56 46 53 29 20 69 73 20 31 30 32 34  the VFS) is 1024
a9b0: 20 62 79 74 65 73 2e 20 53 6f 20 69 66 20 74 68   bytes. So if th
a9c0: 65 0a 20 20 23 20 70 61 67 65 2d 73 69 7a 65 20  e.  # page-size 
a9d0: 72 65 71 75 65 73 74 65 64 20 75 73 69 6e 67 20  requested using 
a9e0: 22 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a  "PRAGMA page_siz
a9f0: 65 22 20 69 73 20 67 72 65 61 74 65 72 20 74 68  e" is greater th
aa00: 61 6e 20 74 68 65 0a 20 20 23 20 63 6f 6d 70 69  an the.  # compi
aa10: 6c 65 20 74 69 6d 65 20 76 61 6c 75 65 20 6f 66  le time value of
aa20: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45   SQLITE_MAX_PAGE
aa30: 5f 53 49 5a 45 2c 20 74 68 65 6e 20 74 68 65 20  _SIZE, then the 
aa40: 65 66 66 65 63 74 69 76 65 20 0a 20 20 23 20 70  effective .  # p
aa50: 61 67 65 2d 73 69 7a 65 20 72 65 6d 61 69 6e 73  age-size remains
aa60: 20 31 30 32 34 20 62 79 74 65 73 2e 0a 20 20 23   1024 bytes..  #
aa70: 0a 20 20 73 65 74 20 65 66 66 20 24 70 61 67 65  .  set eff $page
aa80: 73 69 7a 65 0a 20 20 69 66 20 7b 24 65 66 66 20  size.  if {$eff 
aa90: 3e 20 24 3a 3a 53 51 4c 49 54 45 5f 4d 41 58 5f  > $::SQLITE_MAX_
aaa0: 50 41 47 45 5f 53 49 5a 45 7d 20 7b 20 73 65 74  PAGE_SIZE} { set
aab0: 20 65 66 66 20 31 30 32 34 20 7d 0a 0a 20 20 64   eff 1024 }..  d
aac0: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 32  o_test pager1-12
aad0: 2e 24 70 61 67 65 73 69 7a 65 2e 31 20 7b 0a 20  .$pagesize.1 {. 
aae0: 20 20 20 73 71 6c 69 74 65 33 20 64 62 32 20 74     sqlite3 db2 t
aaf0: 65 73 74 2e 64 62 0a 20 20 20 20 65 78 65 63 73  est.db.    execs
ab00: 71 6c 20 22 0a 20 20 20 20 20 20 50 52 41 47 4d  ql ".      PRAGM
ab10: 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20 24 70  A page_size = $p
ab20: 61 67 65 73 69 7a 65 3b 0a 20 20 20 20 20 20 43  agesize;.      C
ab30: 52 45 41 54 45 20 56 49 45 57 20 76 20 41 53 20  REATE VIEW v AS 
ab40: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 71  SELECT * FROM sq
ab50: 6c 69 74 65 5f 6d 61 73 74 65 72 3b 0a 20 20 20  lite_master;.   
ab60: 20 22 20 64 62 32 0a 20 20 20 20 66 69 6c 65 20   " db2.    file 
ab70: 73 69 7a 65 20 74 65 73 74 2e 64 62 0a 20 20 7d  size test.db.  }
ab80: 20 24 65 66 66 0a 20 20 64 6f 5f 74 65 73 74 20   $eff.  do_test 
ab90: 70 61 67 65 72 31 2d 31 32 2e 24 70 61 67 65 73  pager1-12.$pages
aba0: 69 7a 65 2e 32 20 7b 0a 20 20 20 20 73 71 6c 69  ize.2 {.    sqli
abb0: 74 65 33 20 64 62 32 20 74 65 73 74 2e 64 62 0a  te3 db2 test.db.
abc0: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20      execsql { . 
abd0: 20 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e       SELECT coun
abe0: 74 28 2a 29 20 46 52 4f 4d 20 76 3b 0a 20 20 20  t(*) FROM v;.   
abf0: 20 20 20 50 52 41 47 4d 41 20 6d 61 69 6e 2e 70     PRAGMA main.p
ac00: 61 67 65 5f 73 69 7a 65 3b 0a 20 20 20 20 7d 20  age_size;.    } 
ac10: 64 62 32 0a 20 20 7d 20 5b 6c 69 73 74 20 31 20  db2.  } [list 1 
ac20: 24 65 66 66 5d 0a 20 20 64 6f 5f 74 65 73 74 20  $eff].  do_test 
ac30: 70 61 67 65 72 31 2d 31 32 2e 24 70 61 67 65 73  pager1-12.$pages
ac40: 69 7a 65 2e 33 20 7b 0a 20 20 20 20 65 78 65 63  ize.3 {.    exec
ac50: 73 71 6c 20 7b 20 0a 20 20 20 20 20 20 53 45 4c  sql { .      SEL
ac60: 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
ac70: 4d 20 76 3b 0a 20 20 20 20 20 20 50 52 41 47 4d  M v;.      PRAGM
ac80: 41 20 6d 61 69 6e 2e 70 61 67 65 5f 73 69 7a 65  A main.page_size
ac90: 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 5b 6c 69 73  ;.    }.  } [lis
aca0: 74 20 31 20 24 65 66 66 5d 0a 20 20 64 62 32 20  t 1 $eff].  db2 
acb0: 63 6c 6f 73 65 0a 7d 0a 64 62 20 63 6c 6f 73 65  close.}.db close
acc0: 0a 74 76 20 64 65 6c 65 74 65 0a 0a 23 2d 2d 2d  .tv delete..#---
acd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ace0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
acf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ad00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ad10: 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 73 70  ------.# Test sp
ad20: 65 63 61 6c 20 22 50 52 41 47 4d 41 20 6a 6f 75  ecal "PRAGMA jou
ad30: 72 6e 61 6c 5f 6d 6f 64 65 3d 50 45 52 53 49 53  rnal_mode=PERSIS
ad40: 54 22 20 74 65 73 74 20 63 61 73 65 73 2e 0a 23  T" test cases..#
ad50: 0a 23 20 70 61 67 65 72 31 2d 31 33 2e 31 2e 2a  .# pager1-13.1.*
ad60: 3a 20 54 68 69 73 20 74 65 73 74 73 20 61 20 73  : This tests a s
ad70: 70 65 63 69 61 6c 20 63 61 73 65 20 65 6e 63 6f  pecial case enco
ad80: 75 6e 74 65 72 65 64 20 69 6e 20 70 65 72 73 69  untered in persi
ad90: 73 74 65 6e 74 20 0a 23 20 20 20 20 20 20 20 20  stent .#        
ada0: 20 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20          journal 
adb0: 6d 6f 64 65 3a 20 49 66 20 74 68 65 20 6a 6f 75  mode: If the jou
adc0: 72 6e 61 6c 20 61 73 73 6f 63 69 61 74 65 64 20  rnal associated 
add0: 77 69 74 68 20 61 20 74 72 61 6e 73 61 63 74 69  with a transacti
ade0: 6f 6e 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  on.#            
adf0: 20 20 20 20 69 73 20 73 6d 61 6c 6c 65 72 20 74      is smaller t
ae00: 68 61 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  han the journal 
ae10: 66 69 6c 65 20 28 62 65 63 61 75 73 65 20 61 20  file (because a 
ae20: 70 72 65 76 69 6f 75 73 20 0a 23 20 20 20 20 20  previous .#     
ae30: 20 20 20 20 20 20 20 20 20 20 20 74 72 61 6e 73             trans
ae40: 61 63 74 69 6f 6e 20 6c 65 66 74 20 61 20 76 65  action left a ve
ae50: 72 79 20 6c 61 72 67 65 20 6e 6f 6e 2d 68 6f 74  ry large non-hot
ae60: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e   journal file in
ae70: 20 74 68 65 0a 23 20 20 20 20 20 20 20 20 20 20   the.#          
ae80: 20 20 20 20 20 20 66 69 6c 65 2d 73 79 73 74 65        file-syste
ae90: 6d 29 2c 20 74 68 65 6e 20 53 51 4c 69 74 65 20  m), then SQLite 
aea0: 68 61 73 20 74 6f 20 62 65 20 63 61 72 65 66 75  has to be carefu
aeb0: 6c 20 74 68 61 74 20 74 68 65 72 65 20 69 73 0a  l that there is.
aec0: 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  #               
aed0: 20 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 2d 68   not a journal-h
aee0: 65 61 64 65 72 20 6c 65 66 74 20 6f 76 65 72 20  eader left over 
aef0: 66 72 6f 6d 20 61 20 70 72 65 76 69 6f 75 73 20  from a previous 
af00: 74 72 61 6e 73 61 63 74 69 6f 6e 0a 23 20 20 20  transaction.#   
af10: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6d 6d               imm
af20: 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69  ediately followi
af30: 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 63  ng the journal c
af40: 6f 6e 74 65 6e 74 20 6a 75 73 74 20 77 72 69 74  ontent just writ
af50: 74 65 6e 2e 0a 23 20 20 20 20 20 20 20 20 20 20  ten..#          
af60: 20 20 20 20 20 20 49 66 20 74 68 65 72 65 20 69        If there i
af70: 73 2c 20 61 6e 64 20 74 68 65 20 70 72 6f 63 65  s, and the proce
af80: 73 73 20 63 72 61 73 68 65 73 20 73 6f 20 74 68  ss crashes so th
af90: 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 23  at the journal.#
afa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
afb0: 62 65 63 6f 6d 65 73 20 61 20 68 6f 74 2d 6a 6f  becomes a hot-jo
afc0: 75 72 6e 61 6c 20 61 6e 64 20 6d 75 73 74 20 62  urnal and must b
afd0: 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 62 79  e rolled back by
afe0: 20 61 6e 6f 74 68 65 72 0a 23 20 20 20 20 20 20   another.#      
aff0: 20 20 20 20 20 20 20 20 20 20 70 72 6f 63 65 73            proces
b000: 73 2c 20 74 68 65 72 65 20 69 73 20 61 20 64 61  s, there is a da
b010: 6e 67 65 72 20 74 68 61 74 20 74 68 65 20 6f 74  nger that the ot
b020: 68 65 72 20 70 72 6f 63 65 73 73 20 6d 61 79 20  her process may 
b030: 72 6f 6c 6c 0a 23 20 20 20 20 20 20 20 20 20 20  roll.#          
b040: 20 20 20 20 20 20 62 61 63 6b 20 74 68 65 20 61        back the a
b050: 62 6f 72 74 65 64 20 74 72 61 6e 73 61 63 74 69  borted transacti
b060: 6f 6e 2c 20 74 68 65 6e 20 63 6f 6e 74 69 6e 75  on, then continu
b070: 65 20 63 6f 70 79 69 6e 67 20 64 61 74 61 0a 23  e copying data.#
b080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b090: 66 72 6f 6d 20 61 6e 20 6f 6c 64 65 72 20 74 72  from an older tr
b0a0: 61 6e 73 61 63 74 69 6f 6e 20 66 72 6f 6d 20 74  ansaction from t
b0b0: 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20  he remainder of 
b0c0: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 23 20 20  the journal..#  
b0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 65                Se
b0e0: 65 20 74 68 65 20 73 79 6e 63 4a 6f 75 72 6e 61  e the syncJourna
b0f0: 6c 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72  l() function for
b100: 20 64 65 74 61 69 6c 73 2e 0a 23 0a 23 20 70 61   details..#.# pa
b110: 67 65 72 31 2d 31 33 2e 32 2e 2a 3a 20 53 61 6d  ger1-13.2.*: Sam
b120: 65 20 74 65 73 74 20 61 73 20 74 68 65 20 70 72  e test as the pr
b130: 65 76 69 6f 75 73 2e 20 54 68 69 73 20 74 69 6d  evious. This tim
b140: 65 2c 20 74 68 72 6f 77 20 61 6e 20 69 6e 64 65  e, throw an inde
b150: 78 20 69 6e 74 6f 0a 23 20 20 20 20 20 20 20 20  x into.#        
b160: 20 20 20 20 20 20 20 20 74 68 65 20 6d 69 78 20          the mix 
b170: 74 6f 20 6d 61 6b 65 20 74 68 65 20 69 6e 74 65  to make the inte
b180: 67 72 69 74 79 2d 63 68 65 63 6b 20 6d 6f 72 65  grity-check more
b190: 20 6c 69 6b 65 6c 79 20 74 6f 20 63 61 74 63 68   likely to catch
b1a0: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
b1b0: 20 20 65 72 72 6f 72 73 2e 0a 23 0a 74 65 73 74    errors..#.test
b1c0: 76 66 73 20 74 76 20 2d 64 65 66 61 75 6c 74 20  vfs tv -default 
b1d0: 31 0a 74 76 20 73 63 72 69 70 74 20 78 53 79 6e  1.tv script xSyn
b1e0: 63 43 62 0a 74 76 20 66 69 6c 74 65 72 20 78 53  cCb.tv filter xS
b1f0: 79 6e 63 0a 70 72 6f 63 20 78 53 79 6e 63 43 62  ync.proc xSyncCb
b200: 20 7b 6d 65 74 68 6f 64 20 66 69 6c 65 6e 61 6d   {method filenam
b210: 65 20 61 72 67 73 7d 20 7b 0a 20 20 73 65 74 20  e args} {.  set 
b220: 74 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 66 69  t [file tail $fi
b230: 6c 65 6e 61 6d 65 5d 0a 20 20 69 66 20 7b 24 74  lename].  if {$t
b240: 20 3d 3d 20 22 74 65 73 74 2e 64 62 22 7d 20 66   == "test.db"} f
b250: 61 75 6c 74 73 69 6d 5f 73 61 76 65 0a 20 20 72  aultsim_save.  r
b260: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a  eturn SQLITE_OK.
b270: 7d 0a 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74  }.faultsim_delet
b280: 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 64 62 20  e_and_reopen.db 
b290: 66 75 6e 63 20 61 5f 73 74 72 69 6e 67 20 61 5f  func a_string a_
b2a0: 73 74 72 69 6e 67 0a 0a 23 20 54 68 65 20 55 50  string..# The UP
b2b0: 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74 20 61  DATE statement a
b2c0: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 69  t the end of thi
b2d0: 73 20 74 65 73 74 20 63 61 73 65 20 63 72 65 61  s test case crea
b2e0: 74 65 73 20 61 20 72 65 61 6c 6c 79 20 62 69 67  tes a really big
b2f0: 0a 23 20 6a 6f 75 72 6e 61 6c 2e 20 53 69 6e 63  .# journal. Sinc
b300: 65 20 74 68 65 20 63 61 63 68 65 2d 73 69 7a 65  e the cache-size
b310: 20 69 73 20 6f 6e 6c 79 20 31 30 20 70 61 67 65   is only 10 page
b320: 73 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 63  s, the journal c
b330: 6f 6e 74 61 69 6e 73 20 0a 23 20 66 72 65 71 75  ontains .# frequ
b340: 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ent journal head
b350: 65 72 73 2e 0a 23 0a 64 6f 5f 65 78 65 63 73 71  ers..#.do_execsq
b360: 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 33  l_test pager1-13
b370: 2e 31 2e 31 20 7b 0a 20 20 50 52 41 47 4d 41 20  .1.1 {.  PRAGMA 
b380: 70 61 67 65 5f 73 69 7a 65 20 3d 20 31 30 32 34  page_size = 1024
b390: 3b 0a 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e  ;.  PRAGMA journ
b3a0: 61 6c 5f 6d 6f 64 65 20 3d 20 50 45 52 53 49 53  al_mode = PERSIS
b3b0: 54 3b 0a 20 20 50 52 41 47 4d 41 20 63 61 63 68  T;.  PRAGMA cach
b3c0: 65 5f 73 69 7a 65 20 3d 20 31 30 3b 0a 20 20 42  e_size = 10;.  B
b3d0: 45 47 49 4e 3b 0a 20 20 20 20 43 52 45 41 54 45  EGIN;.    CREATE
b3e0: 20 54 41 42 4c 45 20 74 31 28 61 20 49 4e 54 45   TABLE t1(a INTE
b3f0: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  GER PRIMARY KEY,
b400: 20 62 20 42 4c 4f 42 29 3b 0a 20 20 20 20 49 4e   b BLOB);.    IN
b410: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
b420: 55 45 53 28 4e 55 4c 4c 2c 20 61 5f 73 74 72 69  UES(NULL, a_stri
b430: 6e 67 28 34 30 30 29 29 3b 0a 20 20 20 20 49 4e  ng(400));.    IN
b440: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
b450: 45 43 54 20 4e 55 4c 4c 2c 20 61 5f 73 74 72 69  ECT NULL, a_stri
b460: 6e 67 28 34 30 30 29 20 46 52 4f 4d 20 74 31 3b  ng(400) FROM t1;
b470: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20 32            /*   2
b480: 20 2a 2f 0a 20 20 20 20 49 4e 53 45 52 54 20 49   */.    INSERT I
b490: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 4e 55  NTO t1 SELECT NU
b4a0: 4c 4c 2c 20 61 5f 73 74 72 69 6e 67 28 34 30 30  LL, a_string(400
b4b0: 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20  ) FROM t1;      
b4c0: 20 20 20 20 2f 2a 20 20 20 34 20 2a 2f 0a 20 20      /*   4 */.  
b4d0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
b4e0: 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 61 5f   SELECT NULL, a_
b4f0: 73 74 72 69 6e 67 28 34 30 30 29 20 46 52 4f 4d  string(400) FROM
b500: 20 74 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a   t1;          /*
b510: 20 20 20 38 20 2a 2f 0a 20 20 20 20 49 4e 53 45     8 */.    INSE
b520: 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
b530: 54 20 4e 55 4c 4c 2c 20 61 5f 73 74 72 69 6e 67  T NULL, a_string
b540: 28 34 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20  (400) FROM t1;  
b550: 20 20 20 20 20 20 20 20 2f 2a 20 20 31 36 20 2a          /*  16 *
b560: 2f 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  /.    INSERT INT
b570: 4f 20 74 31 20 53 45 4c 45 43 54 20 4e 55 4c 4c  O t1 SELECT NULL
b580: 2c 20 61 5f 73 74 72 69 6e 67 28 34 30 30 29 20  , a_string(400) 
b590: 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 20  FROM t1;        
b5a0: 20 20 2f 2a 20 20 33 32 20 2a 2f 0a 20 20 20 20    /*  32 */.    
b5b0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
b5c0: 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 61 5f 73 74  ELECT NULL, a_st
b5d0: 72 69 6e 67 28 34 30 30 29 20 46 52 4f 4d 20 74  ring(400) FROM t
b5e0: 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20  1;          /*  
b5f0: 36 34 20 2a 2f 0a 20 20 20 20 49 4e 53 45 52 54  64 */.    INSERT
b600: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
b610: 4e 55 4c 4c 2c 20 61 5f 73 74 72 69 6e 67 28 34  NULL, a_string(4
b620: 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20  00) FROM t1;    
b630: 20 20 20 20 20 20 2f 2a 20 31 32 38 20 2a 2f 0a        /* 128 */.
b640: 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 55 50 44 41    COMMIT;.  UPDA
b650: 54 45 20 74 31 20 53 45 54 20 62 20 3d 20 61 5f  TE t1 SET b = a_
b660: 73 74 72 69 6e 67 28 34 30 30 29 3b 0a 7d 20 7b  string(400);.} {
b670: 70 65 72 73 69 73 74 7d 0a 0a 23 20 52 75 6e 20  persist}..# Run 
b680: 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 6f 66 20  transactions of 
b690: 69 6e 63 72 65 61 73 69 6e 67 20 73 69 7a 65 73  increasing sizes
b6a0: 2e 20 45 76 65 6e 74 75 61 6c 6c 79 2c 20 6f 6e  . Eventually, on
b6b0: 65 20 28 6f 72 20 6d 6f 72 65 20 74 68 61 6e 20  e (or more than 
b6c0: 6f 6e 65 29 0a 23 20 6f 66 20 74 68 65 73 65 20  one).# of these 
b6d0: 77 69 6c 6c 20 77 72 69 74 65 20 6a 75 73 74 20  will write just 
b6e0: 65 6e 6f 75 67 68 20 63 6f 6e 74 65 6e 74 20 74  enough content t
b6f0: 68 61 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 6f  hat one of the o
b700: 6c 64 20 68 65 61 64 65 72 73 20 63 72 65 61 74  ld headers creat
b710: 65 64 20 0a 23 20 62 79 20 74 68 65 20 74 72 61  ed .# by the tra
b720: 6e 73 61 63 74 69 6f 6e 20 69 6e 20 74 68 65 20  nsaction in the 
b730: 62 6c 6f 63 6b 20 61 62 6f 76 65 20 6c 69 65 73  block above lies
b740: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74   immediately aft
b750: 65 72 20 74 68 65 20 63 6f 6e 74 65 6e 74 0a 23  er the content.#
b760: 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 62 79 20 74   journalled by t
b770: 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73  he current trans
b780: 61 63 74 69 6f 6e 2e 0a 23 0a 66 6f 72 20 7b 73  action..#.for {s
b790: 65 74 20 6e 55 70 20 31 7d 20 7b 24 6e 55 70 3c  et nUp 1} {$nUp<
b7a0: 36 34 7d 20 7b 69 6e 63 72 20 6e 55 70 7d 20 7b  64} {incr nUp} {
b7b0: 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  .  do_execsql_te
b7c0: 73 74 20 70 61 67 65 72 31 2d 31 33 2e 31 2e 32  st pager1-13.1.2
b7d0: 2e 24 6e 55 70 2e 31 20 7b 20 0a 20 20 20 20 55  .$nUp.1 { .    U
b7e0: 50 44 41 54 45 20 74 31 20 53 45 54 20 62 20 3d  PDATE t1 SET b =
b7f0: 20 61 5f 73 74 72 69 6e 67 28 33 39 39 29 20 57   a_string(399) W
b800: 48 45 52 45 20 61 20 3c 3d 20 24 6e 55 70 0a 20  HERE a <= $nUp. 
b810: 20 7d 20 7b 7d 0a 20 20 64 6f 5f 65 78 65 63 73   } {}.  do_execs
b820: 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31  ql_test pager1-1
b830: 33 2e 31 2e 32 2e 24 6e 55 70 2e 32 20 7b 20 50  3.1.2.$nUp.2 { P
b840: 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f  RAGMA integrity_
b850: 63 68 65 63 6b 20 7d 20 7b 6f 6b 7d 20 0a 0a 20  check } {ok} .. 
b860: 20 23 20 54 72 79 20 74 6f 20 61 63 63 65 73 73   # Try to access
b870: 20 74 68 65 20 73 6e 61 70 73 68 6f 74 20 6f 66   the snapshot of
b880: 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
b890: 2e 0a 20 20 23 0a 20 20 73 71 6c 69 74 65 33 20  ..  #.  sqlite3 
b8a0: 64 62 32 20 73 76 5f 74 65 73 74 2e 64 62 0a 20  db2 sv_test.db. 
b8b0: 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
b8c0: 31 33 2e 31 2e 32 2e 24 6e 55 70 2e 33 20 7b 0a  13.1.2.$nUp.3 {.
b8d0: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45      execsql { SE
b8e0: 4c 45 43 54 20 73 75 6d 28 6c 65 6e 67 74 68 28  LECT sum(length(
b8f0: 62 29 29 20 46 52 4f 4d 20 74 31 20 7d 20 64 62  b)) FROM t1 } db
b900: 32 0a 20 20 7d 20 5b 65 78 70 72 20 7b 31 32 38  2.  } [expr {128
b910: 2a 34 30 30 20 2d 20 28 24 6e 55 70 2d 31 29 7d  *400 - ($nUp-1)}
b920: 5d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65  ].  do_test page
b930: 72 31 2d 31 33 2e 31 2e 32 2e 24 6e 55 70 2e 34  r1-13.1.2.$nUp.4
b940: 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   {.    execsql {
b950: 20 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74   PRAGMA integrit
b960: 79 5f 63 68 65 63 6b 20 7d 20 64 62 32 0a 20 20  y_check } db2.  
b970: 7d 20 7b 6f 6b 7d 0a 20 20 64 62 32 20 63 6c 6f  } {ok}.  db2 clo
b980: 73 65 0a 7d 0a 0a 23 20 53 61 6d 65 20 74 65 73  se.}..# Same tes
b990: 74 20 61 73 20 61 62 6f 76 65 2e 20 42 75 74 20  t as above. But 
b9a0: 74 68 69 73 20 74 69 6d 65 20 77 69 74 68 20 61  this time with a
b9b0: 6e 20 69 6e 64 65 78 20 6f 6e 20 74 68 65 20 74  n index on the t
b9c0: 61 62 6c 65 2e 0a 23 0a 64 6f 5f 65 78 65 63 73  able..#.do_execs
b9d0: 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31  ql_test pager1-1
b9e0: 33 2e 32 2e 31 20 7b 0a 20 20 43 52 45 41 54 45  3.2.1 {.  CREATE
b9f0: 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28   INDEX i1 ON t1(
ba00: 62 29 3b 0a 20 20 55 50 44 41 54 45 20 74 31 20  b);.  UPDATE t1 
ba10: 53 45 54 20 62 20 3d 20 61 5f 73 74 72 69 6e 67  SET b = a_string
ba20: 28 34 30 30 29 3b 0a 7d 20 7b 7d 0a 66 6f 72 20  (400);.} {}.for 
ba30: 7b 73 65 74 20 6e 55 70 20 31 7d 20 7b 24 6e 55  {set nUp 1} {$nU
ba40: 70 3c 36 34 7d 20 7b 69 6e 63 72 20 6e 55 70 7d  p<64} {incr nUp}
ba50: 20 7b 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f   {.  do_execsql_
ba60: 74 65 73 74 20 70 61 67 65 72 31 2d 31 33 2e 32  test pager1-13.2
ba70: 2e 32 2e 24 6e 55 70 2e 31 20 7b 20 0a 20 20 20  .2.$nUp.1 { .   
ba80: 20 55 50 44 41 54 45 20 74 31 20 53 45 54 20 62   UPDATE t1 SET b
ba90: 20 3d 20 61 5f 73 74 72 69 6e 67 28 33 39 39 29   = a_string(399)
baa0: 20 57 48 45 52 45 20 61 20 3c 3d 20 24 6e 55 70   WHERE a <= $nUp
bab0: 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 65 78 65  .  } {}.  do_exe
bac0: 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31  csql_test pager1
bad0: 2d 31 33 2e 32 2e 32 2e 24 6e 55 70 2e 32 20 7b  -13.2.2.$nUp.2 {
bae0: 20 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74   PRAGMA integrit
baf0: 79 5f 63 68 65 63 6b 20 7d 20 7b 6f 6b 7d 20 0a  y_check } {ok} .
bb00: 20 20 73 71 6c 69 74 65 33 20 64 62 32 20 73 76    sqlite3 db2 sv
bb10: 5f 74 65 73 74 2e 64 62 0a 20 20 64 6f 5f 74 65  _test.db.  do_te
bb20: 73 74 20 70 61 67 65 72 31 2d 31 33 2e 32 2e 32  st pager1-13.2.2
bb30: 2e 24 6e 55 70 2e 33 20 7b 0a 20 20 20 20 65 78  .$nUp.3 {.    ex
bb40: 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 73  ecsql { SELECT s
bb50: 75 6d 28 6c 65 6e 67 74 68 28 62 29 29 20 46 52  um(length(b)) FR
bb60: 4f 4d 20 74 31 20 7d 20 64 62 32 0a 20 20 7d 20  OM t1 } db2.  } 
bb70: 5b 65 78 70 72 20 7b 31 32 38 2a 34 30 30 20 2d  [expr {128*400 -
bb80: 20 28 24 6e 55 70 2d 31 29 7d 5d 0a 20 20 64 6f   ($nUp-1)}].  do
bb90: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 33 2e  _test pager1-13.
bba0: 32 2e 32 2e 24 6e 55 70 2e 34 20 7b 0a 20 20 20  2.2.$nUp.4 {.   
bbb0: 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d   execsql { PRAGM
bbc0: 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63  A integrity_chec
bbd0: 6b 20 7d 20 64 62 32 0a 20 20 7d 20 7b 6f 6b 7d  k } db2.  } {ok}
bbe0: 0a 20 20 64 62 32 20 63 6c 6f 73 65 0a 7d 0a 0a  .  db2 close.}..
bbf0: 64 62 20 63 6c 6f 73 65 0a 74 76 20 64 65 6c 65  db close.tv dele
bc00: 74 65 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  te..#-----------
bc10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bc20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bc30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bc40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
bc50: 20 54 65 73 74 20 73 70 65 63 61 6c 20 22 50 52   Test specal "PR
bc60: 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
bc70: 65 3d 4f 46 46 22 20 74 65 73 74 20 63 61 73 65  e=OFF" test case
bc80: 73 2e 0a 23 0a 66 61 75 6c 74 73 69 6d 5f 64 65  s..#.faultsim_de
bc90: 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a  lete_and_reopen.
bca0: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
bcb0: 70 61 67 65 72 31 2d 31 34 2e 31 2e 31 20 7b 0a  pager1-14.1.1 {.
bcc0: 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c    PRAGMA journal
bcd0: 5f 6d 6f 64 65 20 3d 20 4f 46 46 3b 0a 20 20 43  _mode = OFF;.  C
bce0: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61  REATE TABLE t1(a
bcf0: 2c 20 62 29 3b 0a 20 20 42 45 47 49 4e 3b 0a 20  , b);.  BEGIN;. 
bd00: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
bd10: 31 20 56 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a  1 VALUES(1, 2);.
bd20: 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 53 45 4c 45    COMMIT;.  SELE
bd30: 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 7d 20  CT * FROM t1;.} 
bd40: 7b 6f 66 66 20 31 20 32 7d 0a 64 6f 5f 63 61 74  {off 1 2}.do_cat
bd50: 63 68 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72  chsql_test pager
bd60: 31 2d 31 34 2e 31 2e 32 20 7b 0a 20 20 42 45 47  1-14.1.2 {.  BEG
bd70: 49 4e 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  IN;.    INSERT I
bd80: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 33 2c  NTO t1 VALUES(3,
bd90: 20 34 29 3b 0a 20 20 52 4f 4c 4c 42 41 43 4b 3b   4);.  ROLLBACK;
bda0: 0a 7d 20 7b 30 20 7b 7d 7d 0a 64 6f 5f 65 78 65  .} {0 {}}.do_exe
bdb0: 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31  csql_test pager1
bdc0: 2d 31 34 2e 31 2e 33 20 7b 0a 20 20 53 45 4c 45  -14.1.3 {.  SELE
bdd0: 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 7d 20  CT * FROM t1;.} 
bde0: 7b 31 20 32 20 33 20 34 7d 0a 64 6f 5f 63 61 74  {1 2 3 4}.do_cat
bdf0: 63 68 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72  chsql_test pager
be00: 31 2d 31 34 2e 31 2e 34 20 7b 0a 20 20 42 45 47  1-14.1.4 {.  BEG
be10: 49 4e 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  IN;.    INSERT I
be20: 4e 54 4f 20 74 31 28 72 6f 77 69 64 2c 20 61 2c  NTO t1(rowid, a,
be30: 20 62 29 20 53 45 4c 45 43 54 20 61 2b 33 2c 20   b) SELECT a+3, 
be40: 62 2c 20 62 20 46 52 4f 4d 20 74 31 3b 0a 20 20  b, b FROM t1;.  
be50: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
be60: 28 72 6f 77 69 64 2c 20 61 2c 20 62 29 20 53 45  (rowid, a, b) SE
be70: 4c 45 43 54 20 61 2b 33 2c 20 62 2c 20 62 20 46  LECT a+3, b, b F
be80: 52 4f 4d 20 74 31 3b 0a 7d 20 7b 31 20 7b 50 52  ROM t1;.} {1 {PR
be90: 49 4d 41 52 59 20 4b 45 59 20 6d 75 73 74 20 62  IMARY KEY must b
bea0: 65 20 75 6e 69 71 75 65 7d 7d 0a 64 6f 5f 65 78  e unique}}.do_ex
beb0: 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72  ecsql_test pager
bec0: 31 2d 31 34 2e 31 2e 35 20 7b 0a 20 20 43 4f 4d  1-14.1.5 {.  COM
bed0: 4d 49 54 3b 0a 20 20 53 45 4c 45 43 54 20 2a 20  MIT;.  SELECT * 
bee0: 46 52 4f 4d 20 74 31 3b 0a 7d 20 7b 31 20 32 20  FROM t1;.} {1 2 
bef0: 33 20 34 20 32 20 32 20 34 20 34 7d 0a 0a 23 2d  3 4 2 2 4 4}..#-
bf00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bf10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bf20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bf30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bf40: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20  --------.# Test 
bf50: 6f 70 65 6e 69 6e 67 20 61 6e 64 20 63 6c 6f 73  opening and clos
bf60: 69 6e 67 20 74 68 65 20 70 61 67 65 72 20 73 75  ing the pager su
bf70: 62 2d 73 79 73 74 65 6d 20 77 69 74 68 20 64 69  b-system with di
bf80: 66 66 65 72 65 6e 74 20 76 61 6c 75 65 73 0a 23  fferent values.#
bf90: 20 66 6f 72 20 74 68 65 20 73 71 6c 69 74 65 33   for the sqlite3
bfa0: 5f 76 66 73 2e 73 7a 4f 73 46 69 6c 65 20 76 61  _vfs.szOsFile va
bfb0: 72 69 61 62 6c 65 2e 0a 23 0a 66 61 75 6c 74 73  riable..#.faults
bfc0: 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65  im_delete_and_re
bfd0: 6f 70 65 6e 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  open.do_execsql_
bfe0: 74 65 73 74 20 70 61 67 65 72 31 2d 31 35 2e 30  test pager1-15.0
bff0: 20 7b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c   {.  CREATE TABL
c000: 45 20 74 78 28 79 2c 20 7a 29 3b 0a 20 20 49 4e  E tx(y, z);.  IN
c010: 53 45 52 54 20 49 4e 54 4f 20 74 78 20 56 41 4c  SERT INTO tx VAL
c020: 55 45 53 28 27 41 79 75 74 74 68 61 79 61 27 2c  UES('Ayutthaya',
c030: 20 27 42 65 69 6a 69 6e 67 27 29 3b 0a 20 20 49   'Beijing');.  I
c040: 4e 53 45 52 54 20 49 4e 54 4f 20 74 78 20 56 41  NSERT INTO tx VA
c050: 4c 55 45 53 28 27 4c 6f 6e 64 6f 6e 27 2c 20 27  LUES('London', '
c060: 54 6f 6b 79 6f 27 29 3b 0a 7d 20 7b 7d 0a 64 62  Tokyo');.} {}.db
c070: 20 63 6c 6f 73 65 0a 66 6f 72 20 7b 73 65 74 20   close.for {set 
c080: 69 20 30 7d 20 7b 24 69 3c 35 31 33 7d 20 7b 69  i 0} {$i<513} {i
c090: 6e 63 72 20 69 20 33 7d 20 7b 0a 20 20 74 65 73  ncr i 3} {.  tes
c0a0: 74 76 66 73 20 74 76 20 2d 64 65 66 61 75 6c 74  tvfs tv -default
c0b0: 20 31 20 2d 73 7a 6f 73 66 69 6c 65 20 24 69 0a   1 -szosfile $i.
c0c0: 20 20 73 71 6c 69 74 65 33 20 64 62 20 74 65 73    sqlite3 db tes
c0d0: 74 2e 64 62 0a 20 20 64 6f 5f 65 78 65 63 73 71  t.db.  do_execsq
c0e0: 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 35  l_test pager1-15
c0f0: 2e 24 69 2e 31 20 7b 0a 20 20 20 20 53 45 4c 45  .$i.1 {.    SELE
c100: 43 54 20 2a 20 46 52 4f 4d 20 74 78 3b 0a 20 20  CT * FROM tx;.  
c110: 7d 20 7b 41 79 75 74 74 68 61 79 61 20 42 65 69  } {Ayutthaya Bei
c120: 6a 69 6e 67 20 4c 6f 6e 64 6f 6e 20 54 6f 6b 79  jing London Toky
c130: 6f 7d 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20  o}.  db close.  
c140: 74 76 20 64 65 6c 65 74 65 0a 7d 0a 0a 23 2d 2d  tv delete.}..#--
c150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c190: 2d 2d 2d 2d 2d 2d 2d 0a 23 20 43 68 65 63 6b 20  -------.# Check 
c1a0: 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20 70  that it is not p
c1b0: 6f 73 73 69 62 6c 65 20 74 6f 20 6f 70 65 6e 20  ossible to open 
c1c0: 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  a database file 
c1d0: 69 66 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68  if the full path
c1e0: 0a 23 20 74 6f 20 74 68 65 20 61 73 73 6f 63 69  .# to the associ
c1f0: 61 74 65 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ated journal fil
c200: 65 20 77 69 6c 6c 20 62 65 20 6c 6f 6e 67 65 72  e will be longer
c210: 20 74 68 61 6e 20 73 71 6c 69 74 65 33 5f 76 66   than sqlite3_vf
c220: 73 2e 6d 78 50 61 74 68 6e 61 6d 65 2e 0a 23 0a  s.mxPathname..#.
c230: 74 65 73 74 76 66 73 20 74 76 20 2d 64 65 66 61  testvfs tv -defa
c240: 75 6c 74 20 31 0a 74 76 20 73 63 72 69 70 74 20  ult 1.tv script 
c250: 78 4f 70 65 6e 43 62 0a 74 76 20 66 69 6c 74 65  xOpenCb.tv filte
c260: 72 20 78 4f 70 65 6e 0a 70 72 6f 63 20 78 4f 70  r xOpen.proc xOp
c270: 65 6e 43 62 20 7b 6d 65 74 68 6f 64 20 66 69 6c  enCb {method fil
c280: 65 6e 61 6d 65 7d 20 7b 0a 20 20 73 65 74 20 3a  ename} {.  set :
c290: 3a 66 69 6c 65 5f 6c 65 6e 20 5b 73 74 72 69 6e  :file_len [strin
c2a0: 67 20 6c 65 6e 67 74 68 20 24 66 69 6c 65 6e 61  g length $filena
c2b0: 6d 65 5d 0a 7d 0a 73 71 6c 69 74 65 33 20 64 62  me].}.sqlite3 db
c2c0: 20 74 65 73 74 2e 64 62 0a 64 62 20 63 6c 6f 73   test.db.db clos
c2d0: 65 0a 74 76 20 64 65 6c 65 74 65 0a 0a 66 6f 72  e.tv delete..for
c2e0: 20 7b 73 65 74 20 69 69 20 5b 65 78 70 72 20 24   {set ii [expr $
c2f0: 3a 3a 66 69 6c 65 5f 6c 65 6e 2d 35 5d 7d 20 7b  ::file_len-5]} {
c300: 24 69 69 20 3c 20 5b 65 78 70 72 20 24 3a 3a 66  $ii < [expr $::f
c310: 69 6c 65 5f 6c 65 6e 2b 32 30 5d 7d 20 7b 69 6e  ile_len+20]} {in
c320: 63 72 20 69 69 7d 20 7b 0a 20 20 74 65 73 74 76  cr ii} {.  testv
c330: 66 73 20 74 76 20 2d 64 65 66 61 75 6c 74 20 31  fs tv -default 1
c340: 20 2d 6d 78 70 61 74 68 6e 61 6d 65 20 24 69 69   -mxpathname $ii
c350: 0a 0a 20 20 23 20 54 68 65 20 6c 65 6e 67 74 68  ..  # The length
c360: 20 6f 66 20 74 68 65 20 66 75 6c 6c 20 70 61 74   of the full pat
c370: 68 20 74 6f 20 66 69 6c 65 20 22 74 65 73 74 2e  h to file "test.
c380: 64 62 2d 6a 6f 75 72 6e 61 6c 22 20 69 73 20 28  db-journal" is (
c390: 24 3a 3a 66 69 6c 65 5f 6c 65 6e 2b 38 29 2e 0a  $::file_len+8)..
c3a0: 20 20 23 20 49 66 20 74 68 65 20 63 6f 6e 66 69    # If the confi
c3b0: 67 75 72 65 64 20 73 71 6c 69 74 65 33 5f 76 66  gured sqlite3_vf
c3c0: 73 2e 6d 78 50 61 74 68 6e 61 6d 65 20 76 61 6c  s.mxPathname val
c3d0: 75 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  ue greater than 
c3e0: 6f 72 20 65 71 75 61 6c 20 74 6f 0a 20 20 23 20  or equal to.  # 
c3f0: 74 68 69 73 2c 20 74 68 65 6e 20 74 68 65 20 66  this, then the f
c400: 69 6c 65 20 63 61 6e 20 62 65 20 6f 70 65 6e 65  ile can be opene
c410: 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  d. Otherwise, it
c420: 20 63 61 6e 6e 6f 74 2e 0a 20 20 23 0a 20 20 69   cannot..  #.  i
c430: 66 20 7b 24 69 69 20 3e 3d 20 5b 65 78 70 72 20  f {$ii >= [expr 
c440: 24 3a 3a 66 69 6c 65 5f 6c 65 6e 2b 38 5d 7d 20  $::file_len+8]} 
c450: 7b 0a 20 20 20 20 73 65 74 20 72 65 73 20 7b 30  {.    set res {0
c460: 20 7b 7d 7d 0a 20 20 7d 20 65 6c 73 65 20 7b 0a   {}}.  } else {.
c470: 20 20 20 20 73 65 74 20 72 65 73 20 7b 31 20 7b      set res {1 {
c480: 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 64  unable to open d
c490: 61 74 61 62 61 73 65 20 66 69 6c 65 7d 7d 0a 20  atabase file}}. 
c4a0: 20 7d 0a 0a 20 20 64 6f 5f 74 65 73 74 20 70 61   }..  do_test pa
c4b0: 67 65 72 31 2d 31 36 2e 31 2e 24 69 69 20 7b 0a  ger1-16.1.$ii {.
c4c0: 20 20 20 20 6c 69 73 74 20 5b 63 61 74 63 68 20      list [catch 
c4d0: 7b 20 73 71 6c 69 74 65 33 20 64 62 20 74 65 73  { sqlite3 db tes
c4e0: 74 2e 64 62 20 7d 20 6d 73 67 5d 20 24 6d 73 67  t.db } msg] $msg
c4f0: 0a 20 20 7d 20 24 72 65 73 0a 0a 20 20 63 61 74  .  } $res..  cat
c500: 63 68 20 7b 64 62 20 63 6c 6f 73 65 7d 0a 20 20  ch {db close}.  
c510: 74 76 20 64 65 6c 65 74 65 0a 7d 0a 0a 23 2d 2d  tv delete.}..#--
c520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c560: 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 22  -------.# Test "
c570: 50 52 41 47 4d 41 20 6f 6d 69 74 5f 72 65 61 64  PRAGMA omit_read
c580: 6c 6f 63 6b 22 2e 20 0a 23 0a 23 20 20 20 70 61  lock". .#.#   pa
c590: 67 65 72 31 2d 31 37 2e 24 74 6e 2e 31 2e 2a 3a  ger1-17.$tn.1.*:
c5a0: 20 54 65 73 74 20 74 68 61 74 20 69 66 20 61 20   Test that if a 
c5b0: 73 65 63 6f 6e 64 20 63 6f 6e 6e 65 63 74 69 6f  second connectio
c5c0: 6e 20 68 61 73 20 61 6e 20 6f 70 65 6e 20 0a 23  n has an open .#
c5d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c5e0: 20 20 20 20 20 20 72 65 61 64 2d 74 72 61 6e 73        read-trans
c5f0: 61 63 74 69 6f 6e 2c 20 69 74 20 69 73 20 6e 6f  action, it is no
c600: 74 20 75 73 75 61 6c 6c 79 20 70 6f 73 73 69 62  t usually possib
c610: 6c 65 20 74 6f 20 77 72 69 74 65 20 0a 23 20 20  le to write .#  
c620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c630: 20 20 20 20 74 68 65 20 64 61 74 61 62 61 73 65      the database
c640: 2e 0a 23 0a 23 20 20 20 70 61 67 65 72 31 2d 31  ..#.#   pager1-1
c650: 37 2e 24 74 6e 2e 32 2e 2a 3a 20 54 65 73 74 20  7.$tn.2.*: Test 
c660: 74 68 61 74 20 69 66 20 74 68 65 20 73 65 63 6f  that if the seco
c670: 6e 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 61  nd connection wa
c680: 73 20 6f 70 65 6e 65 64 20 77 69 74 68 0a 23 20  s opened with.# 
c690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c6a0: 20 20 20 20 20 74 68 65 20 53 51 4c 49 54 45 5f       the SQLITE_
c6b0: 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 66 6c  OPEN_READONLY fl
c6c0: 61 67 2c 20 61 6e 64 20 0a 23 20 20 20 20 20 20  ag, and .#      
c6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c6e0: 22 50 52 41 47 4d 41 20 6f 6d 69 74 5f 72 65 61  "PRAGMA omit_rea
c6f0: 64 6c 6f 63 6b 20 3d 20 31 22 20 69 73 20 65 78  dlock = 1" is ex
c700: 65 63 75 74 65 64 20 62 65 66 6f 72 65 20 61 74  ecuted before at
c710: 74 61 63 68 69 6e 67 0a 23 20 20 20 20 20 20 20  taching.#       
c720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
c730: 68 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  he database and 
c740: 6f 70 65 6e 69 6e 67 20 61 20 72 65 61 64 2d 74  opening a read-t
c750: 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 69 74  ransaction on it
c760: 2c 20 69 74 20 69 73 0a 23 20 20 20 20 20 20 20  , it is.#       
c770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
c780: 6f 73 73 69 62 6c 65 20 74 6f 20 77 72 69 74 65  ossible to write
c790: 20 74 68 65 20 64 62 2e 0a 23 0a 23 20 20 20 70   the db..#.#   p
c7a0: 61 67 65 72 31 2d 31 37 2e 24 74 6e 2e 33 2e 2a  ager1-17.$tn.3.*
c7b0: 3a 20 54 65 73 74 20 74 68 61 74 20 69 66 20 74  : Test that if t
c7c0: 68 65 20 73 65 63 6f 6e 64 20 63 6f 6e 6e 65 63  he second connec
c7d0: 74 69 6f 6e 20 77 61 73 20 2a 6e 6f 74 2a 20 6f  tion was *not* o
c7e0: 70 65 6e 65 64 20 77 69 74 68 0a 23 20 20 20 20  pened with.#    
c7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c800: 20 20 74 68 65 20 53 51 4c 49 54 45 5f 4f 50 45    the SQLITE_OPE
c810: 4e 5f 52 45 41 44 4f 4e 4c 59 20 66 6c 61 67 2c  N_READONLY flag,
c820: 20 65 78 65 63 75 74 69 6e 67 20 0a 23 20 20 20   executing .#   
c830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c840: 20 20 20 22 50 52 41 47 4d 41 20 6f 6d 69 74 5f     "PRAGMA omit_
c850: 72 65 61 64 6c 6f 63 6b 20 3d 20 31 22 20 68 61  readlock = 1" ha
c860: 73 20 6e 6f 20 65 66 66 65 63 74 2e 0a 23 0a 64  s no effect..#.d
c870: 6f 5f 6d 75 6c 74 69 63 6c 69 65 6e 74 5f 74 65  o_multiclient_te
c880: 73 74 20 74 6e 20 7b 0a 20 20 64 6f 5f 74 65 73  st tn {.  do_tes
c890: 74 20 70 61 67 65 72 31 2d 31 37 2e 24 74 6e 2e  t pager1-17.$tn.
c8a0: 31 2e 31 20 7b 0a 20 20 20 20 73 71 6c 31 20 7b  1.1 {.    sql1 {
c8b0: 20 0a 20 20 20 20 20 20 43 52 45 41 54 45 20 54   .      CREATE T
c8c0: 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20  ABLE t1(a, b);. 
c8d0: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
c8e0: 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20 32 29   t1 VALUES(1, 2)
c8f0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 32  ;.    }.    sql2
c900: 20 7b 0a 20 20 20 20 20 20 42 45 47 49 4e 3b 0a   {.      BEGIN;.
c910: 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46        SELECT * F
c920: 52 4f 4d 20 74 31 3b 0a 20 20 20 20 7d 0a 20 20  ROM t1;.    }.  
c930: 7d 20 7b 31 20 32 7d 0a 20 20 64 6f 5f 74 65 73  } {1 2}.  do_tes
c940: 74 20 70 61 67 65 72 31 2d 31 37 2e 24 74 6e 2e  t pager1-17.$tn.
c950: 31 2e 32 20 7b 0a 20 20 20 20 63 73 71 6c 31 20  1.2 {.    csql1 
c960: 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31  { INSERT INTO t1
c970: 20 56 41 4c 55 45 53 28 33 2c 20 34 29 20 7d 0a   VALUES(3, 4) }.
c980: 20 20 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65    } {1 {database
c990: 20 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 20 20 64   is locked}}.  d
c9a0: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 37  o_test pager1-17
c9b0: 2e 24 74 6e 2e 31 2e 33 20 7b 0a 20 20 20 20 73  .$tn.1.3 {.    s
c9c0: 71 6c 32 20 7b 20 43 4f 4d 4d 49 54 20 7d 0a 20  ql2 { COMMIT }. 
c9d0: 20 20 20 73 71 6c 31 20 7b 20 49 4e 53 45 52 54     sql1 { INSERT
c9e0: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
c9f0: 33 2c 20 34 29 20 7d 0a 20 20 7d 20 7b 7d 0a 0a  3, 4) }.  } {}..
ca00: 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
ca10: 2d 31 37 2e 24 74 6e 2e 32 2e 31 20 7b 0a 20 20  -17.$tn.2.1 {.  
ca20: 20 20 63 6f 64 65 32 20 7b 0a 20 20 20 20 20 20    code2 {.      
ca30: 64 62 32 20 63 6c 6f 73 65 0a 20 20 20 20 20 20  db2 close.      
ca40: 73 71 6c 69 74 65 33 20 64 62 32 20 3a 6d 65 6d  sqlite3 db2 :mem
ca50: 6f 72 79 3a 20 2d 72 65 61 64 6f 6e 6c 79 20 31  ory: -readonly 1
ca60: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 32 20  .    }.    sql2 
ca70: 7b 20 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20  { .      PRAGMA 
ca80: 6f 6d 69 74 5f 72 65 61 64 6c 6f 63 6b 20 3d 20  omit_readlock = 
ca90: 31 3b 0a 20 20 20 20 20 20 41 54 54 41 43 48 20  1;.      ATTACH 
caa0: 27 74 65 73 74 2e 64 62 27 20 41 53 20 74 77 6f  'test.db' AS two
cab0: 3b 0a 20 20 20 20 20 20 42 45 47 49 4e 3b 0a 20  ;.      BEGIN;. 
cac0: 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52       SELECT * FR
cad0: 4f 4d 20 74 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  OM t1;.    }.  }
cae0: 20 7b 31 20 32 20 33 20 34 7d 0a 20 20 64 6f 5f   {1 2 3 4}.  do_
caf0: 74 65 73 74 20 70 61 67 65 72 31 2d 31 37 2e 24  test pager1-17.$
cb00: 74 6e 2e 32 2e 32 20 7b 20 73 71 6c 31 20 22 49  tn.2.2 { sql1 "I
cb10: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
cb20: 4c 55 45 53 28 35 2c 20 36 29 22 20 7d 20 7b 7d  LUES(5, 6)" } {}
cb30: 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72  .  do_test pager
cb40: 31 2d 31 37 2e 24 74 6e 2e 32 2e 33 20 7b 20 73  1-17.$tn.2.3 { s
cb50: 71 6c 32 20 22 53 45 4c 45 43 54 20 2a 20 46 52  ql2 "SELECT * FR
cb60: 4f 4d 20 74 31 22 20 7d 20 20 20 20 20 20 20 20  OM t1" }        
cb70: 20 20 20 20 7b 31 20 32 20 33 20 34 7d 0a 20 20      {1 2 3 4}.  
cb80: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31  do_test pager1-1
cb90: 37 2e 24 74 6e 2e 32 2e 34 20 7b 20 73 71 6c 32  7.$tn.2.4 { sql2
cba0: 20 22 43 4f 4d 4d 49 54 20 3b 20 53 45 4c 45 43   "COMMIT ; SELEC
cbb0: 54 20 2a 20 46 52 4f 4d 20 74 31 22 20 7d 20 20  T * FROM t1" }  
cbc0: 20 7b 31 20 32 20 33 20 34 20 35 20 36 7d 0a 0a   {1 2 3 4 5 6}..
cbd0: 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
cbe0: 2d 31 37 2e 24 74 6e 2e 33 2e 31 20 7b 0a 20 20  -17.$tn.3.1 {.  
cbf0: 20 20 63 6f 64 65 32 20 7b 0a 20 20 20 20 20 20    code2 {.      
cc00: 64 62 32 20 63 6c 6f 73 65 0a 20 20 20 20 20 20  db2 close.      
cc10: 73 71 6c 69 74 65 33 20 64 62 32 20 3a 6d 65 6d  sqlite3 db2 :mem
cc20: 6f 72 79 3a 0a 20 20 20 20 7d 0a 20 20 20 20 73  ory:.    }.    s
cc30: 71 6c 32 20 7b 20 0a 20 20 20 20 20 20 50 52 41  ql2 { .      PRA
cc40: 47 4d 41 20 6f 6d 69 74 5f 72 65 61 64 6c 6f 63  GMA omit_readloc
cc50: 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20 41 54 54  k = 1;.      ATT
cc60: 41 43 48 20 27 74 65 73 74 2e 64 62 27 20 41 53  ACH 'test.db' AS
cc70: 20 74 77 6f 3b 0a 20 20 20 20 20 20 42 45 47 49   two;.      BEGI
cc80: 4e 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20  N;.      SELECT 
cc90: 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 7d  * FROM t1;.    }
cca0: 0a 20 20 7d 20 7b 31 20 32 20 33 20 34 20 35 20  .  } {1 2 3 4 5 
ccb0: 36 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67  6}.  do_test pag
ccc0: 65 72 31 2d 31 37 2e 24 74 6e 2e 33 2e 32 20 7b  er1-17.$tn.3.2 {
ccd0: 0a 20 20 20 20 63 73 71 6c 31 20 7b 20 49 4e 53  .    csql1 { INS
cce0: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
ccf0: 45 53 28 33 2c 20 34 29 20 7d 0a 20 20 7d 20 7b  ES(3, 4) }.  } {
cd00: 31 20 7b 64 61 74 61 62 61 73 65 20 69 73 20 6c  1 {database is l
cd10: 6f 63 6b 65 64 7d 7d 0a 20 20 64 6f 5f 74 65 73  ocked}}.  do_tes
cd20: 74 20 70 61 67 65 72 31 2d 31 37 2e 24 74 6e 2e  t pager1-17.$tn.
cd30: 33 2e 33 20 7b 20 73 71 6c 32 20 43 4f 4d 4d 49  3.3 { sql2 COMMI
cd40: 54 20 7d 20 7b 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d  T } {}.}..#-----
cd50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cd60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cd70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cd80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cd90: 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68 65 20  ----.# Test the 
cda0: 70 61 67 65 72 73 20 72 65 73 70 6f 6e 73 65 20  pagers response 
cdb0: 74 6f 20 74 68 65 20 62 2d 74 72 65 65 20 6c 61  to the b-tree la
cdc0: 79 65 72 20 72 65 71 75 65 73 74 69 6e 67 20 69  yer requesting i
cdd0: 6c 6c 65 67 61 6c 20 70 61 67 65 20 0a 23 20 6e  llegal page .# n
cde0: 75 6d 62 65 72 73 3a 0a 23 0a 23 20 20 20 2b 20  umbers:.#.#   + 
cdf0: 54 68 65 20 6c 6f 63 6b 69 6e 67 20 70 61 67 65  The locking page
ce00: 2c 0a 23 20 20 20 2b 20 50 61 67 65 20 30 2c 0a  ,.#   + Page 0,.
ce10: 23 20 20 20 2b 20 41 20 70 61 67 65 20 77 69 74  #   + A page wit
ce20: 68 20 61 20 70 61 67 65 20 6e 75 6d 62 65 72 20  h a page number 
ce30: 67 72 65 61 74 65 72 20 74 68 61 6e 20 28 32 5e  greater than (2^
ce40: 33 31 2d 31 29 2e 0a 23 0a 64 6f 5f 74 65 73 74  31-1)..#.do_test
ce50: 20 70 61 67 65 72 31 2d 31 38 2e 31 20 7b 0a 20   pager1-18.1 {. 
ce60: 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65   faultsim_delete
ce70: 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 64 62  _and_reopen.  db
ce80: 20 66 75 6e 63 20 61 5f 73 74 72 69 6e 67 20 61   func a_string a
ce90: 5f 73 74 72 69 6e 67 0a 20 20 65 78 65 63 73 71  _string.  execsq
cea0: 6c 20 7b 20 0a 20 20 20 20 50 52 41 47 4d 41 20  l { .    PRAGMA 
ceb0: 70 61 67 65 5f 73 69 7a 65 20 3d 20 31 30 32 34  page_size = 1024
cec0: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
ced0: 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20  LE t1(a, b);.   
cee0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
cef0: 56 41 4c 55 45 53 28 61 5f 73 74 72 69 6e 67 28  VALUES(a_string(
cf00: 35 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 32  500), a_string(2
cf10: 30 30 29 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  00));.    INSERT
cf20: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
cf30: 61 5f 73 74 72 69 6e 67 28 35 30 30 29 2c 20 61  a_string(500), a
cf40: 5f 73 74 72 69 6e 67 28 32 30 30 29 20 46 52 4f  _string(200) FRO
cf50: 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54  M t1;.    INSERT
cf60: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
cf70: 61 5f 73 74 72 69 6e 67 28 35 30 30 29 2c 20 61  a_string(500), a
cf80: 5f 73 74 72 69 6e 67 28 32 30 30 29 20 46 52 4f  _string(200) FRO
cf90: 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54  M t1;.    INSERT
cfa0: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
cfb0: 61 5f 73 74 72 69 6e 67 28 35 30 30 29 2c 20 61  a_string(500), a
cfc0: 5f 73 74 72 69 6e 67 28 32 30 30 29 20 46 52 4f  _string(200) FRO
cfd0: 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54  M t1;.    INSERT
cfe0: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
cff0: 61 5f 73 74 72 69 6e 67 28 35 30 30 29 2c 20 61  a_string(500), a
d000: 5f 73 74 72 69 6e 67 28 32 30 30 29 20 46 52 4f  _string(200) FRO
d010: 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54  M t1;.    INSERT
d020: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
d030: 61 5f 73 74 72 69 6e 67 28 35 30 30 29 2c 20 61  a_string(500), a
d040: 5f 73 74 72 69 6e 67 28 32 30 30 29 20 46 52 4f  _string(200) FRO
d050: 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54  M t1;.    INSERT
d060: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
d070: 61 5f 73 74 72 69 6e 67 28 35 30 30 29 2c 20 61  a_string(500), a
d080: 5f 73 74 72 69 6e 67 28 32 30 30 29 20 46 52 4f  _string(200) FRO
d090: 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54  M t1;.    INSERT
d0a0: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
d0b0: 61 5f 73 74 72 69 6e 67 28 35 30 30 29 2c 20 61  a_string(500), a
d0c0: 5f 73 74 72 69 6e 67 28 32 30 30 29 20 46 52 4f  _string(200) FRO
d0d0: 4d 20 74 31 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64  M t1;.  }.} {}.d
d0e0: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 38  o_test pager1-18
d0f0: 2e 32 20 7b 0a 20 20 73 65 74 20 72 6f 6f 74 20  .2 {.  set root 
d100: 5b 64 62 20 6f 6e 65 20 22 53 45 4c 45 43 54 20  [db one "SELECT 
d110: 72 6f 6f 74 70 61 67 65 20 46 52 4f 4d 20 73 71  rootpage FROM sq
d120: 6c 69 74 65 5f 6d 61 73 74 65 72 22 5d 0a 20 20  lite_master"].  
d130: 73 65 74 20 6c 6f 63 6b 69 6e 67 70 61 67 65 20  set lockingpage 
d140: 5b 65 78 70 72 20 28 30 78 31 30 30 30 30 2f 31  [expr (0x10000/1
d150: 30 32 34 29 20 2b 20 31 5d 0a 20 20 65 78 65 63  024) + 1].  exec
d160: 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41  sql {.    PRAGMA
d170: 20 77 72 69 74 61 62 6c 65 5f 73 63 68 65 6d 61   writable_schema
d180: 20 3d 20 31 3b 0a 20 20 20 20 55 50 44 41 54 45   = 1;.    UPDATE
d190: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 53   sqlite_master S
d1a0: 45 54 20 72 6f 6f 74 70 61 67 65 20 3d 20 24 6c  ET rootpage = $l
d1b0: 6f 63 6b 69 6e 67 70 61 67 65 3b 0a 20 20 7d 0a  ockingpage;.  }.
d1c0: 20 20 73 71 6c 69 74 65 33 20 64 62 32 20 74 65    sqlite3 db2 te
d1d0: 73 74 2e 64 62 0a 20 20 63 61 74 63 68 73 71 6c  st.db.  catchsql
d1e0: 20 7b 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28   { SELECT count(
d1f0: 2a 29 20 46 52 4f 4d 20 74 31 20 7d 20 64 62 32  *) FROM t1 } db2
d200: 0a 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20  .} {1 {database 
d210: 64 69 73 6b 20 69 6d 61 67 65 20 69 73 20 6d 61  disk image is ma
d220: 6c 66 6f 72 6d 65 64 7d 7d 0a 64 62 32 20 63 6c  lformed}}.db2 cl
d230: 6f 73 65 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  ose.do_test page
d240: 72 31 2d 31 38 2e 33 20 7b 0a 20 20 65 78 65 63  r1-18.3 {.  exec
d250: 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45  sql {.    CREATE
d260: 20 54 41 42 4c 45 20 74 32 28 78 29 3b 0a 20 20   TABLE t2(x);.  
d270: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32    INSERT INTO t2
d280: 20 56 41 4c 55 45 53 28 61 5f 73 74 72 69 6e 67   VALUES(a_string
d290: 28 35 30 30 30 29 29 3b 0a 20 20 7d 0a 20 20 73  (5000));.  }.  s
d2a0: 65 74 20 70 67 6e 6f 20 5b 65 78 70 72 20 28 5b  et pgno [expr ([
d2b0: 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64  file size test.d
d2c0: 62 5d 20 2f 20 31 30 32 34 29 2d 32 5d 0a 20 20  b] / 1024)-2].  
d2d0: 68 65 78 69 6f 5f 77 72 69 74 65 20 74 65 73 74  hexio_write test
d2e0: 2e 64 62 20 5b 65 78 70 72 20 28 24 70 67 6e 6f  .db [expr ($pgno
d2f0: 2d 31 29 2a 31 30 32 34 5d 20 30 30 30 30 30 30  -1)*1024] 000000
d300: 30 30 0a 20 20 73 71 6c 69 74 65 33 20 64 62 32  00.  sqlite3 db2
d310: 20 74 65 73 74 2e 64 62 0a 20 20 63 61 74 63 68   test.db.  catch
d320: 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 6c 65 6e  sql { SELECT len
d330: 67 74 68 28 78 29 20 46 52 4f 4d 20 74 32 20 7d  gth(x) FROM t2 }
d340: 20 64 62 32 0a 7d 20 7b 31 20 7b 64 61 74 61 62   db2.} {1 {datab
d350: 61 73 65 20 64 69 73 6b 20 69 6d 61 67 65 20 69  ase disk image i
d360: 73 20 6d 61 6c 66 6f 72 6d 65 64 7d 7d 0a 64 62  s malformed}}.db
d370: 32 20 63 6c 6f 73 65 0a 64 6f 5f 74 65 73 74 20  2 close.do_test 
d380: 70 61 67 65 72 31 2d 31 38 2e 34 20 7b 0a 20 20  pager1-18.4 {.  
d390: 68 65 78 69 6f 5f 77 72 69 74 65 20 74 65 73 74  hexio_write test
d3a0: 2e 64 62 20 5b 65 78 70 72 20 28 24 70 67 6e 6f  .db [expr ($pgno
d3b0: 2d 31 29 2a 31 30 32 34 5d 20 39 30 30 30 30 30  -1)*1024] 900000
d3c0: 30 30 0a 20 20 73 71 6c 69 74 65 33 20 64 62 32  00.  sqlite3 db2
d3d0: 20 74 65 73 74 2e 64 62 0a 20 20 63 61 74 63 68   test.db.  catch
d3e0: 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 6c 65 6e  sql { SELECT len
d3f0: 67 74 68 28 78 29 20 46 52 4f 4d 20 74 32 20 7d  gth(x) FROM t2 }
d400: 20 64 62 32 0a 7d 20 7b 31 20 7b 64 61 74 61 62   db2.} {1 {datab
d410: 61 73 65 20 64 69 73 6b 20 69 6d 61 67 65 20 69  ase disk image i
d420: 73 20 6d 61 6c 66 6f 72 6d 65 64 7d 7d 0a 64 62  s malformed}}.db
d430: 32 20 63 6c 6f 73 65 0a 64 6f 5f 74 65 73 74 20  2 close.do_test 
d440: 70 61 67 65 72 31 2d 31 38 2e 35 20 7b 0a 20 20  pager1-18.5 {.  
d450: 73 71 6c 69 74 65 33 20 64 62 20 22 22 0a 20 20  sqlite3 db "".  
d460: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52  execsql {.    CR
d470: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c  EATE TABLE t1(a,
d480: 20 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20   b);.    CREATE 
d490: 54 41 42 4c 45 20 74 32 28 61 2c 20 62 29 3b 0a  TABLE t2(a, b);.
d4a0: 20 20 20 20 50 52 41 47 4d 41 20 77 72 69 74 61      PRAGMA writa
d4b0: 62 6c 65 5f 73 63 68 65 6d 61 20 3d 20 31 3b 0a  ble_schema = 1;.
d4c0: 20 20 20 20 55 50 44 41 54 45 20 73 71 6c 69 74      UPDATE sqlit
d4d0: 65 5f 6d 61 73 74 65 72 20 53 45 54 20 72 6f 6f  e_master SET roo
d4e0: 74 70 61 67 65 3d 35 20 57 48 45 52 45 20 74 62  tpage=5 WHERE tb
d4f0: 6c 5f 6e 61 6d 65 20 3d 20 27 74 31 27 3b 0a 20  l_name = 't1';. 
d500: 20 20 20 50 52 41 47 4d 41 20 77 72 69 74 61 62     PRAGMA writab
d510: 6c 65 5f 73 63 68 65 6d 61 20 3d 20 30 3b 0a 20  le_schema = 0;. 
d520: 20 20 20 41 4c 54 45 52 20 54 41 42 4c 45 20 74     ALTER TABLE t
d530: 31 20 52 45 4e 41 4d 45 20 54 4f 20 78 31 3b 0a  1 RENAME TO x1;.
d540: 20 20 7d 0a 20 20 63 61 74 63 68 73 71 6c 20 7b    }.  catchsql {
d550: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 78   SELECT * FROM x
d560: 31 20 7d 0a 7d 20 7b 31 20 7b 64 61 74 61 62 61  1 }.} {1 {databa
d570: 73 65 20 64 69 73 6b 20 69 6d 61 67 65 20 69 73  se disk image is
d580: 20 6d 61 6c 66 6f 72 6d 65 64 7d 7d 0a 64 62 20   malformed}}.db 
d590: 63 6c 6f 73 65 0a 0a 64 6f 5f 74 65 73 74 20 70  close..do_test p
d5a0: 61 67 65 72 31 2d 31 38 2e 36 20 7b 0a 20 20 66  ager1-18.6 {.  f
d5b0: 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61  aultsim_delete_a
d5c0: 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 64 62 20 66  nd_reopen.  db f
d5d0: 75 6e 63 20 61 5f 73 74 72 69 6e 67 20 61 5f 73  unc a_string a_s
d5e0: 74 72 69 6e 67 0a 20 20 65 78 65 63 73 71 6c 20  tring.  execsql 
d5f0: 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 70 61 67  {.    PRAGMA pag
d600: 65 5f 73 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20  e_size = 1024;. 
d610: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
d620: 74 31 28 78 29 3b 0a 20 20 20 20 49 4e 53 45 52  t1(x);.    INSER
d630: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
d640: 28 61 5f 73 74 72 69 6e 67 28 38 30 30 29 29 3b  (a_string(800));
d650: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
d660: 20 74 31 20 56 41 4c 55 45 53 28 61 5f 73 74 72   t1 VALUES(a_str
d670: 69 6e 67 28 38 30 30 29 29 3b 0a 20 20 7d 0a 0a  ing(800));.  }..
d680: 20 20 73 65 74 20 72 6f 6f 74 20 5b 64 62 20 6f    set root [db o
d690: 6e 65 20 22 53 45 4c 45 43 54 20 72 6f 6f 74 70  ne "SELECT rootp
d6a0: 61 67 65 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  age FROM sqlite_
d6b0: 6d 61 73 74 65 72 22 5d 0a 20 20 64 62 20 63 6c  master"].  db cl
d6c0: 6f 73 65 0a 0a 20 20 68 65 78 69 6f 5f 77 72 69  ose..  hexio_wri
d6d0: 74 65 20 74 65 73 74 2e 64 62 20 5b 65 78 70 72  te test.db [expr
d6e0: 20 28 24 72 6f 6f 74 2d 31 29 2a 31 30 32 34 20   ($root-1)*1024 
d6f0: 2b 20 38 5d 20 30 30 30 30 30 30 30 30 0a 20 20  + 8] 00000000.  
d700: 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e  sqlite3 db test.
d710: 64 62 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20  db.  catchsql { 
d720: 53 45 4c 45 43 54 20 6c 65 6e 67 74 68 28 78 29  SELECT length(x)
d730: 20 46 52 4f 4d 20 74 31 20 7d 0a 7d 20 7b 31 20   FROM t1 }.} {1 
d740: 7b 64 61 74 61 62 61 73 65 20 64 69 73 6b 20 69  {database disk i
d750: 6d 61 67 65 20 69 73 20 6d 61 6c 66 6f 72 6d 65  mage is malforme
d760: 64 7d 7d 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67  d}}..do_test pag
d770: 65 72 31 2d 31 39 2e 31 20 7b 0a 20 20 73 71 6c  er1-19.1 {.  sql
d780: 69 74 65 33 20 64 62 20 22 22 0a 20 20 64 62 20  ite3 db "".  db 
d790: 66 75 6e 63 20 61 5f 73 74 72 69 6e 67 20 61 5f  func a_string a_
d7a0: 73 74 72 69 6e 67 0a 20 20 65 78 65 63 73 71 6c  string.  execsql
d7b0: 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 70 61   {.    PRAGMA pa
d7c0: 67 65 5f 73 69 7a 65 20 3d 20 35 31 32 3b 0a 20  ge_size = 512;. 
d7d0: 20 20 20 50 52 41 47 4d 41 20 61 75 74 6f 5f 76     PRAGMA auto_v
d7e0: 61 63 75 75 6d 20 3d 20 31 3b 0a 20 20 20 20 43  acuum = 1;.    C
d7f0: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61  REATE TABLE t1(a
d800: 61 2c 20 61 62 2c 20 61 63 2c 20 61 64 2c 20 61  a, ab, ac, ad, a
d810: 65 2c 20 61 66 2c 20 61 67 2c 20 61 68 2c 20 61  e, af, ag, ah, a
d820: 69 2c 20 61 6a 2c 20 61 6b 2c 20 61 6c 2c 20 61  i, aj, ak, al, a
d830: 6d 2c 20 61 6e 2c 0a 20 20 20 20 20 20 20 20 20  m, an,.         
d840: 20 20 20 20 20 20 20 20 20 20 20 62 61 2c 20 62             ba, b
d850: 62 2c 20 62 63 2c 20 62 64 2c 20 62 65 2c 20 62  b, bc, bd, be, b
d860: 66 2c 20 62 67 2c 20 62 68 2c 20 62 69 2c 20 62  f, bg, bh, bi, b
d870: 6a 2c 20 62 6b 2c 20 62 6c 2c 20 62 6d 2c 20 62  j, bk, bl, bm, b
d880: 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n,.             
d890: 20 20 20 20 20 20 20 63 61 2c 20 63 62 2c 20 63         ca, cb, c
d8a0: 63 2c 20 63 64 2c 20 63 65 2c 20 63 66 2c 20 63  c, cd, ce, cf, c
d8b0: 67 2c 20 63 68 2c 20 63 69 2c 20 63 6a 2c 20 63  g, ch, ci, cj, c
d8c0: 6b 2c 20 63 6c 2c 20 63 6d 2c 20 63 6e 2c 0a 20  k, cl, cm, cn,. 
d8d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d8e0: 20 20 20 64 61 2c 20 64 62 2c 20 64 63 2c 20 64     da, db, dc, d
d8f0: 64 2c 20 64 65 2c 20 64 66 2c 20 64 67 2c 20 64  d, de, df, dg, d
d900: 68 2c 20 64 69 2c 20 64 6a 2c 20 64 6b 2c 20 64  h, di, dj, dk, d
d910: 6c 2c 20 64 6d 2c 20 64 6e 2c 0a 20 20 20 20 20  l, dm, dn,.     
d920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65                 e
d930: 61 2c 20 65 62 2c 20 65 63 2c 20 65 64 2c 20 65  a, eb, ec, ed, e
d940: 65 2c 20 65 66 2c 20 65 67 2c 20 65 68 2c 20 65  e, ef, eg, eh, e
d950: 69 2c 20 65 6a 2c 20 65 6b 2c 20 65 6c 2c 20 65  i, ej, ek, el, e
d960: 6d 2c 20 65 6e 2c 0a 20 20 20 20 20 20 20 20 20  m, en,.         
d970: 20 20 20 20 20 20 20 20 20 20 20 66 61 2c 20 66             fa, f
d980: 62 2c 20 66 63 2c 20 66 64 2c 20 66 65 2c 20 66  b, fc, fd, fe, f
d990: 66 2c 20 66 67 2c 20 66 68 2c 20 66 69 2c 20 66  f, fg, fh, fi, f
d9a0: 6a 2c 20 66 6b 2c 20 66 6c 2c 20 66 6d 2c 20 66  j, fk, fl, fm, f
d9b0: 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n,.             
d9c0: 20 20 20 20 20 20 20 67 61 2c 20 67 62 2c 20 67         ga, gb, g
d9d0: 63 2c 20 67 64 2c 20 67 65 2c 20 67 66 2c 20 67  c, gd, ge, gf, g
d9e0: 67 2c 20 67 68 2c 20 67 69 2c 20 67 6a 2c 20 67  g, gh, gi, gj, g
d9f0: 6b 2c 20 67 6c 2c 20 67 6d 2c 20 67 6e 2c 0a 20  k, gl, gm, gn,. 
da00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da10: 20 20 20 68 61 2c 20 68 62 2c 20 68 63 2c 20 68     ha, hb, hc, h
da20: 64 2c 20 68 65 2c 20 68 66 2c 20 68 67 2c 20 68  d, he, hf, hg, h
da30: 68 2c 20 68 69 2c 20 68 6a 2c 20 68 6b 2c 20 68  h, hi, hj, hk, h
da40: 6c 2c 20 68 6d 2c 20 68 6e 2c 0a 20 20 20 20 20  l, hm, hn,.     
da50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
da60: 61 2c 20 69 62 2c 20 69 63 2c 20 69 64 2c 20 69  a, ib, ic, id, i
da70: 65 2c 20 69 66 2c 20 69 67 2c 20 69 68 2c 20 69  e, if, ig, ih, i
da80: 69 2c 20 69 6a 2c 20 69 6b 2c 20 69 6c 2c 20 69  i, ij, ik, il, i
da90: 6d 2c 20 69 78 2c 0a 20 20 20 20 20 20 20 20 20  m, ix,.         
daa0: 20 20 20 20 20 20 20 20 20 20 20 6a 61 2c 20 6a             ja, j
dab0: 62 2c 20 6a 63 2c 20 6a 64 2c 20 6a 65 2c 20 6a  b, jc, jd, je, j
dac0: 66 2c 20 6a 67 2c 20 6a 68 2c 20 6a 69 2c 20 6a  f, jg, jh, ji, j
dad0: 6a 2c 20 6a 6b 2c 20 6a 6c 2c 20 6a 6d 2c 20 6a  j, jk, jl, jm, j
dae0: 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n,.             
daf0: 20 20 20 20 20 20 20 6b 61 2c 20 6b 62 2c 20 6b         ka, kb, k
db00: 63 2c 20 6b 64 2c 20 6b 65 2c 20 6b 66 2c 20 6b  c, kd, ke, kf, k
db10: 67 2c 20 6b 68 2c 20 6b 69 2c 20 6b 6a 2c 20 6b  g, kh, ki, kj, k
db20: 6b 2c 20 6b 6c 2c 20 6b 6d 2c 20 6b 6e 2c 0a 20  k, kl, km, kn,. 
db30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db40: 20 20 20 6c 61 2c 20 6c 62 2c 20 6c 63 2c 20 6c     la, lb, lc, l
db50: 64 2c 20 6c 65 2c 20 6c 66 2c 20 6c 67 2c 20 6c  d, le, lf, lg, l
db60: 68 2c 20 6c 69 2c 20 6c 6a 2c 20 6c 6b 2c 20 6c  h, li, lj, lk, l
db70: 6c 2c 20 6c 6d 2c 20 6c 6e 2c 0a 20 20 20 20 20  l, lm, ln,.     
db80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d                 m
db90: 61 2c 20 6d 62 2c 20 6d 63 2c 20 6d 64 2c 20 6d  a, mb, mc, md, m
dba0: 65 2c 20 6d 66 2c 20 6d 67 2c 20 6d 68 2c 20 6d  e, mf, mg, mh, m
dbb0: 69 2c 20 6d 6a 2c 20 6d 6b 2c 20 6d 6c 2c 20 6d  i, mj, mk, ml, m
dbc0: 6d 2c 20 6d 6e 0a 20 20 20 20 29 3b 0a 20 20 20  m, mn.    );.   
dbd0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32   CREATE TABLE t2
dbe0: 28 61 61 2c 20 61 62 2c 20 61 63 2c 20 61 64 2c  (aa, ab, ac, ad,
dbf0: 20 61 65 2c 20 61 66 2c 20 61 67 2c 20 61 68 2c   ae, af, ag, ah,
dc00: 20 61 69 2c 20 61 6a 2c 20 61 6b 2c 20 61 6c 2c   ai, aj, ak, al,
dc10: 20 61 6d 2c 20 61 6e 2c 0a 20 20 20 20 20 20 20   am, an,.       
dc20: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 61 2c               ba,
dc30: 20 62 62 2c 20 62 63 2c 20 62 64 2c 20 62 65 2c   bb, bc, bd, be,
dc40: 20 62 66 2c 20 62 67 2c 20 62 68 2c 20 62 69 2c   bf, bg, bh, bi,
dc50: 20 62 6a 2c 20 62 6b 2c 20 62 6c 2c 20 62 6d 2c   bj, bk, bl, bm,
dc60: 20 62 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20   bn,.           
dc70: 20 20 20 20 20 20 20 20 20 63 61 2c 20 63 62 2c           ca, cb,
dc80: 20 63 63 2c 20 63 64 2c 20 63 65 2c 20 63 66 2c   cc, cd, ce, cf,
dc90: 20 63 67 2c 20 63 68 2c 20 63 69 2c 20 63 6a 2c   cg, ch, ci, cj,
dca0: 20 63 6b 2c 20 63 6c 2c 20 63 6d 2c 20 63 6e 2c   ck, cl, cm, cn,
dcb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
dcc0: 20 20 20 20 20 64 61 2c 20 64 62 2c 20 64 63 2c       da, db, dc,
dcd0: 20 64 64 2c 20 64 65 2c 20 64 66 2c 20 64 67 2c   dd, de, df, dg,
dce0: 20 64 68 2c 20 64 69 2c 20 64 6a 2c 20 64 6b 2c   dh, di, dj, dk,
dcf0: 20 64 6c 2c 20 64 6d 2c 20 64 6e 2c 0a 20 20 20   dl, dm, dn,.   
dd00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd10: 20 65 61 2c 20 65 62 2c 20 65 63 2c 20 65 64 2c   ea, eb, ec, ed,
dd20: 20 65 65 2c 20 65 66 2c 20 65 67 2c 20 65 68 2c   ee, ef, eg, eh,
dd30: 20 65 69 2c 20 65 6a 2c 20 65 6b 2c 20 65 6c 2c   ei, ej, ek, el,
dd40: 20 65 6d 2c 20 65 6e 2c 0a 20 20 20 20 20 20 20   em, en,.       
dd50: 20 20 20 20 20 20 20 20 20 20 20 20 20 66 61 2c               fa,
dd60: 20 66 62 2c 20 66 63 2c 20 66 64 2c 20 66 65 2c   fb, fc, fd, fe,
dd70: 20 66 66 2c 20 66 67 2c 20 66 68 2c 20 66 69 2c   ff, fg, fh, fi,
dd80: 20 66 6a 2c 20 66 6b 2c 20 66 6c 2c 20 66 6d 2c   fj, fk, fl, fm,
dd90: 20 66 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20   fn,.           
dda0: 20 20 20 20 20 20 20 20 20 67 61 2c 20 67 62 2c           ga, gb,
ddb0: 20 67 63 2c 20 67 64 2c 20 67 65 2c 20 67 66 2c   gc, gd, ge, gf,
ddc0: 20 67 67 2c 20 67 68 2c 20 67 69 2c 20 67 6a 2c   gg, gh, gi, gj,
ddd0: 20 67 6b 2c 20 67 6c 2c 20 67 6d 2c 20 67 6e 2c   gk, gl, gm, gn,
dde0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ddf0: 20 20 20 20 20 68 61 2c 20 68 62 2c 20 68 63 2c       ha, hb, hc,
de00: 20 68 64 2c 20 68 65 2c 20 68 66 2c 20 68 67 2c   hd, he, hf, hg,
de10: 20 68 68 2c 20 68 69 2c 20 68 6a 2c 20 68 6b 2c   hh, hi, hj, hk,
de20: 20 68 6c 2c 20 68 6d 2c 20 68 6e 2c 0a 20 20 20   hl, hm, hn,.   
de30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de40: 20 69 61 2c 20 69 62 2c 20 69 63 2c 20 69 64 2c   ia, ib, ic, id,
de50: 20 69 65 2c 20 69 66 2c 20 69 67 2c 20 69 68 2c   ie, if, ig, ih,
de60: 20 69 69 2c 20 69 6a 2c 20 69 6b 2c 20 69 6c 2c   ii, ij, ik, il,
de70: 20 69 6d 2c 20 69 78 2c 0a 20 20 20 20 20 20 20   im, ix,.       
de80: 20 20 20 20 20 20 20 20 20 20 20 20 20 6a 61 2c               ja,
de90: 20 6a 62 2c 20 6a 63 2c 20 6a 64 2c 20 6a 65 2c   jb, jc, jd, je,
dea0: 20 6a 66 2c 20 6a 67 2c 20 6a 68 2c 20 6a 69 2c   jf, jg, jh, ji,
deb0: 20 6a 6a 2c 20 6a 6b 2c 20 6a 6c 2c 20 6a 6d 2c   jj, jk, jl, jm,
dec0: 20 6a 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20   jn,.           
ded0: 20 20 20 20 20 20 20 20 20 6b 61 2c 20 6b 62 2c           ka, kb,
dee0: 20 6b 63 2c 20 6b 64 2c 20 6b 65 2c 20 6b 66 2c   kc, kd, ke, kf,
def0: 20 6b 67 2c 20 6b 68 2c 20 6b 69 2c 20 6b 6a 2c   kg, kh, ki, kj,
df00: 20 6b 6b 2c 20 6b 6c 2c 20 6b 6d 2c 20 6b 6e 2c   kk, kl, km, kn,
df10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
df20: 20 20 20 20 20 6c 61 2c 20 6c 62 2c 20 6c 63 2c       la, lb, lc,
df30: 20 6c 64 2c 20 6c 65 2c 20 6c 66 2c 20 6c 67 2c   ld, le, lf, lg,
df40: 20 6c 68 2c 20 6c 69 2c 20 6c 6a 2c 20 6c 6b 2c   lh, li, lj, lk,
df50: 20 6c 6c 2c 20 6c 6d 2c 20 6c 6e 2c 0a 20 20 20   ll, lm, ln,.   
df60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df70: 20 6d 61 2c 20 6d 62 2c 20 6d 63 2c 20 6d 64 2c   ma, mb, mc, md,
df80: 20 6d 65 2c 20 6d 66 2c 20 6d 67 2c 20 6d 68 2c   me, mf, mg, mh,
df90: 20 6d 69 2c 20 6d 6a 2c 20 6d 6b 2c 20 6d 6c 2c   mi, mj, mk, ml,
dfa0: 20 6d 6d 2c 20 6d 6e 0a 20 20 20 20 29 3b 0a 20   mm, mn.    );. 
dfb0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
dfc0: 31 28 61 61 29 20 56 41 4c 55 45 53 28 20 61 5f  1(aa) VALUES( a_
dfd0: 73 74 72 69 6e 67 28 31 30 30 30 30 30 29 20 29  string(100000) )
dfe0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
dff0: 4f 20 74 32 28 61 61 29 20 56 41 4c 55 45 53 28  O t2(aa) VALUES(
e000: 20 61 5f 73 74 72 69 6e 67 28 31 30 30 30 30 30   a_string(100000
e010: 29 20 29 3b 0a 20 20 20 20 56 41 43 55 55 4d 3b  ) );.    VACUUM;
e020: 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 23 2d 2d 2d 2d  .  }.} {}..#----
e030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e070: 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 61 20 63  -----.# Test a c
e080: 6f 75 70 6c 65 20 6f 66 20 73 70 65 63 69 61 6c  ouple of special
e090: 20 63 61 73 65 73 20 74 68 61 74 20 63 6f 6d 65   cases that come
e0a0: 20 75 70 20 77 68 69 6c 65 20 63 6f 6d 6d 69 74   up while commit
e0b0: 74 69 6e 67 20 0a 23 20 74 72 61 6e 73 61 63 74  ting .# transact
e0c0: 69 6f 6e 73 3a 0a 23 0a 23 20 20 20 70 61 67 65  ions:.#.#   page
e0d0: 72 31 2d 32 30 2e 31 2e 2a 3a 20 43 6f 6d 6d 69  r1-20.1.*: Commi
e0e0: 74 74 69 6e 67 20 61 6e 20 69 6e 2d 6d 65 6d 6f  tting an in-memo
e0f0: 72 79 20 64 61 74 61 62 61 73 65 20 74 72 61 6e  ry database tran
e100: 73 61 63 74 69 6f 6e 20 77 68 65 6e 20 74 68 65  saction when the
e110: 20 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20   .#             
e120: 20 20 20 20 20 64 61 74 61 62 61 73 65 20 68 61       database ha
e130: 73 20 6e 6f 74 20 62 65 65 6e 20 6d 6f 64 69 66  s not been modif
e140: 69 65 64 20 61 74 20 61 6c 6c 2e 0a 23 0a 23 20  ied at all..#.# 
e150: 20 20 70 61 67 65 72 31 2d 32 30 2e 32 2e 2a 3a    pager1-20.2.*:
e160: 20 41 73 20 61 62 6f 76 65 2c 20 62 75 74 20 77   As above, but w
e170: 69 74 68 20 61 20 6e 6f 72 6d 61 6c 20 64 62 20  ith a normal db 
e180: 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 6c 6f 63  in exclusive-loc
e190: 6b 69 6e 67 20 6d 6f 64 65 2e 0a 23 0a 23 20 20  king mode..#.#  
e1a0: 20 70 61 67 65 72 31 2d 32 30 2e 33 2e 2a 3a 20   pager1-20.3.*: 
e1b0: 43 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61  Committing a tra
e1c0: 6e 73 61 63 74 69 6f 6e 20 69 6e 20 57 41 4c 20  nsaction in WAL 
e1d0: 6d 6f 64 65 20 77 68 65 72 65 20 74 68 65 20 64  mode where the d
e1e0: 61 74 61 62 61 73 65 20 68 61 73 0a 23 20 20 20  atabase has.#   
e1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
e200: 65 65 6e 20 6d 6f 64 69 66 69 65 64 2c 20 62 75  een modified, bu
e210: 74 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65  t all dirty page
e220: 73 20 68 61 76 65 20 62 65 65 6e 20 66 6c 75 73  s have been flus
e230: 68 65 64 20 74 6f 20 0a 23 20 20 20 20 20 20 20  hed to .#       
e240: 20 20 20 20 20 20 20 20 20 20 20 64 69 73 6b 20             disk 
e250: 62 65 66 6f 72 65 20 74 68 65 20 63 6f 6d 6d 69  before the commi
e260: 74 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 70 61 67  t..#.do_test pag
e270: 65 72 31 2d 32 30 2e 31 2e 31 20 7b 0a 20 20 63  er1-20.1.1 {.  c
e280: 61 74 63 68 20 7b 64 62 20 63 6c 6f 73 65 7d 0a  atch {db close}.
e290: 20 20 73 71 6c 69 74 65 33 20 64 62 20 3a 6d 65    sqlite3 db :me
e2a0: 6d 6f 72 79 3a 0a 20 20 65 78 65 63 73 71 6c 20  mory:.  execsql 
e2b0: 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  {.    CREATE TAB
e2c0: 4c 45 20 6f 6e 65 28 74 77 6f 2c 20 74 68 72 65  LE one(two, thre
e2d0: 65 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  e);.    INSERT I
e2e0: 4e 54 4f 20 6f 6e 65 20 56 41 4c 55 45 53 28 27  NTO one VALUES('
e2f0: 61 27 2c 20 27 62 27 29 3b 0a 20 20 7d 0a 7d 20  a', 'b');.  }.} 
e300: 7b 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  {}.do_test pager
e310: 31 2d 32 30 2e 31 2e 32 20 7b 0a 20 20 65 78 65  1-20.1.2 {.  exe
e320: 63 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e  csql {.    BEGIN
e330: 20 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20   EXCLUSIVE;.    
e340: 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 7d 20 7b 7d  COMMIT;.  }.} {}
e350: 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  ..do_test pager1
e360: 2d 32 30 2e 32 2e 31 20 7b 0a 20 20 66 61 75 6c  -20.2.1 {.  faul
e370: 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f  tsim_delete_and_
e380: 72 65 6f 70 65 6e 0a 20 20 65 78 65 63 73 71 6c  reopen.  execsql
e390: 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 6c 6f   {.    PRAGMA lo
e3a0: 63 6b 69 6e 67 5f 6d 6f 64 65 20 3d 20 65 78 63  cking_mode = exc
e3b0: 6c 75 73 69 76 65 3b 0a 20 20 20 20 50 52 41 47  lusive;.    PRAG
e3c0: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  MA journal_mode 
e3d0: 3d 20 70 65 72 73 69 73 74 3b 0a 20 20 20 20 43  = persist;.    C
e3e0: 52 45 41 54 45 20 54 41 42 4c 45 20 6f 6e 65 28  REATE TABLE one(
e3f0: 74 77 6f 2c 20 74 68 72 65 65 29 3b 0a 20 20 20  two, three);.   
e400: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 6f 6e 65   INSERT INTO one
e410: 20 56 41 4c 55 45 53 28 27 61 27 2c 20 27 62 27   VALUES('a', 'b'
e420: 29 3b 0a 20 20 7d 0a 7d 20 7b 65 78 63 6c 75 73  );.  }.} {exclus
e430: 69 76 65 20 70 65 72 73 69 73 74 7d 0a 64 6f 5f  ive persist}.do_
e440: 74 65 73 74 20 70 61 67 65 72 31 2d 32 30 2e 32  test pager1-20.2
e450: 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .2 {.  execsql {
e460: 0a 20 20 20 20 42 45 47 49 4e 20 45 58 43 4c 55  .    BEGIN EXCLU
e470: 53 49 56 45 3b 0a 20 20 20 20 43 4f 4d 4d 49 54  SIVE;.    COMMIT
e480: 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74  ;.  }.} {}..do_t
e490: 65 73 74 20 70 61 67 65 72 31 2d 32 30 2e 33 2e  est pager1-20.3.
e4a0: 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64  1 {.  faultsim_d
e4b0: 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e  elete_and_reopen
e4c0: 0a 20 20 64 62 20 66 75 6e 63 20 61 5f 73 74 72  .  db func a_str
e4d0: 69 6e 67 20 61 5f 73 74 72 69 6e 67 0a 20 20 65  ing a_string.  e
e4e0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41  xecsql {.    PRA
e4f0: 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 20 3d  GMA cache_size =
e500: 20 31 30 3b 0a 20 20 20 20 50 52 41 47 4d 41 20   10;.    PRAGMA 
e510: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 77  journal_mode = w
e520: 61 6c 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20  al;.    BEGIN;. 
e530: 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c       CREATE TABL
e540: 45 20 74 31 28 78 29 3b 0a 20 20 20 20 20 20 43  E t1(x);.      C
e550: 52 45 41 54 45 20 54 41 42 4c 45 20 74 32 28 79  REATE TABLE t2(y
e560: 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  );.      INSERT 
e570: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 61  INTO t1 VALUES(a
e580: 5f 73 74 72 69 6e 67 28 38 30 30 29 29 3b 0a 20  _string(800));. 
e590: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
e5a0: 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74 72   t1 SELECT a_str
e5b0: 69 6e 67 28 38 30 30 29 20 46 52 4f 4d 20 74 31  ing(800) FROM t1
e5c0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20 32  ;         /*   2
e5d0: 20 2a 2f 0a 20 20 20 20 20 20 49 4e 53 45 52 54   */.      INSERT
e5e0: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
e5f0: 61 5f 73 74 72 69 6e 67 28 38 30 30 29 20 46 52  a_string(800) FR
e600: 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 20 20 2f  OM t1;         /
e610: 2a 20 20 20 34 20 2a 2f 0a 20 20 20 20 20 20 49  *   4 */.      I
e620: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
e630: 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 38 30  LECT a_string(80
e640: 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20  0) FROM t1;     
e650: 20 20 20 20 2f 2a 20 20 20 38 20 2a 2f 0a 20 20      /*   8 */.  
e660: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
e670: 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69  t1 SELECT a_stri
e680: 6e 67 28 38 30 30 29 20 46 52 4f 4d 20 74 31 3b  ng(800) FROM t1;
e690: 20 20 20 20 20 20 20 20 20 2f 2a 20 20 31 36 20           /*  16 
e6a0: 2a 2f 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  */.      INSERT 
e6b0: 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61  INTO t1 SELECT a
e6c0: 5f 73 74 72 69 6e 67 28 38 30 30 29 20 46 52 4f  _string(800) FRO
e6d0: 4d 20 74 31 3b 20 20 20 20 20 20 20 20 20 2f 2a  M t1;         /*
e6e0: 20 20 33 32 20 2a 2f 0a 20 20 20 20 43 4f 4d 4d    32 */.    COMM
e6f0: 49 54 3b 0a 20 20 7d 0a 7d 20 7b 77 61 6c 7d 0a  IT;.  }.} {wal}.
e700: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32  do_test pager1-2
e710: 30 2e 33 2e 32 20 7b 0a 20 20 65 78 65 63 73 71  0.3.2 {.  execsq
e720: 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20  l {.    BEGIN;. 
e730: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
e740: 32 20 56 41 4c 55 45 53 28 27 78 78 78 78 27 29  2 VALUES('xxxx')
e750: 3b 0a 20 20 7d 0a 20 20 72 65 63 75 72 73 69 76  ;.  }.  recursiv
e760: 65 5f 73 65 6c 65 63 74 20 33 32 20 74 31 0a 20  e_select 32 t1. 
e770: 20 65 78 65 63 73 71 6c 20 43 4f 4d 4d 49 54 0a   execsql COMMIT.
e780: 7d 20 7b 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  } {}..#---------
e790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e7a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e7b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e7c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e7d0: 0a 23 20 54 65 73 74 20 74 68 61 74 20 61 20 57  .# Test that a W
e7e0: 41 4c 20 64 61 74 61 62 61 73 65 20 6d 61 79 20  AL database may 
e7f0: 6e 6f 74 20 62 65 20 6f 70 65 6e 65 64 20 69 66  not be opened if
e800: 3a 0a 23 0a 23 20 20 20 70 61 67 65 72 31 2d 32  :.#.#   pager1-2
e810: 31 2e 31 2e 2a 3a 20 54 68 65 20 56 46 53 20 68  1.1.*: The VFS h
e820: 61 73 20 61 6e 20 69 56 65 72 73 69 6f 6e 20 6c  as an iVersion l
e830: 65 73 73 20 74 68 61 6e 20 32 2c 20 6f 72 0a 23  ess than 2, or.#
e840: 20 20 20 70 61 67 65 72 31 2d 32 31 2e 32 2e 2a     pager1-21.2.*
e850: 3a 20 54 68 65 20 56 46 53 20 64 6f 65 73 20 6e  : The VFS does n
e860: 6f 74 20 70 72 6f 76 69 64 65 20 78 53 68 6d 58  ot provide xShmX
e870: 58 58 28 29 20 6d 65 74 68 6f 64 73 2e 0a 23 0a  XX() methods..#.
e880: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32  do_test pager1-2
e890: 31 2e 30 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d  1.0 {.  faultsim
e8a0: 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70  _delete_and_reop
e8b0: 65 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  en.  execsql {. 
e8c0: 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61     PRAGMA journa
e8d0: 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c 3b 0a 20 20  l_mode = WAL;.  
e8e0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 6b    CREATE TABLE k
e8f0: 6f 28 63 20 44 45 46 41 55 4c 54 20 27 61 62 63  o(c DEFAULT 'abc
e900: 27 2c 20 62 20 44 45 46 41 55 4c 54 20 27 64 65  ', b DEFAULT 'de
e910: 66 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  f');.    INSERT 
e920: 49 4e 54 4f 20 6b 6f 20 44 45 46 41 55 4c 54 20  INTO ko DEFAULT 
e930: 56 41 4c 55 45 53 3b 0a 20 20 7d 0a 7d 20 7b 77  VALUES;.  }.} {w
e940: 61 6c 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  al}.do_test page
e950: 72 31 2d 32 31 2e 31 20 7b 0a 20 20 74 65 73 74  r1-21.1 {.  test
e960: 76 66 73 20 74 76 20 2d 6e 6f 73 68 6d 20 31 0a  vfs tv -noshm 1.
e970: 20 20 73 71 6c 69 74 65 33 20 64 62 32 20 74 65    sqlite3 db2 te
e980: 73 74 2e 64 62 20 2d 76 66 73 20 74 76 0a 20 20  st.db -vfs tv.  
e990: 63 61 74 63 68 73 71 6c 20 7b 20 53 45 4c 45 43  catchsql { SELEC
e9a0: 54 20 2a 20 46 52 4f 4d 20 6b 6f 20 7d 20 64 62  T * FROM ko } db
e9b0: 32 0a 7d 20 7b 31 20 7b 75 6e 61 62 6c 65 20 74  2.} {1 {unable t
e9c0: 6f 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20  o open database 
e9d0: 66 69 6c 65 7d 7d 0a 64 62 32 20 63 6c 6f 73 65  file}}.db2 close
e9e0: 0a 74 76 20 64 65 6c 65 74 65 0a 64 6f 5f 74 65  .tv delete.do_te
e9f0: 73 74 20 70 61 67 65 72 31 2d 32 31 2e 32 20 7b  st pager1-21.2 {
ea00: 0a 20 20 74 65 73 74 76 66 73 20 74 76 20 2d 69  .  testvfs tv -i
ea10: 76 65 72 73 69 6f 6e 20 31 0a 20 20 73 71 6c 69  version 1.  sqli
ea20: 74 65 33 20 64 62 32 20 74 65 73 74 2e 64 62 20  te3 db2 test.db 
ea30: 2d 76 66 73 20 74 76 0a 20 20 63 61 74 63 68 73  -vfs tv.  catchs
ea40: 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52  ql { SELECT * FR
ea50: 4f 4d 20 6b 6f 20 7d 20 64 62 32 0a 7d 20 7b 31  OM ko } db2.} {1
ea60: 20 7b 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e   {unable to open
ea70: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 7d 7d   database file}}
ea80: 0a 64 62 32 20 63 6c 6f 73 65 0a 74 76 20 64 65  .db2 close.tv de
ea90: 6c 65 74 65 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  lete..#---------
eaa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
eab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
eac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ead0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
eae0: 0a 23 20 54 65 73 74 20 74 68 61 74 20 61 20 22  .# Test that a "
eaf0: 50 52 41 47 4d 41 20 77 61 6c 5f 63 68 65 63 6b  PRAGMA wal_check
eb00: 70 6f 69 6e 74 22 3a 0a 23 0a 23 20 20 20 70 61  point":.#.#   pa
eb10: 67 65 72 31 2d 32 32 2e 31 2e 2a 3a 20 69 73 20  ger1-22.1.*: is 
eb20: 61 20 6e 6f 2d 6f 70 20 6f 6e 20 61 20 6e 6f 6e  a no-op on a non
eb30: 2d 57 41 4c 20 64 62 2c 20 61 6e 64 0a 23 20 20  -WAL db, and.#  
eb40: 20 70 61 67 65 72 31 2d 32 32 2e 32 2e 2a 3a 20   pager1-22.2.*: 
eb50: 64 6f 65 73 20 6e 6f 74 20 63 61 75 73 65 20 78  does not cause x
eb60: 53 79 6e 63 20 63 61 6c 6c 73 20 77 69 74 68 20  Sync calls with 
eb70: 61 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 6f 66  a synchronous=of
eb80: 66 20 64 62 2e 0a 23 0a 64 6f 5f 74 65 73 74 20  f db..#.do_test 
eb90: 70 61 67 65 72 31 2d 32 32 2e 31 2e 31 20 7b 0a  pager1-22.1.1 {.
eba0: 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74    faultsim_delet
ebb0: 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65  e_and_reopen.  e
ebc0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45  xecsql {.    CRE
ebd0: 41 54 45 20 54 41 42 4c 45 20 6b 6f 28 63 20 44  ATE TABLE ko(c D
ebe0: 45 46 41 55 4c 54 20 27 61 62 63 27 2c 20 62 20  EFAULT 'abc', b 
ebf0: 44 45 46 41 55 4c 54 20 27 64 65 66 27 29 3b 0a  DEFAULT 'def');.
ec00: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
ec10: 6b 6f 20 44 45 46 41 55 4c 54 20 56 41 4c 55 45  ko DEFAULT VALUE
ec20: 53 3b 0a 20 20 7d 0a 20 20 65 78 65 63 73 71 6c  S;.  }.  execsql
ec30: 20 7b 20 50 52 41 47 4d 41 20 77 61 6c 5f 63 68   { PRAGMA wal_ch
ec40: 65 63 6b 70 6f 69 6e 74 20 7d 0a 7d 20 7b 7d 0a  eckpoint }.} {}.
ec50: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32  do_test pager1-2
ec60: 32 2e 32 2e 31 20 7b 0a 20 20 74 65 73 74 76 66  2.2.1 {.  testvf
ec70: 73 20 74 76 20 2d 64 65 66 61 75 6c 74 20 31 0a  s tv -default 1.
ec80: 20 20 74 76 20 66 69 6c 74 65 72 20 78 53 79 6e    tv filter xSyn
ec90: 63 0a 20 20 74 76 20 73 63 72 69 70 74 20 78 53  c.  tv script xS
eca0: 79 6e 63 43 62 0a 20 20 70 72 6f 63 20 78 53 79  yncCb.  proc xSy
ecb0: 6e 63 43 62 20 7b 61 72 67 73 7d 20 7b 69 6e 63  ncCb {args} {inc
ecc0: 72 20 3a 3a 73 79 6e 63 63 6f 75 6e 74 7d 0a 20  r ::synccount}. 
ecd0: 20 73 65 74 20 3a 3a 73 79 6e 63 63 6f 75 6e 74   set ::synccount
ece0: 20 30 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20   0.  sqlite3 db 
ecf0: 74 65 73 74 2e 64 62 0a 20 20 65 78 65 63 73 71  test.db.  execsq
ed00: 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 73  l {.    PRAGMA s
ed10: 79 6e 63 68 72 6f 6e 6f 75 73 20 3d 20 6f 66 66  ynchronous = off
ed20: 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75  ;.    PRAGMA jou
ed30: 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c 3b  rnal_mode = WAL;
ed40: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
ed50: 20 6b 6f 20 44 45 46 41 55 4c 54 20 56 41 4c 55   ko DEFAULT VALU
ed60: 45 53 3b 0a 20 20 7d 0a 20 20 65 78 65 63 73 71  ES;.  }.  execsq
ed70: 6c 20 7b 20 50 52 41 47 4d 41 20 77 61 6c 5f 63  l { PRAGMA wal_c
ed80: 68 65 63 6b 70 6f 69 6e 74 20 7d 0a 20 20 73 65  heckpoint }.  se
ed90: 74 20 73 79 6e 63 63 6f 75 6e 74 0a 7d 20 7b 30  t synccount.} {0
eda0: 7d 0a 64 62 20 63 6c 6f 73 65 0a 74 76 20 64 65  }.db close.tv de
edb0: 6c 65 74 65 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  lete..#---------
edc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
edd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ede0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
edf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ee00: 0a 23 20 54 65 73 74 73 20 66 6f 72 20 63 68 61  .# Tests for cha
ee10: 6e 67 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 6d 6f  nging journal mo
ee20: 64 65 2e 0a 23 0a 23 20 20 20 70 61 67 65 72 31  de..#.#   pager1
ee30: 2d 32 33 2e 31 2e 2a 3a 20 54 65 73 74 20 74 68  -23.1.*: Test th
ee40: 61 74 20 77 68 65 6e 20 63 68 61 6e 67 69 6e 67  at when changing
ee50: 20 66 72 6f 6d 20 50 45 52 53 49 53 54 20 74 6f   from PERSIST to
ee60: 20 44 45 4c 45 54 45 20 6d 6f 64 65 2c 0a 23 20   DELETE mode,.# 
ee70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee80: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
ee90: 65 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 23 0a  e is deleted..#.
eea0: 23 20 20 20 70 61 67 65 72 31 2d 32 33 2e 32 2e  #   pager1-23.2.
eeb0: 2a 3a 20 53 61 6d 65 20 74 65 73 74 20 61 73 20  *: Same test as 
eec0: 61 62 6f 76 65 2c 20 62 75 74 20 77 68 69 6c 65  above, but while
eed0: 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 69   a shared lock i
eee0: 73 20 68 65 6c 64 0a 23 20 20 20 20 20 20 20 20  s held.#        
eef0: 20 20 20 20 20 20 20 20 20 20 6f 6e 20 74 68 65            on the
ef00: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
ef10: 23 0a 23 20 20 20 70 61 67 65 72 31 2d 32 33 2e  #.#   pager1-23.
ef20: 33 2e 2a 3a 20 53 61 6d 65 20 74 65 73 74 20 61  3.*: Same test a
ef30: 73 20 61 62 6f 76 65 2c 20 62 75 74 20 77 68 69  s above, but whi
ef40: 6c 65 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f  le a reserved lo
ef50: 63 6b 20 69 73 20 68 65 6c 64 0a 23 20 20 20 20  ck is held.#    
ef60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 6e                on
ef70: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
ef80: 6c 65 2e 0a 23 0a 23 20 20 20 70 61 67 65 72 31  le..#.#   pager1
ef90: 2d 32 33 2e 34 2e 2a 3a 20 41 6e 64 2c 20 66 6f  -23.4.*: And, fo
efa0: 72 20 66 75 6e 2c 20 77 68 69 6c 65 20 68 6f 6c  r fun, while hol
efb0: 64 69 6e 67 20 61 6e 20 65 78 63 6c 75 73 69 76  ding an exclusiv
efc0: 65 20 6c 6f 63 6b 2e 0a 23 0a 23 20 20 20 70 61  e lock..#.#   pa
efd0: 67 65 72 31 2d 32 33 2e 35 2e 2a 3a 20 54 72 79  ger1-23.5.*: Try
efe0: 20 74 6f 20 73 65 74 20 76 61 72 69 6f 75 73 20   to set various 
eff0: 64 69 66 66 65 72 65 6e 74 20 6a 6f 75 72 6e 61  different journa
f000: 6c 20 6d 6f 64 65 73 20 77 69 74 68 20 61 6e 0a  l modes with an.
f010: 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  #               
f020: 20 20 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74     in-memory dat
f030: 61 62 61 73 65 20 28 6f 6e 6c 79 20 4d 45 4d 4f  abase (only MEMO
f040: 52 59 20 61 6e 64 20 4f 46 46 20 73 68 6f 75 6c  RY and OFF shoul
f050: 64 20 77 6f 72 6b 29 2e 0a 23 0a 23 20 20 20 70  d work)..#.#   p
f060: 61 67 65 72 31 2d 32 33 2e 36 2e 2a 3a 20 54 72  ager1-23.6.*: Tr
f070: 79 20 74 6f 20 73 65 74 20 6c 6f 63 6b 69 6e 67  y to set locking
f080: 5f 6d 6f 64 65 3d 6e 6f 72 6d 61 6c 20 6f 6e 20  _mode=normal on 
f090: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
f0a0: 61 62 61 73 65 0a 23 20 20 20 20 20 20 20 20 20  abase.#         
f0b0: 20 20 20 20 20 20 20 20 20 28 64 6f 65 73 6e 27           (doesn'
f0c0: 74 20 77 6f 72 6b 20 2d 20 69 6e 2d 6d 65 6d 6f  t work - in-memo
f0d0: 72 79 20 64 61 74 61 62 61 73 65 73 20 61 6c 77  ry databases alw
f0e0: 61 79 73 20 75 73 65 0a 23 20 20 20 20 20 20 20  ays use.#       
f0f0: 20 20 20 20 20 20 20 20 20 20 20 6c 6f 63 6b 69             locki
f100: 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76  ng_mode=exclusiv
f110: 65 29 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 70 61  e)..#.do_test pa
f120: 67 65 72 31 2d 32 33 2e 31 2e 31 20 7b 0a 20 20  ger1-23.1.1 {.  
f130: 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f  faultsim_delete_
f140: 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65  and_reopen.  exe
f150: 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d  csql {.    PRAGM
f160: 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d  A journal_mode =
f170: 20 50 45 52 53 49 53 54 3b 0a 20 20 20 20 43 52   PERSIST;.    CR
f180: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c  EATE TABLE t1(a,
f190: 20 62 29 3b 0a 20 20 7d 0a 20 20 66 69 6c 65 20   b);.  }.  file 
f1a0: 65 78 69 73 74 73 20 74 65 73 74 2e 64 62 2d 6a  exists test.db-j
f1b0: 6f 75 72 6e 61 6c 0a 7d 20 7b 31 7d 0a 64 6f 5f  ournal.} {1}.do_
f1c0: 74 65 73 74 20 70 61 67 65 72 31 2d 32 33 2e 31  test pager1-23.1
f1d0: 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .2 {.  execsql {
f1e0: 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f   PRAGMA journal_
f1f0: 6d 6f 64 65 20 3d 20 44 45 4c 45 54 45 20 7d 0a  mode = DELETE }.
f200: 20 20 66 69 6c 65 20 65 78 69 73 74 73 20 74 65    file exists te
f210: 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 7d 20  st.db-journal.} 
f220: 7b 30 7d 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67  {0}..do_test pag
f230: 65 72 31 2d 32 33 2e 32 2e 31 20 7b 0a 20 20 65  er1-23.2.1 {.  e
f240: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41  xecsql {.    PRA
f250: 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
f260: 20 3d 20 50 45 52 53 49 53 54 3b 0a 20 20 20 20   = PERSIST;.    
f270: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
f280: 41 4c 55 45 53 28 27 43 61 6e 62 65 72 72 61 27  ALUES('Canberra'
f290: 2c 20 27 41 43 54 27 29 3b 0a 20 20 7d 0a 20 20  , 'ACT');.  }.  
f2a0: 64 62 20 65 76 61 6c 20 7b 20 53 45 4c 45 43 54  db eval { SELECT
f2b0: 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7b 0a 20   * FROM t1 } {. 
f2c0: 20 20 20 64 62 20 65 76 61 6c 20 7b 20 50 52 41     db eval { PRA
f2d0: 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
f2e0: 20 3d 20 44 45 4c 45 54 45 20 7d 0a 20 20 7d 0a   = DELETE }.  }.
f2f0: 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47    execsql { PRAG
f300: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  MA journal_mode 
f310: 7d 0a 7d 20 7b 64 65 6c 65 74 65 7d 0a 64 6f 5f  }.} {delete}.do_
f320: 74 65 73 74 20 70 61 67 65 72 31 2d 32 33 2e 32  test pager1-23.2
f330: 2e 32 20 7b 0a 20 20 66 69 6c 65 20 65 78 69 73  .2 {.  file exis
f340: 74 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e  ts test.db-journ
f350: 61 6c 0a 7d 20 7b 30 7d 0a 0a 64 6f 5f 74 65 73  al.} {0}..do_tes
f360: 74 20 70 61 67 65 72 31 2d 32 33 2e 33 2e 31 20  t pager1-23.3.1 
f370: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
f380: 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c    PRAGMA journal
f390: 5f 6d 6f 64 65 20 3d 20 50 45 52 53 49 53 54 3b  _mode = PERSIST;
f3a0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
f3b0: 20 74 31 20 56 41 4c 55 45 53 28 27 44 61 72 77   t1 VALUES('Darw
f3c0: 69 6e 27 2c 20 27 4e 54 27 29 3b 0a 20 20 20 20  in', 'NT');.    
f3d0: 42 45 47 49 4e 20 49 4d 4d 45 44 49 41 54 45 3b  BEGIN IMMEDIATE;
f3e0: 0a 20 20 7d 0a 20 20 64 62 20 65 76 61 6c 20 7b  .  }.  db eval {
f3f0: 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f   PRAGMA journal_
f400: 6d 6f 64 65 20 3d 20 44 45 4c 45 54 45 20 7d 0a  mode = DELETE }.
f410: 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47    execsql { PRAG
f420: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  MA journal_mode 
f430: 7d 0a 7d 20 7b 64 65 6c 65 74 65 7d 0a 64 6f 5f  }.} {delete}.do_
f440: 74 65 73 74 20 70 61 67 65 72 31 2d 32 33 2e 33  test pager1-23.3
f450: 2e 32 20 7b 0a 20 20 66 69 6c 65 20 65 78 69 73  .2 {.  file exis
f460: 74 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e  ts test.db-journ
f470: 61 6c 0a 7d 20 7b 30 7d 0a 64 6f 5f 74 65 73 74  al.} {0}.do_test
f480: 20 70 61 67 65 72 31 2d 32 33 2e 33 2e 33 20 7b   pager1-23.3.3 {
f490: 0a 20 20 65 78 65 63 73 71 6c 20 43 4f 4d 4d 49  .  execsql COMMI
f4a0: 54 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74 20  T.} {}..do_test 
f4b0: 70 61 67 65 72 31 2d 32 33 2e 34 2e 31 20 7b 0a  pager1-23.4.1 {.
f4c0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
f4d0: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
f4e0: 6f 64 65 20 3d 20 50 45 52 53 49 53 54 3b 0a 20  ode = PERSIST;. 
f4f0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
f500: 31 20 56 41 4c 55 45 53 28 27 41 64 65 6c 61 69  1 VALUES('Adelai
f510: 64 65 27 2c 20 27 53 41 27 29 3b 0a 20 20 20 20  de', 'SA');.    
f520: 42 45 47 49 4e 20 45 58 43 4c 55 53 49 56 45 3b  BEGIN EXCLUSIVE;
f530: 0a 20 20 7d 0a 20 20 64 62 20 65 76 61 6c 20 7b  .  }.  db eval {
f540: 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f   PRAGMA journal_
f550: 6d 6f 64 65 20 3d 20 44 45 4c 45 54 45 20 7d 0a  mode = DELETE }.
f560: 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47    execsql { PRAG
f570: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  MA journal_mode 
f580: 7d 0a 7d 20 7b 64 65 6c 65 74 65 7d 0a 64 6f 5f  }.} {delete}.do_
f590: 74 65 73 74 20 70 61 67 65 72 31 2d 32 33 2e 34  test pager1-23.4
f5a0: 2e 32 20 7b 0a 20 20 66 69 6c 65 20 65 78 69 73  .2 {.  file exis
f5b0: 74 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e  ts test.db-journ
f5c0: 61 6c 0a 7d 20 7b 30 7d 0a 64 6f 5f 74 65 73 74  al.} {0}.do_test
f5d0: 20 70 61 67 65 72 31 2d 32 33 2e 34 2e 33 20 7b   pager1-23.4.3 {
f5e0: 0a 20 20 65 78 65 63 73 71 6c 20 43 4f 4d 4d 49  .  execsql COMMI
f5f0: 54 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74 20  T.} {}..do_test 
f600: 70 61 67 65 72 31 2d 32 33 2e 35 2e 31 20 7b 0a  pager1-23.5.1 {.
f610: 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74    faultsim_delet
f620: 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 73  e_and_reopen.  s
f630: 71 6c 69 74 65 33 20 64 62 20 3a 6d 65 6d 6f 72  qlite3 db :memor
f640: 79 3a 0a 7d 20 7b 7d 0a 66 6f 72 65 61 63 68 20  y:.} {}.foreach 
f650: 7b 74 6e 20 6d 6f 64 65 20 70 6f 73 73 69 62 6c  {tn mode possibl
f660: 65 7d 20 7b 0a 20 20 32 20 20 6f 66 66 20 20 20  e} {.  2  off   
f670: 20 20 20 31 0a 20 20 33 20 20 6d 65 6d 6f 72 79     1.  3  memory
f680: 20 20 20 31 0a 20 20 34 20 20 70 65 72 73 69 73     1.  4  persis
f690: 74 20 20 30 0a 20 20 35 20 20 64 65 6c 65 74 65  t  0.  5  delete
f6a0: 20 20 20 30 0a 20 20 36 20 20 77 61 6c 20 20 20     0.  6  wal   
f6b0: 20 20 20 30 0a 20 20 37 20 20 74 72 75 6e 63 61     0.  7  trunca
f6c0: 74 65 20 30 0a 7d 20 7b 0a 20 20 64 6f 5f 74 65  te 0.} {.  do_te
f6d0: 73 74 20 70 61 67 65 72 31 2d 32 33 2e 35 2e 24  st pager1-23.5.$
f6e0: 74 6e 2e 31 20 7b 0a 20 20 20 20 65 78 65 63 73  tn.1 {.    execs
f6f0: 71 6c 20 22 50 52 41 47 4d 41 20 6a 6f 75 72 6e  ql "PRAGMA journ
f700: 61 6c 5f 6d 6f 64 65 20 3d 20 6f 66 66 22 0a 20  al_mode = off". 
f710: 20 20 20 65 78 65 63 73 71 6c 20 22 50 52 41 47     execsql "PRAG
f720: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  MA journal_mode 
f730: 3d 20 24 6d 6f 64 65 22 0a 20 20 7d 20 5b 69 66  = $mode".  } [if
f740: 20 24 70 6f 73 73 69 62 6c 65 20 7b 6c 69 73 74   $possible {list
f750: 20 24 6d 6f 64 65 7d 20 7b 6c 69 73 74 20 6f 66   $mode} {list of
f760: 66 7d 5d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61  f}].  do_test pa
f770: 67 65 72 31 2d 32 33 2e 35 2e 24 74 6e 2e 32 20  ger1-23.5.$tn.2 
f780: 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 22 50  {.    execsql "P
f790: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
f7a0: 64 65 20 3d 20 6d 65 6d 6f 72 79 22 0a 20 20 20  de = memory".   
f7b0: 20 65 78 65 63 73 71 6c 20 22 50 52 41 47 4d 41   execsql "PRAGMA
f7c0: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20   journal_mode = 
f7d0: 24 6d 6f 64 65 22 0a 20 20 7d 20 5b 69 66 20 24  $mode".  } [if $
f7e0: 70 6f 73 73 69 62 6c 65 20 7b 6c 69 73 74 20 24  possible {list $
f7f0: 6d 6f 64 65 7d 20 7b 6c 69 73 74 20 6d 65 6d 6f  mode} {list memo
f800: 72 79 7d 5d 0a 7d 0a 64 6f 5f 74 65 73 74 20 70  ry}].}.do_test p
f810: 61 67 65 72 31 2d 32 33 2e 36 2e 31 20 7b 0a 20  ager1-23.6.1 {. 
f820: 20 65 78 65 63 73 71 6c 20 7b 50 52 41 47 4d 41   execsql {PRAGMA
f830: 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 20 3d 20   locking_mode = 
f840: 6e 6f 72 6d 61 6c 7d 0a 7d 20 7b 65 78 63 6c 75  normal}.} {exclu
f850: 73 69 76 65 7d 0a 64 6f 5f 74 65 73 74 20 70 61  sive}.do_test pa
f860: 67 65 72 31 2d 32 33 2e 36 2e 32 20 7b 0a 20 20  ger1-23.6.2 {.  
f870: 65 78 65 63 73 71 6c 20 7b 50 52 41 47 4d 41 20  execsql {PRAGMA 
f880: 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 20 3d 20 65  locking_mode = e
f890: 78 63 6c 75 73 69 76 65 7d 0a 7d 20 7b 65 78 63  xclusive}.} {exc
f8a0: 6c 75 73 69 76 65 7d 0a 64 6f 5f 74 65 73 74 20  lusive}.do_test 
f8b0: 70 61 67 65 72 31 2d 32 33 2e 36 2e 33 20 7b 0a  pager1-23.6.3 {.
f8c0: 20 20 65 78 65 63 73 71 6c 20 7b 50 52 41 47 4d    execsql {PRAGM
f8d0: 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 7d 0a  A locking_mode}.
f8e0: 7d 20 7b 65 78 63 6c 75 73 69 76 65 7d 0a 64 6f  } {exclusive}.do
f8f0: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 33 2e  _test pager1-23.
f900: 36 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  6.4 {.  execsql 
f910: 7b 50 52 41 47 4d 41 20 6d 61 69 6e 2e 6c 6f 63  {PRAGMA main.loc
f920: 6b 69 6e 67 5f 6d 6f 64 65 7d 0a 7d 20 7b 65 78  king_mode}.} {ex
f930: 63 6c 75 73 69 76 65 7d 0a 0a 23 2d 2d 2d 2d 2d  clusive}..#-----
f940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f980: 2d 2d 2d 2d 0a 23 0a 64 6f 5f 74 65 73 74 20 70  ----.#.do_test p
f990: 61 67 65 72 31 2d 32 34 2e 31 2e 31 20 7b 0a 20  ager1-24.1.1 {. 
f9a0: 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65   faultsim_delete
f9b0: 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 64 62  _and_reopen.  db
f9c0: 20 66 75 6e 63 20 61 5f 73 74 72 69 6e 67 20 61   func a_string a
f9d0: 5f 73 74 72 69 6e 67 0a 20 20 65 78 65 63 73 71  _string.  execsq
f9e0: 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 63  l {.    PRAGMA c
f9f0: 61 63 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b 0a  ache_size = 10;.
fa00: 20 20 20 20 50 52 41 47 4d 41 20 61 75 74 6f 5f      PRAGMA auto_
fa10: 76 61 63 75 75 6d 20 3d 20 46 55 4c 4c 3b 0a 20  vacuum = FULL;. 
fa20: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
fa30: 78 31 28 78 2c 20 79 2c 20 7a 2c 20 50 52 49 4d  x1(x, y, z, PRIM
fa40: 41 52 59 20 4b 45 59 28 79 2c 20 7a 29 29 3b 0a  ARY KEY(y, z));.
fa50: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
fa60: 20 78 32 28 78 2c 20 79 2c 20 7a 2c 20 50 52 49   x2(x, y, z, PRI
fa70: 4d 41 52 59 20 4b 45 59 28 79 2c 20 7a 29 29 3b  MARY KEY(y, z));
fa80: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
fa90: 20 78 32 20 56 41 4c 55 45 53 28 61 5f 73 74 72   x2 VALUES(a_str
faa0: 69 6e 67 28 34 30 30 29 2c 20 61 5f 73 74 72 69  ing(400), a_stri
fab0: 6e 67 28 35 30 30 29 2c 20 61 5f 73 74 72 69 6e  ng(500), a_strin
fac0: 67 28 36 30 30 29 29 3b 0a 20 20 20 20 49 4e 53  g(600));.    INS
fad0: 45 52 54 20 49 4e 54 4f 20 78 32 20 53 45 4c 45  ERT INTO x2 SELE
fae0: 43 54 20 61 5f 73 74 72 69 6e 67 28 36 30 30 29  CT a_string(600)
faf0: 2c 20 61 5f 73 74 72 69 6e 67 28 34 30 30 29 2c  , a_string(400),
fb00: 20 61 5f 73 74 72 69 6e 67 28 35 30 30 29 20 46   a_string(500) F
fb10: 52 4f 4d 20 78 32 3b 0a 20 20 20 20 49 4e 53 45  ROM x2;.    INSE
fb20: 52 54 20 49 4e 54 4f 20 78 32 20 53 45 4c 45 43  RT INTO x2 SELEC
fb30: 54 20 61 5f 73 74 72 69 6e 67 28 35 30 30 29 2c  T a_string(500),
fb40: 20 61 5f 73 74 72 69 6e 67 28 36 30 30 29 2c 20   a_string(600), 
fb50: 61 5f 73 74 72 69 6e 67 28 34 30 30 29 20 46 52  a_string(400) FR
fb60: 4f 4d 20 78 32 3b 0a 20 20 20 20 49 4e 53 45 52  OM x2;.    INSER
fb70: 54 20 49 4e 54 4f 20 78 32 20 53 45 4c 45 43 54  T INTO x2 SELECT
fb80: 20 61 5f 73 74 72 69 6e 67 28 34 30 30 29 2c 20   a_string(400), 
fb90: 61 5f 73 74 72 69 6e 67 28 35 30 30 29 2c 20 61  a_string(500), a
fba0: 5f 73 74 72 69 6e 67 28 36 30 30 29 20 46 52 4f  _string(600) FRO
fbb0: 4d 20 78 32 3b 0a 20 20 20 20 49 4e 53 45 52 54  M x2;.    INSERT
fbc0: 20 49 4e 54 4f 20 78 32 20 53 45 4c 45 43 54 20   INTO x2 SELECT 
fbd0: 61 5f 73 74 72 69 6e 67 28 36 30 30 29 2c 20 61  a_string(600), a
fbe0: 5f 73 74 72 69 6e 67 28 34 30 30 29 2c 20 61 5f  _string(400), a_
fbf0: 73 74 72 69 6e 67 28 35 30 30 29 20 46 52 4f 4d  string(500) FROM
fc00: 20 78 32 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   x2;.    INSERT 
fc10: 49 4e 54 4f 20 78 32 20 53 45 4c 45 43 54 20 61  INTO x2 SELECT a
fc20: 5f 73 74 72 69 6e 67 28 35 30 30 29 2c 20 61 5f  _string(500), a_
fc30: 73 74 72 69 6e 67 28 36 30 30 29 2c 20 61 5f 73  string(600), a_s
fc40: 74 72 69 6e 67 28 34 30 30 29 20 46 52 4f 4d 20  tring(400) FROM 
fc50: 78 32 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  x2;.    INSERT I
fc60: 4e 54 4f 20 78 32 20 53 45 4c 45 43 54 20 61 5f  NTO x2 SELECT a_
fc70: 73 74 72 69 6e 67 28 34 30 30 29 2c 20 61 5f 73  string(400), a_s
fc80: 74 72 69 6e 67 28 35 30 30 29 2c 20 61 5f 73 74  tring(500), a_st
fc90: 72 69 6e 67 28 36 30 30 29 20 46 52 4f 4d 20 78  ring(600) FROM x
fca0: 32 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  2;.    INSERT IN
fcb0: 54 4f 20 78 31 20 53 45 4c 45 43 54 20 2a 20 46  TO x1 SELECT * F
fcc0: 52 4f 4d 20 78 32 3b 0a 20 20 7d 0a 7d 20 7b 7d  ROM x2;.  }.} {}
fcd0: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
fce0: 32 34 2e 31 2e 32 20 7b 0a 20 20 65 78 65 63 73  24.1.2 {.  execs
fcf0: 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a  ql {.    BEGIN;.
fd00: 20 20 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f        DELETE FRO
fd10: 4d 20 78 31 20 57 48 45 52 45 20 72 6f 77 69 64  M x1 WHERE rowid
fd20: 3c 33 32 3b 0a 20 20 7d 0a 20 20 72 65 63 75 72  <32;.  }.  recur
fd30: 73 69 76 65 5f 73 65 6c 65 63 74 20 36 34 20 78  sive_select 64 x
fd40: 32 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 70  2.} {}.do_test p
fd50: 61 67 65 72 31 2d 32 34 2e 31 2e 33 20 7b 0a 20  ager1-24.1.3 {. 
fd60: 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20   execsql { .    
fd70: 20 20 55 50 44 41 54 45 20 78 31 20 53 45 54 20    UPDATE x1 SET 
fd80: 7a 20 3d 20 61 5f 73 74 72 69 6e 67 28 33 30 30  z = a_string(300
fd90: 29 20 57 48 45 52 45 20 72 6f 77 69 64 3e 34 30  ) WHERE rowid>40
fda0: 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20  ;.    COMMIT;.  
fdb0: 20 20 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69    PRAGMA integri
fdc0: 74 79 5f 63 68 65 63 6b 3b 0a 20 20 20 20 53 45  ty_check;.    SE
fdd0: 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
fde0: 4f 4d 20 78 31 3b 0a 20 20 7d 0a 7d 20 7b 6f 6b  OM x1;.  }.} {ok
fdf0: 20 33 33 7d 0a 0a 64 6f 5f 74 65 73 74 20 70 61   33}..do_test pa
fe00: 67 65 72 31 2d 32 34 2e 31 2e 34 20 7b 0a 20 20  ger1-24.1.4 {.  
fe10: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 44 45  execsql {.    DE
fe20: 4c 45 54 45 20 46 52 4f 4d 20 78 31 3b 0a 20 20  LETE FROM x1;.  
fe30: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 31    INSERT INTO x1
fe40: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 78   SELECT * FROM x
fe50: 32 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20  2;.    BEGIN;.  
fe60: 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20      DELETE FROM 
fe70: 78 31 20 57 48 45 52 45 20 72 6f 77 69 64 3c 33  x1 WHERE rowid<3
fe80: 32 3b 0a 20 20 20 20 20 20 55 50 44 41 54 45 20  2;.      UPDATE 
fe90: 78 31 20 53 45 54 20 7a 20 3d 20 61 5f 73 74 72  x1 SET z = a_str
fea0: 69 6e 67 28 32 39 39 29 20 57 48 45 52 45 20 72  ing(299) WHERE r
feb0: 6f 77 69 64 3e 34 30 3b 0a 20 20 7d 0a 20 20 72  owid>40;.  }.  r
fec0: 65 63 75 72 73 69 76 65 5f 73 65 6c 65 63 74 20  ecursive_select 
fed0: 36 34 20 78 32 20 7b 64 62 20 65 76 61 6c 20 43  64 x2 {db eval C
fee0: 4f 4d 4d 49 54 7d 0a 20 20 65 78 65 63 73 71 6c  OMMIT}.  execsql
fef0: 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 69 6e   {.    PRAGMA in
ff00: 74 65 67 72 69 74 79 5f 63 68 65 63 6b 3b 0a 20  tegrity_check;. 
ff10: 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28     SELECT count(
ff20: 2a 29 20 46 52 4f 4d 20 78 31 3b 0a 20 20 7d 0a  *) FROM x1;.  }.
ff30: 7d 20 7b 6f 6b 20 33 33 7d 0a 0a 64 6f 5f 74 65  } {ok 33}..do_te
ff40: 73 74 20 70 61 67 65 72 31 2d 32 34 2e 31 2e 35  st pager1-24.1.5
ff50: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
ff60: 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 78     DELETE FROM x
ff70: 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  1;.    INSERT IN
ff80: 54 4f 20 78 31 20 53 45 4c 45 43 54 20 2a 20 46  TO x1 SELECT * F
ff90: 52 4f 4d 20 78 32 3b 0a 20 20 7d 0a 20 20 72 65  ROM x2;.  }.  re
ffa0: 63 75 72 73 69 76 65 5f 73 65 6c 65 63 74 20 36  cursive_select 6
ffb0: 34 20 78 32 20 7b 20 64 62 20 65 76 61 6c 20 7b  4 x2 { db eval {
ffc0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 78 33 28  CREATE TABLE x3(
ffd0: 78 2c 20 79 2c 20 7a 29 7d 20 7d 0a 20 20 65 78  x, y, z)} }.  ex
ffe0: 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a  ecsql { SELECT *
fff0: 20 46 52 4f 4d 20 78 33 20 7d 0a 7d 20 7b 7d 0a   FROM x3 }.} {}.
10000 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
10010 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10020 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10030 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10040 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 0a 64 6f  -----------.#.do
10050 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 35 2d  _test pager1-25-
10060 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64  1 {.  faultsim_d
10070 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e  elete_and_reopen
10080 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
10090 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 53 41   BEGIN;.      SA
100a0 56 45 50 4f 49 4e 54 20 61 62 63 3b 0a 20 20 20  VEPOINT abc;.   
100b0 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c       CREATE TABL
100c0 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20  E t1(a, b);.    
100d0 20 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 61 62    ROLLBACK TO ab
100e0 63 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20  c;.    COMMIT;. 
100f0 20 7d 0a 20 20 64 62 20 63 6c 6f 73 65 0a 7d 20   }.  db close.} 
10100 7b 7d 0a 62 72 65 61 6b 70 6f 69 6e 74 0a 64 6f  {}.breakpoint.do
10110 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 35 2d  _test pager1-25-
10120 32 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64  2 {.  faultsim_d
10130 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e  elete_and_reopen
10140 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
10150 20 53 41 56 45 50 4f 49 4e 54 20 61 62 63 3b 0a   SAVEPOINT abc;.
10160 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42        CREATE TAB
10170 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20  LE t1(a, b);.   
10180 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 61 62 63   ROLLBACK TO abc
10190 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20  ;.    COMMIT;.  
101a0 7d 0a 20 20 64 62 20 63 6c 6f 73 65 0a 7d 20 7b  }.  db close.} {
101b0 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }..#------------
101c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
101d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
101e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
101f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
10200 53 65 63 74 6f 72 2d 73 69 7a 65 20 74 65 73 74  Sector-size test
10210 73 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 70 61 67  s..#.do_test pag
10220 65 72 31 2d 32 36 2e 31 20 7b 0a 20 20 74 65 73  er1-26.1 {.  tes
10230 74 76 66 73 20 74 76 20 2d 64 65 66 61 75 6c 74  tvfs tv -default
10240 20 31 0a 20 20 74 76 20 73 65 63 74 6f 72 73 69   1.  tv sectorsi
10250 7a 65 20 34 30 39 36 0a 20 20 66 61 75 6c 74 73  ze 4096.  faults
10260 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65  im_delete_and_re
10270 6f 70 65 6e 0a 20 20 64 62 20 66 75 6e 63 20 61  open.  db func a
10280 5f 73 74 72 69 6e 67 20 61 5f 73 74 72 69 6e 67  _string a_string
10290 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
102a0 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a   PRAGMA page_siz
102b0 65 20 3d 20 35 31 32 3b 0a 20 20 20 20 43 52 45  e = 512;.    CRE
102c0 41 54 45 20 54 41 42 4c 45 20 74 62 6c 28 61 20  ATE TABLE tbl(a 
102d0 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 20 55  PRIMARY KEY, b U
102e0 4e 49 51 55 45 29 3b 0a 20 20 20 20 42 45 47 49  NIQUE);.    BEGI
102f0 4e 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  N;.      INSERT 
10300 49 4e 54 4f 20 74 62 6c 20 56 41 4c 55 45 53 28  INTO tbl VALUES(
10310 61 5f 73 74 72 69 6e 67 28 32 35 29 2c 20 61 5f  a_string(25), a_
10320 73 74 72 69 6e 67 28 36 30 30 29 29 3b 0a 20 20  string(600));.  
10330 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
10340 74 62 6c 20 53 45 4c 45 43 54 20 61 5f 73 74 72  tbl SELECT a_str
10350 69 6e 67 28 32 35 29 2c 20 61 5f 73 74 72 69 6e  ing(25), a_strin
10360 67 28 36 30 30 29 20 46 52 4f 4d 20 74 62 6c 3b  g(600) FROM tbl;
10370 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
10380 54 4f 20 74 62 6c 20 53 45 4c 45 43 54 20 61 5f  TO tbl SELECT a_
10390 73 74 72 69 6e 67 28 32 35 29 2c 20 61 5f 73 74  string(25), a_st
103a0 72 69 6e 67 28 36 30 30 29 20 46 52 4f 4d 20 74  ring(600) FROM t
103b0 62 6c 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  bl;.      INSERT
103c0 20 49 4e 54 4f 20 74 62 6c 20 53 45 4c 45 43 54   INTO tbl SELECT
103d0 20 61 5f 73 74 72 69 6e 67 28 32 35 29 2c 20 61   a_string(25), a
103e0 5f 73 74 72 69 6e 67 28 36 30 30 29 20 46 52 4f  _string(600) FRO
103f0 4d 20 74 62 6c 3b 0a 20 20 20 20 20 20 49 4e 53  M tbl;.      INS
10400 45 52 54 20 49 4e 54 4f 20 74 62 6c 20 53 45 4c  ERT INTO tbl SEL
10410 45 43 54 20 61 5f 73 74 72 69 6e 67 28 32 35 29  ECT a_string(25)
10420 2c 20 61 5f 73 74 72 69 6e 67 28 36 30 30 29 20  , a_string(600) 
10430 46 52 4f 4d 20 74 62 6c 3b 0a 20 20 20 20 20 20  FROM tbl;.      
10440 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 62 6c 20  INSERT INTO tbl 
10450 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28  SELECT a_string(
10460 32 35 29 2c 20 61 5f 73 74 72 69 6e 67 28 36 30  25), a_string(60
10470 30 29 20 46 52 4f 4d 20 74 62 6c 3b 0a 20 20 20  0) FROM tbl;.   
10480 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
10490 62 6c 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69  bl SELECT a_stri
104a0 6e 67 28 32 35 29 2c 20 61 5f 73 74 72 69 6e 67  ng(25), a_string
104b0 28 36 30 30 29 20 46 52 4f 4d 20 74 62 6c 3b 0a  (600) FROM tbl;.
104c0 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
104d0 4f 20 74 62 6c 20 53 45 4c 45 43 54 20 61 5f 73  O tbl SELECT a_s
104e0 74 72 69 6e 67 28 32 35 29 2c 20 61 5f 73 74 72  tring(25), a_str
104f0 69 6e 67 28 36 30 30 29 20 46 52 4f 4d 20 74 62  ing(600) FROM tb
10500 6c 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20  l;.    COMMIT;. 
10510 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 65 78 65 63 73   }.} {}.do_execs
10520 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32  ql_test pager1-2
10530 36 2e 31 20 7b 0a 20 20 55 50 44 41 54 45 20 74  6.1 {.  UPDATE t
10540 62 6c 20 53 45 54 20 62 20 3d 20 61 5f 73 74 72  bl SET b = a_str
10550 69 6e 67 28 35 35 30 29 3b 0a 7d 20 7b 7d 0a 64  ing(550);.} {}.d
10560 62 20 63 6c 6f 73 65 0a 74 76 20 64 65 6c 65 74  b close.tv delet
10570 65 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  e..#------------
10580 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10590 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
105a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
105b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 64 6f  -------------.do
105c0 5f 74 65 73 74 20 70 61 67 65 72 31 2e 32 37 2e  _test pager1.27.
105d0 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64  1 {.  faultsim_d
105e0 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e  elete_and_reopen
105f0 0a 20 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72  .  sqlite3_pager
10600 5f 72 65 66 63 6f 75 6e 74 73 20 64 62 0a 20 20  _refcounts db.  
10610 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42 45  execsql {.    BE
10620 47 49 4e 3b 0a 20 20 20 20 20 20 43 52 45 41 54  GIN;.      CREAT
10630 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29  E TABLE t1(a, b)
10640 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
10650 70 61 67 65 72 5f 72 65 66 63 6f 75 6e 74 73 20  pager_refcounts 
10660 64 62 0a 20 20 65 78 65 63 73 71 6c 20 43 4f 4d  db.  execsql COM
10670 4d 49 54 0a 7d 20 7b 7d 0a 0a 66 69 6e 69 73 68  MIT.} {}..finish
10680 5f 74 65 73 74 0a                                _test.