/ Hex Artifact Content
Login

Artifact d8e4b2bc8164c920e6ea0572c9e13576d6e4f3fa:


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 65 78 69  close.  file exi
a870: 73 74 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72  sts test.db-jour
a880: 6e 61 6c 0a 7d 20 7b 30 7d 0a 64 6f 5f 65 78 65  nal.} {0}.do_exe
a890: 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31  csql_test pager1
a8a0: 2d 31 31 2e 35 20 7b 20 53 45 4c 45 43 54 20 63  -11.5 { SELECT c
a8b0: 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 7a 7a 20  ount(*) FROM zz 
a8c0: 7d 20 7b 33 32 7d 0a 64 62 20 63 6c 6f 73 65 0a  } {32}.db close.
a8d0: 74 76 20 64 65 6c 65 74 65 0a 20 20 0a 23 2d 2d  tv 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 2d 2d 0a 23 20 54 65 73 74 20 22  -------.# Test "
a930: 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65  PRAGMA page_size
a940: 22 0a 23 0a 74 65 73 74 76 66 73 20 74 76 20 2d  ".#.testvfs tv -
a950: 64 65 66 61 75 6c 74 20 31 0a 74 76 20 73 65 63  default 1.tv sec
a960: 74 6f 72 73 69 7a 65 20 31 30 32 34 0a 66 6f 72  torsize 1024.for
a970: 65 61 63 68 20 70 61 67 65 73 69 7a 65 20 7b 0a  each pagesize {.
a980: 20 20 20 20 35 31 32 20 20 20 31 30 32 34 20 20      512   1024  
a990: 20 32 30 34 38 20 34 30 39 36 20 38 31 39 32 20   2048 4096 8192 
a9a0: 31 36 33 38 34 20 33 32 37 36 38 20 0a 7d 20 7b  16384 32768 .} {
a9b0: 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65  .  faultsim_dele
a9c0: 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 0a 20  te_and_reopen.. 
a9d0: 20 23 20 54 68 65 20 73 65 63 74 6f 72 2d 73 69   # The sector-si
a9e0: 7a 65 20 28 61 63 63 6f 72 64 69 6e 67 20 74 6f  ze (according to
a9f0: 20 74 68 65 20 56 46 53 29 20 69 73 20 31 30 32   the VFS) is 102
aa00: 34 20 62 79 74 65 73 2e 20 53 6f 20 69 66 20 74  4 bytes. So if t
aa10: 68 65 0a 20 20 23 20 70 61 67 65 2d 73 69 7a 65  he.  # page-size
aa20: 20 72 65 71 75 65 73 74 65 64 20 75 73 69 6e 67   requested using
aa30: 20 22 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69   "PRAGMA page_si
aa40: 7a 65 22 20 69 73 20 67 72 65 61 74 65 72 20 74  ze" is greater t
aa50: 68 61 6e 20 74 68 65 0a 20 20 23 20 63 6f 6d 70  han the.  # comp
aa60: 69 6c 65 20 74 69 6d 65 20 76 61 6c 75 65 20 6f  ile time value o
aa70: 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47  f SQLITE_MAX_PAG
aa80: 45 5f 53 49 5a 45 2c 20 74 68 65 6e 20 74 68 65  E_SIZE, then the
aa90: 20 65 66 66 65 63 74 69 76 65 20 0a 20 20 23 20   effective .  # 
aaa0: 70 61 67 65 2d 73 69 7a 65 20 72 65 6d 61 69 6e  page-size remain
aab0: 73 20 31 30 32 34 20 62 79 74 65 73 2e 0a 20 20  s 1024 bytes..  
aac0: 23 0a 20 20 73 65 74 20 65 66 66 20 24 70 61 67  #.  set eff $pag
aad0: 65 73 69 7a 65 0a 20 20 69 66 20 7b 24 65 66 66  esize.  if {$eff
aae0: 20 3e 20 24 3a 3a 53 51 4c 49 54 45 5f 4d 41 58   > $::SQLITE_MAX
aaf0: 5f 50 41 47 45 5f 53 49 5a 45 7d 20 7b 20 73 65  _PAGE_SIZE} { se
ab00: 74 20 65 66 66 20 31 30 32 34 20 7d 0a 0a 20 20  t eff 1024 }..  
ab10: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31  do_test pager1-1
ab20: 32 2e 24 70 61 67 65 73 69 7a 65 2e 31 20 7b 0a  2.$pagesize.1 {.
ab30: 20 20 20 20 73 71 6c 69 74 65 33 20 64 62 32 20      sqlite3 db2 
ab40: 74 65 73 74 2e 64 62 0a 20 20 20 20 65 78 65 63  test.db.    exec
ab50: 73 71 6c 20 22 0a 20 20 20 20 20 20 50 52 41 47  sql ".      PRAG
ab60: 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20 24  MA page_size = $
ab70: 70 61 67 65 73 69 7a 65 3b 0a 20 20 20 20 20 20  pagesize;.      
ab80: 43 52 45 41 54 45 20 56 49 45 57 20 76 20 41 53  CREATE VIEW v AS
ab90: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73   SELECT * FROM s
aba0: 71 6c 69 74 65 5f 6d 61 73 74 65 72 3b 0a 20 20  qlite_master;.  
abb0: 20 20 22 20 64 62 32 0a 20 20 20 20 66 69 6c 65    " db2.    file
abc0: 20 73 69 7a 65 20 74 65 73 74 2e 64 62 0a 20 20   size test.db.  
abd0: 7d 20 24 65 66 66 0a 20 20 64 6f 5f 74 65 73 74  } $eff.  do_test
abe0: 20 70 61 67 65 72 31 2d 31 32 2e 24 70 61 67 65   pager1-12.$page
abf0: 73 69 7a 65 2e 32 20 7b 0a 20 20 20 20 73 71 6c  size.2 {.    sql
ac00: 69 74 65 33 20 64 62 32 20 74 65 73 74 2e 64 62  ite3 db2 test.db
ac10: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 0a  .    execsql { .
ac20: 20 20 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75        SELECT cou
ac30: 6e 74 28 2a 29 20 46 52 4f 4d 20 76 3b 0a 20 20  nt(*) FROM v;.  
ac40: 20 20 20 20 50 52 41 47 4d 41 20 6d 61 69 6e 2e      PRAGMA main.
ac50: 70 61 67 65 5f 73 69 7a 65 3b 0a 20 20 20 20 7d  page_size;.    }
ac60: 20 64 62 32 0a 20 20 7d 20 5b 6c 69 73 74 20 31   db2.  } [list 1
ac70: 20 24 65 66 66 5d 0a 20 20 64 6f 5f 74 65 73 74   $eff].  do_test
ac80: 20 70 61 67 65 72 31 2d 31 32 2e 24 70 61 67 65   pager1-12.$page
ac90: 73 69 7a 65 2e 33 20 7b 0a 20 20 20 20 65 78 65  size.3 {.    exe
aca0: 63 73 71 6c 20 7b 20 0a 20 20 20 20 20 20 53 45  csql { .      SE
acb0: 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
acc0: 4f 4d 20 76 3b 0a 20 20 20 20 20 20 50 52 41 47  OM v;.      PRAG
acd0: 4d 41 20 6d 61 69 6e 2e 70 61 67 65 5f 73 69 7a  MA main.page_siz
ace0: 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 5b 6c 69  e;.    }.  } [li
acf0: 73 74 20 31 20 24 65 66 66 5d 0a 20 20 64 62 32  st 1 $eff].  db2
ad00: 20 63 6c 6f 73 65 0a 7d 0a 64 62 20 63 6c 6f 73   close.}.db clos
ad10: 65 0a 74 76 20 64 65 6c 65 74 65 0a 0a 23 2d 2d  e.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 2d 2d 0a 23 20 54 65 73 74 20 73  -------.# Test s
ad70: 70 65 63 61 6c 20 22 50 52 41 47 4d 41 20 6a 6f  pecal "PRAGMA jo
ad80: 75 72 6e 61 6c 5f 6d 6f 64 65 3d 50 45 52 53 49  urnal_mode=PERSI
ad90: 53 54 22 20 74 65 73 74 20 63 61 73 65 73 2e 0a  ST" test cases..
ada0: 23 0a 23 20 70 61 67 65 72 31 2d 31 33 2e 31 2e  #.# pager1-13.1.
adb0: 2a 3a 20 54 68 69 73 20 74 65 73 74 73 20 61 20  *: This tests a 
adc0: 73 70 65 63 69 61 6c 20 63 61 73 65 20 65 6e 63  special case enc
add0: 6f 75 6e 74 65 72 65 64 20 69 6e 20 70 65 72 73  ountered in pers
ade0: 69 73 74 65 6e 74 20 0a 23 20 20 20 20 20 20 20  istent .#       
adf0: 20 20 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c           journal
ae00: 20 6d 6f 64 65 3a 20 49 66 20 74 68 65 20 6a 6f   mode: If the jo
ae10: 75 72 6e 61 6c 20 61 73 73 6f 63 69 61 74 65 64  urnal associated
ae20: 20 77 69 74 68 20 61 20 74 72 61 6e 73 61 63 74   with a transact
ae30: 69 6f 6e 0a 23 20 20 20 20 20 20 20 20 20 20 20  ion.#           
ae40: 20 20 20 20 20 69 73 20 73 6d 61 6c 6c 65 72 20       is smaller 
ae50: 74 68 61 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  than the journal
ae60: 20 66 69 6c 65 20 28 62 65 63 61 75 73 65 20 61   file (because a
ae70: 20 70 72 65 76 69 6f 75 73 20 0a 23 20 20 20 20   previous .#    
ae80: 20 20 20 20 20 20 20 20 20 20 20 20 74 72 61 6e              tran
ae90: 73 61 63 74 69 6f 6e 20 6c 65 66 74 20 61 20 76  saction left a v
aea0: 65 72 79 20 6c 61 72 67 65 20 6e 6f 6e 2d 68 6f  ery large non-ho
aeb0: 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  t journal file i
aec0: 6e 20 74 68 65 0a 23 20 20 20 20 20 20 20 20 20  n the.#         
aed0: 20 20 20 20 20 20 20 66 69 6c 65 2d 73 79 73 74         file-syst
aee0: 65 6d 29 2c 20 74 68 65 6e 20 53 51 4c 69 74 65  em), then SQLite
aef0: 20 68 61 73 20 74 6f 20 62 65 20 63 61 72 65 66   has to be caref
af00: 75 6c 20 74 68 61 74 20 74 68 65 72 65 20 69 73  ul that there is
af10: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
af20: 20 20 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 2d    not a journal-
af30: 68 65 61 64 65 72 20 6c 65 66 74 20 6f 76 65 72  header left over
af40: 20 66 72 6f 6d 20 61 20 70 72 65 76 69 6f 75 73   from a previous
af50: 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 23 20 20   transaction.#  
af60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6d                im
af70: 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77  mediately follow
af80: 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ing the journal 
af90: 63 6f 6e 74 65 6e 74 20 6a 75 73 74 20 77 72 69  content just wri
afa0: 74 74 65 6e 2e 0a 23 20 20 20 20 20 20 20 20 20  tten..#         
afb0: 20 20 20 20 20 20 20 49 66 20 74 68 65 72 65 20         If there 
afc0: 69 73 2c 20 61 6e 64 20 74 68 65 20 70 72 6f 63  is, and the proc
afd0: 65 73 73 20 63 72 61 73 68 65 73 20 73 6f 20 74  ess crashes so t
afe0: 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a  hat the journal.
aff0: 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  #               
b000: 20 62 65 63 6f 6d 65 73 20 61 20 68 6f 74 2d 6a   becomes a hot-j
b010: 6f 75 72 6e 61 6c 20 61 6e 64 20 6d 75 73 74 20  ournal and must 
b020: 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 62  be rolled back b
b030: 79 20 61 6e 6f 74 68 65 72 0a 23 20 20 20 20 20  y another.#     
b040: 20 20 20 20 20 20 20 20 20 20 20 70 72 6f 63 65             proce
b050: 73 73 2c 20 74 68 65 72 65 20 69 73 20 61 20 64  ss, there is a d
b060: 61 6e 67 65 72 20 74 68 61 74 20 74 68 65 20 6f  anger that the o
b070: 74 68 65 72 20 70 72 6f 63 65 73 73 20 6d 61 79  ther process may
b080: 20 72 6f 6c 6c 0a 23 20 20 20 20 20 20 20 20 20   roll.#         
b090: 20 20 20 20 20 20 20 62 61 63 6b 20 74 68 65 20         back the 
b0a0: 61 62 6f 72 74 65 64 20 74 72 61 6e 73 61 63 74  aborted transact
b0b0: 69 6f 6e 2c 20 74 68 65 6e 20 63 6f 6e 74 69 6e  ion, then contin
b0c0: 75 65 20 63 6f 70 79 69 6e 67 20 64 61 74 61 0a  ue copying data.
b0d0: 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  #               
b0e0: 20 66 72 6f 6d 20 61 6e 20 6f 6c 64 65 72 20 74   from an older t
b0f0: 72 61 6e 73 61 63 74 69 6f 6e 20 66 72 6f 6d 20  ransaction from 
b100: 74 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66  the remainder of
b110: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 23 20   the journal..# 
b120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
b130: 65 65 20 74 68 65 20 73 79 6e 63 4a 6f 75 72 6e  ee the syncJourn
b140: 61 6c 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f  al() function fo
b150: 72 20 64 65 74 61 69 6c 73 2e 0a 23 0a 23 20 70  r details..#.# p
b160: 61 67 65 72 31 2d 31 33 2e 32 2e 2a 3a 20 53 61  ager1-13.2.*: Sa
b170: 6d 65 20 74 65 73 74 20 61 73 20 74 68 65 20 70  me test as the p
b180: 72 65 76 69 6f 75 73 2e 20 54 68 69 73 20 74 69  revious. This ti
b190: 6d 65 2c 20 74 68 72 6f 77 20 61 6e 20 69 6e 64  me, throw an ind
b1a0: 65 78 20 69 6e 74 6f 0a 23 20 20 20 20 20 20 20  ex into.#       
b1b0: 20 20 20 20 20 20 20 20 20 74 68 65 20 6d 69 78           the mix
b1c0: 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 69 6e 74   to make the int
b1d0: 65 67 72 69 74 79 2d 63 68 65 63 6b 20 6d 6f 72  egrity-check mor
b1e0: 65 20 6c 69 6b 65 6c 79 20 74 6f 20 63 61 74 63  e likely to catc
b1f0: 68 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20  h.#             
b200: 20 20 20 65 72 72 6f 72 73 2e 0a 23 0a 74 65 73     errors..#.tes
b210: 74 76 66 73 20 74 76 20 2d 64 65 66 61 75 6c 74  tvfs tv -default
b220: 20 31 0a 74 76 20 73 63 72 69 70 74 20 78 53 79   1.tv script xSy
b230: 6e 63 43 62 0a 74 76 20 66 69 6c 74 65 72 20 78  ncCb.tv filter x
b240: 53 79 6e 63 0a 70 72 6f 63 20 78 53 79 6e 63 43  Sync.proc xSyncC
b250: 62 20 7b 6d 65 74 68 6f 64 20 66 69 6c 65 6e 61  b {method filena
b260: 6d 65 20 61 72 67 73 7d 20 7b 0a 20 20 73 65 74  me args} {.  set
b270: 20 74 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 66   t [file tail $f
b280: 69 6c 65 6e 61 6d 65 5d 0a 20 20 69 66 20 7b 24  ilename].  if {$
b290: 74 20 3d 3d 20 22 74 65 73 74 2e 64 62 22 7d 20  t == "test.db"} 
b2a0: 66 61 75 6c 74 73 69 6d 5f 73 61 76 65 0a 20 20  faultsim_save.  
b2b0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
b2c0: 0a 7d 0a 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65  .}.faultsim_dele
b2d0: 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 64 62  te_and_reopen.db
b2e0: 20 66 75 6e 63 20 61 5f 73 74 72 69 6e 67 20 61   func a_string a
b2f0: 5f 73 74 72 69 6e 67 0a 0a 23 20 54 68 65 20 55  _string..# The U
b300: 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74 20  PDATE statement 
b310: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
b320: 69 73 20 74 65 73 74 20 63 61 73 65 20 63 72 65  is test case cre
b330: 61 74 65 73 20 61 20 72 65 61 6c 6c 79 20 62 69  ates a really bi
b340: 67 0a 23 20 6a 6f 75 72 6e 61 6c 2e 20 53 69 6e  g.# journal. Sin
b350: 63 65 20 74 68 65 20 63 61 63 68 65 2d 73 69 7a  ce the cache-siz
b360: 65 20 69 73 20 6f 6e 6c 79 20 31 30 20 70 61 67  e is only 10 pag
b370: 65 73 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  es, the journal 
b380: 63 6f 6e 74 61 69 6e 73 20 0a 23 20 66 72 65 71  contains .# freq
b390: 75 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61  uent journal hea
b3a0: 64 65 72 73 2e 0a 23 0a 64 6f 5f 65 78 65 63 73  ders..#.do_execs
b3b0: 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31  ql_test pager1-1
b3c0: 33 2e 31 2e 31 20 7b 0a 20 20 50 52 41 47 4d 41  3.1.1 {.  PRAGMA
b3d0: 20 70 61 67 65 5f 73 69 7a 65 20 3d 20 31 30 32   page_size = 102
b3e0: 34 3b 0a 20 20 50 52 41 47 4d 41 20 6a 6f 75 72  4;.  PRAGMA jour
b3f0: 6e 61 6c 5f 6d 6f 64 65 20 3d 20 50 45 52 53 49  nal_mode = PERSI
b400: 53 54 3b 0a 20 20 50 52 41 47 4d 41 20 63 61 63  ST;.  PRAGMA cac
b410: 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b 0a 20 20  he_size = 10;.  
b420: 42 45 47 49 4e 3b 0a 20 20 20 20 43 52 45 41 54  BEGIN;.    CREAT
b430: 45 20 54 41 42 4c 45 20 74 31 28 61 20 49 4e 54  E TABLE t1(a INT
b440: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
b450: 2c 20 62 20 42 4c 4f 42 29 3b 0a 20 20 20 20 49  , b BLOB);.    I
b460: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
b470: 4c 55 45 53 28 4e 55 4c 4c 2c 20 61 5f 73 74 72  LUES(NULL, a_str
b480: 69 6e 67 28 34 30 30 29 29 3b 0a 20 20 20 20 49  ing(400));.    I
b490: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
b4a0: 4c 45 43 54 20 4e 55 4c 4c 2c 20 61 5f 73 74 72  LECT NULL, a_str
b4b0: 69 6e 67 28 34 30 30 29 20 46 52 4f 4d 20 74 31  ing(400) FROM t1
b4c0: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20  ;          /*   
b4d0: 32 20 2a 2f 0a 20 20 20 20 49 4e 53 45 52 54 20  2 */.    INSERT 
b4e0: 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 4e  INTO t1 SELECT N
b4f0: 55 4c 4c 2c 20 61 5f 73 74 72 69 6e 67 28 34 30  ULL, a_string(40
b500: 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20  0) FROM t1;     
b510: 20 20 20 20 20 2f 2a 20 20 20 34 20 2a 2f 0a 20       /*   4 */. 
b520: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
b530: 31 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 61  1 SELECT NULL, a
b540: 5f 73 74 72 69 6e 67 28 34 30 30 29 20 46 52 4f  _string(400) FRO
b550: 4d 20 74 31 3b 20 20 20 20 20 20 20 20 20 20 2f  M t1;          /
b560: 2a 20 20 20 38 20 2a 2f 0a 20 20 20 20 49 4e 53  *   8 */.    INS
b570: 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
b580: 43 54 20 4e 55 4c 4c 2c 20 61 5f 73 74 72 69 6e  CT NULL, a_strin
b590: 67 28 34 30 30 29 20 46 52 4f 4d 20 74 31 3b 20  g(400) FROM t1; 
b5a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 20 31 36 20           /*  16 
b5b0: 2a 2f 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  */.    INSERT IN
b5c0: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 4e 55 4c  TO t1 SELECT NUL
b5d0: 4c 2c 20 61 5f 73 74 72 69 6e 67 28 34 30 30 29  L, a_string(400)
b5e0: 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 20   FROM t1;       
b5f0: 20 20 20 2f 2a 20 20 33 32 20 2a 2f 0a 20 20 20     /*  32 */.   
b600: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
b610: 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 61 5f 73  SELECT NULL, a_s
b620: 74 72 69 6e 67 28 34 30 30 29 20 46 52 4f 4d 20  tring(400) FROM 
b630: 74 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t1;          /* 
b640: 20 36 34 20 2a 2f 0a 20 20 20 20 49 4e 53 45 52   64 */.    INSER
b650: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
b660: 20 4e 55 4c 4c 2c 20 61 5f 73 74 72 69 6e 67 28   NULL, a_string(
b670: 34 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20  400) FROM t1;   
b680: 20 20 20 20 20 20 20 2f 2a 20 31 32 38 20 2a 2f         /* 128 */
b690: 0a 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 55 50 44  .  COMMIT;.  UPD
b6a0: 41 54 45 20 74 31 20 53 45 54 20 62 20 3d 20 61  ATE t1 SET b = a
b6b0: 5f 73 74 72 69 6e 67 28 34 30 30 29 3b 0a 7d 20  _string(400);.} 
b6c0: 7b 70 65 72 73 69 73 74 7d 0a 0a 23 20 52 75 6e  {persist}..# Run
b6d0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 6f 66   transactions of
b6e0: 20 69 6e 63 72 65 61 73 69 6e 67 20 73 69 7a 65   increasing size
b6f0: 73 2e 20 45 76 65 6e 74 75 61 6c 6c 79 2c 20 6f  s. Eventually, o
b700: 6e 65 20 28 6f 72 20 6d 6f 72 65 20 74 68 61 6e  ne (or more than
b710: 20 6f 6e 65 29 0a 23 20 6f 66 20 74 68 65 73 65   one).# of these
b720: 20 77 69 6c 6c 20 77 72 69 74 65 20 6a 75 73 74   will write just
b730: 20 65 6e 6f 75 67 68 20 63 6f 6e 74 65 6e 74 20   enough content 
b740: 74 68 61 74 20 6f 6e 65 20 6f 66 20 74 68 65 20  that one of the 
b750: 6f 6c 64 20 68 65 61 64 65 72 73 20 63 72 65 61  old headers crea
b760: 74 65 64 20 0a 23 20 62 79 20 74 68 65 20 74 72  ted .# by the tr
b770: 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 74 68 65  ansaction in the
b780: 20 62 6c 6f 63 6b 20 61 62 6f 76 65 20 6c 69 65   block above lie
b790: 73 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 66  s immediately af
b7a0: 74 65 72 20 74 68 65 20 63 6f 6e 74 65 6e 74 0a  ter the content.
b7b0: 23 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 62 79 20  # journalled by 
b7c0: 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e  the current tran
b7d0: 73 61 63 74 69 6f 6e 2e 0a 23 0a 66 6f 72 20 7b  saction..#.for {
b7e0: 73 65 74 20 6e 55 70 20 31 7d 20 7b 24 6e 55 70  set nUp 1} {$nUp
b7f0: 3c 36 34 7d 20 7b 69 6e 63 72 20 6e 55 70 7d 20  <64} {incr nUp} 
b800: 7b 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74  {.  do_execsql_t
b810: 65 73 74 20 70 61 67 65 72 31 2d 31 33 2e 31 2e  est pager1-13.1.
b820: 32 2e 24 6e 55 70 2e 31 20 7b 20 0a 20 20 20 20  2.$nUp.1 { .    
b830: 55 50 44 41 54 45 20 74 31 20 53 45 54 20 62 20  UPDATE t1 SET b 
b840: 3d 20 61 5f 73 74 72 69 6e 67 28 33 39 39 29 20  = a_string(399) 
b850: 57 48 45 52 45 20 61 20 3c 3d 20 24 6e 55 70 0a  WHERE a <= $nUp.
b860: 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 65 78 65 63    } {}.  do_exec
b870: 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d  sql_test pager1-
b880: 31 33 2e 31 2e 32 2e 24 6e 55 70 2e 32 20 7b 20  13.1.2.$nUp.2 { 
b890: 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79  PRAGMA integrity
b8a0: 5f 63 68 65 63 6b 20 7d 20 7b 6f 6b 7d 20 0a 0a  _check } {ok} ..
b8b0: 20 20 23 20 54 72 79 20 74 6f 20 61 63 63 65 73    # Try to acces
b8c0: 73 20 74 68 65 20 73 6e 61 70 73 68 6f 74 20 6f  s the snapshot o
b8d0: 66 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  f the file-syste
b8e0: 6d 2e 0a 20 20 23 0a 20 20 73 71 6c 69 74 65 33  m..  #.  sqlite3
b8f0: 20 64 62 32 20 73 76 5f 74 65 73 74 2e 64 62 0a   db2 sv_test.db.
b900: 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
b910: 2d 31 33 2e 31 2e 32 2e 24 6e 55 70 2e 33 20 7b  -13.1.2.$nUp.3 {
b920: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 53  .    execsql { S
b930: 45 4c 45 43 54 20 73 75 6d 28 6c 65 6e 67 74 68  ELECT sum(length
b940: 28 62 29 29 20 46 52 4f 4d 20 74 31 20 7d 20 64  (b)) FROM t1 } d
b950: 62 32 0a 20 20 7d 20 5b 65 78 70 72 20 7b 31 32  b2.  } [expr {12
b960: 38 2a 34 30 30 20 2d 20 28 24 6e 55 70 2d 31 29  8*400 - ($nUp-1)
b970: 7d 5d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67  }].  do_test pag
b980: 65 72 31 2d 31 33 2e 31 2e 32 2e 24 6e 55 70 2e  er1-13.1.2.$nUp.
b990: 34 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20  4 {.    execsql 
b9a0: 7b 20 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69  { PRAGMA integri
b9b0: 74 79 5f 63 68 65 63 6b 20 7d 20 64 62 32 0a 20  ty_check } db2. 
b9c0: 20 7d 20 7b 6f 6b 7d 0a 20 20 64 62 32 20 63 6c   } {ok}.  db2 cl
b9d0: 6f 73 65 0a 7d 0a 0a 23 20 53 61 6d 65 20 74 65  ose.}..# Same te
b9e0: 73 74 20 61 73 20 61 62 6f 76 65 2e 20 42 75 74  st as above. But
b9f0: 20 74 68 69 73 20 74 69 6d 65 20 77 69 74 68 20   this time with 
ba00: 61 6e 20 69 6e 64 65 78 20 6f 6e 20 74 68 65 20  an index on the 
ba10: 74 61 62 6c 65 2e 0a 23 0a 64 6f 5f 65 78 65 63  table..#.do_exec
ba20: 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d  sql_test pager1-
ba30: 31 33 2e 32 2e 31 20 7b 0a 20 20 43 52 45 41 54  13.2.1 {.  CREAT
ba40: 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31  E INDEX i1 ON t1
ba50: 28 62 29 3b 0a 20 20 55 50 44 41 54 45 20 74 31  (b);.  UPDATE t1
ba60: 20 53 45 54 20 62 20 3d 20 61 5f 73 74 72 69 6e   SET b = a_strin
ba70: 67 28 34 30 30 29 3b 0a 7d 20 7b 7d 0a 66 6f 72  g(400);.} {}.for
ba80: 20 7b 73 65 74 20 6e 55 70 20 31 7d 20 7b 24 6e   {set nUp 1} {$n
ba90: 55 70 3c 36 34 7d 20 7b 69 6e 63 72 20 6e 55 70  Up<64} {incr nUp
baa0: 7d 20 7b 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c  } {.  do_execsql
bab0: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 33 2e  _test pager1-13.
bac0: 32 2e 32 2e 24 6e 55 70 2e 31 20 7b 20 0a 20 20  2.2.$nUp.1 { .  
bad0: 20 20 55 50 44 41 54 45 20 74 31 20 53 45 54 20    UPDATE t1 SET 
bae0: 62 20 3d 20 61 5f 73 74 72 69 6e 67 28 33 39 39  b = a_string(399
baf0: 29 20 57 48 45 52 45 20 61 20 3c 3d 20 24 6e 55  ) WHERE a <= $nU
bb00: 70 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 65 78  p.  } {}.  do_ex
bb10: 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72  ecsql_test pager
bb20: 31 2d 31 33 2e 32 2e 32 2e 24 6e 55 70 2e 32 20  1-13.2.2.$nUp.2 
bb30: 7b 20 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69  { PRAGMA integri
bb40: 74 79 5f 63 68 65 63 6b 20 7d 20 7b 6f 6b 7d 20  ty_check } {ok} 
bb50: 0a 20 20 73 71 6c 69 74 65 33 20 64 62 32 20 73  .  sqlite3 db2 s
bb60: 76 5f 74 65 73 74 2e 64 62 0a 20 20 64 6f 5f 74  v_test.db.  do_t
bb70: 65 73 74 20 70 61 67 65 72 31 2d 31 33 2e 32 2e  est pager1-13.2.
bb80: 32 2e 24 6e 55 70 2e 33 20 7b 0a 20 20 20 20 65  2.$nUp.3 {.    e
bb90: 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20  xecsql { SELECT 
bba0: 73 75 6d 28 6c 65 6e 67 74 68 28 62 29 29 20 46  sum(length(b)) F
bbb0: 52 4f 4d 20 74 31 20 7d 20 64 62 32 0a 20 20 7d  ROM t1 } db2.  }
bbc0: 20 5b 65 78 70 72 20 7b 31 32 38 2a 34 30 30 20   [expr {128*400 
bbd0: 2d 20 28 24 6e 55 70 2d 31 29 7d 5d 0a 20 20 64  - ($nUp-1)}].  d
bbe0: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 33  o_test pager1-13
bbf0: 2e 32 2e 32 2e 24 6e 55 70 2e 34 20 7b 0a 20 20  .2.2.$nUp.4 {.  
bc00: 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47    execsql { PRAG
bc10: 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65  MA integrity_che
bc20: 63 6b 20 7d 20 64 62 32 0a 20 20 7d 20 7b 6f 6b  ck } db2.  } {ok
bc30: 7d 0a 20 20 64 62 32 20 63 6c 6f 73 65 0a 7d 0a  }.  db2 close.}.
bc40: 0a 64 62 20 63 6c 6f 73 65 0a 74 76 20 64 65 6c  .db close.tv del
bc50: 65 74 65 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ete..#----------
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 2d 2d 0a  ---------------.
bca0: 23 20 54 65 73 74 20 73 70 65 63 61 6c 20 22 50  # Test specal "P
bcb0: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
bcc0: 64 65 3d 4f 46 46 22 20 74 65 73 74 20 63 61 73  de=OFF" test cas
bcd0: 65 73 2e 0a 23 0a 66 61 75 6c 74 73 69 6d 5f 64  es..#.faultsim_d
bce0: 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e  elete_and_reopen
bcf0: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
bd00: 20 70 61 67 65 72 31 2d 31 34 2e 31 2e 31 20 7b   pager1-14.1.1 {
bd10: 0a 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61  .  PRAGMA journa
bd20: 6c 5f 6d 6f 64 65 20 3d 20 4f 46 46 3b 0a 20 20  l_mode = OFF;.  
bd30: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
bd40: 61 2c 20 62 29 3b 0a 20 20 42 45 47 49 4e 3b 0a  a, b);.  BEGIN;.
bd50: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
bd60: 74 31 20 56 41 4c 55 45 53 28 31 2c 20 32 29 3b  t1 VALUES(1, 2);
bd70: 0a 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 53 45 4c  .  COMMIT;.  SEL
bd80: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 7d  ECT * FROM t1;.}
bd90: 20 7b 6f 66 66 20 31 20 32 7d 0a 64 6f 5f 63 61   {off 1 2}.do_ca
bda0: 74 63 68 73 71 6c 5f 74 65 73 74 20 70 61 67 65  tchsql_test page
bdb0: 72 31 2d 31 34 2e 31 2e 32 20 7b 0a 20 20 42 45  r1-14.1.2 {.  BE
bdc0: 47 49 4e 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  GIN;.    INSERT 
bdd0: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 33  INTO t1 VALUES(3
bde0: 2c 20 34 29 3b 0a 20 20 52 4f 4c 4c 42 41 43 4b  , 4);.  ROLLBACK
bdf0: 3b 0a 7d 20 7b 30 20 7b 7d 7d 0a 64 6f 5f 65 78  ;.} {0 {}}.do_ex
be00: 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72  ecsql_test pager
be10: 31 2d 31 34 2e 31 2e 33 20 7b 0a 20 20 53 45 4c  1-14.1.3 {.  SEL
be20: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 7d  ECT * FROM t1;.}
be30: 20 7b 31 20 32 20 33 20 34 7d 0a 64 6f 5f 63 61   {1 2 3 4}.do_ca
be40: 74 63 68 73 71 6c 5f 74 65 73 74 20 70 61 67 65  tchsql_test page
be50: 72 31 2d 31 34 2e 31 2e 34 20 7b 0a 20 20 42 45  r1-14.1.4 {.  BE
be60: 47 49 4e 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  GIN;.    INSERT 
be70: 49 4e 54 4f 20 74 31 28 72 6f 77 69 64 2c 20 61  INTO t1(rowid, a
be80: 2c 20 62 29 20 53 45 4c 45 43 54 20 61 2b 33 2c  , b) SELECT a+3,
be90: 20 62 2c 20 62 20 46 52 4f 4d 20 74 31 3b 0a 20   b, b FROM t1;. 
bea0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
beb0: 31 28 72 6f 77 69 64 2c 20 61 2c 20 62 29 20 53  1(rowid, a, b) S
bec0: 45 4c 45 43 54 20 61 2b 33 2c 20 62 2c 20 62 20  ELECT a+3, b, b 
bed0: 46 52 4f 4d 20 74 31 3b 0a 7d 20 7b 31 20 7b 50  FROM t1;.} {1 {P
bee0: 52 49 4d 41 52 59 20 4b 45 59 20 6d 75 73 74 20  RIMARY KEY must 
bef0: 62 65 20 75 6e 69 71 75 65 7d 7d 0a 64 6f 5f 65  be unique}}.do_e
bf00: 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65  xecsql_test page
bf10: 72 31 2d 31 34 2e 31 2e 35 20 7b 0a 20 20 43 4f  r1-14.1.5 {.  CO
bf20: 4d 4d 49 54 3b 0a 20 20 53 45 4c 45 43 54 20 2a  MMIT;.  SELECT *
bf30: 20 46 52 4f 4d 20 74 31 3b 0a 7d 20 7b 31 20 32   FROM t1;.} {1 2
bf40: 20 33 20 34 20 32 20 32 20 34 20 34 7d 0a 0a 23   3 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 2d 2d 0a 23 20 54 65 73 74  ---------.# Test
bfa0: 20 6f 70 65 6e 69 6e 67 20 61 6e 64 20 63 6c 6f   opening and clo
bfb0: 73 69 6e 67 20 74 68 65 20 70 61 67 65 72 20 73  sing the pager s
bfc0: 75 62 2d 73 79 73 74 65 6d 20 77 69 74 68 20 64  ub-system with d
bfd0: 69 66 66 65 72 65 6e 74 20 76 61 6c 75 65 73 0a  ifferent values.
bfe0: 23 20 66 6f 72 20 74 68 65 20 73 71 6c 69 74 65  # for the sqlite
bff0: 33 5f 76 66 73 2e 73 7a 4f 73 46 69 6c 65 20 76  3_vfs.szOsFile v
c000: 61 72 69 61 62 6c 65 2e 0a 23 0a 66 61 75 6c 74  ariable..#.fault
c010: 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72  sim_delete_and_r
c020: 65 6f 70 65 6e 0a 64 6f 5f 65 78 65 63 73 71 6c  eopen.do_execsql
c030: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 35 2e  _test pager1-15.
c040: 30 20 7b 0a 20 20 43 52 45 41 54 45 20 54 41 42  0 {.  CREATE TAB
c050: 4c 45 20 74 78 28 79 2c 20 7a 29 3b 0a 20 20 49  LE tx(y, z);.  I
c060: 4e 53 45 52 54 20 49 4e 54 4f 20 74 78 20 56 41  NSERT INTO tx VA
c070: 4c 55 45 53 28 27 41 79 75 74 74 68 61 79 61 27  LUES('Ayutthaya'
c080: 2c 20 27 42 65 69 6a 69 6e 67 27 29 3b 0a 20 20  , 'Beijing');.  
c090: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 78 20 56  INSERT INTO tx V
c0a0: 41 4c 55 45 53 28 27 4c 6f 6e 64 6f 6e 27 2c 20  ALUES('London', 
c0b0: 27 54 6f 6b 79 6f 27 29 3b 0a 7d 20 7b 7d 0a 64  'Tokyo');.} {}.d
c0c0: 62 20 63 6c 6f 73 65 0a 66 6f 72 20 7b 73 65 74  b close.for {set
c0d0: 20 69 20 30 7d 20 7b 24 69 3c 35 31 33 7d 20 7b   i 0} {$i<513} {
c0e0: 69 6e 63 72 20 69 20 33 7d 20 7b 0a 20 20 74 65  incr i 3} {.  te
c0f0: 73 74 76 66 73 20 74 76 20 2d 64 65 66 61 75 6c  stvfs tv -defaul
c100: 74 20 31 20 2d 73 7a 6f 73 66 69 6c 65 20 24 69  t 1 -szosfile $i
c110: 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 74 65  .  sqlite3 db te
c120: 73 74 2e 64 62 0a 20 20 64 6f 5f 65 78 65 63 73  st.db.  do_execs
c130: 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31  ql_test pager1-1
c140: 35 2e 24 69 2e 31 20 7b 0a 20 20 20 20 53 45 4c  5.$i.1 {.    SEL
c150: 45 43 54 20 2a 20 46 52 4f 4d 20 74 78 3b 0a 20  ECT * FROM tx;. 
c160: 20 7d 20 7b 41 79 75 74 74 68 61 79 61 20 42 65   } {Ayutthaya Be
c170: 69 6a 69 6e 67 20 4c 6f 6e 64 6f 6e 20 54 6f 6b  ijing London Tok
c180: 79 6f 7d 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20  yo}.  db close. 
c190: 20 74 76 20 64 65 6c 65 74 65 0a 7d 0a 0a 23 2d   tv 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 2d 2d 0a 23 20 43 68 65 63 6b  --------.# Check
c1f0: 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20   that it is not 
c200: 70 6f 73 73 69 62 6c 65 20 74 6f 20 6f 70 65 6e  possible to open
c210: 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
c220: 20 69 66 20 74 68 65 20 66 75 6c 6c 20 70 61 74   if the full pat
c230: 68 0a 23 20 74 6f 20 74 68 65 20 61 73 73 6f 63  h.# to the assoc
c240: 69 61 74 65 64 20 6a 6f 75 72 6e 61 6c 20 66 69  iated journal fi
c250: 6c 65 20 77 69 6c 6c 20 62 65 20 6c 6f 6e 67 65  le will be longe
c260: 72 20 74 68 61 6e 20 73 71 6c 69 74 65 33 5f 76  r than sqlite3_v
c270: 66 73 2e 6d 78 50 61 74 68 6e 61 6d 65 2e 0a 23  fs.mxPathname..#
c280: 0a 74 65 73 74 76 66 73 20 74 76 20 2d 64 65 66  .testvfs tv -def
c290: 61 75 6c 74 20 31 0a 74 76 20 73 63 72 69 70 74  ault 1.tv script
c2a0: 20 78 4f 70 65 6e 43 62 0a 74 76 20 66 69 6c 74   xOpenCb.tv filt
c2b0: 65 72 20 78 4f 70 65 6e 0a 70 72 6f 63 20 78 4f  er xOpen.proc xO
c2c0: 70 65 6e 43 62 20 7b 6d 65 74 68 6f 64 20 66 69  penCb {method fi
c2d0: 6c 65 6e 61 6d 65 7d 20 7b 0a 20 20 73 65 74 20  lename} {.  set 
c2e0: 3a 3a 66 69 6c 65 5f 6c 65 6e 20 5b 73 74 72 69  ::file_len [stri
c2f0: 6e 67 20 6c 65 6e 67 74 68 20 24 66 69 6c 65 6e  ng length $filen
c300: 61 6d 65 5d 0a 7d 0a 73 71 6c 69 74 65 33 20 64  ame].}.sqlite3 d
c310: 62 20 74 65 73 74 2e 64 62 0a 64 62 20 63 6c 6f  b test.db.db clo
c320: 73 65 0a 74 76 20 64 65 6c 65 74 65 0a 0a 66 6f  se.tv delete..fo
c330: 72 20 7b 73 65 74 20 69 69 20 5b 65 78 70 72 20  r {set ii [expr 
c340: 24 3a 3a 66 69 6c 65 5f 6c 65 6e 2d 35 5d 7d 20  $::file_len-5]} 
c350: 7b 24 69 69 20 3c 20 5b 65 78 70 72 20 24 3a 3a  {$ii < [expr $::
c360: 66 69 6c 65 5f 6c 65 6e 2b 32 30 5d 7d 20 7b 69  file_len+20]} {i
c370: 6e 63 72 20 69 69 7d 20 7b 0a 20 20 74 65 73 74  ncr ii} {.  test
c380: 76 66 73 20 74 76 20 2d 64 65 66 61 75 6c 74 20  vfs tv -default 
c390: 31 20 2d 6d 78 70 61 74 68 6e 61 6d 65 20 24 69  1 -mxpathname $i
c3a0: 69 0a 0a 20 20 23 20 54 68 65 20 6c 65 6e 67 74  i..  # The lengt
c3b0: 68 20 6f 66 20 74 68 65 20 66 75 6c 6c 20 70 61  h of the full pa
c3c0: 74 68 20 74 6f 20 66 69 6c 65 20 22 74 65 73 74  th to file "test
c3d0: 2e 64 62 2d 6a 6f 75 72 6e 61 6c 22 20 69 73 20  .db-journal" is 
c3e0: 28 24 3a 3a 66 69 6c 65 5f 6c 65 6e 2b 38 29 2e  ($::file_len+8).
c3f0: 0a 20 20 23 20 49 66 20 74 68 65 20 63 6f 6e 66  .  # If the conf
c400: 69 67 75 72 65 64 20 73 71 6c 69 74 65 33 5f 76  igured sqlite3_v
c410: 66 73 2e 6d 78 50 61 74 68 6e 61 6d 65 20 76 61  fs.mxPathname va
c420: 6c 75 65 20 67 72 65 61 74 65 72 20 74 68 61 6e  lue greater than
c430: 20 6f 72 20 65 71 75 61 6c 20 74 6f 0a 20 20 23   or equal to.  #
c440: 20 74 68 69 73 2c 20 74 68 65 6e 20 74 68 65 20   this, then the 
c450: 66 69 6c 65 20 63 61 6e 20 62 65 20 6f 70 65 6e  file can be open
c460: 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ed. Otherwise, i
c470: 74 20 63 61 6e 6e 6f 74 2e 0a 20 20 23 0a 20 20  t cannot..  #.  
c480: 69 66 20 7b 24 69 69 20 3e 3d 20 5b 65 78 70 72  if {$ii >= [expr
c490: 20 24 3a 3a 66 69 6c 65 5f 6c 65 6e 2b 38 5d 7d   $::file_len+8]}
c4a0: 20 7b 0a 20 20 20 20 73 65 74 20 72 65 73 20 7b   {.    set res {
c4b0: 30 20 7b 7d 7d 0a 20 20 7d 20 65 6c 73 65 20 7b  0 {}}.  } else {
c4c0: 0a 20 20 20 20 73 65 74 20 72 65 73 20 7b 31 20  .    set res {1 
c4d0: 7b 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20  {unable to open 
c4e0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 7d 7d 0a  database file}}.
c4f0: 20 20 7d 0a 0a 20 20 64 6f 5f 74 65 73 74 20 70    }..  do_test p
c500: 61 67 65 72 31 2d 31 36 2e 31 2e 24 69 69 20 7b  ager1-16.1.$ii {
c510: 0a 20 20 20 20 6c 69 73 74 20 5b 63 61 74 63 68  .    list [catch
c520: 20 7b 20 73 71 6c 69 74 65 33 20 64 62 20 74 65   { sqlite3 db te
c530: 73 74 2e 64 62 20 7d 20 6d 73 67 5d 20 24 6d 73  st.db } msg] $ms
c540: 67 0a 20 20 7d 20 24 72 65 73 0a 0a 20 20 63 61  g.  } $res..  ca
c550: 74 63 68 20 7b 64 62 20 63 6c 6f 73 65 7d 0a 20  tch {db close}. 
c560: 20 74 76 20 64 65 6c 65 74 65 0a 7d 0a 0a 23 2d   tv 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 2d 2d 0a 23 20 54 65 73 74 20  --------.# Test 
c5c0: 22 50 52 41 47 4d 41 20 6f 6d 69 74 5f 72 65 61  "PRAGMA omit_rea
c5d0: 64 6c 6f 63 6b 22 2e 20 0a 23 0a 23 20 20 20 70  dlock". .#.#   p
c5e0: 61 67 65 72 31 2d 31 37 2e 24 74 6e 2e 31 2e 2a  ager1-17.$tn.1.*
c5f0: 3a 20 54 65 73 74 20 74 68 61 74 20 69 66 20 61  : Test that if a
c600: 20 73 65 63 6f 6e 64 20 63 6f 6e 6e 65 63 74 69   second connecti
c610: 6f 6e 20 68 61 73 20 61 6e 20 6f 70 65 6e 20 0a  on has an open .
c620: 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  #               
c630: 20 20 20 20 20 20 20 72 65 61 64 2d 74 72 61 6e         read-tran
c640: 73 61 63 74 69 6f 6e 2c 20 69 74 20 69 73 20 6e  saction, it is n
c650: 6f 74 20 75 73 75 61 6c 6c 79 20 70 6f 73 73 69  ot usually possi
c660: 62 6c 65 20 74 6f 20 77 72 69 74 65 20 0a 23 20  ble to write .# 
c670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c680: 20 20 20 20 20 74 68 65 20 64 61 74 61 62 61 73       the databas
c690: 65 2e 0a 23 0a 23 20 20 20 70 61 67 65 72 31 2d  e..#.#   pager1-
c6a0: 31 37 2e 24 74 6e 2e 32 2e 2a 3a 20 54 65 73 74  17.$tn.2.*: Test
c6b0: 20 74 68 61 74 20 69 66 20 74 68 65 20 73 65 63   that if the sec
c6c0: 6f 6e 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  ond connection w
c6d0: 61 73 20 6f 70 65 6e 65 64 20 77 69 74 68 0a 23  as opened with.#
c6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c6f0: 20 20 20 20 20 20 74 68 65 20 53 51 4c 49 54 45        the SQLITE
c700: 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 66  _OPEN_READONLY f
c710: 6c 61 67 2c 20 61 6e 64 20 0a 23 20 20 20 20 20  lag, and .#     
c720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c730: 20 22 50 52 41 47 4d 41 20 6f 6d 69 74 5f 72 65   "PRAGMA omit_re
c740: 61 64 6c 6f 63 6b 20 3d 20 31 22 20 69 73 20 65  adlock = 1" is e
c750: 78 65 63 75 74 65 64 20 62 65 66 6f 72 65 20 61  xecuted before a
c760: 74 74 61 63 68 69 6e 67 0a 23 20 20 20 20 20 20  ttaching.#      
c770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c780: 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6e 64  the database and
c790: 20 6f 70 65 6e 69 6e 67 20 61 20 72 65 61 64 2d   opening a read-
c7a0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 69  transaction on i
c7b0: 74 2c 20 69 74 20 69 73 0a 23 20 20 20 20 20 20  t, it is.#      
c7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c7d0: 70 6f 73 73 69 62 6c 65 20 74 6f 20 77 72 69 74  possible to writ
c7e0: 65 20 74 68 65 20 64 62 2e 0a 23 0a 23 20 20 20  e the db..#.#   
c7f0: 70 61 67 65 72 31 2d 31 37 2e 24 74 6e 2e 33 2e  pager1-17.$tn.3.
c800: 2a 3a 20 54 65 73 74 20 74 68 61 74 20 69 66 20  *: Test that if 
c810: 74 68 65 20 73 65 63 6f 6e 64 20 63 6f 6e 6e 65  the second conne
c820: 63 74 69 6f 6e 20 77 61 73 20 2a 6e 6f 74 2a 20  ction was *not* 
c830: 6f 70 65 6e 65 64 20 77 69 74 68 0a 23 20 20 20  opened with.#   
c840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c850: 20 20 20 74 68 65 20 53 51 4c 49 54 45 5f 4f 50     the SQLITE_OP
c860: 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 66 6c 61 67  EN_READONLY flag
c870: 2c 20 65 78 65 63 75 74 69 6e 67 20 0a 23 20 20  , executing .#  
c880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c890: 20 20 20 20 22 50 52 41 47 4d 41 20 6f 6d 69 74      "PRAGMA omit
c8a0: 5f 72 65 61 64 6c 6f 63 6b 20 3d 20 31 22 20 68  _readlock = 1" h
c8b0: 61 73 20 6e 6f 20 65 66 66 65 63 74 2e 0a 23 0a  as no effect..#.
c8c0: 64 6f 5f 6d 75 6c 74 69 63 6c 69 65 6e 74 5f 74  do_multiclient_t
c8d0: 65 73 74 20 74 6e 20 7b 0a 20 20 64 6f 5f 74 65  est tn {.  do_te
c8e0: 73 74 20 70 61 67 65 72 31 2d 31 37 2e 24 74 6e  st pager1-17.$tn
c8f0: 2e 31 2e 31 20 7b 0a 20 20 20 20 73 71 6c 31 20  .1.1 {.    sql1 
c900: 7b 20 0a 20 20 20 20 20 20 43 52 45 41 54 45 20  { .      CREATE 
c910: 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a  TABLE t1(a, b);.
c920: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
c930: 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20 32  O t1 VALUES(1, 2
c940: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
c950: 32 20 7b 0a 20 20 20 20 20 20 42 45 47 49 4e 3b  2 {.      BEGIN;
c960: 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20  .      SELECT * 
c970: 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 7d 0a 20  FROM t1;.    }. 
c980: 20 7d 20 7b 31 20 32 7d 0a 20 20 64 6f 5f 74 65   } {1 2}.  do_te
c990: 73 74 20 70 61 67 65 72 31 2d 31 37 2e 24 74 6e  st pager1-17.$tn
c9a0: 2e 31 2e 32 20 7b 0a 20 20 20 20 63 73 71 6c 31  .1.2 {.    csql1
c9b0: 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74   { INSERT INTO t
c9c0: 31 20 56 41 4c 55 45 53 28 33 2c 20 34 29 20 7d  1 VALUES(3, 4) }
c9d0: 0a 20 20 7d 20 7b 31 20 7b 64 61 74 61 62 61 73  .  } {1 {databas
c9e0: 65 20 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 20 20  e is locked}}.  
c9f0: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31  do_test pager1-1
ca00: 37 2e 24 74 6e 2e 31 2e 33 20 7b 0a 20 20 20 20  7.$tn.1.3 {.    
ca10: 73 71 6c 32 20 7b 20 43 4f 4d 4d 49 54 20 7d 0a  sql2 { COMMIT }.
ca20: 20 20 20 20 73 71 6c 31 20 7b 20 49 4e 53 45 52      sql1 { INSER
ca30: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
ca40: 28 33 2c 20 34 29 20 7d 0a 20 20 7d 20 7b 7d 0a  (3, 4) }.  } {}.
ca50: 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72  .  do_test pager
ca60: 31 2d 31 37 2e 24 74 6e 2e 32 2e 31 20 7b 0a 20  1-17.$tn.2.1 {. 
ca70: 20 20 20 63 6f 64 65 32 20 7b 0a 20 20 20 20 20     code2 {.     
ca80: 20 64 62 32 20 63 6c 6f 73 65 0a 20 20 20 20 20   db2 close.     
ca90: 20 73 71 6c 69 74 65 33 20 64 62 32 20 3a 6d 65   sqlite3 db2 :me
caa0: 6d 6f 72 79 3a 20 2d 72 65 61 64 6f 6e 6c 79 20  mory: -readonly 
cab0: 31 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 32  1.    }.    sql2
cac0: 20 7b 20 0a 20 20 20 20 20 20 50 52 41 47 4d 41   { .      PRAGMA
cad0: 20 6f 6d 69 74 5f 72 65 61 64 6c 6f 63 6b 20 3d   omit_readlock =
cae0: 20 31 3b 0a 20 20 20 20 20 20 41 54 54 41 43 48   1;.      ATTACH
caf0: 20 27 74 65 73 74 2e 64 62 27 20 41 53 20 74 77   'test.db' AS tw
cb00: 6f 3b 0a 20 20 20 20 20 20 42 45 47 49 4e 3b 0a  o;.      BEGIN;.
cb10: 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46        SELECT * F
cb20: 52 4f 4d 20 74 31 3b 0a 20 20 20 20 7d 0a 20 20  ROM t1;.    }.  
cb30: 7d 20 7b 31 20 32 20 33 20 34 7d 0a 20 20 64 6f  } {1 2 3 4}.  do
cb40: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 37 2e  _test pager1-17.
cb50: 24 74 6e 2e 32 2e 32 20 7b 20 73 71 6c 31 20 22  $tn.2.2 { sql1 "
cb60: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
cb70: 41 4c 55 45 53 28 35 2c 20 36 29 22 20 7d 20 7b  ALUES(5, 6)" } {
cb80: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65  }.  do_test page
cb90: 72 31 2d 31 37 2e 24 74 6e 2e 32 2e 33 20 7b 20  r1-17.$tn.2.3 { 
cba0: 73 71 6c 32 20 22 53 45 4c 45 43 54 20 2a 20 46  sql2 "SELECT * F
cbb0: 52 4f 4d 20 74 31 22 20 7d 20 20 20 20 20 20 20  ROM t1" }       
cbc0: 20 20 20 20 20 7b 31 20 32 20 33 20 34 7d 0a 20       {1 2 3 4}. 
cbd0: 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
cbe0: 31 37 2e 24 74 6e 2e 32 2e 34 20 7b 20 73 71 6c  17.$tn.2.4 { sql
cbf0: 32 20 22 43 4f 4d 4d 49 54 20 3b 20 53 45 4c 45  2 "COMMIT ; SELE
cc00: 43 54 20 2a 20 46 52 4f 4d 20 74 31 22 20 7d 20  CT * FROM t1" } 
cc10: 20 20 7b 31 20 32 20 33 20 34 20 35 20 36 7d 0a    {1 2 3 4 5 6}.
cc20: 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72  .  do_test pager
cc30: 31 2d 31 37 2e 24 74 6e 2e 33 2e 31 20 7b 0a 20  1-17.$tn.3.1 {. 
cc40: 20 20 20 63 6f 64 65 32 20 7b 0a 20 20 20 20 20     code2 {.     
cc50: 20 64 62 32 20 63 6c 6f 73 65 0a 20 20 20 20 20   db2 close.     
cc60: 20 73 71 6c 69 74 65 33 20 64 62 32 20 3a 6d 65   sqlite3 db2 :me
cc70: 6d 6f 72 79 3a 0a 20 20 20 20 7d 0a 20 20 20 20  mory:.    }.    
cc80: 73 71 6c 32 20 7b 20 0a 20 20 20 20 20 20 50 52  sql2 { .      PR
cc90: 41 47 4d 41 20 6f 6d 69 74 5f 72 65 61 64 6c 6f  AGMA omit_readlo
cca0: 63 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20 41 54  ck = 1;.      AT
ccb0: 54 41 43 48 20 27 74 65 73 74 2e 64 62 27 20 41  TACH 'test.db' A
ccc0: 53 20 74 77 6f 3b 0a 20 20 20 20 20 20 42 45 47  S two;.      BEG
ccd0: 49 4e 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54  IN;.      SELECT
cce0: 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20   * FROM t1;.    
ccf0: 7d 0a 20 20 7d 20 7b 31 20 32 20 33 20 34 20 35  }.  } {1 2 3 4 5
cd00: 20 36 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61   6}.  do_test pa
cd10: 67 65 72 31 2d 31 37 2e 24 74 6e 2e 33 2e 32 20  ger1-17.$tn.3.2 
cd20: 7b 0a 20 20 20 20 63 73 71 6c 31 20 7b 20 49 4e  {.    csql1 { IN
cd30: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
cd40: 55 45 53 28 33 2c 20 34 29 20 7d 0a 20 20 7d 20  UES(3, 4) }.  } 
cd50: 7b 31 20 7b 64 61 74 61 62 61 73 65 20 69 73 20  {1 {database is 
cd60: 6c 6f 63 6b 65 64 7d 7d 0a 20 20 64 6f 5f 74 65  locked}}.  do_te
cd70: 73 74 20 70 61 67 65 72 31 2d 31 37 2e 24 74 6e  st pager1-17.$tn
cd80: 2e 33 2e 33 20 7b 20 73 71 6c 32 20 43 4f 4d 4d  .3.3 { sql2 COMM
cd90: 49 54 20 7d 20 7b 7d 0a 7d 0a 0a 23 2d 2d 2d 2d  IT } {}.}..#----
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 2d 2d 0a 23 20 54 65 73 74 20 74 68 65  -----.# Test the
cdf0: 20 70 61 67 65 72 73 20 72 65 73 70 6f 6e 73 65   pagers response
ce00: 20 74 6f 20 74 68 65 20 62 2d 74 72 65 65 20 6c   to the b-tree l
ce10: 61 79 65 72 20 72 65 71 75 65 73 74 69 6e 67 20  ayer requesting 
ce20: 69 6c 6c 65 67 61 6c 20 70 61 67 65 20 0a 23 20  illegal page .# 
ce30: 6e 75 6d 62 65 72 73 3a 0a 23 0a 23 20 20 20 2b  numbers:.#.#   +
ce40: 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 70 61 67   The locking pag
ce50: 65 2c 0a 23 20 20 20 2b 20 50 61 67 65 20 30 2c  e,.#   + Page 0,
ce60: 0a 23 20 20 20 2b 20 41 20 70 61 67 65 20 77 69  .#   + A page wi
ce70: 74 68 20 61 20 70 61 67 65 20 6e 75 6d 62 65 72  th a page number
ce80: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 28 32   greater than (2
ce90: 5e 33 31 2d 31 29 2e 0a 23 0a 64 6f 5f 74 65 73  ^31-1)..#.do_tes
cea0: 74 20 70 61 67 65 72 31 2d 31 38 2e 31 20 7b 0a  t pager1-18.1 {.
ceb0: 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74    faultsim_delet
cec0: 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 64  e_and_reopen.  d
ced0: 62 20 66 75 6e 63 20 61 5f 73 74 72 69 6e 67 20  b func a_string 
cee0: 61 5f 73 74 72 69 6e 67 0a 20 20 65 78 65 63 73  a_string.  execs
cef0: 71 6c 20 7b 20 0a 20 20 20 20 50 52 41 47 4d 41  ql { .    PRAGMA
cf00: 20 70 61 67 65 5f 73 69 7a 65 20 3d 20 31 30 32   page_size = 102
cf10: 34 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  4;.    CREATE TA
cf20: 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20  BLE t1(a, b);.  
cf30: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
cf40: 20 56 41 4c 55 45 53 28 61 5f 73 74 72 69 6e 67   VALUES(a_string
cf50: 28 35 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28  (500), a_string(
cf60: 32 30 30 29 29 3b 0a 20 20 20 20 49 4e 53 45 52  200));.    INSER
cf70: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
cf80: 20 61 5f 73 74 72 69 6e 67 28 35 30 30 29 2c 20   a_string(500), 
cf90: 61 5f 73 74 72 69 6e 67 28 32 30 30 29 20 46 52  a_string(200) FR
cfa0: 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52  OM t1;.    INSER
cfb0: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
cfc0: 20 61 5f 73 74 72 69 6e 67 28 35 30 30 29 2c 20   a_string(500), 
cfd0: 61 5f 73 74 72 69 6e 67 28 32 30 30 29 20 46 52  a_string(200) FR
cfe0: 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52  OM t1;.    INSER
cff0: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
d000: 20 61 5f 73 74 72 69 6e 67 28 35 30 30 29 2c 20   a_string(500), 
d010: 61 5f 73 74 72 69 6e 67 28 32 30 30 29 20 46 52  a_string(200) FR
d020: 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52  OM t1;.    INSER
d030: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
d040: 20 61 5f 73 74 72 69 6e 67 28 35 30 30 29 2c 20   a_string(500), 
d050: 61 5f 73 74 72 69 6e 67 28 32 30 30 29 20 46 52  a_string(200) FR
d060: 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52  OM t1;.    INSER
d070: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
d080: 20 61 5f 73 74 72 69 6e 67 28 35 30 30 29 2c 20   a_string(500), 
d090: 61 5f 73 74 72 69 6e 67 28 32 30 30 29 20 46 52  a_string(200) FR
d0a0: 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52  OM t1;.    INSER
d0b0: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
d0c0: 20 61 5f 73 74 72 69 6e 67 28 35 30 30 29 2c 20   a_string(500), 
d0d0: 61 5f 73 74 72 69 6e 67 28 32 30 30 29 20 46 52  a_string(200) FR
d0e0: 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52  OM t1;.    INSER
d0f0: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
d100: 20 61 5f 73 74 72 69 6e 67 28 35 30 30 29 2c 20   a_string(500), 
d110: 61 5f 73 74 72 69 6e 67 28 32 30 30 29 20 46 52  a_string(200) FR
d120: 4f 4d 20 74 31 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a  OM t1;.  }.} {}.
d130: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31  do_test pager1-1
d140: 38 2e 32 20 7b 0a 20 20 73 65 74 20 72 6f 6f 74  8.2 {.  set root
d150: 20 5b 64 62 20 6f 6e 65 20 22 53 45 4c 45 43 54   [db one "SELECT
d160: 20 72 6f 6f 74 70 61 67 65 20 46 52 4f 4d 20 73   rootpage FROM s
d170: 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 5d 0a 20  qlite_master"]. 
d180: 20 73 65 74 20 6c 6f 63 6b 69 6e 67 70 61 67 65   set lockingpage
d190: 20 5b 65 78 70 72 20 28 30 78 31 30 30 30 30 2f   [expr (0x10000/
d1a0: 31 30 32 34 29 20 2b 20 31 5d 0a 20 20 65 78 65  1024) + 1].  exe
d1b0: 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d  csql {.    PRAGM
d1c0: 41 20 77 72 69 74 61 62 6c 65 5f 73 63 68 65 6d  A writable_schem
d1d0: 61 20 3d 20 31 3b 0a 20 20 20 20 55 50 44 41 54  a = 1;.    UPDAT
d1e0: 45 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  E sqlite_master 
d1f0: 53 45 54 20 72 6f 6f 74 70 61 67 65 20 3d 20 24  SET rootpage = $
d200: 6c 6f 63 6b 69 6e 67 70 61 67 65 3b 0a 20 20 7d  lockingpage;.  }
d210: 0a 20 20 73 71 6c 69 74 65 33 20 64 62 32 20 74  .  sqlite3 db2 t
d220: 65 73 74 2e 64 62 0a 20 20 63 61 74 63 68 73 71  est.db.  catchsq
d230: 6c 20 7b 20 53 45 4c 45 43 54 20 63 6f 75 6e 74  l { SELECT count
d240: 28 2a 29 20 46 52 4f 4d 20 74 31 20 7d 20 64 62  (*) FROM t1 } db
d250: 32 0a 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65  2.} {1 {database
d260: 20 64 69 73 6b 20 69 6d 61 67 65 20 69 73 20 6d   disk image is m
d270: 61 6c 66 6f 72 6d 65 64 7d 7d 0a 64 62 32 20 63  alformed}}.db2 c
d280: 6c 6f 73 65 0a 64 6f 5f 74 65 73 74 20 70 61 67  lose.do_test pag
d290: 65 72 31 2d 31 38 2e 33 20 7b 0a 20 20 65 78 65  er1-18.3 {.  exe
d2a0: 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54  csql {.    CREAT
d2b0: 45 20 54 41 42 4c 45 20 74 32 28 78 29 3b 0a 20  E TABLE t2(x);. 
d2c0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
d2d0: 32 20 56 41 4c 55 45 53 28 61 5f 73 74 72 69 6e  2 VALUES(a_strin
d2e0: 67 28 35 30 30 30 29 29 3b 0a 20 20 7d 0a 20 20  g(5000));.  }.  
d2f0: 73 65 74 20 70 67 6e 6f 20 5b 65 78 70 72 20 28  set pgno [expr (
d300: 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e  [file size test.
d310: 64 62 5d 20 2f 20 31 30 32 34 29 2d 32 5d 0a 20  db] / 1024)-2]. 
d320: 20 68 65 78 69 6f 5f 77 72 69 74 65 20 74 65 73   hexio_write tes
d330: 74 2e 64 62 20 5b 65 78 70 72 20 28 24 70 67 6e  t.db [expr ($pgn
d340: 6f 2d 31 29 2a 31 30 32 34 5d 20 30 30 30 30 30  o-1)*1024] 00000
d350: 30 30 30 0a 20 20 73 71 6c 69 74 65 33 20 64 62  000.  sqlite3 db
d360: 32 20 74 65 73 74 2e 64 62 0a 20 20 63 61 74 63  2 test.db.  catc
d370: 68 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 6c 65  hsql { SELECT le
d380: 6e 67 74 68 28 78 29 20 46 52 4f 4d 20 74 32 20  ngth(x) FROM t2 
d390: 7d 20 64 62 32 0a 7d 20 7b 31 20 7b 64 61 74 61  } db2.} {1 {data
d3a0: 62 61 73 65 20 64 69 73 6b 20 69 6d 61 67 65 20  base disk image 
d3b0: 69 73 20 6d 61 6c 66 6f 72 6d 65 64 7d 7d 0a 64  is malformed}}.d
d3c0: 62 32 20 63 6c 6f 73 65 0a 64 6f 5f 74 65 73 74  b2 close.do_test
d3d0: 20 70 61 67 65 72 31 2d 31 38 2e 34 20 7b 0a 20   pager1-18.4 {. 
d3e0: 20 68 65 78 69 6f 5f 77 72 69 74 65 20 74 65 73   hexio_write tes
d3f0: 74 2e 64 62 20 5b 65 78 70 72 20 28 24 70 67 6e  t.db [expr ($pgn
d400: 6f 2d 31 29 2a 31 30 32 34 5d 20 39 30 30 30 30  o-1)*1024] 90000
d410: 30 30 30 0a 20 20 73 71 6c 69 74 65 33 20 64 62  000.  sqlite3 db
d420: 32 20 74 65 73 74 2e 64 62 0a 20 20 63 61 74 63  2 test.db.  catc
d430: 68 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 6c 65  hsql { SELECT le
d440: 6e 67 74 68 28 78 29 20 46 52 4f 4d 20 74 32 20  ngth(x) FROM t2 
d450: 7d 20 64 62 32 0a 7d 20 7b 31 20 7b 64 61 74 61  } db2.} {1 {data
d460: 62 61 73 65 20 64 69 73 6b 20 69 6d 61 67 65 20  base disk image 
d470: 69 73 20 6d 61 6c 66 6f 72 6d 65 64 7d 7d 0a 64  is malformed}}.d
d480: 62 32 20 63 6c 6f 73 65 0a 64 6f 5f 74 65 73 74  b2 close.do_test
d490: 20 70 61 67 65 72 31 2d 31 38 2e 35 20 7b 0a 20   pager1-18.5 {. 
d4a0: 20 73 71 6c 69 74 65 33 20 64 62 20 22 22 0a 20   sqlite3 db "". 
d4b0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43   execsql {.    C
d4c0: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61  REATE TABLE t1(a
d4d0: 2c 20 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45  , b);.    CREATE
d4e0: 20 54 41 42 4c 45 20 74 32 28 61 2c 20 62 29 3b   TABLE t2(a, b);
d4f0: 0a 20 20 20 20 50 52 41 47 4d 41 20 77 72 69 74  .    PRAGMA writ
d500: 61 62 6c 65 5f 73 63 68 65 6d 61 20 3d 20 31 3b  able_schema = 1;
d510: 0a 20 20 20 20 55 50 44 41 54 45 20 73 71 6c 69  .    UPDATE sqli
d520: 74 65 5f 6d 61 73 74 65 72 20 53 45 54 20 72 6f  te_master SET ro
d530: 6f 74 70 61 67 65 3d 35 20 57 48 45 52 45 20 74  otpage=5 WHERE t
d540: 62 6c 5f 6e 61 6d 65 20 3d 20 27 74 31 27 3b 0a  bl_name = 't1';.
d550: 20 20 20 20 50 52 41 47 4d 41 20 77 72 69 74 61      PRAGMA writa
d560: 62 6c 65 5f 73 63 68 65 6d 61 20 3d 20 30 3b 0a  ble_schema = 0;.
d570: 20 20 20 20 41 4c 54 45 52 20 54 41 42 4c 45 20      ALTER TABLE 
d580: 74 31 20 52 45 4e 41 4d 45 20 54 4f 20 78 31 3b  t1 RENAME TO x1;
d590: 0a 20 20 7d 0a 20 20 63 61 74 63 68 73 71 6c 20  .  }.  catchsql 
d5a0: 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  { SELECT * FROM 
d5b0: 78 31 20 7d 0a 7d 20 7b 31 20 7b 64 61 74 61 62  x1 }.} {1 {datab
d5c0: 61 73 65 20 64 69 73 6b 20 69 6d 61 67 65 20 69  ase disk image i
d5d0: 73 20 6d 61 6c 66 6f 72 6d 65 64 7d 7d 0a 64 62  s malformed}}.db
d5e0: 20 63 6c 6f 73 65 0a 0a 64 6f 5f 74 65 73 74 20   close..do_test 
d5f0: 70 61 67 65 72 31 2d 31 38 2e 36 20 7b 0a 20 20  pager1-18.6 {.  
d600: 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f  faultsim_delete_
d610: 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 64 62 20  and_reopen.  db 
d620: 66 75 6e 63 20 61 5f 73 74 72 69 6e 67 20 61 5f  func a_string a_
d630: 73 74 72 69 6e 67 0a 20 20 65 78 65 63 73 71 6c  string.  execsql
d640: 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 70 61   {.    PRAGMA pa
d650: 67 65 5f 73 69 7a 65 20 3d 20 31 30 32 34 3b 0a  ge_size = 1024;.
d660: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
d670: 20 74 31 28 78 29 3b 0a 20 20 20 20 49 4e 53 45   t1(x);.    INSE
d680: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
d690: 53 28 61 5f 73 74 72 69 6e 67 28 38 30 30 29 29  S(a_string(800))
d6a0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
d6b0: 4f 20 74 31 20 56 41 4c 55 45 53 28 61 5f 73 74  O t1 VALUES(a_st
d6c0: 72 69 6e 67 28 38 30 30 29 29 3b 0a 20 20 7d 0a  ring(800));.  }.
d6d0: 0a 20 20 73 65 74 20 72 6f 6f 74 20 5b 64 62 20  .  set root [db 
d6e0: 6f 6e 65 20 22 53 45 4c 45 43 54 20 72 6f 6f 74  one "SELECT root
d6f0: 70 61 67 65 20 46 52 4f 4d 20 73 71 6c 69 74 65  page FROM sqlite
d700: 5f 6d 61 73 74 65 72 22 5d 0a 20 20 64 62 20 63  _master"].  db c
d710: 6c 6f 73 65 0a 0a 20 20 68 65 78 69 6f 5f 77 72  lose..  hexio_wr
d720: 69 74 65 20 74 65 73 74 2e 64 62 20 5b 65 78 70  ite test.db [exp
d730: 72 20 28 24 72 6f 6f 74 2d 31 29 2a 31 30 32 34  r ($root-1)*1024
d740: 20 2b 20 38 5d 20 30 30 30 30 30 30 30 30 0a 20   + 8] 00000000. 
d750: 20 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74   sqlite3 db test
d760: 2e 64 62 0a 20 20 63 61 74 63 68 73 71 6c 20 7b  .db.  catchsql {
d770: 20 53 45 4c 45 43 54 20 6c 65 6e 67 74 68 28 78   SELECT length(x
d780: 29 20 46 52 4f 4d 20 74 31 20 7d 0a 7d 20 7b 31  ) FROM t1 }.} {1
d790: 20 7b 64 61 74 61 62 61 73 65 20 64 69 73 6b 20   {database disk 
d7a0: 69 6d 61 67 65 20 69 73 20 6d 61 6c 66 6f 72 6d  image is malform
d7b0: 65 64 7d 7d 0a 0a 64 6f 5f 74 65 73 74 20 70 61  ed}}..do_test pa
d7c0: 67 65 72 31 2d 31 39 2e 31 20 7b 0a 20 20 73 71  ger1-19.1 {.  sq
d7d0: 6c 69 74 65 33 20 64 62 20 22 22 0a 20 20 64 62  lite3 db "".  db
d7e0: 20 66 75 6e 63 20 61 5f 73 74 72 69 6e 67 20 61   func a_string a
d7f0: 5f 73 74 72 69 6e 67 0a 20 20 65 78 65 63 73 71  _string.  execsq
d800: 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 70  l {.    PRAGMA p
d810: 61 67 65 5f 73 69 7a 65 20 3d 20 35 31 32 3b 0a  age_size = 512;.
d820: 20 20 20 20 50 52 41 47 4d 41 20 61 75 74 6f 5f      PRAGMA auto_
d830: 76 61 63 75 75 6d 20 3d 20 31 3b 0a 20 20 20 20  vacuum = 1;.    
d840: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
d850: 61 61 2c 20 61 62 2c 20 61 63 2c 20 61 64 2c 20  aa, ab, ac, ad, 
d860: 61 65 2c 20 61 66 2c 20 61 67 2c 20 61 68 2c 20  ae, af, ag, ah, 
d870: 61 69 2c 20 61 6a 2c 20 61 6b 2c 20 61 6c 2c 20  ai, aj, ak, al, 
d880: 61 6d 2c 20 61 6e 2c 0a 20 20 20 20 20 20 20 20  am, an,.        
d890: 20 20 20 20 20 20 20 20 20 20 20 20 62 61 2c 20              ba, 
d8a0: 62 62 2c 20 62 63 2c 20 62 64 2c 20 62 65 2c 20  bb, bc, bd, be, 
d8b0: 62 66 2c 20 62 67 2c 20 62 68 2c 20 62 69 2c 20  bf, bg, bh, bi, 
d8c0: 62 6a 2c 20 62 6b 2c 20 62 6c 2c 20 62 6d 2c 20  bj, bk, bl, bm, 
d8d0: 62 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  bn,.            
d8e0: 20 20 20 20 20 20 20 20 63 61 2c 20 63 62 2c 20          ca, cb, 
d8f0: 63 63 2c 20 63 64 2c 20 63 65 2c 20 63 66 2c 20  cc, cd, ce, cf, 
d900: 63 67 2c 20 63 68 2c 20 63 69 2c 20 63 6a 2c 20  cg, ch, ci, cj, 
d910: 63 6b 2c 20 63 6c 2c 20 63 6d 2c 20 63 6e 2c 0a  ck, cl, cm, cn,.
d920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d930: 20 20 20 20 64 61 2c 20 64 62 2c 20 64 63 2c 20      da, db, dc, 
d940: 64 64 2c 20 64 65 2c 20 64 66 2c 20 64 67 2c 20  dd, de, df, dg, 
d950: 64 68 2c 20 64 69 2c 20 64 6a 2c 20 64 6b 2c 20  dh, di, dj, dk, 
d960: 64 6c 2c 20 64 6d 2c 20 64 6e 2c 0a 20 20 20 20  dl, dm, dn,.    
d970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d980: 65 61 2c 20 65 62 2c 20 65 63 2c 20 65 64 2c 20  ea, eb, ec, ed, 
d990: 65 65 2c 20 65 66 2c 20 65 67 2c 20 65 68 2c 20  ee, ef, eg, eh, 
d9a0: 65 69 2c 20 65 6a 2c 20 65 6b 2c 20 65 6c 2c 20  ei, ej, ek, el, 
d9b0: 65 6d 2c 20 65 6e 2c 0a 20 20 20 20 20 20 20 20  em, en,.        
d9c0: 20 20 20 20 20 20 20 20 20 20 20 20 66 61 2c 20              fa, 
d9d0: 66 62 2c 20 66 63 2c 20 66 64 2c 20 66 65 2c 20  fb, fc, fd, fe, 
d9e0: 66 66 2c 20 66 67 2c 20 66 68 2c 20 66 69 2c 20  ff, fg, fh, fi, 
d9f0: 66 6a 2c 20 66 6b 2c 20 66 6c 2c 20 66 6d 2c 20  fj, fk, fl, fm, 
da00: 66 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  fn,.            
da10: 20 20 20 20 20 20 20 20 67 61 2c 20 67 62 2c 20          ga, gb, 
da20: 67 63 2c 20 67 64 2c 20 67 65 2c 20 67 66 2c 20  gc, gd, ge, gf, 
da30: 67 67 2c 20 67 68 2c 20 67 69 2c 20 67 6a 2c 20  gg, gh, gi, gj, 
da40: 67 6b 2c 20 67 6c 2c 20 67 6d 2c 20 67 6e 2c 0a  gk, gl, gm, gn,.
da50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da60: 20 20 20 20 68 61 2c 20 68 62 2c 20 68 63 2c 20      ha, hb, hc, 
da70: 68 64 2c 20 68 65 2c 20 68 66 2c 20 68 67 2c 20  hd, he, hf, hg, 
da80: 68 68 2c 20 68 69 2c 20 68 6a 2c 20 68 6b 2c 20  hh, hi, hj, hk, 
da90: 68 6c 2c 20 68 6d 2c 20 68 6e 2c 0a 20 20 20 20  hl, hm, hn,.    
daa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dab0: 69 61 2c 20 69 62 2c 20 69 63 2c 20 69 64 2c 20  ia, ib, ic, id, 
dac0: 69 65 2c 20 69 66 2c 20 69 67 2c 20 69 68 2c 20  ie, if, ig, ih, 
dad0: 69 69 2c 20 69 6a 2c 20 69 6b 2c 20 69 6c 2c 20  ii, ij, ik, il, 
dae0: 69 6d 2c 20 69 78 2c 0a 20 20 20 20 20 20 20 20  im, ix,.        
daf0: 20 20 20 20 20 20 20 20 20 20 20 20 6a 61 2c 20              ja, 
db00: 6a 62 2c 20 6a 63 2c 20 6a 64 2c 20 6a 65 2c 20  jb, jc, jd, je, 
db10: 6a 66 2c 20 6a 67 2c 20 6a 68 2c 20 6a 69 2c 20  jf, jg, jh, ji, 
db20: 6a 6a 2c 20 6a 6b 2c 20 6a 6c 2c 20 6a 6d 2c 20  jj, jk, jl, jm, 
db30: 6a 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  jn,.            
db40: 20 20 20 20 20 20 20 20 6b 61 2c 20 6b 62 2c 20          ka, kb, 
db50: 6b 63 2c 20 6b 64 2c 20 6b 65 2c 20 6b 66 2c 20  kc, kd, ke, kf, 
db60: 6b 67 2c 20 6b 68 2c 20 6b 69 2c 20 6b 6a 2c 20  kg, kh, ki, kj, 
db70: 6b 6b 2c 20 6b 6c 2c 20 6b 6d 2c 20 6b 6e 2c 0a  kk, kl, km, kn,.
db80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db90: 20 20 20 20 6c 61 2c 20 6c 62 2c 20 6c 63 2c 20      la, lb, lc, 
dba0: 6c 64 2c 20 6c 65 2c 20 6c 66 2c 20 6c 67 2c 20  ld, le, lf, lg, 
dbb0: 6c 68 2c 20 6c 69 2c 20 6c 6a 2c 20 6c 6b 2c 20  lh, li, lj, lk, 
dbc0: 6c 6c 2c 20 6c 6d 2c 20 6c 6e 2c 0a 20 20 20 20  ll, lm, ln,.    
dbd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dbe0: 6d 61 2c 20 6d 62 2c 20 6d 63 2c 20 6d 64 2c 20  ma, mb, mc, md, 
dbf0: 6d 65 2c 20 6d 66 2c 20 6d 67 2c 20 6d 68 2c 20  me, mf, mg, mh, 
dc00: 6d 69 2c 20 6d 6a 2c 20 6d 6b 2c 20 6d 6c 2c 20  mi, mj, mk, ml, 
dc10: 6d 6d 2c 20 6d 6e 0a 20 20 20 20 29 3b 0a 20 20  mm, mn.    );.  
dc20: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
dc30: 32 28 61 61 2c 20 61 62 2c 20 61 63 2c 20 61 64  2(aa, ab, ac, ad
dc40: 2c 20 61 65 2c 20 61 66 2c 20 61 67 2c 20 61 68  , ae, af, ag, ah
dc50: 2c 20 61 69 2c 20 61 6a 2c 20 61 6b 2c 20 61 6c  , ai, aj, ak, al
dc60: 2c 20 61 6d 2c 20 61 6e 2c 0a 20 20 20 20 20 20  , am, an,.      
dc70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 61                ba
dc80: 2c 20 62 62 2c 20 62 63 2c 20 62 64 2c 20 62 65  , bb, bc, bd, be
dc90: 2c 20 62 66 2c 20 62 67 2c 20 62 68 2c 20 62 69  , bf, bg, bh, bi
dca0: 2c 20 62 6a 2c 20 62 6b 2c 20 62 6c 2c 20 62 6d  , bj, bk, bl, bm
dcb0: 2c 20 62 6e 2c 0a 20 20 20 20 20 20 20 20 20 20  , bn,.          
dcc0: 20 20 20 20 20 20 20 20 20 20 63 61 2c 20 63 62            ca, cb
dcd0: 2c 20 63 63 2c 20 63 64 2c 20 63 65 2c 20 63 66  , cc, cd, ce, cf
dce0: 2c 20 63 67 2c 20 63 68 2c 20 63 69 2c 20 63 6a  , cg, ch, ci, cj
dcf0: 2c 20 63 6b 2c 20 63 6c 2c 20 63 6d 2c 20 63 6e  , ck, cl, cm, cn
dd00: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
dd10: 20 20 20 20 20 20 64 61 2c 20 64 62 2c 20 64 63        da, db, dc
dd20: 2c 20 64 64 2c 20 64 65 2c 20 64 66 2c 20 64 67  , dd, de, df, dg
dd30: 2c 20 64 68 2c 20 64 69 2c 20 64 6a 2c 20 64 6b  , dh, di, dj, dk
dd40: 2c 20 64 6c 2c 20 64 6d 2c 20 64 6e 2c 0a 20 20  , dl, dm, dn,.  
dd50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd60: 20 20 65 61 2c 20 65 62 2c 20 65 63 2c 20 65 64    ea, eb, ec, ed
dd70: 2c 20 65 65 2c 20 65 66 2c 20 65 67 2c 20 65 68  , ee, ef, eg, eh
dd80: 2c 20 65 69 2c 20 65 6a 2c 20 65 6b 2c 20 65 6c  , ei, ej, ek, el
dd90: 2c 20 65 6d 2c 20 65 6e 2c 0a 20 20 20 20 20 20  , em, en,.      
dda0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 61                fa
ddb0: 2c 20 66 62 2c 20 66 63 2c 20 66 64 2c 20 66 65  , fb, fc, fd, fe
ddc0: 2c 20 66 66 2c 20 66 67 2c 20 66 68 2c 20 66 69  , ff, fg, fh, fi
ddd0: 2c 20 66 6a 2c 20 66 6b 2c 20 66 6c 2c 20 66 6d  , fj, fk, fl, fm
dde0: 2c 20 66 6e 2c 0a 20 20 20 20 20 20 20 20 20 20  , fn,.          
ddf0: 20 20 20 20 20 20 20 20 20 20 67 61 2c 20 67 62            ga, gb
de00: 2c 20 67 63 2c 20 67 64 2c 20 67 65 2c 20 67 66  , gc, gd, ge, gf
de10: 2c 20 67 67 2c 20 67 68 2c 20 67 69 2c 20 67 6a  , gg, gh, gi, gj
de20: 2c 20 67 6b 2c 20 67 6c 2c 20 67 6d 2c 20 67 6e  , gk, gl, gm, gn
de30: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
de40: 20 20 20 20 20 20 68 61 2c 20 68 62 2c 20 68 63        ha, hb, hc
de50: 2c 20 68 64 2c 20 68 65 2c 20 68 66 2c 20 68 67  , hd, he, hf, hg
de60: 2c 20 68 68 2c 20 68 69 2c 20 68 6a 2c 20 68 6b  , hh, hi, hj, hk
de70: 2c 20 68 6c 2c 20 68 6d 2c 20 68 6e 2c 0a 20 20  , hl, hm, hn,.  
de80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de90: 20 20 69 61 2c 20 69 62 2c 20 69 63 2c 20 69 64    ia, ib, ic, id
dea0: 2c 20 69 65 2c 20 69 66 2c 20 69 67 2c 20 69 68  , ie, if, ig, ih
deb0: 2c 20 69 69 2c 20 69 6a 2c 20 69 6b 2c 20 69 6c  , ii, ij, ik, il
dec0: 2c 20 69 6d 2c 20 69 78 2c 0a 20 20 20 20 20 20  , im, ix,.      
ded0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6a 61                ja
dee0: 2c 20 6a 62 2c 20 6a 63 2c 20 6a 64 2c 20 6a 65  , jb, jc, jd, je
def0: 2c 20 6a 66 2c 20 6a 67 2c 20 6a 68 2c 20 6a 69  , jf, jg, jh, ji
df00: 2c 20 6a 6a 2c 20 6a 6b 2c 20 6a 6c 2c 20 6a 6d  , jj, jk, jl, jm
df10: 2c 20 6a 6e 2c 0a 20 20 20 20 20 20 20 20 20 20  , jn,.          
df20: 20 20 20 20 20 20 20 20 20 20 6b 61 2c 20 6b 62            ka, kb
df30: 2c 20 6b 63 2c 20 6b 64 2c 20 6b 65 2c 20 6b 66  , kc, kd, ke, kf
df40: 2c 20 6b 67 2c 20 6b 68 2c 20 6b 69 2c 20 6b 6a  , kg, kh, ki, kj
df50: 2c 20 6b 6b 2c 20 6b 6c 2c 20 6b 6d 2c 20 6b 6e  , kk, kl, km, kn
df60: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
df70: 20 20 20 20 20 20 6c 61 2c 20 6c 62 2c 20 6c 63        la, lb, lc
df80: 2c 20 6c 64 2c 20 6c 65 2c 20 6c 66 2c 20 6c 67  , ld, le, lf, lg
df90: 2c 20 6c 68 2c 20 6c 69 2c 20 6c 6a 2c 20 6c 6b  , lh, li, lj, lk
dfa0: 2c 20 6c 6c 2c 20 6c 6d 2c 20 6c 6e 2c 0a 20 20  , ll, lm, ln,.  
dfb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dfc0: 20 20 6d 61 2c 20 6d 62 2c 20 6d 63 2c 20 6d 64    ma, mb, mc, md
dfd0: 2c 20 6d 65 2c 20 6d 66 2c 20 6d 67 2c 20 6d 68  , me, mf, mg, mh
dfe0: 2c 20 6d 69 2c 20 6d 6a 2c 20 6d 6b 2c 20 6d 6c  , mi, mj, mk, ml
dff0: 2c 20 6d 6d 2c 20 6d 6e 0a 20 20 20 20 29 3b 0a  , mm, mn.    );.
e000: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
e010: 74 31 28 61 61 29 20 56 41 4c 55 45 53 28 20 61  t1(aa) VALUES( a
e020: 5f 73 74 72 69 6e 67 28 31 30 30 30 30 30 29 20  _string(100000) 
e030: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
e040: 54 4f 20 74 32 28 61 61 29 20 56 41 4c 55 45 53  TO t2(aa) VALUES
e050: 28 20 61 5f 73 74 72 69 6e 67 28 31 30 30 30 30  ( a_string(10000
e060: 30 29 20 29 3b 0a 20 20 20 20 56 41 43 55 55 4d  0) );.    VACUUM
e070: 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 23 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 2d 2d 0a 23 20 54 65 73 74 20 61 20  ------.# Test a 
e0d0: 63 6f 75 70 6c 65 20 6f 66 20 73 70 65 63 69 61  couple of specia
e0e0: 6c 20 63 61 73 65 73 20 74 68 61 74 20 63 6f 6d  l cases that com
e0f0: 65 20 75 70 20 77 68 69 6c 65 20 63 6f 6d 6d 69  e up while commi
e100: 74 74 69 6e 67 20 0a 23 20 74 72 61 6e 73 61 63  tting .# transac
e110: 74 69 6f 6e 73 3a 0a 23 0a 23 20 20 20 70 61 67  tions:.#.#   pag
e120: 65 72 31 2d 32 30 2e 31 2e 2a 3a 20 43 6f 6d 6d  er1-20.1.*: Comm
e130: 69 74 74 69 6e 67 20 61 6e 20 69 6e 2d 6d 65 6d  itting an in-mem
e140: 6f 72 79 20 64 61 74 61 62 61 73 65 20 74 72 61  ory database tra
e150: 6e 73 61 63 74 69 6f 6e 20 77 68 65 6e 20 74 68  nsaction when th
e160: 65 20 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  e .#            
e170: 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20 68        database h
e180: 61 73 20 6e 6f 74 20 62 65 65 6e 20 6d 6f 64 69  as not been modi
e190: 66 69 65 64 20 61 74 20 61 6c 6c 2e 0a 23 0a 23  fied at all..#.#
e1a0: 20 20 20 70 61 67 65 72 31 2d 32 30 2e 32 2e 2a     pager1-20.2.*
e1b0: 3a 20 41 73 20 61 62 6f 76 65 2c 20 62 75 74 20  : As above, but 
e1c0: 77 69 74 68 20 61 20 6e 6f 72 6d 61 6c 20 64 62  with a normal db
e1d0: 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 6c 6f   in exclusive-lo
e1e0: 63 6b 69 6e 67 20 6d 6f 64 65 2e 0a 23 0a 23 20  cking mode..#.# 
e1f0: 20 20 70 61 67 65 72 31 2d 32 30 2e 33 2e 2a 3a    pager1-20.3.*:
e200: 20 43 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72   Committing a tr
e210: 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 57 41 4c  ansaction in WAL
e220: 20 6d 6f 64 65 20 77 68 65 72 65 20 74 68 65 20   mode where the 
e230: 64 61 74 61 62 61 73 65 20 68 61 73 0a 23 20 20  database has.#  
e240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e250: 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2c 20 62  been modified, b
e260: 75 74 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67  ut all dirty pag
e270: 65 73 20 68 61 76 65 20 62 65 65 6e 20 66 6c 75  es have been flu
e280: 73 68 65 64 20 74 6f 20 0a 23 20 20 20 20 20 20  shed to .#      
e290: 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73 6b              disk
e2a0: 20 62 65 66 6f 72 65 20 74 68 65 20 63 6f 6d 6d   before the comm
e2b0: 69 74 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 70 61  it..#.do_test pa
e2c0: 67 65 72 31 2d 32 30 2e 31 2e 31 20 7b 0a 20 20  ger1-20.1.1 {.  
e2d0: 63 61 74 63 68 20 7b 64 62 20 63 6c 6f 73 65 7d  catch {db close}
e2e0: 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 3a 6d  .  sqlite3 db :m
e2f0: 65 6d 6f 72 79 3a 0a 20 20 65 78 65 63 73 71 6c  emory:.  execsql
e300: 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41   {.    CREATE TA
e310: 42 4c 45 20 6f 6e 65 28 74 77 6f 2c 20 74 68 72  BLE one(two, thr
e320: 65 65 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  ee);.    INSERT 
e330: 49 4e 54 4f 20 6f 6e 65 20 56 41 4c 55 45 53 28  INTO one VALUES(
e340: 27 61 27 2c 20 27 62 27 29 3b 0a 20 20 7d 0a 7d  'a', 'b');.  }.}
e350: 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65   {}.do_test page
e360: 72 31 2d 32 30 2e 31 2e 32 20 7b 0a 20 20 65 78  r1-20.1.2 {.  ex
e370: 65 63 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49  ecsql {.    BEGI
e380: 4e 20 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20  N EXCLUSIVE;.   
e390: 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 7d 20 7b   COMMIT;.  }.} {
e3a0: 7d 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  }..do_test pager
e3b0: 31 2d 32 30 2e 32 2e 31 20 7b 0a 20 20 66 61 75  1-20.2.1 {.  fau
e3c0: 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64  ltsim_delete_and
e3d0: 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65 63 73 71  _reopen.  execsq
e3e0: 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 6c  l {.    PRAGMA l
e3f0: 6f 63 6b 69 6e 67 5f 6d 6f 64 65 20 3d 20 65 78  ocking_mode = ex
e400: 63 6c 75 73 69 76 65 3b 0a 20 20 20 20 50 52 41  clusive;.    PRA
e410: 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
e420: 20 3d 20 70 65 72 73 69 73 74 3b 0a 20 20 20 20   = persist;.    
e430: 43 52 45 41 54 45 20 54 41 42 4c 45 20 6f 6e 65  CREATE TABLE one
e440: 28 74 77 6f 2c 20 74 68 72 65 65 29 3b 0a 20 20  (two, three);.  
e450: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 6f 6e    INSERT INTO on
e460: 65 20 56 41 4c 55 45 53 28 27 61 27 2c 20 27 62  e VALUES('a', 'b
e470: 27 29 3b 0a 20 20 7d 0a 7d 20 7b 65 78 63 6c 75  ');.  }.} {exclu
e480: 73 69 76 65 20 70 65 72 73 69 73 74 7d 0a 64 6f  sive persist}.do
e490: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 30 2e  _test pager1-20.
e4a0: 32 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  2.2 {.  execsql 
e4b0: 7b 0a 20 20 20 20 42 45 47 49 4e 20 45 58 43 4c  {.    BEGIN EXCL
e4c0: 55 53 49 56 45 3b 0a 20 20 20 20 43 4f 4d 4d 49  USIVE;.    COMMI
e4d0: 54 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 64 6f 5f  T;.  }.} {}..do_
e4e0: 74 65 73 74 20 70 61 67 65 72 31 2d 32 30 2e 33  test pager1-20.3
e4f0: 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f  .1 {.  faultsim_
e500: 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65  delete_and_reope
e510: 6e 0a 20 20 64 62 20 66 75 6e 63 20 61 5f 73 74  n.  db func a_st
e520: 72 69 6e 67 20 61 5f 73 74 72 69 6e 67 0a 20 20  ring a_string.  
e530: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52  execsql {.    PR
e540: 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 20  AGMA cache_size 
e550: 3d 20 31 30 3b 0a 20 20 20 20 50 52 41 47 4d 41  = 10;.    PRAGMA
e560: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20   journal_mode = 
e570: 77 61 6c 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a  wal;.    BEGIN;.
e580: 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42        CREATE TAB
e590: 4c 45 20 74 31 28 78 29 3b 0a 20 20 20 20 20 20  LE t1(x);.      
e5a0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32 28  CREATE TABLE t2(
e5b0: 79 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  y);.      INSERT
e5c0: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
e5d0: 61 5f 73 74 72 69 6e 67 28 38 30 30 29 29 3b 0a  a_string(800));.
e5e0: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
e5f0: 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74  O t1 SELECT a_st
e600: 72 69 6e 67 28 38 30 30 29 20 46 52 4f 4d 20 74  ring(800) FROM t
e610: 31 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20  1;         /*   
e620: 32 20 2a 2f 0a 20 20 20 20 20 20 49 4e 53 45 52  2 */.      INSER
e630: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
e640: 20 61 5f 73 74 72 69 6e 67 28 38 30 30 29 20 46   a_string(800) F
e650: 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 20 20  ROM t1;         
e660: 2f 2a 20 20 20 34 20 2a 2f 0a 20 20 20 20 20 20  /*   4 */.      
e670: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
e680: 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 38  ELECT a_string(8
e690: 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20  00) FROM t1;    
e6a0: 20 20 20 20 20 2f 2a 20 20 20 38 20 2a 2f 0a 20       /*   8 */. 
e6b0: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
e6c0: 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74 72   t1 SELECT a_str
e6d0: 69 6e 67 28 38 30 30 29 20 46 52 4f 4d 20 74 31  ing(800) FROM t1
e6e0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 20 31 36  ;         /*  16
e6f0: 20 2a 2f 0a 20 20 20 20 20 20 49 4e 53 45 52 54   */.      INSERT
e700: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
e710: 61 5f 73 74 72 69 6e 67 28 38 30 30 29 20 46 52  a_string(800) FR
e720: 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 20 20 2f  OM t1;         /
e730: 2a 20 20 33 32 20 2a 2f 0a 20 20 20 20 43 4f 4d  *  32 */.    COM
e740: 4d 49 54 3b 0a 20 20 7d 0a 7d 20 7b 77 61 6c 7d  MIT;.  }.} {wal}
e750: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
e760: 32 30 2e 33 2e 32 20 7b 0a 20 20 65 78 65 63 73  20.3.2 {.  execs
e770: 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a  ql {.    BEGIN;.
e780: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
e790: 74 32 20 56 41 4c 55 45 53 28 27 78 78 78 78 27  t2 VALUES('xxxx'
e7a0: 29 3b 0a 20 20 7d 0a 20 20 72 65 63 75 72 73 69  );.  }.  recursi
e7b0: 76 65 5f 73 65 6c 65 63 74 20 33 32 20 74 31 0a  ve_select 32 t1.
e7c0: 20 20 65 78 65 63 73 71 6c 20 43 4f 4d 4d 49 54    execsql COMMIT
e7d0: 0a 7d 20 7b 7d 0a 0a 23 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 2d  ----------------
e820: 2d 0a 23 20 54 65 73 74 20 74 68 61 74 20 61 20  -.# Test that a 
e830: 57 41 4c 20 64 61 74 61 62 61 73 65 20 6d 61 79  WAL database may
e840: 20 6e 6f 74 20 62 65 20 6f 70 65 6e 65 64 20 69   not be opened i
e850: 66 3a 0a 23 0a 23 20 20 20 70 61 67 65 72 31 2d  f:.#.#   pager1-
e860: 32 31 2e 31 2e 2a 3a 20 54 68 65 20 56 46 53 20  21.1.*: The VFS 
e870: 68 61 73 20 61 6e 20 69 56 65 72 73 69 6f 6e 20  has an iVersion 
e880: 6c 65 73 73 20 74 68 61 6e 20 32 2c 20 6f 72 0a  less than 2, or.
e890: 23 20 20 20 70 61 67 65 72 31 2d 32 31 2e 32 2e  #   pager1-21.2.
e8a0: 2a 3a 20 54 68 65 20 56 46 53 20 64 6f 65 73 20  *: The VFS does 
e8b0: 6e 6f 74 20 70 72 6f 76 69 64 65 20 78 53 68 6d  not provide xShm
e8c0: 58 58 58 28 29 20 6d 65 74 68 6f 64 73 2e 0a 23  XXX() methods..#
e8d0: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
e8e0: 32 31 2e 30 20 7b 0a 20 20 66 61 75 6c 74 73 69  21.0 {.  faultsi
e8f0: 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f  m_delete_and_reo
e900: 70 65 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  pen.  execsql {.
e910: 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e      PRAGMA journ
e920: 61 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c 3b 0a 20  al_mode = WAL;. 
e930: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
e940: 6b 6f 28 63 20 44 45 46 41 55 4c 54 20 27 61 62  ko(c DEFAULT 'ab
e950: 63 27 2c 20 62 20 44 45 46 41 55 4c 54 20 27 64  c', b DEFAULT 'd
e960: 65 66 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  ef');.    INSERT
e970: 20 49 4e 54 4f 20 6b 6f 20 44 45 46 41 55 4c 54   INTO ko DEFAULT
e980: 20 56 41 4c 55 45 53 3b 0a 20 20 7d 0a 7d 20 7b   VALUES;.  }.} {
e990: 77 61 6c 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67  wal}.do_test pag
e9a0: 65 72 31 2d 32 31 2e 31 20 7b 0a 20 20 74 65 73  er1-21.1 {.  tes
e9b0: 74 76 66 73 20 74 76 20 2d 6e 6f 73 68 6d 20 31  tvfs tv -noshm 1
e9c0: 0a 20 20 73 71 6c 69 74 65 33 20 64 62 32 20 74  .  sqlite3 db2 t
e9d0: 65 73 74 2e 64 62 20 2d 76 66 73 20 74 76 0a 20  est.db -vfs tv. 
e9e0: 20 63 61 74 63 68 73 71 6c 20 7b 20 53 45 4c 45   catchsql { SELE
e9f0: 43 54 20 2a 20 46 52 4f 4d 20 6b 6f 20 7d 20 64  CT * FROM ko } d
ea00: 62 32 0a 7d 20 7b 31 20 7b 75 6e 61 62 6c 65 20  b2.} {1 {unable 
ea10: 74 6f 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65  to open database
ea20: 20 66 69 6c 65 7d 7d 0a 64 62 32 20 63 6c 6f 73   file}}.db2 clos
ea30: 65 0a 74 76 20 64 65 6c 65 74 65 0a 64 6f 5f 74  e.tv delete.do_t
ea40: 65 73 74 20 70 61 67 65 72 31 2d 32 31 2e 32 20  est pager1-21.2 
ea50: 7b 0a 20 20 74 65 73 74 76 66 73 20 74 76 20 2d  {.  testvfs tv -
ea60: 69 76 65 72 73 69 6f 6e 20 31 0a 20 20 73 71 6c  iversion 1.  sql
ea70: 69 74 65 33 20 64 62 32 20 74 65 73 74 2e 64 62  ite3 db2 test.db
ea80: 20 2d 76 66 73 20 74 76 0a 20 20 63 61 74 63 68   -vfs tv.  catch
ea90: 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46  sql { SELECT * F
eaa0: 52 4f 4d 20 6b 6f 20 7d 20 64 62 32 0a 7d 20 7b  ROM ko } db2.} {
eab0: 31 20 7b 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65  1 {unable to ope
eac0: 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 7d  n database file}
ead0: 7d 0a 64 62 32 20 63 6c 6f 73 65 0a 74 76 20 64  }.db2 close.tv d
eae0: 65 6c 65 74 65 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  elete..#--------
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 2d  ----------------
eb30: 2d 0a 23 20 54 65 73 74 20 74 68 61 74 20 61 20  -.# Test that a 
eb40: 22 50 52 41 47 4d 41 20 77 61 6c 5f 63 68 65 63  "PRAGMA wal_chec
eb50: 6b 70 6f 69 6e 74 22 3a 0a 23 0a 23 20 20 20 70  kpoint":.#.#   p
eb60: 61 67 65 72 31 2d 32 32 2e 31 2e 2a 3a 20 69 73  ager1-22.1.*: is
eb70: 20 61 20 6e 6f 2d 6f 70 20 6f 6e 20 61 20 6e 6f   a no-op on a no
eb80: 6e 2d 57 41 4c 20 64 62 2c 20 61 6e 64 0a 23 20  n-WAL db, and.# 
eb90: 20 20 70 61 67 65 72 31 2d 32 32 2e 32 2e 2a 3a    pager1-22.2.*:
eba0: 20 64 6f 65 73 20 6e 6f 74 20 63 61 75 73 65 20   does not cause 
ebb0: 78 53 79 6e 63 20 63 61 6c 6c 73 20 77 69 74 68  xSync calls with
ebc0: 20 61 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 6f   a synchronous=o
ebd0: 66 66 20 64 62 2e 0a 23 0a 64 6f 5f 74 65 73 74  ff db..#.do_test
ebe0: 20 70 61 67 65 72 31 2d 32 32 2e 31 2e 31 20 7b   pager1-22.1.1 {
ebf0: 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65  .  faultsim_dele
ec00: 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20  te_and_reopen.  
ec10: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52  execsql {.    CR
ec20: 45 41 54 45 20 54 41 42 4c 45 20 6b 6f 28 63 20  EATE TABLE ko(c 
ec30: 44 45 46 41 55 4c 54 20 27 61 62 63 27 2c 20 62  DEFAULT 'abc', b
ec40: 20 44 45 46 41 55 4c 54 20 27 64 65 66 27 29 3b   DEFAULT 'def');
ec50: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
ec60: 20 6b 6f 20 44 45 46 41 55 4c 54 20 56 41 4c 55   ko DEFAULT VALU
ec70: 45 53 3b 0a 20 20 7d 0a 20 20 65 78 65 63 73 71  ES;.  }.  execsq
ec80: 6c 20 7b 20 50 52 41 47 4d 41 20 77 61 6c 5f 63  l { PRAGMA wal_c
ec90: 68 65 63 6b 70 6f 69 6e 74 20 7d 0a 7d 20 7b 7d  heckpoint }.} {}
eca0: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
ecb0: 32 32 2e 32 2e 31 20 7b 0a 20 20 74 65 73 74 76  22.2.1 {.  testv
ecc0: 66 73 20 74 76 20 2d 64 65 66 61 75 6c 74 20 31  fs tv -default 1
ecd0: 0a 20 20 74 76 20 66 69 6c 74 65 72 20 78 53 79  .  tv filter xSy
ece0: 6e 63 0a 20 20 74 76 20 73 63 72 69 70 74 20 78  nc.  tv script x
ecf0: 53 79 6e 63 43 62 0a 20 20 70 72 6f 63 20 78 53  SyncCb.  proc xS
ed00: 79 6e 63 43 62 20 7b 61 72 67 73 7d 20 7b 69 6e  yncCb {args} {in
ed10: 63 72 20 3a 3a 73 79 6e 63 63 6f 75 6e 74 7d 0a  cr ::synccount}.
ed20: 20 20 73 65 74 20 3a 3a 73 79 6e 63 63 6f 75 6e    set ::synccoun
ed30: 74 20 30 0a 20 20 73 71 6c 69 74 65 33 20 64 62  t 0.  sqlite3 db
ed40: 20 74 65 73 74 2e 64 62 0a 20 20 65 78 65 63 73   test.db.  execs
ed50: 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20  ql {.    PRAGMA 
ed60: 73 79 6e 63 68 72 6f 6e 6f 75 73 20 3d 20 6f 66  synchronous = of
ed70: 66 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f  f;.    PRAGMA jo
ed80: 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c  urnal_mode = WAL
ed90: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
eda0: 4f 20 6b 6f 20 44 45 46 41 55 4c 54 20 56 41 4c  O ko DEFAULT VAL
edb0: 55 45 53 3b 0a 20 20 7d 0a 20 20 65 78 65 63 73  UES;.  }.  execs
edc0: 71 6c 20 7b 20 50 52 41 47 4d 41 20 77 61 6c 5f  ql { PRAGMA wal_
edd0: 63 68 65 63 6b 70 6f 69 6e 74 20 7d 0a 20 20 73  checkpoint }.  s
ede0: 65 74 20 73 79 6e 63 63 6f 75 6e 74 0a 7d 20 7b  et synccount.} {
edf0: 30 7d 0a 64 62 20 63 6c 6f 73 65 0a 74 76 20 64  0}.db close.tv d
ee00: 65 6c 65 74 65 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  elete..#--------
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 2d  ----------------
ee50: 2d 0a 23 20 54 65 73 74 73 20 66 6f 72 20 63 68  -.# Tests for ch
ee60: 61 6e 67 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 6d  anging journal m
ee70: 6f 64 65 2e 0a 23 0a 23 20 20 20 70 61 67 65 72  ode..#.#   pager
ee80: 31 2d 32 33 2e 31 2e 2a 3a 20 54 65 73 74 20 74  1-23.1.*: Test t
ee90: 68 61 74 20 77 68 65 6e 20 63 68 61 6e 67 69 6e  hat when changin
eea0: 67 20 66 72 6f 6d 20 50 45 52 53 49 53 54 20 74  g from PERSIST t
eeb0: 6f 20 44 45 4c 45 54 45 20 6d 6f 64 65 2c 0a 23  o DELETE mode,.#
eec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eed0: 20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69    the journal fi
eee0: 6c 65 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 23  le is deleted..#
eef0: 0a 23 20 20 20 70 61 67 65 72 31 2d 32 33 2e 32  .#   pager1-23.2
ef00: 2e 2a 3a 20 53 61 6d 65 20 74 65 73 74 20 61 73  .*: Same test as
ef10: 20 61 62 6f 76 65 2c 20 62 75 74 20 77 68 69 6c   above, but whil
ef20: 65 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  e a shared lock 
ef30: 69 73 20 68 65 6c 64 0a 23 20 20 20 20 20 20 20  is held.#       
ef40: 20 20 20 20 20 20 20 20 20 20 20 6f 6e 20 74 68             on th
ef50: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
ef60: 0a 23 0a 23 20 20 20 70 61 67 65 72 31 2d 32 33  .#.#   pager1-23
ef70: 2e 33 2e 2a 3a 20 53 61 6d 65 20 74 65 73 74 20  .3.*: Same test 
ef80: 61 73 20 61 62 6f 76 65 2c 20 62 75 74 20 77 68  as above, but wh
ef90: 69 6c 65 20 61 20 72 65 73 65 72 76 65 64 20 6c  ile a reserved l
efa0: 6f 63 6b 20 69 73 20 68 65 6c 64 0a 23 20 20 20  ock is held.#   
efb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
efc0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
efd0: 69 6c 65 2e 0a 23 0a 23 20 20 20 70 61 67 65 72  ile..#.#   pager
efe0: 31 2d 32 33 2e 34 2e 2a 3a 20 41 6e 64 2c 20 66  1-23.4.*: And, f
eff0: 6f 72 20 66 75 6e 2c 20 77 68 69 6c 65 20 68 6f  or fun, while ho
f000: 6c 64 69 6e 67 20 61 6e 20 65 78 63 6c 75 73 69  lding an exclusi
f010: 76 65 20 6c 6f 63 6b 2e 0a 23 0a 23 20 20 20 70  ve lock..#.#   p
f020: 61 67 65 72 31 2d 32 33 2e 35 2e 2a 3a 20 54 72  ager1-23.5.*: Tr
f030: 79 20 74 6f 20 73 65 74 20 76 61 72 69 6f 75 73  y to set various
f040: 20 64 69 66 66 65 72 65 6e 74 20 6a 6f 75 72 6e   different journ
f050: 61 6c 20 6d 6f 64 65 73 20 77 69 74 68 20 61 6e  al modes with an
f060: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
f070: 20 20 20 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61      in-memory da
f080: 74 61 62 61 73 65 20 28 6f 6e 6c 79 20 4d 45 4d  tabase (only MEM
f090: 4f 52 59 20 61 6e 64 20 4f 46 46 20 73 68 6f 75  ORY and OFF shou
f0a0: 6c 64 20 77 6f 72 6b 29 2e 0a 23 0a 23 20 20 20  ld work)..#.#   
f0b0: 70 61 67 65 72 31 2d 32 33 2e 36 2e 2a 3a 20 54  pager1-23.6.*: T
f0c0: 72 79 20 74 6f 20 73 65 74 20 6c 6f 63 6b 69 6e  ry to set lockin
f0d0: 67 5f 6d 6f 64 65 3d 6e 6f 72 6d 61 6c 20 6f 6e  g_mode=normal on
f0e0: 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
f0f0: 74 61 62 61 73 65 0a 23 20 20 20 20 20 20 20 20  tabase.#        
f100: 20 20 20 20 20 20 20 20 20 20 28 64 6f 65 73 6e            (doesn
f110: 27 74 20 77 6f 72 6b 20 2d 20 69 6e 2d 6d 65 6d  't work - in-mem
f120: 6f 72 79 20 64 61 74 61 62 61 73 65 73 20 61 6c  ory databases al
f130: 77 61 79 73 20 75 73 65 0a 23 20 20 20 20 20 20  ways use.#      
f140: 20 20 20 20 20 20 20 20 20 20 20 20 6c 6f 63 6b              lock
f150: 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69  ing_mode=exclusi
f160: 76 65 29 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 70  ve)..#.do_test p
f170: 61 67 65 72 31 2d 32 33 2e 31 2e 31 20 7b 0a 20  ager1-23.1.1 {. 
f180: 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65   faultsim_delete
f190: 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78  _and_reopen.  ex
f1a0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47  ecsql {.    PRAG
f1b0: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  MA journal_mode 
f1c0: 3d 20 50 45 52 53 49 53 54 3b 0a 20 20 20 20 43  = PERSIST;.    C
f1d0: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61  REATE TABLE t1(a
f1e0: 2c 20 62 29 3b 0a 20 20 7d 0a 20 20 66 69 6c 65  , b);.  }.  file
f1f0: 20 65 78 69 73 74 73 20 74 65 73 74 2e 64 62 2d   exists test.db-
f200: 6a 6f 75 72 6e 61 6c 0a 7d 20 7b 31 7d 0a 64 6f  journal.} {1}.do
f210: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 33 2e  _test pager1-23.
f220: 31 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  1.2 {.  execsql 
f230: 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c  { PRAGMA journal
f240: 5f 6d 6f 64 65 20 3d 20 44 45 4c 45 54 45 20 7d  _mode = DELETE }
f250: 0a 20 20 66 69 6c 65 20 65 78 69 73 74 73 20 74  .  file exists t
f260: 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 7d  est.db-journal.}
f270: 20 7b 30 7d 0a 0a 64 6f 5f 74 65 73 74 20 70 61   {0}..do_test pa
f280: 67 65 72 31 2d 32 33 2e 32 2e 31 20 7b 0a 20 20  ger1-23.2.1 {.  
f290: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52  execsql {.    PR
f2a0: 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
f2b0: 65 20 3d 20 50 45 52 53 49 53 54 3b 0a 20 20 20  e = PERSIST;.   
f2c0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
f2d0: 56 41 4c 55 45 53 28 27 43 61 6e 62 65 72 72 61  VALUES('Canberra
f2e0: 27 2c 20 27 41 43 54 27 29 3b 0a 20 20 7d 0a 20  ', 'ACT');.  }. 
f2f0: 20 64 62 20 65 76 61 6c 20 7b 20 53 45 4c 45 43   db eval { SELEC
f300: 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7b 0a  T * FROM t1 } {.
f310: 20 20 20 20 64 62 20 65 76 61 6c 20 7b 20 50 52      db eval { PR
f320: 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
f330: 65 20 3d 20 44 45 4c 45 54 45 20 7d 0a 20 20 7d  e = DELETE }.  }
f340: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41  .  execsql { PRA
f350: 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
f360: 20 7d 0a 7d 20 7b 64 65 6c 65 74 65 7d 0a 64 6f   }.} {delete}.do
f370: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 33 2e  _test pager1-23.
f380: 32 2e 32 20 7b 0a 20 20 66 69 6c 65 20 65 78 69  2.2 {.  file exi
f390: 73 74 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72  sts test.db-jour
f3a0: 6e 61 6c 0a 7d 20 7b 30 7d 0a 0a 64 6f 5f 74 65  nal.} {0}..do_te
f3b0: 73 74 20 70 61 67 65 72 31 2d 32 33 2e 33 2e 31  st pager1-23.3.1
f3c0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
f3d0: 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61     PRAGMA journa
f3e0: 6c 5f 6d 6f 64 65 20 3d 20 50 45 52 53 49 53 54  l_mode = PERSIST
f3f0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
f400: 4f 20 74 31 20 56 41 4c 55 45 53 28 27 44 61 72  O t1 VALUES('Dar
f410: 77 69 6e 27 2c 20 27 4e 54 27 29 3b 0a 20 20 20  win', 'NT');.   
f420: 20 42 45 47 49 4e 20 49 4d 4d 45 44 49 41 54 45   BEGIN IMMEDIATE
f430: 3b 0a 20 20 7d 0a 20 20 64 62 20 65 76 61 6c 20  ;.  }.  db eval 
f440: 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c  { PRAGMA journal
f450: 5f 6d 6f 64 65 20 3d 20 44 45 4c 45 54 45 20 7d  _mode = DELETE }
f460: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41  .  execsql { PRA
f470: 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
f480: 20 7d 0a 7d 20 7b 64 65 6c 65 74 65 7d 0a 64 6f   }.} {delete}.do
f490: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 33 2e  _test pager1-23.
f4a0: 33 2e 32 20 7b 0a 20 20 66 69 6c 65 20 65 78 69  3.2 {.  file exi
f4b0: 73 74 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72  sts test.db-jour
f4c0: 6e 61 6c 0a 7d 20 7b 30 7d 0a 64 6f 5f 74 65 73  nal.} {0}.do_tes
f4d0: 74 20 70 61 67 65 72 31 2d 32 33 2e 33 2e 33 20  t pager1-23.3.3 
f4e0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 43 4f 4d 4d  {.  execsql COMM
f4f0: 49 54 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74  IT.} {}..do_test
f500: 20 70 61 67 65 72 31 2d 32 33 2e 34 2e 31 20 7b   pager1-23.4.1 {
f510: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
f520: 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f   PRAGMA journal_
f530: 6d 6f 64 65 20 3d 20 50 45 52 53 49 53 54 3b 0a  mode = PERSIST;.
f540: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
f550: 74 31 20 56 41 4c 55 45 53 28 27 41 64 65 6c 61  t1 VALUES('Adela
f560: 69 64 65 27 2c 20 27 53 41 27 29 3b 0a 20 20 20  ide', 'SA');.   
f570: 20 42 45 47 49 4e 20 45 58 43 4c 55 53 49 56 45   BEGIN EXCLUSIVE
f580: 3b 0a 20 20 7d 0a 20 20 64 62 20 65 76 61 6c 20  ;.  }.  db eval 
f590: 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c  { PRAGMA journal
f5a0: 5f 6d 6f 64 65 20 3d 20 44 45 4c 45 54 45 20 7d  _mode = DELETE }
f5b0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41  .  execsql { PRA
f5c0: 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
f5d0: 20 7d 0a 7d 20 7b 64 65 6c 65 74 65 7d 0a 64 6f   }.} {delete}.do
f5e0: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 33 2e  _test pager1-23.
f5f0: 34 2e 32 20 7b 0a 20 20 66 69 6c 65 20 65 78 69  4.2 {.  file exi
f600: 73 74 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72  sts test.db-jour
f610: 6e 61 6c 0a 7d 20 7b 30 7d 0a 64 6f 5f 74 65 73  nal.} {0}.do_tes
f620: 74 20 70 61 67 65 72 31 2d 32 33 2e 34 2e 33 20  t pager1-23.4.3 
f630: 7b 0a 20 20 65 78 65 63 73 71 6c 20 43 4f 4d 4d  {.  execsql COMM
f640: 49 54 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74  IT.} {}..do_test
f650: 20 70 61 67 65 72 31 2d 32 33 2e 35 2e 31 20 7b   pager1-23.5.1 {
f660: 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65  .  faultsim_dele
f670: 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20  te_and_reopen.  
f680: 73 71 6c 69 74 65 33 20 64 62 20 3a 6d 65 6d 6f  sqlite3 db :memo
f690: 72 79 3a 0a 7d 20 7b 7d 0a 66 6f 72 65 61 63 68  ry:.} {}.foreach
f6a0: 20 7b 74 6e 20 6d 6f 64 65 20 70 6f 73 73 69 62   {tn mode possib
f6b0: 6c 65 7d 20 7b 0a 20 20 32 20 20 6f 66 66 20 20  le} {.  2  off  
f6c0: 20 20 20 20 31 0a 20 20 33 20 20 6d 65 6d 6f 72      1.  3  memor
f6d0: 79 20 20 20 31 0a 20 20 34 20 20 70 65 72 73 69  y   1.  4  persi
f6e0: 73 74 20 20 30 0a 20 20 35 20 20 64 65 6c 65 74  st  0.  5  delet
f6f0: 65 20 20 20 30 0a 20 20 36 20 20 77 61 6c 20 20  e   0.  6  wal  
f700: 20 20 20 20 30 0a 20 20 37 20 20 74 72 75 6e 63      0.  7  trunc
f710: 61 74 65 20 30 0a 7d 20 7b 0a 20 20 64 6f 5f 74  ate 0.} {.  do_t
f720: 65 73 74 20 70 61 67 65 72 31 2d 32 33 2e 35 2e  est pager1-23.5.
f730: 24 74 6e 2e 31 20 7b 0a 20 20 20 20 65 78 65 63  $tn.1 {.    exec
f740: 73 71 6c 20 22 50 52 41 47 4d 41 20 6a 6f 75 72  sql "PRAGMA jour
f750: 6e 61 6c 5f 6d 6f 64 65 20 3d 20 6f 66 66 22 0a  nal_mode = off".
f760: 20 20 20 20 65 78 65 63 73 71 6c 20 22 50 52 41      execsql "PRA
f770: 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
f780: 20 3d 20 24 6d 6f 64 65 22 0a 20 20 7d 20 5b 69   = $mode".  } [i
f790: 66 20 24 70 6f 73 73 69 62 6c 65 20 7b 6c 69 73  f $possible {lis
f7a0: 74 20 24 6d 6f 64 65 7d 20 7b 6c 69 73 74 20 6f  t $mode} {list o
f7b0: 66 66 7d 5d 0a 20 20 64 6f 5f 74 65 73 74 20 70  ff}].  do_test p
f7c0: 61 67 65 72 31 2d 32 33 2e 35 2e 24 74 6e 2e 32  ager1-23.5.$tn.2
f7d0: 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 22   {.    execsql "
f7e0: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
f7f0: 6f 64 65 20 3d 20 6d 65 6d 6f 72 79 22 0a 20 20  ode = memory".  
f800: 20 20 65 78 65 63 73 71 6c 20 22 50 52 41 47 4d    execsql "PRAGM
f810: 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d  A journal_mode =
f820: 20 24 6d 6f 64 65 22 0a 20 20 7d 20 5b 69 66 20   $mode".  } [if 
f830: 24 70 6f 73 73 69 62 6c 65 20 7b 6c 69 73 74 20  $possible {list 
f840: 24 6d 6f 64 65 7d 20 7b 6c 69 73 74 20 6d 65 6d  $mode} {list mem
f850: 6f 72 79 7d 5d 0a 7d 0a 64 6f 5f 74 65 73 74 20  ory}].}.do_test 
f860: 70 61 67 65 72 31 2d 32 33 2e 36 2e 31 20 7b 0a  pager1-23.6.1 {.
f870: 20 20 65 78 65 63 73 71 6c 20 7b 50 52 41 47 4d    execsql {PRAGM
f880: 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 20 3d  A locking_mode =
f890: 20 6e 6f 72 6d 61 6c 7d 0a 7d 20 7b 65 78 63 6c   normal}.} {excl
f8a0: 75 73 69 76 65 7d 0a 64 6f 5f 74 65 73 74 20 70  usive}.do_test p
f8b0: 61 67 65 72 31 2d 32 33 2e 36 2e 32 20 7b 0a 20  ager1-23.6.2 {. 
f8c0: 20 65 78 65 63 73 71 6c 20 7b 50 52 41 47 4d 41   execsql {PRAGMA
f8d0: 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 20 3d 20   locking_mode = 
f8e0: 65 78 63 6c 75 73 69 76 65 7d 0a 7d 20 7b 65 78  exclusive}.} {ex
f8f0: 63 6c 75 73 69 76 65 7d 0a 64 6f 5f 74 65 73 74  clusive}.do_test
f900: 20 70 61 67 65 72 31 2d 32 33 2e 36 2e 33 20 7b   pager1-23.6.3 {
f910: 0a 20 20 65 78 65 63 73 71 6c 20 7b 50 52 41 47  .  execsql {PRAG
f920: 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 7d  MA locking_mode}
f930: 0a 7d 20 7b 65 78 63 6c 75 73 69 76 65 7d 0a 64  .} {exclusive}.d
f940: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 33  o_test pager1-23
f950: 2e 36 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c  .6.4 {.  execsql
f960: 20 7b 50 52 41 47 4d 41 20 6d 61 69 6e 2e 6c 6f   {PRAGMA main.lo
f970: 63 6b 69 6e 67 5f 6d 6f 64 65 7d 0a 7d 20 7b 65  cking_mode}.} {e
f980: 78 63 6c 75 73 69 76 65 7d 0a 0a 23 2d 2d 2d 2d  xclusive}..#----
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 2d 2d 0a 23 0a 64 6f 5f 74 65 73 74 20  -----.#.do_test 
f9e0: 70 61 67 65 72 31 2d 32 34 2e 31 2e 31 20 7b 0a  pager1-24.1.1 {.
f9f0: 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74    faultsim_delet
fa00: 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 64  e_and_reopen.  d
fa10: 62 20 66 75 6e 63 20 61 5f 73 74 72 69 6e 67 20  b func a_string 
fa20: 61 5f 73 74 72 69 6e 67 0a 20 20 65 78 65 63 73  a_string.  execs
fa30: 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20  ql {.    PRAGMA 
fa40: 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b  cache_size = 10;
fa50: 0a 20 20 20 20 50 52 41 47 4d 41 20 61 75 74 6f  .    PRAGMA auto
fa60: 5f 76 61 63 75 75 6d 20 3d 20 46 55 4c 4c 3b 0a  _vacuum = FULL;.
fa70: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
fa80: 20 78 31 28 78 2c 20 79 2c 20 7a 2c 20 50 52 49   x1(x, y, z, PRI
fa90: 4d 41 52 59 20 4b 45 59 28 79 2c 20 7a 29 29 3b  MARY KEY(y, z));
faa0: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
fab0: 45 20 78 32 28 78 2c 20 79 2c 20 7a 2c 20 50 52  E x2(x, y, z, PR
fac0: 49 4d 41 52 59 20 4b 45 59 28 79 2c 20 7a 29 29  IMARY KEY(y, z))
fad0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
fae0: 4f 20 78 32 20 56 41 4c 55 45 53 28 61 5f 73 74  O x2 VALUES(a_st
faf0: 72 69 6e 67 28 34 30 30 29 2c 20 61 5f 73 74 72  ring(400), a_str
fb00: 69 6e 67 28 35 30 30 29 2c 20 61 5f 73 74 72 69  ing(500), a_stri
fb10: 6e 67 28 36 30 30 29 29 3b 0a 20 20 20 20 49 4e  ng(600));.    IN
fb20: 53 45 52 54 20 49 4e 54 4f 20 78 32 20 53 45 4c  SERT INTO x2 SEL
fb30: 45 43 54 20 61 5f 73 74 72 69 6e 67 28 36 30 30  ECT a_string(600
fb40: 29 2c 20 61 5f 73 74 72 69 6e 67 28 34 30 30 29  ), a_string(400)
fb50: 2c 20 61 5f 73 74 72 69 6e 67 28 35 30 30 29 20  , a_string(500) 
fb60: 46 52 4f 4d 20 78 32 3b 0a 20 20 20 20 49 4e 53  FROM x2;.    INS
fb70: 45 52 54 20 49 4e 54 4f 20 78 32 20 53 45 4c 45  ERT INTO x2 SELE
fb80: 43 54 20 61 5f 73 74 72 69 6e 67 28 35 30 30 29  CT a_string(500)
fb90: 2c 20 61 5f 73 74 72 69 6e 67 28 36 30 30 29 2c  , a_string(600),
fba0: 20 61 5f 73 74 72 69 6e 67 28 34 30 30 29 20 46   a_string(400) F
fbb0: 52 4f 4d 20 78 32 3b 0a 20 20 20 20 49 4e 53 45  ROM x2;.    INSE
fbc0: 52 54 20 49 4e 54 4f 20 78 32 20 53 45 4c 45 43  RT INTO x2 SELEC
fbd0: 54 20 61 5f 73 74 72 69 6e 67 28 34 30 30 29 2c  T a_string(400),
fbe0: 20 61 5f 73 74 72 69 6e 67 28 35 30 30 29 2c 20   a_string(500), 
fbf0: 61 5f 73 74 72 69 6e 67 28 36 30 30 29 20 46 52  a_string(600) FR
fc00: 4f 4d 20 78 32 3b 0a 20 20 20 20 49 4e 53 45 52  OM x2;.    INSER
fc10: 54 20 49 4e 54 4f 20 78 32 20 53 45 4c 45 43 54  T INTO x2 SELECT
fc20: 20 61 5f 73 74 72 69 6e 67 28 36 30 30 29 2c 20   a_string(600), 
fc30: 61 5f 73 74 72 69 6e 67 28 34 30 30 29 2c 20 61  a_string(400), a
fc40: 5f 73 74 72 69 6e 67 28 35 30 30 29 20 46 52 4f  _string(500) FRO
fc50: 4d 20 78 32 3b 0a 20 20 20 20 49 4e 53 45 52 54  M x2;.    INSERT
fc60: 20 49 4e 54 4f 20 78 32 20 53 45 4c 45 43 54 20   INTO x2 SELECT 
fc70: 61 5f 73 74 72 69 6e 67 28 35 30 30 29 2c 20 61  a_string(500), a
fc80: 5f 73 74 72 69 6e 67 28 36 30 30 29 2c 20 61 5f  _string(600), a_
fc90: 73 74 72 69 6e 67 28 34 30 30 29 20 46 52 4f 4d  string(400) FROM
fca0: 20 78 32 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   x2;.    INSERT 
fcb0: 49 4e 54 4f 20 78 32 20 53 45 4c 45 43 54 20 61  INTO x2 SELECT a
fcc0: 5f 73 74 72 69 6e 67 28 34 30 30 29 2c 20 61 5f  _string(400), a_
fcd0: 73 74 72 69 6e 67 28 35 30 30 29 2c 20 61 5f 73  string(500), a_s
fce0: 74 72 69 6e 67 28 36 30 30 29 20 46 52 4f 4d 20  tring(600) FROM 
fcf0: 78 32 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  x2;.    INSERT I
fd00: 4e 54 4f 20 78 31 20 53 45 4c 45 43 54 20 2a 20  NTO x1 SELECT * 
fd10: 46 52 4f 4d 20 78 32 3b 0a 20 20 7d 0a 7d 20 7b  FROM x2;.  }.} {
fd20: 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  }.do_test pager1
fd30: 2d 32 34 2e 31 2e 32 20 7b 0a 20 20 65 78 65 63  -24.1.2 {.  exec
fd40: 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b  sql {.    BEGIN;
fd50: 0a 20 20 20 20 20 20 44 45 4c 45 54 45 20 46 52  .      DELETE FR
fd60: 4f 4d 20 78 31 20 57 48 45 52 45 20 72 6f 77 69  OM x1 WHERE rowi
fd70: 64 3c 33 32 3b 0a 20 20 7d 0a 20 20 72 65 63 75  d<32;.  }.  recu
fd80: 72 73 69 76 65 5f 73 65 6c 65 63 74 20 36 34 20  rsive_select 64 
fd90: 78 32 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20  x2.} {}.do_test 
fda0: 70 61 67 65 72 31 2d 32 34 2e 31 2e 33 20 7b 0a  pager1-24.1.3 {.
fdb0: 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20    execsql { .   
fdc0: 20 20 20 55 50 44 41 54 45 20 78 31 20 53 45 54     UPDATE x1 SET
fdd0: 20 7a 20 3d 20 61 5f 73 74 72 69 6e 67 28 33 30   z = a_string(30
fde0: 30 29 20 57 48 45 52 45 20 72 6f 77 69 64 3e 34  0) WHERE rowid>4
fdf0: 30 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20  0;.    COMMIT;. 
fe00: 20 20 20 50 52 41 47 4d 41 20 69 6e 74 65 67 72     PRAGMA integr
fe10: 69 74 79 5f 63 68 65 63 6b 3b 0a 20 20 20 20 53  ity_check;.    S
fe20: 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
fe30: 52 4f 4d 20 78 31 3b 0a 20 20 7d 0a 7d 20 7b 6f  ROM x1;.  }.} {o
fe40: 6b 20 33 33 7d 0a 0a 64 6f 5f 74 65 73 74 20 70  k 33}..do_test p
fe50: 61 67 65 72 31 2d 32 34 2e 31 2e 34 20 7b 0a 20  ager1-24.1.4 {. 
fe60: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 44   execsql {.    D
fe70: 45 4c 45 54 45 20 46 52 4f 4d 20 78 31 3b 0a 20  ELETE FROM x1;. 
fe80: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78     INSERT INTO x
fe90: 31 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  1 SELECT * FROM 
fea0: 78 32 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20  x2;.    BEGIN;. 
feb0: 20 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d       DELETE FROM
fec0: 20 78 31 20 57 48 45 52 45 20 72 6f 77 69 64 3c   x1 WHERE rowid<
fed0: 33 32 3b 0a 20 20 20 20 20 20 55 50 44 41 54 45  32;.      UPDATE
fee0: 20 78 31 20 53 45 54 20 7a 20 3d 20 61 5f 73 74   x1 SET z = a_st
fef0: 72 69 6e 67 28 32 39 39 29 20 57 48 45 52 45 20  ring(299) WHERE 
ff00: 72 6f 77 69 64 3e 34 30 3b 0a 20 20 7d 0a 20 20  rowid>40;.  }.  
ff10: 72 65 63 75 72 73 69 76 65 5f 73 65 6c 65 63 74  recursive_select
ff20: 20 36 34 20 78 32 20 7b 64 62 20 65 76 61 6c 20   64 x2 {db eval 
ff30: 43 4f 4d 4d 49 54 7d 0a 20 20 65 78 65 63 73 71  COMMIT}.  execsq
ff40: 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 69  l {.    PRAGMA i
ff50: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 3b 0a  ntegrity_check;.
ff60: 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74      SELECT count
ff70: 28 2a 29 20 46 52 4f 4d 20 78 31 3b 0a 20 20 7d  (*) FROM x1;.  }
ff80: 0a 7d 20 7b 6f 6b 20 33 33 7d 0a 0a 64 6f 5f 74  .} {ok 33}..do_t
ff90: 65 73 74 20 70 61 67 65 72 31 2d 32 34 2e 31 2e  est pager1-24.1.
ffa0: 35 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  5 {.  execsql {.
ffb0: 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20      DELETE FROM 
ffc0: 78 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  x1;.    INSERT I
ffd0: 4e 54 4f 20 78 31 20 53 45 4c 45 43 54 20 2a 20  NTO x1 SELECT * 
ffe0: 46 52 4f 4d 20 78 32 3b 0a 20 20 7d 0a 20 20 72  FROM x2;.  }.  r
fff0: 65 63 75 72 73 69 76 65 5f 73 65 6c 65 63 74 20  ecursive_select 
10000 36 34 20 78 32 20 7b 20 64 62 20 65 76 61 6c 20  64 x2 { db eval 
10010 7b 43 52 45 41 54 45 20 54 41 42 4c 45 20 78 33  {CREATE TABLE x3
10020 28 78 2c 20 79 2c 20 7a 29 7d 20 7d 0a 20 20 65  (x, y, z)} }.  e
10030 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20  xecsql { SELECT 
10040 2a 20 46 52 4f 4d 20 78 33 20 7d 0a 7d 20 7b 7d  * FROM x3 }.} {}
10050 0a 0a 23 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 2d 2d 0a 23 0a 64  ------------.#.d
100a0 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 35  o_test pager1-25
100b0 2d 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f  -1 {.  faultsim_
100c0 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65  delete_and_reope
100d0 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  n.  execsql {.  
100e0 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 53    BEGIN;.      S
100f0 41 56 45 50 4f 49 4e 54 20 61 62 63 3b 0a 20 20  AVEPOINT abc;.  
10100 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42        CREATE TAB
10110 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20  LE t1(a, b);.   
10120 20 20 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 61     ROLLBACK TO a
10130 62 63 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a  bc;.    COMMIT;.
10140 20 20 7d 0a 20 20 64 62 20 63 6c 6f 73 65 0a 7d    }.  db close.}
10150 20 7b 7d 0a 62 72 65 61 6b 70 6f 69 6e 74 0a 64   {}.breakpoint.d
10160 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 32 35  o_test pager1-25
10170 2d 32 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f  -2 {.  faultsim_
10180 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65  delete_and_reope
10190 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  n.  execsql {.  
101a0 20 20 53 41 56 45 50 4f 49 4e 54 20 61 62 63 3b    SAVEPOINT abc;
101b0 0a 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41  .      CREATE TA
101c0 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20  BLE t1(a, b);.  
101d0 20 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 61 62    ROLLBACK TO ab
101e0 63 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20  c;.    COMMIT;. 
101f0 20 7d 0a 20 20 64 62 20 63 6c 6f 73 65 0a 7d 20   }.  db close.} 
10200 7b 7d 0a 0a 23 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 2d 2d 0a 23  --------------.#
10250 20 53 65 63 74 6f 72 2d 73 69 7a 65 20 74 65 73   Sector-size tes
10260 74 73 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 70 61  ts..#.do_test pa
10270 67 65 72 31 2d 32 36 2e 31 20 7b 0a 20 20 74 65  ger1-26.1 {.  te
10280 73 74 76 66 73 20 74 76 20 2d 64 65 66 61 75 6c  stvfs tv -defaul
10290 74 20 31 0a 20 20 74 76 20 73 65 63 74 6f 72 73  t 1.  tv sectors
102a0 69 7a 65 20 34 30 39 36 0a 20 20 66 61 75 6c 74  ize 4096.  fault
102b0 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72  sim_delete_and_r
102c0 65 6f 70 65 6e 0a 20 20 64 62 20 66 75 6e 63 20  eopen.  db func 
102d0 61 5f 73 74 72 69 6e 67 20 61 5f 73 74 72 69 6e  a_string a_strin
102e0 67 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  g.  execsql {.  
102f0 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69    PRAGMA page_si
10300 7a 65 20 3d 20 35 31 32 3b 0a 20 20 20 20 43 52  ze = 512;.    CR
10310 45 41 54 45 20 54 41 42 4c 45 20 74 62 6c 28 61  EATE TABLE tbl(a
10320 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 20   PRIMARY KEY, b 
10330 55 4e 49 51 55 45 29 3b 0a 20 20 20 20 42 45 47  UNIQUE);.    BEG
10340 49 4e 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  IN;.      INSERT
10350 20 49 4e 54 4f 20 74 62 6c 20 56 41 4c 55 45 53   INTO tbl VALUES
10360 28 61 5f 73 74 72 69 6e 67 28 32 35 29 2c 20 61  (a_string(25), a
10370 5f 73 74 72 69 6e 67 28 36 30 30 29 29 3b 0a 20  _string(600));. 
10380 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
10390 20 74 62 6c 20 53 45 4c 45 43 54 20 61 5f 73 74   tbl SELECT a_st
103a0 72 69 6e 67 28 32 35 29 2c 20 61 5f 73 74 72 69  ring(25), a_stri
103b0 6e 67 28 36 30 30 29 20 46 52 4f 4d 20 74 62 6c  ng(600) FROM tbl
103c0 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
103d0 4e 54 4f 20 74 62 6c 20 53 45 4c 45 43 54 20 61  NTO tbl SELECT a
103e0 5f 73 74 72 69 6e 67 28 32 35 29 2c 20 61 5f 73  _string(25), a_s
103f0 74 72 69 6e 67 28 36 30 30 29 20 46 52 4f 4d 20  tring(600) FROM 
10400 74 62 6c 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  tbl;.      INSER
10410 54 20 49 4e 54 4f 20 74 62 6c 20 53 45 4c 45 43  T INTO tbl SELEC
10420 54 20 61 5f 73 74 72 69 6e 67 28 32 35 29 2c 20  T a_string(25), 
10430 61 5f 73 74 72 69 6e 67 28 36 30 30 29 20 46 52  a_string(600) FR
10440 4f 4d 20 74 62 6c 3b 0a 20 20 20 20 20 20 49 4e  OM tbl;.      IN
10450 53 45 52 54 20 49 4e 54 4f 20 74 62 6c 20 53 45  SERT INTO tbl SE
10460 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 32 35  LECT a_string(25
10470 29 2c 20 61 5f 73 74 72 69 6e 67 28 36 30 30 29  ), a_string(600)
10480 20 46 52 4f 4d 20 74 62 6c 3b 0a 20 20 20 20 20   FROM tbl;.     
10490 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 62 6c   INSERT INTO tbl
104a0 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67   SELECT a_string
104b0 28 32 35 29 2c 20 61 5f 73 74 72 69 6e 67 28 36  (25), a_string(6
104c0 30 30 29 20 46 52 4f 4d 20 74 62 6c 3b 0a 20 20  00) FROM tbl;.  
104d0 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
104e0 74 62 6c 20 53 45 4c 45 43 54 20 61 5f 73 74 72  tbl SELECT a_str
104f0 69 6e 67 28 32 35 29 2c 20 61 5f 73 74 72 69 6e  ing(25), a_strin
10500 67 28 36 30 30 29 20 46 52 4f 4d 20 74 62 6c 3b  g(600) FROM tbl;
10510 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
10520 54 4f 20 74 62 6c 20 53 45 4c 45 43 54 20 61 5f  TO tbl SELECT a_
10530 73 74 72 69 6e 67 28 32 35 29 2c 20 61 5f 73 74  string(25), a_st
10540 72 69 6e 67 28 36 30 30 29 20 46 52 4f 4d 20 74  ring(600) FROM t
10550 62 6c 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a  bl;.    COMMIT;.
10560 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 65 78 65 63    }.} {}.do_exec
10570 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d  sql_test pager1-
10580 32 36 2e 31 20 7b 0a 20 20 55 50 44 41 54 45 20  26.1 {.  UPDATE 
10590 74 62 6c 20 53 45 54 20 62 20 3d 20 61 5f 73 74  tbl SET b = a_st
105a0 72 69 6e 67 28 35 35 30 29 3b 0a 7d 20 7b 7d 0a  ring(550);.} {}.
105b0 64 62 20 63 6c 6f 73 65 0a 74 76 20 64 65 6c 65  db close.tv dele
105c0 74 65 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  te..#-----------
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 2d 2d 0a 64  --------------.d
10610 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2e 32 37  o_test pager1.27
10620 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f  .1 {.  faultsim_
10630 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65  delete_and_reope
10640 6e 0a 20 20 73 71 6c 69 74 65 33 5f 70 61 67 65  n.  sqlite3_page
10650 72 5f 72 65 66 63 6f 75 6e 74 73 20 64 62 0a 20  r_refcounts db. 
10660 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42   execsql {.    B
10670 45 47 49 4e 3b 0a 20 20 20 20 20 20 43 52 45 41  EGIN;.      CREA
10680 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62  TE TABLE t1(a, b
10690 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
106a0 5f 70 61 67 65 72 5f 72 65 66 63 6f 75 6e 74 73  _pager_refcounts
106b0 20 64 62 0a 20 20 65 78 65 63 73 71 6c 20 43 4f   db.  execsql CO
106c0 4d 4d 49 54 0a 7d 20 7b 7d 0a 0a 66 69 6e 69 73  MMIT.} {}..finis
106d0 68 5f 74 65 73 74 0a                             h_test.