/ Hex Artifact Content
Login

Artifact 5352bec6768eec69dee75b97199d156dcb4a933c:


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 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73    do_execsql_tes
2d60: 74 20 70 61 67 65 72 31 2d 33 2e 24 74 6e 2e 36  t pager1-3.$tn.6
2d70: 20 7b 0a 20 20 20 20 53 41 56 45 50 4f 49 4e 54   {.    SAVEPOINT
2d80: 20 6f 6e 65 3b 0a 20 20 20 20 52 45 4c 45 41 53   one;.    RELEAS
2d90: 45 20 6f 6e 65 3b 0a 20 20 7d 20 7b 7d 0a 0a 20  E one;.  } {}.. 
2da0: 20 64 62 20 63 6c 6f 73 65 0a 20 20 63 61 74 63   db close.  catc
2db0: 68 20 7b 20 74 76 20 64 65 6c 65 74 65 20 7d 0a  h { tv delete }.
2dc0: 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }..#------------
2dd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2de0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2df0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
2e10: 48 6f 74 20 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  Hot journal roll
2e20: 62 61 63 6b 20 72 65 6c 61 74 65 64 20 74 65 73  back related tes
2e30: 74 20 63 61 73 65 73 2e 0a 23 0a 23 20 70 61 67  t cases..#.# pag
2e40: 65 72 31 2e 34 2e 31 2e 2a 3a 20 54 65 73 74 20  er1.4.1.*: Test 
2e50: 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20 6d  that the pager m
2e60: 6f 64 75 6c 65 20 64 65 6c 65 74 65 73 20 76 65  odule deletes ve
2e70: 72 79 20 73 6d 61 6c 6c 20 69 6e 76 61 6c 69 64  ry small invalid
2e80: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
2e90: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a   journal files..
2ea0: 23 0a 23 20 70 61 67 65 72 31 2e 34 2e 32 2e 2a  #.# pager1.4.2.*
2eb0: 3a 20 54 65 73 74 20 74 68 61 74 20 69 66 20 74  : Test that if t
2ec0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
2ed0: 6c 20 70 6f 69 6e 74 65 72 20 61 74 20 74 68 65  l pointer at the
2ee0: 20 65 6e 64 20 6f 66 20 61 0a 23 20 20 20 20 20   end of a.#     
2ef0: 20 20 20 20 20 20 20 20 20 20 68 6f 74 2d 6a 6f            hot-jo
2f00: 75 72 6e 61 6c 20 66 69 6c 65 20 61 70 70 65 61  urnal file appea
2f10: 72 73 20 74 6f 20 62 65 20 63 6f 72 72 75 70 74  rs to be corrupt
2f20: 20 28 63 68 65 63 6b 73 75 6d 20 64 6f 65 73 20   (checksum does 
2f30: 6e 6f 74 0a 23 20 20 20 20 20 20 20 20 20 20 20  not.#           
2f40: 20 20 20 20 63 6f 6d 70 75 74 65 29 20 74 68 65      compute) the
2f50: 20 61 73 73 6f 63 69 61 74 65 64 20 6a 6f 75 72   associated jour
2f60: 6e 61 6c 20 69 73 20 72 6f 6c 6c 65 64 20 62 61  nal is rolled ba
2f70: 63 6b 20 28 61 6e 64 20 6e 6f 0a 23 20 20 20 20  ck (and no.#    
2f80: 20 20 20 20 20 20 20 20 20 20 20 78 41 63 63 65             xAcce
2f90: 73 73 28 29 20 63 61 6c 6c 20 74 6f 20 63 68 65  ss() call to che
2fa0: 63 6b 20 66 6f 72 20 74 68 65 20 70 72 65 73 65  ck for the prese
2fb0: 6e 63 65 20 6f 66 20 61 6e 79 20 6d 61 73 74 65  nce of any maste
2fc0: 72 20 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  r .#            
2fd0: 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20     journal file 
2fe0: 69 73 20 6d 61 64 65 29 2e 0a 23 0a 23 20 70 61  is made)..#.# pa
2ff0: 67 65 72 31 2e 34 2e 33 2e 2a 3a 20 54 65 73 74  ger1.4.3.*: Test
3000: 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e   that the conten
3010: 74 73 20 6f 66 20 61 20 68 6f 74 2d 6a 6f 75 72  ts of a hot-jour
3020: 6e 61 6c 20 61 72 65 20 69 67 6e 6f 72 65 64 20  nal are ignored 
3030: 69 66 20 74 68 65 0a 23 20 20 20 20 20 20 20 20  if the.#        
3040: 20 20 20 20 20 20 20 70 61 67 65 2d 73 69 7a 65         page-size
3050: 20 6f 72 20 73 65 63 74 6f 72 2d 73 69 7a 65 20   or sector-size 
3060: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  in the journal h
3070: 65 61 64 65 72 20 61 70 70 65 61 72 20 74 6f 0a  eader appear to.
3080: 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  #               
3090: 62 65 20 69 6e 76 61 6c 69 64 20 28 74 6f 6f 20  be invalid (too 
30a0: 6c 61 72 67 65 2c 20 74 6f 6f 20 73 6d 61 6c 6c  large, too small
30b0: 20 6f 72 20 6e 6f 74 20 61 20 70 6f 77 65 72 20   or not a power 
30c0: 6f 66 20 32 29 2e 0a 23 0a 23 20 70 61 67 65 72  of 2)..#.# pager
30d0: 31 2e 34 2e 34 2e 2a 3a 20 54 65 73 74 20 68 6f  1.4.4.*: Test ho
30e0: 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
30f0: 63 6b 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 66 69  ck of journal fi
3100: 6c 65 20 77 69 74 68 20 61 20 6d 61 73 74 65 72  le with a master
3110: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
3120: 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72   journal pointer
3130: 20 67 65 6e 65 72 61 74 65 64 20 69 6e 20 76 61   generated in va
3140: 72 69 6f 75 73 20 22 50 52 41 47 4d 41 20 73 79  rious "PRAGMA sy
3150: 6e 63 68 72 6f 6e 6f 75 73 22 0a 23 20 20 20 20  nchronous".#    
3160: 20 20 20 20 20 20 20 20 20 20 20 6d 6f 64 65 73             modes
3170: 2e 0a 23 0a 23 20 70 61 67 65 72 31 2e 34 2e 35  ..#.# pager1.4.5
3180: 2e 2a 3a 20 54 65 73 74 20 74 68 61 74 20 68 6f  .*: Test that ho
3190: 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
31a0: 63 6b 20 73 74 6f 70 73 20 69 66 20 69 74 20 65  ck stops if it e
31b0: 6e 63 6f 75 6e 74 65 72 73 20 61 0a 23 20 20 20  ncounters a.#   
31c0: 20 20 20 20 20 20 20 20 20 20 20 20 6a 6f 75 72              jour
31d0: 6e 61 6c 2d 72 65 63 6f 72 64 20 66 6f 72 20 77  nal-record for w
31e0: 68 69 63 68 20 74 68 65 20 63 68 65 63 6b 73 75  hich the checksu
31f0: 6d 20 66 61 69 6c 73 2e 0a 23 0a 23 20 70 61 67  m fails..#.# pag
3200: 65 72 31 2e 34 2e 36 2e 2a 3a 20 54 65 73 74 20  er1.4.6.*: Test 
3210: 74 68 61 74 20 77 68 65 6e 20 72 6f 6c 6c 69 6e  that when rollin
3220: 67 20 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75  g back a hot-jou
3230: 72 6e 61 6c 20 74 68 61 74 20 63 6f 6e 74 61 69  rnal that contai
3240: 6e 73 20 61 0a 23 20 20 20 20 20 20 20 20 20 20  ns a.#          
3250: 20 20 20 20 20 6d 61 73 74 65 72 20 6a 6f 75 72       master jour
3260: 6e 61 6c 20 70 6f 69 6e 74 65 72 2c 20 74 68 65  nal pointer, the
3270: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
3280: 66 69 6c 65 20 69 73 20 64 65 6c 65 74 65 64 0a  file is deleted.
3290: 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  #               
32a0: 61 66 74 65 72 20 61 6c 6c 20 74 68 65 20 68 6f  after all the ho
32b0: 74 2d 6a 6f 75 72 6e 61 6c 73 20 74 68 61 74 20  t-journals that 
32c0: 72 65 66 65 72 20 74 6f 20 69 74 20 61 72 65 20  refer to it are 
32d0: 64 65 6c 65 74 65 64 2e 0a 23 0a 23 20 70 61 67  deleted..#.# pag
32e0: 65 72 31 2e 34 2e 37 2e 2a 3a 20 54 65 73 74 20  er1.4.7.*: Test 
32f0: 74 68 61 74 20 69 66 20 61 20 68 6f 74 2d 6a 6f  that if a hot-jo
3300: 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74  urnal file exist
3310: 73 20 62 75 74 20 61 20 63 6c 69 65 6e 74 20 63  s but a client c
3320: 61 6e 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  an.#            
3330: 20 20 20 6f 70 65 6e 20 69 74 20 66 6f 72 20 72     open it for r
3340: 65 61 64 69 6e 67 20 6f 6e 6c 79 2c 20 74 68 65  eading only, the
3350: 20 64 61 74 61 62 61 73 65 20 63 61 6e 6e 6f 74   database cannot
3360: 20 62 65 20 61 63 63 65 73 73 65 64 20 61 6e 64   be accessed and
3370: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
3380: 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
3390: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 23 20   is returned..# 
33a0: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2e  .do_test pager1.
33b0: 34 2e 31 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73  4.1.1 {.  faults
33c0: 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65  im_delete_and_re
33d0: 6f 70 65 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b  open.  execsql {
33e0: 20 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42   .    CREATE TAB
33f0: 4c 45 20 78 28 79 2c 20 7a 29 3b 0a 20 20 20 20  LE x(y, z);.    
3400: 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 20 56 41  INSERT INTO x VA
3410: 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20 20 7d 0a  LUES(1, 2);.  }.
3420: 20 20 73 65 74 20 66 64 20 5b 6f 70 65 6e 20 74    set fd [open t
3430: 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 77  est.db-journal w
3440: 5d 0a 20 20 70 75 74 73 20 2d 6e 6f 6e 65 77 6c  ].  puts -nonewl
3450: 69 6e 65 20 24 66 64 20 22 68 65 6c 6c 6f 77 6f  ine $fd "hellowo
3460: 72 6c 64 22 0a 20 20 63 6c 6f 73 65 20 24 66 64  rld".  close $fd
3470: 0a 20 20 66 69 6c 65 20 65 78 69 73 74 73 20 74  .  file exists t
3480: 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 7d  est.db-journal.}
3490: 20 7b 31 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67   {1}.do_test pag
34a0: 65 72 31 2e 34 2e 31 2e 32 20 7b 20 65 78 65 63  er1.4.1.2 { exec
34b0: 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46  sql { SELECT * F
34c0: 52 4f 4d 20 78 20 7d 20 7d 20 7b 31 20 32 7d 0a  ROM x } } {1 2}.
34d0: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34  do_test pager1.4
34e0: 2e 31 2e 33 20 7b 20 66 69 6c 65 20 65 78 69 73  .1.3 { file exis
34f0: 74 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e  ts test.db-journ
3500: 61 6c 20 7d 20 7b 30 7d 0a 0a 23 20 53 65 74 20  al } {0}..# Set 
3510: 75 70 20 61 20 5b 74 65 73 74 76 66 73 5d 20 74  up a [testvfs] t
3520: 6f 20 73 6e 61 70 73 68 6f 74 20 74 68 65 20 66  o snapshot the f
3530: 69 6c 65 2d 73 79 73 74 65 6d 20 6a 75 73 74 20  ile-system just 
3540: 62 65 66 6f 72 65 20 53 51 4c 69 74 65 0a 23 20  before SQLite.# 
3550: 64 65 6c 65 74 65 73 20 74 68 65 20 6d 61 73 74  deletes the mast
3560: 65 72 2d 6a 6f 75 72 6e 61 6c 20 74 6f 20 63 6f  er-journal to co
3570: 6d 6d 69 74 20 61 20 6d 75 6c 74 69 2d 66 69 6c  mmit a multi-fil
3580: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 23  e transaction..#
3590: 0a 23 20 49 6e 20 73 75 62 73 65 71 75 65 6e 74  .# In subsequent
35a0: 20 74 65 73 74 20 63 61 73 65 73 2c 20 69 6e 76   test cases, inv
35b0: 6f 6b 69 6e 67 20 5b 66 61 75 6c 74 73 69 6d 5f  oking [faultsim_
35c0: 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70  restore_and_reop
35d0: 65 6e 5d 20 73 65 74 73 0a 23 20 75 70 20 74 68  en] sets.# up th
35e0: 65 20 66 69 6c 65 20 73 79 73 74 65 6d 20 74 6f  e file system to
35f0: 20 63 6f 6e 74 61 69 6e 20 74 77 6f 20 64 61 74   contain two dat
3600: 61 62 61 73 65 73 2c 20 74 77 6f 20 68 6f 74 2d  abases, two hot-
3610: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 61 6e  journal files an
3620: 64 0a 23 20 61 20 6d 61 73 74 65 72 2d 6a 6f 75  d.# a master-jou
3630: 72 6e 61 6c 2e 0a 23 0a 64 6f 5f 74 65 73 74 20  rnal..#.do_test 
3640: 70 61 67 65 72 31 2e 34 2e 32 2e 31 20 7b 0a 20  pager1.4.2.1 {. 
3650: 20 74 65 73 74 76 66 73 20 74 73 74 76 66 73 20   testvfs tstvfs 
3660: 2d 64 65 66 61 75 6c 74 20 31 0a 20 20 74 73 74  -default 1.  tst
3670: 76 66 73 20 66 69 6c 74 65 72 20 78 44 65 6c 65  vfs filter xDele
3680: 74 65 0a 20 20 74 73 74 76 66 73 20 73 63 72 69  te.  tstvfs scri
3690: 70 74 20 78 44 65 6c 65 74 65 43 61 6c 6c 62 61  pt xDeleteCallba
36a0: 63 6b 0a 20 20 70 72 6f 63 20 78 44 65 6c 65 74  ck.  proc xDelet
36b0: 65 43 61 6c 6c 62 61 63 6b 20 7b 6d 65 74 68 6f  eCallback {metho
36c0: 64 20 66 69 6c 65 20 61 72 67 73 7d 20 7b 0a 20  d file args} {. 
36d0: 20 20 20 73 65 74 20 66 69 6c 65 20 5b 66 69 6c     set file [fil
36e0: 65 20 74 61 69 6c 20 24 66 69 6c 65 5d 0a 20 20  e tail $file].  
36f0: 20 20 69 66 20 7b 20 5b 73 74 72 69 6e 67 20 6d    if { [string m
3700: 61 74 63 68 20 2a 6d 6a 2a 20 24 66 69 6c 65 5d  atch *mj* $file]
3710: 20 7d 20 7b 20 66 61 75 6c 74 73 69 6d 5f 73 61   } { faultsim_sa
3720: 76 65 20 7d 0a 20 20 7d 0a 20 20 66 61 75 6c 74  ve }.  }.  fault
3730: 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72  sim_delete_and_r
3740: 65 6f 70 65 6e 0a 20 20 64 62 20 66 75 6e 63 20  eopen.  db func 
3750: 61 5f 73 74 72 69 6e 67 20 61 5f 73 74 72 69 6e  a_string a_strin
3760: 67 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  g.  execsql {.  
3770: 20 20 41 54 54 41 43 48 20 27 74 65 73 74 2e 64    ATTACH 'test.d
3780: 62 32 27 20 41 53 20 61 75 78 3b 0a 20 20 20 20  b2' AS aux;.    
3790: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
37a0: 6f 64 65 20 3d 20 44 45 4c 45 54 45 3b 0a 20 20  ode = DELETE;.  
37b0: 20 20 50 52 41 47 4d 41 20 6d 61 69 6e 2e 63 61    PRAGMA main.ca
37c0: 63 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b 0a 20  che_size = 10;. 
37d0: 20 20 20 50 52 41 47 4d 41 20 61 75 78 2e 63 61     PRAGMA aux.ca
37e0: 63 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b 0a 20  che_size = 10;. 
37f0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
3800: 74 31 28 61 20 55 4e 49 51 55 45 2c 20 62 20 55  t1(a UNIQUE, b U
3810: 4e 49 51 55 45 29 3b 0a 20 20 20 20 43 52 45 41  NIQUE);.    CREA
3820: 54 45 20 54 41 42 4c 45 20 61 75 78 2e 74 32 28  TE TABLE aux.t2(
3830: 61 20 55 4e 49 51 55 45 2c 20 62 20 55 4e 49 51  a UNIQUE, b UNIQ
3840: 55 45 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  UE);.    INSERT 
3850: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 61  INTO t1 VALUES(a
3860: 5f 73 74 72 69 6e 67 28 32 30 30 29 2c 20 61 5f  _string(200), a_
3870: 73 74 72 69 6e 67 28 33 30 30 29 29 3b 0a 20 20  string(300));.  
3880: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
3890: 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67   SELECT a_string
38a0: 28 32 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28  (200), a_string(
38b0: 33 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20  300) FROM t1;.  
38c0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
38d0: 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67   SELECT a_string
38e0: 28 32 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28  (200), a_string(
38f0: 33 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20  300) FROM t1;.  
3900: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32    INSERT INTO t2
3910: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
3920: 31 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20  1;.    BEGIN;.  
3930: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
3940: 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69  t1 SELECT a_stri
3950: 6e 67 28 32 30 31 29 2c 20 61 5f 73 74 72 69 6e  ng(201), a_strin
3960: 67 28 33 30 31 29 20 46 52 4f 4d 20 74 31 3b 0a  g(301) FROM t1;.
3970: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
3980: 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74  O t1 SELECT a_st
3990: 72 69 6e 67 28 32 30 32 29 2c 20 61 5f 73 74 72  ring(202), a_str
39a0: 69 6e 67 28 33 30 32 29 20 46 52 4f 4d 20 74 31  ing(302) FROM t1
39b0: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
39c0: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f  NTO t1 SELECT a_
39d0: 73 74 72 69 6e 67 28 32 30 33 29 2c 20 61 5f 73  string(203), a_s
39e0: 74 72 69 6e 67 28 33 30 33 29 20 46 52 4f 4d 20  tring(303) FROM 
39f0: 74 31 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  t1;.      INSERT
3a00: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
3a10: 61 5f 73 74 72 69 6e 67 28 32 30 34 29 2c 20 61  a_string(204), a
3a20: 5f 73 74 72 69 6e 67 28 33 30 34 29 20 46 52 4f  _string(304) FRO
3a30: 4d 20 74 31 3b 0a 20 20 20 20 20 20 52 45 50 4c  M t1;.      REPL
3a40: 41 43 45 20 49 4e 54 4f 20 74 32 20 53 45 4c 45  ACE INTO t2 SELE
3a50: 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20  CT * FROM t1;.  
3a60: 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 20 20    COMMIT;.  }.  
3a70: 64 62 20 63 6c 6f 73 65 0a 20 20 74 73 74 76 66  db close.  tstvf
3a80: 73 20 64 65 6c 65 74 65 0a 7d 20 7b 7d 0a 64 6f  s delete.} {}.do
3a90: 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e 32  _test pager1.4.2
3aa0: 2e 32 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f  .2 {.  faultsim_
3ab0: 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70  restore_and_reop
3ac0: 65 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  en.  execsql {. 
3ad0: 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28     SELECT count(
3ae0: 2a 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20  *) FROM t1;.    
3af0: 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79  PRAGMA integrity
3b00: 5f 63 68 65 63 6b 3b 0a 20 20 7d 0a 7d 20 7b 34  _check;.  }.} {4
3b10: 20 6f 6b 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67   ok}.do_test pag
3b20: 65 72 31 2e 34 2e 32 2e 33 20 7b 0a 20 20 66 61  er1.4.2.3 {.  fa
3b30: 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61  ultsim_restore_a
3b40: 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 66 6f 72 65  nd_reopen.  fore
3b50: 61 63 68 20 66 20 5b 67 6c 6f 62 20 74 65 73 74  ach f [glob test
3b60: 2e 64 62 2d 6d 6a 2a 5d 20 7b 20 66 69 6c 65 20  .db-mj*] { file 
3b70: 64 65 6c 65 74 65 20 2d 66 6f 72 63 65 20 24 66  delete -force $f
3b80: 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   }.  execsql {. 
3b90: 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28     SELECT count(
3ba0: 2a 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20  *) FROM t1;.    
3bb0: 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79  PRAGMA integrity
3bc0: 5f 63 68 65 63 6b 3b 0a 20 20 7d 0a 7d 20 7b 36  _check;.  }.} {6
3bd0: 34 20 6f 6b 7d 0a 64 6f 5f 74 65 73 74 20 70 61  4 ok}.do_test pa
3be0: 67 65 72 31 2e 34 2e 32 2e 34 20 7b 0a 20 20 66  ger1.4.2.4 {.  f
3bf0: 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f  aultsim_restore_
3c00: 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 68 65 78  and_reopen.  hex
3c10: 69 6f 5f 77 72 69 74 65 20 74 65 73 74 2e 64 62  io_write test.db
3c20: 2d 6a 6f 75 72 6e 61 6c 20 5b 65 78 70 72 20 5b  -journal [expr [
3c30: 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64  file size test.d
3c40: 62 2d 6a 6f 75 72 6e 61 6c 5d 2d 32 30 5d 20 31  b-journal]-20] 1
3c50: 32 33 34 35 36 0a 20 20 65 78 65 63 73 71 6c 20  23456.  execsql 
3c60: 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75  {.    SELECT cou
3c70: 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31 3b 0a 20  nt(*) FROM t1;. 
3c80: 20 20 20 50 52 41 47 4d 41 20 69 6e 74 65 67 72     PRAGMA integr
3c90: 69 74 79 5f 63 68 65 63 6b 3b 0a 20 20 7d 0a 7d  ity_check;.  }.}
3ca0: 20 7b 34 20 6f 6b 7d 0a 64 6f 5f 74 65 73 74 20   {4 ok}.do_test 
3cb0: 70 61 67 65 72 31 2e 34 2e 32 2e 35 20 7b 0a 20  pager1.4.2.5 {. 
3cc0: 20 66 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72   faultsim_restor
3cd0: 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 68  e_and_reopen.  h
3ce0: 65 78 69 6f 5f 77 72 69 74 65 20 74 65 73 74 2e  exio_write test.
3cf0: 64 62 2d 6a 6f 75 72 6e 61 6c 20 5b 65 78 70 72  db-journal [expr
3d00: 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74   [file size test
3d10: 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5d 2d 32 30 5d  .db-journal]-20]
3d20: 20 31 32 33 34 35 36 0a 20 20 66 6f 72 65 61 63   123456.  foreac
3d30: 68 20 66 20 5b 67 6c 6f 62 20 74 65 73 74 2e 64  h f [glob test.d
3d40: 62 2d 6d 6a 2a 5d 20 7b 20 66 69 6c 65 20 64 65  b-mj*] { file de
3d50: 6c 65 74 65 20 2d 66 6f 72 63 65 20 24 66 20 7d  lete -force $f }
3d60: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
3d70: 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29   SELECT count(*)
3d80: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 50 52   FROM t1;.    PR
3d90: 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63  AGMA integrity_c
3da0: 68 65 63 6b 3b 0a 20 20 7d 0a 7d 20 7b 34 20 6f  heck;.  }.} {4 o
3db0: 6b 7d 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  k}..do_test page
3dc0: 72 31 2e 34 2e 33 2e 31 20 7b 0a 20 20 74 65 73  r1.4.3.1 {.  tes
3dd0: 74 76 66 73 20 74 73 74 76 66 73 20 2d 64 65 66  tvfs tstvfs -def
3de0: 61 75 6c 74 20 31 0a 20 20 74 73 74 76 66 73 20  ault 1.  tstvfs 
3df0: 66 69 6c 74 65 72 20 78 53 79 6e 63 0a 20 20 74  filter xSync.  t
3e00: 73 74 76 66 73 20 73 63 72 69 70 74 20 78 53 79  stvfs script xSy
3e10: 6e 63 43 61 6c 6c 62 61 63 6b 0a 20 20 70 72 6f  ncCallback.  pro
3e20: 63 20 78 53 79 6e 63 43 61 6c 6c 62 61 63 6b 20  c xSyncCallback 
3e30: 7b 6d 65 74 68 6f 64 20 66 69 6c 65 20 61 72 67  {method file arg
3e40: 73 7d 20 7b 0a 20 20 20 20 73 65 74 20 66 69 6c  s} {.    set fil
3e50: 65 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 66 69  e [file tail $fi
3e60: 6c 65 5d 0a 20 20 20 20 69 66 20 7b 20 30 3d 3d  le].    if { 0==
3e70: 5b 73 74 72 69 6e 67 20 6d 61 74 63 68 20 2a 6a  [string match *j
3e80: 6f 75 72 6e 61 6c 20 24 66 69 6c 65 5d 20 7d 20  ournal $file] } 
3e90: 7b 20 66 61 75 6c 74 73 69 6d 5f 73 61 76 65 20  { faultsim_save 
3ea0: 7d 0a 20 20 7d 0a 20 20 66 61 75 6c 74 73 69 6d  }.  }.  faultsim
3eb0: 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70  _delete_and_reop
3ec0: 65 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  en.  execsql {. 
3ed0: 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61     PRAGMA journa
3ee0: 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c 45 54 45 3b  l_mode = DELETE;
3ef0: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
3f00: 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20  E t1(a, b);.    
3f10: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
3f20: 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20 20 20  ALUES(1, 2);.   
3f30: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
3f40: 56 41 4c 55 45 53 28 33 2c 20 34 29 3b 0a 20 20  VALUES(3, 4);.  
3f50: 7d 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 74  }.  db close.  t
3f60: 73 74 76 66 73 20 64 65 6c 65 74 65 0a 7d 20 7b  stvfs delete.} {
3f70: 7d 0a 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20 6f  }..foreach {tn o
3f80: 66 73 74 20 76 61 6c 75 65 20 72 65 73 75 6c 74  fst value result
3f90: 7d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 32 20  } {.          2 
3fa0: 20 20 32 30 20 20 20 20 33 31 20 20 20 20 20 20    20    31      
3fb0: 20 7b 31 20 32 20 33 20 34 7d 0a 20 20 20 20 20   {1 2 3 4}.     
3fc0: 20 20 20 20 20 33 20 20 20 32 30 20 20 20 20 33       3   20    3
3fd0: 32 20 20 20 20 20 20 20 7b 31 20 32 20 33 20 34  2       {1 2 3 4
3fe0: 7d 0a 20 20 20 20 20 20 20 20 20 20 34 20 20 20  }.          4   
3ff0: 32 30 20 20 20 20 33 33 20 20 20 20 20 20 20 7b  20    33       {
4000: 31 20 32 20 33 20 34 7d 0a 20 20 20 20 20 20 20  1 2 3 4}.       
4010: 20 20 20 35 20 20 20 32 30 20 20 20 20 36 35 35     5   20    655
4020: 33 36 20 20 20 20 7b 31 20 32 20 33 20 34 7d 0a  36    {1 2 3 4}.
4030: 20 20 20 20 20 20 20 20 20 20 36 20 20 20 32 30            6   20
4040: 20 20 20 20 31 33 31 30 37 32 20 20 20 7b 31 20      131072   {1 
4050: 32 20 33 20 34 7d 0a 0a 20 20 20 20 20 20 20 20  2 3 4}..        
4060: 20 20 37 20 20 20 32 34 20 20 20 20 35 31 31 20    7   24    511 
4070: 20 20 20 20 20 7b 31 20 32 20 33 20 34 7d 0a 20       {1 2 3 4}. 
4080: 20 20 20 20 20 20 20 20 20 38 20 20 20 32 34 20           8   24 
4090: 20 20 20 35 31 33 20 20 20 20 20 20 7b 31 20 32     513      {1 2
40a0: 20 33 20 34 7d 0a 20 20 20 20 20 20 20 20 20 20   3 4}.          
40b0: 39 20 20 20 32 34 20 20 20 20 36 35 35 33 36 20  9   24    65536 
40c0: 20 20 20 7b 31 20 32 20 33 20 34 7d 0a 0a 20 20     {1 2 3 4}..  
40d0: 20 20 20 20 20 20 20 31 30 20 20 20 33 32 20 20         10   32  
40e0: 20 20 36 35 35 33 36 20 20 20 20 7b 31 20 32 7d    65536    {1 2}
40f0: 0a 7d 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 70  .} {.  do_test p
4100: 61 67 65 72 31 2e 34 2e 33 2e 24 74 6e 20 7b 0a  ager1.4.3.$tn {.
4110: 20 20 20 20 66 61 75 6c 74 73 69 6d 5f 72 65 73      faultsim_res
4120: 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a  tore_and_reopen.
4130: 20 20 20 20 68 65 78 69 6f 5f 77 72 69 74 65 20      hexio_write 
4140: 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20  test.db-journal 
4150: 24 6f 66 73 74 20 5b 66 6f 72 6d 61 74 20 25 2e  $ofst [format %.
4160: 38 78 20 24 76 61 6c 75 65 5d 0a 20 20 20 20 65  8x $value].    e
4170: 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20  xecsql { SELECT 
4180: 2a 20 46 52 4f 4d 20 74 31 20 7d 0a 20 20 7d 20  * FROM t1 }.  } 
4190: 24 72 65 73 75 6c 74 0a 7d 0a 64 62 20 63 6c 6f  $result.}.db clo
41a0: 73 65 0a 0a 23 20 53 65 74 20 75 70 20 61 20 56  se..# Set up a V
41b0: 46 53 20 74 68 61 74 20 73 6e 61 70 73 68 6f 74  FS that snapshot
41c0: 73 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  s the file-syste
41d0: 6d 20 6a 75 73 74 20 62 65 66 6f 72 65 20 61 20  m just before a 
41e0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 23  master journal.#
41f0: 20 66 69 6c 65 20 69 73 20 64 65 6c 65 74 65 64   file is deleted
4200: 20 74 6f 20 63 6f 6d 6d 69 74 20 61 20 6d 75 6c   to commit a mul
4210: 74 69 2d 66 69 6c 65 20 74 72 61 6e 73 61 63 74  ti-file transact
4220: 69 6f 6e 2e 20 53 70 65 63 69 66 69 63 61 6c 6c  ion. Specificall
4230: 79 2c 20 74 68 65 0a 23 20 66 69 6c 65 2d 73 79  y, the.# file-sy
4240: 73 74 65 6d 20 69 73 20 73 61 76 65 64 20 6a 75  stem is saved ju
4250: 73 74 20 62 65 66 6f 72 65 20 74 68 65 20 78 44  st before the xD
4260: 65 6c 65 74 65 28 29 20 63 61 6c 6c 20 74 6f 20  elete() call to 
4270: 72 65 6d 6f 76 65 20 74 68 65 20 0a 23 20 6d 61  remove the .# ma
4280: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
4290: 65 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 2d  e from the file-
42a0: 73 79 73 74 65 6d 2e 0a 23 0a 74 65 73 74 76 66  system..#.testvf
42b0: 73 20 74 76 20 2d 64 65 66 61 75 6c 74 20 31 0a  s tv -default 1.
42c0: 74 76 20 73 63 72 69 70 74 20 63 6f 70 79 5f 6f  tv script copy_o
42d0: 6e 5f 6d 6a 5f 64 65 6c 65 74 65 0a 73 65 74 20  n_mj_delete.set 
42e0: 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 5f 6c 65  ::mj_filename_le
42f0: 6e 67 74 68 20 30 0a 70 72 6f 63 20 63 6f 70 79  ngth 0.proc copy
4300: 5f 6f 6e 5f 6d 6a 5f 64 65 6c 65 74 65 20 7b 6d  _on_mj_delete {m
4310: 65 74 68 6f 64 20 66 69 6c 65 6e 61 6d 65 20 61  ethod filename a
4320: 72 67 73 7d 20 7b 0a 20 20 69 66 20 7b 5b 73 74  rgs} {.  if {[st
4330: 72 69 6e 67 20 6d 61 74 63 68 20 2a 6d 6a 2a 20  ring match *mj* 
4340: 5b 66 69 6c 65 20 74 61 69 6c 20 24 66 69 6c 65  [file tail $file
4350: 6e 61 6d 65 5d 5d 7d 20 7b 20 0a 20 20 20 20 73  name]]} { .    s
4360: 65 74 20 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65  et ::mj_filename
4370: 5f 6c 65 6e 67 74 68 20 5b 73 74 72 69 6e 67 20  _length [string 
4380: 6c 65 6e 67 74 68 20 24 66 69 6c 65 6e 61 6d 65  length $filename
4390: 5d 0a 20 20 20 20 66 61 75 6c 74 73 69 6d 5f 73  ].    faultsim_s
43a0: 61 76 65 20 0a 20 20 7d 0a 20 20 72 65 74 75 72  ave .  }.  retur
43b0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 7d 0a 0a 73  n SQLITE_OK.}..s
43c0: 65 74 20 70 77 64 20 5b 70 77 64 5d 0a 66 6f 72  et pwd [pwd].for
43d0: 65 61 63 68 20 7b 74 6e 31 20 74 63 6c 7d 20 7b  each {tn1 tcl} {
43e0: 0a 20 20 31 20 7b 20 73 65 74 20 70 72 65 66 69  .  1 { set prefi
43f0: 78 20 22 74 65 73 74 2e 64 62 22 20 7d 0a 20 20  x "test.db" }.  
4400: 32 20 7b 20 0a 20 20 20 20 23 20 54 68 69 73 20  2 { .    # This 
4410: 74 65 73 74 20 64 65 70 65 6e 64 73 20 6f 6e 20  test depends on 
4420: 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 56  the underlying V
4430: 46 53 20 62 65 69 6e 67 20 61 62 6c 65 20 74 6f  FS being able to
4440: 20 6f 70 65 6e 20 70 61 74 68 73 0a 20 20 20 20   open paths.    
4450: 23 20 35 31 32 20 62 79 74 65 73 20 69 6e 20 6c  # 512 bytes in l
4460: 65 6e 67 74 68 2e 20 54 68 65 20 69 64 65 61 20  ength. The idea 
4470: 69 73 20 74 6f 20 63 72 65 61 74 65 20 61 20 68  is to create a h
4480: 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ot-journal file 
4490: 74 68 61 74 0a 20 20 20 20 23 20 63 6f 6e 74 61  that.    # conta
44a0: 69 6e 73 20 61 20 6d 61 73 74 65 72 2d 6a 6f 75  ins a master-jou
44b0: 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 73 6f 20  rnal pointer so 
44c0: 6c 61 72 67 65 20 74 68 61 74 20 69 74 20 63 6f  large that it co
44d0: 75 6c 64 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20  uld contain.    
44e0: 23 20 61 20 76 61 6c 69 64 20 70 61 67 65 20 72  # a valid page r
44f0: 65 63 6f 72 64 20 28 69 66 20 74 68 65 20 66 69  ecord (if the fi
4500: 6c 65 20 70 61 67 65 2d 73 69 7a 65 20 69 73 20  le page-size is 
4510: 35 31 32 20 62 79 74 65 73 29 2e 20 53 6f 20 61  512 bytes). So a
4520: 73 20 74 6f 0a 20 20 20 20 23 20 6d 61 6b 65 20  s to.    # make 
4530: 73 75 72 65 20 53 51 4c 69 74 65 20 64 6f 65 73  sure SQLite does
4540: 6e 27 74 20 67 65 74 20 63 6f 6e 66 75 73 65 64  n't get confused
4550: 20 62 79 20 74 68 69 73 2e 0a 20 20 20 20 23 0a   by this..    #.
4560: 20 20 20 20 73 65 74 20 6e 50 61 64 64 69 6e 67      set nPadding
4570: 20 5b 65 78 70 72 20 35 31 31 20 2d 20 24 3a 3a   [expr 511 - $::
4580: 6d 6a 5f 66 69 6c 65 6e 61 6d 65 5f 6c 65 6e 67  mj_filename_leng
4590: 74 68 5d 0a 20 20 20 20 69 66 20 7b 24 74 63 6c  th].    if {$tcl
45a0: 5f 70 6c 61 74 66 6f 72 6d 28 70 6c 61 74 66 6f  _platform(platfo
45b0: 72 6d 29 3d 3d 22 77 69 6e 64 6f 77 73 22 7d 20  rm)=="windows"} 
45c0: 7b 0a 20 20 20 20 20 20 23 20 54 42 44 20 6e 65  {.      # TBD ne
45d0: 65 64 20 74 6f 20 66 69 67 75 72 65 20 6f 75 74  ed to figure out
45e0: 20 68 6f 77 20 74 6f 20 64 6f 20 74 68 69 73 20   how to do this 
45f0: 63 6f 72 72 65 63 74 6c 79 20 66 6f 72 20 57 69  correctly for Wi
4600: 6e 64 6f 77 73 21 21 21 0a 20 20 20 20 20 20 73  ndows!!!.      s
4610: 65 74 20 6e 50 61 64 64 69 6e 67 20 5b 65 78 70  et nPadding [exp
4620: 72 20 32 35 35 20 2d 20 24 3a 3a 6d 6a 5f 66 69  r 255 - $::mj_fi
4630: 6c 65 6e 61 6d 65 5f 6c 65 6e 67 74 68 5d 0a 20  lename_length]. 
4640: 20 20 20 7d 0a 0a 20 20 20 20 23 20 57 65 20 63     }..    # We c
4650: 61 6e 6e 6f 74 20 6a 75 73 74 20 63 72 65 61 74  annot just creat
4660: 65 20 61 20 72 65 61 6c 6c 79 20 6c 6f 6e 67 20  e a really long 
4670: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61  database file na
4680: 6d 65 20 74 6f 20 6f 70 65 6e 2c 20 61 73 0a 20  me to open, as. 
4690: 20 20 20 23 20 4c 69 6e 75 78 20 6c 69 6d 69 74     # Linux limit
46a0: 73 20 61 20 73 69 6e 67 6c 65 20 63 6f 6d 70 6f  s a single compo
46b0: 6e 65 6e 74 20 6f 66 20 61 20 70 61 74 68 20 74  nent of a path t
46c0: 6f 20 32 35 35 20 62 79 74 65 73 20 62 79 20 64  o 255 bytes by d
46d0: 65 66 61 75 6c 74 0a 20 20 20 20 23 20 28 61 6e  efault.    # (an
46e0: 64 20 70 72 65 73 75 6d 61 62 6c 79 20 6f 74 68  d presumably oth
46f0: 65 72 20 73 79 73 74 65 6d 73 20 68 61 76 65 20  er systems have 
4700: 6c 69 6d 69 74 73 20 74 6f 6f 29 2e 20 53 6f 20  limits too). So 
4710: 63 72 65 61 74 65 20 61 20 64 69 72 65 63 74 6f  create a directo
4720: 72 79 0a 20 20 20 20 23 20 68 69 65 72 61 72 63  ry.    # hierarc
4730: 68 79 20 74 6f 20 77 6f 72 6b 20 69 6e 2e 0a 20  hy to work in.. 
4740: 20 20 20 23 0a 20 20 20 20 73 65 74 20 64 69 72     #.    set dir
4750: 6e 61 6d 65 20 22 64 31 32 33 34 35 36 37 38 39  name "d123456789
4760: 30 31 32 33 34 35 36 37 38 39 30 31 32 33 34 35  0123456789012345
4770: 36 37 38 39 30 2f 22 0a 20 20 20 20 73 65 74 20  67890/".    set 
4780: 6e 44 69 72 20 5b 65 78 70 72 20 24 6e 50 61 64  nDir [expr $nPad
4790: 64 69 6e 67 20 2f 20 33 32 5d 0a 20 20 20 20 69  ding / 32].    i
47a0: 66 20 7b 20 24 6e 44 69 72 20 7d 20 7b 0a 20 20  f { $nDir } {.  
47b0: 20 20 20 20 73 65 74 20 70 20 5b 73 74 72 69 6e      set p [strin
47c0: 67 20 72 65 70 65 61 74 20 24 64 69 72 6e 61 6d  g repeat $dirnam
47d0: 65 20 24 6e 44 69 72 5d 0a 20 20 20 20 20 20 66  e $nDir].      f
47e0: 69 6c 65 20 6d 6b 64 69 72 20 24 70 0a 20 20 20  ile mkdir $p.   
47f0: 20 20 20 63 64 20 24 70 0a 20 20 20 20 7d 0a 0a     cd $p.    }..
4800: 20 20 20 20 73 65 74 20 70 61 64 64 69 6e 67 20      set padding 
4810: 5b 73 74 72 69 6e 67 20 72 65 70 65 61 74 20 78  [string repeat x
4820: 20 5b 65 78 70 72 20 24 6e 50 61 64 64 69 6e 67   [expr $nPadding
4830: 20 25 33 32 5d 5d 0a 20 20 20 20 73 65 74 20 70   %32]].    set p
4840: 72 65 66 69 78 20 22 74 65 73 74 2e 64 62 24 7b  refix "test.db${
4850: 70 61 64 64 69 6e 67 7d 22 0a 20 20 7d 0a 7d 20  padding}".  }.} 
4860: 7b 0a 20 20 65 76 61 6c 20 24 74 63 6c 0a 20 20  {.  eval $tcl.  
4870: 66 6f 72 65 61 63 68 20 7b 74 6e 32 20 73 71 6c  foreach {tn2 sql
4880: 7d 20 7b 0a 20 20 20 20 6f 20 7b 20 0a 20 20 20  } {.    o { .   
4890: 20 20 20 50 52 41 47 4d 41 20 6d 61 69 6e 2e 73     PRAGMA main.s
48a0: 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46 46 3b 0a  ynchronous=OFF;.
48b0: 20 20 20 20 20 20 50 52 41 47 4d 41 20 61 75 78        PRAGMA aux
48c0: 2e 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46 46  .synchronous=OFF
48d0: 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 6a  ;.      PRAGMA j
48e0: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45  ournal_mode = DE
48f0: 4c 45 54 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20  LETE;.    }.    
4900: 6f 35 31 32 20 7b 20 0a 20 20 20 20 20 20 50 52  o512 { .      PR
4910: 41 47 4d 41 20 6d 61 69 6e 2e 73 79 6e 63 68 72  AGMA main.synchr
4920: 6f 6e 6f 75 73 3d 4f 46 46 3b 0a 20 20 20 20 20  onous=OFF;.     
4930: 20 50 52 41 47 4d 41 20 61 75 78 2e 73 79 6e 63   PRAGMA aux.sync
4940: 68 72 6f 6e 6f 75 73 3d 4f 46 46 3b 0a 20 20 20  hronous=OFF;.   
4950: 20 20 20 50 52 41 47 4d 41 20 6d 61 69 6e 2e 70     PRAGMA main.p
4960: 61 67 65 5f 73 69 7a 65 20 3d 20 35 31 32 3b 0a  age_size = 512;.
4970: 20 20 20 20 20 20 50 52 41 47 4d 41 20 61 75 78        PRAGMA aux
4980: 2e 70 61 67 65 5f 73 69 7a 65 20 3d 20 35 31 32  .page_size = 512
4990: 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 6a  ;.      PRAGMA j
49a0: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45  ournal_mode = DE
49b0: 4c 45 54 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20  LETE;.    }.    
49c0: 6e 20 7b 20 0a 20 20 20 20 20 20 50 52 41 47 4d  n { .      PRAGM
49d0: 41 20 6d 61 69 6e 2e 73 79 6e 63 68 72 6f 6e 6f  A main.synchrono
49e0: 75 73 3d 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 20  us=NORMAL;.     
49f0: 20 50 52 41 47 4d 41 20 61 75 78 2e 73 79 6e 63   PRAGMA aux.sync
4a00: 68 72 6f 6e 6f 75 73 3d 4e 4f 52 4d 41 4c 3b 0a  hronous=NORMAL;.
4a10: 20 20 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75        PRAGMA jou
4a20: 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c 45  rnal_mode = DELE
4a30: 54 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 20  TE;.    }.    f 
4a40: 7b 20 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20  { .      PRAGMA 
4a50: 6d 61 69 6e 2e 73 79 6e 63 68 72 6f 6e 6f 75 73  main.synchronous
4a60: 3d 46 55 4c 4c 3b 0a 20 20 20 20 20 20 50 52 41  =FULL;.      PRA
4a70: 47 4d 41 20 61 75 78 2e 73 79 6e 63 68 72 6f 6e  GMA aux.synchron
4a80: 6f 75 73 3d 46 55 4c 4c 3b 0a 20 20 20 20 20 20  ous=FULL;.      
4a90: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
4aa0: 6f 64 65 20 3d 20 44 45 4c 45 54 45 3b 0a 20 20  ode = DELETE;.  
4ab0: 20 20 7d 0a 20 20 7d 20 7b 0a 0a 20 20 20 20 73    }.  } {..    s
4ac0: 65 74 20 74 6e 20 22 24 7b 74 6e 31 7d 2e 24 7b  et tn "${tn1}.${
4ad0: 74 6e 32 7d 22 0a 20 20 0a 20 20 20 20 23 20 53  tn2}".  .    # S
4ae0: 65 74 20 75 70 20 61 20 63 6f 6e 6e 65 63 74 69  et up a connecti
4af0: 6f 6e 20 74 6f 20 68 61 76 65 20 74 77 6f 20 64  on to have two d
4b00: 61 74 61 62 61 73 65 73 2c 20 74 65 73 74 2e 64  atabases, test.d
4b10: 62 20 28 6d 61 69 6e 29 20 61 6e 64 20 0a 20 20  b (main) and .  
4b20: 20 20 23 20 74 65 73 74 2e 64 62 32 20 28 61 75    # test.db2 (au
4b30: 78 29 2e 20 54 68 65 6e 20 72 75 6e 20 61 20 6d  x). Then run a m
4b40: 75 6c 74 69 2d 66 69 6c 65 20 74 72 61 6e 73 61  ulti-file transa
4b50: 63 74 69 6f 6e 20 6f 6e 20 74 68 65 6d 2e 20 54  ction on them. T
4b60: 68 65 0a 20 20 20 20 23 20 56 46 53 20 77 69 6c  he.    # VFS wil
4b70: 6c 20 73 6e 61 70 73 68 6f 74 20 74 68 65 20 66  l snapshot the f
4b80: 69 6c 65 2d 73 79 73 74 65 6d 20 6a 75 73 74 20  ile-system just 
4b90: 62 65 66 6f 72 65 20 74 68 65 20 6d 61 73 74 65  before the maste
4ba0: 72 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 23 20  r-journal.    # 
4bb0: 66 69 6c 65 20 69 73 20 64 65 6c 65 74 65 64 20  file is deleted 
4bc0: 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65 20 74 72  to commit the tr
4bd0: 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 23  ansaction..    #
4be0: 0a 20 20 20 20 74 76 20 66 69 6c 74 65 72 20 78  .    tv filter x
4bf0: 44 65 6c 65 74 65 0a 20 20 20 20 64 6f 5f 74 65  Delete.    do_te
4c00: 73 74 20 70 61 67 65 72 31 2d 34 2e 34 2e 24 74  st pager1-4.4.$t
4c10: 6e 2e 31 20 7b 0a 20 20 20 20 20 20 66 61 75 6c  n.1 {.      faul
4c20: 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f  tsim_delete_and_
4c30: 72 65 6f 70 65 6e 20 24 70 72 65 66 69 78 0a 20  reopen $prefix. 
4c40: 20 20 20 20 20 65 78 65 63 73 71 6c 20 22 0a 20       execsql ". 
4c50: 20 20 20 20 20 20 20 41 54 54 41 43 48 20 27 24         ATTACH '$
4c60: 7b 70 72 65 66 69 78 7d 32 27 20 41 53 20 61 75  {prefix}2' AS au
4c70: 78 3b 0a 20 20 20 20 20 20 20 20 24 73 71 6c 0a  x;.        $sql.
4c80: 20 20 20 20 20 20 20 20 43 52 45 41 54 45 20 54          CREATE T
4c90: 41 42 4c 45 20 61 28 78 29 3b 0a 20 20 20 20 20  ABLE a(x);.     
4ca0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
4cb0: 61 75 78 2e 62 28 78 29 3b 0a 20 20 20 20 20 20  aux.b(x);.      
4cc0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 20    INSERT INTO a 
4cd0: 56 41 4c 55 45 53 28 27 64 6f 75 62 6c 65 2d 79  VALUES('double-y
4ce0: 6f 75 27 29 3b 0a 20 20 20 20 20 20 20 20 49 4e  ou');.        IN
4cf0: 53 45 52 54 20 49 4e 54 4f 20 61 20 56 41 4c 55  SERT INTO a VALU
4d00: 45 53 28 27 77 68 79 27 29 3b 0a 20 20 20 20 20  ES('why');.     
4d10: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61     INSERT INTO a
4d20: 20 56 41 4c 55 45 53 28 27 7a 65 64 27 29 3b 0a   VALUES('zed');.
4d30: 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49          INSERT I
4d40: 4e 54 4f 20 62 20 56 41 4c 55 45 53 28 27 77 6f  NTO b VALUES('wo
4d50: 6e 27 29 3b 0a 20 20 20 20 20 20 20 20 49 4e 53  n');.        INS
4d60: 45 52 54 20 49 4e 54 4f 20 62 20 56 41 4c 55 45  ERT INTO b VALUE
4d70: 53 28 27 74 6f 6f 27 29 3b 0a 20 20 20 20 20 20  S('too');.      
4d80: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 62 20    INSERT INTO b 
4d90: 56 41 4c 55 45 53 28 27 66 72 65 65 27 29 3b 0a  VALUES('free');.
4da0: 20 20 20 20 20 20 22 0a 20 20 20 20 20 20 65 78        ".      ex
4db0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 20 20  ecsql {.        
4dc0: 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 20 20 20  BEGIN;.         
4dd0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 20 53   INSERT INTO a S
4de0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 62 20 57  ELECT * FROM b W
4df0: 48 45 52 45 20 72 6f 77 69 64 3c 3d 33 3b 0a 20  HERE rowid<=3;. 
4e00: 20 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20           INSERT 
4e10: 49 4e 54 4f 20 62 20 53 45 4c 45 43 54 20 2a 20  INTO b SELECT * 
4e20: 46 52 4f 4d 20 61 20 57 48 45 52 45 20 72 6f 77  FROM a WHERE row
4e30: 69 64 3c 3d 33 3b 0a 20 20 20 20 20 20 20 20 43  id<=3;.        C
4e40: 4f 4d 4d 49 54 3b 0a 20 20 20 20 20 20 7d 0a 20  OMMIT;.      }. 
4e50: 20 20 20 7d 20 7b 7d 0a 20 20 20 20 74 76 20 66     } {}.    tv f
4e60: 69 6c 74 65 72 20 7b 7d 0a 20 20 20 20 0a 20 20  ilter {}.    .  
4e70: 20 20 23 20 43 68 65 63 6b 20 74 68 61 74 20 74    # Check that t
4e80: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  he transaction w
4e90: 61 73 20 63 6f 6d 6d 69 74 74 65 64 20 73 75 63  as committed suc
4ea0: 63 65 73 73 66 75 6c 6c 79 2e 0a 20 20 20 20 23  cessfully..    #
4eb0: 0a 20 20 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f  .    do_execsql_
4ec0: 74 65 73 74 20 70 61 67 65 72 31 2d 34 2e 34 2e  test pager1-4.4.
4ed0: 24 74 6e 2e 32 20 7b 0a 20 20 20 20 20 20 53 45  $tn.2 {.      SE
4ee0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 61 0a 20 20  LECT * FROM a.  
4ef0: 20 20 7d 20 7b 64 6f 75 62 6c 65 2d 79 6f 75 20    } {double-you 
4f00: 77 68 79 20 7a 65 64 20 77 6f 6e 20 74 6f 6f 20  why zed won too 
4f10: 66 72 65 65 7d 0a 20 20 20 20 64 6f 5f 65 78 65  free}.    do_exe
4f20: 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31  csql_test pager1
4f30: 2d 34 2e 34 2e 24 74 6e 2e 33 20 7b 0a 20 20 20  -4.4.$tn.3 {.   
4f40: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
4f50: 20 62 0a 20 20 20 20 7d 20 7b 77 6f 6e 20 74 6f   b.    } {won to
4f60: 6f 20 66 72 65 65 20 64 6f 75 62 6c 65 2d 79 6f  o free double-yo
4f70: 75 20 77 68 79 20 7a 65 64 7d 0a 20 20 20 20 0a  u why zed}.    .
4f80: 20 20 20 20 23 20 52 65 73 74 6f 72 65 20 74 68      # Restore th
4f90: 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 61 6e  e file-system an
4fa0: 64 20 72 65 6f 70 65 6e 20 74 68 65 20 64 61 74  d reopen the dat
4fb0: 61 62 61 73 65 73 2e 20 43 68 65 63 6b 20 74 68  abases. Check th
4fc0: 61 74 20 69 74 20 6e 6f 77 0a 20 20 20 20 23 20  at it now.    # 
4fd0: 61 70 70 65 61 72 73 20 74 68 61 74 20 74 68 65  appears that the
4fe0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73   transaction was
4ff0: 20 6e 6f 74 20 63 6f 6d 6d 69 74 74 65 64 20 28   not committed (
5000: 62 65 63 61 75 73 65 20 74 68 65 20 66 69 6c 65  because the file
5010: 2d 73 79 73 74 65 6d 0a 20 20 20 20 23 20 77 61  -system.    # wa
5020: 73 20 72 65 73 74 6f 72 65 64 20 74 6f 20 74 68  s restored to th
5030: 65 20 73 74 61 74 65 20 77 68 65 72 65 20 69 74  e state where it
5040: 20 68 61 64 20 6e 6f 74 20 62 65 65 6e 29 2e 0a   had not been)..
5050: 20 20 20 20 23 0a 20 20 20 20 64 6f 5f 74 65 73      #.    do_tes
5060: 74 20 70 61 67 65 72 31 2d 34 2e 34 2e 24 74 6e  t pager1-4.4.$tn
5070: 2e 34 20 7b 0a 20 20 20 20 20 20 66 61 75 6c 74  .4 {.      fault
5080: 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f  sim_restore_and_
5090: 72 65 6f 70 65 6e 20 24 70 72 65 66 69 78 0a 20  reopen $prefix. 
50a0: 20 20 20 20 20 65 78 65 63 73 71 6c 20 22 41 54       execsql "AT
50b0: 54 41 43 48 20 27 24 7b 70 72 65 66 69 78 7d 32  TACH '${prefix}2
50c0: 27 20 41 53 20 61 75 78 22 0a 20 20 20 20 7d 20  ' AS aux".    } 
50d0: 7b 7d 0a 20 20 20 20 64 6f 5f 65 78 65 63 73 71  {}.    do_execsq
50e0: 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 34 2e  l_test pager1-4.
50f0: 34 2e 24 74 6e 2e 35 20 7b 53 45 4c 45 43 54 20  4.$tn.5 {SELECT 
5100: 2a 20 46 52 4f 4d 20 61 7d 20 7b 64 6f 75 62 6c  * FROM a} {doubl
5110: 65 2d 79 6f 75 20 77 68 79 20 7a 65 64 7d 0a 20  e-you why zed}. 
5120: 20 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65     do_execsql_te
5130: 73 74 20 70 61 67 65 72 31 2d 34 2e 34 2e 24 74  st pager1-4.4.$t
5140: 6e 2e 36 20 7b 53 45 4c 45 43 54 20 2a 20 46 52  n.6 {SELECT * FR
5150: 4f 4d 20 62 7d 20 7b 77 6f 6e 20 74 6f 6f 20 66  OM b} {won too f
5160: 72 65 65 7d 0a 20 20 20 20 0a 20 20 20 20 23 20  ree}.    .    # 
5170: 52 65 73 74 6f 72 65 20 74 68 65 20 66 69 6c 65  Restore the file
5180: 2d 73 79 73 74 65 6d 20 61 67 61 69 6e 2e 20 54  -system again. T
5190: 68 69 73 20 74 69 6d 65 2c 20 62 65 66 6f 72 65  his time, before
51a0: 20 72 65 6f 70 65 6e 69 6e 67 20 74 68 65 20 64   reopening the d
51b0: 61 74 61 62 61 73 65 73 2c 0a 20 20 20 20 23 20  atabases,.    # 
51c0: 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65  delete the maste
51d0: 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  r-journal file f
51e0: 72 6f 6d 20 74 68 65 20 66 69 6c 65 2d 73 79 73  rom the file-sys
51f0: 74 65 6d 2e 20 49 74 20 6e 6f 77 20 61 70 70 65  tem. It now appe
5200: 61 72 73 20 74 68 61 74 0a 20 20 20 20 23 20 74  ars that.    # t
5210: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  he transaction w
5220: 61 73 20 63 6f 6d 6d 69 74 74 65 64 20 28 6e 6f  as committed (no
5230: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
5240: 66 69 6c 65 20 3d 3d 20 6e 6f 20 72 6f 6c 6c 62  file == no rollb
5250: 61 63 6b 29 2e 0a 20 20 20 20 23 0a 20 20 20 20  ack)..    #.    
5260: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 34  do_test pager1-4
5270: 2e 34 2e 24 74 6e 2e 37 20 7b 0a 20 20 20 20 20  .4.$tn.7 {.     
5280: 20 66 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72   faultsim_restor
5290: 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 20 24 70 72  e_and_reopen $pr
52a0: 65 66 69 78 0a 20 20 20 20 20 20 66 6f 72 65 61  efix.      forea
52b0: 63 68 20 66 20 5b 67 6c 6f 62 20 24 7b 70 72 65  ch f [glob ${pre
52c0: 66 69 78 7d 2d 6d 6a 2a 5d 20 7b 20 66 69 6c 65  fix}-mj*] { file
52d0: 20 64 65 6c 65 74 65 20 2d 66 6f 72 63 65 20 24   delete -force $
52e0: 66 20 7d 0a 20 20 20 20 20 20 65 78 65 63 73 71  f }.      execsq
52f0: 6c 20 22 41 54 54 41 43 48 20 27 24 7b 70 72 65  l "ATTACH '${pre
5300: 66 69 78 7d 32 27 20 41 53 20 61 75 78 22 0a 20  fix}2' AS aux". 
5310: 20 20 20 7d 20 7b 7d 0a 20 20 20 20 64 6f 5f 65     } {}.    do_e
5320: 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65  xecsql_test page
5330: 72 31 2d 34 2e 34 2e 24 74 6e 2e 38 20 7b 0a 20  r1-4.4.$tn.8 {. 
5340: 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52       SELECT * FR
5350: 4f 4d 20 61 0a 20 20 20 20 7d 20 7b 64 6f 75 62  OM a.    } {doub
5360: 6c 65 2d 79 6f 75 20 77 68 79 20 7a 65 64 20 77  le-you why zed w
5370: 6f 6e 20 74 6f 6f 20 66 72 65 65 7d 0a 20 20 20  on too free}.   
5380: 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74   do_execsql_test
5390: 20 70 61 67 65 72 31 2d 34 2e 34 2e 24 74 6e 2e   pager1-4.4.$tn.
53a0: 39 20 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54  9 {.      SELECT
53b0: 20 2a 20 46 52 4f 4d 20 62 0a 20 20 20 20 7d 20   * FROM b.    } 
53c0: 7b 77 6f 6e 20 74 6f 6f 20 66 72 65 65 20 64 6f  {won too free do
53d0: 75 62 6c 65 2d 79 6f 75 20 77 68 79 20 7a 65 64  uble-you why zed
53e0: 7d 0a 20 20 7d 0a 0a 20 20 63 64 20 24 70 77 64  }.  }..  cd $pwd
53f0: 0a 7d 0a 64 62 20 63 6c 6f 73 65 0a 74 76 20 64  .}.db close.tv d
5400: 65 6c 65 74 65 0a 66 69 6c 65 20 64 65 6c 65 74  elete.file delet
5410: 65 20 2d 66 6f 72 63 65 20 24 64 69 72 6e 61 6d  e -force $dirnam
5420: 65 0a 0a 0a 23 20 53 65 74 20 75 70 20 61 20 56  e...# Set up a V
5430: 46 53 20 74 6f 20 6d 61 6b 65 20 61 20 63 6f 70  FS to make a cop
5440: 79 20 6f 66 20 74 68 65 20 66 69 6c 65 2d 73 79  y of the file-sy
5450: 73 74 65 6d 20 6a 75 73 74 20 62 65 66 6f 72 65  stem just before
5460: 20 64 65 6c 65 74 69 6e 67 20 61 0a 23 20 6a 6f   deleting a.# jo
5470: 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 63 6f  urnal file to co
5480: 6d 6d 69 74 20 61 20 74 72 61 6e 73 61 63 74 69  mmit a transacti
5490: 6f 6e 2e 20 54 68 65 20 74 72 61 6e 73 61 63 74  on. The transact
54a0: 69 6f 6e 20 6d 6f 64 69 66 69 65 73 20 65 78 61  ion modifies exa
54b0: 63 74 6c 79 0a 23 20 74 77 6f 20 64 61 74 61 62  ctly.# two datab
54c0: 61 73 65 20 70 61 67 65 73 20 28 61 6e 64 20 70  ase pages (and p
54d0: 61 67 65 20 31 20 2d 20 74 68 65 20 63 68 61 6e  age 1 - the chan
54e0: 67 65 20 63 6f 75 6e 74 65 72 29 2e 0a 23 0a 74  ge counter)..#.t
54f0: 65 73 74 76 66 73 20 74 76 20 2d 64 65 66 61 75  estvfs tv -defau
5500: 6c 74 20 31 0a 74 76 20 73 65 63 74 6f 72 73 69  lt 1.tv sectorsi
5510: 7a 65 20 35 31 32 0a 74 76 20 73 63 72 69 70 74  ze 512.tv script
5520: 20 63 6f 70 79 5f 6f 6e 5f 6a 6f 75 72 6e 61 6c   copy_on_journal
5530: 5f 64 65 6c 65 74 65 0a 74 76 20 66 69 6c 74 65  _delete.tv filte
5540: 72 20 78 44 65 6c 65 74 65 0a 70 72 6f 63 20 63  r xDelete.proc c
5550: 6f 70 79 5f 6f 6e 5f 6a 6f 75 72 6e 61 6c 5f 64  opy_on_journal_d
5560: 65 6c 65 74 65 20 7b 6d 65 74 68 6f 64 20 66 69  elete {method fi
5570: 6c 65 6e 61 6d 65 20 61 72 67 73 7d 20 7b 0a 20  lename args} {. 
5580: 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6d 61 74   if {[string mat
5590: 63 68 20 2a 6a 6f 75 72 6e 61 6c 20 24 66 69 6c  ch *journal $fil
55a0: 65 6e 61 6d 65 5d 7d 20 66 61 75 6c 74 73 69 6d  ename]} faultsim
55b0: 5f 73 61 76 65 20 0a 20 20 72 65 74 75 72 6e 20  _save .  return 
55c0: 53 51 4c 49 54 45 5f 4f 4b 0a 7d 0a 66 61 75 6c  SQLITE_OK.}.faul
55d0: 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f  tsim_delete_and_
55e0: 72 65 6f 70 65 6e 0a 64 6f 5f 65 78 65 63 73 71  reopen.do_execsq
55f0: 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e  l_test pager1.4.
5600: 35 2e 31 20 7b 0a 20 20 50 52 41 47 4d 41 20 6a  5.1 {.  PRAGMA j
5610: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45  ournal_mode = DE
5620: 4c 45 54 45 3b 0a 20 20 50 52 41 47 4d 41 20 70  LETE;.  PRAGMA p
5630: 61 67 65 5f 73 69 7a 65 20 3d 20 31 30 32 34 3b  age_size = 1024;
5640: 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  .  CREATE TABLE 
5650: 74 31 28 61 2c 20 62 29 3b 0a 20 20 43 52 45 41  t1(a, b);.  CREA
5660: 54 45 20 54 41 42 4c 45 20 74 32 28 61 2c 20 62  TE TABLE t2(a, b
5670: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
5680: 20 74 31 20 56 41 4c 55 45 53 28 27 49 27 2c 20   t1 VALUES('I', 
5690: 27 49 49 27 29 3b 0a 20 20 49 4e 53 45 52 54 20  'II');.  INSERT 
56a0: 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 27  INTO t2 VALUES('
56b0: 49 49 49 27 2c 20 27 49 56 27 29 3b 0a 20 20 42  III', 'IV');.  B
56c0: 45 47 49 4e 3b 0a 20 20 20 20 49 4e 53 45 52 54  EGIN;.    INSERT
56d0: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
56e0: 31 2c 20 32 29 3b 0a 20 20 20 20 49 4e 53 45 52  1, 2);.    INSER
56f0: 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53  T INTO t2 VALUES
5700: 28 33 2c 20 34 29 3b 0a 20 20 43 4f 4d 4d 49 54  (3, 4);.  COMMIT
5710: 3b 0a 7d 20 7b 64 65 6c 65 74 65 7d 0a 74 76 20  ;.} {delete}.tv 
5720: 66 69 6c 74 65 72 20 7b 7d 0a 0a 23 20 43 68 65  filter {}..# Che
5730: 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ck the transacti
5740: 6f 6e 20 77 61 73 20 63 6f 6d 6d 69 74 74 65 64  on was committed
5750: 3a 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  :.#.do_execsql_t
5760: 65 73 74 20 70 61 67 65 72 31 2e 34 2e 35 2e 32  est pager1.4.5.2
5770: 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52   {.  SELECT * FR
5780: 4f 4d 20 74 31 3b 0a 20 20 53 45 4c 45 43 54 20  OM t1;.  SELECT 
5790: 2a 20 46 52 4f 4d 20 74 32 3b 0a 7d 20 7b 49 20  * FROM t2;.} {I 
57a0: 49 49 20 31 20 32 20 49 49 49 20 49 56 20 33 20  II 1 2 III IV 3 
57b0: 34 7d 0a 0a 23 20 4e 6f 77 20 74 72 79 20 66 6f  4}..# Now try fo
57c0: 75 72 20 74 65 73 74 73 3a 0a 23 0a 23 20 20 70  ur tests:.#.#  p
57d0: 61 67 65 72 31 2d 34 2e 35 2e 33 3a 20 52 65 73  ager1-4.5.3: Res
57e0: 74 6f 72 65 20 74 68 65 20 66 69 6c 65 2d 73 79  tore the file-sy
57f0: 73 74 65 6d 2e 20 43 68 65 63 6b 20 74 68 61 74  stem. Check that
5800: 20 74 68 65 20 77 68 6f 6c 65 20 74 72 61 6e 73   the whole trans
5810: 61 63 74 69 6f 6e 20 0a 23 20 20 20 20 20 20 20  action .#       
5820: 20 20 20 20 20 20 20 20 20 69 73 20 72 6f 6c 6c           is roll
5830: 65 64 20 62 61 63 6b 2e 0a 23 0a 23 20 20 70 61  ed back..#.#  pa
5840: 67 65 72 31 2d 34 2e 35 2e 34 3a 20 52 65 73 74  ger1-4.5.4: Rest
5850: 6f 72 65 20 74 68 65 20 66 69 6c 65 2d 73 79 73  ore the file-sys
5860: 74 65 6d 2e 20 43 6f 72 72 75 70 74 20 74 68 65  tem. Corrupt the
5870: 20 66 69 72 73 74 20 72 65 63 6f 72 64 20 69 6e   first record in
5880: 20 74 68 65 0a 23 20 20 20 20 20 20 20 20 20 20   the.#          
5890: 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 2e 20 43        journal. C
58a0: 68 65 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63  heck the transac
58b0: 74 69 6f 6e 20 69 73 20 6e 6f 74 20 72 6f 6c 6c  tion is not roll
58c0: 65 64 20 62 61 63 6b 2e 0a 23 0a 23 20 20 70 61  ed back..#.#  pa
58d0: 67 65 72 31 2d 34 2e 35 2e 35 3a 20 52 65 73 74  ger1-4.5.5: Rest
58e0: 6f 72 65 20 74 68 65 20 66 69 6c 65 2d 73 79 73  ore the file-sys
58f0: 74 65 6d 2e 20 43 6f 72 72 75 70 74 20 74 68 65  tem. Corrupt the
5900: 20 73 65 63 6f 6e 64 20 72 65 63 6f 72 64 20 69   second record i
5910: 6e 20 74 68 65 0a 23 20 20 20 20 20 20 20 20 20  n the.#         
5920: 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 2e 20         journal. 
5930: 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 66  Check that the f
5940: 69 72 73 74 20 72 65 63 6f 72 64 20 69 6e 20 74  irst record in t
5950: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  he transaction i
5960: 73 20 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  s .#            
5970: 20 20 20 20 70 6c 61 79 65 64 20 62 61 63 6b 2c      played back,
5980: 20 62 75 74 20 6e 6f 74 20 74 68 65 20 73 65 63   but not the sec
5990: 6f 6e 64 2e 0a 23 0a 23 20 20 70 61 67 65 72 31  ond..#.#  pager1
59a0: 2d 34 2e 35 2e 36 3a 20 52 65 73 74 6f 72 65 20  -4.5.6: Restore 
59b0: 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e  the file-system.
59c0: 20 54 72 79 20 74 6f 20 6f 70 65 6e 20 74 68 65   Try to open the
59d0: 20 64 61 74 61 62 61 73 65 20 77 69 74 68 20 61   database with a
59e0: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
59f0: 20 20 72 65 61 64 6f 6e 6c 79 20 63 6f 6e 6e 65    readonly conne
5a00: 63 74 69 6f 6e 2e 20 54 68 69 73 20 73 68 6f 75  ction. This shou
5a10: 6c 64 20 66 61 69 6c 2c 20 61 73 20 61 20 72 65  ld fail, as a re
5a20: 61 64 2d 6f 6e 6c 79 0a 23 20 20 20 20 20 20 20  ad-only.#       
5a30: 20 20 20 20 20 20 20 20 20 63 6f 6e 6e 65 63 74           connect
5a40: 69 6f 6e 20 63 61 6e 6e 6f 74 20 72 6f 6c 6c 20  ion cannot roll 
5a50: 62 61 63 6b 20 74 68 65 20 64 61 74 61 62 61 73  back the databas
5a60: 65 20 66 69 6c 65 2e 0a 23 0a 66 61 75 6c 74 73  e file..#.faults
5a70: 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72  im_restore_and_r
5a80: 65 6f 70 65 6e 0a 64 6f 5f 65 78 65 63 73 71 6c  eopen.do_execsql
5a90: 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e 35  _test pager1.4.5
5aa0: 2e 33 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20  .3 {.  SELECT * 
5ab0: 46 52 4f 4d 20 74 31 3b 0a 20 20 53 45 4c 45 43  FROM t1;.  SELEC
5ac0: 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 7d 20 7b  T * FROM t2;.} {
5ad0: 49 20 49 49 20 49 49 49 20 49 56 7d 0a 66 61 75  I II III IV}.fau
5ae0: 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e  ltsim_restore_an
5af0: 64 5f 72 65 6f 70 65 6e 0a 68 65 78 69 6f 5f 77  d_reopen.hexio_w
5b00: 72 69 74 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75  rite test.db-jou
5b10: 72 6e 61 6c 20 5b 65 78 70 72 20 35 31 32 2b 34  rnal [expr 512+4
5b20: 2b 31 30 32 34 20 2d 20 32 30 32 5d 20 30 31 32  +1024 - 202] 012
5b30: 33 34 35 36 37 38 39 41 42 43 44 45 46 0a 64 6f  3456789ABCDEF.do
5b40: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61  _execsql_test pa
5b50: 67 65 72 31 2e 34 2e 35 2e 34 20 7b 0a 20 20 53  ger1.4.5.4 {.  S
5b60: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b  ELECT * FROM t1;
5b70: 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  .  SELECT * FROM
5b80: 20 74 32 3b 0a 7d 20 7b 49 20 49 49 20 31 20 32   t2;.} {I II 1 2
5b90: 20 49 49 49 20 49 56 20 33 20 34 7d 0a 66 61 75   III IV 3 4}.fau
5ba0: 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e  ltsim_restore_an
5bb0: 64 5f 72 65 6f 70 65 6e 0a 68 65 78 69 6f 5f 77  d_reopen.hexio_w
5bc0: 72 69 74 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75  rite test.db-jou
5bd0: 72 6e 61 6c 20 5b 65 78 70 72 20 35 31 32 2b 34  rnal [expr 512+4
5be0: 2b 31 30 32 34 2b 34 2b 34 2b 31 30 32 34 20 2d  +1024+4+4+1024 -
5bf0: 20 32 30 32 5d 20 30 31 32 33 34 35 36 37 38 39   202] 0123456789
5c00: 41 42 43 44 45 46 0a 64 6f 5f 65 78 65 63 73 71  ABCDEF.do_execsq
5c10: 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e  l_test pager1.4.
5c20: 35 2e 35 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a  5.5 {.  SELECT *
5c30: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 53 45 4c 45   FROM t1;.  SELE
5c40: 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 7d 20  CT * FROM t2;.} 
5c50: 7b 49 20 49 49 20 49 49 49 20 49 56 20 33 20 34  {I II III IV 3 4
5c60: 7d 0a 0a 66 61 75 6c 74 73 69 6d 5f 72 65 73 74  }..faultsim_rest
5c70: 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 64  ore_and_reopen.d
5c80: 62 20 63 6c 6f 73 65 0a 73 71 6c 69 74 65 33 20  b close.sqlite3 
5c90: 64 62 20 74 65 73 74 2e 64 62 20 2d 72 65 61 64  db test.db -read
5ca0: 6f 6e 6c 79 20 31 0a 64 6f 5f 63 61 74 63 68 73  only 1.do_catchs
5cb0: 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34  ql_test pager1.4
5cc0: 2e 35 2e 36 20 7b 0a 20 20 53 45 4c 45 43 54 20  .5.6 {.  SELECT 
5cd0: 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 53 45 4c  * FROM t1;.  SEL
5ce0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 7d  ECT * FROM t2;.}
5cf0: 20 7b 31 20 7b 64 69 73 6b 20 49 2f 4f 20 65 72   {1 {disk I/O er
5d00: 72 6f 72 7d 7d 0a 64 62 20 63 6c 6f 73 65 0a 0a  ror}}.db close..
5d10: 23 20 53 6e 61 70 73 68 6f 74 20 74 68 65 20 66  # Snapshot the f
5d20: 69 6c 65 2d 73 79 73 74 65 6d 20 6a 75 73 74 20  ile-system just 
5d30: 62 65 66 6f 72 65 20 6d 75 6c 74 69 2d 66 69 6c  before multi-fil
5d40: 65 20 63 6f 6d 6d 69 74 2e 20 53 61 76 65 20 74  e commit. Save t
5d50: 68 65 20 6e 61 6d 65 0a 23 20 6f 66 20 74 68 65  he name.# of the
5d60: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
5d70: 66 69 6c 65 20 69 6e 20 24 3a 3a 6d 6a 5f 66 69  file in $::mj_fi
5d80: 6c 65 6e 61 6d 65 2e 0a 23 0a 74 76 20 73 63 72  lename..#.tv scr
5d90: 69 70 74 20 63 6f 70 79 5f 6f 6e 5f 6d 6a 5f 64  ipt copy_on_mj_d
5da0: 65 6c 65 74 65 0a 74 76 20 66 69 6c 74 65 72 20  elete.tv filter 
5db0: 78 44 65 6c 65 74 65 0a 70 72 6f 63 20 63 6f 70  xDelete.proc cop
5dc0: 79 5f 6f 6e 5f 6d 6a 5f 64 65 6c 65 74 65 20 7b  y_on_mj_delete {
5dd0: 6d 65 74 68 6f 64 20 66 69 6c 65 6e 61 6d 65 20  method filename 
5de0: 61 72 67 73 7d 20 7b 0a 20 20 69 66 20 7b 5b 73  args} {.  if {[s
5df0: 74 72 69 6e 67 20 6d 61 74 63 68 20 2a 6d 6a 2a  tring match *mj*
5e00: 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 66 69 6c   [file tail $fil
5e10: 65 6e 61 6d 65 5d 5d 7d 20 7b 20 0a 20 20 20 20  ename]]} { .    
5e20: 73 65 74 20 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d  set ::mj_filenam
5e30: 65 20 24 66 69 6c 65 6e 61 6d 65 0a 20 20 20 20  e $filename.    
5e40: 66 61 75 6c 74 73 69 6d 5f 73 61 76 65 20 0a 20  faultsim_save . 
5e50: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
5e60: 54 45 5f 4f 4b 0a 7d 0a 64 6f 5f 74 65 73 74 20  TE_OK.}.do_test 
5e70: 70 61 67 65 72 31 2e 34 2e 36 2e 31 20 7b 0a 20  pager1.4.6.1 {. 
5e80: 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65   faultsim_delete
5e90: 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78  _and_reopen.  ex
5ea0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47  ecsql {.    PRAG
5eb0: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  MA journal_mode 
5ec0: 3d 20 44 45 4c 45 54 45 3b 0a 20 20 20 20 41 54  = DELETE;.    AT
5ed0: 54 41 43 48 20 27 74 65 73 74 2e 64 62 32 27 20  TACH 'test.db2' 
5ee0: 41 53 20 74 77 6f 3b 0a 20 20 20 20 43 52 45 41  AS two;.    CREA
5ef0: 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62  TE TABLE t1(a, b
5f00: 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  );.    CREATE TA
5f10: 42 4c 45 20 74 77 6f 2e 74 32 28 61 2c 20 62 29  BLE two.t2(a, b)
5f20: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
5f30: 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20 27  O t1 VALUES(1, '
5f40: 74 31 2e 31 27 29 3b 0a 20 20 20 20 49 4e 53 45  t1.1');.    INSE
5f50: 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45  RT INTO t2 VALUE
5f60: 53 28 31 2c 20 27 74 32 2e 31 27 29 3b 0a 20 20  S(1, 't2.1');.  
5f70: 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 55    BEGIN;.      U
5f80: 50 44 41 54 45 20 74 31 20 53 45 54 20 62 20 3d  PDATE t1 SET b =
5f90: 20 27 74 31 2e 32 27 3b 0a 20 20 20 20 20 20 55   't1.2';.      U
5fa0: 50 44 41 54 45 20 74 32 20 53 45 54 20 62 20 3d  PDATE t2 SET b =
5fb0: 20 27 74 32 2e 32 27 3b 0a 20 20 20 20 43 4f 4d   't2.2';.    COM
5fc0: 4d 49 54 3b 0a 20 20 7d 0a 20 20 74 76 20 66 69  MIT;.  }.  tv fi
5fd0: 6c 74 65 72 20 7b 7d 0a 20 20 64 62 20 63 6c 6f  lter {}.  db clo
5fe0: 73 65 0a 7d 20 7b 7d 0a 0a 66 61 75 6c 74 73 69  se.} {}..faultsi
5ff0: 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65  m_restore_and_re
6000: 6f 70 65 6e 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  open.do_execsql_
6010: 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e 36 2e  test pager1.4.6.
6020: 32 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  2 { SELECT * FRO
6030: 4d 20 74 31 20 7d 20 20 20 20 20 20 20 20 20 20  M t1 }          
6040: 20 7b 31 20 74 31 2e 31 7d 0a 64 6f 5f 74 65 73   {1 t1.1}.do_tes
6050: 74 20 20 20 20 20 20 20 20 20 70 61 67 65 72 31  t         pager1
6060: 2e 34 2e 36 2e 33 20 7b 20 66 69 6c 65 20 65 78  .4.6.3 { file ex
6070: 69 73 74 73 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e  ists $::mj_filen
6080: 61 6d 65 20 7d 20 7b 31 7d 0a 64 6f 5f 65 78 65  ame } {1}.do_exe
6090: 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31  csql_test pager1
60a0: 2e 34 2e 36 2e 34 20 7b 0a 20 20 41 54 54 41 43  .4.6.4 {.  ATTAC
60b0: 48 20 27 74 65 73 74 2e 64 62 32 27 20 41 53 20  H 'test.db2' AS 
60c0: 74 77 6f 3b 0a 20 20 53 45 4c 45 43 54 20 2a 20  two;.  SELECT * 
60d0: 46 52 4f 4d 20 74 32 3b 0a 7d 20 7b 31 20 74 32  FROM t2;.} {1 t2
60e0: 2e 31 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  .1}.do_test page
60f0: 72 31 2e 34 2e 36 2e 35 20 7b 20 66 69 6c 65 20  r1.4.6.5 { file 
6100: 65 78 69 73 74 73 20 24 3a 3a 6d 6a 5f 66 69 6c  exists $::mj_fil
6110: 65 6e 61 6d 65 20 7d 20 7b 30 7d 0a 0a 66 61 75  ename } {0}..fau
6120: 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e  ltsim_restore_an
6130: 64 5f 72 65 6f 70 65 6e 0a 64 62 20 63 6c 6f 73  d_reopen.db clos
6140: 65 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  e.do_test pager1
6150: 2e 34 2e 36 2e 38 20 7b 0a 20 20 73 65 74 20 3a  .4.6.8 {.  set :
6160: 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 31 20 24 3a  :mj_filename1 $:
6170: 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 0a 20 20 74  :mj_filename.  t
6180: 76 20 66 69 6c 74 65 72 20 78 44 65 6c 65 74 65  v filter xDelete
6190: 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 74 65  .  sqlite3 db te
61a0: 73 74 2e 64 62 32 0a 20 20 65 78 65 63 73 71 6c  st.db2.  execsql
61b0: 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f   {.    PRAGMA jo
61c0: 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c  urnal_mode = DEL
61d0: 45 54 45 3b 0a 20 20 20 20 41 54 54 41 43 48 20  ETE;.    ATTACH 
61e0: 27 74 65 73 74 2e 64 62 33 27 20 41 53 20 74 68  'test.db3' AS th
61f0: 72 65 65 3b 0a 20 20 20 20 43 52 45 41 54 45 20  ree;.    CREATE 
6200: 54 41 42 4c 45 20 74 68 72 65 65 2e 74 33 28 61  TABLE three.t3(a
6210: 2c 20 62 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  , b);.    INSERT
6220: 20 49 4e 54 4f 20 74 33 20 56 41 4c 55 45 53 28   INTO t3 VALUES(
6230: 31 2c 20 27 74 33 2e 31 27 29 3b 0a 20 20 20 20  1, 't3.1');.    
6240: 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 55 50 44  BEGIN;.      UPD
6250: 41 54 45 20 74 32 20 53 45 54 20 62 20 3d 20 27  ATE t2 SET b = '
6260: 74 32 2e 33 27 3b 0a 20 20 20 20 20 20 55 50 44  t2.3';.      UPD
6270: 41 54 45 20 74 33 20 53 45 54 20 62 20 3d 20 27  ATE t3 SET b = '
6280: 74 33 2e 33 27 3b 0a 20 20 20 20 43 4f 4d 4d 49  t3.3';.    COMMI
6290: 54 3b 0a 20 20 7d 0a 20 20 65 78 70 72 20 7b 24  T;.  }.  expr {$
62a0: 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 31 20 21  ::mj_filename1 !
62b0: 3d 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65  = $::mj_filename
62c0: 7d 0a 7d 20 7b 31 7d 0a 66 61 75 6c 74 73 69 6d  }.} {1}.faultsim
62d0: 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f  _restore_and_reo
62e0: 70 65 6e 0a 74 76 20 66 69 6c 74 65 72 20 7b 7d  pen.tv filter {}
62f0: 0a 0a 23 20 54 68 65 20 66 69 6c 65 2d 73 79 73  ..# The file-sys
6300: 74 65 6d 20 6e 6f 77 20 63 6f 6e 74 61 69 6e 73  tem now contains
6310: 3a 0a 23 0a 23 20 20 20 2a 20 74 68 72 65 65 20  :.#.#   * three 
6320: 64 61 74 61 62 61 73 65 73 0a 23 20 20 20 2a 20  databases.#   * 
6330: 74 68 72 65 65 20 68 6f 74 2d 6a 6f 75 72 6e 61  three hot-journa
6340: 6c 20 66 69 6c 65 73 0a 23 20 20 20 2a 20 74 77  l files.#   * tw
6350: 6f 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  o master-journal
6360: 20 66 69 6c 65 73 2e 0a 23 0a 23 20 54 68 65 20   files..#.# The 
6370: 68 6f 74 2d 6a 6f 75 72 6e 61 6c 73 20 61 73 73  hot-journals ass
6380: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 65 73  ociated with tes
6390: 74 2e 64 62 32 20 61 6e 64 20 74 65 73 74 2e 64  t.db2 and test.d
63a0: 62 33 20 70 6f 69 6e 74 20 74 6f 0a 23 20 6d 61  b3 point to.# ma
63b0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 24 3a 3a  ster journal $::
63c0: 6d 6a 5f 66 69 6c 65 6e 61 6d 65 2e 20 54 68 65  mj_filename. The
63d0: 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c   hot-journal fil
63e0: 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  e associated wit
63f0: 68 0a 23 20 74 65 73 74 2e 64 62 20 70 6f 69 6e  h.# test.db poin
6400: 74 73 20 74 6f 20 6d 61 73 74 65 72 20 6a 6f 75  ts to master jou
6410: 72 6e 61 6c 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e  rnal $::mj_filen
6420: 61 6d 65 31 2e 20 53 6f 20 72 65 61 64 69 6e 67  ame1. So reading
6430: 20 66 72 6f 6d 0a 23 20 74 65 73 74 2e 64 62 20   from.# test.db 
6440: 73 68 6f 75 6c 64 20 64 65 6c 65 74 65 20 24 3a  should delete $:
6450: 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 31 2e 0a 23  :mj_filename1..#
6460: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2e  .do_test pager1.
6470: 34 2e 36 2e 39 20 7b 0a 20 20 6c 73 6f 72 74 20  4.6.9 {.  lsort 
6480: 5b 67 6c 6f 62 20 74 65 73 74 2e 64 62 2a 5d 0a  [glob test.db*].
6490: 7d 20 5b 6c 73 6f 72 74 20 5b 6c 69 73 74 20 20  } [lsort [list  
64a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
64b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
64c0: 20 20 20 20 20 20 20 20 20 5c 0a 20 20 74 65 73           \.  tes
64d0: 74 2e 64 62 20 74 65 73 74 2e 64 62 32 20 74 65  t.db test.db2 te
64e0: 73 74 2e 64 62 33 20 20 20 20 20 20 20 20 20 20  st.db3          
64f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6500: 20 20 20 20 5c 0a 20 20 74 65 73 74 2e 64 62 2d      \.  test.db-
6510: 6a 6f 75 72 6e 61 6c 20 74 65 73 74 2e 64 62 32  journal test.db2
6520: 2d 6a 6f 75 72 6e 61 6c 20 74 65 73 74 2e 64 62  -journal test.db
6530: 33 2d 6a 6f 75 72 6e 61 6c 20 20 20 20 20 20 5c  3-journal      \
6540: 0a 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 3a  .  [file tail $:
6550: 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 5d 20 5b 66  :mj_filename] [f
6560: 69 6c 65 20 74 61 69 6c 20 24 3a 3a 6d 6a 5f 66  ile tail $::mj_f
6570: 69 6c 65 6e 61 6d 65 31 5d 0a 5d 5d 0a 0a 23 20  ilename1].]]..# 
6580: 54 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e  The master-journ
6590: 61 6c 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d  al $::mj_filenam
65a0: 65 31 20 63 6f 6e 74 61 69 6e 73 20 70 6f 69 6e  e1 contains poin
65b0: 74 65 72 73 20 74 6f 20 74 65 73 74 2e 64 62 20  ters to test.db 
65c0: 61 6e 64 20 0a 23 20 74 65 73 74 2e 64 62 32 2e  and .# test.db2.
65d0: 20 48 6f 77 65 76 65 72 20 74 68 65 20 68 6f 74   However the hot
65e0: 2d 6a 6f 75 72 6e 61 6c 20 61 73 73 6f 63 69 61  -journal associa
65f0: 74 65 64 20 77 69 74 68 20 74 65 73 74 2e 64 62  ted with test.db
6600: 32 20 70 6f 69 6e 74 73 20 74 6f 0a 23 20 61 20  2 points to.# a 
6610: 64 69 66 66 65 72 65 6e 74 20 6d 61 73 74 65 72  different master
6620: 2d 6a 6f 75 72 6e 61 6c 2e 20 54 68 65 72 65 66  -journal. Theref
6630: 6f 72 65 2c 20 72 65 61 64 69 6e 67 20 66 72 6f  ore, reading fro
6640: 6d 20 74 65 73 74 2e 64 62 20 6f 6e 6c 79 20 73  m test.db only s
6650: 68 6f 75 6c 64 0a 23 20 62 65 20 65 6e 6f 75 67  hould.# be enoug
6660: 68 20 74 6f 20 63 61 75 73 65 20 53 51 4c 69 74  h to cause SQLit
6670: 65 20 74 6f 20 64 65 6c 65 74 65 20 24 3a 3a 6d  e to delete $::m
6680: 6a 5f 66 69 6c 65 6e 61 6d 65 31 2e 0a 23 0a 64  j_filename1..#.d
6690: 6f 5f 74 65 73 74 20 20 20 20 20 20 20 20 20 70  o_test         p
66a0: 61 67 65 72 31 2e 34 2e 36 2e 31 30 20 7b 20 66  ager1.4.6.10 { f
66b0: 69 6c 65 20 65 78 69 73 74 73 20 24 3a 3a 6d 6a  ile exists $::mj
66c0: 5f 66 69 6c 65 6e 61 6d 65 20 20 7d 20 7b 31 7d  _filename  } {1}
66d0: 0a 64 6f 5f 74 65 73 74 20 20 20 20 20 20 20 20  .do_test        
66e0: 20 70 61 67 65 72 31 2e 34 2e 36 2e 31 31 20 7b   pager1.4.6.11 {
66f0: 20 66 69 6c 65 20 65 78 69 73 74 73 20 24 3a 3a   file exists $::
6700: 6d 6a 5f 66 69 6c 65 6e 61 6d 65 31 20 7d 20 7b  mj_filename1 } {
6710: 31 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  1}.do_execsql_te
6720: 73 74 20 70 61 67 65 72 31 2e 34 2e 36 2e 31 32  st pager1.4.6.12
6730: 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d   { SELECT * FROM
6740: 20 74 31 20 7d 20 7b 31 20 74 31 2e 31 7d 0a 64   t1 } {1 t1.1}.d
6750: 6f 5f 74 65 73 74 20 20 20 20 20 20 20 20 20 70  o_test         p
6760: 61 67 65 72 31 2e 34 2e 36 2e 31 33 20 7b 20 66  ager1.4.6.13 { f
6770: 69 6c 65 20 65 78 69 73 74 73 20 24 3a 3a 6d 6a  ile exists $::mj
6780: 5f 66 69 6c 65 6e 61 6d 65 20 20 7d 20 7b 31 7d  _filename  } {1}
6790: 0a 64 6f 5f 74 65 73 74 20 20 20 20 20 20 20 20  .do_test        
67a0: 20 70 61 67 65 72 31 2e 34 2e 36 2e 31 34 20 7b   pager1.4.6.14 {
67b0: 20 66 69 6c 65 20 65 78 69 73 74 73 20 24 3a 3a   file exists $::
67c0: 6d 6a 5f 66 69 6c 65 6e 61 6d 65 31 20 7d 20 7b  mj_filename1 } {
67d0: 30 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  0}..do_execsql_t
67e0: 65 73 74 20 70 61 67 65 72 31 2e 34 2e 36 2e 31  est pager1.4.6.1
67f0: 32 20 7b 0a 20 20 41 54 54 41 43 48 20 27 74 65  2 {.  ATTACH 'te
6800: 73 74 2e 64 62 32 27 20 41 53 20 74 77 6f 3b 0a  st.db2' AS two;.
6810: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
6820: 74 32 3b 0a 7d 20 7b 31 20 74 32 2e 31 7d 0a 64  t2;.} {1 t2.1}.d
6830: 6f 5f 74 65 73 74 20 20 20 20 20 20 20 20 20 70  o_test         p
6840: 61 67 65 72 31 2e 34 2e 36 2e 31 33 20 7b 20 66  ager1.4.6.13 { f
6850: 69 6c 65 20 65 78 69 73 74 73 20 24 3a 3a 6d 6a  ile exists $::mj
6860: 5f 66 69 6c 65 6e 61 6d 65 20 7d 20 20 7b 31 7d  _filename }  {1}
6870: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
6880: 20 70 61 67 65 72 31 2e 34 2e 36 2e 31 34 20 7b   pager1.4.6.14 {
6890: 0a 20 20 41 54 54 41 43 48 20 27 74 65 73 74 2e  .  ATTACH 'test.
68a0: 64 62 33 27 20 41 53 20 74 68 72 65 65 3b 0a 20  db3' AS three;. 
68b0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
68c0: 33 3b 0a 7d 20 7b 31 20 74 33 2e 31 7d 0a 64 6f  3;.} {1 t3.1}.do
68d0: 5f 74 65 73 74 20 20 20 20 20 20 20 20 20 70 61  _test         pa
68e0: 67 65 72 31 2e 34 2e 36 2e 31 35 20 7b 20 66 69  ger1.4.6.15 { fi
68f0: 6c 65 20 65 78 69 73 74 73 20 24 3a 3a 6d 6a 5f  le exists $::mj_
6900: 66 69 6c 65 6e 61 6d 65 20 7d 20 20 7b 30 7d 0a  filename }  {0}.
6910: 0a 64 62 20 63 6c 6f 73 65 0a 74 76 20 64 65 6c  .db close.tv del
6920: 65 74 65 0a 0a 74 65 73 74 76 66 73 20 74 76 20  ete..testvfs tv 
6930: 2d 64 65 66 61 75 6c 74 20 31 0a 74 76 20 73 65  -default 1.tv se
6940: 63 74 6f 72 73 69 7a 65 20 35 31 32 0a 74 76 20  ctorsize 512.tv 
6950: 73 63 72 69 70 74 20 63 6f 70 79 5f 6f 6e 5f 6a  script copy_on_j
6960: 6f 75 72 6e 61 6c 5f 64 65 6c 65 74 65 0a 74 76  ournal_delete.tv
6970: 20 66 69 6c 74 65 72 20 78 44 65 6c 65 74 65 0a   filter xDelete.
6980: 70 72 6f 63 20 63 6f 70 79 5f 6f 6e 5f 6a 6f 75  proc copy_on_jou
6990: 72 6e 61 6c 5f 64 65 6c 65 74 65 20 7b 6d 65 74  rnal_delete {met
69a0: 68 6f 64 20 66 69 6c 65 6e 61 6d 65 20 61 72 67  hod filename arg
69b0: 73 7d 20 7b 0a 20 20 69 66 20 7b 5b 73 74 72 69  s} {.  if {[stri
69c0: 6e 67 20 6d 61 74 63 68 20 2a 6a 6f 75 72 6e 61  ng match *journa
69d0: 6c 20 24 66 69 6c 65 6e 61 6d 65 5d 7d 20 66 61  l $filename]} fa
69e0: 75 6c 74 73 69 6d 5f 73 61 76 65 20 0a 20 20 72  ultsim_save .  r
69f0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a  eturn SQLITE_OK.
6a00: 7d 0a 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74  }.faultsim_delet
6a10: 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 64 6f 5f  e_and_reopen.do_
6a20: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67  execsql_test pag
6a30: 65 72 31 2e 34 2e 37 2e 31 20 7b 0a 20 20 50 52  er1.4.7.1 {.  PR
6a40: 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
6a50: 65 20 3d 20 44 45 4c 45 54 45 3b 0a 20 20 43 52  e = DELETE;.  CR
6a60: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 78 20  EATE TABLE t1(x 
6a70: 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 79 29 3b  PRIMARY KEY, y);
6a80: 0a 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20  .  CREATE INDEX 
6a90: 69 31 20 4f 4e 20 74 31 28 79 29 3b 0a 20 20 49  i1 ON t1(y);.  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 27 2c 20 20 20 27 6f 6e 65  LUES('I',   'one
6ac0: 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  ');.  INSERT INT
6ad0: 4f 20 74 31 20 56 41 4c 55 45 53 28 27 49 49 27  O t1 VALUES('II'
6ae0: 2c 20 20 27 66 6f 75 72 27 29 3b 0a 20 20 49 4e  ,  'four');.  IN
6af0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
6b00: 55 45 53 28 27 49 49 49 27 2c 20 27 6e 69 6e 65  UES('III', 'nine
6b10: 27 29 3b 0a 20 20 42 45 47 49 4e 3b 0a 20 20 20  ');.  BEGIN;.   
6b20: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
6b30: 56 41 4c 55 45 53 28 27 49 56 27 2c 20 27 73 69  VALUES('IV', 'si
6b40: 78 74 65 65 6e 27 29 3b 0a 20 20 20 20 49 4e 53  xteen');.    INS
6b50: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
6b60: 45 53 28 27 56 27 20 2c 20 27 74 77 65 6e 74 79  ES('V' , 'twenty
6b70: 66 69 76 65 27 29 3b 0a 20 20 43 4f 4d 4d 49 54  five');.  COMMIT
6b80: 3b 0a 7d 20 7b 64 65 6c 65 74 65 7d 0a 74 76 20  ;.} {delete}.tv 
6b90: 66 69 6c 74 65 72 20 7b 7d 0a 64 62 20 63 6c 6f  filter {}.db clo
6ba0: 73 65 0a 74 76 20 64 65 6c 65 74 65 20 0a 64 6f  se.tv delete .do
6bb0: 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e 37  _test pager1.4.7
6bc0: 2e 32 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f  .2 {.  faultsim_
6bd0: 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70  restore_and_reop
6be0: 65 6e 0a 20 20 63 61 74 63 68 20 7b 66 69 6c 65  en.  catch {file
6bf0: 20 61 74 74 72 69 62 75 74 65 73 20 74 65 73 74   attributes test
6c00: 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 2d 70 65 72  .db-journal -per
6c10: 6d 69 73 73 69 6f 6e 73 20 72 2d 2d 2d 2d 2d 2d  missions r------
6c20: 2d 2d 7d 0a 20 20 63 61 74 63 68 20 7b 66 69 6c  --}.  catch {fil
6c30: 65 20 61 74 74 72 69 62 75 74 65 73 20 74 65 73  e attributes tes
6c40: 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 2d 72 65  t.db-journal -re
6c50: 61 64 6f 6e 6c 79 20 31 7d 0a 20 20 63 61 74 63  adonly 1}.  catc
6c60: 68 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20  hsql { SELECT * 
6c70: 46 52 4f 4d 20 74 31 20 7d 0a 7d 20 7b 31 20 7b  FROM t1 }.} {1 {
6c80: 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 64  unable to open d
6c90: 61 74 61 62 61 73 65 20 66 69 6c 65 7d 7d 0a 64  atabase file}}.d
6ca0: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e  o_test pager1.4.
6cb0: 37 2e 33 20 7b 0a 20 20 64 62 20 63 6c 6f 73 65  7.3 {.  db close
6cc0: 0a 20 20 63 61 74 63 68 20 7b 66 69 6c 65 20 61  .  catch {file a
6cd0: 74 74 72 69 62 75 74 65 73 20 74 65 73 74 2e 64  ttributes test.d
6ce0: 62 2d 6a 6f 75 72 6e 61 6c 20 2d 70 65 72 6d 69  b-journal -permi
6cf0: 73 73 69 6f 6e 73 20 72 77 2d 72 77 2d 72 77 2d  ssions rw-rw-rw-
6d00: 7d 0a 20 20 63 61 74 63 68 20 7b 66 69 6c 65 20  }.  catch {file 
6d10: 61 74 74 72 69 62 75 74 65 73 20 74 65 73 74 2e  attributes test.
6d20: 64 62 2d 6a 6f 75 72 6e 61 6c 20 2d 72 65 61 64  db-journal -read
6d30: 6f 6e 6c 79 20 30 7d 0a 20 20 66 69 6c 65 20 64  only 0}.  file d
6d40: 65 6c 65 74 65 20 74 65 73 74 2e 64 62 2d 6a 6f  elete test.db-jo
6d50: 75 72 6e 61 6c 0a 20 20 66 69 6c 65 20 65 78 69  urnal.  file exi
6d60: 73 74 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72  sts test.db-jour
6d70: 6e 61 6c 0a 7d 20 7b 30 7d 0a 0a 23 2d 2d 2d 2d  nal.} {0}..#----
6d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6d90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6da0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6db0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6dc0: 2d 2d 2d 2d 2d 0a 23 20 54 68 65 20 66 6f 6c 6c  -----.# The foll
6dd0: 6f 77 69 6e 67 20 74 65 73 74 73 20 64 65 61 6c  owing tests deal
6de0: 20 77 69 74 68 20 6d 75 6c 74 69 2d 66 69 6c 65   with multi-file
6df0: 20 63 6f 6d 6d 69 74 73 2e 0a 23 0a 23 20 70 61   commits..#.# pa
6e00: 67 65 72 31 2d 35 2e 31 2e 2a 3a 20 54 68 65 20  ger1-5.1.*: The 
6e10: 63 61 73 65 20 77 68 65 72 65 20 61 20 6d 75 6c  case where a mul
6e20: 74 69 2d 66 69 6c 65 20 63 61 6e 6e 6f 74 20 62  ti-file cannot b
6e30: 65 20 63 6f 6d 6d 69 74 74 65 64 20 62 65 63 61  e committed beca
6e40: 75 73 65 0a 23 20 20 20 20 20 20 20 20 20 20 20  use.#           
6e50: 20 20 20 20 61 6e 6f 74 68 65 72 20 63 6f 6e 6e      another conn
6e60: 65 63 74 69 6f 6e 20 69 73 20 68 6f 6c 64 69 6e  ection is holdin
6e70: 67 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20  g a SHARED lock 
6e80: 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 0a 23 20  on one of the.# 
6e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69                fi
6ea0: 6c 65 73 2e 20 41 66 74 65 72 20 74 68 65 20 53  les. After the S
6eb0: 48 41 52 45 44 20 6c 6f 63 6b 20 69 73 20 72 65  HARED lock is re
6ec0: 6d 6f 76 65 64 2c 20 74 68 65 20 43 4f 4d 4d 49  moved, the COMMI
6ed0: 54 20 73 75 63 63 65 65 64 73 2e 0a 23 0a 23 20  T succeeds..#.# 
6ee0: 70 61 67 65 72 31 2d 35 2e 32 2e 2a 3a 20 4d 75  pager1-5.2.*: Mu
6ef0: 6c 74 69 2d 66 69 6c 65 20 63 6f 6d 6d 69 74 73  lti-file commits
6f00: 20 77 69 74 68 20 6a 6f 75 72 6e 61 6c 5f 6d 6f   with journal_mo
6f10: 64 65 3d 6d 65 6d 6f 72 79 2e 0a 23 0a 23 20 70  de=memory..#.# p
6f20: 61 67 65 72 31 2d 35 2e 33 2e 2a 3a 20 4d 75 6c  ager1-5.3.*: Mul
6f30: 74 69 2d 66 69 6c 65 20 63 6f 6d 6d 69 74 73 20  ti-file commits 
6f40: 77 69 74 68 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  with journal_mod
6f50: 65 3d 6d 65 6d 6f 72 79 2e 0a 23 0a 23 20 70 61  e=memory..#.# pa
6f60: 67 65 72 31 2d 35 2e 34 2e 2a 3a 20 43 68 65 63  ger1-5.4.*: Chec
6f70: 6b 20 74 68 61 74 20 77 69 74 68 20 73 79 6e 63  k that with sync
6f80: 68 72 6f 6e 6f 75 73 3d 6e 6f 72 6d 61 6c 2c 20  hronous=normal, 
6f90: 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e  the master-journ
6fa0: 61 6c 20 66 69 6c 65 0a 23 20 20 20 20 20 20 20  al file.#       
6fb0: 20 20 20 20 20 20 20 20 6e 61 6d 65 20 69 73 20          name is 
6fc0: 61 64 64 65 64 20 74 6f 20 61 20 6a 6f 75 72 6e  added to a journ
6fd0: 61 6c 20 66 69 6c 65 20 69 6d 6d 65 64 69 61 74  al file immediat
6fe0: 65 6c 79 20 61 66 74 65 72 20 74 68 65 20 6c 61  ely after the la
6ff0: 73 74 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  st.#            
7000: 20 20 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72     journal recor
7010: 64 2e 20 42 75 74 20 77 69 74 68 20 73 79 6e 63  d. But with sync
7020: 68 72 6f 6e 6f 75 73 3d 66 75 6c 6c 2c 20 65 78  hronous=full, ex
7030: 74 72 61 20 75 6e 75 73 65 64 20 73 70 61 63 65  tra unused space
7040: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
7050: 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 65   is allocated be
7060: 74 77 65 65 6e 20 74 68 65 20 6c 61 73 74 20 6a  tween the last j
7070: 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 61 6e  ournal record an
7080: 64 20 74 68 65 20 0a 23 20 20 20 20 20 20 20 20  d the .#        
7090: 20 20 20 20 20 20 20 6d 61 73 74 65 72 2d 6a 6f         master-jo
70a0: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
70b0: 73 6f 20 74 68 61 74 20 74 68 65 20 6d 61 73 74  so that the mast
70c0: 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  er-journal file.
70d0: 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  #               
70e0: 6e 61 6d 65 20 64 6f 65 73 20 6e 6f 74 20 6c 69  name does not li
70f0: 65 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 73 65  e on the same se
7100: 63 74 6f 72 20 61 73 20 74 68 65 20 6c 61 73 74  ctor as the last
7110: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 23 20   journal file.# 
7120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
7130: 63 6f 72 64 2e 0a 23 0a 23 20 70 61 67 65 72 31  cord..#.# pager1
7140: 2d 35 2e 35 2e 2a 3a 20 43 68 65 63 6b 20 74 68  -5.5.*: Check th
7150: 61 74 20 69 6e 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  at in journal_mo
7160: 64 65 3d 50 45 52 53 49 53 54 20 6d 6f 64 65 2c  de=PERSIST mode,
7170: 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20   a journal file 
7180: 69 73 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  is.#            
7190: 20 20 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20     truncated to 
71a0: 7a 65 72 6f 20 62 79 74 65 73 20 77 68 65 6e 20  zero bytes when 
71b0: 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 74 72 61  a multi-file tra
71c0: 6e 73 61 63 74 69 6f 6e 20 69 73 20 0a 23 20 20  nsaction is .#  
71d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6d               com
71e0: 6d 69 74 74 65 64 20 28 69 6e 73 74 65 61 64 20  mitted (instead 
71f0: 6f 66 20 74 68 65 20 66 69 72 73 74 20 63 6f 75  of the first cou
7200: 70 6c 65 20 6f 66 20 62 79 74 65 73 20 62 65 69  ple of bytes bei
7210: 6e 67 20 7a 65 72 6f 65 64 29 2e 0a 23 0a 23 0a  ng zeroed)..#.#.
7220: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 35  do_test pager1-5
7230: 2e 31 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73 69  .1.1 {.  faultsi
7240: 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f  m_delete_and_reo
7250: 70 65 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  pen.  execsql {.
7260: 20 20 20 20 41 54 54 41 43 48 20 27 74 65 73 74      ATTACH 'test
7270: 2e 64 62 32 27 20 41 53 20 61 75 78 3b 0a 20 20  .db2' AS aux;.  
7280: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
7290: 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 43 52 45  1(a, b);.    CRE
72a0: 41 54 45 20 54 41 42 4c 45 20 61 75 78 2e 74 32  ATE TABLE aux.t2
72b0: 28 61 2c 20 62 29 3b 0a 20 20 20 20 49 4e 53 45  (a, b);.    INSE
72c0: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
72d0: 53 28 31 37 2c 20 27 4c 65 6e 69 6e 27 29 3b 0a  S(17, 'Lenin');.
72e0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
72f0: 74 31 20 56 41 4c 55 45 53 28 32 32 2c 20 27 53  t1 VALUES(22, 'S
7300: 74 61 6c 69 6e 27 29 3b 0a 20 20 20 20 49 4e 53  talin');.    INS
7310: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
7320: 45 53 28 35 33 2c 20 27 4b 68 72 75 73 68 63 68  ES(53, 'Khrushch
7330: 65 76 27 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64  ev');.  }.} {}.d
7340: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 35 2e  o_test pager1-5.
7350: 31 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  1.2 {.  execsql 
7360: 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20  {.    BEGIN;.   
7370: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
7380: 31 20 56 41 4c 55 45 53 28 36 34 2c 20 27 42 72  1 VALUES(64, 'Br
7390: 65 7a 68 6e 65 76 27 29 3b 0a 20 20 20 20 20 20  ezhnev');.      
73a0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 53  INSERT INTO t2 S
73b0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b  ELECT * FROM t1;
73c0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 20 64  .  }.  sqlite3 d
73d0: 62 32 20 74 65 73 74 2e 64 62 32 0a 20 20 65 78  b2 test.db2.  ex
73e0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49  ecsql {.    BEGI
73f0: 4e 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20  N;.      SELECT 
7400: 2a 20 46 52 4f 4d 20 74 32 3b 0a 20 20 7d 20 64  * FROM t2;.  } d
7410: 62 32 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20  b2.} {}.do_test 
7420: 70 61 67 65 72 31 2d 35 2e 31 2e 33 20 7b 0a 20  pager1-5.1.3 {. 
7430: 20 63 61 74 63 68 73 71 6c 20 43 4f 4d 4d 49 54   catchsql COMMIT
7440: 0a 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20  .} {1 {database 
7450: 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 64 6f 5f 74  is locked}}.do_t
7460: 65 73 74 20 70 61 67 65 72 31 2d 35 2e 31 2e 34  est pager1-5.1.4
7470: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 43 4f 4d   {.  execsql COM
7480: 4d 49 54 20 64 62 32 0a 20 20 65 78 65 63 73 71  MIT db2.  execsq
7490: 6c 20 43 4f 4d 4d 49 54 0a 20 20 65 78 65 63 73  l COMMIT.  execs
74a0: 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52  ql { SELECT * FR
74b0: 4f 4d 20 74 32 20 7d 20 64 62 32 0a 7d 20 7b 31  OM t2 } db2.} {1
74c0: 37 20 4c 65 6e 69 6e 20 32 32 20 53 74 61 6c 69  7 Lenin 22 Stali
74d0: 6e 20 35 33 20 4b 68 72 75 73 68 63 68 65 76 20  n 53 Khrushchev 
74e0: 36 34 20 42 72 65 7a 68 6e 65 76 7d 0a 64 6f 5f  64 Brezhnev}.do_
74f0: 74 65 73 74 20 70 61 67 65 72 31 2d 35 2e 31 2e  test pager1-5.1.
7500: 35 20 7b 0a 20 20 64 62 32 20 63 6c 6f 73 65 0a  5 {.  db2 close.
7510: 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74 20 70 61  } {}..do_test pa
7520: 67 65 72 31 2d 35 2e 32 2e 31 20 7b 0a 20 20 65  ger1-5.2.1 {.  e
7530: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41  xecsql {.    PRA
7540: 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
7550: 20 3d 20 6d 65 6d 6f 72 79 3b 0a 20 20 20 20 42   = memory;.    B
7560: 45 47 49 4e 3b 0a 20 20 20 20 20 20 49 4e 53 45  EGIN;.      INSE
7570: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
7580: 53 28 38 34 2c 20 27 41 6e 64 72 6f 70 6f 76 27  S(84, 'Andropov'
7590: 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  );.      INSERT 
75a0: 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 38  INTO t2 VALUES(8
75b0: 34 2c 20 27 41 6e 64 72 6f 70 6f 76 27 29 3b 0a  4, 'Andropov');.
75c0: 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a      COMMIT;.  }.
75d0: 7d 20 7b 6d 65 6d 6f 72 79 7d 0a 64 6f 5f 74 65  } {memory}.do_te
75e0: 73 74 20 70 61 67 65 72 31 2d 35 2e 33 2e 31 20  st pager1-5.3.1 
75f0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
7600: 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c    PRAGMA journal
7610: 5f 6d 6f 64 65 20 3d 20 6f 66 66 3b 0a 20 20 20  _mode = off;.   
7620: 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 49 4e   BEGIN;.      IN
7630: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
7640: 55 45 53 28 38 35 2c 20 27 47 6f 72 62 61 63 68  UES(85, 'Gorbach
7650: 65 76 27 29 3b 0a 20 20 20 20 20 20 49 4e 53 45  ev');.      INSE
7660: 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45  RT INTO t2 VALUE
7670: 53 28 38 35 2c 20 27 47 6f 72 62 61 63 68 65 76  S(85, 'Gorbachev
7680: 27 29 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a  ');.    COMMIT;.
7690: 20 20 7d 0a 7d 20 7b 6f 66 66 7d 0a 0a 64 6f 5f    }.} {off}..do_
76a0: 74 65 73 74 20 70 61 67 65 72 31 2d 35 2e 34 2e  test pager1-5.4.
76b0: 31 20 7b 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20  1 {.  db close. 
76c0: 20 74 65 73 74 76 66 73 20 74 76 0a 20 20 73 71   testvfs tv.  sq
76d0: 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62  lite3 db test.db
76e0: 20 2d 76 66 73 20 74 76 0a 20 20 65 78 65 63 73   -vfs tv.  execs
76f0: 71 6c 20 7b 20 41 54 54 41 43 48 20 27 74 65 73  ql { ATTACH 'tes
7700: 74 2e 64 62 32 27 20 41 53 20 61 75 78 20 7d 0a  t.db2' AS aux }.
7710: 0a 20 20 74 76 20 66 69 6c 74 65 72 20 78 44 65  .  tv filter xDe
7720: 6c 65 74 65 0a 20 20 74 76 20 73 63 72 69 70 74  lete.  tv script
7730: 20 6d 61 78 5f 6a 6f 75 72 6e 61 6c 5f 73 69 7a   max_journal_siz
7740: 65 0a 20 20 74 76 20 73 65 63 74 6f 72 73 69 7a  e.  tv sectorsiz
7750: 65 20 35 31 32 0a 20 20 73 65 74 20 3a 3a 6d 61  e 512.  set ::ma
7760: 78 5f 6a 6f 75 72 6e 61 6c 20 30 0a 20 20 70 72  x_journal 0.  pr
7770: 6f 63 20 6d 61 78 5f 6a 6f 75 72 6e 61 6c 5f 73  oc max_journal_s
7780: 69 7a 65 20 7b 6d 65 74 68 6f 64 20 61 72 67 73  ize {method args
7790: 7d 20 7b 0a 20 20 20 20 73 65 74 20 73 7a 20 30  } {.    set sz 0
77a0: 0a 20 20 20 20 63 61 74 63 68 20 7b 20 73 65 74  .    catch { set
77b0: 20 73 7a 20 5b 66 69 6c 65 20 73 69 7a 65 20 74   sz [file size t
77c0: 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5d 20  est.db-journal] 
77d0: 7d 0a 20 20 20 20 69 66 20 7b 24 73 7a 20 3e 20  }.    if {$sz > 
77e0: 24 3a 3a 6d 61 78 5f 6a 6f 75 72 6e 61 6c 7d 20  $::max_journal} 
77f0: 7b 0a 20 20 20 20 20 20 73 65 74 20 3a 3a 6d 61  {.      set ::ma
7800: 78 5f 6a 6f 75 72 6e 61 6c 20 24 73 7a 0a 20 20  x_journal $sz.  
7810: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 53    }.    return S
7820: 51 4c 49 54 45 5f 4f 4b 0a 20 20 7d 0a 20 20 65  QLITE_OK.  }.  e
7830: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41  xecsql {.    PRA
7840: 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
7850: 20 3d 20 44 45 4c 45 54 45 3b 0a 20 20 20 20 50   = DELETE;.    P
7860: 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75  RAGMA synchronou
7870: 73 20 3d 20 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20  s = NORMAL;.    
7880: 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 49 4e 53  BEGIN;.      INS
7890: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
78a0: 45 53 28 38 35 2c 20 27 47 6f 72 62 61 63 68 65  ES(85, 'Gorbache
78b0: 76 27 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  v');.      INSER
78c0: 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53  T INTO t2 VALUES
78d0: 28 38 35 2c 20 27 47 6f 72 62 61 63 68 65 76 27  (85, 'Gorbachev'
78e0: 29 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20  );.    COMMIT;. 
78f0: 20 7d 0a 20 20 73 65 74 20 3a 3a 6d 61 78 5f 6a   }.  set ::max_j
7900: 6f 75 72 6e 61 6c 0a 7d 20 5b 65 78 70 72 20 32  ournal.} [expr 2
7910: 36 31 35 2b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  615+[string leng
7920: 74 68 20 5b 70 77 64 5d 5d 5d 0a 64 6f 5f 74 65  th [pwd]]].do_te
7930: 73 74 20 70 61 67 65 72 31 2d 35 2e 34 2e 32 20  st pager1-5.4.2 
7940: 7b 0a 20 20 73 65 74 20 3a 3a 6d 61 78 5f 6a 6f  {.  set ::max_jo
7950: 75 72 6e 61 6c 20 30 0a 20 20 65 78 65 63 73 71  urnal 0.  execsq
7960: 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 73  l {.    PRAGMA s
7970: 79 6e 63 68 72 6f 6e 6f 75 73 20 3d 20 66 75 6c  ynchronous = ful
7980: 6c 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20  l;.    BEGIN;.  
7990: 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20      DELETE FROM 
79a0: 74 31 20 57 48 45 52 45 20 62 20 3d 20 27 4c 65  t1 WHERE b = 'Le
79b0: 6e 69 6e 27 3b 0a 20 20 20 20 20 20 44 45 4c 45  nin';.      DELE
79c0: 54 45 20 46 52 4f 4d 20 74 32 20 57 48 45 52 45  TE FROM t2 WHERE
79d0: 20 62 20 3d 20 27 4c 65 6e 69 6e 27 3b 0a 20 20   b = 'Lenin';.  
79e0: 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 20 20    COMMIT;.  }.  
79f0: 73 65 74 20 3a 3a 6d 61 78 5f 6a 6f 75 72 6e 61  set ::max_journa
7a00: 6c 0a 7d 20 5b 65 78 70 72 20 33 31 31 31 2b 5b  l.} [expr 3111+[
7a10: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 5b 70  string length [p
7a20: 77 64 5d 5d 5d 0a 64 62 20 63 6c 6f 73 65 0a 74  wd]]].db close.t
7a30: 76 20 64 65 6c 65 74 65 0a 0a 64 6f 5f 74 65 73  v delete..do_tes
7a40: 74 20 70 61 67 65 72 31 2d 35 2e 35 2e 31 20 7b  t pager1-5.5.1 {
7a50: 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 74 65  .  sqlite3 db te
7a60: 73 74 2e 64 62 0a 20 20 65 78 65 63 73 71 6c 20  st.db.  execsql 
7a70: 7b 20 0a 20 20 20 20 41 54 54 41 43 48 20 27 74  { .    ATTACH 't
7a80: 65 73 74 2e 64 62 32 27 20 41 53 20 61 75 78 3b  est.db2' AS aux;
7a90: 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72  .    PRAGMA jour
7aa0: 6e 61 6c 5f 6d 6f 64 65 20 3d 20 50 45 52 53 49  nal_mode = PERSI
7ab0: 53 54 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  ST;.    CREATE T
7ac0: 41 42 4c 45 20 74 33 28 61 2c 20 62 29 3b 0a 20  ABLE t3(a, b);. 
7ad0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
7ae0: 33 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62  3 SELECT randomb
7af0: 6c 6f 62 28 31 35 30 30 29 2c 20 72 61 6e 64 6f  lob(1500), rando
7b00: 6d 62 6c 6f 62 28 31 35 30 30 29 20 46 52 4f 4d  mblob(1500) FROM
7b10: 20 74 31 3b 0a 20 20 20 20 55 50 44 41 54 45 20   t1;.    UPDATE 
7b20: 74 33 20 53 45 54 20 62 20 3d 20 72 61 6e 64 6f  t3 SET b = rando
7b30: 6d 62 6c 6f 62 28 31 35 30 30 29 3b 0a 20 20 7d  mblob(1500);.  }
7b40: 0a 20 20 65 78 70 72 20 5b 66 69 6c 65 20 73 69  .  expr [file si
7b50: 7a 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e  ze test.db-journ
7b60: 61 6c 5d 20 3e 20 31 35 30 30 30 0a 7d 20 7b 31  al] > 15000.} {1
7b70: 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  }.do_test pager1
7b80: 2d 35 2e 35 2e 32 20 7b 0a 20 20 65 78 65 63 73  -5.5.2 {.  execs
7b90: 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20  ql {.    PRAGMA 
7ba0: 73 79 6e 63 68 72 6f 6e 6f 75 73 20 3d 20 66 75  synchronous = fu
7bb0: 6c 6c 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20  ll;.    BEGIN;. 
7bc0: 20 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d       DELETE FROM
7bd0: 20 74 31 20 57 48 45 52 45 20 62 20 3d 20 27 53   t1 WHERE b = 'S
7be0: 74 61 6c 69 6e 27 3b 0a 20 20 20 20 20 20 44 45  talin';.      DE
7bf0: 4c 45 54 45 20 46 52 4f 4d 20 74 32 20 57 48 45  LETE FROM t2 WHE
7c00: 52 45 20 62 20 3d 20 27 53 74 61 6c 69 6e 27 3b  RE b = 'Stalin';
7c10: 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d  .    COMMIT;.  }
7c20: 0a 20 20 66 69 6c 65 20 73 69 7a 65 20 74 65 73  .  file size tes
7c30: 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 7d 20 7b  t.db-journal.} {
7c40: 30 7d 0a 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  0}...#----------
7c50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7c60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7c70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7c80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
7c90: 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  # The following 
7ca0: 74 65 73 74 73 20 77 6f 72 6b 20 77 69 74 68 20  tests work with 
7cb0: 22 50 52 41 47 4d 41 20 6d 61 78 5f 70 61 67 65  "PRAGMA max_page
7cc0: 5f 63 6f 75 6e 74 22 0a 23 0a 64 6f 5f 74 65 73  _count".#.do_tes
7cd0: 74 20 70 61 67 65 72 31 2d 36 2e 31 20 7b 0a 20  t pager1-6.1 {. 
7ce0: 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65   faultsim_delete
7cf0: 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78  _and_reopen.  ex
7d00: 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47  ecsql {.    PRAG
7d10: 4d 41 20 61 75 74 6f 5f 76 61 63 75 75 6d 20 3d  MA auto_vacuum =
7d20: 20 6e 6f 6e 65 3b 0a 20 20 20 20 50 52 41 47 4d   none;.    PRAGM
7d30: 41 20 6d 61 78 5f 70 61 67 65 5f 63 6f 75 6e 74  A max_page_count
7d40: 20 3d 20 31 30 3b 0a 20 20 20 20 43 52 45 41 54   = 10;.    CREAT
7d50: 45 20 54 41 42 4c 45 20 74 32 28 61 2c 20 62 29  E TABLE t2(a, b)
7d60: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
7d70: 4c 45 20 74 33 28 61 2c 20 62 29 3b 0a 20 20 20  LE t3(a, b);.   
7d80: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 34   CREATE TABLE t4
7d90: 28 61 2c 20 62 29 3b 0a 20 20 20 20 43 52 45 41  (a, b);.    CREA
7da0: 54 45 20 54 41 42 4c 45 20 74 35 28 61 2c 20 62  TE TABLE t5(a, b
7db0: 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  );.    CREATE TA
7dc0: 42 4c 45 20 74 36 28 61 2c 20 62 29 3b 0a 20 20  BLE t6(a, b);.  
7dd0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
7de0: 37 28 61 2c 20 62 29 3b 0a 20 20 20 20 43 52 45  7(a, b);.    CRE
7df0: 41 54 45 20 54 41 42 4c 45 20 74 38 28 61 2c 20  ATE TABLE t8(a, 
7e00: 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  b);.    CREATE T
7e10: 41 42 4c 45 20 74 39 28 61 2c 20 62 29 3b 0a 20  ABLE t9(a, b);. 
7e20: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
7e30: 74 31 30 28 61 2c 20 62 29 3b 0a 20 20 7d 0a 7d  t10(a, b);.  }.}
7e40: 20 7b 31 30 7d 0a 64 6f 5f 63 61 74 63 68 73 71   {10}.do_catchsq
7e50: 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 36 2e  l_test pager1-6.
7e60: 32 20 7b 0a 20 20 43 52 45 41 54 45 20 54 41 42  2 {.  CREATE TAB
7e70: 4c 45 20 74 31 31 28 61 2c 20 62 29 0a 7d 20 7b  LE t11(a, b).} {
7e80: 31 20 7b 64 61 74 61 62 61 73 65 20 6f 72 20 64  1 {database or d
7e90: 69 73 6b 20 69 73 20 66 75 6c 6c 7d 7d 0a 64 6f  isk is full}}.do
7ea0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61  _execsql_test pa
7eb0: 67 65 72 31 2d 36 2e 34 20 7b 20 50 52 41 47 4d  ger1-6.4 { PRAGM
7ec0: 41 20 6d 61 78 5f 70 61 67 65 5f 63 6f 75 6e 74  A max_page_count
7ed0: 20 20 20 20 20 20 7d 20 7b 31 30 7d 0a 64 6f 5f        } {10}.do_
7ee0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67  execsql_test pag
7ef0: 65 72 31 2d 36 2e 35 20 7b 20 50 52 41 47 4d 41  er1-6.5 { PRAGMA
7f00: 20 6d 61 78 5f 70 61 67 65 5f 63 6f 75 6e 74 20   max_page_count 
7f10: 3d 20 31 35 20 7d 20 7b 31 35 7d 0a 64 6f 5f 65  = 15 } {15}.do_e
7f20: 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65  xecsql_test page
7f30: 72 31 2d 36 2e 36 20 7b 20 43 52 45 41 54 45 20  r1-6.6 { CREATE 
7f40: 54 41 42 4c 45 20 74 31 31 28 61 2c 20 62 29 20  TABLE t11(a, b) 
7f50: 20 20 20 20 7d 20 7b 7d 0a 64 6f 5f 65 78 65 63      } {}.do_exec
7f60: 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d  sql_test pager1-
7f70: 36 2e 37 20 7b 0a 20 20 42 45 47 49 4e 3b 0a 20  6.7 {.  BEGIN;. 
7f80: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
7f90: 31 31 20 56 41 4c 55 45 53 28 31 2c 20 32 29 3b  11 VALUES(1, 2);
7fa0: 0a 20 20 20 20 50 52 41 47 4d 41 20 6d 61 78 5f  .    PRAGMA max_
7fb0: 70 61 67 65 5f 63 6f 75 6e 74 20 3d 20 31 33 3b  page_count = 13;
7fc0: 0a 7d 20 7b 31 33 7d 0a 64 6f 5f 65 78 65 63 73  .} {13}.do_execs
7fd0: 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 36  ql_test pager1-6
7fe0: 2e 38 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20  .8 {.    INSERT 
7ff0: 49 4e 54 4f 20 74 31 31 20 56 41 4c 55 45 53 28  INTO t11 VALUES(
8000: 33 2c 20 34 29 3b 0a 20 20 20 20 50 52 41 47 4d  3, 4);.    PRAGM
8010: 41 20 6d 61 78 5f 70 61 67 65 5f 63 6f 75 6e 74  A max_page_count
8020: 20 3d 20 31 30 3b 0a 7d 20 7b 31 31 7d 0a 64 6f   = 10;.} {11}.do
8030: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61  _execsql_test pa
8040: 67 65 72 31 2d 36 2e 39 20 7b 20 43 4f 4d 4d 49  ger1-6.9 { COMMI
8050: 54 20 7d 20 7b 7d 0a 0a 0a 23 2d 2d 2d 2d 2d 2d  T } {}...#------
8060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
80a0: 2d 2d 2d 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77  ---.# The follow
80b0: 69 6e 67 20 74 65 73 74 73 20 77 6f 72 6b 20 77  ing tests work w
80c0: 69 74 68 20 22 50 52 41 47 4d 41 20 6a 6f 75 72  ith "PRAGMA jour
80d0: 6e 61 6c 5f 6d 6f 64 65 3d 54 52 55 4e 43 41 54  nal_mode=TRUNCAT
80e0: 45 22 20 61 6e 64 0a 23 20 22 50 52 41 47 4d 41  E" and.# "PRAGMA
80f0: 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58   locking_mode=EX
8100: 43 4c 55 53 49 56 45 22 2e 0a 23 0a 23 20 45 61  CLUSIVE"..#.# Ea
8110: 63 68 20 74 65 73 74 20 69 73 20 73 70 65 63 69  ch test is speci
8120: 66 69 65 64 20 77 69 74 68 20 35 20 76 61 72 69  fied with 5 vari
8130: 61 62 6c 65 73 2e 20 41 73 20 66 6f 6c 6c 6f 77  ables. As follow
8140: 73 3a 0a 23 0a 23 20 20 20 24 74 6e 3a 20 20 54  s:.#.#   $tn:  T
8150: 65 73 74 20 4e 75 6d 62 65 72 2e 20 55 73 65 64  est Number. Used
8160: 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   as part of the 
8170: 5b 64 6f 5f 74 65 73 74 5d 20 74 65 73 74 20 6e  [do_test] test n
8180: 61 6d 65 73 2e 0a 23 20 20 20 24 73 71 6c 3a 20  ames..#   $sql: 
8190: 53 51 4c 20 74 6f 20 65 78 65 63 75 74 65 2e 0a  SQL to execute..
81a0: 23 20 20 20 24 72 65 73 3a 20 45 78 70 65 63 74  #   $res: Expect
81b0: 65 64 20 72 65 73 75 6c 74 20 6f 66 20 65 78 65  ed result of exe
81c0: 63 75 74 69 6e 67 20 24 73 71 6c 2e 0a 23 20 20  cuting $sql..#  
81d0: 20 24 6a 73 3a 20 20 54 68 65 20 65 78 70 65 63   $js:  The expec
81e0: 74 65 64 20 73 69 7a 65 20 6f 66 20 74 68 65 20  ted size of the 
81f0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 69 6e  journal file, in
8200: 20 62 79 74 65 73 2c 20 61 66 74 65 72 20 65 78   bytes, after ex
8210: 65 63 75 74 69 6e 67 0a 23 20 20 20 20 20 20 20  ecuting.#       
8220: 20 20 74 68 65 20 53 51 4c 20 73 63 72 69 70 74    the SQL script
8230: 2e 20 4f 72 20 2d 31 20 69 66 20 74 68 65 20 6a  . Or -1 if the j
8240: 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 65 78  ournal is not ex
8250: 70 65 63 74 65 64 20 74 6f 20 65 78 69 73 74 2e  pected to exist.
8260: 0a 23 20 20 20 24 77 73 3a 20 20 54 68 65 20 65  .#   $ws:  The e
8270: 78 70 65 63 74 65 64 20 73 69 7a 65 20 6f 66 20  xpected size of 
8280: 74 68 65 20 57 41 4c 20 66 69 6c 65 2c 20 69 6e  the WAL file, in
8290: 20 62 79 74 65 73 2c 20 61 66 74 65 72 20 65 78   bytes, after ex
82a0: 65 63 75 74 69 6e 67 0a 23 20 20 20 20 20 20 20  ecuting.#       
82b0: 20 20 74 68 65 20 53 51 4c 20 73 63 72 69 70 74    the SQL script
82c0: 2e 20 4f 72 20 2d 31 20 69 66 20 74 68 65 20 57  . Or -1 if the W
82d0: 41 4c 20 69 73 20 6e 6f 74 20 65 78 70 65 63 74  AL is not expect
82e0: 65 64 20 74 6f 20 65 78 69 73 74 2e 0a 23 0a 69  ed to exist..#.i
82f0: 66 63 61 70 61 62 6c 65 20 77 61 6c 20 7b 0a 20  fcapable wal {. 
8300: 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65   faultsim_delete
8310: 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 66 6f  _and_reopen.  fo
8320: 72 65 61 63 68 20 7b 74 6e 20 73 71 6c 20 72 65  reach {tn sql re
8330: 73 20 6a 73 20 77 73 7d 20 5b 73 75 62 73 74 20  s js ws} [subst 
8340: 7b 0a 20 20 0a 20 20 20 20 31 20 20 7b 0a 20 20  {.  .    1  {.  
8350: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
8360: 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 20   t1(a, b);.     
8370: 20 50 52 41 47 4d 41 20 61 75 74 6f 5f 76 61 63   PRAGMA auto_vac
8380: 75 75 6d 3d 4f 46 46 3b 0a 20 20 20 20 20 20 50  uum=OFF;.      P
8390: 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75  RAGMA synchronou
83a0: 73 3d 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 20 20  s=NORMAL;.      
83b0: 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65  PRAGMA page_size
83c0: 3d 31 30 32 34 3b 0a 20 20 20 20 20 20 50 52 41  =1024;.      PRA
83d0: 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65  GMA locking_mode
83e0: 3d 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20  =EXCLUSIVE;.    
83f0: 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c    PRAGMA journal
8400: 5f 6d 6f 64 65 3d 54 52 55 4e 43 41 54 45 3b 0a  _mode=TRUNCATE;.
8410: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
8420: 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20 32  O t1 VALUES(1, 2
8430: 29 3b 0a 20 20 20 20 7d 20 7b 65 78 63 6c 75 73  );.    } {exclus
8440: 69 76 65 20 74 72 75 6e 63 61 74 65 7d 20 30 20  ive truncate} 0 
8450: 2d 31 0a 20 20 0a 20 20 20 20 32 20 20 7b 0a 20  -1.  .    2  {. 
8460: 20 20 20 20 20 42 45 47 49 4e 20 49 4d 4d 45 44       BEGIN IMMED
8470: 49 41 54 45 3b 0a 20 20 20 20 20 20 20 20 53 45  IATE;.        SE
8480: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a  LECT * FROM t1;.
8490: 20 20 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20        COMMIT;.  
84a0: 20 20 7d 20 7b 31 20 32 7d 20 30 20 2d 31 0a 20    } {1 2} 0 -1. 
84b0: 20 0a 20 20 20 20 33 20 20 7b 0a 20 20 20 20 20   .    3  {.     
84c0: 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 20 20   BEGIN;.        
84d0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
84e0: 3b 0a 20 20 20 20 20 20 43 4f 4d 4d 49 54 3b 0a  ;.      COMMIT;.
84f0: 20 20 20 20 7d 20 7b 31 20 32 7d 20 30 20 2d 31      } {1 2} 0 -1
8500: 0a 20 20 0a 20 20 20 20 34 20 20 7b 20 50 52 41  .  .    4  { PRA
8510: 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
8520: 20 3d 20 57 41 4c 20 7d 20 20 20 20 77 61 6c 20   = WAL }    wal 
8530: 20 20 20 2d 31 20 2d 31 0a 20 20 20 20 35 20 20     -1 -1.    5  
8540: 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31  { INSERT INTO t1
8550: 20 56 41 4c 55 45 53 28 33 2c 20 34 29 20 7d 20   VALUES(3, 4) } 
8560: 20 7b 7d 20 20 20 20 20 2d 31 20 5b 77 61 6c 5f   {}     -1 [wal_
8570: 66 69 6c 65 5f 73 69 7a 65 20 31 20 31 30 32 34  file_size 1 1024
8580: 5d 0a 20 20 20 20 36 20 20 7b 20 50 52 41 47 4d  ].    6  { PRAGM
8590: 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 20 3d  A locking_mode =
85a0: 20 4e 4f 52 4d 41 4c 20 7d 20 6e 6f 72 6d 61 6c   NORMAL } normal
85b0: 20 2d 31 20 5b 77 61 6c 5f 66 69 6c 65 5f 73 69   -1 [wal_file_si
85c0: 7a 65 20 31 20 31 30 32 34 5d 0a 20 20 20 20 37  ze 1 1024].    7
85d0: 20 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20    { INSERT INTO 
85e0: 74 31 20 56 41 4c 55 45 53 28 35 2c 20 36 29 3b  t1 VALUES(5, 6);
85f0: 20 7d 20 7b 7d 20 20 20 20 20 2d 31 20 5b 77 61   } {}     -1 [wa
8600: 6c 5f 66 69 6c 65 5f 73 69 7a 65 20 32 20 31 30  l_file_size 2 10
8610: 32 34 5d 0a 20 20 0a 20 20 20 20 38 20 20 7b 20  24].  .    8  { 
8620: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
8630: 6f 64 65 20 3d 20 54 52 55 4e 43 41 54 45 20 7d  ode = TRUNCATE }
8640: 20 74 72 75 6e 63 61 74 65 20 20 20 20 20 20 20   truncate       
8650: 20 20 20 30 20 2d 31 0a 20 20 20 20 39 20 20 7b     0 -1.    9  {
8660: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
8670: 56 41 4c 55 45 53 28 37 2c 20 38 29 20 7d 20 20  VALUES(7, 8) }  
8680: 20 20 7b 7d 20 20 20 20 20 20 20 20 20 20 20 20    {}            
8690: 20 20 20 20 30 20 2d 31 0a 20 20 20 20 31 30 20      0 -1.    10 
86a0: 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  { SELECT * FROM 
86b0: 74 31 20 7d 20 20 20 20 20 20 20 20 20 20 20 20  t1 }            
86c0: 20 20 20 7b 31 20 32 20 33 20 34 20 35 20 36 20     {1 2 3 4 5 6 
86d0: 37 20 38 7d 20 30 20 2d 31 0a 20 20 0a 20 20 7d  7 8} 0 -1.  .  }
86e0: 5d 20 7b 0a 20 20 20 20 64 6f 5f 65 78 65 63 73  ] {.    do_execs
86f0: 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 37  ql_test pager1-7
8700: 2e 31 2e 24 74 6e 2e 31 20 24 73 71 6c 20 24 72  .1.$tn.1 $sql $r
8710: 65 73 0a 20 20 20 20 63 61 74 63 68 20 7b 20 73  es.    catch { s
8720: 65 74 20 4a 20 2d 31 20 3b 20 73 65 74 20 4a 20  et J -1 ; set J 
8730: 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e  [file size test.
8740: 64 62 2d 6a 6f 75 72 6e 61 6c 5d 20 7d 0a 20 20  db-journal] }.  
8750: 20 20 63 61 74 63 68 20 7b 20 73 65 74 20 57 20    catch { set W 
8760: 2d 31 20 3b 20 73 65 74 20 57 20 5b 66 69 6c 65  -1 ; set W [file
8770: 20 73 69 7a 65 20 74 65 73 74 2e 64 62 2d 77 61   size test.db-wa
8780: 6c 5d 20 7d 0a 20 20 20 20 64 6f 5f 74 65 73 74  l] }.    do_test
8790: 20 70 61 67 65 72 31 2d 37 2e 31 2e 24 74 6e 2e   pager1-7.1.$tn.
87a0: 32 20 7b 20 6c 69 73 74 20 24 4a 20 24 57 20 7d  2 { list $J $W }
87b0: 20 5b 6c 69 73 74 20 24 6a 73 20 24 77 73 5d 0a   [list $js $ws].
87c0: 20 20 7d 0a 7d 0a 0a 64 6f 5f 74 65 73 74 20 70    }.}..do_test p
87d0: 61 67 65 72 31 2d 37 2e 32 2e 31 20 7b 0a 20 20  ager1-7.2.1 {.  
87e0: 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f  faultsim_delete_
87f0: 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65  and_reopen.  exe
8800: 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d  csql {.    PRAGM
8810: 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 20 3d  A locking_mode =
8820: 20 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20   EXCLUSIVE;.    
8830: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
8840: 61 2c 20 62 29 3b 0a 20 20 20 20 42 45 47 49 4e  a, b);.    BEGIN
8850: 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 6a  ;.      PRAGMA j
8860: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 64 65  ournal_mode = de
8870: 6c 65 74 65 3b 0a 20 20 20 20 20 20 50 52 41 47  lete;.      PRAG
8880: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  MA journal_mode 
8890: 3d 20 74 72 75 6e 63 61 74 65 3b 0a 20 20 7d 0a  = truncate;.  }.
88a0: 7d 20 7b 65 78 63 6c 75 73 69 76 65 20 64 65 6c  } {exclusive del
88b0: 65 74 65 20 74 72 75 6e 63 61 74 65 7d 0a 64 6f  ete truncate}.do
88c0: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 37 2e 32  _test pager1-7.2
88d0: 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .2 {.  execsql {
88e0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
88f0: 56 41 4c 55 45 53 28 31 2c 20 32 29 20 7d 0a 20  VALUES(1, 2) }. 
8900: 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d   execsql { PRAGM
8910: 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d  A journal_mode =
8920: 20 70 65 72 73 69 73 74 20 7d 0a 7d 20 7b 74 72   persist }.} {tr
8930: 75 6e 63 61 74 65 7d 0a 64 6f 5f 74 65 73 74 20  uncate}.do_test 
8940: 70 61 67 65 72 31 2d 37 2e 32 2e 33 20 7b 0a 20  pager1-7.2.3 {. 
8950: 20 65 78 65 63 73 71 6c 20 7b 20 43 4f 4d 4d 49   execsql { COMMI
8960: 54 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  T }.  execsql {.
8970: 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e      PRAGMA journ
8980: 61 6c 5f 6d 6f 64 65 20 3d 20 70 65 72 73 69 73  al_mode = persis
8990: 74 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f  t;.    PRAGMA jo
89a0: 75 72 6e 61 6c 5f 73 69 7a 65 5f 6c 69 6d 69 74  urnal_size_limit
89b0: 3b 0a 20 20 7d 0a 7d 20 7b 70 65 72 73 69 73 74  ;.  }.} {persist
89c0: 20 2d 31 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d   -1}..#---------
89d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
89e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
89f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8a10: 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .# The following
8a20: 20 74 65 73 74 73 2c 20 70 61 67 65 72 31 2d 38   tests, pager1-8
8a30: 2e 2a 2c 20 74 65 73 74 20 74 68 61 74 20 74 68  .*, test that th
8a40: 65 20 73 70 65 63 69 61 6c 20 66 69 6c 65 6e 61  e special filena
8a50: 6d 65 73 20 0a 23 20 22 3a 6d 65 6d 6f 72 79 3a  mes .# ":memory:
8a60: 22 20 61 6e 64 20 22 22 20 6f 70 65 6e 20 74 65  " and "" open te
8a70: 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65  mporary database
8a80: 73 2e 0a 23 0a 66 6f 72 65 61 63 68 20 7b 74 6e  s..#.foreach {tn
8a90: 20 66 69 6c 65 6e 61 6d 65 7d 20 7b 0a 20 20 31   filename} {.  1
8aa0: 20 3a 6d 65 6d 6f 72 79 3a 0a 20 20 32 20 22 22   :memory:.  2 ""
8ab0: 0a 7d 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 70  .} {.  do_test p
8ac0: 61 67 65 72 31 2d 38 2e 24 74 6e 2e 31 20 7b 0a  ager1-8.$tn.1 {.
8ad0: 20 20 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c      faultsim_del
8ae0: 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20  ete_and_reopen. 
8af0: 20 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 20 20     db close.    
8b00: 73 71 6c 69 74 65 33 20 64 62 20 24 66 69 6c 65  sqlite3 db $file
8b10: 6e 61 6d 65 0a 20 20 20 20 65 78 65 63 73 71 6c  name.    execsql
8b20: 20 7b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20   {.      PRAGMA 
8b30: 61 75 74 6f 5f 76 61 63 75 75 6d 20 3d 20 31 3b  auto_vacuum = 1;
8b40: 0a 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41  .      CREATE TA
8b50: 42 4c 45 20 78 31 28 78 29 3b 0a 20 20 20 20 20  BLE x1(x);.     
8b60: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 31 20   INSERT INTO x1 
8b70: 56 41 4c 55 45 53 28 27 43 68 61 72 6c 65 73 27  VALUES('Charles'
8b80: 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  );.      INSERT 
8b90: 49 4e 54 4f 20 78 31 20 56 41 4c 55 45 53 28 27  INTO x1 VALUES('
8ba0: 4a 61 6d 65 73 27 29 3b 0a 20 20 20 20 20 20 49  James');.      I
8bb0: 4e 53 45 52 54 20 49 4e 54 4f 20 78 31 20 56 41  NSERT INTO x1 VA
8bc0: 4c 55 45 53 28 27 4d 61 72 79 27 29 3b 0a 20 20  LUES('Mary');.  
8bd0: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
8be0: 4d 20 78 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 20  M x1;.    }.  } 
8bf0: 7b 43 68 61 72 6c 65 73 20 4a 61 6d 65 73 20 4d  {Charles James M
8c00: 61 72 79 7d 0a 0a 20 20 64 6f 5f 74 65 73 74 20  ary}..  do_test 
8c10: 70 61 67 65 72 31 2d 38 2e 24 74 6e 2e 32 20 7b  pager1-8.$tn.2 {
8c20: 0a 20 20 20 20 73 71 6c 69 74 65 33 20 64 62 32  .    sqlite3 db2
8c30: 20 24 66 69 6c 65 6e 61 6d 65 0a 20 20 20 20 63   $filename.    c
8c40: 61 74 63 68 73 71 6c 20 7b 20 53 45 4c 45 43 54  atchsql { SELECT
8c50: 20 2a 20 46 52 4f 4d 20 78 31 20 7d 20 64 62 32   * FROM x1 } db2
8c60: 0a 20 20 7d 20 7b 31 20 7b 6e 6f 20 73 75 63 68  .  } {1 {no such
8c70: 20 74 61 62 6c 65 3a 20 78 31 7d 7d 0a 0a 20 20   table: x1}}..  
8c80: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
8c90: 70 61 67 65 72 31 2d 38 2e 24 74 6e 2e 33 20 7b  pager1-8.$tn.3 {
8ca0: 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20  .    BEGIN;.    
8cb0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 31    INSERT INTO x1
8cc0: 20 56 41 4c 55 45 53 28 27 57 69 6c 6c 69 61 6d   VALUES('William
8cd0: 27 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  ');.      INSERT
8ce0: 20 49 4e 54 4f 20 78 31 20 56 41 4c 55 45 53 28   INTO x1 VALUES(
8cf0: 27 41 6e 6e 65 27 29 3b 0a 20 20 20 20 52 4f 4c  'Anne');.    ROL
8d00: 4c 42 41 43 4b 3b 0a 20 20 7d 20 7b 7d 0a 7d 0a  LBACK;.  } {}.}.
8d10: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
8d20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68  -----------.# Th
8d60: 65 20 6e 65 78 74 20 62 6c 6f 63 6b 20 6f 66 20  e next block of 
8d70: 74 65 73 74 73 20 2d 20 70 61 67 65 72 31 2d 39  tests - pager1-9
8d80: 2e 2a 20 2d 20 64 65 61 6c 20 77 69 74 68 20 69  .* - deal with i
8d90: 6e 74 65 72 61 63 74 69 6f 6e 73 20 62 65 74 77  nteractions betw
8da0: 65 65 6e 0a 23 20 74 68 65 20 70 61 67 65 72 20  een.# the pager 
8db0: 61 6e 64 20 74 68 65 20 62 61 63 6b 75 70 20 41  and the backup A
8dc0: 50 49 2e 20 54 65 73 74 20 63 61 73 65 73 3a 0a  PI. Test cases:.
8dd0: 23 0a 23 20 20 20 70 61 67 65 72 31 2d 39 2e 31  #.#   pager1-9.1
8de0: 2e 2a 3a 20 54 65 73 74 20 74 68 61 74 20 61 20  .*: Test that a 
8df0: 62 61 63 6b 75 70 20 63 6f 6d 70 6c 65 74 65 73  backup completes
8e00: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 65 76   successfully ev
8e10: 65 6e 20 69 66 20 74 68 65 0a 23 20 20 20 20 20  en if the.#     
8e20: 20 20 20 20 20 20 20 20 20 20 20 20 73 6f 75 72              sour
8e30: 63 65 20 64 62 20 69 73 20 77 72 69 74 74 65 6e  ce db is written
8e40: 20 74 6f 20 64 75 72 69 6e 67 20 74 68 65 20 62   to during the b
8e50: 61 63 6b 75 70 20 6f 70 2e 0a 23 0a 23 20 20 20  ackup op..#.#   
8e60: 70 61 67 65 72 31 2d 39 2e 32 2e 2a 3a 20 54 65  pager1-9.2.*: Te
8e70: 73 74 20 74 68 61 74 20 61 20 62 61 63 6b 75 70  st that a backup
8e80: 20 63 6f 6d 70 6c 65 74 65 73 20 73 75 63 63 65   completes succe
8e90: 73 73 66 75 6c 6c 79 20 65 76 65 6e 20 69 66 20  ssfully even if 
8ea0: 74 68 65 0a 23 20 20 20 20 20 20 20 20 20 20 20  the.#           
8eb0: 20 20 20 20 20 20 73 6f 75 72 63 65 20 64 62 20        source db 
8ec0: 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 61 6e  is written to an
8ed0: 64 20 74 68 65 6e 20 72 6f 6c 6c 65 64 20 62 61  d then rolled ba
8ee0: 63 6b 20 64 75 72 69 6e 67 20 61 20 0a 23 20 20  ck during a .#  
8ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
8f00: 61 63 6b 75 70 20 6f 70 65 72 61 74 69 6f 6e 2e  ackup operation.
8f10: 0a 23 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  .#.do_test pager
8f20: 31 2d 39 2e 30 2e 31 20 7b 0a 20 20 66 61 75 6c  1-9.0.1 {.  faul
8f30: 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f  tsim_delete_and_
8f40: 72 65 6f 70 65 6e 0a 20 20 64 62 20 66 75 6e 63  reopen.  db func
8f50: 20 61 5f 73 74 72 69 6e 67 20 61 5f 73 74 72 69   a_string a_stri
8f60: 6e 67 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  ng.  execsql {. 
8f70: 20 20 20 50 52 41 47 4d 41 20 63 61 63 68 65 5f     PRAGMA cache_
8f80: 73 69 7a 65 20 3d 20 31 30 3b 0a 20 20 20 20 42  size = 10;.    B
8f90: 45 47 49 4e 3b 0a 20 20 20 20 20 20 43 52 45 41  EGIN;.      CREA
8fa0: 54 45 20 54 41 42 4c 45 20 61 62 28 61 2c 20 62  TE TABLE ab(a, b
8fb0: 2c 20 55 4e 49 51 55 45 28 61 2c 20 62 29 29 3b  , UNIQUE(a, b));
8fc0: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
8fd0: 54 4f 20 61 62 20 56 41 4c 55 45 53 28 20 61 5f  TO ab VALUES( a_
8fe0: 73 74 72 69 6e 67 28 32 30 30 29 2c 20 61 5f 73  string(200), a_s
8ff0: 74 72 69 6e 67 28 33 30 30 29 20 29 3b 0a 20 20  tring(300) );.  
9000: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
9010: 61 62 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69  ab SELECT a_stri
9020: 6e 67 28 32 30 30 29 2c 20 61 5f 73 74 72 69 6e  ng(200), a_strin
9030: 67 28 33 30 30 29 20 46 52 4f 4d 20 61 62 3b 0a  g(300) FROM ab;.
9040: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
9050: 4f 20 61 62 20 53 45 4c 45 43 54 20 61 5f 73 74  O ab SELECT a_st
9060: 72 69 6e 67 28 32 30 30 29 2c 20 61 5f 73 74 72  ring(200), a_str
9070: 69 6e 67 28 33 30 30 29 20 46 52 4f 4d 20 61 62  ing(300) FROM ab
9080: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
9090: 4e 54 4f 20 61 62 20 53 45 4c 45 43 54 20 61 5f  NTO ab SELECT a_
90a0: 73 74 72 69 6e 67 28 32 30 30 29 2c 20 61 5f 73  string(200), a_s
90b0: 74 72 69 6e 67 28 33 30 30 29 20 46 52 4f 4d 20  tring(300) FROM 
90c0: 61 62 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  ab;.      INSERT
90d0: 20 49 4e 54 4f 20 61 62 20 53 45 4c 45 43 54 20   INTO ab SELECT 
90e0: 61 5f 73 74 72 69 6e 67 28 32 30 30 29 2c 20 61  a_string(200), a
90f0: 5f 73 74 72 69 6e 67 28 33 30 30 29 20 46 52 4f  _string(300) FRO
9100: 4d 20 61 62 3b 0a 20 20 20 20 20 20 49 4e 53 45  M ab;.      INSE
9110: 52 54 20 49 4e 54 4f 20 61 62 20 53 45 4c 45 43  RT INTO ab SELEC
9120: 54 20 61 5f 73 74 72 69 6e 67 28 32 30 30 29 2c  T a_string(200),
9130: 20 61 5f 73 74 72 69 6e 67 28 33 30 30 29 20 46   a_string(300) F
9140: 52 4f 4d 20 61 62 3b 0a 20 20 20 20 20 20 49 4e  ROM ab;.      IN
9150: 53 45 52 54 20 49 4e 54 4f 20 61 62 20 53 45 4c  SERT INTO ab SEL
9160: 45 43 54 20 61 5f 73 74 72 69 6e 67 28 32 30 30  ECT a_string(200
9170: 29 2c 20 61 5f 73 74 72 69 6e 67 28 33 30 30 29  ), a_string(300)
9180: 20 46 52 4f 4d 20 61 62 3b 0a 20 20 20 20 20 20   FROM ab;.      
9190: 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 20 53  INSERT INTO ab S
91a0: 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 32  ELECT a_string(2
91b0: 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 33 30  00), a_string(30
91c0: 30 29 20 46 52 4f 4d 20 61 62 3b 0a 20 20 20 20  0) FROM ab;.    
91d0: 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 7d 20 7b 7d  COMMIT;.  }.} {}
91e0: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
91f0: 39 2e 30 2e 32 20 7b 0a 20 20 73 71 6c 69 74 65  9.0.2 {.  sqlite
9200: 33 20 64 62 32 20 74 65 73 74 2e 64 62 32 0a 20  3 db2 test.db2. 
9210: 20 64 62 32 20 65 76 61 6c 20 7b 20 50 52 41 47   db2 eval { PRAG
9220: 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 20 3d 20  MA cache_size = 
9230: 31 30 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 62  10 }.  sqlite3_b
9240: 61 63 6b 75 70 20 42 20 64 62 32 20 6d 61 69 6e  ackup B db2 main
9250: 20 64 62 20 6d 61 69 6e 0a 20 20 6c 69 73 74 20   db main.  list 
9260: 5b 42 20 73 74 65 70 20 31 30 30 30 30 5d 20 5b  [B step 10000] [
9270: 42 20 66 69 6e 69 73 68 5d 0a 7d 20 7b 53 51 4c  B finish].} {SQL
9280: 49 54 45 5f 44 4f 4e 45 20 53 51 4c 49 54 45 5f  ITE_DONE SQLITE_
9290: 4f 4b 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  OK}.do_test page
92a0: 72 31 2d 39 2e 30 2e 33 20 7b 0a 20 64 62 20 6f  r1-9.0.3 {. db o
92b0: 6e 65 20 7b 53 45 4c 45 43 54 20 6d 64 35 73 75  ne {SELECT md5su
92c0: 6d 28 61 2c 20 62 29 20 46 52 4f 4d 20 61 62 7d  m(a, b) FROM ab}
92d0: 0a 7d 20 5b 64 62 32 20 6f 6e 65 20 7b 53 45 4c  .} [db2 one {SEL
92e0: 45 43 54 20 6d 64 35 73 75 6d 28 61 2c 20 62 29  ECT md5sum(a, b)
92f0: 20 46 52 4f 4d 20 61 62 7d 5d 0a 0a 64 6f 5f 74   FROM ab}]..do_t
9300: 65 73 74 20 70 61 67 65 72 31 2d 39 2e 31 2e 31  est pager1-9.1.1
9310: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 55   {.  execsql { U
9320: 50 44 41 54 45 20 61 62 20 53 45 54 20 61 20 3d  PDATE ab SET a =
9330: 20 61 5f 73 74 72 69 6e 67 28 32 30 31 29 20 7d   a_string(201) }
9340: 0a 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75  .  sqlite3_backu
9350: 70 20 42 20 64 62 32 20 6d 61 69 6e 20 64 62 20  p B db2 main db 
9360: 6d 61 69 6e 0a 20 20 42 20 73 74 65 70 20 33 30  main.  B step 30
9370: 0a 7d 20 7b 53 51 4c 49 54 45 5f 4f 4b 7d 0a 64  .} {SQLITE_OK}.d
9380: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 39 2e  o_test pager1-9.
9390: 31 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  1.2 {.  execsql 
93a0: 7b 20 55 50 44 41 54 45 20 61 62 20 53 45 54 20  { UPDATE ab SET 
93b0: 62 20 3d 20 61 5f 73 74 72 69 6e 67 28 33 30 31  b = a_string(301
93c0: 29 20 7d 0a 20 20 6c 69 73 74 20 5b 42 20 73 74  ) }.  list [B st
93d0: 65 70 20 31 30 30 30 30 5d 20 5b 42 20 66 69 6e  ep 10000] [B fin
93e0: 69 73 68 5d 0a 7d 20 7b 53 51 4c 49 54 45 5f 44  ish].} {SQLITE_D
93f0: 4f 4e 45 20 53 51 4c 49 54 45 5f 4f 4b 7d 0a 64  ONE SQLITE_OK}.d
9400: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 39 2e  o_test pager1-9.
9410: 31 2e 33 20 7b 0a 20 64 62 20 6f 6e 65 20 7b 53  1.3 {. db one {S
9420: 45 4c 45 43 54 20 6d 64 35 73 75 6d 28 61 2c 20  ELECT md5sum(a, 
9430: 62 29 20 46 52 4f 4d 20 61 62 7d 0a 7d 20 5b 64  b) FROM ab}.} [d
9440: 62 32 20 6f 6e 65 20 7b 53 45 4c 45 43 54 20 6d  b2 one {SELECT m
9450: 64 35 73 75 6d 28 61 2c 20 62 29 20 46 52 4f 4d  d5sum(a, b) FROM
9460: 20 61 62 7d 5d 0a 64 6f 5f 74 65 73 74 20 70 61   ab}].do_test pa
9470: 67 65 72 31 2d 39 2e 31 2e 34 20 7b 20 65 78 65  ger1-9.1.4 { exe
9480: 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 63 6f  csql { SELECT co
9490: 75 6e 74 28 2a 29 20 46 52 4f 4d 20 61 62 20 7d  unt(*) FROM ab }
94a0: 20 7d 20 7b 31 32 38 7d 0a 0a 64 6f 5f 74 65 73   } {128}..do_tes
94b0: 74 20 70 61 67 65 72 31 2d 39 2e 32 2e 31 20 7b  t pager1-9.2.1 {
94c0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 55 50 44  .  execsql { UPD
94d0: 41 54 45 20 61 62 20 53 45 54 20 61 20 3d 20 61  ATE ab SET a = a
94e0: 5f 73 74 72 69 6e 67 28 32 30 32 29 20 7d 0a 20  _string(202) }. 
94f0: 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20   sqlite3_backup 
9500: 42 20 64 62 32 20 6d 61 69 6e 20 64 62 20 6d 61  B db2 main db ma
9510: 69 6e 0a 20 20 42 20 73 74 65 70 20 33 30 0a 7d  in.  B step 30.}
9520: 20 7b 53 51 4c 49 54 45 5f 4f 4b 7d 0a 64 6f 5f   {SQLITE_OK}.do_
9530: 74 65 73 74 20 70 61 67 65 72 31 2d 39 2e 32 2e  test pager1-9.2.
9540: 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  2 {.  execsql { 
9550: 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20  .    BEGIN;.    
9560: 20 20 55 50 44 41 54 45 20 61 62 20 53 45 54 20    UPDATE ab SET 
9570: 62 20 3d 20 61 5f 73 74 72 69 6e 67 28 33 30 31  b = a_string(301
9580: 29 3b 0a 20 20 20 20 52 4f 4c 4c 42 41 43 4b 3b  );.    ROLLBACK;
9590: 0a 20 20 7d 0a 20 20 6c 69 73 74 20 5b 42 20 73  .  }.  list [B s
95a0: 74 65 70 20 31 30 30 30 30 5d 20 5b 42 20 66 69  tep 10000] [B fi
95b0: 6e 69 73 68 5d 0a 7d 20 7b 53 51 4c 49 54 45 5f  nish].} {SQLITE_
95c0: 44 4f 4e 45 20 53 51 4c 49 54 45 5f 4f 4b 7d 0a  DONE SQLITE_OK}.
95d0: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 39  do_test pager1-9
95e0: 2e 32 2e 33 20 7b 0a 20 64 62 20 6f 6e 65 20 7b  .2.3 {. db one {
95f0: 53 45 4c 45 43 54 20 6d 64 35 73 75 6d 28 61 2c  SELECT md5sum(a,
9600: 20 62 29 20 46 52 4f 4d 20 61 62 7d 0a 7d 20 5b   b) FROM ab}.} [
9610: 64 62 32 20 6f 6e 65 20 7b 53 45 4c 45 43 54 20  db2 one {SELECT 
9620: 6d 64 35 73 75 6d 28 61 2c 20 62 29 20 46 52 4f  md5sum(a, b) FRO
9630: 4d 20 61 62 7d 5d 0a 64 6f 5f 74 65 73 74 20 70  M ab}].do_test p
9640: 61 67 65 72 31 2d 39 2e 32 2e 34 20 7b 20 65 78  ager1-9.2.4 { ex
9650: 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 63  ecsql { SELECT c
9660: 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 61 62 20  ount(*) FROM ab 
9670: 7d 20 7d 20 7b 31 32 38 7d 0a 64 62 20 63 6c 6f  } } {128}.db clo
9680: 73 65 0a 64 62 32 20 63 6c 6f 73 65 0a 0a 64 6f  se.db2 close..do
9690: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 39 2e 33  _test pager1-9.3
96a0: 2e 31 20 7b 0a 20 20 74 65 73 74 76 66 73 20 74  .1 {.  testvfs t
96b0: 76 20 2d 64 65 66 61 75 6c 74 20 31 0a 20 20 74  v -default 1.  t
96c0: 76 20 73 65 63 74 6f 72 73 69 7a 65 20 34 30 39  v sectorsize 409
96d0: 36 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c  6.  faultsim_del
96e0: 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 0a  ete_and_reopen..
96f0: 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47    execsql { PRAG
9700: 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20 31  MA page_size = 1
9710: 30 32 34 20 7d 0a 20 20 66 6f 72 20 7b 73 65 74  024 }.  for {set
9720: 20 69 69 20 30 7d 20 7b 24 69 69 20 3c 20 34 7d   ii 0} {$ii < 4}
9730: 20 7b 69 6e 63 72 20 69 69 7d 20 7b 20 65 78 65   {incr ii} { exe
9740: 63 73 71 6c 20 22 43 52 45 41 54 45 20 54 41 42  csql "CREATE TAB
9750: 4c 45 20 74 24 7b 69 69 7d 28 61 2c 20 62 29 22  LE t${ii}(a, b)"
9760: 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20   }.} {}.do_test 
9770: 70 61 67 65 72 31 2d 39 2e 33 2e 32 20 7b 0a 20  pager1-9.3.2 {. 
9780: 20 73 71 6c 69 74 65 33 20 64 62 32 20 74 65 73   sqlite3 db2 tes
9790: 74 2e 64 62 32 0a 0a 20 20 65 78 65 63 73 71 6c  t.db2..  execsql
97a0: 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 70 61   {.    PRAGMA pa
97b0: 67 65 5f 73 69 7a 65 20 3d 20 34 30 39 36 3b 0a  ge_size = 4096;.
97c0: 20 20 20 20 50 52 41 47 4d 41 20 73 79 6e 63 68      PRAGMA synch
97d0: 72 6f 6e 6f 75 73 20 3d 20 4f 46 46 3b 0a 20 20  ronous = OFF;.  
97e0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
97f0: 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 43 52 45  1(a, b);.    CRE
9800: 41 54 45 20 54 41 42 4c 45 20 74 32 28 61 2c 20  ATE TABLE t2(a, 
9810: 62 29 3b 0a 20 20 7d 20 64 62 32 0a 0a 20 20 73  b);.  } db2..  s
9820: 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 42 20  qlite3_backup B 
9830: 64 62 32 20 6d 61 69 6e 20 64 62 20 6d 61 69 6e  db2 main db main
9840: 0a 20 20 42 20 73 74 65 70 20 33 30 0a 20 20 6c  .  B step 30.  l
9850: 69 73 74 20 5b 42 20 73 74 65 70 20 31 30 30 30  ist [B step 1000
9860: 30 5d 20 5b 42 20 66 69 6e 69 73 68 5d 0a 7d 20  0] [B finish].} 
9870: 7b 53 51 4c 49 54 45 5f 44 4f 4e 45 20 53 51 4c  {SQLITE_DONE SQL
9880: 49 54 45 5f 4f 4b 7d 0a 64 6f 5f 74 65 73 74 20  ITE_OK}.do_test 
9890: 70 61 67 65 72 31 2d 39 2e 33 2e 33 20 7b 0a 20  pager1-9.3.3 {. 
98a0: 20 64 62 32 20 63 6c 6f 73 65 0a 20 20 64 62 20   db2 close.  db 
98b0: 63 6c 6f 73 65 0a 20 20 74 76 20 64 65 6c 65 74  close.  tv delet
98c0: 65 0a 20 20 66 69 6c 65 20 73 69 7a 65 20 74 65  e.  file size te
98d0: 73 74 2e 64 62 32 0a 7d 20 5b 66 69 6c 65 20 73  st.db2.} [file s
98e0: 69 7a 65 20 74 65 73 74 2e 64 62 5d 0a 0a 64 6f  ize test.db]..do
98f0: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 39 2e 34  _test pager1-9.4
9900: 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f  .1 {.  faultsim_
9910: 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65  delete_and_reope
9920: 6e 0a 20 20 73 71 6c 69 74 65 33 20 64 62 32 20  n.  sqlite3 db2 
9930: 74 65 73 74 2e 64 62 32 0a 20 20 65 78 65 63 73  test.db2.  execs
9940: 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20  ql {.    PRAGMA 
9950: 70 61 67 65 5f 73 69 7a 65 20 3d 20 34 30 39 36  page_size = 4096
9960: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
9970: 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20  LE t1(a, b);.   
9980: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32   CREATE TABLE t2
9990: 28 61 2c 20 62 29 3b 0a 20 20 7d 20 64 62 32 0a  (a, b);.  } db2.
99a0: 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70    sqlite3_backup
99b0: 20 42 20 64 62 32 20 6d 61 69 6e 20 64 62 20 6d   B db2 main db m
99c0: 61 69 6e 0a 20 20 6c 69 73 74 20 5b 42 20 73 74  ain.  list [B st
99d0: 65 70 20 31 30 30 30 30 5d 20 5b 42 20 66 69 6e  ep 10000] [B fin
99e0: 69 73 68 5d 0a 7d 20 7b 53 51 4c 49 54 45 5f 44  ish].} {SQLITE_D
99f0: 4f 4e 45 20 53 51 4c 49 54 45 5f 4f 4b 7d 0a 64  ONE SQLITE_OK}.d
9a00: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 39 2e  o_test pager1-9.
9a10: 34 2e 32 20 7b 0a 20 20 6c 69 73 74 20 5b 66 69  4.2 {.  list [fi
9a20: 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 32  le size test.db2
9a30: 5d 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73  ] [file size tes
9a40: 74 2e 64 62 5d 0a 7d 20 7b 30 20 30 7d 0a 64 62  t.db].} {0 0}.db
9a50: 32 20 63 6c 6f 73 65 0a 0a 23 2d 2d 2d 2d 2d 2d  2 close..#------
9a60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9a70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9a80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9aa0: 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68 61 74 20  ---.# Test that 
9ab0: 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68  regardless of th
9ac0: 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
9ad0: 20 62 79 20 78 53 65 63 74 6f 72 53 69 7a 65 28   by xSectorSize(
9ae0: 29 2c 20 74 68 65 0a 23 20 6d 69 6e 69 6d 75 6d  ), the.# minimum
9af0: 20 65 66 66 65 63 74 69 76 65 20 73 65 63 74 6f   effective secto
9b00: 72 2d 73 69 7a 65 20 69 73 20 35 31 32 20 61 6e  r-size is 512 an
9b10: 64 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 36 35  d the maximum 65
9b20: 35 33 36 20 62 79 74 65 73 2e 0a 23 0a 74 65 73  536 bytes..#.tes
9b30: 74 76 66 73 20 74 76 20 2d 64 65 66 61 75 6c 74  tvfs tv -default
9b40: 20 31 0a 66 6f 72 65 61 63 68 20 73 65 63 74 6f   1.foreach secto
9b50: 72 73 69 7a 65 20 7b 0a 20 20 20 20 33 32 20 20  rsize {.    32  
9b60: 20 36 34 20 20 20 31 32 38 20 20 20 32 35 36 20   64   128   256 
9b70: 20 20 35 31 32 20 20 20 31 30 32 34 20 20 20 32    512   1024   2
9b80: 30 34 38 20 0a 20 20 20 20 34 30 39 36 20 38 31  048 .    4096 81
9b90: 39 32 20 31 36 33 38 34 20 33 32 37 36 38 20 36  92 16384 32768 6
9ba0: 35 35 33 36 20 31 33 31 30 37 32 20 32 36 32 31  5536 131072 2621
9bb0: 34 34 0a 7d 20 7b 0a 20 20 74 76 20 73 65 63 74  44.} {.  tv sect
9bc0: 6f 72 73 69 7a 65 20 24 73 65 63 74 6f 72 73 69  orsize $sectorsi
9bd0: 7a 65 0a 20 20 73 65 74 20 65 66 66 20 24 73 65  ze.  set eff $se
9be0: 63 74 6f 72 73 69 7a 65 0a 20 20 69 66 20 7b 24  ctorsize.  if {$
9bf0: 73 65 63 74 6f 72 73 69 7a 65 20 3c 20 35 31 32  sectorsize < 512
9c00: 7d 20 20 20 7b 20 73 65 74 20 65 66 66 20 35 31  }   { set eff 51
9c10: 32 20 7d 0a 20 20 69 66 20 7b 24 73 65 63 74 6f  2 }.  if {$secto
9c20: 72 73 69 7a 65 20 3e 20 36 35 35 33 36 7d 20 7b  rsize > 65536} {
9c30: 20 73 65 74 20 65 66 66 20 36 35 35 33 36 20 7d   set eff 65536 }
9c40: 0a 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65  ..  do_test page
9c50: 72 31 2d 31 30 2e 24 73 65 63 74 6f 72 73 69 7a  r1-10.$sectorsiz
9c60: 65 2e 31 20 7b 0a 20 20 20 20 66 61 75 6c 74 73  e.1 {.    faults
9c70: 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65  im_delete_and_re
9c80: 6f 70 65 6e 0a 20 20 20 20 64 62 20 66 75 6e 63  open.    db func
9c90: 20 61 5f 73 74 72 69 6e 67 20 61 5f 73 74 72 69   a_string a_stri
9ca0: 6e 67 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b  ng.    execsql {
9cb0: 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 6a 6f  .      PRAGMA jo
9cc0: 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 50 45 52  urnal_mode = PER
9cd0: 53 49 53 54 3b 0a 20 20 20 20 20 20 50 52 41 47  SIST;.      PRAG
9ce0: 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20 31  MA page_size = 1
9cf0: 30 32 34 3b 0a 20 20 20 20 20 20 42 45 47 49 4e  024;.      BEGIN
9d00: 3b 0a 20 20 20 20 20 20 20 20 43 52 45 41 54 45  ;.        CREATE
9d10: 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b   TABLE t1(a, b);
9d20: 0a 20 20 20 20 20 20 20 20 43 52 45 41 54 45 20  .        CREATE 
9d30: 54 41 42 4c 45 20 74 32 28 61 2c 20 62 29 3b 0a  TABLE t2(a, b);.
9d40: 20 20 20 20 20 20 20 20 43 52 45 41 54 45 20 54          CREATE T
9d50: 41 42 4c 45 20 74 33 28 61 2c 20 62 29 3b 0a 20  ABLE t3(a, b);. 
9d60: 20 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 20       COMMIT;.   
9d70: 20 7d 0a 20 20 20 20 66 69 6c 65 20 73 69 7a 65   }.    file size
9d80: 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c   test.db-journal
9d90: 0a 20 20 7d 20 5b 65 78 70 72 20 24 73 65 63 74  .  } [expr $sect
9da0: 6f 72 73 69 7a 65 20 3e 20 36 35 35 33 36 20 3f  orsize > 65536 ?
9db0: 20 36 35 35 33 36 20 3a 20 24 73 65 63 74 6f 72   65536 : $sector
9dc0: 73 69 7a 65 5d 0a 0a 20 20 64 6f 5f 74 65 73 74  size]..  do_test
9dd0: 20 70 61 67 65 72 31 2d 31 30 2e 24 73 65 63 74   pager1-10.$sect
9de0: 6f 72 73 69 7a 65 2e 32 20 7b 0a 20 20 20 20 65  orsize.2 {.    e
9df0: 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 20 20  xecsql { .      
9e00: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 20 56  INSERT INTO t3 V
9e10: 41 4c 55 45 53 28 61 5f 73 74 72 69 6e 67 28 33  ALUES(a_string(3
9e20: 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 33 30  00), a_string(30
9e30: 30 29 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  0));.      INSER
9e40: 54 20 49 4e 54 4f 20 74 33 20 53 45 4c 45 43 54  T INTO t3 SELECT
9e50: 20 2a 20 46 52 4f 4d 20 74 33 3b 20 20 20 20 20   * FROM t3;     
9e60: 20 20 20 2f 2a 20 20 32 20 2a 2f 0a 20 20 20 20     /*  2 */.    
9e70: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33    INSERT INTO t3
9e80: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
9e90: 33 3b 20 20 20 20 20 20 20 20 2f 2a 20 20 34 20  3;        /*  4 
9ea0: 2a 2f 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  */.      INSERT 
9eb0: 49 4e 54 4f 20 74 33 20 53 45 4c 45 43 54 20 2a  INTO t3 SELECT *
9ec0: 20 46 52 4f 4d 20 74 33 3b 20 20 20 20 20 20 20   FROM t3;       
9ed0: 20 2f 2a 20 20 38 20 2a 2f 0a 20 20 20 20 20 20   /*  8 */.      
9ee0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 20 53  INSERT INTO t3 S
9ef0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 33 3b  ELECT * FROM t3;
9f00: 20 20 20 20 20 20 20 20 2f 2a 20 31 36 20 2a 2f          /* 16 */
9f10: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
9f20: 54 4f 20 74 33 20 53 45 4c 45 43 54 20 2a 20 46  TO t3 SELECT * F
9f30: 52 4f 4d 20 74 33 3b 20 20 20 20 20 20 20 20 2f  ROM t3;        /
9f40: 2a 20 33 32 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  * 32 */.    }.  
9f50: 7d 20 7b 7d 0a 0a 20 20 64 6f 5f 74 65 73 74 20  } {}..  do_test 
9f60: 70 61 67 65 72 31 2d 31 30 2e 24 73 65 63 74 6f  pager1-10.$secto
9f70: 72 73 69 7a 65 2e 33 20 7b 0a 20 20 20 20 64 62  rsize.3 {.    db
9f80: 20 63 6c 6f 73 65 0a 20 20 20 20 73 71 6c 69 74   close.    sqlit
9f90: 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20  e3 db test.db.  
9fa0: 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20    execsql { .   
9fb0: 20 20 20 50 52 41 47 4d 41 20 63 61 63 68 65 5f     PRAGMA cache_
9fc0: 73 69 7a 65 20 3d 20 31 30 3b 0a 20 20 20 20 20  size = 10;.     
9fd0: 20 42 45 47 49 4e 3b 0a 20 20 20 20 7d 0a 20 20   BEGIN;.    }.  
9fe0: 20 20 72 65 63 75 72 73 69 76 65 5f 73 65 6c 65    recursive_sele
9ff0: 63 74 20 33 32 20 74 33 20 7b 64 62 20 65 76 61  ct 32 t3 {db eva
a000: 6c 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  l "INSERT INTO t
a010: 32 20 56 41 4c 55 45 53 28 31 2c 20 32 29 22 7d  2 VALUES(1, 2)"}
a020: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  .    execsql {. 
a030: 20 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 20       COMMIT;.   
a040: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
a050: 20 74 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b   t2;.    }.  } {
a060: 31 20 32 7d 0a 0a 20 20 64 6f 5f 74 65 73 74 20  1 2}..  do_test 
a070: 70 61 67 65 72 31 2d 31 30 2e 24 73 65 63 74 6f  pager1-10.$secto
a080: 72 73 69 7a 65 2e 34 20 7b 0a 20 20 20 20 65 78  rsize.4 {.    ex
a090: 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 43 52  ecsql {.      CR
a0a0: 45 41 54 45 20 54 41 42 4c 45 20 74 36 28 61 2c  EATE TABLE t6(a,
a0b0: 20 62 29 3b 0a 20 20 20 20 20 20 43 52 45 41 54   b);.      CREAT
a0c0: 45 20 54 41 42 4c 45 20 74 37 28 61 2c 20 62 29  E TABLE t7(a, b)
a0d0: 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45 20 54  ;.      CREATE T
a0e0: 41 42 4c 45 20 74 35 28 61 2c 20 62 29 3b 0a 20  ABLE t5(a, b);. 
a0f0: 20 20 20 20 20 44 52 4f 50 20 54 41 42 4c 45 20       DROP TABLE 
a100: 74 36 3b 0a 20 20 20 20 20 20 44 52 4f 50 20 54  t6;.      DROP T
a110: 41 42 4c 45 20 74 37 3b 0a 20 20 20 20 7d 0a 20  ABLE t7;.    }. 
a120: 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20     execsql {.   
a130: 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20     BEGIN;.      
a140: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
a150: 36 28 61 2c 20 62 29 3b 0a 20 20 20 20 7d 0a 20  6(a, b);.    }. 
a160: 20 20 20 72 65 63 75 72 73 69 76 65 5f 73 65 6c     recursive_sel
a170: 65 63 74 20 33 32 20 74 33 20 7b 64 62 20 65 76  ect 32 t3 {db ev
a180: 61 6c 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20  al "INSERT INTO 
a190: 74 35 20 56 41 4c 55 45 53 28 31 2c 20 32 29 22  t5 VALUES(1, 2)"
a1a0: 7d 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a  }.    execsql {.
a1b0: 20 20 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20        COMMIT;.  
a1c0: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
a1d0: 4d 20 74 35 3b 0a 20 20 20 20 7d 0a 20 20 7d 20  M t5;.    }.  } 
a1e0: 7b 31 20 32 7d 0a 20 20 0a 7d 0a 64 62 20 63 6c  {1 2}.  .}.db cl
a1f0: 6f 73 65 0a 0a 74 76 20 73 65 63 74 6f 72 73 69  ose..tv sectorsi
a200: 7a 65 20 34 30 39 36 0a 64 6f 5f 74 65 73 74 20  ze 4096.do_test 
a210: 70 61 67 65 72 31 2e 31 30 2e 78 2e 31 20 7b 0a  pager1.10.x.1 {.
a220: 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74    faultsim_delet
a230: 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65  e_and_reopen.  e
a240: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41  xecsql {.    PRA
a250: 47 4d 41 20 61 75 74 6f 5f 76 61 63 75 75 6d 20  GMA auto_vacuum 
a260: 3d 20 6e 6f 6e 65 3b 0a 20 20 20 20 50 52 41 47  = none;.    PRAG
a270: 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20 31  MA page_size = 1
a280: 30 32 34 3b 0a 20 20 20 20 43 52 45 41 54 45 20  024;.    CREATE 
a290: 54 41 42 4c 45 20 74 31 28 78 29 3b 0a 20 20 7d  TABLE t1(x);.  }
a2a0: 0a 20 20 66 6f 72 20 7b 73 65 74 20 69 20 30 7d  .  for {set i 0}
a2b0: 20 7b 24 69 3c 33 30 7d 20 7b 69 6e 63 72 20 69   {$i<30} {incr i
a2c0: 7d 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20  } {.    execsql 
a2d0: 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31  { INSERT INTO t1
a2e0: 20 56 41 4c 55 45 53 28 7a 65 72 6f 62 6c 6f 62   VALUES(zeroblob
a2f0: 28 39 30 30 29 29 20 7d 0a 20 20 7d 0a 20 20 66  (900)) }.  }.  f
a300: 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62  ile size test.db
a310: 0a 7d 20 7b 33 32 37 36 38 7d 0a 64 6f 5f 74 65  .} {32768}.do_te
a320: 73 74 20 70 61 67 65 72 31 2e 31 30 2e 78 2e 32  st pager1.10.x.2
a330: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
a340: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
a350: 74 32 28 78 29 3b 0a 20 20 20 20 44 52 4f 50 20  t2(x);.    DROP 
a360: 54 41 42 4c 45 20 74 32 3b 0a 20 20 7d 0a 20 20  TABLE t2;.  }.  
a370: 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64  file size test.d
a380: 62 0a 7d 20 7b 33 33 37 39 32 7d 0a 64 6f 5f 74  b.} {33792}.do_t
a390: 65 73 74 20 70 61 67 65 72 31 2e 31 30 2e 78 2e  est pager1.10.x.
a3a0: 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  3 {.  execsql {.
a3b0: 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 43      BEGIN;.    C
a3c0: 52 45 41 54 45 20 54 41 42 4c 45 20 74 32 28 78  REATE TABLE t2(x
a3d0: 29 3b 0a 20 20 7d 0a 20 20 72 65 63 75 72 73 69  );.  }.  recursi
a3e0: 76 65 5f 73 65 6c 65 63 74 20 33 30 20 74 31 0a  ve_select 30 t1.
a3f0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
a400: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 33 28  CREATE TABLE t3(
a410: 78 29 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a  x);.    COMMIT;.
a420: 20 20 7d 0a 7d 20 7b 7d 0a 0a 64 62 20 63 6c 6f    }.} {}..db clo
a430: 73 65 0a 74 76 20 64 65 6c 65 74 65 0a 0a 74 65  se.tv delete..te
a440: 73 74 76 66 73 20 74 76 20 2d 64 65 66 61 75 6c  stvfs tv -defaul
a450: 74 20 31 0a 66 61 75 6c 74 73 69 6d 5f 64 65 6c  t 1.faultsim_del
a460: 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 64  ete_and_reopen.d
a470: 62 20 66 75 6e 63 20 61 5f 73 74 72 69 6e 67 20  b func a_string 
a480: 61 5f 73 74 72 69 6e 67 0a 64 6f 5f 65 78 65 63  a_string.do_exec
a490: 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d  sql_test pager1-
a4a0: 31 31 2e 31 20 7b 0a 20 20 50 52 41 47 4d 41 20  11.1 {.  PRAGMA 
a4b0: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44  journal_mode = D
a4c0: 45 4c 45 54 45 3b 0a 20 20 50 52 41 47 4d 41 20  ELETE;.  PRAGMA 
a4d0: 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b  cache_size = 10;
a4e0: 0a 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 43 52  .  BEGIN;.    CR
a4f0: 45 41 54 45 20 54 41 42 4c 45 20 7a 7a 28 74 6f  EATE TABLE zz(to
a500: 70 20 50 52 49 4d 41 52 59 20 4b 45 59 29 3b 0a  p PRIMARY KEY);.
a510: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
a520: 7a 7a 20 56 41 4c 55 45 53 28 61 5f 73 74 72 69  zz VALUES(a_stri
a530: 6e 67 28 32 32 32 29 29 3b 0a 20 20 20 20 49 4e  ng(222));.    IN
a540: 53 45 52 54 20 49 4e 54 4f 20 7a 7a 20 53 45 4c  SERT INTO zz SEL
a550: 45 43 54 20 61 5f 73 74 72 69 6e 67 28 28 53 45  ECT a_string((SE
a560: 4c 45 43 54 20 32 32 32 2b 6d 61 78 28 72 6f 77  LECT 222+max(row
a570: 69 64 29 20 46 52 4f 4d 20 7a 7a 29 29 20 46 52  id) FROM zz)) FR
a580: 4f 4d 20 7a 7a 3b 0a 20 20 20 20 49 4e 53 45 52  OM zz;.    INSER
a590: 54 20 49 4e 54 4f 20 7a 7a 20 53 45 4c 45 43 54  T INTO zz SELECT
a5a0: 20 61 5f 73 74 72 69 6e 67 28 28 53 45 4c 45 43   a_string((SELEC
a5b0: 54 20 32 32 32 2b 6d 61 78 28 72 6f 77 69 64 29  T 222+max(rowid)
a5c0: 20 46 52 4f 4d 20 7a 7a 29 29 20 46 52 4f 4d 20   FROM zz)) FROM 
a5d0: 7a 7a 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  zz;.    INSERT I
a5e0: 4e 54 4f 20 7a 7a 20 53 45 4c 45 43 54 20 61 5f  NTO zz SELECT a_
a5f0: 73 74 72 69 6e 67 28 28 53 45 4c 45 43 54 20 32  string((SELECT 2
a600: 32 32 2b 6d 61 78 28 72 6f 77 69 64 29 20 46 52  22+max(rowid) FR
a610: 4f 4d 20 7a 7a 29 29 20 46 52 4f 4d 20 7a 7a 3b  OM zz)) FROM zz;
a620: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
a630: 20 7a 7a 20 53 45 4c 45 43 54 20 61 5f 73 74 72   zz SELECT a_str
a640: 69 6e 67 28 28 53 45 4c 45 43 54 20 32 32 32 2b  ing((SELECT 222+
a650: 6d 61 78 28 72 6f 77 69 64 29 20 46 52 4f 4d 20  max(rowid) FROM 
a660: 7a 7a 29 29 20 46 52 4f 4d 20 7a 7a 3b 0a 20 20  zz)) FROM zz;.  
a670: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a 7a    INSERT INTO zz
a680: 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67   SELECT a_string
a690: 28 28 53 45 4c 45 43 54 20 32 32 32 2b 6d 61 78  ((SELECT 222+max
a6a0: 28 72 6f 77 69 64 29 20 46 52 4f 4d 20 7a 7a 29  (rowid) FROM zz)
a6b0: 29 20 46 52 4f 4d 20 7a 7a 3b 0a 20 20 43 4f 4d  ) FROM zz;.  COM
a6c0: 4d 49 54 3b 0a 20 20 42 45 47 49 4e 3b 0a 20 20  MIT;.  BEGIN;.  
a6d0: 20 20 55 50 44 41 54 45 20 7a 7a 20 53 45 54 20    UPDATE zz SET 
a6e0: 74 6f 70 20 3d 20 61 5f 73 74 72 69 6e 67 28 33  top = a_string(3
a6f0: 34 35 29 3b 0a 7d 20 7b 64 65 6c 65 74 65 7d 0a  45);.} {delete}.
a700: 0a 70 72 6f 63 20 6c 6f 63 6b 6f 75 74 20 7b 6d  .proc lockout {m
a710: 65 74 68 6f 64 20 61 72 67 73 7d 20 7b 20 72 65  ethod args} { re
a720: 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
a730: 52 20 7d 0a 74 76 20 73 63 72 69 70 74 20 6c 6f  R }.tv script lo
a740: 63 6b 6f 75 74 0a 74 76 20 66 69 6c 74 65 72 20  ckout.tv filter 
a750: 7b 78 57 72 69 74 65 20 78 54 72 75 6e 63 61 74  {xWrite xTruncat
a760: 65 20 78 53 79 6e 63 7d 0a 64 6f 5f 63 61 74 63  e xSync}.do_catc
a770: 68 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31  hsql_test pager1
a780: 2d 31 31 2e 32 20 7b 20 43 4f 4d 4d 49 54 20 7d  -11.2 { COMMIT }
a790: 20 7b 31 20 7b 64 69 73 6b 20 49 2f 4f 20 65 72   {1 {disk I/O er
a7a0: 72 6f 72 7d 7d 0a 0a 74 76 20 73 63 72 69 70 74  ror}}..tv script
a7b0: 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65   {}.do_test page
a7c0: 72 31 2d 31 31 2e 33 20 7b 0a 20 20 73 71 6c 69  r1-11.3 {.  sqli
a7d0: 74 65 33 20 64 62 32 20 74 65 73 74 2e 64 62 0a  te3 db2 test.db.
a7e0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
a7f0: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
a800: 6f 64 65 20 3d 20 54 52 55 4e 43 41 54 45 3b 0a  ode = TRUNCATE;.
a810: 20 20 20 20 50 52 41 47 4d 41 20 69 6e 74 65 67      PRAGMA integ
a820: 72 69 74 79 5f 63 68 65 63 6b 3b 0a 20 20 7d 20  rity_check;.  } 
a830: 64 62 32 0a 7d 20 7b 74 72 75 6e 63 61 74 65 20  db2.} {truncate 
a840: 6f 6b 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  ok}.do_test page
a850: 72 31 2d 31 31 2e 34 20 7b 0a 20 20 64 62 32 20  r1-11.4 {.  db2 
a860: 63 6c 6f 73 65 0a 20 20 66 69 6c 65 20 73 69 7a  close.  file siz
a870: 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61  e test.db-journa
a880: 6c 0a 7d 20 7b 30 7d 0a 64 6f 5f 65 78 65 63 73  l.} {0}.do_execs
a890: 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31  ql_test pager1-1
a8a0: 31 2e 35 20 7b 20 53 45 4c 45 43 54 20 63 6f 75  1.5 { SELECT cou
a8b0: 6e 74 28 2a 29 20 46 52 4f 4d 20 7a 7a 20 7d 20  nt(*) FROM zz } 
a8c0: 7b 33 32 7d 0a 64 62 20 63 6c 6f 73 65 0a 74 76  {32}.db close.tv
a8d0: 20 64 65 6c 65 74 65 0a 20 20 0a 23 2d 2d 2d 2d   delete.  .#----
a8e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a8f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a920: 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 22 50 52  -----.# Test "PR
a930: 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 22 0a  AGMA page_size".
a940: 23 0a 74 65 73 74 76 66 73 20 74 76 20 2d 64 65  #.testvfs tv -de
a950: 66 61 75 6c 74 20 31 0a 74 76 20 73 65 63 74 6f  fault 1.tv secto
a960: 72 73 69 7a 65 20 31 30 32 34 0a 66 6f 72 65 61  rsize 1024.forea
a970: 63 68 20 70 61 67 65 73 69 7a 65 20 7b 0a 20 20  ch pagesize {.  
a980: 20 20 35 31 32 20 20 20 31 30 32 34 20 20 20 32    512   1024   2
a990: 30 34 38 20 34 30 39 36 20 38 31 39 32 20 31 36  048 4096 8192 16
a9a0: 33 38 34 20 33 32 37 36 38 20 0a 7d 20 7b 0a 20  384 32768 .} {. 
a9b0: 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65   faultsim_delete
a9c0: 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 0a 20 20 23  _and_reopen..  #
a9d0: 20 54 68 65 20 73 65 63 74 6f 72 2d 73 69 7a 65   The sector-size
a9e0: 20 28 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74   (according to t
a9f0: 68 65 20 56 46 53 29 20 69 73 20 31 30 32 34 20  he VFS) is 1024 
aa00: 62 79 74 65 73 2e 20 53 6f 20 69 66 20 74 68 65  bytes. So if the
aa10: 0a 20 20 23 20 70 61 67 65 2d 73 69 7a 65 20 72  .  # page-size r
aa20: 65 71 75 65 73 74 65 64 20 75 73 69 6e 67 20 22  equested using "
aa30: 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65  PRAGMA page_size
aa40: 22 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  " is greater tha
aa50: 6e 20 74 68 65 0a 20 20 23 20 63 6f 6d 70 69 6c  n the.  # compil
aa60: 65 20 74 69 6d 65 20 76 61 6c 75 65 20 6f 66 20  e time value of 
aa70: 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
aa80: 53 49 5a 45 2c 20 74 68 65 6e 20 74 68 65 20 65  SIZE, then the e
aa90: 66 66 65 63 74 69 76 65 20 0a 20 20 23 20 70 61  ffective .  # pa
aaa0: 67 65 2d 73 69 7a 65 20 72 65 6d 61 69 6e 73 20  ge-size remains 
aab0: 31 30 32 34 20 62 79 74 65 73 2e 0a 20 20 23 0a  1024 bytes..  #.
aac0: 20 20 73 65 74 20 65 66 66 20 24 70 61 67 65 73    set eff $pages
aad0: 69 7a 65 0a 20 20 69 66 20 7b 24 65 66 66 20 3e  ize.  if {$eff >
aae0: 20 24 3a 3a 53 51 4c 49 54 45 5f 4d 41 58 5f 50   $::SQLITE_MAX_P
aaf0: 41 47 45 5f 53 49 5a 45 7d 20 7b 20 73 65 74 20  AGE_SIZE} { set 
ab00: 65 66 66 20 31 30 32 34 20 7d 0a 0a 20 20 64 6f  eff 1024 }..  do
ab10: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 32 2e  _test pager1-12.
ab20: 24 70 61 67 65 73 69 7a 65 2e 31 20 7b 0a 20 20  $pagesize.1 {.  
ab30: 20 20 73 71 6c 69 74 65 33 20 64 62 32 20 74 65    sqlite3 db2 te
ab40: 73 74 2e 64 62 0a 20 20 20 20 65 78 65 63 73 71  st.db.    execsq
ab50: 6c 20 22 0a 20 20 20 20 20 20 50 52 41 47 4d 41  l ".      PRAGMA
ab60: 20 70 61 67 65 5f 73 69 7a 65 20 3d 20 24 70 61   page_size = $pa
ab70: 67 65 73 69 7a 65 3b 0a 20 20 20 20 20 20 43 52  gesize;.      CR
ab80: 45 41 54 45 20 56 49 45 57 20 76 20 41 53 20 53  EATE VIEW v AS S
ab90: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 71 6c  ELECT * FROM sql
aba0: 69 74 65 5f 6d 61 73 74 65 72 3b 0a 20 20 20 20  ite_master;.    
abb0: 22 20 64 62 32 0a 20 20 20 20 66 69 6c 65 20 73  " db2.    file s
abc0: 69 7a 65 20 74 65 73 74 2e 64 62 0a 20 20 7d 20  ize test.db.  } 
abd0: 24 65 66 66 0a 20 20 64 6f 5f 74 65 73 74 20 70  $eff.  do_test p
abe0: 61 67 65 72 31 2d 31 32 2e 24 70 61 67 65 73 69  ager1-12.$pagesi
abf0: 7a 65 2e 32 20 7b 0a 20 20 20 20 73 71 6c 69 74  ze.2 {.    sqlit
ac00: 65 33 20 64 62 32 20 74 65 73 74 2e 64 62 0a 20  e3 db2 test.db. 
ac10: 20 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20     execsql { .  
ac20: 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74      SELECT count
ac30: 28 2a 29 20 46 52 4f 4d 20 76 3b 0a 20 20 20 20  (*) FROM v;.    
ac40: 20 20 50 52 41 47 4d 41 20 6d 61 69 6e 2e 70 61    PRAGMA main.pa
ac50: 67 65 5f 73 69 7a 65 3b 0a 20 20 20 20 7d 20 64  ge_size;.    } d
ac60: 62 32 0a 20 20 7d 20 5b 6c 69 73 74 20 31 20 24  b2.  } [list 1 $
ac70: 65 66 66 5d 0a 20 20 64 6f 5f 74 65 73 74 20 70  eff].  do_test p
ac80: 61 67 65 72 31 2d 31 32 2e 24 70 61 67 65 73 69  ager1-12.$pagesi
ac90: 7a 65 2e 33 20 7b 0a 20 20 20 20 65 78 65 63 73  ze.3 {.    execs
aca0: 71 6c 20 7b 20 0a 20 20 20 20 20 20 53 45 4c 45  ql { .      SELE
acb0: 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
acc0: 20 76 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41   v;.      PRAGMA
acd0: 20 6d 61 69 6e 2e 70 61 67 65 5f 73 69 7a 65 3b   main.page_size;
ace0: 0a 20 20 20 20 7d 0a 20 20 7d 20 5b 6c 69 73 74  .    }.  } [list
acf0: 20 31 20 24 65 66 66 5d 0a 20 20 64 62 32 20 63   1 $eff].  db2 c
ad00: 6c 6f 73 65 0a 7d 0a 64 62 20 63 6c 6f 73 65 0a  lose.}.db close.
ad10: 74 76 20 64 65 6c 65 74 65 0a 0a 23 2d 2d 2d 2d  tv delete..#----
ad20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ad30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ad40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ad50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ad60: 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 73 70 65  -----.# Test spe
ad70: 63 61 6c 20 22 50 52 41 47 4d 41 20 6a 6f 75 72  cal "PRAGMA jour
ad80: 6e 61 6c 5f 6d 6f 64 65 3d 50 45 52 53 49 53 54  nal_mode=PERSIST
ad90: 22 20 74 65 73 74 20 63 61 73 65 73 2e 0a 23 0a  " test cases..#.
ada0: 23 20 70 61 67 65 72 31 2d 31 33 2e 31 2e 2a 3a  # pager1-13.1.*:
adb0: 20 54 68 69 73 20 74 65 73 74 73 20 61 20 73 70   This tests a sp
adc0: 65 63 69 61 6c 20 63 61 73 65 20 65 6e 63 6f 75  ecial case encou
add0: 6e 74 65 72 65 64 20 69 6e 20 70 65 72 73 69 73  ntered in persis
ade0: 74 65 6e 74 20 0a 23 20 20 20 20 20 20 20 20 20  tent .#         
adf0: 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 6d         journal m
ae00: 6f 64 65 3a 20 49 66 20 74 68 65 20 6a 6f 75 72  ode: If the jour
ae10: 6e 61 6c 20 61 73 73 6f 63 69 61 74 65 64 20 77  nal associated w
ae20: 69 74 68 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ith a transactio
ae30: 6e 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20  n.#             
ae40: 20 20 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68     is smaller th
ae50: 61 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  an the journal f
ae60: 69 6c 65 20 28 62 65 63 61 75 73 65 20 61 20 70  ile (because a p
ae70: 72 65 76 69 6f 75 73 20 0a 23 20 20 20 20 20 20  revious .#      
ae80: 20 20 20 20 20 20 20 20 20 20 74 72 61 6e 73 61            transa
ae90: 63 74 69 6f 6e 20 6c 65 66 74 20 61 20 76 65 72  ction left a ver
aea0: 79 20 6c 61 72 67 65 20 6e 6f 6e 2d 68 6f 74 20  y large non-hot 
aeb0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20  journal file in 
aec0: 74 68 65 0a 23 20 20 20 20 20 20 20 20 20 20 20  the.#           
aed0: 20 20 20 20 20 66 69 6c 65 2d 73 79 73 74 65 6d       file-system
aee0: 29 2c 20 74 68 65 6e 20 53 51 4c 69 74 65 20 68  ), then SQLite h
aef0: 61 73 20 74 6f 20 62 65 20 63 61 72 65 66 75 6c  as to be careful
af00: 20 74 68 61 74 20 74 68 65 72 65 20 69 73 0a 23   that there is.#
af10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af20: 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 2d 68 65  not a journal-he
af30: 61 64 65 72 20 6c 65 66 74 20 6f 76 65 72 20 66  ader left over f
af40: 72 6f 6d 20 61 20 70 72 65 76 69 6f 75 73 20 74  rom a previous t
af50: 72 61 6e 73 61 63 74 69 6f 6e 0a 23 20 20 20 20  ransaction.#    
af60: 20 20 20 20 20 20 20 20 20 20 20 20 69 6d 6d 65              imme
af70: 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e  diately followin
af80: 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 63 6f  g the journal co
af90: 6e 74 65 6e 74 20 6a 75 73 74 20 77 72 69 74 74  ntent just writt
afa0: 65 6e 2e 0a 23 20 20 20 20 20 20 20 20 20 20 20  en..#           
afb0: 20 20 20 20 20 49 66 20 74 68 65 72 65 20 69 73       If there is
afc0: 2c 20 61 6e 64 20 74 68 65 20 70 72 6f 63 65 73  , and the proces
afd0: 73 20 63 72 61 73 68 65 73 20 73 6f 20 74 68 61  s crashes so tha
afe0: 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 23 20  t the journal.# 
aff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
b000: 65 63 6f 6d 65 73 20 61 20 68 6f 74 2d 6a 6f 75  ecomes a hot-jou
b010: 72 6e 61 6c 20 61 6e 64 20 6d 75 73 74 20 62 65  rnal and must be
b020: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 62 79 20   rolled back by 
b030: 61 6e 6f 74 68 65 72 0a 23 20 20 20 20 20 20 20  another.#       
b040: 20 20 20 20 20 20 20 20 20 70 72 6f 63 65 73 73           process
b050: 2c 20 74 68 65 72 65 20 69 73 20 61 20 64 61 6e  , there is a dan
b060: 67 65 72 20 74 68 61 74 20 74 68 65 20 6f 74 68  ger that the oth
b070: 65 72 20 70 72 6f 63 65 73 73 20 6d 61 79 20 72  er process may r
b080: 6f 6c 6c 0a 23 20 20 20 20 20 20 20 20 20 20 20  oll.#           
b090: 20 20 20 20 20 62 61 63 6b 20 74 68 65 20 61 62       back the ab
b0a0: 6f 72 74 65 64 20 74 72 61 6e 73 61 63 74 69 6f  orted transactio
b0b0: 6e 2c 20 74 68 65 6e 20 63 6f 6e 74 69 6e 75 65  n, then continue
b0c0: 20 63 6f 70 79 69 6e 67 20 64 61 74 61 0a 23 20   copying data.# 
b0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
b0e0: 72 6f 6d 20 61 6e 20 6f 6c 64 65 72 20 74 72 61  rom an older tra
b0f0: 6e 73 61 63 74 69 6f 6e 20 66 72 6f 6d 20 74 68  nsaction from th
b100: 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74  e remainder of t
b110: 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 23 20 20 20  he journal..#   
b120: 20 20 20 20 20 20 20 20 20 20 20 20 20 53 65 65               See
b130: 20 74 68 65 20 73 79 6e 63 4a 6f 75 72 6e 61 6c   the syncJournal
b140: 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20  () function for 
b150: 64 65 74 61 69 6c 73 2e 0a 23 0a 23 20 70 61 67  details..#.# pag
b160: 65 72 31 2d 31 33 2e 32 2e 2a 3a 20 53 61 6d 65  er1-13.2.*: Same
b170: 20 74 65 73 74 20 61 73 20 74 68 65 20 70 72 65   test as the pre
b180: 76 69 6f 75 73 2e 20 54 68 69 73 20 74 69 6d 65  vious. This time
b190: 2c 20 74 68 72 6f 77 20 61 6e 20 69 6e 64 65 78  , throw an index
b1a0: 20 69 6e 74 6f 0a 23 20 20 20 20 20 20 20 20 20   into.#         
b1b0: 20 20 20 20 20 20 20 74 68 65 20 6d 69 78 20 74         the mix t
b1c0: 6f 20 6d 61 6b 65 20 74 68 65 20 69 6e 74 65 67  o make the integ
b1d0: 72 69 74 79 2d 63 68 65 63 6b 20 6d 6f 72 65 20  rity-check more 
b1e0: 6c 69 6b 65 6c 79 20 74 6f 20 63 61 74 63 68 0a  likely to catch.
b1f0: 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  #               
b200: 20 65 72 72 6f 72 73 2e 0a 23 0a 74 65 73 74 76   errors..#.testv
b210: 66 73 20 74 76 20 2d 64 65 66 61 75 6c 74 20 31  fs tv -default 1
b220: 0a 74 76 20 73 63 72 69 70 74 20 78 53 79 6e 63  .tv script xSync
b230: 43 62 0a 74 76 20 66 69 6c 74 65 72 20 78 53 79  Cb.tv filter xSy
b240: 6e 63 0a 70 72 6f 63 20 78 53 79 6e 63 43 62 20  nc.proc xSyncCb 
b250: 7b 6d 65 74 68 6f 64 20 66 69 6c 65 6e 61 6d 65  {method filename
b260: 20 61 72 67 73 7d 20 7b 0a 20 20 73 65 74 20 74   args} {.  set t
b270: 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 66 69 6c   [file tail $fil
b280: 65 6e 61 6d 65 5d 0a 20 20 69 66 20 7b 24 74 20  ename].  if {$t 
b290: 3d 3d 20 22 74 65 73 74 2e 64 62 22 7d 20 66 61  == "test.db"} fa
b2a0: 75 6c 74 73 69 6d 5f 73 61 76 65 0a 20 20 72 65  ultsim_save.  re
b2b0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 7d  turn SQLITE_OK.}
b2c0: 0a 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65  .faultsim_delete
b2d0: 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 64 62 20 66  _and_reopen.db f
b2e0: 75 6e 63 20 61 5f 73 74 72 69 6e 67 20 61 5f 73  unc a_string a_s
b2f0: 74 72 69 6e 67 0a 0a 23 20 54 68 65 20 55 50 44  tring..# The UPD
b300: 41 54 45 20 73 74 61 74 65 6d 65 6e 74 20 61 74  ATE statement at
b310: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 69 73   the end of this
b320: 20 74 65 73 74 20 63 61 73 65 20 63 72 65 61 74   test case creat
b330: 65 73 20 61 20 72 65 61 6c 6c 79 20 62 69 67 0a  es a really big.
b340: 23 20 6a 6f 75 72 6e 61 6c 2e 20 53 69 6e 63 65  # journal. Since
b350: 20 74 68 65 20 63 61 63 68 65 2d 73 69 7a 65 20   the cache-size 
b360: 69 73 20 6f 6e 6c 79 20 31 30 20 70 61 67 65 73  is only 10 pages
b370: 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 63 6f  , the journal co
b380: 6e 74 61 69 6e 73 20 0a 23 20 66 72 65 71 75 65  ntains .# freque
b390: 6e 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  nt journal heade
b3a0: 72 73 2e 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c  rs..#.do_execsql
b3b0: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 33 2e  _test pager1-13.
b3c0: 31 2e 31 20 7b 0a 20 20 50 52 41 47 4d 41 20 70  1.1 {.  PRAGMA p
b3d0: 61 67 65 5f 73 69 7a 65 20 3d 20 31 30 32 34 3b  age_size = 1024;
b3e0: 0a 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61  .  PRAGMA journa
b3f0: 6c 5f 6d 6f 64 65 20 3d 20 50 45 52 53 49 53 54  l_mode = PERSIST
b400: 3b 0a 20 20 50 52 41 47 4d 41 20 63 61 63 68 65  ;.  PRAGMA cache
b410: 5f 73 69 7a 65 20 3d 20 31 30 3b 0a 20 20 42 45  _size = 10;.  BE
b420: 47 49 4e 3b 0a 20 20 20 20 43 52 45 41 54 45 20  GIN;.    CREATE 
b430: 54 41 42 4c 45 20 74 31 28 61 20 49 4e 54 45 47  TABLE t1(a INTEG
b440: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  ER PRIMARY KEY, 
b450: 62 20 42 4c 4f 42 29 3b 0a 20 20 20 20 49 4e 53  b BLOB);.    INS
b460: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
b470: 45 53 28 4e 55 4c 4c 2c 20 61 5f 73 74 72 69 6e  ES(NULL, a_strin
b480: 67 28 34 30 30 29 29 3b 0a 20 20 20 20 49 4e 53  g(400));.    INS
b490: 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
b4a0: 43 54 20 4e 55 4c 4c 2c 20 61 5f 73 74 72 69 6e  CT NULL, a_strin
b4b0: 67 28 34 30 30 29 20 46 52 4f 4d 20 74 31 3b 20  g(400) FROM t1; 
b4c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20 32 20           /*   2 
b4d0: 2a 2f 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  */.    INSERT IN
b4e0: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 4e 55 4c  TO t1 SELECT NUL
b4f0: 4c 2c 20 61 5f 73 74 72 69 6e 67 28 34 30 30 29  L, a_string(400)
b500: 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 20   FROM t1;       
b510: 20 20 20 2f 2a 20 20 20 34 20 2a 2f 0a 20 20 20     /*   4 */.   
b520: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
b530: 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 61 5f 73  SELECT NULL, a_s
b540: 74 72 69 6e 67 28 34 30 30 29 20 46 52 4f 4d 20  tring(400) FROM 
b550: 74 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t1;          /* 
b560: 20 20 38 20 2a 2f 0a 20 20 20 20 49 4e 53 45 52    8 */.    INSER
b570: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
b580: 20 4e 55 4c 4c 2c 20 61 5f 73 74 72 69 6e 67 28   NULL, a_string(
b590: 34 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20  400) FROM t1;   
b5a0: 20 20 20 20 20 20 20 2f 2a 20 20 31 36 20 2a 2f         /*  16 */
b5b0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
b5c0: 20 74 31 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c   t1 SELECT NULL,
b5d0: 20 61 5f 73 74 72 69 6e 67 28 34 30 30 29 20 46   a_string(400) F
b5e0: 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 20 20  ROM t1;         
b5f0: 20 2f 2a 20 20 33 32 20 2a 2f 0a 20 20 20 20 49   /*  32 */.    I
b600: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
b610: 4c 45 43 54 20 4e 55 4c 4c 2c 20 61 5f 73 74 72  LECT NULL, a_str
b620: 69 6e 67 28 34 30 30 29 20 46 52 4f 4d 20 74 31  ing(400) FROM t1
b630: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20 36  ;          /*  6
b640: 34 20 2a 2f 0a 20 20 20 20 49 4e 53 45 52 54 20  4 */.    INSERT 
b650: 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 4e  INTO t1 SELECT N
b660: 55 4c 4c 2c 20 61 5f 73 74 72 69 6e 67 28 34 30  ULL, a_string(40
b670: 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20  0) FROM t1;     
b680: 20 20 20 20 20 2f 2a 20 31 32 38 20 2a 2f 0a 20       /* 128 */. 
b690: 20 43 4f 4d 4d 49 54 3b 0a 20 20 55 50 44 41 54   COMMIT;.  UPDAT
b6a0: 45 20 74 31 20 53 45 54 20 62 20 3d 20 61 5f 73  E t1 SET b = a_s
b6b0: 74 72 69 6e 67 28 34 30 30 29 3b 0a 7d 20 7b 70  tring(400);.} {p
b6c0: 65 72 73 69 73 74 7d 0a 0a 23 20 52 75 6e 20 74  ersist}..# Run t
b6d0: 72 61 6e 73 61 63 74 69 6f 6e 73 20 6f 66 20 69  ransactions of i
b6e0: 6e 63 72 65 61 73 69 6e 67 20 73 69 7a 65 73 2e  ncreasing sizes.
b6f0: 20 45 76 65 6e 74 75 61 6c 6c 79 2c 20 6f 6e 65   Eventually, one
b700: 20 28 6f 72 20 6d 6f 72 65 20 74 68 61 6e 20 6f   (or more than o
b710: 6e 65 29 0a 23 20 6f 66 20 74 68 65 73 65 20 77  ne).# of these w
b720: 69 6c 6c 20 77 72 69 74 65 20 6a 75 73 74 20 65  ill write just e
b730: 6e 6f 75 67 68 20 63 6f 6e 74 65 6e 74 20 74 68  nough content th
b740: 61 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 6f 6c  at one of the ol
b750: 64 20 68 65 61 64 65 72 73 20 63 72 65 61 74 65  d headers create
b760: 64 20 0a 23 20 62 79 20 74 68 65 20 74 72 61 6e  d .# by the tran
b770: 73 61 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 62  saction in the b
b780: 6c 6f 63 6b 20 61 62 6f 76 65 20 6c 69 65 73 20  lock above lies 
b790: 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65  immediately afte
b7a0: 72 20 74 68 65 20 63 6f 6e 74 65 6e 74 0a 23 20  r the content.# 
b7b0: 6a 6f 75 72 6e 61 6c 6c 65 64 20 62 79 20 74 68  journalled by th
b7c0: 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  e current transa
b7d0: 63 74 69 6f 6e 2e 0a 23 0a 66 6f 72 20 7b 73 65  ction..#.for {se
b7e0: 74 20 6e 55 70 20 31 7d 20 7b 24 6e 55 70 3c 36  t nUp 1} {$nUp<6
b7f0: 34 7d 20 7b 69 6e 63 72 20 6e 55 70 7d 20 7b 0a  4} {incr nUp} {.
b800: 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73    do_execsql_tes
b810: 74 20 70 61 67 65 72 31 2d 31 33 2e 31 2e 32 2e  t pager1-13.1.2.
b820: 24 6e 55 70 2e 31 20 7b 20 0a 20 20 20 20 55 50  $nUp.1 { .    UP
b830: 44 41 54 45 20 74 31 20 53 45 54 20 62 20 3d 20  DATE t1 SET b = 
b840: 61 5f 73 74 72 69 6e 67 28 33 39 39 29 20 57 48  a_string(399) WH
b850: 45 52 45 20 61 20 3c 3d 20 24 6e 55 70 0a 20 20  ERE a <= $nUp.  
b860: 7d 20 7b 7d 0a 20 20 64 6f 5f 65 78 65 63 73 71  } {}.  do_execsq
b870: 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 33  l_test pager1-13
b880: 2e 31 2e 32 2e 24 6e 55 70 2e 32 20 7b 20 50 52  .1.2.$nUp.2 { PR
b890: 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63  AGMA integrity_c
b8a0: 68 65 63 6b 20 7d 20 7b 6f 6b 7d 20 0a 0a 20 20  heck } {ok} ..  
b8b0: 23 20 54 72 79 20 74 6f 20 61 63 63 65 73 73 20  # Try to access 
b8c0: 74 68 65 20 73 6e 61 70 73 68 6f 74 20 6f 66 20  the snapshot of 
b8d0: 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e  the file-system.
b8e0: 0a 20 20 23 0a 20 20 73 71 6c 69 74 65 33 20 64  .  #.  sqlite3 d
b8f0: 62 32 20 73 76 5f 74 65 73 74 2e 64 62 0a 20 20  b2 sv_test.db.  
b900: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31  do_test pager1-1
b910: 33 2e 31 2e 32 2e 24 6e 55 70 2e 33 20 7b 0a 20  3.1.2.$nUp.3 {. 
b920: 20 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c     execsql { SEL
b930: 45 43 54 20 73 75 6d 28 6c 65 6e 67 74 68 28 62  ECT sum(length(b
b940: 29 29 20 46 52 4f 4d 20 74 31 20 7d 20 64 62 32  )) FROM t1 } db2
b950: 0a 20 20 7d 20 5b 65 78 70 72 20 7b 31 32 38 2a  .  } [expr {128*
b960: 34 30 30 20 2d 20 28 24 6e 55 70 2d 31 29 7d 5d  400 - ($nUp-1)}]
b970: 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72  .  do_test pager
b980: 31 2d 31 33 2e 31 2e 32 2e 24 6e 55 70 2e 34 20  1-13.1.2.$nUp.4 
b990: 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20  {.    execsql { 
b9a0: 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79  PRAGMA integrity
b9b0: 5f 63 68 65 63 6b 20 7d 20 64 62 32 0a 20 20 7d  _check } db2.  }
b9c0: 20 7b 6f 6b 7d 0a 20 20 64 62 32 20 63 6c 6f 73   {ok}.  db2 clos
b9d0: 65 0a 7d 0a 0a 23 20 53 61 6d 65 20 74 65 73 74  e.}..# Same test
b9e0: 20 61 73 20 61 62 6f 76 65 2e 20 42 75 74 20 74   as above. But t
b9f0: 68 69 73 20 74 69 6d 65 20 77 69 74 68 20 61 6e  his time with an
ba00: 20 69 6e 64 65 78 20 6f 6e 20 74 68 65 20 74 61   index on the ta
ba10: 62 6c 65 2e 0a 23 0a 64 6f 5f 65 78 65 63 73 71  ble..#.do_execsq
ba20: 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 33  l_test pager1-13
ba30: 2e 32 2e 31 20 7b 0a 20 20 43 52 45 41 54 45 20  .2.1 {.  CREATE 
ba40: 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28 62  INDEX i1 ON t1(b
ba50: 29 3b 0a 20 20 55 50 44 41 54 45 20 74 31 20 53  );.  UPDATE t1 S
ba60: 45 54 20 62 20 3d 20 61 5f 73 74 72 69 6e 67 28  ET b = a_string(
ba70: 34 30 30 29 3b 0a 7d 20 7b 7d 0a 66 6f 72 20 7b  400);.} {}.for {
ba80: 73 65 74 20 6e 55 70 20 31 7d 20 7b 24 6e 55 70  set nUp 1} {$nUp
ba90: 3c 36 34 7d 20 7b 69 6e 63 72 20 6e 55 70 7d 20  <64} {incr nUp} 
baa0: 7b 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74  {.  do_execsql_t
bab0: 65 73 74 20 70 61 67 65 72 31 2d 31 33 2e 32 2e  est pager1-13.2.
bac0: 32 2e 24 6e 55 70 2e 31 20 7b 20 0a 20 20 20 20  2.$nUp.1 { .    
bad0: 55 50 44 41 54 45 20 74 31 20 53 45 54 20 62 20  UPDATE t1 SET b 
bae0: 3d 20 61 5f 73 74 72 69 6e 67 28 33 39 39 29 20  = a_string(399) 
baf0: 57 48 45 52 45 20 61 20 3c 3d 20 24 6e 55 70 0a  WHERE a <= $nUp.
bb00: 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 65 78 65 63    } {}.  do_exec
bb10: 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d  sql_test pager1-
bb20: 31 33 2e 32 2e 32 2e 24 6e 55 70 2e 32 20 7b 20  13.2.2.$nUp.2 { 
bb30: 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79  PRAGMA integrity
bb40: 5f 63 68 65 63 6b 20 7d 20 7b 6f 6b 7d 20 0a 20  _check } {ok} . 
bb50: 20 73 71 6c 69 74 65 33 20 64 62 32 20 73 76 5f   sqlite3 db2 sv_
bb60: 74 65 73 74 2e 64 62 0a 20 20 64 6f 5f 74 65 73  test.db.  do_tes
bb70: 74 20 70 61 67 65 72 31 2d 31 33 2e 32 2e 32 2e  t pager1-13.2.2.
bb80: 24 6e 55 70 2e 33 20 7b 0a 20 20 20 20 65 78 65  $nUp.3 {.    exe
bb90: 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 73 75  csql { SELECT su
bba0: 6d 28 6c 65 6e 67 74 68 28 62 29 29 20 46 52 4f  m(length(b)) FRO
bbb0: 4d 20 74 31 20 7d 20 64 62 32 0a 20 20 7d 20 5b  M t1 } db2.  } [
bbc0: 65 78 70 72 20 7b 31 32 38 2a 34 30 30 20 2d 20  expr {128*400 - 
bbd0: 28 24 6e 55 70 2d 31 29 7d 5d 0a 20 20 64 6f 5f  ($nUp-1)}].  do_
bbe0: 74 65 73 74 20 70 61 67 65 72 31 2d 31 33 2e 32  test pager1-13.2
bbf0: 2e 32 2e 24 6e 55 70 2e 34 20 7b 0a 20 20 20 20  .2.$nUp.4 {.    
bc00: 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41  execsql { PRAGMA
bc10: 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b   integrity_check
bc20: 20 7d 20 64 62 32 0a 20 20 7d 20 7b 6f 6b 7d 0a   } db2.  } {ok}.
bc30: 20 20 64 62 32 20 63 6c 6f 73 65 0a 7d 0a 0a 64    db2 close.}..d
bc40: 62 20 63 6c 6f 73 65 0a 74 76 20 64 65 6c 65 74  b close.tv delet
bc50: 65 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  e..#------------
bc60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bc70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bc80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bc90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
bca0: 54 65 73 74 20 73 70 65 63 61 6c 20 22 50 52 41  Test specal "PRA
bcb0: 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
bcc0: 3d 4f 46 46 22 20 74 65 73 74 20 63 61 73 65 73  =OFF" test cases
bcd0: 2e 0a 23 0a 66 61 75 6c 74 73 69 6d 5f 64 65 6c  ..#.faultsim_del
bce0: 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 64  ete_and_reopen.d
bcf0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70  o_execsql_test p
bd00: 61 67 65 72 31 2d 31 34 2e 31 2e 31 20 7b 0a 20  ager1-14.1.1 {. 
bd10: 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f   PRAGMA journal_
bd20: 6d 6f 64 65 20 3d 20 4f 46 46 3b 0a 20 20 43 52  mode = OFF;.  CR
bd30: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c  EATE TABLE t1(a,
bd40: 20 62 29 3b 0a 20 20 42 45 47 49 4e 3b 0a 20 20   b);.  BEGIN;.  
bd50: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
bd60: 20 56 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20   VALUES(1, 2);. 
bd70: 20 43 4f 4d 4d 49 54 3b 0a 20 20 53 45 4c 45 43   COMMIT;.  SELEC
bd80: 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 7d 20 7b  T * FROM t1;.} {
bd90: 6f 66 66 20 31 20 32 7d 0a 64 6f 5f 63 61 74 63  off 1 2}.do_catc
bda0: 68 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31  hsql_test pager1
bdb0: 2d 31 34 2e 31 2e 32 20 7b 0a 20 20 42 45 47 49  -14.1.2 {.  BEGI
bdc0: 4e 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  N;.    INSERT IN
bdd0: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 33 2c 20  TO t1 VALUES(3, 
bde0: 34 29 3b 0a 20 20 52 4f 4c 4c 42 41 43 4b 3b 0a  4);.  ROLLBACK;.
bdf0: 7d 20 7b 30 20 7b 7d 7d 0a 64 6f 5f 65 78 65 63  } {0 {}}.do_exec
be00: 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d  sql_test pager1-
be10: 31 34 2e 31 2e 33 20 7b 0a 20 20 53 45 4c 45 43  14.1.3 {.  SELEC
be20: 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 7d 20 7b  T * FROM t1;.} {
be30: 31 20 32 20 33 20 34 7d 0a 64 6f 5f 63 61 74 63  1 2 3 4}.do_catc
be40: 68 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31  hsql_test pager1
be50: 2d 31 34 2e 31 2e 34 20 7b 0a 20 20 42 45 47 49  -14.1.4 {.  BEGI
be60: 4e 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  N;.    INSERT IN
be70: 54 4f 20 74 31 28 72 6f 77 69 64 2c 20 61 2c 20  TO t1(rowid, a, 
be80: 62 29 20 53 45 4c 45 43 54 20 61 2b 33 2c 20 62  b) SELECT a+3, b
be90: 2c 20 62 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20  , b FROM t1;.   
bea0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 28   INSERT INTO t1(
beb0: 72 6f 77 69 64 2c 20 61 2c 20 62 29 20 53 45 4c  rowid, a, b) SEL
bec0: 45 43 54 20 61 2b 33 2c 20 62 2c 20 62 20 46 52  ECT a+3, b, b FR
bed0: 4f 4d 20 74 31 3b 0a 7d 20 7b 31 20 7b 50 52 49  OM t1;.} {1 {PRI
bee0: 4d 41 52 59 20 4b 45 59 20 6d 75 73 74 20 62 65  MARY KEY must be
bef0: 20 75 6e 69 71 75 65 7d 7d 0a 64 6f 5f 65 78 65   unique}}.do_exe
bf00: 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31  csql_test pager1
bf10: 2d 31 34 2e 31 2e 35 20 7b 0a 20 20 43 4f 4d 4d  -14.1.5 {.  COMM
bf20: 49 54 3b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46  IT;.  SELECT * F
bf30: 52 4f 4d 20 74 31 3b 0a 7d 20 7b 31 20 32 20 33  ROM t1;.} {1 2 3
bf40: 20 34 20 32 20 32 20 34 20 34 7d 0a 0a 23 2d 2d   4 2 2 4 4}..#--
bf50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bf60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bf70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bf80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bf90: 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 6f  -------.# Test o
bfa0: 70 65 6e 69 6e 67 20 61 6e 64 20 63 6c 6f 73 69  pening and closi
bfb0: 6e 67 20 74 68 65 20 70 61 67 65 72 20 73 75 62  ng the pager sub
bfc0: 2d 73 79 73 74 65 6d 20 77 69 74 68 20 64 69 66  -system with dif
bfd0: 66 65 72 65 6e 74 20 76 61 6c 75 65 73 0a 23 20  ferent values.# 
bfe0: 66 6f 72 20 74 68 65 20 73 71 6c 69 74 65 33 5f  for the sqlite3_
bff0: 76 66 73 2e 73 7a 4f 73 46 69 6c 65 20 76 61 72  vfs.szOsFile var
c000: 69 61 62 6c 65 2e 0a 23 0a 66 61 75 6c 74 73 69  iable..#.faultsi
c010: 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f  m_delete_and_reo
c020: 70 65 6e 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  pen.do_execsql_t
c030: 65 73 74 20 70 61 67 65 72 31 2d 31 35 2e 30 20  est pager1-15.0 
c040: 7b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  {.  CREATE TABLE
c050: 20 74 78 28 79 2c 20 7a 29 3b 0a 20 20 49 4e 53   tx(y, z);.  INS
c060: 45 52 54 20 49 4e 54 4f 20 74 78 20 56 41 4c 55  ERT INTO tx VALU
c070: 45 53 28 27 41 79 75 74 74 68 61 79 61 27 2c 20  ES('Ayutthaya', 
c080: 27 42 65 69 6a 69 6e 67 27 29 3b 0a 20 20 49 4e  'Beijing');.  IN
c090: 53 45 52 54 20 49 4e 54 4f 20 74 78 20 56 41 4c  SERT INTO tx VAL
c0a0: 55 45 53 28 27 4c 6f 6e 64 6f 6e 27 2c 20 27 54  UES('London', 'T
c0b0: 6f 6b 79 6f 27 29 3b 0a 7d 20 7b 7d 0a 64 62 20  okyo');.} {}.db 
c0c0: 63 6c 6f 73 65 0a 66 6f 72 20 7b 73 65 74 20 69  close.for {set i
c0d0: 20 30 7d 20 7b 24 69 3c 35 31 33 7d 20 7b 69 6e   0} {$i<513} {in
c0e0: 63 72 20 69 20 33 7d 20 7b 0a 20 20 74 65 73 74  cr i 3} {.  test
c0f0: 76 66 73 20 74 76 20 2d 64 65 66 61 75 6c 74 20  vfs tv -default 
c100: 31 20 2d 73 7a 6f 73 66 69 6c 65 20 24 69 0a 20  1 -szosfile $i. 
c110: 20 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74   sqlite3 db test
c120: 2e 64 62 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c  .db.  do_execsql
c130: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 35 2e  _test pager1-15.
c140: 24 69 2e 31 20 7b 0a 20 20 20 20 53 45 4c 45 43  $i.1 {.    SELEC
c150: 54 20 2a 20 46 52 4f 4d 20 74 78 3b 0a 20 20 7d  T * FROM tx;.  }
c160: 20 7b 41 79 75 74 74 68 61 79 61 20 42 65 69 6a   {Ayutthaya Beij
c170: 69 6e 67 20 4c 6f 6e 64 6f 6e 20 54 6f 6b 79 6f  ing London Tokyo
c180: 7d 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 74  }.  db close.  t
c190: 76 20 64 65 6c 65 74 65 0a 7d 0a 0a 23 2d 2d 2d  v delete.}..#---
c1a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c1b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c1c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c1d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c1e0: 2d 2d 2d 2d 2d 2d 0a 23 20 43 68 65 63 6b 20 74  ------.# Check t
c1f0: 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20 70 6f  hat it is not po
c200: 73 73 69 62 6c 65 20 74 6f 20 6f 70 65 6e 20 61  ssible to open a
c210: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
c220: 66 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 0a  f the full path.
c230: 23 20 74 6f 20 74 68 65 20 61 73 73 6f 63 69 61  # to the associa
c240: 74 65 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ted journal file
c250: 20 77 69 6c 6c 20 62 65 20 6c 6f 6e 67 65 72 20   will be longer 
c260: 74 68 61 6e 20 73 71 6c 69 74 65 33 5f 76 66 73  than sqlite3_vfs
c270: 2e 6d 78 50 61 74 68 6e 61 6d 65 2e 0a 23 0a 74  .mxPathname..#.t
c280: 65 73 74 76 66 73 20 74 76 20 2d 64 65 66 61 75  estvfs tv -defau
c290: 6c 74 20 31 0a 74 76 20 73 63 72 69 70 74 20 78  lt 1.tv script x
c2a0: 4f 70 65 6e 43 62 0a 74 76 20 66 69 6c 74 65 72  OpenCb.tv filter
c2b0: 20 78 4f 70 65 6e 0a 70 72 6f 63 20 78 4f 70 65   xOpen.proc xOpe
c2c0: 6e 43 62 20 7b 6d 65 74 68 6f 64 20 66 69 6c 65  nCb {method file
c2d0: 6e 61 6d 65 7d 20 7b 0a 20 20 73 65 74 20 3a 3a  name} {.  set ::
c2e0: 66 69 6c 65 5f 6c 65 6e 20 5b 73 74 72 69 6e 67  file_len [string
c2f0: 20 6c 65 6e 67 74 68 20 24 66 69 6c 65 6e 61 6d   length $filenam
c300: 65 5d 0a 7d 0a 73 71 6c 69 74 65 33 20 64 62 20  e].}.sqlite3 db 
c310: 74 65 73 74 2e 64 62 0a 64 62 20 63 6c 6f 73 65  test.db.db close
c320: 0a 74 76 20 64 65 6c 65 74 65 0a 0a 66 6f 72 20  .tv delete..for 
c330: 7b 73 65 74 20 69 69 20 5b 65 78 70 72 20 24 3a  {set ii [expr $:
c340: 3a 66 69 6c 65 5f 6c 65 6e 2d 35 5d 7d 20 7b 24  :file_len-5]} {$
c350: 69 69 20 3c 20 5b 65 78 70 72 20 24 3a 3a 66 69  ii < [expr $::fi
c360: 6c 65 5f 6c 65 6e 2b 32 30 5d 7d 20 7b 69 6e 63  le_len+20]} {inc
c370: 72 20 69 69 7d 20 7b 0a 20 20 74 65 73 74 76 66  r ii} {.  testvf
c380: 73 20 74 76 20 2d 64 65 66 61 75 6c 74 20 31 20  s tv -default 1 
c390: 2d 6d 78 70 61 74 68 6e 61 6d 65 20 24 69 69 0a  -mxpathname $ii.
c3a0: 0a 20 20 23 20 54 68 65 20 6c 65 6e 67 74 68 20  .  # The length 
c3b0: 6f 66 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68  of the full path
c3c0: 20 74 6f 20 66 69 6c 65 20 22 74 65 73 74 2e 64   to file "test.d
c3d0: 62 2d 6a 6f 75 72 6e 61 6c 22 20 69 73 20 28 24  b-journal" is ($
c3e0: 3a 3a 66 69 6c 65 5f 6c 65 6e 2b 38 29 2e 0a 20  ::file_len+8).. 
c3f0: 20 23 20 49 66 20 74 68 65 20 63 6f 6e 66 69 67   # If the config
c400: 75 72 65 64 20 73 71 6c 69 74 65 33 5f 76 66 73  ured sqlite3_vfs
c410: 2e 6d 78 50 61 74 68 6e 61 6d 65 20 76 61 6c 75  .mxPathname valu
c420: 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f  e greater than o
c430: 72 20 65 71 75 61 6c 20 74 6f 0a 20 20 23 20 74  r equal to.  # t
c440: 68 69 73 2c 20 74 68 65 6e 20 74 68 65 20 66 69  his, then the fi
c450: 6c 65 20 63 61 6e 20 62 65 20 6f 70 65 6e 65 64  le can be opened
c460: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20  . Otherwise, it 
c470: 63 61 6e 6e 6f 74 2e 0a 20 20 23 0a 20 20 69 66  cannot..  #.  if
c480: 20 7b 24 69 69 20 3e 3d 20 5b 65 78 70 72 20 24   {$ii >= [expr $
c490: 3a 3a 66 69 6c 65 5f 6c 65 6e 2b 38 5d 7d 20 7b  ::file_len+8]} {
c4a0: 0a 20 20 20 20 73 65 74 20 72 65 73 20 7b 30 20  .    set res {0 
c4b0: 7b 7d 7d 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20  {}}.  } else {. 
c4c0: 20 20 20 73 65 74 20 72 65 73 20 7b 31 20 7b 75     set res {1 {u
c4d0: 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 64 61  nable to open da
c4e0: 74 61 62 61 73 65 20 66 69 6c 65 7d 7d 0a 20 20  tabase file}}.  
c4f0: 7d 0a 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67  }..  do_test pag
c500: 65 72 31 2d 31 36 2e 31 2e 24 69 69 20 7b 0a 20  er1-16.1.$ii {. 
c510: 20 20 20 6c 69 73 74 20 5b 63 61 74 63 68 20 7b     list [catch {
c520: 20 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74   sqlite3 db test
c530: 2e 64 62 20 7d 20 6d 73 67 5d 20 24 6d 73 67 0a  .db } msg] $msg.
c540: 20 20 7d 20 24 72 65 73 0a 0a 20 20 63 61 74 63    } $res..  catc
c550: 68 20 7b 64 62 20 63 6c 6f 73 65 7d 0a 20 20 74  h {db close}.  t
c560: 76 20 64 65 6c 65 74 65 0a 7d 0a 0a 23 2d 2d 2d  v delete.}..#---
c570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c5a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c5b0: 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 22 50  ------.# Test "P
c5c0: 52 41 47 4d 41 20 6f 6d 69 74 5f 72 65 61 64 6c  RAGMA omit_readl
c5d0: 6f 63 6b 22 2e 20 0a 23 0a 23 20 20 20 70 61 67  ock". .#.#   pag
c5e0: 65 72 31 2d 31 37 2e 24 74 6e 2e 31 2e 2a 3a 20  er1-17.$tn.1.*: 
c5f0: 54 65 73 74 20 74 68 61 74 20 69 66 20 61 20 73  Test that if a s
c600: 65 63 6f 6e 64 20 63 6f 6e 6e 65 63 74 69 6f 6e  econd connection
c610: 20 68 61 73 20 61 6e 20 6f 70 65 6e 20 0a 23 20   has an open .# 
c620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c630: 20 20 20 20 20 72 65 61 64 2d 74 72 61 6e 73 61       read-transa
c640: 63 74 69 6f 6e 2c 20 69 74 20 69 73 20 6e 6f 74  ction, it is not
c650: 20 75 73 75 61 6c 6c 79 20 70 6f 73 73 69 62 6c   usually possibl
c660: 65 20 74 6f 20 77 72 69 74 65 20 0a 23 20 20 20  e to write .#   
c670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c680: 20 20 20 74 68 65 20 64 61 74 61 62 61 73 65 2e     the database.
c690: 0a 23 0a 23 20 20 20 70 61 67 65 72 31 2d 31 37  .#.#   pager1-17
c6a0: 2e 24 74 6e 2e 32 2e 2a 3a 20 54 65 73 74 20 74  .$tn.2.*: Test t
c6b0: 68 61 74 20 69 66 20 74 68 65 20 73 65 63 6f 6e  hat if the secon
c6c0: 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 61 73  d connection was
c6d0: 20 6f 70 65 6e 65 64 20 77 69 74 68 0a 23 20 20   opened with.#  
c6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c6f0: 20 20 20 20 74 68 65 20 53 51 4c 49 54 45 5f 4f      the SQLITE_O
c700: 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 66 6c 61  PEN_READONLY fla
c710: 67 2c 20 61 6e 64 20 0a 23 20 20 20 20 20 20 20  g, and .#       
c720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
c730: 50 52 41 47 4d 41 20 6f 6d 69 74 5f 72 65 61 64  PRAGMA omit_read
c740: 6c 6f 63 6b 20 3d 20 31 22 20 69 73 20 65 78 65  lock = 1" is exe
c750: 63 75 74 65 64 20 62 65 66 6f 72 65 20 61 74 74  cuted before att
c760: 61 63 68 69 6e 67 0a 23 20 20 20 20 20 20 20 20  aching.#        
c770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
c780: 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 6f  e database and o
c790: 70 65 6e 69 6e 67 20 61 20 72 65 61 64 2d 74 72  pening a read-tr
c7a0: 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 69 74 2c  ansaction on it,
c7b0: 20 69 74 20 69 73 0a 23 20 20 20 20 20 20 20 20   it is.#        
c7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 6f                po
c7d0: 73 73 69 62 6c 65 20 74 6f 20 77 72 69 74 65 20  ssible to write 
c7e0: 74 68 65 20 64 62 2e 0a 23 0a 23 20 20 20 70 61  the db..#.#   pa
c7f0: 67 65 72 31 2d 31 37 2e 24 74 6e 2e 33 2e 2a 3a  ger1-17.$tn.3.*:
c800: 20 54 65 73 74 20 74 68 61 74 20 69 66 20 74 68   Test that if th
c810: 65 20 73 65 63 6f 6e 64 20 63 6f 6e 6e 65 63 74  e second connect
c820: 69 6f 6e 20 77 61 73 20 2a 6e 6f 74 2a 20 6f 70  ion was *not* op
c830: 65 6e 65 64 20 77 69 74 68 0a 23 20 20 20 20 20  ened with.#     
c840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c850: 20 74 68 65 20 53 51 4c 49 54 45 5f 4f 50 45 4e   the SQLITE_OPEN
c860: 5f 52 45 41 44 4f 4e 4c 59 20 66 6c 61 67 2c 20  _READONLY flag, 
c870: 65 78 65 63 75 74 69 6e 67 20 0a 23 20 20 20 20  executing .#    
c880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c890: 20 20 22 50 52 41 47 4d 41 20 6f 6d 69 74 5f 72    "PRAGMA omit_r
c8a0: 65 61 64 6c 6f 63 6b 20 3d 20 31 22 20 68 61 73  eadlock = 1" has
c8b0: 20 6e 6f 20 65 66 66 65 63 74 2e 0a 23 0a 64 6f   no effect..#.do
c8c0: 5f 6d 75 6c 74 69 63 6c 69 65 6e 74 5f 74 65 73  _multiclient_tes
c8d0: 74 20 74 6e 20 7b 0a 20 20 64 6f 5f 74 65 73 74  t tn {.  do_test
c8e0: 20 70 61 67 65 72 31 2d 31 37 2e 24 74 6e 2e 31   pager1-17.$tn.1
c8f0: 2e 31 20 7b 0a 20 20 20 20 73 71 6c 31 20 7b 20  .1 {.    sql1 { 
c900: 0a 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41  .      CREATE TA
c910: 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20  BLE t1(a, b);.  
c920: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
c930: 74 31 20 56 41 4c 55 45 53 28 31 2c 20 32 29 3b  t1 VALUES(1, 2);
c940: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 32 20  .    }.    sql2 
c950: 7b 0a 20 20 20 20 20 20 42 45 47 49 4e 3b 0a 20  {.      BEGIN;. 
c960: 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52       SELECT * FR
c970: 4f 4d 20 74 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  OM t1;.    }.  }
c980: 20 7b 31 20 32 7d 0a 20 20 64 6f 5f 74 65 73 74   {1 2}.  do_test
c990: 20 70 61 67 65 72 31 2d 31 37 2e 24 74 6e 2e 31   pager1-17.$tn.1
c9a0: 2e 32 20 7b 0a 20 20 20 20 63 73 71 6c 31 20 7b  .2 {.    csql1 {
c9b0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
c9c0: 56 41 4c 55 45 53 28 33 2c 20 34 29 20 7d 0a 20  VALUES(3, 4) }. 
c9d0: 20 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20   } {1 {database 
c9e0: 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 20 20 64 6f  is locked}}.  do
c9f0: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 37 2e  _test pager1-17.
ca00: 24 74 6e 2e 31 2e 33 20 7b 0a 20 20 20 20 73 71  $tn.1.3 {.    sq
ca10: 6c 32 20 7b 20 43 4f 4d 4d 49 54 20 7d 0a 20 20  l2 { COMMIT }.  
ca20: 20 20 73 71 6c 31 20 7b 20 49 4e 53 45 52 54 20    sql1 { INSERT 
ca30: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 33  INTO t1 VALUES(3
ca40: 2c 20 34 29 20 7d 0a 20 20 7d 20 7b 7d 0a 0a 20  , 4) }.  } {}.. 
ca50: 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
ca60: 31 37 2e 24 74 6e 2e 32 2e 31 20 7b 0a 20 20 20  17.$tn.2.1 {.   
ca70: 20 63 6f 64 65 32 20 7b 0a 20 20 20 20 20 20 64   code2 {.      d
ca80: 62 32 20 63 6c 6f 73 65 0a 20 20 20 20 20 20 73  b2 close.      s
ca90: 71 6c 69 74 65 33 20 64 62 32 20 3a 6d 65 6d 6f  qlite3 db2 :memo
caa0: 72 79 3a 20 2d 72 65 61 64 6f 6e 6c 79 20 31 0a  ry: -readonly 1.
cab0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 32 20 7b      }.    sql2 {
cac0: 20 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 6f   .      PRAGMA o
cad0: 6d 69 74 5f 72 65 61 64 6c 6f 63 6b 20 3d 20 31  mit_readlock = 1
cae0: 3b 0a 20 20 20 20 20 20 41 54 54 41 43 48 20 27  ;.      ATTACH '
caf0: 74 65 73 74 2e 64 62 27 20 41 53 20 74 77 6f 3b  test.db' AS two;
cb00: 0a 20 20 20 20 20 20 42 45 47 49 4e 3b 0a 20 20  .      BEGIN;.  
cb10: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
cb20: 4d 20 74 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 20  M t1;.    }.  } 
cb30: 7b 31 20 32 20 33 20 34 7d 0a 20 20 64 6f 5f 74  {1 2 3 4}.  do_t
cb40: 65 73 74 20 70 61 67 65 72 31 2d 31 37 2e 24 74  est pager1-17.$t
cb50: 6e 2e 32 2e 32 20 7b 20 73 71 6c 31 20 22 49 4e  n.2.2 { sql1 "IN
cb60: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
cb70: 55 45 53 28 35 2c 20 36 29 22 20 7d 20 7b 7d 0a  UES(5, 6)" } {}.
cb80: 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
cb90: 2d 31 37 2e 24 74 6e 2e 32 2e 33 20 7b 20 73 71  -17.$tn.2.3 { sq
cba0: 6c 32 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f  l2 "SELECT * FRO
cbb0: 4d 20 74 31 22 20 7d 20 20 20 20 20 20 20 20 20  M t1" }         
cbc0: 20 20 20 7b 31 20 32 20 33 20 34 7d 0a 20 20 64     {1 2 3 4}.  d
cbd0: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 37  o_test pager1-17
cbe0: 2e 24 74 6e 2e 32 2e 34 20 7b 20 73 71 6c 32 20  .$tn.2.4 { sql2 
cbf0: 22 43 4f 4d 4d 49 54 20 3b 20 53 45 4c 45 43 54  "COMMIT ; SELECT
cc00: 20 2a 20 46 52 4f 4d 20 74 31 22 20 7d 20 20 20   * FROM t1" }   
cc10: 7b 31 20 32 20 33 20 34 20 35 20 36 7d 0a 0a 20  {1 2 3 4 5 6}.. 
cc20: 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
cc30: 31 37 2e 24 74 6e 2e 33 2e 31 20 7b 0a 20 20 20  17.$tn.3.1 {.   
cc40: 20 63 6f 64 65 32 20 7b 0a 20 20 20 20 20 20 64   code2 {.      d
cc50: 62 32 20 63 6c 6f 73 65 0a 20 20 20 20 20 20 73  b2 close.      s
cc60: 71 6c 69 74 65 33 20 64 62 32 20 3a 6d 65 6d 6f  qlite3 db2 :memo
cc70: 72 79 3a 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  ry:.    }.    sq
cc80: 6c 32 20 7b 20 0a 20 20 20 20 20 20 50 52 41 47  l2 { .      PRAG
cc90: 4d 41 20 6f 6d 69 74 5f 72 65 61 64 6c 6f 63 6b  MA omit_readlock
cca0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 41 54 54 41   = 1;.      ATTA
ccb0: 43 48 20 27 74 65 73 74 2e 64 62 27 20 41 53 20  CH 'test.db' AS 
ccc0: 74 77 6f 3b 0a 20 20 20 20 20 20 42 45 47 49 4e  two;.      BEGIN
ccd0: 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a  ;.      SELECT *
cce0: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 7d 0a   FROM t1;.    }.
ccf0: 20 20 7d 20 7b 31 20 32 20 33 20 34 20 35 20 36    } {1 2 3 4 5 6
cd00: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65  }.  do_test page
cd10: 72 31 2d 31 37 2e 24 74 6e 2e 33 2e 32 20 7b 0a  r1-17.$tn.3.2 {.
cd20: 20 20 20 20 63 73 71 6c 31 20 7b 20 49 4e 53 45      csql1 { INSE
cd30: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
cd40: 53 28 33 2c 20 34 29 20 7d 0a 20 20 7d 20 7b 31  S(3, 4) }.  } {1
cd50: 20 7b 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f   {database is lo
cd60: 63 6b 65 64 7d 7d 0a 20 20 64 6f 5f 74 65 73 74  cked}}.  do_test
cd70: 20 70 61 67 65 72 31 2d 31 37 2e 24 74 6e 2e 33   pager1-17.$tn.3
cd80: 2e 33 20 7b 20 73 71 6c 32 20 43 4f 4d 4d 49 54  .3 { sql2 COMMIT
cd90: 20 7d 20 7b 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d   } {}.}..#------
cda0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cdb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cdc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cdd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cde0: 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68 65 20 70  ---.# Test the p
cdf0: 61 67 65 72 73 20 72 65 73 70 6f 6e 73 65 20 74  agers response t
ce00: 6f 20 74 68 65 20 62 2d 74 72 65 65 20 6c 61 79  o the b-tree lay
ce10: 65 72 20 72 65 71 75 65 73 74 69 6e 67 20 69 6c  er requesting il
ce20: 6c 65 67 61 6c 20 70 61 67 65 20 0a 23 20 6e 75  legal page .# nu
ce30: 6d 62 65 72 73 3a 0a 23 0a 23 20 20 20 2b 20 54  mbers:.#.#   + T
ce40: 68 65 20 6c 6f 63 6b 69 6e 67 20 70 61 67 65 2c  he locking page,
ce50: 0a 23 20 20 20 2b 20 50 61 67 65 20 30 2c 0a 23  .#   + Page 0,.#
ce60: 20 20 20 2b 20 41 20 70 61 67 65 20 77 69 74 68     + A page with
ce70: 20 61 20 70 61 67 65 20 6e 75 6d 62 65 72 20 67   a page number g
ce80: 72 65 61 74 65 72 20 74 68 61 6e 20 28 32 5e 33  reater than (2^3
ce90: 31 2d 31 29 2e 0a 23 0a 64 6f 5f 74 65 73 74 20  1-1)..#.do_test 
cea0: 70 61 67 65 72 31 2d 31 38 2e 31 20 7b 0a 20 20  pager1-18.1 {.  
ceb0: 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f  faultsim_delete_
cec0: 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 64 62 20  and_reopen.  db 
ced0: 66 75 6e 63 20 61 5f 73 74 72 69 6e 67 20 61 5f  func a_string a_
cee0: 73 74 72 69 6e 67 0a 20 20 65 78 65 63 73 71 6c  string.  execsql
cef0: 20 7b 20 0a 20 20 20 20 50 52 41 47 4d 41 20 70   { .    PRAGMA p
cf00: 61 67 65 5f 73 69 7a 65 20 3d 20 31 30 32 34 3b  age_size = 1024;
cf10: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
cf20: 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20  E t1(a, b);.    
cf30: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
cf40: 41 4c 55 45 53 28 61 5f 73 74 72 69 6e 67 28 35  ALUES(a_string(5
cf50: 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 32 30  00), a_string(20
cf60: 30 29 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  0));.    INSERT 
cf70: 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61  INTO t1 SELECT a
cf80: 5f 73 74 72 69 6e 67 28 35 30 30 29 2c 20 61 5f  _string(500), a_
cf90: 73 74 72 69 6e 67 28 32 30 30 29 20 46 52 4f 4d  string(200) FROM
cfa0: 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   t1;.    INSERT 
cfb0: 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61  INTO t1 SELECT a
cfc0: 5f 73 74 72 69 6e 67 28 35 30 30 29 2c 20 61 5f  _string(500), a_
cfd0: 73 74 72 69 6e 67 28 32 30 30 29 20 46 52 4f 4d  string(200) FROM
cfe0: 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   t1;.    INSERT 
cff0: 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61  INTO t1 SELECT a
d000: 5f 73 74 72 69 6e 67 28 35 30 30 29 2c 20 61 5f  _string(500), a_
d010: 73 74 72 69 6e 67 28 32 30 30 29 20 46 52 4f 4d  string(200) FROM
d020: 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   t1;.    INSERT 
d030: 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61  INTO t1 SELECT a
d040: 5f 73 74 72 69 6e 67 28 35 30 30 29 2c 20 61 5f  _string(500), a_
d050: 73 74 72 69 6e 67 28 32 30 30 29 20 46 52 4f 4d  string(200) FROM
d060: 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   t1;.    INSERT 
d070: 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61  INTO t1 SELECT a
d080: 5f 73 74 72 69 6e 67 28 35 30 30 29 2c 20 61 5f  _string(500), a_
d090: 73 74 72 69 6e 67 28 32 30 30 29 20 46 52 4f 4d  string(200) FROM
d0a0: 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   t1;.    INSERT 
d0b0: 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61  INTO t1 SELECT a
d0c0: 5f 73 74 72 69 6e 67 28 35 30 30 29 2c 20 61 5f  _string(500), a_
d0d0: 73 74 72 69 6e 67 28 32 30 30 29 20 46 52 4f 4d  string(200) FROM
d0e0: 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   t1;.    INSERT 
d0f0: 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61  INTO t1 SELECT a
d100: 5f 73 74 72 69 6e 67 28 35 30 30 29 2c 20 61 5f  _string(500), a_
d110: 73 74 72 69 6e 67 28 32 30 30 29 20 46 52 4f 4d  string(200) FROM
d120: 20 74 31 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f   t1;.  }.} {}.do
d130: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 38 2e  _test pager1-18.
d140: 32 20 7b 0a 20 20 73 65 74 20 72 6f 6f 74 20 5b  2 {.  set root [
d150: 64 62 20 6f 6e 65 20 22 53 45 4c 45 43 54 20 72  db one "SELECT r
d160: 6f 6f 74 70 61 67 65 20 46 52 4f 4d 20 73 71 6c  ootpage FROM sql
d170: 69 74 65 5f 6d 61 73 74 65 72 22 5d 0a 20 20 73  ite_master"].  s
d180: 65 74 20 6c 6f 63 6b 69 6e 67 70 61 67 65 20 5b  et lockingpage [
d190: 65 78 70 72 20 28 30 78 31 30 30 30 30 2f 31 30  expr (0x10000/10
d1a0: 32 34 29 20 2b 20 31 5d 0a 20 20 65 78 65 63 73  24) + 1].  execs
d1b0: 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20  ql {.    PRAGMA 
d1c0: 77 72 69 74 61 62 6c 65 5f 73 63 68 65 6d 61 20  writable_schema 
d1d0: 3d 20 31 3b 0a 20 20 20 20 55 50 44 41 54 45 20  = 1;.    UPDATE 
d1e0: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 53 45  sqlite_master SE
d1f0: 54 20 72 6f 6f 74 70 61 67 65 20 3d 20 24 6c 6f  T rootpage = $lo
d200: 63 6b 69 6e 67 70 61 67 65 3b 0a 20 20 7d 0a 20  ckingpage;.  }. 
d210: 20 73 71 6c 69 74 65 33 20 64 62 32 20 74 65 73   sqlite3 db2 tes
d220: 74 2e 64 62 0a 20 20 63 61 74 63 68 73 71 6c 20  t.db.  catchsql 
d230: 7b 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a  { SELECT count(*
d240: 29 20 46 52 4f 4d 20 74 31 20 7d 20 64 62 32 0a  ) FROM t1 } db2.
d250: 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20 64  } {1 {database d
d260: 69 73 6b 20 69 6d 61 67 65 20 69 73 20 6d 61 6c  isk image is mal
d270: 66 6f 72 6d 65 64 7d 7d 0a 64 62 32 20 63 6c 6f  formed}}.db2 clo
d280: 73 65 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  se.do_test pager
d290: 31 2d 31 38 2e 33 20 7b 0a 20 20 65 78 65 63 73  1-18.3 {.  execs
d2a0: 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20  ql {.    CREATE 
d2b0: 54 41 42 4c 45 20 74 32 28 78 29 3b 0a 20 20 20  TABLE t2(x);.   
d2c0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20   INSERT INTO t2 
d2d0: 56 41 4c 55 45 53 28 61 5f 73 74 72 69 6e 67 28  VALUES(a_string(
d2e0: 35 30 30 30 29 29 3b 0a 20 20 7d 0a 20 20 73 65  5000));.  }.  se
d2f0: 74 20 70 67 6e 6f 20 5b 65 78 70 72 20 28 5b 66  t pgno [expr ([f
d300: 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62  ile size test.db
d310: 5d 20 2f 20 31 30 32 34 29 2d 32 5d 0a 20 20 68  ] / 1024)-2].  h
d320: 65 78 69 6f 5f 77 72 69 74 65 20 74 65 73 74 2e  exio_write test.
d330: 64 62 20 5b 65 78 70 72 20 28 24 70 67 6e 6f 2d  db [expr ($pgno-
d340: 31 29 2a 31 30 32 34 5d 20 30 30 30 30 30 30 30  1)*1024] 0000000
d350: 30 0a 20 20 73 71 6c 69 74 65 33 20 64 62 32 20  0.  sqlite3 db2 
d360: 74 65 73 74 2e 64 62 0a 20 20 63 61 74 63 68 73  test.db.  catchs
d370: 71 6c 20 7b 20 53 45 4c 45 43 54 20 6c 65 6e 67  ql { SELECT leng
d380: 74 68 28 78 29 20 46 52 4f 4d 20 74 32 20 7d 20  th(x) FROM t2 } 
d390: 64 62 32 0a 7d 20 7b 31 20 7b 64 61 74 61 62 61  db2.} {1 {databa
d3a0: 73 65 20 64 69 73 6b 20 69 6d 61 67 65 20 69 73  se disk image is
d3b0: 20 6d 61 6c 66 6f 72 6d 65 64 7d 7d 0a 64 62 32   malformed}}.db2
d3c0: 20 63 6c 6f 73 65 0a 64 6f 5f 74 65 73 74 20 70   close.do_test p
d3d0: 61 67 65 72 31 2d 31 38 2e 34 20 7b 0a 20 20 68  ager1-18.4 {.  h
d3e0: 65 78 69 6f 5f 77 72 69 74 65 20 74 65 73 74 2e  exio_write test.
d3f0: 64 62 20 5b 65 78 70 72 20 28 24 70 67 6e 6f 2d  db [expr ($pgno-
d400: 31 29 2a 31 30 32 34 5d 20 39 30 30 30 30 30 30  1)*1024] 9000000
d410: 30 0a 20 20 73 71 6c 69 74 65 33 20 64 62 32 20  0.  sqlite3 db2 
d420: 74 65 73 74 2e 64 62 0a 20 20 63 61 74 63 68 73  test.db.  catchs
d430: 71 6c 20 7b 20 53 45 4c 45 43 54 20 6c 65 6e 67  ql { SELECT leng
d440: 74 68 28 78 29 20 46 52 4f 4d 20 74 32 20 7d 20  th(x) FROM t2 } 
d450: 64 62 32 0a 7d 20 7b 31 20 7b 64 61 74 61 62 61  db2.} {1 {databa
d460: 73 65 20 64 69 73 6b 20 69 6d 61 67 65 20 69 73  se disk image is
d470: 20 6d 61 6c 66 6f 72 6d 65 64 7d 7d 0a 64 62 32   malformed}}.db2
d480: 20 63 6c 6f 73 65 0a 64 6f 5f 74 65 73 74 20 70   close.do_test p
d490: 61 67 65 72 31 2d 31 38 2e 35 20 7b 0a 20 20 73  ager1-18.5 {.  s
d4a0: 71 6c 69 74 65 33 20 64 62 20 22 22 0a 20 20 65  qlite3 db "".  e
d4b0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45  xecsql {.    CRE
d4c0: 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20  ATE TABLE t1(a, 
d4d0: 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  b);.    CREATE T
d4e0: 41 42 4c 45 20 74 32 28 61 2c 20 62 29 3b 0a 20  ABLE t2(a, b);. 
d4f0: 20 20 20 50 52 41 47 4d 41 20 77 72 69 74 61 62     PRAGMA writab
d500: 6c 65 5f 73 63 68 65 6d 61 20 3d 20 31 3b 0a 20  le_schema = 1;. 
d510: 20 20 20 55 50 44 41 54 45 20 73 71 6c 69 74 65     UPDATE sqlite
d520: 5f 6d 61 73 74 65 72 20 53 45 54 20 72 6f 6f 74  _master SET root
d530: 70 61 67 65 3d 35 20 57 48 45 52 45 20 74 62 6c  page=5 WHERE tbl
d540: 5f 6e 61 6d 65 20 3d 20 27 74 31 27 3b 0a 20 20  _name = 't1';.  
d550: 20 20 50 52 41 47 4d 41 20 77 72 69 74 61 62 6c    PRAGMA writabl
d560: 65 5f 73 63 68 65 6d 61 20 3d 20 30 3b 0a 20 20  e_schema = 0;.  
d570: 20 20 41 4c 54 45 52 20 54 41 42 4c 45 20 74 31    ALTER TABLE t1
d580: 20 52 45 4e 41 4d 45 20 54 4f 20 78 31 3b 0a 20   RENAME TO x1;. 
d590: 20 7d 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20   }.  catchsql { 
d5a0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 78 31  SELECT * FROM x1
d5b0: 20 7d 0a 7d 20 7b 31 20 7b 64 61 74 61 62 61 73   }.} {1 {databas
d5c0: 65 20 64 69 73 6b 20 69 6d 61 67 65 20 69 73 20  e disk image is 
d5d0: 6d 61 6c 66 6f 72 6d 65 64 7d 7d 0a 64 62 20 63  malformed}}.db c
d5e0: 6c 6f 73 65 0a 0a 64 6f 5f 74 65 73 74 20 70 61  lose..do_test pa
d5f0: 67 65 72 31 2d 31 38 2e 36 20 7b 0a 20 20 66 61  ger1-18.6 {.  fa
d600: 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e  ultsim_delete_an
d610: 64 5f 72 65 6f 70 65 6e 0a 20 20 64 62 20 66 75  d_reopen.  db fu
d620: 6e 63 20 61 5f 73 74 72 69 6e 67 20 61 5f 73 74  nc a_string a_st
d630: 72 69 6e 67 0a 20 20 65 78 65 63 73 71 6c 20 7b  ring.  execsql {
d640: 0a 20 20 20 20 50 52 41 47 4d 41 20 70 61 67 65  .    PRAGMA page
d650: 5f 73 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20  _size = 1024;.  
d660: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
d670: 31 28 78 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  1(x);.    INSERT
d680: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
d690: 61 5f 73 74 72 69 6e 67 28 38 30 30 29 29 3b 0a  a_string(800));.
d6a0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
d6b0: 74 31 20 56 41 4c 55 45 53 28 61 5f 73 74 72 69  t1 VALUES(a_stri
d6c0: 6e 67 28 38 30 30 29 29 3b 0a 20 20 7d 0a 0a 20  ng(800));.  }.. 
d6d0: 20 73 65 74 20 72 6f 6f 74 20 5b 64 62 20 6f 6e   set root [db on
d6e0: 65 20 22 53 45 4c 45 43 54 20 72 6f 6f 74 70 61  e "SELECT rootpa
d6f0: 67 65 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d  ge FROM sqlite_m
d700: 61 73 74 65 72 22 5d 0a 20 20 64 62 20 63 6c 6f  aster"].  db clo
d710: 73 65 0a 0a 20 20 68 65 78 69 6f 5f 77 72 69 74  se..  hexio_writ
d720: 65 20 74 65 73 74 2e 64 62 20 5b 65 78 70 72 20  e test.db [expr 
d730: 28 24 72 6f 6f 74 2d 31 29 2a 31 30 32 34 20 2b  ($root-1)*1024 +
d740: 20 38 5d 20 30 30 30 30 30 30 30 30 0a 20 20 73   8] 00000000.  s
d750: 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64  qlite3 db test.d
d760: 62 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20 53  b.  catchsql { S
d770: 45 4c 45 43 54 20 6c 65 6e 67 74 68 28 78 29 20  ELECT length(x) 
d780: 46 52 4f 4d 20 74 31 20 7d 0a 7d 20 7b 31 20 7b  FROM t1 }.} {1 {
d790: 64 61 74 61 62 61 73 65 20 64 69 73 6b 20 69 6d  database disk im
d7a0: 61 67 65 20 69 73 20 6d 61 6c 66 6f 72 6d 65 64  age is malformed
d7b0: 7d 7d 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  }}..do_test page
d7c0: 72 31 2d 31 39 2e 31 20 7b 0a 20 20 73 71 6c 69  r1-19.1 {.  sqli
d7d0: 74 65 33 20 64 62 20 22 22 0a 20 20 64 62 20 66  te3 db "".  db f
d7e0: 75 6e 63 20 61 5f 73 74 72 69 6e 67 20 61 5f 73  unc a_string a_s
d7f0: 74 72 69 6e 67 0a 20 20 65 78 65 63 73 71 6c 20  tring.  execsql 
d800: 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 70 61 67  {.    PRAGMA pag
d810: 65 5f 73 69 7a 65 20 3d 20 35 31 32 3b 0a 20 20  e_size = 512;.  
d820: 20 20 50 52 41 47 4d 41 20 61 75 74 6f 5f 76 61    PRAGMA auto_va
d830: 63 75 75 6d 20 3d 20 31 3b 0a 20 20 20 20 43 52  cuum = 1;.    CR
d840: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 61  EATE TABLE t1(aa
d850: 2c 20 61 62 2c 20 61 63 2c 20 61 64 2c 20 61 65  , ab, ac, ad, ae
d860: 2c 20 61 66 2c 20 61 67 2c 20 61 68 2c 20 61 69  , af, ag, ah, ai
d870: 2c 20 61 6a 2c 20 61 6b 2c 20 61 6c 2c 20 61 6d  , aj, ak, al, am
d880: 2c 20 61 6e 2c 0a 20 20 20 20 20 20 20 20 20 20  , an,.          
d890: 20 20 20 20 20 20 20 20 20 20 62 61 2c 20 62 62            ba, bb
d8a0: 2c 20 62 63 2c 20 62 64 2c 20 62 65 2c 20 62 66  , bc, bd, be, bf
d8b0: 2c 20 62 67 2c 20 62 68 2c 20 62 69 2c 20 62 6a  , bg, bh, bi, bj
d8c0: 2c 20 62 6b 2c 20 62 6c 2c 20 62 6d 2c 20 62 6e  , bk, bl, bm, bn
d8d0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
d8e0: 20 20 20 20 20 20 63 61 2c 20 63 62 2c 20 63 63        ca, cb, cc
d8f0: 2c 20 63 64 2c 20 63 65 2c 20 63 66 2c 20 63 67  , cd, ce, cf, cg
d900: 2c 20 63 68 2c 20 63 69 2c 20 63 6a 2c 20 63 6b  , ch, ci, cj, ck
d910: 2c 20 63 6c 2c 20 63 6d 2c 20 63 6e 2c 0a 20 20  , cl, cm, cn,.  
d920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d930: 20 20 64 61 2c 20 64 62 2c 20 64 63 2c 20 64 64    da, db, dc, dd
d940: 2c 20 64 65 2c 20 64 66 2c 20 64 67 2c 20 64 68  , de, df, dg, dh
d950: 2c 20 64 69 2c 20 64 6a 2c 20 64 6b 2c 20 64 6c  , di, dj, dk, dl
d960: 2c 20 64 6d 2c 20 64 6e 2c 0a 20 20 20 20 20 20  , dm, dn,.      
d970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 61                ea
d980: 2c 20 65 62 2c 20 65 63 2c 20 65 64 2c 20 65 65  , eb, ec, ed, ee
d990: 2c 20 65 66 2c 20 65 67 2c 20 65 68 2c 20 65 69  , ef, eg, eh, ei
d9a0: 2c 20 65 6a 2c 20 65 6b 2c 20 65 6c 2c 20 65 6d  , ej, ek, el, em
d9b0: 2c 20 65 6e 2c 0a 20 20 20 20 20 20 20 20 20 20  , en,.          
d9c0: 20 20 20 20 20 20 20 20 20 20 66 61 2c 20 66 62            fa, fb
d9d0: 2c 20 66 63 2c 20 66 64 2c 20 66 65 2c 20 66 66  , fc, fd, fe, ff
d9e0: 2c 20 66 67 2c 20 66 68 2c 20 66 69 2c 20 66 6a  , fg, fh, fi, fj
d9f0: 2c 20 66 6b 2c 20 66 6c 2c 20 66 6d 2c 20 66 6e  , fk, fl, fm, fn
da00: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
da10: 20 20 20 20 20 20 67 61 2c 20 67 62 2c 20 67 63        ga, gb, gc
da20: 2c 20 67 64 2c 20 67 65 2c 20 67 66 2c 20 67 67  , gd, ge, gf, gg
da30: 2c 20 67 68 2c 20 67 69 2c 20 67 6a 2c 20 67 6b  , gh, gi, gj, gk
da40: 2c 20 67 6c 2c 20 67 6d 2c 20 67 6e 2c 0a 20 20  , gl, gm, gn,.  
da50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da60: 20 20 68 61 2c 20 68 62 2c 20 68 63 2c 20 68 64    ha, hb, hc, hd
da70: 2c 20 68 65 2c 20 68 66 2c 20 68 67 2c 20 68 68  , he, hf, hg, hh
da80: 2c 20 68 69 2c 20 68 6a 2c 20 68 6b 2c 20 68 6c  , hi, hj, hk, hl
da90: 2c 20 68 6d 2c 20 68 6e 2c 0a 20 20 20 20 20 20  , hm, hn,.      
daa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 61                ia
dab0: 2c 20 69 62 2c 20 69 63 2c 20 69 64 2c 20 69 65  , ib, ic, id, ie
dac0: 2c 20 69 66 2c 20 69 67 2c 20 69 68 2c 20 69 69  , if, ig, ih, ii
dad0: 2c 20 69 6a 2c 20 69 6b 2c 20 69 6c 2c 20 69 6d  , ij, ik, il, im
dae0: 2c 20 69 78 2c 0a 20 20 20 20 20 20 20 20 20 20  , ix,.          
daf0: 20 20 20 20 20 20 20 20 20 20 6a 61 2c 20 6a 62            ja, jb
db00: 2c 20 6a 63 2c 20 6a 64 2c 20 6a 65 2c 20 6a 66  , jc, jd, je, jf
db10: 2c 20 6a 67 2c 20 6a 68 2c 20 6a 69 2c 20 6a 6a  , jg, jh, ji, jj
db20: 2c 20 6a 6b 2c 20 6a 6c 2c 20 6a 6d 2c 20 6a 6e  , jk, jl, jm, jn
db30: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
db40: 20 20 20 20 20 20 6b 61 2c 20 6b 62 2c 20 6b 63        ka, kb, kc
db50: 2c 20 6b 64 2c 20 6b 65 2c 20 6b 66 2c 20 6b 67  , kd, ke, kf, kg
db60: 2c 20 6b 68 2c 20 6b 69 2c 20 6b 6a 2c 20 6b 6b  , kh, ki, kj, kk
db70: 2c 20 6b 6c 2c 20 6b 6d 2c 20 6b 6e 2c 0a 20 20  , kl, km, kn,.  
db80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db90: 20 20 6c 61 2c 20 6c 62 2c 20 6c 63 2c 20 6c 64    la, lb, lc, ld
dba0: 2c 20 6c 65 2c 20 6c 66 2c 20 6c 67 2c 20 6c 68  , le, lf, lg, lh
dbb0: 2c 20 6c 69 2c 20 6c 6a 2c 20 6c 6b 2c 20 6c 6c  , li, lj, lk, ll
dbc0: 2c 20 6c 6d 2c 20 6c 6e 2c 0a 20 20 20 20 20 20  , lm, ln,.      
dbd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 61                ma
dbe0: 2c 20 6d 62 2c 20 6d 63 2c 20 6d 64 2c 20 6d 65  , mb, mc, md, me
dbf0: 2c 20 6d 66 2c 20 6d 67 2c 20 6d 68 2c 20 6d 69  , mf, mg, mh, mi
dc00: 2c 20 6d 6a 2c 20 6d 6b 2c 20 6d 6c 2c 20 6d 6d  , mj, mk, ml, mm
dc10: 2c 20 6d 6e 0a 20 20 20 20 29 3b 0a 20 20 20 20  , mn.    );.    
dc20: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32 28  CREATE TABLE t2(
dc30: 61 61 2c 20 61 62 2c 20 61 63 2c 20 61 64 2c 20  aa, ab, ac, ad, 
dc40: 61 65 2c 20 61 66 2c 20 61 67 2c 20 61 68 2c 20  ae, af, ag, ah, 
dc50: 61 69 2c 20 61 6a 2c 20 61 6b 2c 20 61 6c 2c 20  ai, aj, ak, al, 
dc60: 61 6d 2c 20 61 6e 2c 0a 20 20 20 20 20 20 20 20  am, an,.        
dc70: 20 20 20 20 20 20 20 20 20 20 20 20 62 61 2c 20              ba, 
dc80: 62 62 2c 20 62 63 2c 20 62 64 2c 20 62 65 2c 20  bb, bc, bd, be, 
dc90: 62 66 2c 20 62 67 2c 20 62 68 2c 20 62 69 2c 20  bf, bg, bh, bi, 
dca0: 62 6a 2c 20 62 6b 2c 20 62 6c 2c 20 62 6d 2c 20  bj, bk, bl, bm, 
dcb0: 62 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  bn,.            
dcc0: 20 20 20 20 20 20 20 20 63 61 2c 20 63 62 2c 20          ca, cb, 
dcd0: 63 63 2c 20 63 64 2c 20 63 65 2c 20 63 66 2c 20  cc, cd, ce, cf, 
dce0: 63 67 2c 20 63 68 2c 20 63 69 2c 20 63 6a 2c 20  cg, ch, ci, cj, 
dcf0: 63 6b 2c 20 63 6c 2c 20 63 6d 2c 20 63 6e 2c 0a  ck, cl, cm, cn,.
dd00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd10: 20 20 20 20 64 61 2c 20 64 62 2c 20 64 63 2c 20      da, db, dc, 
dd20: 64 64 2c 20 64 65 2c 20 64 66 2c 20 64 67 2c 20  dd, de, df, dg, 
dd30: 64 68 2c 20 64 69 2c 20 64 6a 2c 20 64 6b 2c 20  dh, di, dj, dk, 
dd40: 64 6c 2c 20 64 6d 2c 20 64 6e 2c 0a 20 20 20 20  dl, dm, dn,.    
dd50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd60: 65 61 2c 20 65 62 2c 20 65 63 2c 20 65 64 2c 20  ea, eb, ec, ed, 
dd70: 65 65 2c 20 65 66 2c 20 65 67 2c 20 65 68 2c 20  ee, ef, eg, eh, 
dd80: 65 69 2c 20 65 6a 2c 20 65 6b 2c 20 65 6c 2c 20  ei, ej, ek, el, 
dd90: 65 6d 2c 20 65 6e 2c 0a 20 20 20 20 20 20 20 20  em, en,.        
dda0: 20 20 20 20 20 20 20 20 20 20 20 20 66 61 2c 20              fa, 
ddb0: 66 62 2c 20 66 63 2c 20 66 64 2c 20 66 65 2c 20  fb, fc, fd, fe, 
ddc0: 66 66 2c 20 66 67 2c 20 66 68 2c 20 66 69 2c 20  ff, fg, fh, fi, 
ddd0: 66 6a 2c 20 66 6b 2c 20 66 6c 2c 20 66 6d 2c 20  fj, fk, fl, fm, 
dde0: 66 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  fn,.            
ddf0: 20 20 20 20 20 20 20 20 67 61 2c 20 67 62 2c 20          ga, gb, 
de00: 67 63 2c 20 67 64 2c 20 67 65 2c 20 67 66 2c 20  gc, gd, ge, gf, 
de10: 67 67 2c 20 67 68 2c 20 67 69 2c 20 67 6a 2c 20  gg, gh, gi, gj, 
de20: 67 6b 2c 20 67 6c 2c 20 67 6d 2c 20 67 6e 2c 0a  gk, gl, gm, gn,.
de30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de40: 20 20 20 20 68 61 2c 20 68 62 2c 20 68 63 2c 20      ha, hb, hc, 
de50: 68 64 2c 20 68 65 2c 20 68 66 2c 20 68 67 2c 20  hd, he, hf, hg, 
de60: 68 68 2c 20 68 69 2c 20 68 6a 2c 20 68 6b 2c 20  hh, hi, hj, hk, 
de70: 68 6c 2c 20 68 6d 2c 20 68 6e 2c 0a 20 20 20 20  hl, hm, hn,.    
de80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de90: 69 61 2c 20 69 62 2c 20 69 63 2c 20 69 64 2c 20  ia, ib, ic, id, 
dea0: 69 65 2c 20 69 66 2c 20 69 67 2c 20 69 68 2c 20  ie, if, ig, ih, 
deb0: 69 69 2c 20 69 6a 2c 20 69 6b 2c 20 69 6c 2c 20  ii, ij, ik, il, 
dec0: 69 6d 2c 20 69 78 2c 0a 20 20 20 20 20 20 20 20  im, ix,.        
ded0: 20 20 20 20 20 20 20 20 20 20 20 20 6a 61 2c 20              ja, 
dee0: 6a 62 2c 20 6a 63 2c 20 6a 64 2c 20 6a 65 2c 20  jb, jc, jd, je, 
def0: 6a 66 2c 20 6a 67 2c 20 6a 68 2c 20 6a 69 2c 20  jf, jg, jh, ji, 
df00: 6a 6a 2c 20 6a 6b 2c 20 6a 6c 2c 20 6a 6d 2c 20  jj, jk, jl, jm, 
df10: 6a 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  jn,.            
df20: 20 20 20 20 20 20 20 20 6b 61 2c 20 6b 62 2c 20          ka, kb, 
df30: 6b 63 2c 20 6b 64 2c 20 6b 65 2c 20 6b 66 2c 20  kc, kd, ke, kf, 
df40: 6b 67 2c 20 6b 68 2c 20 6b 69 2c 20 6b 6a 2c 20  kg, kh, ki, kj, 
df50: 6b 6b 2c 20 6b 6c 2c 20 6b 6d 2c 20 6b 6e 2c 0a  kk, kl, km, kn,.
df60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df70: 20 20 20 20 6c 61 2c 20 6c 62 2c 20 6c 63 2c 20      la, lb, lc, 
df80: 6c 64 2c 20 6c 65 2c 20 6c 66 2c 20 6c 67 2c 20  ld, le, lf, lg, 
df90: 6c 68 2c 20 6c 69 2c 20 6c 6a 2c 20 6c 6b 2c 20  lh, li, lj, lk, 
dfa0: 6c 6c 2c 20 6c 6d 2c 20 6c 6e 2c 0a 20 20 20 20  ll, lm, ln,.    
dfb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dfc0: 6d 61 2c 20 6d 62 2c 20 6d 63 2c 20 6d 64 2c 20  ma, mb, mc, md, 
dfd0: 6d 65 2c 20 6d 66 2c 20 6d 67 2c 20 6d 68 2c 20  me, mf, mg, mh, 
dfe0: 6d 69 2c 20 6d 6a 2c 20 6d 6b 2c 20 6d 6c 2c 20  mi, mj, mk, ml, 
dff0: 6d 6d 2c 20 6d 6e 0a 20 20 20 20 29 3b 0a 20 20  mm, mn.    );.  
e000: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
e010: 28 61 61 29 20 56 41 4c 55 45 53 28 20 61 5f 73  (aa) VALUES( a_s
e020: 74 72 69 6e 67 28 31 30 30 30 30 30 29 20 29 3b  tring(100000) );
e030: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
e040: 20 74 32 28 61 61 29 20 56 41 4c 55 45 53 28 20   t2(aa) VALUES( 
e050: 61 5f 73 74 72 69 6e 67 28 31 30 30 30 30 30 29  a_string(100000)
e060: 20 29 3b 0a 20 20 20 20 56 41 43 55 55 4d 3b 0a   );.    VACUUM;.
e070: 20 20 7d 0a 7d 20 7b 7d 0a 0a 23 2d 2d 2d 2d 2d    }.} {}..#-----
e080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e0a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e0b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e0c0: 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 61 20 63 6f  ----.# Test a co
e0d0: 75 70 6c 65 20 6f 66 20 73 70 65 63 69 61 6c 20  uple of special 
e0e0: 63 61 73 65 73 20 74 68 61 74 20 63 6f 6d 65 20  cases that come 
e0f0: 75 70 20 77 68 69 6c 65 20 63 6f 6d 6d 69 74 74  up while committ
e100: 69 6e 67 20 0a 23 20 74 72 61 6e 73 61 63 74 69  ing .# transacti
e110: 6f 6e 73 3a 0a 23 0a 23 20 20 20 70 61 67 65 72  ons:.#.#   pager
e120: 31 2d 32 30 2e 31 2e 2a 3a 20 43 6f 6d 6d 69 74  1-20.1.*: Commit
e130: 74 69 6e 67 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  ting an in-memor
e140: 79 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73  y database trans
e150: 61 63 74 69 6f 6e 20 77 68 65 6e 20 74 68 65 20  action when the 
e160: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
e170: 20 20 20 20 64 61 74 61 62 61 73 65 20 68 61 73      database has
e180: 20 6e 6f 74 20 62 65 65 6e 20 6d 6f 64 69 66 69   not been modifi
e190: 65 64 20 61 74 20 61 6c 6c 2e 0a 23 0a 23 20 20  ed at all..#.#  
e1a0: 20 70 61 67 65 72 31 2d 32 30 2e 32 2e 2a 3a 20   pager1-20.2.*: 
e1b0: 41 73 20 61 62 6f 76 65 2c 20 62 75 74 20 77 69  As above, but wi
e1c0: 74 68 20 61 20 6e 6f 72 6d 61 6c 20 64 62 20 69  th a normal db i
e1d0: 6e 20 65 78 63 6c 75 73 69 76 65 2d 6c 6f 63 6b  n exclusive-lock
e1e0: 69 6e 67 20 6d 6f 64 65 2e 0a 23 0a 23 20 20 20  ing mode..#.#   
e1f0: 70 61 67 65 72 31 2d 32 30 2e 33 2e 2a 3a 20 43  pager1-20.3.*: C
e200: 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e  ommitting a tran
e210: 73 61 63 74 69 6f 6e 20 69 6e 20 57 41 4c 20 6d  saction in WAL m
e220: 6f 64 65 20 77 68 65 72 65 20 74 68 65 20 64 61  ode where the da
e230: 74 61 62 61 73 65 20 68 61 73 0a 23 20 20 20 20  tabase has.#    
e240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 65                be
e250: 65 6e 20 6d 6f 64 69 66 69 65 64 2c 20 62 75 74  en modified, but
e260: 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73   all dirty pages
e270: 20 68 61 76 65 20 62 65 65 6e 20 66 6c 75 73 68   have been flush
e280: 65 64 20 74 6f 20 0a 23 20 20 20 20 20 20 20 20  ed to .#        
e290: 20 20 20 20 20 20 20 20 20 20 64 69 73 6b 20 62            disk b
e2a0: 65 66 6f 72 65 20 74 68 65 20 63 6f 6d 6d 69 74  efore the commit
e2b0: 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  ..#.do_test page
e2c0: 72 31 2d 32 30 2e 31 2e 31 20 7b 0a 20 20 63 61  r1-20.1.1 {.  ca
e2d0: 74 63 68 20 7b 64 62 20 63 6c 6f 73 65 7d 0a 20  tch {db close}. 
e2e0: 20 73 71 6c 69 74 65 33 20 64 62 20 3a 6d 65 6d   sqlite3 db :mem
e2f0: 6f 72 79 3a 0a 20 20 65 78 65 63 73 71 6c 20 7b  ory:.  execsql {
e300: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
e310: 45 20 6f 6e 65 28 74 77 6f 2c 20 74 68 72 65 65  E one(two, three
e320: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
e330: 54 4f 20 6f 6e 65 20 56 41 4c 55 45 53 28 27 61  TO one VALUES('a
e340: 27 2c 20 27 62 27 29 3b 0a 20 20 7d 0a 7d 20 7b  ', 'b');.  }.} {
e350: 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  }.do_test pager1
e360: 2d 32 30 2e 31 2e 32 20 7b 0a 20 20 65 78 65 63  -20.1.2 {.  exec
e370: 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 20  sql {.    BEGIN 
e380: 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20 43  EXCLUSIVE;.    C
e390: 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a  OMMIT;.  }.} {}.
e3a0: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
e3b0: 32 30 2e 32 2e 31 20 7b 0a 20 20 66 61 75 6c 74  20.2.1 {.  fault
e3c0: 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72  sim_delete_and_r
e3d0: 65 6f 70 65 6e 0a 20 20 65 78 65 63 73 71 6c 20  eopen.  execsql 
e3e0: 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 6c 6f 63  {.    PRAGMA loc
e3f0: 6b 69 6e 67 5f 6d 6f 64 65 20 3d 20 65 78 63 6c  king_mode = excl
e400: 75 73 69 76 65 3b 0a 20 20 20 20 50 52 41 47 4d  usive;.    PRAGM
e410: 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d  A journal_mode =
e420: 20 70 65 72 73 69 73 74 3b 0a 20 20 20 20 43 52   persist;.    CR
e430: 45 41 54 45 20 54 41 42 4c 45 20 6f 6e 65 28 74  EATE TABLE one(t
e440: 77 6f 2c 20 74 68 72 65 65 29 3b 0a 20 20 20 20  wo, three);.    
e450: 49 4e 53 45 52 54 20 49 4e 54 4f 20 6f 6e 65 20  INSERT INTO one 
e460: 56 41 4c 55 45 53 28 27 61 27 2c 20 27 62 27 29  VALUES('a', 'b')
e470: 3b 0a 20 20 7d 0a 7d 20 7b 65 78 63 6c 75 73 69  ;.  }.} {exclusi
e480: 76 65 20 70 65 72 73 69 73 74 7d 0a 64 6f 5f 74  ve persist}.do_t
e490: 65 73 74 20 70 61 67 65 72 31 2d 32 30 2e 32 2e  est pager1-20.2.
e4a0: 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  2 {.  execsql {.
e4b0: 20 20 20 20 42 45 47 49 4e 20 45 58 43 4c 55 53      BEGIN EXCLUS
e4c0: 49 56 45 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b  IVE;.    COMMIT;
e4d0: 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74 65  .  }.} {}..do_te
e4e0: 73 74 20 70 61 67 65 72 31 2d 32 30 2e 33 2e 31  st pager1-20.3.1
e4f0: 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65   {.  faultsim_de
e500: 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a  lete_and_reopen.
e510: 20 20 64 62 20 66 75 6e 63 20 61 5f 73 74 72 69    db func a_stri
e520: 6e 67 20 61 5f 73 74 72 69 6e 67 0a 20 20 65 78  ng a_string.  ex
e530: 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47  ecsql {.    PRAG
e540: 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 20 3d 20  MA cache_size = 
e550: 31 30 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a  10;.    PRAGMA j
e560: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 77 61  ournal_mode = wa
e570: 6c 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20  l;.    BEGIN;.  
e580: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
e590: 20 74 31 28 78 29 3b 0a 20 20 20 20 20 20 43 52   t1(x);.      CR
e5a0: 45 41 54 45 20 54 41 42 4c 45 20 74 32 28 79 29  EATE TABLE t2(y)
e5b0: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
e5c0: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 61 5f  NTO t1 VALUES(a_
e5d0: 73 74 72 69 6e 67 28 38 30 30 29 29 3b 0a 20 20  string(800));.  
e5e0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
e5f0: 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69  t1 SELECT a_stri
e600: 6e 67 28 38 30 30 29 20 46 52 4f 4d 20 74 31 3b  ng(800) FROM t1;
e610: 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20 32 20           /*   2 
e620: 2a 2f 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  */.      INSERT 
e630: 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61  INTO t1 SELECT a
e640: 5f 73 74 72 69 6e 67 28 38 30 30 29 20 46 52 4f  _string(800) FRO
e650: 4d 20 74 31 3b 20 20 20 20 20 20 20 20 20 2f 2a  M t1;         /*
e660: 20 20 20 34 20 2a 2f 0a 20 20 20 20 20 20 49 4e     4 */.      IN
e670: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
e680: 45 43 54 20 61 5f 73 74 72 69 6e 67 28 38 30 30  ECT a_string(800
e690: 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20  ) FROM t1;      
e6a0: 20 20 20 2f 2a 20 20 20 38 20 2a 2f 0a 20 20 20     /*   8 */.   
e6b0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
e6c0: 31 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e  1 SELECT a_strin
e6d0: 67 28 38 30 30 29 20 46 52 4f 4d 20 74 31 3b 20  g(800) FROM t1; 
e6e0: 20 20 20 20 20 20 20 20 2f 2a 20 20 31 36 20 2a          /*  16 *
e6f0: 2f 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  /.      INSERT I
e700: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f  NTO t1 SELECT a_
e710: 73 74 72 69 6e 67 28 38 30 30 29 20 46 52 4f 4d  string(800) FROM
e720: 20 74 31 3b 20 20 20 20 20 20 20 20 20 2f 2a 20   t1;         /* 
e730: 20 33 32 20 2a 2f 0a 20 20 20 20 43 4f 4d 4d 49   32 */.    COMMI
e740: 54 3b 0a 20 20 7d 0a 7d 20 7b 77 61 6c 7d 0a 64  T;.  }.} {wal}.d
e750: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 30  o_test pager1-20
e760: 2e 33 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c  .3.2 {.  execsql
e770: 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20   {.    BEGIN;.  
e780: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32    INSERT INTO t2
e790: 20 56 41 4c 55 45 53 28 27 78 78 78 78 27 29 3b   VALUES('xxxx');
e7a0: 0a 20 20 7d 0a 20 20 72 65 63 75 72 73 69 76 65  .  }.  recursive
e7b0: 5f 73 65 6c 65 63 74 20 33 32 20 74 31 0a 20 20  _select 32 t1.  
e7c0: 65 78 65 63 73 71 6c 20 43 4f 4d 4d 49 54 0a 7d  execsql COMMIT.}
e7d0: 20 7b 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   {}..#----------
e7e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e7f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
e820: 23 20 54 65 73 74 20 74 68 61 74 20 61 20 57 41  # Test that a WA
e830: 4c 20 64 61 74 61 62 61 73 65 20 6d 61 79 20 6e  L database may n
e840: 6f 74 20 62 65 20 6f 70 65 6e 65 64 20 69 66 3a  ot be opened if:
e850: 0a 23 0a 23 20 20 20 70 61 67 65 72 31 2d 32 31  .#.#   pager1-21
e860: 2e 31 2e 2a 3a 20 54 68 65 20 56 46 53 20 68 61  .1.*: The VFS ha
e870: 73 20 61 6e 20 69 56 65 72 73 69 6f 6e 20 6c 65  s an iVersion le
e880: 73 73 20 74 68 61 6e 20 32 2c 20 6f 72 0a 23 20  ss than 2, or.# 
e890: 20 20 70 61 67 65 72 31 2d 32 31 2e 32 2e 2a 3a    pager1-21.2.*:
e8a0: 20 54 68 65 20 56 46 53 20 64 6f 65 73 20 6e 6f   The VFS does no
e8b0: 74 20 70 72 6f 76 69 64 65 20 78 53 68 6d 58 58  t provide xShmXX
e8c0: 58 28 29 20 6d 65 74 68 6f 64 73 2e 0a 23 0a 64  X() methods..#.d
e8d0: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 31  o_test pager1-21
e8e0: 2e 30 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f  .0 {.  faultsim_
e8f0: 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65  delete_and_reope
e900: 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  n.  execsql {.  
e910: 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c    PRAGMA journal
e920: 5f 6d 6f 64 65 20 3d 20 57 41 4c 3b 0a 20 20 20  _mode = WAL;.   
e930: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 6b 6f   CREATE TABLE ko
e940: 28 63 20 44 45 46 41 55 4c 54 20 27 61 62 63 27  (c DEFAULT 'abc'
e950: 2c 20 62 20 44 45 46 41 55 4c 54 20 27 64 65 66  , b DEFAULT 'def
e960: 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ');.    INSERT I
e970: 4e 54 4f 20 6b 6f 20 44 45 46 41 55 4c 54 20 56  NTO ko DEFAULT V
e980: 41 4c 55 45 53 3b 0a 20 20 7d 0a 7d 20 7b 77 61  ALUES;.  }.} {wa
e990: 6c 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  l}.do_test pager
e9a0: 31 2d 32 31 2e 31 20 7b 0a 20 20 74 65 73 74 76  1-21.1 {.  testv
e9b0: 66 73 20 74 76 20 2d 6e 6f 73 68 6d 20 31 0a 20  fs tv -noshm 1. 
e9c0: 20 73 71 6c 69 74 65 33 20 64 62 32 20 74 65 73   sqlite3 db2 tes
e9d0: 74 2e 64 62 20 2d 76 66 73 20 74 76 0a 20 20 63  t.db -vfs tv.  c
e9e0: 61 74 63 68 73 71 6c 20 7b 20 53 45 4c 45 43 54  atchsql { SELECT
e9f0: 20 2a 20 46 52 4f 4d 20 6b 6f 20 7d 20 64 62 32   * FROM ko } db2
ea00: 0a 7d 20 7b 31 20 7b 75 6e 61 62 6c 65 20 74 6f  .} {1 {unable to
ea10: 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 66   open database f
ea20: 69 6c 65 7d 7d 0a 64 62 32 20 63 6c 6f 73 65 0a  ile}}.db2 close.
ea30: 74 76 20 64 65 6c 65 74 65 0a 64 6f 5f 74 65 73  tv delete.do_tes
ea40: 74 20 70 61 67 65 72 31 2d 32 31 2e 32 20 7b 0a  t pager1-21.2 {.
ea50: 20 20 74 65 73 74 76 66 73 20 74 76 20 2d 69 76    testvfs tv -iv
ea60: 65 72 73 69 6f 6e 20 31 0a 20 20 73 71 6c 69 74  ersion 1.  sqlit
ea70: 65 33 20 64 62 32 20 74 65 73 74 2e 64 62 20 2d  e3 db2 test.db -
ea80: 76 66 73 20 74 76 0a 20 20 63 61 74 63 68 73 71  vfs tv.  catchsq
ea90: 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  l { SELECT * FRO
eaa0: 4d 20 6b 6f 20 7d 20 64 62 32 0a 7d 20 7b 31 20  M ko } db2.} {1 
eab0: 7b 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20  {unable to open 
eac0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 7d 7d 0a  database file}}.
ead0: 64 62 32 20 63 6c 6f 73 65 0a 74 76 20 64 65 6c  db2 close.tv del
eae0: 65 74 65 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ete..#----------
eaf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
eb00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
eb10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
eb20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
eb30: 23 20 54 65 73 74 20 74 68 61 74 20 61 20 22 50  # Test that a "P
eb40: 52 41 47 4d 41 20 77 61 6c 5f 63 68 65 63 6b 70  RAGMA wal_checkp
eb50: 6f 69 6e 74 22 3a 0a 23 0a 23 20 20 20 70 61 67  oint":.#.#   pag
eb60: 65 72 31 2d 32 32 2e 31 2e 2a 3a 20 69 73 20 61  er1-22.1.*: is a
eb70: 20 6e 6f 2d 6f 70 20 6f 6e 20 61 20 6e 6f 6e 2d   no-op on a non-
eb80: 57 41 4c 20 64 62 2c 20 61 6e 64 0a 23 20 20 20  WAL db, and.#   
eb90: 70 61 67 65 72 31 2d 32 32 2e 32 2e 2a 3a 20 64  pager1-22.2.*: d
eba0: 6f 65 73 20 6e 6f 74 20 63 61 75 73 65 20 78 53  oes not cause xS
ebb0: 79 6e 63 20 63 61 6c 6c 73 20 77 69 74 68 20 61  ync calls with a
ebc0: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 6f 66 66   synchronous=off
ebd0: 20 64 62 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 70   db..#.do_test p
ebe0: 61 67 65 72 31 2d 32 32 2e 31 2e 31 20 7b 0a 20  ager1-22.1.1 {. 
ebf0: 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65   faultsim_delete
ec00: 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78  _and_reopen.  ex
ec10: 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41  ecsql {.    CREA
ec20: 54 45 20 54 41 42 4c 45 20 6b 6f 28 63 20 44 45  TE TABLE ko(c DE
ec30: 46 41 55 4c 54 20 27 61 62 63 27 2c 20 62 20 44  FAULT 'abc', b D
ec40: 45 46 41 55 4c 54 20 27 64 65 66 27 29 3b 0a 20  EFAULT 'def');. 
ec50: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 6b     INSERT INTO k
ec60: 6f 20 44 45 46 41 55 4c 54 20 56 41 4c 55 45 53  o DEFAULT VALUES
ec70: 3b 0a 20 20 7d 0a 20 20 65 78 65 63 73 71 6c 20  ;.  }.  execsql 
ec80: 7b 20 50 52 41 47 4d 41 20 77 61 6c 5f 63 68 65  { PRAGMA wal_che
ec90: 63 6b 70 6f 69 6e 74 20 7d 0a 7d 20 7b 7d 0a 64  ckpoint }.} {}.d
eca0: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 32  o_test pager1-22
ecb0: 2e 32 2e 31 20 7b 0a 20 20 74 65 73 74 76 66 73  .2.1 {.  testvfs
ecc0: 20 74 76 20 2d 64 65 66 61 75 6c 74 20 31 0a 20   tv -default 1. 
ecd0: 20 74 76 20 66 69 6c 74 65 72 20 78 53 79 6e 63   tv filter xSync
ece0: 0a 20 20 74 76 20 73 63 72 69 70 74 20 78 53 79  .  tv script xSy
ecf0: 6e 63 43 62 0a 20 20 70 72 6f 63 20 78 53 79 6e  ncCb.  proc xSyn
ed00: 63 43 62 20 7b 61 72 67 73 7d 20 7b 69 6e 63 72  cCb {args} {incr
ed10: 20 3a 3a 73 79 6e 63 63 6f 75 6e 74 7d 0a 20 20   ::synccount}.  
ed20: 73 65 74 20 3a 3a 73 79 6e 63 63 6f 75 6e 74 20  set ::synccount 
ed30: 30 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 74  0.  sqlite3 db t
ed40: 65 73 74 2e 64 62 0a 20 20 65 78 65 63 73 71 6c  est.db.  execsql
ed50: 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 73 79   {.    PRAGMA sy
ed60: 6e 63 68 72 6f 6e 6f 75 73 20 3d 20 6f 66 66 3b  nchronous = off;
ed70: 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72  .    PRAGMA jour
ed80: 6e 61 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c 3b 0a  nal_mode = WAL;.
ed90: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
eda0: 6b 6f 20 44 45 46 41 55 4c 54 20 56 41 4c 55 45  ko DEFAULT VALUE
edb0: 53 3b 0a 20 20 7d 0a 20 20 65 78 65 63 73 71 6c  S;.  }.  execsql
edc0: 20 7b 20 50 52 41 47 4d 41 20 77 61 6c 5f 63 68   { PRAGMA wal_ch
edd0: 65 63 6b 70 6f 69 6e 74 20 7d 0a 20 20 73 65 74  eckpoint }.  set
ede0: 20 73 79 6e 63 63 6f 75 6e 74 0a 7d 20 7b 30 7d   synccount.} {0}
edf0: 0a 64 62 20 63 6c 6f 73 65 0a 74 76 20 64 65 6c  .db close.tv del
ee00: 65 74 65 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ete..#----------
ee10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ee20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ee30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ee40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
ee50: 23 20 54 65 73 74 73 20 66 6f 72 20 63 68 61 6e  # Tests for chan
ee60: 67 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64  ging journal mod
ee70: 65 2e 0a 23 0a 23 20 20 20 70 61 67 65 72 31 2d  e..#.#   pager1-
ee80: 32 33 2e 31 2e 2a 3a 20 54 65 73 74 20 74 68 61  23.1.*: Test tha
ee90: 74 20 77 68 65 6e 20 63 68 61 6e 67 69 6e 67 20  t when changing 
eea0: 66 72 6f 6d 20 50 45 52 53 49 53 54 20 74 6f 20  from PERSIST to 
eeb0: 44 45 4c 45 54 45 20 6d 6f 64 65 2c 0a 23 20 20  DELETE mode,.#  
eec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eed0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
eee0: 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 23 0a 23   is deleted..#.#
eef0: 20 20 20 70 61 67 65 72 31 2d 32 33 2e 32 2e 2a     pager1-23.2.*
ef00: 3a 20 53 61 6d 65 20 74 65 73 74 20 61 73 20 61  : Same test as a
ef10: 62 6f 76 65 2c 20 62 75 74 20 77 68 69 6c 65 20  bove, but while 
ef20: 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 69 73  a shared lock is
ef30: 20 68 65 6c 64 0a 23 20 20 20 20 20 20 20 20 20   held.#         
ef40: 20 20 20 20 20 20 20 20 20 6f 6e 20 74 68 65 20           on the 
ef50: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 23  database file..#
ef60: 0a 23 20 20 20 70 61 67 65 72 31 2d 32 33 2e 33  .#   pager1-23.3
ef70: 2e 2a 3a 20 53 61 6d 65 20 74 65 73 74 20 61 73  .*: Same test as
ef80: 20 61 62 6f 76 65 2c 20 62 75 74 20 77 68 69 6c   above, but whil
ef90: 65 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63  e a reserved loc
efa0: 6b 20 69 73 20 68 65 6c 64 0a 23 20 20 20 20 20  k is held.#     
efb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 6e 20               on 
efc0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
efd0: 65 2e 0a 23 0a 23 20 20 20 70 61 67 65 72 31 2d  e..#.#   pager1-
efe0: 32 33 2e 34 2e 2a 3a 20 41 6e 64 2c 20 66 6f 72  23.4.*: And, for
eff0: 20 66 75 6e 2c 20 77 68 69 6c 65 20 68 6f 6c 64   fun, while hold
f000: 69 6e 67 20 61 6e 20 65 78 63 6c 75 73 69 76 65  ing an exclusive
f010: 20 6c 6f 63 6b 2e 0a 23 0a 23 20 20 20 70 61 67   lock..#.#   pag
f020: 65 72 31 2d 32 33 2e 35 2e 2a 3a 20 54 72 79 20  er1-23.5.*: Try 
f030: 74 6f 20 73 65 74 20 76 61 72 69 6f 75 73 20 64  to set various d
f040: 69 66 66 65 72 65 6e 74 20 6a 6f 75 72 6e 61 6c  ifferent journal
f050: 20 6d 6f 64 65 73 20 77 69 74 68 20 61 6e 0a 23   modes with an.#
f060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f070: 20 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61    in-memory data
f080: 62 61 73 65 20 28 6f 6e 6c 79 20 4d 45 4d 4f 52  base (only MEMOR
f090: 59 20 61 6e 64 20 4f 46 46 20 73 68 6f 75 6c 64  Y and OFF should
f0a0: 20 77 6f 72 6b 29 2e 0a 23 0a 23 20 20 20 70 61   work)..#.#   pa
f0b0: 67 65 72 31 2d 32 33 2e 36 2e 2a 3a 20 54 72 79  ger1-23.6.*: Try
f0c0: 20 74 6f 20 73 65 74 20 6c 6f 63 6b 69 6e 67 5f   to set locking_
f0d0: 6d 6f 64 65 3d 6e 6f 72 6d 61 6c 20 6f 6e 20 61  mode=normal on a
f0e0: 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
f0f0: 62 61 73 65 0a 23 20 20 20 20 20 20 20 20 20 20  base.#          
f100: 20 20 20 20 20 20 20 20 28 64 6f 65 73 6e 27 74          (doesn't
f110: 20 77 6f 72 6b 20 2d 20 69 6e 2d 6d 65 6d 6f 72   work - in-memor
f120: 79 20 64 61 74 61 62 61 73 65 73 20 61 6c 77 61  y databases alwa
f130: 79 73 20 75 73 65 0a 23 20 20 20 20 20 20 20 20  ys use.#        
f140: 20 20 20 20 20 20 20 20 20 20 6c 6f 63 6b 69 6e            lockin
f150: 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65  g_mode=exclusive
f160: 29 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 70 61 67  )..#.do_test pag
f170: 65 72 31 2d 32 33 2e 31 2e 31 20 7b 0a 20 20 66  er1-23.1.1 {.  f
f180: 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61  aultsim_delete_a
f190: 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65 63  nd_reopen.  exec
f1a0: 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41  sql {.    PRAGMA
f1b0: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20   journal_mode = 
f1c0: 50 45 52 53 49 53 54 3b 0a 20 20 20 20 43 52 45  PERSIST;.    CRE
f1d0: 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20  ATE TABLE t1(a, 
f1e0: 62 29 3b 0a 20 20 7d 0a 20 20 66 69 6c 65 20 65  b);.  }.  file e
f1f0: 78 69 73 74 73 20 74 65 73 74 2e 64 62 2d 6a 6f  xists test.db-jo
f200: 75 72 6e 61 6c 0a 7d 20 7b 31 7d 0a 64 6f 5f 74  urnal.} {1}.do_t
f210: 65 73 74 20 70 61 67 65 72 31 2d 32 33 2e 31 2e  est pager1-23.1.
f220: 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  2 {.  execsql { 
f230: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
f240: 6f 64 65 20 3d 20 44 45 4c 45 54 45 20 7d 0a 20  ode = DELETE }. 
f250: 20 66 69 6c 65 20 65 78 69 73 74 73 20 74 65 73   file exists tes
f260: 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 7d 20 7b  t.db-journal.} {
f270: 30 7d 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  0}..do_test page
f280: 72 31 2d 32 33 2e 32 2e 31 20 7b 0a 20 20 65 78  r1-23.2.1 {.  ex
f290: 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47  ecsql {.    PRAG
f2a0: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  MA journal_mode 
f2b0: 3d 20 50 45 52 53 49 53 54 3b 0a 20 20 20 20 49  = PERSIST;.    I
f2c0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
f2d0: 4c 55 45 53 28 27 43 61 6e 62 65 72 72 61 27 2c  LUES('Canberra',
f2e0: 20 27 41 43 54 27 29 3b 0a 20 20 7d 0a 20 20 64   'ACT');.  }.  d
f2f0: 62 20 65 76 61 6c 20 7b 20 53 45 4c 45 43 54 20  b eval { SELECT 
f300: 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7b 0a 20 20  * FROM t1 } {.  
f310: 20 20 64 62 20 65 76 61 6c 20 7b 20 50 52 41 47    db eval { PRAG
f320: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  MA journal_mode 
f330: 3d 20 44 45 4c 45 54 45 20 7d 0a 20 20 7d 0a 20  = DELETE }.  }. 
f340: 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d   execsql { PRAGM
f350: 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 7d  A journal_mode }
f360: 0a 7d 20 7b 64 65 6c 65 74 65 7d 0a 64 6f 5f 74  .} {delete}.do_t
f370: 65 73 74 20 70 61 67 65 72 31 2d 32 33 2e 32 2e  est pager1-23.2.
f380: 32 20 7b 0a 20 20 66 69 6c 65 20 65 78 69 73 74  2 {.  file exist
f390: 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61  s test.db-journa
f3a0: 6c 0a 7d 20 7b 30 7d 0a 0a 64 6f 5f 74 65 73 74  l.} {0}..do_test
f3b0: 20 70 61 67 65 72 31 2d 32 33 2e 33 2e 31 20 7b   pager1-23.3.1 {
f3c0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
f3d0: 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f   PRAGMA journal_
f3e0: 6d 6f 64 65 20 3d 20 50 45 52 53 49 53 54 3b 0a  mode = PERSIST;.
f3f0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
f400: 74 31 20 56 41 4c 55 45 53 28 27 44 61 72 77 69  t1 VALUES('Darwi
f410: 6e 27 2c 20 27 4e 54 27 29 3b 0a 20 20 20 20 42  n', 'NT');.    B
f420: 45 47 49 4e 20 49 4d 4d 45 44 49 41 54 45 3b 0a  EGIN IMMEDIATE;.
f430: 20 20 7d 0a 20 20 64 62 20 65 76 61 6c 20 7b 20    }.  db eval { 
f440: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
f450: 6f 64 65 20 3d 20 44 45 4c 45 54 45 20 7d 0a 20  ode = DELETE }. 
f460: 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d   execsql { PRAGM
f470: 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 7d  A journal_mode }
f480: 0a 7d 20 7b 64 65 6c 65 74 65 7d 0a 64 6f 5f 74  .} {delete}.do_t
f490: 65 73 74 20 70 61 67 65 72 31 2d 32 33 2e 33 2e  est pager1-23.3.
f4a0: 32 20 7b 0a 20 20 66 69 6c 65 20 65 78 69 73 74  2 {.  file exist
f4b0: 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61  s test.db-journa
f4c0: 6c 0a 7d 20 7b 30 7d 0a 64 6f 5f 74 65 73 74 20  l.} {0}.do_test 
f4d0: 70 61 67 65 72 31 2d 32 33 2e 33 2e 33 20 7b 0a  pager1-23.3.3 {.
f4e0: 20 20 65 78 65 63 73 71 6c 20 43 4f 4d 4d 49 54    execsql COMMIT
f4f0: 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74 20 70  .} {}..do_test p
f500: 61 67 65 72 31 2d 32 33 2e 34 2e 31 20 7b 0a 20  ager1-23.4.1 {. 
f510: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50   execsql {.    P
f520: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
f530: 64 65 20 3d 20 50 45 52 53 49 53 54 3b 0a 20 20  de = PERSIST;.  
f540: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
f550: 20 56 41 4c 55 45 53 28 27 41 64 65 6c 61 69 64   VALUES('Adelaid
f560: 65 27 2c 20 27 53 41 27 29 3b 0a 20 20 20 20 42  e', 'SA');.    B
f570: 45 47 49 4e 20 45 58 43 4c 55 53 49 56 45 3b 0a  EGIN EXCLUSIVE;.
f580: 20 20 7d 0a 20 20 64 62 20 65 76 61 6c 20 7b 20    }.  db eval { 
f590: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
f5a0: 6f 64 65 20 3d 20 44 45 4c 45 54 45 20 7d 0a 20  ode = DELETE }. 
f5b0: 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d   execsql { PRAGM
f5c0: 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 7d  A journal_mode }
f5d0: 0a 7d 20 7b 64 65 6c 65 74 65 7d 0a 64 6f 5f 74  .} {delete}.do_t
f5e0: 65 73 74 20 70 61 67 65 72 31 2d 32 33 2e 34 2e  est pager1-23.4.
f5f0: 32 20 7b 0a 20 20 66 69 6c 65 20 65 78 69 73 74  2 {.  file exist
f600: 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61  s test.db-journa
f610: 6c 0a 7d 20 7b 30 7d 0a 64 6f 5f 74 65 73 74 20  l.} {0}.do_test 
f620: 70 61 67 65 72 31 2d 32 33 2e 34 2e 33 20 7b 0a  pager1-23.4.3 {.
f630: 20 20 65 78 65 63 73 71 6c 20 43 4f 4d 4d 49 54    execsql COMMIT
f640: 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74 20 70  .} {}..do_test p
f650: 61 67 65 72 31 2d 32 33 2e 35 2e 31 20 7b 0a 20  ager1-23.5.1 {. 
f660: 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65   faultsim_delete
f670: 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 73 71  _and_reopen.  sq
f680: 6c 69 74 65 33 20 64 62 20 3a 6d 65 6d 6f 72 79  lite3 db :memory
f690: 3a 0a 7d 20 7b 7d 0a 66 6f 72 65 61 63 68 20 7b  :.} {}.foreach {
f6a0: 74 6e 20 6d 6f 64 65 20 70 6f 73 73 69 62 6c 65  tn mode possible
f6b0: 7d 20 7b 0a 20 20 32 20 20 6f 66 66 20 20 20 20  } {.  2  off    
f6c0: 20 20 31 0a 20 20 33 20 20 6d 65 6d 6f 72 79 20    1.  3  memory 
f6d0: 20 20 31 0a 20 20 34 20 20 70 65 72 73 69 73 74    1.  4  persist
f6e0: 20 20 30 0a 20 20 35 20 20 64 65 6c 65 74 65 20    0.  5  delete 
f6f0: 20 20 30 0a 20 20 36 20 20 77 61 6c 20 20 20 20    0.  6  wal    
f700: 20 20 30 0a 20 20 37 20 20 74 72 75 6e 63 61 74    0.  7  truncat
f710: 65 20 30 0a 7d 20 7b 0a 20 20 64 6f 5f 74 65 73  e 0.} {.  do_tes
f720: 74 20 70 61 67 65 72 31 2d 32 33 2e 35 2e 24 74  t pager1-23.5.$t
f730: 6e 2e 31 20 7b 0a 20 20 20 20 65 78 65 63 73 71  n.1 {.    execsq
f740: 6c 20 22 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61  l "PRAGMA journa
f750: 6c 5f 6d 6f 64 65 20 3d 20 6f 66 66 22 0a 20 20  l_mode = off".  
f760: 20 20 65 78 65 63 73 71 6c 20 22 50 52 41 47 4d    execsql "PRAGM
f770: 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d  A journal_mode =
f780: 20 24 6d 6f 64 65 22 0a 20 20 7d 20 5b 69 66 20   $mode".  } [if 
f790: 24 70 6f 73 73 69 62 6c 65 20 7b 6c 69 73 74 20  $possible {list 
f7a0: 24 6d 6f 64 65 7d 20 7b 6c 69 73 74 20 6f 66 66  $mode} {list off
f7b0: 7d 5d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67  }].  do_test pag
f7c0: 65 72 31 2d 32 33 2e 35 2e 24 74 6e 2e 32 20 7b  er1-23.5.$tn.2 {
f7d0: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 22 50 52  .    execsql "PR
f7e0: 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
f7f0: 65 20 3d 20 6d 65 6d 6f 72 79 22 0a 20 20 20 20  e = memory".    
f800: 65 78 65 63 73 71 6c 20 22 50 52 41 47 4d 41 20  execsql "PRAGMA 
f810: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 24  journal_mode = $
f820: 6d 6f 64 65 22 0a 20 20 7d 20 5b 69 66 20 24 70  mode".  } [if $p
f830: 6f 73 73 69 62 6c 65 20 7b 6c 69 73 74 20 24 6d  ossible {list $m
f840: 6f 64 65 7d 20 7b 6c 69 73 74 20 6d 65 6d 6f 72  ode} {list memor
f850: 79 7d 5d 0a 7d 0a 64 6f 5f 74 65 73 74 20 70 61  y}].}.do_test pa
f860: 67 65 72 31 2d 32 33 2e 36 2e 31 20 7b 0a 20 20  ger1-23.6.1 {.  
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 6e  locking_mode = n
f890: 6f 72 6d 61 6c 7d 0a 7d 20 7b 65 78 63 6c 75 73  ormal}.} {exclus
f8a0: 69 76 65 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67  ive}.do_test pag
f8b0: 65 72 31 2d 32 33 2e 36 2e 32 20 7b 0a 20 20 65  er1-23.6.2 {.  e
f8c0: 78 65 63 73 71 6c 20 7b 50 52 41 47 4d 41 20 6c  xecsql {PRAGMA l
f8d0: 6f 63 6b 69 6e 67 5f 6d 6f 64 65 20 3d 20 65 78  ocking_mode = ex
f8e0: 63 6c 75 73 69 76 65 7d 0a 7d 20 7b 65 78 63 6c  clusive}.} {excl
f8f0: 75 73 69 76 65 7d 0a 64 6f 5f 74 65 73 74 20 70  usive}.do_test p
f900: 61 67 65 72 31 2d 32 33 2e 36 2e 33 20 7b 0a 20  ager1-23.6.3 {. 
f910: 20 65 78 65 63 73 71 6c 20 7b 50 52 41 47 4d 41   execsql {PRAGMA
f920: 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 7d 0a 7d   locking_mode}.}
f930: 20 7b 65 78 63 6c 75 73 69 76 65 7d 0a 64 6f 5f   {exclusive}.do_
f940: 74 65 73 74 20 70 61 67 65 72 31 2d 32 33 2e 36  test pager1-23.6
f950: 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .4 {.  execsql {
f960: 50 52 41 47 4d 41 20 6d 61 69 6e 2e 6c 6f 63 6b  PRAGMA main.lock
f970: 69 6e 67 5f 6d 6f 64 65 7d 0a 7d 20 7b 65 78 63  ing_mode}.} {exc
f980: 6c 75 73 69 76 65 7d 0a 0a 23 2d 2d 2d 2d 2d 2d  lusive}..#------
f990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f9a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f9b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f9c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f9d0: 2d 2d 2d 0a 23 0a 64 6f 5f 74 65 73 74 20 70 61  ---.#.do_test pa
f9e0: 67 65 72 31 2d 32 34 2e 31 2e 31 20 7b 0a 20 20  ger1-24.1.1 {.  
f9f0: 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f  faultsim_delete_
fa00: 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 64 62 20  and_reopen.  db 
fa10: 66 75 6e 63 20 61 5f 73 74 72 69 6e 67 20 61 5f  func a_string a_
fa20: 73 74 72 69 6e 67 0a 20 20 65 78 65 63 73 71 6c  string.  execsql
fa30: 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 63 61   {.    PRAGMA ca
fa40: 63 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b 0a 20  che_size = 10;. 
fa50: 20 20 20 50 52 41 47 4d 41 20 61 75 74 6f 5f 76     PRAGMA auto_v
fa60: 61 63 75 75 6d 20 3d 20 46 55 4c 4c 3b 0a 20 20  acuum = FULL;.  
fa70: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 78    CREATE TABLE x
fa80: 31 28 78 2c 20 79 2c 20 7a 2c 20 50 52 49 4d 41  1(x, y, z, PRIMA
fa90: 52 59 20 4b 45 59 28 79 2c 20 7a 29 29 3b 0a 20  RY KEY(y, z));. 
faa0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
fab0: 78 32 28 78 2c 20 79 2c 20 7a 2c 20 50 52 49 4d  x2(x, y, z, PRIM
fac0: 41 52 59 20 4b 45 59 28 79 2c 20 7a 29 29 3b 0a  ARY KEY(y, z));.
fad0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
fae0: 78 32 20 56 41 4c 55 45 53 28 61 5f 73 74 72 69  x2 VALUES(a_stri
faf0: 6e 67 28 34 30 30 29 2c 20 61 5f 73 74 72 69 6e  ng(400), a_strin
fb00: 67 28 35 30 30 29 2c 20 61 5f 73 74 72 69 6e 67  g(500), a_string
fb10: 28 36 30 30 29 29 3b 0a 20 20 20 20 49 4e 53 45  (600));.    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 36 30 30 29 2c  T a_string(600),
fb40: 20 61 5f 73 74 72 69 6e 67 28 34 30 30 29 2c 20   a_string(400), 
fb50: 61 5f 73 74 72 69 6e 67 28 35 30 30 29 20 46 52  a_string(500) 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 35 30 30 29 2c 20   a_string(500), 
fb90: 61 5f 73 74 72 69 6e 67 28 36 30 30 29 2c 20 61  a_string(600), a
fba0: 5f 73 74 72 69 6e 67 28 34 30 30 29 20 46 52 4f  _string(400) 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 34 30 30 29 2c 20 61  a_string(400), a
fbe0: 5f 73 74 72 69 6e 67 28 35 30 30 29 2c 20 61 5f  _string(500), a_
fbf0: 73 74 72 69 6e 67 28 36 30 30 29 20 46 52 4f 4d  string(600) 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 36 30 30 29 2c 20 61 5f  _string(600), a_
fc30: 73 74 72 69 6e 67 28 34 30 30 29 2c 20 61 5f 73  string(400), a_s
fc40: 74 72 69 6e 67 28 35 30 30 29 20 46 52 4f 4d 20  tring(500) 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 35 30 30 29 2c 20 61 5f 73  string(500), a_s
fc80: 74 72 69 6e 67 28 36 30 30 29 2c 20 61 5f 73 74  tring(600), a_st
fc90: 72 69 6e 67 28 34 30 30 29 20 46 52 4f 4d 20 78  ring(400) 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 32 20 53 45 4c 45 43 54 20 61 5f 73  TO x2 SELECT a_s
fcc0: 74 72 69 6e 67 28 34 30 30 29 2c 20 61 5f 73 74  tring(400), a_st
fcd0: 72 69 6e 67 28 35 30 30 29 2c 20 61 5f 73 74 72  ring(500), a_str
fce0: 69 6e 67 28 36 30 30 29 20 46 52 4f 4d 20 78 32  ing(600) FROM x2
fcf0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
fd00: 4f 20 78 31 20 53 45 4c 45 43 54 20 2a 20 46 52  O x1 SELECT * FR
fd10: 4f 4d 20 78 32 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a  OM x2;.  }.} {}.
fd20: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32  do_test pager1-2
fd30: 34 2e 31 2e 32 20 7b 0a 20 20 65 78 65 63 73 71  4.1.2 {.  execsq
fd40: 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20  l {.    BEGIN;. 
fd50: 20 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d       DELETE FROM
fd60: 20 78 31 20 57 48 45 52 45 20 72 6f 77 69 64 3c   x1 WHERE rowid<
fd70: 33 32 3b 0a 20 20 7d 0a 20 20 72 65 63 75 72 73  32;.  }.  recurs
fd80: 69 76 65 5f 73 65 6c 65 63 74 20 36 34 20 78 32  ive_select 64 x2
fd90: 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 70 61  .} {}.do_test pa
fda0: 67 65 72 31 2d 32 34 2e 31 2e 33 20 7b 0a 20 20  ger1-24.1.3 {.  
fdb0: 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 20  execsql { .     
fdc0: 20 55 50 44 41 54 45 20 78 31 20 53 45 54 20 7a   UPDATE x1 SET z
fdd0: 20 3d 20 61 5f 73 74 72 69 6e 67 28 33 30 30 29   = a_string(300)
fde0: 20 57 48 45 52 45 20 72 6f 77 69 64 3e 34 30 3b   WHERE rowid>40;
fdf0: 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 20  .    COMMIT;.   
fe00: 20 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74   PRAGMA integrit
fe10: 79 5f 63 68 65 63 6b 3b 0a 20 20 20 20 53 45 4c  y_check;.    SEL
fe20: 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
fe30: 4d 20 78 31 3b 0a 20 20 7d 0a 7d 20 7b 6f 6b 20  M x1;.  }.} {ok 
fe40: 33 33 7d 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67  33}..do_test pag
fe50: 65 72 31 2d 32 34 2e 31 2e 34 20 7b 0a 20 20 65  er1-24.1.4 {.  e
fe60: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 44 45 4c  xecsql {.    DEL
fe70: 45 54 45 20 46 52 4f 4d 20 78 31 3b 0a 20 20 20  ETE FROM x1;.   
fe80: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 31 20   INSERT INTO x1 
fe90: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 78 32  SELECT * FROM x2
fea0: 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20  ;.    BEGIN;.   
feb0: 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 78     DELETE FROM x
fec0: 31 20 57 48 45 52 45 20 72 6f 77 69 64 3c 33 32  1 WHERE rowid<32
fed0: 3b 0a 20 20 20 20 20 20 55 50 44 41 54 45 20 78  ;.      UPDATE x
fee0: 31 20 53 45 54 20 7a 20 3d 20 61 5f 73 74 72 69  1 SET z = a_stri
fef0: 6e 67 28 32 39 39 29 20 57 48 45 52 45 20 72 6f  ng(299) WHERE ro
ff00: 77 69 64 3e 34 30 3b 0a 20 20 7d 0a 20 20 72 65  wid>40;.  }.  re
ff10: 63 75 72 73 69 76 65 5f 73 65 6c 65 63 74 20 36  cursive_select 6
ff20: 34 20 78 32 20 7b 64 62 20 65 76 61 6c 20 43 4f  4 x2 {db eval CO
ff30: 4d 4d 49 54 7d 0a 20 20 65 78 65 63 73 71 6c 20  MMIT}.  execsql 
ff40: 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 69 6e 74  {.    PRAGMA int
ff50: 65 67 72 69 74 79 5f 63 68 65 63 6b 3b 0a 20 20  egrity_check;.  
ff60: 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a    SELECT count(*
ff70: 29 20 46 52 4f 4d 20 78 31 3b 0a 20 20 7d 0a 7d  ) FROM x1;.  }.}
ff80: 20 7b 6f 6b 20 33 33 7d 0a 0a 64 6f 5f 74 65 73   {ok 33}..do_tes
ff90: 74 20 70 61 67 65 72 31 2d 32 34 2e 31 2e 35 20  t pager1-24.1.5 
ffa0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
ffb0: 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 78 31    DELETE FROM x1
ffc0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
ffd0: 4f 20 78 31 20 53 45 4c 45 43 54 20 2a 20 46 52  O x1 SELECT * FR
ffe0: 4f 4d 20 78 32 3b 0a 20 20 7d 0a 20 20 72 65 63  OM x2;.  }.  rec
fff0: 75 72 73 69 76 65 5f 73 65 6c 65 63 74 20 36 34  ursive_select 64
10000 20 78 32 20 7b 20 64 62 20 65 76 61 6c 20 7b 43   x2 { db eval {C
10010 52 45 41 54 45 20 54 41 42 4c 45 20 78 33 28 78  REATE TABLE x3(x
10020 2c 20 79 2c 20 7a 29 7d 20 7d 0a 20 20 65 78 65  , y, z)} }.  exe
10030 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20  csql { SELECT * 
10040 46 52 4f 4d 20 78 33 20 7d 0a 7d 20 7b 7d 0a 0a  FROM x3 }.} {}..
10050 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
10060 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10070 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10080 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10090 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 0a 64 6f 5f  ----------.#.do_
100a0 74 65 73 74 20 70 61 67 65 72 31 2d 32 35 2d 31  test pager1-25-1
100b0 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65   {.  faultsim_de
100c0 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a  lete_and_reopen.
100d0 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
100e0 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 53 41 56  BEGIN;.      SAV
100f0 45 50 4f 49 4e 54 20 61 62 63 3b 0a 20 20 20 20  EPOINT abc;.    
10100 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
10110 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 20   t1(a, b);.     
10120 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 61 62 63   ROLLBACK TO abc
10130 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20  ;.    COMMIT;.  
10140 7d 0a 20 20 64 62 20 63 6c 6f 73 65 0a 7d 20 7b  }.  db close.} {
10150 7d 0a 62 72 65 61 6b 70 6f 69 6e 74 0a 64 6f 5f  }.breakpoint.do_
10160 74 65 73 74 20 70 61 67 65 72 31 2d 32 35 2d 32  test pager1-25-2
10170 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65   {.  faultsim_de
10180 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a  lete_and_reopen.
10190 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
101a0 53 41 56 45 50 4f 49 4e 54 20 61 62 63 3b 0a 20  SAVEPOINT abc;. 
101b0 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c       CREATE TABL
101c0 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20  E t1(a, b);.    
101d0 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 61 62 63 3b  ROLLBACK TO abc;
101e0 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d  .    COMMIT;.  }
101f0 0a 20 20 64 62 20 63 6c 6f 73 65 0a 7d 20 7b 7d  .  db close.} {}
10200 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
10210 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10220 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10230 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10240 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 53  ------------.# S
10250 65 63 74 6f 72 2d 73 69 7a 65 20 74 65 73 74 73  ector-size tests
10260 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  ..#.do_test page
10270 72 31 2d 32 36 2e 31 20 7b 0a 20 20 74 65 73 74  r1-26.1 {.  test
10280 76 66 73 20 74 76 20 2d 64 65 66 61 75 6c 74 20  vfs tv -default 
10290 31 0a 20 20 74 76 20 73 65 63 74 6f 72 73 69 7a  1.  tv sectorsiz
102a0 65 20 34 30 39 36 0a 20 20 66 61 75 6c 74 73 69  e 4096.  faultsi
102b0 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f  m_delete_and_reo
102c0 70 65 6e 0a 20 20 64 62 20 66 75 6e 63 20 61 5f  pen.  db func a_
102d0 73 74 72 69 6e 67 20 61 5f 73 74 72 69 6e 67 0a  string a_string.
102e0 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
102f0 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65  PRAGMA page_size
10300 20 3d 20 35 31 32 3b 0a 20 20 20 20 43 52 45 41   = 512;.    CREA
10310 54 45 20 54 41 42 4c 45 20 74 62 6c 28 61 20 50  TE TABLE tbl(a P
10320 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 20 55 4e  RIMARY KEY, b UN
10330 49 51 55 45 29 3b 0a 20 20 20 20 42 45 47 49 4e  IQUE);.    BEGIN
10340 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
10350 4e 54 4f 20 74 62 6c 20 56 41 4c 55 45 53 28 61  NTO tbl VALUES(a
10360 5f 73 74 72 69 6e 67 28 32 35 29 2c 20 61 5f 73  _string(25), a_s
10370 74 72 69 6e 67 28 36 30 30 29 29 3b 0a 20 20 20  tring(600));.   
10380 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
10390 62 6c 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69  bl SELECT a_stri
103a0 6e 67 28 32 35 29 2c 20 61 5f 73 74 72 69 6e 67  ng(25), a_string
103b0 28 36 30 30 29 20 46 52 4f 4d 20 74 62 6c 3b 0a  (600) FROM tbl;.
103c0 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
103d0 4f 20 74 62 6c 20 53 45 4c 45 43 54 20 61 5f 73  O tbl SELECT a_s
103e0 74 72 69 6e 67 28 32 35 29 2c 20 61 5f 73 74 72  tring(25), a_str
103f0 69 6e 67 28 36 30 30 29 20 46 52 4f 4d 20 74 62  ing(600) FROM tb
10400 6c 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  l;.      INSERT 
10410 49 4e 54 4f 20 74 62 6c 20 53 45 4c 45 43 54 20  INTO tbl SELECT 
10420 61 5f 73 74 72 69 6e 67 28 32 35 29 2c 20 61 5f  a_string(25), a_
10430 73 74 72 69 6e 67 28 36 30 30 29 20 46 52 4f 4d  string(600) FROM
10440 20 74 62 6c 3b 0a 20 20 20 20 20 20 49 4e 53 45   tbl;.      INSE
10450 52 54 20 49 4e 54 4f 20 74 62 6c 20 53 45 4c 45  RT INTO tbl SELE
10460 43 54 20 61 5f 73 74 72 69 6e 67 28 32 35 29 2c  CT a_string(25),
10470 20 61 5f 73 74 72 69 6e 67 28 36 30 30 29 20 46   a_string(600) F
10480 52 4f 4d 20 74 62 6c 3b 0a 20 20 20 20 20 20 49  ROM tbl;.      I
10490 4e 53 45 52 54 20 49 4e 54 4f 20 74 62 6c 20 53  NSERT INTO tbl S
104a0 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 32  ELECT a_string(2
104b0 35 29 2c 20 61 5f 73 74 72 69 6e 67 28 36 30 30  5), a_string(600
104c0 29 20 46 52 4f 4d 20 74 62 6c 3b 0a 20 20 20 20  ) FROM tbl;.    
104d0 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 62    INSERT INTO tb
104e0 6c 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e  l SELECT a_strin
104f0 67 28 32 35 29 2c 20 61 5f 73 74 72 69 6e 67 28  g(25), a_string(
10500 36 30 30 29 20 46 52 4f 4d 20 74 62 6c 3b 0a 20  600) FROM tbl;. 
10510 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
10520 20 74 62 6c 20 53 45 4c 45 43 54 20 61 5f 73 74   tbl SELECT a_st
10530 72 69 6e 67 28 32 35 29 2c 20 61 5f 73 74 72 69  ring(25), a_stri
10540 6e 67 28 36 30 30 29 20 46 52 4f 4d 20 74 62 6c  ng(600) FROM tbl
10550 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20  ;.    COMMIT;.  
10560 7d 0a 7d 20 7b 7d 0a 64 6f 5f 65 78 65 63 73 71  }.} {}.do_execsq
10570 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 36  l_test pager1-26
10580 2e 31 20 7b 0a 20 20 55 50 44 41 54 45 20 74 62  .1 {.  UPDATE tb
10590 6c 20 53 45 54 20 62 20 3d 20 61 5f 73 74 72 69  l SET b = a_stri
105a0 6e 67 28 35 35 30 29 3b 0a 7d 20 7b 7d 0a 64 62  ng(550);.} {}.db
105b0 20 63 6c 6f 73 65 0a 74 76 20 64 65 6c 65 74 65   close.tv delete
105c0 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
105d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
105e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
105f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10600 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 64 6f 5f  ------------.do_
10610 74 65 73 74 20 70 61 67 65 72 31 2e 32 37 2e 31  test pager1.27.1
10620 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65   {.  faultsim_de
10630 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a  lete_and_reopen.
10640 20 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f    sqlite3_pager_
10650 72 65 66 63 6f 75 6e 74 73 20 64 62 0a 20 20 65  refcounts db.  e
10660 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42 45 47  xecsql {.    BEG
10670 49 4e 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45  IN;.      CREATE
10680 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b   TABLE t1(a, b);
10690 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 70  .  }.  sqlite3_p
106a0 61 67 65 72 5f 72 65 66 63 6f 75 6e 74 73 20 64  ager_refcounts d
106b0 62 0a 20 20 65 78 65 63 73 71 6c 20 43 4f 4d 4d  b.  execsql COMM
106c0 49 54 0a 7d 20 7b 7d 0a 0a 66 69 6e 69 73 68 5f  IT.} {}..finish_
106d0 74 65 73 74 0a                                   test.