/ Hex Artifact Content
Login

Artifact c3ec08550a4b6beb1c26976e6f7eca9762427259:


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 0a 73 65 74  atabases..#..set
0490: 20 61 5f 73 74 72 69 6e 67 5f 63 6f 75 6e 74 65   a_string_counte
04a0: 72 20 31 0a 70 72 6f 63 20 61 5f 73 74 72 69 6e  r 1.proc a_strin
04b0: 67 20 7b 6e 7d 20 7b 0a 20 20 67 6c 6f 62 61 6c  g {n} {.  global
04c0: 20 61 5f 73 74 72 69 6e 67 5f 63 6f 75 6e 74 65   a_string_counte
04d0: 72 0a 20 20 69 6e 63 72 20 61 5f 73 74 72 69 6e  r.  incr a_strin
04e0: 67 5f 63 6f 75 6e 74 65 72 0a 20 20 73 74 72 69  g_counter.  stri
04f0: 6e 67 20 72 61 6e 67 65 20 5b 73 74 72 69 6e 67  ng range [string
0500: 20 72 65 70 65 61 74 20 22 24 7b 61 5f 73 74 72   repeat "${a_str
0510: 69 6e 67 5f 63 6f 75 6e 74 65 72 7d 2e 22 20 24  ing_counter}." $
0520: 6e 5d 20 31 20 24 6e 0a 7d 0a 64 62 20 66 75 6e  n] 1 $n.}.db fun
0530: 63 20 61 5f 73 74 72 69 6e 67 20 61 5f 73 74 72  c a_string a_str
0540: 69 6e 67 0a 0a 64 6f 5f 6d 75 6c 74 69 63 6c 69  ing..do_multicli
0550: 65 6e 74 5f 74 65 73 74 20 74 6e 20 7b 0a 0a 20  ent_test tn {.. 
0560: 20 23 20 43 72 65 61 74 65 20 61 6e 64 20 70 6f   # Create and po
0570: 70 75 6c 61 74 65 20 61 20 64 61 74 61 62 61 73  pulate a databas
0580: 65 20 74 61 62 6c 65 20 75 73 69 6e 67 20 63 6f  e table using co
0590: 6e 6e 65 63 74 69 6f 6e 20 5b 64 62 5d 2e 20 43  nnection [db]. C
05a0: 68 65 63 6b 20 0a 20 20 23 20 74 68 61 74 20 63  heck .  # that c
05b0: 6f 6e 6e 65 63 74 69 6f 6e 73 20 5b 64 62 32 5d  onnections [db2]
05c0: 20 61 6e 64 20 5b 64 62 33 5d 20 63 61 6e 20 73   and [db3] can s
05d0: 65 65 20 74 68 65 20 73 63 68 65 6d 61 20 61 6e  ee the schema an
05e0: 64 20 63 6f 6e 74 65 6e 74 2e 0a 20 20 23 0a 20  d content..  #. 
05f0: 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
0600: 24 74 6e 2e 31 20 7b 0a 20 20 20 20 73 71 6c 31  $tn.1 {.    sql1
0610: 20 7b 0a 20 20 20 20 20 20 43 52 45 41 54 45 20   {.      CREATE 
0620: 54 41 42 4c 45 20 74 31 28 61 20 50 52 49 4d 41  TABLE t1(a PRIMA
0630: 52 59 20 4b 45 59 2c 20 62 29 3b 0a 20 20 20 20  RY KEY, b);.    
0640: 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69    CREATE INDEX i
0650: 31 20 4f 4e 20 74 31 28 62 29 3b 0a 20 20 20 20  1 ON t1(b);.    
0660: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
0670: 20 56 41 4c 55 45 53 28 31 2c 20 27 6f 6e 65 27   VALUES(1, 'one'
0680: 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  );.      INSERT 
0690: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 32  INTO t1 VALUES(2
06a0: 2c 20 27 74 77 6f 27 29 3b 0a 20 20 20 20 7d 0a  , 'two');.    }.
06b0: 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74    } {}.  do_test
06c0: 20 70 61 67 65 72 31 2d 24 74 6e 2e 32 20 7b 20   pager1-$tn.2 { 
06d0: 73 71 6c 32 20 7b 20 53 45 4c 45 43 54 20 2a 20  sql2 { SELECT * 
06e0: 46 52 4f 4d 20 74 31 20 7d 20 7d 20 7b 31 20 6f  FROM t1 } } {1 o
06f0: 6e 65 20 32 20 74 77 6f 7d 0a 20 20 64 6f 5f 74  ne 2 two}.  do_t
0700: 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 33  est pager1-$tn.3
0710: 20 7b 20 73 71 6c 33 20 7b 20 53 45 4c 45 43 54   { sql3 { SELECT
0720: 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7d 20 7b   * FROM t1 } } {
0730: 31 20 6f 6e 65 20 32 20 74 77 6f 7d 0a 0a 20 20  1 one 2 two}..  
0740: 23 20 4f 70 65 6e 20 61 20 74 72 61 6e 73 61 63  # Open a transac
0750: 74 69 6f 6e 20 61 6e 64 20 61 64 64 20 61 20 72  tion and add a r
0760: 6f 77 20 75 73 69 6e 67 20 5b 64 62 5d 2e 20 54  ow using [db]. T
0770: 68 69 73 20 70 75 74 73 20 5b 64 62 5d 20 69 6e  his puts [db] in
0780: 0a 20 20 23 20 52 45 53 45 52 56 45 44 20 73 74  .  # RESERVED st
0790: 61 74 65 2e 20 43 68 65 63 6b 20 74 68 61 74 20  ate. Check that 
07a0: 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 5b 64 62 32  connections [db2
07b0: 5d 20 61 6e 64 20 5b 64 62 33 5d 20 63 61 6e 20  ] and [db3] can 
07c0: 73 74 69 6c 6c 0a 20 20 23 20 72 65 61 64 20 74  still.  # read t
07d0: 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74  he database cont
07e0: 65 6e 74 20 61 73 20 69 74 20 77 61 73 20 62 65  ent as it was be
07f0: 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61 63  fore the transac
0800: 74 69 6f 6e 20 77 61 73 0a 20 20 23 20 6f 70 65  tion was.  # ope
0810: 6e 65 64 2e 20 5b 64 62 5d 20 73 68 6f 75 6c 64  ned. [db] should
0820: 20 73 65 65 20 74 68 65 20 69 6e 73 65 72 74 65   see the inserte
0830: 64 20 72 6f 77 2e 0a 20 20 23 0a 20 20 64 6f 5f  d row..  #.  do_
0840: 74 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e  test pager1-$tn.
0850: 34 20 7b 0a 20 20 20 20 73 71 6c 31 20 7b 0a 20  4 {.    sql1 {. 
0860: 20 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20       BEGIN;.    
0870: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
0880: 74 31 20 56 41 4c 55 45 53 28 33 2c 20 27 74 68  t1 VALUES(3, 'th
0890: 72 65 65 27 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ree');.    }.  }
08a0: 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61   {}.  do_test pa
08b0: 67 65 72 31 2d 24 74 6e 2e 35 20 7b 20 73 71 6c  ger1-$tn.5 { sql
08c0: 32 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  2 { SELECT * FRO
08d0: 4d 20 74 31 20 7d 20 7d 20 7b 31 20 6f 6e 65 20  M t1 } } {1 one 
08e0: 32 20 74 77 6f 7d 0a 20 20 64 6f 5f 74 65 73 74  2 two}.  do_test
08f0: 20 70 61 67 65 72 31 2d 24 74 6e 2e 37 20 7b 20   pager1-$tn.7 { 
0900: 73 71 6c 31 20 7b 20 53 45 4c 45 43 54 20 2a 20  sql1 { SELECT * 
0910: 46 52 4f 4d 20 74 31 20 7d 20 7d 20 7b 31 20 6f  FROM t1 } } {1 o
0920: 6e 65 20 32 20 74 77 6f 20 33 20 74 68 72 65 65  ne 2 two 3 three
0930: 7d 0a 0a 20 20 23 20 5b 64 62 5d 20 73 74 69 6c  }..  # [db] stil
0940: 6c 20 68 61 73 20 61 6e 20 6f 70 65 6e 20 77 72  l has an open wr
0950: 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ite transaction.
0960: 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 69 73   Check that this
0970: 20 70 72 65 76 65 6e 74 73 0a 20 20 23 20 6f 74   prevents.  # ot
0980: 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  her connections 
0990: 28 73 70 65 63 69 66 69 63 61 6c 6c 79 20 5b 64  (specifically [d
09a0: 62 32 5d 29 20 66 72 6f 6d 20 77 72 69 74 69 6e  b2]) from writin
09b0: 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
09c0: 65 2e 0a 20 20 23 0a 20 20 23 20 45 76 65 6e 20  e..  #.  # Even 
09d0: 69 66 20 5b 64 62 32 5d 20 6f 70 65 6e 73 20 61  if [db2] opens a
09e0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 69 72   transaction fir
09f0: 73 74 2c 20 69 74 20 6d 61 79 20 6e 6f 74 20 77  st, it may not w
0a00: 72 69 74 65 20 74 6f 20 74 68 65 0a 20 20 23 20  rite to the.  # 
0a10: 64 61 74 61 62 61 73 65 2e 20 41 66 74 65 72 20  database. After 
0a20: 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 77  the attempt to w
0a30: 72 69 74 65 20 74 68 65 20 64 62 20 77 69 74 68  rite the db with
0a40: 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  in a transaction
0a50: 2c 20 0a 20 20 23 20 5b 64 62 32 5d 20 69 73 20  , .  # [db2] is 
0a60: 6c 65 66 74 20 77 69 74 68 20 61 6e 20 6f 70 65  left with an ope
0a70: 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 62  n transaction, b
0a80: 75 74 20 6e 6f 74 20 61 20 72 65 61 64 2d 6c 6f  ut not a read-lo
0a90: 63 6b 20 6f 6e 0a 20 20 23 20 74 68 65 20 6d 61  ck on.  # the ma
0aa0: 69 6e 20 64 61 74 61 62 61 73 65 2e 20 53 6f 20  in database. So 
0ab0: 69 74 20 64 6f 65 73 20 6e 6f 74 20 70 72 65 76  it does not prev
0ac0: 65 6e 74 20 5b 64 62 5d 20 66 72 6f 6d 20 63 6f  ent [db] from co
0ad0: 6d 6d 69 74 74 69 6e 67 2e 0a 20 20 23 0a 20 20  mmitting..  #.  
0ae0: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24  do_test pager1-$
0af0: 74 6e 2e 38 20 7b 20 0a 20 20 20 20 63 73 71 6c  tn.8 { .    csql
0b00: 32 20 7b 20 55 50 44 41 54 45 20 74 31 20 53 45  2 { UPDATE t1 SE
0b10: 54 20 61 20 3d 20 61 20 2b 20 31 30 20 7d 0a 20  T a = a + 10 }. 
0b20: 20 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20   } {1 {database 
0b30: 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 20 20 64 6f  is locked}}.  do
0b40: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e  _test pager1-$tn
0b50: 2e 39 20 7b 20 0a 20 20 20 20 63 73 71 6c 32 20  .9 { .    csql2 
0b60: 7b 20 0a 20 20 20 20 20 20 42 45 47 49 4e 3b 0a  { .      BEGIN;.
0b70: 20 20 20 20 20 20 55 50 44 41 54 45 20 74 31 20        UPDATE t1 
0b80: 53 45 54 20 61 20 3d 20 61 20 2b 20 31 30 3b 0a  SET a = a + 10;.
0b90: 20 20 20 20 7d 0a 20 20 7d 20 7b 31 20 7b 64 61      }.  } {1 {da
0ba0: 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64  tabase is locked
0bb0: 7d 7d 0a 0a 20 20 23 20 48 61 76 65 20 5b 64 62  }}..  # Have [db
0bc0: 5d 20 63 6f 6d 6d 69 74 20 69 74 73 20 74 72 61  ] commit its tra
0bd0: 6e 73 61 63 74 69 6f 6e 73 2e 20 43 68 65 63 6b  nsactions. Check
0be0: 20 74 68 65 20 6f 74 68 65 72 20 63 6f 6e 6e 65   the other conne
0bf0: 63 74 69 6f 6e 73 20 63 61 6e 0a 20 20 23 20 6e  ctions can.  # n
0c00: 6f 77 20 73 65 65 20 74 68 65 20 6e 65 77 20 64  ow see the new d
0c10: 61 74 61 62 61 73 65 20 63 6f 6e 74 65 6e 74 2e  atabase content.
0c20: 0a 20 20 23 0a 20 20 64 6f 5f 74 65 73 74 20 70  .  #.  do_test p
0c30: 61 67 65 72 31 2d 24 74 6e 2e 31 30 20 7b 20 73  ager1-$tn.10 { s
0c40: 71 6c 31 20 7b 20 43 4f 4d 4d 49 54 20 7d 20 7d  ql1 { COMMIT } }
0c50: 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61   {}.  do_test pa
0c60: 67 65 72 31 2d 24 74 6e 2e 31 31 20 7b 20 73 71  ger1-$tn.11 { sq
0c70: 6c 31 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52  l1 { SELECT * FR
0c80: 4f 4d 20 74 31 20 7d 20 7d 20 7b 31 20 6f 6e 65  OM t1 } } {1 one
0c90: 20 32 20 74 77 6f 20 33 20 74 68 72 65 65 7d 0a   2 two 3 three}.
0ca0: 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
0cb0: 2d 24 74 6e 2e 31 32 20 7b 20 73 71 6c 32 20 7b  -$tn.12 { sql2 {
0cc0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
0cd0: 31 20 7d 20 7d 20 7b 31 20 6f 6e 65 20 32 20 74  1 } } {1 one 2 t
0ce0: 77 6f 20 33 20 74 68 72 65 65 7d 0a 20 20 64 6f  wo 3 three}.  do
0cf0: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e  _test pager1-$tn
0d00: 2e 31 33 20 7b 20 73 71 6c 33 20 7b 20 53 45 4c  .13 { sql3 { SEL
0d10: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20  ECT * FROM t1 } 
0d20: 7d 20 7b 31 20 6f 6e 65 20 32 20 74 77 6f 20 33  } {1 one 2 two 3
0d30: 20 74 68 72 65 65 7d 0a 0a 20 20 23 20 43 68 65   three}..  # Che
0d40: 63 6b 20 74 68 61 74 2c 20 61 73 20 6e 6f 74 65  ck that, as note
0d50: 64 20 61 62 6f 76 65 2c 20 5b 64 62 32 5d 20 72  d above, [db2] r
0d60: 65 61 6c 6c 79 20 64 69 64 20 6b 65 65 70 20 61  eally did keep a
0d70: 6e 20 6f 70 65 6e 20 74 72 61 6e 73 61 63 74 69  n open transacti
0d80: 6f 6e 0a 20 20 23 20 61 66 74 65 72 20 74 68 65  on.  # after the
0d90: 20 61 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74   attempt to writ
0da0: 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  e the database f
0db0: 61 69 6c 65 64 2e 0a 20 20 23 0a 20 20 64 6f 5f  ailed..  #.  do_
0dc0: 74 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e  test pager1-$tn.
0dd0: 31 34 20 7b 20 0a 20 20 20 20 63 73 71 6c 32 20  14 { .    csql2 
0de0: 7b 20 42 45 47 49 4e 20 7d 20 0a 20 20 7d 20 7b  { BEGIN } .  } {
0df0: 31 20 7b 63 61 6e 6e 6f 74 20 73 74 61 72 74 20  1 {cannot start 
0e00: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69  a transaction wi
0e10: 74 68 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69  thin a transacti
0e20: 6f 6e 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70  on}}.  do_test p
0e30: 61 67 65 72 31 2d 24 74 6e 2e 31 35 20 7b 20 73  ager1-$tn.15 { s
0e40: 71 6c 32 20 7b 20 52 4f 4c 4c 42 41 43 4b 20 7d  ql2 { ROLLBACK }
0e50: 20 7d 20 7b 7d 0a 0a 20 20 23 20 48 61 76 65 20   } {}..  # Have 
0e60: 5b 64 62 32 5d 20 6f 70 65 6e 20 61 20 74 72 61  [db2] open a tra
0e70: 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 74 61 6b  nsaction and tak
0e80: 65 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e  e a read-lock on
0e90: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20   the database.. 
0ea0: 20 23 20 43 68 65 63 6b 20 74 68 61 74 20 74 68   # Check that th
0eb0: 69 73 20 70 72 65 76 65 6e 74 73 20 5b 64 62 5d  is prevents [db]
0ec0: 20 66 72 6f 6d 20 77 72 69 74 69 6e 67 20 74 6f   from writing to
0ed0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 28 6f   the database (o
0ee0: 75 74 73 69 64 65 0a 20 20 23 20 6f 66 20 61 6e  utside.  # of an
0ef0: 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 20  y transaction). 
0f00: 41 66 74 65 72 20 74 68 69 73 20 66 61 69 6c 73  After this fails
0f10: 2c 20 63 68 65 63 6b 20 74 68 61 74 20 5b 64 62  , check that [db
0f20: 33 5d 20 63 61 6e 20 72 65 61 64 0a 20 20 23 20  3] can read.  # 
0f30: 74 68 65 20 64 62 20 28 73 68 6f 77 69 6e 67 20  the db (showing 
0f40: 74 68 61 74 20 5b 64 62 5d 20 64 69 64 20 6e 6f  that [db] did no
0f50: 74 20 74 61 6b 65 20 61 20 50 45 4e 44 49 4e 47  t take a PENDING
0f60: 20 6c 6f 63 6b 20 65 74 63 2e 29 0a 20 20 23 0a   lock etc.).  #.
0f70: 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
0f80: 2d 24 74 6e 2e 31 35 20 7b 20 0a 20 20 20 20 73  -$tn.15 { .    s
0f90: 71 6c 32 20 7b 20 42 45 47 49 4e 3b 20 53 45 4c  ql2 { BEGIN; SEL
0fa0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 20 7d  ECT * FROM t1; }
0fb0: 0a 20 20 7d 20 7b 31 20 6f 6e 65 20 32 20 74 77  .  } {1 one 2 tw
0fc0: 6f 20 33 20 74 68 72 65 65 7d 0a 20 20 64 6f 5f  o 3 three}.  do_
0fd0: 74 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e  test pager1-$tn.
0fe0: 31 36 20 7b 20 0a 20 20 20 20 63 73 71 6c 31 20  16 { .    csql1 
0ff0: 7b 20 55 50 44 41 54 45 20 74 31 20 53 45 54 20  { UPDATE t1 SET 
1000: 61 20 3d 20 61 20 2b 20 31 30 20 7d 0a 20 20 7d  a = a + 10 }.  }
1010: 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20 69 73   {1 {database is
1020: 20 6c 6f 63 6b 65 64 7d 7d 0a 20 20 64 6f 5f 74   locked}}.  do_t
1030: 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 31  est pager1-$tn.1
1040: 37 20 7b 20 73 71 6c 33 20 7b 20 53 45 4c 45 43  7 { sql3 { SELEC
1050: 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7d 20  T * FROM t1 } } 
1060: 7b 31 20 6f 6e 65 20 32 20 74 77 6f 20 33 20 74  {1 one 2 two 3 t
1070: 68 72 65 65 7d 0a 0a 20 20 23 20 54 68 69 73 20  hree}..  # This 
1080: 74 69 6d 65 2c 20 68 61 76 65 20 5b 64 62 5d 20  time, have [db] 
1090: 6f 70 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69  open a transacti
10a0: 6f 6e 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e  on before writin
10b0: 67 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  g the database..
10c0: 20 20 23 20 54 68 69 73 20 77 6f 72 6b 73 20 2d    # This works -
10d0: 20 5b 64 62 5d 20 67 65 74 73 20 61 20 52 45 53   [db] gets a RES
10e0: 45 52 56 45 44 20 6c 6f 63 6b 20 77 68 69 63 68  ERVED lock which
10f0: 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 66 6c 69   does not confli
1100: 63 74 20 77 69 74 68 0a 20 20 23 20 74 68 65 20  ct with.  # the 
1110: 53 48 41 52 45 44 20 6c 6f 63 6b 20 5b 64 62 32  SHARED lock [db2
1120: 5d 20 69 73 20 68 6f 6c 64 69 6e 67 2e 0a 20 20  ] is holding..  
1130: 23 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65  #.  do_test page
1140: 72 31 2d 24 74 6e 2e 31 38 20 7b 20 0a 20 20 20  r1-$tn.18 { .   
1150: 20 73 71 6c 31 20 7b 20 0a 20 20 20 20 20 20 42   sql1 { .      B
1160: 45 47 49 4e 3b 20 20 0a 20 20 20 20 20 20 55 50  EGIN;  .      UP
1170: 44 41 54 45 20 74 31 20 53 45 54 20 61 20 3d 20  DATE t1 SET a = 
1180: 61 20 2b 20 31 30 3b 20 0a 20 20 20 20 7d 0a 20  a + 10; .    }. 
1190: 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74 20   } {}.  do_test 
11a0: 70 61 67 65 72 31 2d 24 74 6e 2d 31 39 20 7b 20  pager1-$tn-19 { 
11b0: 0a 20 20 20 20 73 71 6c 31 20 7b 20 50 52 41 47  .    sql1 { PRAG
11c0: 4d 41 20 6c 6f 63 6b 5f 73 74 61 74 75 73 20 7d  MA lock_status }
11d0: 20 0a 20 20 7d 20 7b 6d 61 69 6e 20 72 65 73 65   .  } {main rese
11e0: 72 76 65 64 20 74 65 6d 70 20 63 6c 6f 73 65 64  rved temp closed
11f0: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65  }.  do_test page
1200: 72 31 2d 24 74 6e 2d 32 30 20 7b 20 0a 20 20 20  r1-$tn-20 { .   
1210: 20 73 71 6c 32 20 7b 20 50 52 41 47 4d 41 20 6c   sql2 { PRAGMA l
1220: 6f 63 6b 5f 73 74 61 74 75 73 20 7d 20 0a 20 20  ock_status } .  
1230: 7d 20 7b 6d 61 69 6e 20 73 68 61 72 65 64 20 74  } {main shared t
1240: 65 6d 70 20 63 6c 6f 73 65 64 7d 0a 0a 20 20 23  emp closed}..  #
1250: 20 43 68 65 63 6b 20 74 68 61 74 20 61 6c 6c 20   Check that all 
1260: 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 63 61 6e 20  connections can 
1270: 73 74 69 6c 6c 20 72 65 61 64 20 74 68 65 20 64  still read the d
1280: 61 74 61 62 61 73 65 2e 20 4f 6e 6c 79 20 5b 64  atabase. Only [d
1290: 62 5d 20 73 65 65 73 0a 20 20 23 20 74 68 65 20  b] sees.  # the 
12a0: 75 70 64 61 74 65 64 20 63 6f 6e 74 65 6e 74 20  updated content 
12b0: 28 61 73 20 74 68 65 20 74 72 61 6e 73 61 63 74  (as the transact
12c0: 69 6f 6e 20 68 61 73 20 6e 6f 74 20 62 65 65 6e  ion has not been
12d0: 20 63 6f 6d 6d 69 74 74 65 64 20 79 65 74 29 2e   committed yet).
12e0: 0a 20 20 23 0a 20 20 64 6f 5f 74 65 73 74 20 70  .  #.  do_test p
12f0: 61 67 65 72 31 2d 24 74 6e 2e 32 31 20 7b 20 73  ager1-$tn.21 { s
1300: 71 6c 31 20 7b 20 53 45 4c 45 43 54 20 2a 20 46  ql1 { SELECT * F
1310: 52 4f 4d 20 74 31 20 7d 20 7d 20 7b 31 31 20 6f  ROM t1 } } {11 o
1320: 6e 65 20 31 32 20 74 77 6f 20 31 33 20 74 68 72  ne 12 two 13 thr
1330: 65 65 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61  ee}.  do_test pa
1340: 67 65 72 31 2d 24 74 6e 2e 32 32 20 7b 20 73 71  ger1-$tn.22 { sq
1350: 6c 32 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52  l2 { SELECT * FR
1360: 4f 4d 20 74 31 20 7d 20 7d 20 7b 31 20 6f 6e 65  OM t1 } } {1 one
1370: 20 32 20 74 77 6f 20 33 20 74 68 72 65 65 7d 0a   2 two 3 three}.
1380: 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
1390: 2d 24 74 6e 2e 32 33 20 7b 20 73 71 6c 33 20 7b  -$tn.23 { sql3 {
13a0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
13b0: 31 20 7d 20 7d 20 7b 31 20 6f 6e 65 20 32 20 74  1 } } {1 one 2 t
13c0: 77 6f 20 33 20 74 68 72 65 65 7d 0a 0a 20 20 23  wo 3 three}..  #
13d0: 20 42 65 63 61 75 73 65 20 5b 64 62 32 5d 20 73   Because [db2] s
13e0: 74 69 6c 6c 20 68 61 73 20 74 68 65 20 53 48 41  till has the SHA
13f0: 52 45 44 20 6c 6f 63 6b 2c 20 5b 64 62 5d 20 69  RED lock, [db] i
1400: 73 20 75 6e 61 62 6c 65 20 74 6f 20 63 6f 6d 6d  s unable to comm
1410: 69 74 20 74 68 65 0a 20 20 23 20 74 72 61 6e 73  it the.  # trans
1420: 61 63 74 69 6f 6e 2e 20 49 66 20 69 74 20 74 72  action. If it tr
1430: 69 65 73 2c 20 61 6e 20 65 72 72 6f 72 20 69 73  ies, an error is
1440: 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68   returned and th
1450: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a 20 20  e connection .  
1460: 23 20 75 70 67 72 61 64 65 73 20 74 6f 20 61 20  # upgrades to a 
1470: 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 2e 0a 20 20  PENDING lock..  
1480: 23 0a 20 20 23 20 4f 6e 63 65 20 74 68 69 73 20  #.  # Once this 
1490: 68 61 70 70 65 6e 73 2c 20 5b 64 62 5d 20 63 61  happens, [db] ca
14a0: 6e 20 72 65 61 64 20 74 68 65 20 64 61 74 61 62  n read the datab
14b0: 61 73 65 20 61 6e 64 20 73 65 65 20 74 68 65 20  ase and see the 
14c0: 6e 65 77 20 63 6f 6e 74 65 6e 74 2c 0a 20 20 23  new content,.  #
14d0: 20 5b 64 62 32 5d 20 28 73 74 69 6c 6c 20 68 6f   [db2] (still ho
14e0: 6c 64 69 6e 67 20 53 48 41 52 45 44 29 20 63 61  lding SHARED) ca
14f0: 6e 20 73 74 69 6c 6c 20 72 65 61 64 20 74 68 65  n still read the
1500: 20 6f 6c 64 20 63 6f 6e 74 65 6e 74 2c 20 62 75   old content, bu
1510: 74 20 5b 64 62 33 5d 0a 20 20 23 20 28 6e 6f 74  t [db3].  # (not
1520: 20 68 6f 6c 64 69 6e 67 20 61 6e 79 20 6c 6f 63   holding any loc
1530: 6b 29 20 69 73 20 70 72 65 76 65 6e 74 65 64 20  k) is prevented 
1540: 62 79 20 5b 64 62 5d 27 73 20 50 45 4e 44 49 4e  by [db]'s PENDIN
1550: 47 20 66 72 6f 6d 20 72 65 61 64 69 6e 67 0a 20  G from reading. 
1560: 20 23 20 74 68 65 20 64 61 74 61 62 61 73 65 2e   # the database.
1570: 0a 20 20 23 0a 20 20 64 6f 5f 74 65 73 74 20 70  .  #.  do_test p
1580: 61 67 65 72 31 2d 24 74 6e 2e 32 34 20 7b 20 63  ager1-$tn.24 { c
1590: 73 71 6c 31 20 7b 20 43 4f 4d 4d 49 54 20 7d 20  sql1 { COMMIT } 
15a0: 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20 69  } {1 {database i
15b0: 73 20 6c 6f 63 6b 65 64 7d 7d 0a 20 20 64 6f 5f  s locked}}.  do_
15c0: 74 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2d  test pager1-$tn-
15d0: 32 35 20 7b 20 0a 20 20 20 20 73 71 6c 31 20 7b  25 { .    sql1 {
15e0: 20 50 52 41 47 4d 41 20 6c 6f 63 6b 5f 73 74 61   PRAGMA lock_sta
15f0: 74 75 73 20 7d 20 0a 20 20 7d 20 7b 6d 61 69 6e  tus } .  } {main
1600: 20 70 65 6e 64 69 6e 67 20 74 65 6d 70 20 63 6c   pending temp cl
1610: 6f 73 65 64 7d 0a 20 20 64 6f 5f 74 65 73 74 20  osed}.  do_test 
1620: 70 61 67 65 72 31 2d 24 74 6e 2e 32 36 20 7b 20  pager1-$tn.26 { 
1630: 73 71 6c 31 20 7b 20 53 45 4c 45 43 54 20 2a 20  sql1 { SELECT * 
1640: 46 52 4f 4d 20 74 31 20 20 7d 20 7d 20 7b 31 31  FROM t1  } } {11
1650: 20 6f 6e 65 20 31 32 20 74 77 6f 20 31 33 20 74   one 12 two 13 t
1660: 68 72 65 65 7d 0a 20 20 64 6f 5f 74 65 73 74 20  hree}.  do_test 
1670: 70 61 67 65 72 31 2d 24 74 6e 2e 32 37 20 7b 20  pager1-$tn.27 { 
1680: 73 71 6c 32 20 7b 20 53 45 4c 45 43 54 20 2a 20  sql2 { SELECT * 
1690: 46 52 4f 4d 20 74 31 20 20 7d 20 7d 20 7b 31 20  FROM t1  } } {1 
16a0: 6f 6e 65 20 32 20 74 77 6f 20 33 20 74 68 72 65  one 2 two 3 thre
16b0: 65 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67  e}.  do_test pag
16c0: 65 72 31 2d 24 74 6e 2e 32 38 20 7b 20 63 73 71  er1-$tn.28 { csq
16d0: 6c 33 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52  l3 { SELECT * FR
16e0: 4f 4d 20 74 31 20 7d 20 7d 20 7b 31 20 7b 64 61  OM t1 } } {1 {da
16f0: 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64  tabase is locked
1700: 7d 7d 0a 0a 20 20 23 20 48 61 76 65 20 5b 64 62  }}..  # Have [db
1710: 32 5d 20 63 6f 6d 6d 69 74 20 69 74 73 20 72 65  2] commit its re
1720: 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  ad transaction, 
1730: 72 65 6c 65 61 73 69 6e 67 20 74 68 65 20 53 48  releasing the SH
1740: 41 52 45 44 20 6c 6f 63 6b 20 69 74 0a 20 20 23  ARED lock it.  #
1750: 20 69 73 20 68 6f 6c 64 69 6e 67 2e 20 4e 6f 77   is holding. Now
1760: 2c 20 6e 65 69 74 68 65 72 20 5b 64 62 32 5d 20  , neither [db2] 
1770: 6e 6f 72 20 5b 64 62 33 5d 20 6d 61 79 20 72 65  nor [db3] may re
1780: 61 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ad the database 
1790: 28 61 73 20 5b 64 62 5d 0a 20 20 23 20 69 73 20  (as [db].  # is 
17a0: 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 20  still holding a 
17b0: 50 45 4e 44 49 4e 47 29 2e 0a 20 20 23 0a 20 20  PENDING)..  #.  
17c0: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24  do_test pager1-$
17d0: 74 6e 2e 32 39 20 7b 20 73 71 6c 32 20 7b 20 43  tn.29 { sql2 { C
17e0: 4f 4d 4d 49 54 20 7d 20 7d 20 7b 7d 0a 20 20 64  OMMIT } } {}.  d
17f0: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24 74  o_test pager1-$t
1800: 6e 2e 33 30 20 7b 20 63 73 71 6c 32 20 7b 20 53  n.30 { csql2 { S
1810: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
1820: 7d 20 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65  } } {1 {database
1830: 20 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 20 20 64   is locked}}.  d
1840: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24 74  o_test pager1-$t
1850: 6e 2e 33 31 20 7b 20 63 73 71 6c 33 20 7b 20 53  n.31 { csql3 { S
1860: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
1870: 7d 20 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65  } } {1 {database
1880: 20 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 0a 20 20   is locked}}..  
1890: 23 20 5b 64 62 5d 20 69 73 20 6e 6f 77 20 61 62  # [db] is now ab
18a0: 6c 65 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65  le to commit the
18b0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 4f 6e   transaction. On
18c0: 63 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ce the transacti
18d0: 6f 6e 20 69 73 20 0a 20 20 23 20 63 6f 6d 6d 69  on is .  # commi
18e0: 74 74 65 64 2c 20 61 6c 6c 20 74 68 72 65 65 20  tted, all three 
18f0: 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 63 61 6e 20  connections can 
1900: 72 65 61 64 20 74 68 65 20 6e 65 77 20 63 6f 6e  read the new con
1910: 74 65 6e 74 2e 0a 20 20 23 0a 20 20 64 6f 5f 74  tent..  #.  do_t
1920: 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 32  est pager1-$tn.2
1930: 35 20 7b 20 73 71 6c 31 20 7b 20 55 50 44 41 54  5 { sql1 { UPDAT
1940: 45 20 74 31 20 53 45 54 20 61 20 3d 20 61 2b 31  E t1 SET a = a+1
1950: 30 20 7d 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65  0 } } {}.  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 43 4f 4d 4d 49 54   { sql1 { COMMIT
1980: 20 7d 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73   } } {}.  do_tes
1990: 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 32 37 20  t pager1-$tn.27 
19a0: 7b 20 73 71 6c 31 20 7b 20 53 45 4c 45 43 54 20  { sql1 { SELECT 
19b0: 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7d 20 7b 32  * FROM t1 } } {2
19c0: 31 20 6f 6e 65 20 32 32 20 74 77 6f 20 32 33 20  1 one 22 two 23 
19d0: 74 68 72 65 65 7d 0a 20 20 64 6f 5f 74 65 73 74  three}.  do_test
19e0: 20 70 61 67 65 72 31 2d 24 74 6e 2e 32 37 20 7b   pager1-$tn.27 {
19f0: 20 73 71 6c 32 20 7b 20 53 45 4c 45 43 54 20 2a   sql2 { SELECT *
1a00: 20 46 52 4f 4d 20 74 31 20 7d 20 7d 20 7b 32 31   FROM t1 } } {21
1a10: 20 6f 6e 65 20 32 32 20 74 77 6f 20 32 33 20 74   one 22 two 23 t
1a20: 68 72 65 65 7d 0a 20 20 64 6f 5f 74 65 73 74 20  hree}.  do_test 
1a30: 70 61 67 65 72 31 2d 24 74 6e 2e 32 38 20 7b 20  pager1-$tn.28 { 
1a40: 73 71 6c 33 20 7b 20 53 45 4c 45 43 54 20 2a 20  sql3 { SELECT * 
1a50: 46 52 4f 4d 20 74 31 20 7d 20 7d 20 7b 32 31 20  FROM t1 } } {21 
1a60: 6f 6e 65 20 32 32 20 74 77 6f 20 32 33 20 74 68  one 22 two 23 th
1a70: 72 65 65 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d  ree}.}..#-------
1a80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1ac0: 2d 2d 0a 23 20 53 61 76 65 70 6f 69 6e 74 20 72  --.# Savepoint r
1ad0: 65 6c 61 74 65 64 20 74 65 73 74 20 63 61 73 65  elated test case
1ae0: 73 2e 0a 23 20 0a 64 6f 5f 74 65 73 74 20 70 61  s..# .do_test pa
1af0: 67 65 72 31 2d 33 2e 31 2e 31 20 7b 0a 20 20 66  ger1-3.1.1 {.  f
1b00: 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61  aultsim_delete_a
1b10: 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65 63  nd_reopen.  exec
1b20: 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45  sql {.    CREATE
1b30: 20 54 41 42 4c 45 20 74 31 28 61 20 50 52 49 4d   TABLE t1(a PRIM
1b40: 41 52 59 20 4b 45 59 2c 20 62 29 3b 0a 20 20 20  ARY KEY, b);.   
1b50: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 6f   CREATE TABLE co
1b60: 75 6e 74 65 72 28 0a 20 20 20 20 20 20 69 20 43  unter(.      i C
1b70: 48 45 43 4b 20 28 69 3c 35 29 2c 20 0a 20 20 20  HECK (i<5), .   
1b80: 20 20 20 75 20 43 48 45 43 4b 20 28 75 3c 31 30     u CHECK (u<10
1b90: 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 49 4e 53  ).    );.    INS
1ba0: 45 52 54 20 49 4e 54 4f 20 63 6f 75 6e 74 65 72  ERT INTO counter
1bb0: 20 56 41 4c 55 45 53 28 30 2c 20 30 29 3b 0a 20   VALUES(0, 0);. 
1bc0: 20 20 20 43 52 45 41 54 45 20 54 52 49 47 47 45     CREATE TRIGGE
1bd0: 52 20 74 72 31 20 41 46 54 45 52 20 49 4e 53 45  R tr1 AFTER INSE
1be0: 52 54 20 4f 4e 20 74 31 20 42 45 47 49 4e 0a 20  RT ON t1 BEGIN. 
1bf0: 20 20 20 20 20 55 50 44 41 54 45 20 63 6f 75 6e       UPDATE coun
1c00: 74 65 72 20 53 45 54 20 69 20 3d 20 69 2b 31 3b  ter SET i = i+1;
1c10: 0a 20 20 20 20 45 4e 44 3b 0a 20 20 20 20 43 52  .    END;.    CR
1c20: 45 41 54 45 20 54 52 49 47 47 45 52 20 74 72 32  EATE TRIGGER tr2
1c30: 20 41 46 54 45 52 20 55 50 44 41 54 45 20 4f 4e   AFTER UPDATE ON
1c40: 20 74 31 20 42 45 47 49 4e 0a 20 20 20 20 20 20   t1 BEGIN.      
1c50: 55 50 44 41 54 45 20 63 6f 75 6e 74 65 72 20 53  UPDATE counter S
1c60: 45 54 20 75 20 3d 20 75 2b 31 3b 0a 20 20 20 20  ET u = u+1;.    
1c70: 45 4e 44 3b 0a 20 20 7d 0a 20 20 65 78 65 63 73  END;.  }.  execs
1c80: 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52  ql { SELECT * FR
1c90: 4f 4d 20 63 6f 75 6e 74 65 72 20 7d 0a 7d 20 7b  OM counter }.} {
1ca0: 30 20 30 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c  0 0}..do_execsql
1cb0: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 33 2e 31  _test pager1-3.1
1cc0: 2e 32 20 7b 0a 20 20 42 45 47 49 4e 3b 0a 20 20  .2 {.  BEGIN;.  
1cd0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
1ce0: 20 56 41 4c 55 45 53 28 31 2c 20 72 61 6e 64 6f   VALUES(1, rando
1cf0: 6d 62 6c 6f 62 28 31 35 30 30 29 29 3b 0a 20 20  mblob(1500));.  
1d00: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
1d10: 20 56 41 4c 55 45 53 28 32 2c 20 72 61 6e 64 6f   VALUES(2, rando
1d20: 6d 62 6c 6f 62 28 31 35 30 30 29 29 3b 0a 20 20  mblob(1500));.  
1d30: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
1d40: 20 56 41 4c 55 45 53 28 33 2c 20 72 61 6e 64 6f   VALUES(3, rando
1d50: 6d 62 6c 6f 62 28 31 35 30 30 29 29 3b 0a 20 20  mblob(1500));.  
1d60: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
1d70: 63 6f 75 6e 74 65 72 3b 0a 7d 20 7b 33 20 30 7d  counter;.} {3 0}
1d80: 0a 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74 65 73  .do_catchsql_tes
1d90: 74 20 70 61 67 65 72 31 2d 33 2e 31 2e 33 20 7b  t pager1-3.1.3 {
1da0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
1db0: 20 74 31 20 53 45 4c 45 43 54 20 61 2b 33 2c 20   t1 SELECT a+3, 
1dc0: 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29  randomblob(1500)
1dd0: 20 46 52 4f 4d 20 74 31 0a 7d 20 7b 31 20 7b 63   FROM t1.} {1 {c
1de0: 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64  onstraint failed
1df0: 7d 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  }}.do_execsql_te
1e00: 73 74 20 70 61 67 65 72 31 2d 33 2e 34 20 7b 20  st pager1-3.4 { 
1e10: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 63 6f  SELECT * FROM co
1e20: 75 6e 74 65 72 20 7d 20 7b 33 20 30 7d 0a 64 6f  unter } {3 0}.do
1e30: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61  _execsql_test pa
1e40: 67 65 72 31 2d 33 2e 35 20 7b 20 53 45 4c 45 43  ger1-3.5 { SELEC
1e50: 54 20 61 20 46 52 4f 4d 20 74 31 20 7d 20 7b 31  T a FROM t1 } {1
1e60: 20 32 20 33 7d 0a 64 6f 5f 65 78 65 63 73 71 6c   2 3}.do_execsql
1e70: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 33 2e 36  _test pager1-3.6
1e80: 20 7b 20 43 4f 4d 4d 49 54 20 7d 20 7b 7d 0a 0a   { COMMIT } {}..
1e90: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
1ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 48 6f 74  ----------.# Hot
1ee0: 20 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63   journal rollbac
1ef0: 6b 20 72 65 6c 61 74 65 64 20 74 65 73 74 20 63  k related test c
1f00: 61 73 65 73 2e 0a 23 0a 23 20 70 61 67 65 72 31  ases..#.# pager1
1f10: 2e 34 2e 31 2e 2a 3a 20 54 65 73 74 20 74 68 61  .4.1.*: Test tha
1f20: 74 20 74 68 65 20 70 61 67 65 72 20 6d 6f 64 75  t the pager modu
1f30: 6c 65 20 64 65 6c 65 74 65 73 20 76 65 72 79 20  le deletes very 
1f40: 73 6d 61 6c 6c 20 69 6e 76 61 6c 69 64 0a 23 20  small invalid.# 
1f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6a 6f                jo
1f60: 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 23 0a 23  urnal files..#.#
1f70: 20 70 61 67 65 72 31 2e 34 2e 32 2e 2a 3a 20 54   pager1.4.2.*: T
1f80: 65 73 74 20 74 68 61 74 20 69 66 20 74 68 65 20  est that if the 
1f90: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70  master journal p
1fa0: 6f 69 6e 74 65 72 20 61 74 20 74 68 65 20 65 6e  ointer at the en
1fb0: 64 20 6f 66 20 61 0a 23 20 20 20 20 20 20 20 20  d of a.#        
1fc0: 20 20 20 20 20 20 20 68 6f 74 2d 6a 6f 75 72 6e         hot-journ
1fd0: 61 6c 20 66 69 6c 65 20 61 70 70 65 61 72 73 20  al file appears 
1fe0: 74 6f 20 62 65 20 63 6f 72 72 75 70 74 20 28 63  to be corrupt (c
1ff0: 68 65 63 6b 73 75 6d 20 64 6f 65 73 20 6e 6f 74  hecksum does not
2000: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
2010: 20 63 6f 6d 70 75 74 65 29 20 74 68 65 20 61 73   compute) the as
2020: 73 6f 63 69 61 74 65 64 20 6a 6f 75 72 6e 61 6c  sociated journal
2030: 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20   is rolled back 
2040: 28 61 6e 64 20 6e 6f 0a 23 20 20 20 20 20 20 20  (and no.#       
2050: 20 20 20 20 20 20 20 20 78 41 63 63 65 73 73 28          xAccess(
2060: 29 20 63 61 6c 6c 20 74 6f 20 63 68 65 63 6b 20  ) call to check 
2070: 66 6f 72 20 74 68 65 20 70 72 65 73 65 6e 63 65  for the presence
2080: 20 6f 66 20 61 6e 79 20 6d 61 73 74 65 72 20 0a   of any master .
2090: 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  #               
20a0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
20b0: 6d 61 64 65 29 2e 0a 23 0a 23 20 70 61 67 65 72  made)..#.# pager
20c0: 31 2e 34 2e 33 2e 2a 3a 20 54 65 73 74 20 74 68  1.4.3.*: Test th
20d0: 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  at the contents 
20e0: 6f 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  of a hot-journal
20f0: 20 61 72 65 20 69 67 6e 6f 72 65 64 20 69 66 20   are ignored if 
2100: 74 68 65 0a 23 20 20 20 20 20 20 20 20 20 20 20  the.#           
2110: 20 20 20 20 70 61 67 65 2d 73 69 7a 65 20 6f 72      page-size or
2120: 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 69 6e 20   sector-size in 
2130: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
2140: 65 72 20 61 70 70 65 61 72 20 74 6f 0a 23 20 20  er appear to.#  
2150: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 65 20               be 
2160: 69 6e 76 61 6c 69 64 20 28 74 6f 6f 20 6c 61 72  invalid (too lar
2170: 67 65 2c 20 74 6f 6f 20 73 6d 61 6c 6c 20 6f 72  ge, too small or
2180: 20 6e 6f 74 20 61 20 70 6f 77 65 72 20 6f 66 20   not a power of 
2190: 32 29 2e 0a 23 0a 23 20 70 61 67 65 72 31 2e 34  2)..#.# pager1.4
21a0: 2e 34 2e 2a 3a 20 54 65 73 74 20 68 6f 74 2d 6a  .4.*: Test hot-j
21b0: 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20  ournal rollback 
21c0: 6f 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  of journal file 
21d0: 77 69 74 68 20 61 20 6d 61 73 74 65 72 0a 23 20  with a master.# 
21e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6a 6f                jo
21f0: 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 67 65  urnal pointer ge
2200: 6e 65 72 61 74 65 64 20 69 6e 20 76 61 72 69 6f  nerated in vario
2210: 75 73 20 22 50 52 41 47 4d 41 20 73 79 6e 63 68  us "PRAGMA synch
2220: 72 6f 6e 6f 75 73 22 0a 23 20 20 20 20 20 20 20  ronous".#       
2230: 20 20 20 20 20 20 20 20 6d 6f 64 65 73 2e 0a 23          modes..#
2240: 0a 23 20 70 61 67 65 72 31 2e 34 2e 35 2e 2a 3a  .# pager1.4.5.*:
2250: 20 54 65 73 74 20 74 68 61 74 20 68 6f 74 2d 6a   Test that hot-j
2260: 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20  ournal rollback 
2270: 73 74 6f 70 73 20 69 66 20 69 74 20 65 6e 63 6f  stops if it enco
2280: 75 6e 74 65 72 73 20 61 0a 23 20 20 20 20 20 20  unters a.#      
2290: 20 20 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c           journal
22a0: 2d 72 65 63 6f 72 64 20 66 6f 72 20 77 68 69 63  -record for whic
22b0: 68 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 66  h the checksum f
22c0: 61 69 6c 73 2e 0a 23 20 0a 64 6f 5f 74 65 73 74  ails..# .do_test
22d0: 20 70 61 67 65 72 31 2e 34 2e 31 2e 31 20 7b 0a   pager1.4.1.1 {.
22e0: 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74    faultsim_delet
22f0: 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65  e_and_reopen.  e
2300: 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 43 52  xecsql { .    CR
2310: 45 41 54 45 20 54 41 42 4c 45 20 78 28 79 2c 20  EATE TABLE x(y, 
2320: 7a 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  z);.    INSERT I
2330: 4e 54 4f 20 78 20 56 41 4c 55 45 53 28 31 2c 20  NTO x VALUES(1, 
2340: 32 29 3b 0a 20 20 7d 0a 20 20 73 65 74 20 66 64  2);.  }.  set fd
2350: 20 5b 6f 70 65 6e 20 74 65 73 74 2e 64 62 2d 6a   [open test.db-j
2360: 6f 75 72 6e 61 6c 20 77 5d 0a 20 20 70 75 74 73  ournal w].  puts
2370: 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 24 66 64 20   -nonewline $fd 
2380: 22 68 65 6c 6c 6f 77 6f 72 6c 64 22 0a 20 20 63  "helloworld".  c
2390: 6c 6f 73 65 20 24 66 64 0a 20 20 66 69 6c 65 20  lose $fd.  file 
23a0: 65 78 69 73 74 73 20 74 65 73 74 2e 64 62 2d 6a  exists test.db-j
23b0: 6f 75 72 6e 61 6c 0a 7d 20 7b 31 7d 0a 64 6f 5f  ournal.} {1}.do_
23c0: 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e 31 2e  test pager1.4.1.
23d0: 32 20 7b 20 65 78 65 63 73 71 6c 20 7b 20 53 45  2 { execsql { SE
23e0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 78 20 7d 20  LECT * FROM x } 
23f0: 7d 20 7b 31 20 32 7d 0a 64 6f 5f 74 65 73 74 20  } {1 2}.do_test 
2400: 70 61 67 65 72 31 2e 34 2e 31 2e 33 20 7b 20 66  pager1.4.1.3 { f
2410: 69 6c 65 20 65 78 69 73 74 73 20 74 65 73 74 2e  ile exists test.
2420: 64 62 2d 6a 6f 75 72 6e 61 6c 20 7d 20 7b 30 7d  db-journal } {0}
2430: 0a 0a 23 20 53 65 74 20 75 70 20 61 20 5b 74 65  ..# Set up a [te
2440: 73 74 76 66 73 5d 20 74 6f 20 73 6e 61 70 73 68  stvfs] to snapsh
2450: 6f 74 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  ot the file-syst
2460: 65 6d 20 6a 75 73 74 20 62 65 66 6f 72 65 20 53  em just before S
2470: 51 4c 69 74 65 0a 23 20 64 65 6c 65 74 65 73 20  QLite.# deletes 
2480: 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e  the master-journ
2490: 61 6c 20 74 6f 20 63 6f 6d 6d 69 74 20 61 20 6d  al to commit a m
24a0: 75 6c 74 69 2d 66 69 6c 65 20 74 72 61 6e 73 61  ulti-file transa
24b0: 63 74 69 6f 6e 2e 0a 23 0a 23 20 49 6e 20 73 75  ction..#.# In su
24c0: 62 73 65 71 75 65 6e 74 20 74 65 73 74 20 63 61  bsequent test ca
24d0: 73 65 73 2c 20 69 6e 76 6f 6b 69 6e 67 20 5b 66  ses, invoking [f
24e0: 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f  aultsim_restore_
24f0: 61 6e 64 5f 72 65 6f 70 65 6e 5d 20 73 65 74 73  and_reopen] sets
2500: 0a 23 20 75 70 20 74 68 65 20 66 69 6c 65 20 73  .# up the file s
2510: 79 73 74 65 6d 20 74 6f 20 63 6f 6e 74 61 69 6e  ystem to contain
2520: 20 74 77 6f 20 64 61 74 61 62 61 73 65 73 2c 20   two databases, 
2530: 74 77 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  two hot-journal 
2540: 66 69 6c 65 73 20 61 6e 64 0a 23 20 61 20 6d 61  files and.# a ma
2550: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 2e 0a 23 0a  ster-journal..#.
2560: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34  do_test pager1.4
2570: 2e 32 2e 31 20 7b 0a 20 20 74 65 73 74 76 66 73  .2.1 {.  testvfs
2580: 20 74 73 74 76 66 73 20 2d 64 65 66 61 75 6c 74   tstvfs -default
2590: 20 31 0a 20 20 74 73 74 76 66 73 20 66 69 6c 74   1.  tstvfs filt
25a0: 65 72 20 78 44 65 6c 65 74 65 0a 20 20 74 73 74  er xDelete.  tst
25b0: 76 66 73 20 73 63 72 69 70 74 20 78 44 65 6c 65  vfs script xDele
25c0: 74 65 43 61 6c 6c 62 61 63 6b 0a 20 20 70 72 6f  teCallback.  pro
25d0: 63 20 78 44 65 6c 65 74 65 43 61 6c 6c 62 61 63  c xDeleteCallbac
25e0: 6b 20 7b 6d 65 74 68 6f 64 20 66 69 6c 65 20 61  k {method file a
25f0: 72 67 73 7d 20 7b 0a 20 20 20 20 73 65 74 20 66  rgs} {.    set f
2600: 69 6c 65 20 5b 66 69 6c 65 20 74 61 69 6c 20 24  ile [file tail $
2610: 66 69 6c 65 5d 0a 20 20 20 20 69 66 20 7b 20 5b  file].    if { [
2620: 73 74 72 69 6e 67 20 6d 61 74 63 68 20 2a 6d 6a  string match *mj
2630: 2a 20 24 66 69 6c 65 5d 20 7d 20 7b 20 66 61 75  * $file] } { fau
2640: 6c 74 73 69 6d 5f 73 61 76 65 20 7d 0a 20 20 7d  ltsim_save }.  }
2650: 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65  .  faultsim_dele
2660: 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20  te_and_reopen.  
2670: 64 62 20 66 75 6e 63 20 61 5f 73 74 72 69 6e 67  db func a_string
2680: 20 61 5f 73 74 72 69 6e 67 0a 20 20 65 78 65 63   a_string.  exec
2690: 73 71 6c 20 7b 0a 20 20 20 20 41 54 54 41 43 48  sql {.    ATTACH
26a0: 20 27 74 65 73 74 2e 64 62 32 27 20 41 53 20 61   'test.db2' AS a
26b0: 75 78 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a  ux;.    PRAGMA j
26c0: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45  ournal_mode = DE
26d0: 4c 45 54 45 3b 0a 20 20 20 20 50 52 41 47 4d 41  LETE;.    PRAGMA
26e0: 20 6d 61 69 6e 2e 63 61 63 68 65 5f 73 69 7a 65   main.cache_size
26f0: 20 3d 20 31 30 3b 0a 20 20 20 20 50 52 41 47 4d   = 10;.    PRAGM
2700: 41 20 61 75 78 2e 63 61 63 68 65 5f 73 69 7a 65  A aux.cache_size
2710: 20 3d 20 31 30 3b 0a 20 20 20 20 43 52 45 41 54   = 10;.    CREAT
2720: 45 20 54 41 42 4c 45 20 74 31 28 61 20 55 4e 49  E TABLE t1(a UNI
2730: 51 55 45 2c 20 62 20 55 4e 49 51 55 45 29 3b 0a  QUE, b UNIQUE);.
2740: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
2750: 20 61 75 78 2e 74 32 28 61 20 55 4e 49 51 55 45   aux.t2(a UNIQUE
2760: 2c 20 62 20 55 4e 49 51 55 45 29 3b 0a 20 20 20  , b UNIQUE);.   
2770: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
2780: 56 41 4c 55 45 53 28 61 5f 73 74 72 69 6e 67 28  VALUES(a_string(
2790: 32 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 33  200), a_string(3
27a0: 30 30 29 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  00));.    INSERT
27b0: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
27c0: 61 5f 73 74 72 69 6e 67 28 32 30 30 29 2c 20 61  a_string(200), a
27d0: 5f 73 74 72 69 6e 67 28 33 30 30 29 20 46 52 4f  _string(300) FRO
27e0: 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54  M t1;.    INSERT
27f0: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
2800: 61 5f 73 74 72 69 6e 67 28 32 30 30 29 2c 20 61  a_string(200), a
2810: 5f 73 74 72 69 6e 67 28 33 30 30 29 20 46 52 4f  _string(300) FRO
2820: 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54  M t1;.    INSERT
2830: 20 49 4e 54 4f 20 74 32 20 53 45 4c 45 43 54 20   INTO t2 SELECT 
2840: 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 42  * FROM t1;.    B
2850: 45 47 49 4e 3b 0a 20 20 20 20 20 20 49 4e 53 45  EGIN;.      INSE
2860: 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
2870: 54 20 61 5f 73 74 72 69 6e 67 28 32 30 31 29 2c  T a_string(201),
2880: 20 61 5f 73 74 72 69 6e 67 28 33 30 31 29 20 46   a_string(301) F
2890: 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20 49 4e  ROM t1;.      IN
28a0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
28b0: 45 43 54 20 61 5f 73 74 72 69 6e 67 28 32 30 32  ECT a_string(202
28c0: 29 2c 20 61 5f 73 74 72 69 6e 67 28 33 30 32 29  ), a_string(302)
28d0: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20   FROM t1;.      
28e0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
28f0: 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 32  ELECT a_string(2
2900: 30 33 29 2c 20 61 5f 73 74 72 69 6e 67 28 33 30  03), a_string(30
2910: 33 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20  3) FROM t1;.    
2920: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
2930: 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67   SELECT a_string
2940: 28 32 30 34 29 2c 20 61 5f 73 74 72 69 6e 67 28  (204), a_string(
2950: 33 30 34 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20  304) FROM t1;.  
2960: 20 20 20 20 52 45 50 4c 41 43 45 20 49 4e 54 4f      REPLACE INTO
2970: 20 74 32 20 53 45 4c 45 43 54 20 2a 20 46 52 4f   t2 SELECT * FRO
2980: 4d 20 74 31 3b 0a 20 20 20 20 43 4f 4d 4d 49 54  M t1;.    COMMIT
2990: 3b 0a 20 20 7d 0a 20 20 64 62 20 63 6c 6f 73 65  ;.  }.  db close
29a0: 0a 20 20 74 73 74 76 66 73 20 64 65 6c 65 74 65  .  tstvfs delete
29b0: 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 70 61  .} {}.do_test pa
29c0: 67 65 72 31 2e 34 2e 32 2e 32 20 7b 0a 20 20 66  ger1.4.2.2 {.  f
29d0: 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f  aultsim_restore_
29e0: 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65  and_reopen.  exe
29f0: 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43  csql {.    SELEC
2a00: 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
2a10: 74 31 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 69  t1;.    PRAGMA i
2a20: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 3b 0a  ntegrity_check;.
2a30: 20 20 7d 0a 7d 20 7b 34 20 6f 6b 7d 0a 64 6f 5f    }.} {4 ok}.do_
2a40: 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e 32 2e  test pager1.4.2.
2a50: 33 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 72  3 {.  faultsim_r
2a60: 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65  estore_and_reope
2a70: 6e 0a 20 20 66 6f 72 65 61 63 68 20 66 20 5b 67  n.  foreach f [g
2a80: 6c 6f 62 20 74 65 73 74 2e 64 62 2d 6d 6a 2a 5d  lob test.db-mj*]
2a90: 20 7b 20 66 69 6c 65 20 64 65 6c 65 74 65 20 2d   { file delete -
2aa0: 66 6f 72 63 65 20 24 66 20 7d 0a 20 20 65 78 65  force $f }.  exe
2ab0: 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43  csql {.    SELEC
2ac0: 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
2ad0: 74 31 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 69  t1;.    PRAGMA i
2ae0: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 3b 0a  ntegrity_check;.
2af0: 20 20 7d 0a 7d 20 7b 36 34 20 6f 6b 7d 0a 64 6f    }.} {64 ok}.do
2b00: 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e 32  _test pager1.4.2
2b10: 2e 34 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f  .4 {.  faultsim_
2b20: 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70  restore_and_reop
2b30: 65 6e 0a 20 20 68 65 78 69 6f 5f 77 72 69 74 65  en.  hexio_write
2b40: 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c   test.db-journal
2b50: 20 5b 65 78 70 72 20 5b 66 69 6c 65 20 73 69 7a   [expr [file siz
2b60: 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61  e test.db-journa
2b70: 6c 5d 2d 32 30 5d 20 31 32 33 34 35 36 0a 20 20  l]-20] 123456.  
2b80: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45  execsql {.    SE
2b90: 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
2ba0: 4f 4d 20 74 31 3b 0a 20 20 20 20 50 52 41 47 4d  OM t1;.    PRAGM
2bb0: 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63  A integrity_chec
2bc0: 6b 3b 0a 20 20 7d 0a 7d 20 7b 34 20 6f 6b 7d 0a  k;.  }.} {4 ok}.
2bd0: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34  do_test pager1.4
2be0: 2e 32 2e 35 20 7b 0a 20 20 66 61 75 6c 74 73 69  .2.5 {.  faultsi
2bf0: 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65  m_restore_and_re
2c00: 6f 70 65 6e 0a 20 20 68 65 78 69 6f 5f 77 72 69  open.  hexio_wri
2c10: 74 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e  te test.db-journ
2c20: 61 6c 20 5b 65 78 70 72 20 5b 66 69 6c 65 20 73  al [expr [file s
2c30: 69 7a 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72  ize test.db-jour
2c40: 6e 61 6c 5d 2d 32 30 5d 20 31 32 33 34 35 36 0a  nal]-20] 123456.
2c50: 20 20 66 6f 72 65 61 63 68 20 66 20 5b 67 6c 6f    foreach f [glo
2c60: 62 20 74 65 73 74 2e 64 62 2d 6d 6a 2a 5d 20 7b  b test.db-mj*] {
2c70: 20 66 69 6c 65 20 64 65 6c 65 74 65 20 2d 66 6f   file delete -fo
2c80: 72 63 65 20 24 66 20 7d 0a 20 20 65 78 65 63 73  rce $f }.  execs
2c90: 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  ql {.    SELECT 
2ca0: 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31  count(*) FROM t1
2cb0: 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 69 6e 74  ;.    PRAGMA int
2cc0: 65 67 72 69 74 79 5f 63 68 65 63 6b 3b 0a 20 20  egrity_check;.  
2cd0: 7d 0a 7d 20 7b 34 20 6f 6b 7d 0a 0a 64 6f 5f 74  }.} {4 ok}..do_t
2ce0: 65 73 74 20 70 61 67 65 72 31 2e 34 2e 33 2e 31  est pager1.4.3.1
2cf0: 20 7b 0a 20 20 74 65 73 74 76 66 73 20 74 73 74   {.  testvfs tst
2d00: 76 66 73 20 2d 64 65 66 61 75 6c 74 20 31 0a 20  vfs -default 1. 
2d10: 20 74 73 74 76 66 73 20 66 69 6c 74 65 72 20 78   tstvfs filter x
2d20: 53 79 6e 63 0a 20 20 74 73 74 76 66 73 20 73 63  Sync.  tstvfs sc
2d30: 72 69 70 74 20 78 53 79 6e 63 43 61 6c 6c 62 61  ript xSyncCallba
2d40: 63 6b 0a 20 20 70 72 6f 63 20 78 53 79 6e 63 43  ck.  proc xSyncC
2d50: 61 6c 6c 62 61 63 6b 20 7b 6d 65 74 68 6f 64 20  allback {method 
2d60: 66 69 6c 65 20 61 72 67 73 7d 20 7b 0a 20 20 20  file args} {.   
2d70: 20 73 65 74 20 66 69 6c 65 20 5b 66 69 6c 65 20   set file [file 
2d80: 74 61 69 6c 20 24 66 69 6c 65 5d 0a 20 20 20 20  tail $file].    
2d90: 69 66 20 7b 20 30 3d 3d 5b 73 74 72 69 6e 67 20  if { 0==[string 
2da0: 6d 61 74 63 68 20 2a 6a 6f 75 72 6e 61 6c 20 24  match *journal $
2db0: 66 69 6c 65 5d 20 7d 20 7b 20 66 61 75 6c 74 73  file] } { faults
2dc0: 69 6d 5f 73 61 76 65 20 7d 0a 20 20 7d 0a 20 20  im_save }.  }.  
2dd0: 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f  faultsim_delete_
2de0: 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65  and_reopen.  exe
2df0: 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d  csql {.    PRAGM
2e00: 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d  A journal_mode =
2e10: 20 44 45 4c 45 54 45 3b 0a 20 20 20 20 43 52 45   DELETE;.    CRE
2e20: 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20  ATE TABLE t1(a, 
2e30: 62 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  b);.    INSERT I
2e40: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c  NTO t1 VALUES(1,
2e50: 20 32 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   2);.    INSERT 
2e60: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 33  INTO t1 VALUES(3
2e70: 2c 20 34 29 3b 0a 20 20 7d 0a 20 20 64 62 20 63  , 4);.  }.  db c
2e80: 6c 6f 73 65 0a 20 20 74 73 74 76 66 73 20 64 65  lose.  tstvfs de
2e90: 6c 65 74 65 0a 7d 20 7b 7d 0a 0a 66 6f 72 65 61  lete.} {}..forea
2ea0: 63 68 20 7b 74 6e 20 6f 66 73 74 20 76 61 6c 75  ch {tn ofst valu
2eb0: 65 20 72 65 73 75 6c 74 7d 20 7b 0a 20 20 20 20  e result} {.    
2ec0: 20 20 20 20 20 20 32 20 20 20 32 30 20 20 20 20        2   20    
2ed0: 33 31 20 20 20 20 20 20 20 7b 31 20 32 20 33 20  31       {1 2 3 
2ee0: 34 7d 0a 20 20 20 20 20 20 20 20 20 20 33 20 20  4}.          3  
2ef0: 20 32 30 20 20 20 20 33 32 20 20 20 20 20 20 20   20    32       
2f00: 7b 31 20 32 20 33 20 34 7d 0a 20 20 20 20 20 20  {1 2 3 4}.      
2f10: 20 20 20 20 34 20 20 20 32 30 20 20 20 20 33 33      4   20    33
2f20: 20 20 20 20 20 20 20 7b 31 20 32 20 33 20 34 7d         {1 2 3 4}
2f30: 0a 20 20 20 20 20 20 20 20 20 20 35 20 20 20 32  .          5   2
2f40: 30 20 20 20 20 36 35 35 33 36 20 20 20 20 7b 31  0    65536    {1
2f50: 20 32 20 33 20 34 7d 0a 20 20 20 20 20 20 20 20   2 3 4}.        
2f60: 20 20 36 20 20 20 32 30 20 20 20 20 31 33 31 30    6   20    1310
2f70: 37 32 20 20 20 7b 31 20 32 20 33 20 34 7d 0a 0a  72   {1 2 3 4}..
2f80: 20 20 20 20 20 20 20 20 20 20 37 20 20 20 32 34            7   24
2f90: 20 20 20 20 35 31 31 20 20 20 20 20 20 7b 31 20      511      {1 
2fa0: 32 20 33 20 34 7d 0a 20 20 20 20 20 20 20 20 20  2 3 4}.         
2fb0: 20 38 20 20 20 32 34 20 20 20 20 35 31 33 20 20   8   24    513  
2fc0: 20 20 20 20 7b 31 20 32 20 33 20 34 7d 0a 20 20      {1 2 3 4}.  
2fd0: 20 20 20 20 20 20 20 20 39 20 20 20 32 34 20 20          9   24  
2fe0: 20 20 36 35 35 33 36 20 20 20 20 7b 31 20 32 20    65536    {1 2 
2ff0: 33 20 34 7d 0a 0a 20 20 20 20 20 20 20 20 20 31  3 4}..         1
3000: 30 20 20 20 33 32 20 20 20 20 36 35 35 33 36 20  0   32    65536 
3010: 20 20 20 7b 31 20 32 7d 0a 7d 20 7b 0a 20 20 64     {1 2}.} {.  d
3020: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e  o_test pager1.4.
3030: 33 2e 24 74 6e 20 7b 0a 20 20 20 20 66 61 75 6c  3.$tn {.    faul
3040: 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64  tsim_restore_and
3050: 5f 72 65 6f 70 65 6e 0a 20 20 20 20 68 65 78 69  _reopen.    hexi
3060: 6f 5f 77 72 69 74 65 20 74 65 73 74 2e 64 62 2d  o_write test.db-
3070: 6a 6f 75 72 6e 61 6c 20 24 6f 66 73 74 20 5b 66  journal $ofst [f
3080: 6f 72 6d 61 74 20 25 2e 38 78 20 24 76 61 6c 75  ormat %.8x $valu
3090: 65 5d 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b  e].    execsql {
30a0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
30b0: 31 20 7d 0a 20 20 7d 20 24 72 65 73 75 6c 74 0a  1 }.  } $result.
30c0: 7d 0a 64 62 20 63 6c 6f 73 65 0a 0a 23 20 53 65  }.db close..# Se
30d0: 74 20 75 70 20 61 20 56 46 53 20 74 68 61 74 20  t up a VFS that 
30e0: 73 6e 61 70 73 68 6f 74 73 20 74 68 65 20 66 69  snapshots the fi
30f0: 6c 65 2d 73 79 73 74 65 6d 20 6a 75 73 74 20 62  le-system just b
3100: 65 66 6f 72 65 20 61 20 6d 61 73 74 65 72 20 6a  efore a master j
3110: 6f 75 72 6e 61 6c 0a 23 20 66 69 6c 65 20 69 73  ournal.# file is
3120: 20 64 65 6c 65 74 65 64 20 74 6f 20 63 6f 6d 6d   deleted to comm
3130: 69 74 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20  it a multi-file 
3140: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 53 70 65  transaction. Spe
3150: 63 69 66 69 63 61 6c 6c 79 2c 20 74 68 65 0a 23  cifically, the.#
3160: 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 69 73 20   file-system is 
3170: 73 61 76 65 64 20 6a 75 73 74 20 62 65 66 6f 72  saved just befor
3180: 65 20 74 68 65 20 78 44 65 6c 65 74 65 28 29 20  e the xDelete() 
3190: 63 61 6c 6c 20 74 6f 20 72 65 6d 6f 76 65 20 74  call to remove t
31a0: 68 65 20 0a 23 20 6d 61 73 74 65 72 20 6a 6f 75  he .# master jou
31b0: 72 6e 61 6c 20 66 69 6c 65 20 66 72 6f 6d 20 74  rnal file from t
31c0: 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e 0a  he file-system..
31d0: 23 0a 74 65 73 74 76 66 73 20 74 76 20 2d 64 65  #.testvfs tv -de
31e0: 66 61 75 6c 74 20 31 0a 74 76 20 73 63 72 69 70  fault 1.tv scrip
31f0: 74 20 63 6f 70 79 5f 6f 6e 5f 6d 6a 5f 64 65 6c  t copy_on_mj_del
3200: 65 74 65 0a 73 65 74 20 3a 3a 6d 6a 5f 66 69 6c  ete.set ::mj_fil
3210: 65 6e 61 6d 65 5f 6c 65 6e 67 74 68 20 30 0a 70  ename_length 0.p
3220: 72 6f 63 20 63 6f 70 79 5f 6f 6e 5f 6d 6a 5f 64  roc copy_on_mj_d
3230: 65 6c 65 74 65 20 7b 6d 65 74 68 6f 64 20 66 69  elete {method fi
3240: 6c 65 6e 61 6d 65 20 61 72 67 73 7d 20 7b 0a 20  lename args} {. 
3250: 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6d 61 74   if {[string mat
3260: 63 68 20 2a 6d 6a 2a 20 5b 66 69 6c 65 20 74 61  ch *mj* [file ta
3270: 69 6c 20 24 66 69 6c 65 6e 61 6d 65 5d 5d 7d 20  il $filename]]} 
3280: 7b 20 0a 20 20 20 20 73 65 74 20 3a 3a 6d 6a 5f  { .    set ::mj_
3290: 66 69 6c 65 6e 61 6d 65 5f 6c 65 6e 67 74 68 20  filename_length 
32a0: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
32b0: 66 69 6c 65 6e 61 6d 65 5d 0a 20 20 20 20 66 61  filename].    fa
32c0: 75 6c 74 73 69 6d 5f 73 61 76 65 20 0a 20 20 7d  ultsim_save .  }
32d0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
32e0: 5f 4f 4b 0a 7d 0a 0a 73 65 74 20 70 77 64 20 5b  _OK.}..set pwd [
32f0: 70 77 64 5d 0a 66 6f 72 65 61 63 68 20 7b 74 6e  pwd].foreach {tn
3300: 31 20 74 63 6c 7d 20 7b 0a 20 20 31 20 7b 20 73  1 tcl} {.  1 { s
3310: 65 74 20 70 72 65 66 69 78 20 22 74 65 73 74 2e  et prefix "test.
3320: 64 62 22 20 7d 0a 20 20 32 20 7b 20 0a 20 20 20  db" }.  2 { .   
3330: 20 23 20 54 68 69 73 20 74 65 73 74 20 64 65 70   # This test dep
3340: 65 6e 64 73 20 6f 6e 20 74 68 65 20 75 6e 64 65  ends on the unde
3350: 72 6c 79 69 6e 67 20 56 46 53 20 62 65 69 6e 67  rlying VFS being
3360: 20 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 70 61   able to open pa
3370: 74 68 73 0a 20 20 20 20 23 20 35 31 32 20 62 79  ths.    # 512 by
3380: 74 65 73 20 69 6e 20 6c 65 6e 67 74 68 2e 20 54  tes in length. T
3390: 68 65 20 69 64 65 61 20 69 73 20 74 6f 20 63 72  he idea is to cr
33a0: 65 61 74 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  eate a hot-journ
33b0: 61 6c 20 66 69 6c 65 20 74 68 61 74 0a 20 20 20  al file that.   
33c0: 20 23 20 63 6f 6e 74 61 69 6e 73 20 61 20 6d 61   # contains a ma
33d0: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69  ster-journal poi
33e0: 6e 74 65 72 20 73 6f 20 6c 61 72 67 65 20 74 68  nter so large th
33f0: 61 74 20 69 74 20 63 6f 75 6c 64 20 63 6f 6e 74  at it could cont
3400: 61 69 6e 0a 20 20 20 20 23 20 61 20 76 61 6c 69  ain.    # a vali
3410: 64 20 70 61 67 65 20 72 65 63 6f 72 64 20 28 69  d page record (i
3420: 66 20 74 68 65 20 66 69 6c 65 20 70 61 67 65 2d  f the file page-
3430: 73 69 7a 65 20 69 73 20 35 31 32 20 62 79 74 65  size is 512 byte
3440: 73 29 2e 20 53 6f 20 61 73 20 74 6f 0a 20 20 20  s). So as to.   
3450: 20 23 20 6d 61 6b 65 20 73 75 72 65 20 53 51 4c   # make sure SQL
3460: 69 74 65 20 64 6f 65 73 6e 27 74 20 67 65 74 20  ite doesn't get 
3470: 63 6f 6e 66 75 73 65 64 20 62 79 20 74 68 69 73  confused by this
3480: 2e 0a 20 20 20 20 23 0a 20 20 20 20 73 65 74 20  ..    #.    set 
3490: 6e 50 61 64 64 69 6e 67 20 5b 65 78 70 72 20 35  nPadding [expr 5
34a0: 31 31 20 2d 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e  11 - $::mj_filen
34b0: 61 6d 65 5f 6c 65 6e 67 74 68 5d 0a 0a 20 20 20  ame_length]..   
34c0: 20 23 20 57 65 20 63 61 6e 6e 6f 74 20 6a 75 73   # We cannot jus
34d0: 74 20 63 72 65 61 74 65 20 61 20 72 65 61 6c 6c  t create a reall
34e0: 79 20 6c 6f 6e 67 20 64 61 74 61 62 61 73 65 20  y long database 
34f0: 66 69 6c 65 20 6e 61 6d 65 20 74 6f 20 6f 70 65  file name to ope
3500: 6e 2c 20 61 73 0a 20 20 20 20 23 20 4c 69 6e 75  n, as.    # Linu
3510: 78 20 6c 69 6d 69 74 73 20 61 20 73 69 6e 67 6c  x limits a singl
3520: 65 20 63 6f 6d 70 6f 6e 65 6e 74 20 6f 66 20 61  e component of a
3530: 20 70 61 74 68 20 74 6f 20 32 35 35 20 62 79 74   path to 255 byt
3540: 65 73 20 62 79 20 64 65 66 61 75 6c 74 0a 20 20  es by default.  
3550: 20 20 23 20 28 61 6e 64 20 70 72 65 73 75 6d 61    # (and presuma
3560: 62 6c 79 20 6f 74 68 65 72 20 73 79 73 74 65 6d  bly other system
3570: 73 20 68 61 76 65 20 6c 69 6d 69 74 73 20 74 6f  s have limits to
3580: 6f 29 2e 20 53 6f 20 63 72 65 61 74 65 20 61 20  o). So create a 
3590: 64 69 72 65 63 74 6f 72 79 0a 20 20 20 20 23 20  directory.    # 
35a0: 68 69 65 72 61 72 63 68 79 20 74 6f 20 77 6f 72  hierarchy to wor
35b0: 6b 20 69 6e 2e 0a 20 20 20 20 23 0a 20 20 20 20  k in..    #.    
35c0: 73 65 74 20 64 69 72 6e 61 6d 65 20 22 64 31 32  set dirname "d12
35d0: 33 34 35 36 37 38 39 30 31 32 33 34 35 36 37 38  3456789012345678
35e0: 39 30 31 32 33 34 35 36 37 38 39 30 2f 22 0a 20  901234567890/". 
35f0: 20 20 20 73 65 74 20 6e 44 69 72 20 5b 65 78 70     set nDir [exp
3600: 72 20 24 6e 50 61 64 64 69 6e 67 20 2f 20 33 32  r $nPadding / 32
3610: 5d 0a 20 20 20 20 69 66 20 7b 20 24 6e 44 69 72  ].    if { $nDir
3620: 20 7d 20 7b 0a 20 20 20 20 20 20 73 65 74 20 70   } {.      set p
3630: 20 5b 73 74 72 69 6e 67 20 72 65 70 65 61 74 20   [string repeat 
3640: 24 64 69 72 6e 61 6d 65 20 24 6e 44 69 72 5d 0a  $dirname $nDir].
3650: 20 20 20 20 20 20 66 69 6c 65 20 6d 6b 64 69 72        file mkdir
3660: 20 24 70 0a 20 20 20 20 20 20 63 64 20 24 70 0a   $p.      cd $p.
3670: 20 20 20 20 7d 0a 0a 20 20 20 20 73 65 74 20 70      }..    set p
3680: 61 64 64 69 6e 67 20 5b 73 74 72 69 6e 67 20 72  adding [string r
3690: 65 70 65 61 74 20 78 20 5b 65 78 70 72 20 24 6e  epeat x [expr $n
36a0: 50 61 64 64 69 6e 67 20 25 33 32 5d 5d 0a 20 20  Padding %32]].  
36b0: 20 20 73 65 74 20 70 72 65 66 69 78 20 22 74 65    set prefix "te
36c0: 73 74 2e 64 62 24 7b 70 61 64 64 69 6e 67 7d 22  st.db${padding}"
36d0: 0a 20 20 7d 0a 7d 20 7b 0a 20 20 65 76 61 6c 20  .  }.} {.  eval 
36e0: 24 74 63 6c 0a 20 20 66 6f 72 65 61 63 68 20 7b  $tcl.  foreach {
36f0: 74 6e 32 20 73 71 6c 7d 20 7b 0a 20 20 20 20 6f  tn2 sql} {.    o
3700: 20 7b 20 0a 20 20 20 20 20 20 50 52 41 47 4d 41   { .      PRAGMA
3710: 20 6d 61 69 6e 2e 73 79 6e 63 68 72 6f 6e 6f 75   main.synchronou
3720: 73 3d 4f 46 46 3b 0a 20 20 20 20 20 20 50 52 41  s=OFF;.      PRA
3730: 47 4d 41 20 61 75 78 2e 73 79 6e 63 68 72 6f 6e  GMA aux.synchron
3740: 6f 75 73 3d 4f 46 46 3b 0a 20 20 20 20 7d 0a 20  ous=OFF;.    }. 
3750: 20 20 20 6f 35 31 32 20 7b 20 0a 20 20 20 20 20     o512 { .     
3760: 20 50 52 41 47 4d 41 20 6d 61 69 6e 2e 73 79 6e   PRAGMA main.syn
3770: 63 68 72 6f 6e 6f 75 73 3d 4f 46 46 3b 0a 20 20  chronous=OFF;.  
3780: 20 20 20 20 50 52 41 47 4d 41 20 61 75 78 2e 73      PRAGMA aux.s
3790: 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46 46 3b 0a  ynchronous=OFF;.
37a0: 20 20 20 20 20 20 50 52 41 47 4d 41 20 6d 61 69        PRAGMA mai
37b0: 6e 2e 70 61 67 65 5f 73 69 7a 65 20 3d 20 35 31  n.page_size = 51
37c0: 32 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20  2;.      PRAGMA 
37d0: 61 75 78 2e 70 61 67 65 5f 73 69 7a 65 20 3d 20  aux.page_size = 
37e0: 35 31 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  512;.    }.    n
37f0: 20 7b 20 0a 20 20 20 20 20 20 50 52 41 47 4d 41   { .      PRAGMA
3800: 20 6d 61 69 6e 2e 73 79 6e 63 68 72 6f 6e 6f 75   main.synchronou
3810: 73 3d 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 20 20  s=NORMAL;.      
3820: 50 52 41 47 4d 41 20 61 75 78 2e 73 79 6e 63 68  PRAGMA aux.synch
3830: 72 6f 6e 6f 75 73 3d 4e 4f 52 4d 41 4c 3b 0a 20  ronous=NORMAL;. 
3840: 20 20 20 7d 0a 20 20 20 20 66 20 7b 20 0a 20 20     }.    f { .  
3850: 20 20 20 20 50 52 41 47 4d 41 20 6d 61 69 6e 2e      PRAGMA main.
3860: 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 46 55 4c 4c  synchronous=FULL
3870: 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 61  ;.      PRAGMA a
3880: 75 78 2e 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 46  ux.synchronous=F
3890: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b  ULL;.    }.  } {
38a0: 0a 0a 20 20 20 20 73 65 74 20 74 6e 20 22 24 7b  ..    set tn "${
38b0: 74 6e 31 7d 2e 24 7b 74 6e 32 7d 22 0a 20 20 0a  tn1}.${tn2}".  .
38c0: 20 20 20 20 23 20 53 65 74 20 75 70 20 61 20 63      # Set up a c
38d0: 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 68 61 76  onnection to hav
38e0: 65 20 74 77 6f 20 64 61 74 61 62 61 73 65 73 2c  e two databases,
38f0: 20 74 65 73 74 2e 64 62 20 28 6d 61 69 6e 29 20   test.db (main) 
3900: 61 6e 64 20 0a 20 20 20 20 23 20 74 65 73 74 2e  and .    # test.
3910: 64 62 32 20 28 61 75 78 29 2e 20 54 68 65 6e 20  db2 (aux). Then 
3920: 72 75 6e 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65  run a multi-file
3930: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20   transaction on 
3940: 74 68 65 6d 2e 20 54 68 65 0a 20 20 20 20 23 20  them. The.    # 
3950: 56 46 53 20 77 69 6c 6c 20 73 6e 61 70 73 68 6f  VFS will snapsho
3960: 74 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  t the file-syste
3970: 6d 20 6a 75 73 74 20 62 65 66 6f 72 65 20 74 68  m just before th
3980: 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  e master-journal
3990: 0a 20 20 20 20 23 20 66 69 6c 65 20 69 73 20 64  .    # file is d
39a0: 65 6c 65 74 65 64 20 74 6f 20 63 6f 6d 6d 69 74  eleted to commit
39b0: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
39c0: 2e 0a 20 20 20 20 23 0a 20 20 20 20 74 76 20 66  ..    #.    tv f
39d0: 69 6c 74 65 72 20 78 44 65 6c 65 74 65 0a 20 20  ilter xDelete.  
39e0: 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
39f0: 2d 34 2e 34 2e 24 74 6e 2e 31 20 7b 0a 20 20 20  -4.4.$tn.1 {.   
3a00: 20 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65     faultsim_dele
3a10: 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 20 24 70  te_and_reopen $p
3a20: 72 65 66 69 78 0a 20 20 20 20 20 20 65 78 65 63  refix.      exec
3a30: 73 71 6c 20 22 0a 20 20 20 20 20 20 20 20 41 54  sql ".        AT
3a40: 54 41 43 48 20 27 24 7b 70 72 65 66 69 78 7d 32  TACH '${prefix}2
3a50: 27 20 41 53 20 61 75 78 3b 0a 20 20 20 20 20 20  ' AS aux;.      
3a60: 20 20 24 73 71 6c 0a 20 20 20 20 20 20 20 20 43    $sql.        C
3a70: 52 45 41 54 45 20 54 41 42 4c 45 20 61 28 78 29  REATE TABLE a(x)
3a80: 3b 0a 20 20 20 20 20 20 20 20 43 52 45 41 54 45  ;.        CREATE
3a90: 20 54 41 42 4c 45 20 61 75 78 2e 62 28 78 29 3b   TABLE aux.b(x);
3aa0: 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20  .        INSERT 
3ab0: 49 4e 54 4f 20 61 20 56 41 4c 55 45 53 28 27 64  INTO a VALUES('d
3ac0: 6f 75 62 6c 65 2d 79 6f 75 27 29 3b 0a 20 20 20  ouble-you');.   
3ad0: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
3ae0: 20 61 20 56 41 4c 55 45 53 28 27 77 68 79 27 29   a VALUES('why')
3af0: 3b 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54  ;.        INSERT
3b00: 20 49 4e 54 4f 20 61 20 56 41 4c 55 45 53 28 27   INTO a VALUES('
3b10: 7a 65 64 27 29 3b 0a 20 20 20 20 20 20 20 20 49  zed');.        I
3b20: 4e 53 45 52 54 20 49 4e 54 4f 20 62 20 56 41 4c  NSERT INTO b VAL
3b30: 55 45 53 28 27 77 6f 6e 27 29 3b 0a 20 20 20 20  UES('won');.    
3b40: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
3b50: 62 20 56 41 4c 55 45 53 28 27 74 6f 6f 27 29 3b  b VALUES('too');
3b60: 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20  .        INSERT 
3b70: 49 4e 54 4f 20 62 20 56 41 4c 55 45 53 28 27 66  INTO b VALUES('f
3b80: 72 65 65 27 29 3b 0a 20 20 20 20 20 20 22 0a 20  ree');.      ". 
3b90: 20 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20       execsql {. 
3ba0: 20 20 20 20 20 20 20 42 45 47 49 4e 3b 0a 20 20         BEGIN;.  
3bb0: 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49          INSERT I
3bc0: 4e 54 4f 20 61 20 53 45 4c 45 43 54 20 2a 20 46  NTO a SELECT * F
3bd0: 52 4f 4d 20 62 20 57 48 45 52 45 20 72 6f 77 69  ROM b WHERE rowi
3be0: 64 3c 3d 33 3b 0a 20 20 20 20 20 20 20 20 20 20  d<=3;.          
3bf0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 62 20 53 45  INSERT INTO b SE
3c00: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 61 20 57 48  LECT * FROM a WH
3c10: 45 52 45 20 72 6f 77 69 64 3c 3d 33 3b 0a 20 20  ERE rowid<=3;.  
3c20: 20 20 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20        COMMIT;.  
3c30: 20 20 20 20 7d 0a 20 20 20 20 7d 20 7b 7d 0a 20      }.    } {}. 
3c40: 20 20 20 74 76 20 66 69 6c 74 65 72 20 7b 7d 0a     tv filter {}.
3c50: 20 20 20 20 0a 20 20 20 20 23 20 43 68 65 63 6b      .    # Check
3c60: 20 74 68 61 74 20 74 68 65 20 74 72 61 6e 73 61   that the transa
3c70: 63 74 69 6f 6e 20 77 61 73 20 63 6f 6d 6d 69 74  ction was commit
3c80: 74 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ted successfully
3c90: 2e 0a 20 20 20 20 23 0a 20 20 20 20 64 6f 5f 65  ..    #.    do_e
3ca0: 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65  xecsql_test page
3cb0: 72 31 2d 34 2e 34 2e 24 74 6e 2e 32 20 7b 0a 20  r1-4.4.$tn.2 {. 
3cc0: 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52       SELECT * FR
3cd0: 4f 4d 20 61 0a 20 20 20 20 7d 20 7b 64 6f 75 62  OM a.    } {doub
3ce0: 6c 65 2d 79 6f 75 20 77 68 79 20 7a 65 64 20 77  le-you why zed w
3cf0: 6f 6e 20 74 6f 6f 20 66 72 65 65 7d 0a 20 20 20  on too free}.   
3d00: 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74   do_execsql_test
3d10: 20 70 61 67 65 72 31 2d 34 2e 34 2e 24 74 6e 2e   pager1-4.4.$tn.
3d20: 33 20 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54  3 {.      SELECT
3d30: 20 2a 20 46 52 4f 4d 20 62 0a 20 20 20 20 7d 20   * FROM b.    } 
3d40: 7b 77 6f 6e 20 74 6f 6f 20 66 72 65 65 20 64 6f  {won too free do
3d50: 75 62 6c 65 2d 79 6f 75 20 77 68 79 20 7a 65 64  uble-you why zed
3d60: 7d 0a 20 20 20 20 0a 20 20 20 20 23 20 52 65 73  }.    .    # Res
3d70: 74 6f 72 65 20 74 68 65 20 66 69 6c 65 2d 73 79  tore the file-sy
3d80: 73 74 65 6d 20 61 6e 64 20 72 65 6f 70 65 6e 20  stem and reopen 
3d90: 74 68 65 20 64 61 74 61 62 61 73 65 73 2e 20 43  the databases. C
3da0: 68 65 63 6b 20 74 68 61 74 20 69 74 20 6e 6f 77  heck that it now
3db0: 0a 20 20 20 20 23 20 61 70 70 65 61 72 73 20 74  .    # appears t
3dc0: 68 61 74 20 74 68 65 20 74 72 61 6e 73 61 63 74  hat the transact
3dd0: 69 6f 6e 20 77 61 73 20 6e 6f 74 20 63 6f 6d 6d  ion was not comm
3de0: 69 74 74 65 64 20 28 62 65 63 61 75 73 65 20 74  itted (because t
3df0: 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 0a 20  he file-system. 
3e00: 20 20 20 23 20 77 61 73 20 72 65 73 74 6f 72 65     # was restore
3e10: 64 20 74 6f 20 74 68 65 20 73 74 61 74 65 20 77  d to the state w
3e20: 68 65 72 65 20 69 74 20 68 61 64 20 6e 6f 74 20  here it had not 
3e30: 62 65 65 6e 29 2e 0a 20 20 20 20 23 0a 20 20 20  been)..    #.   
3e40: 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
3e50: 34 2e 34 2e 24 74 6e 2e 34 20 7b 0a 20 20 20 20  4.4.$tn.4 {.    
3e60: 20 20 66 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f    faultsim_resto
3e70: 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 20 24 70  re_and_reopen $p
3e80: 72 65 66 69 78 0a 20 20 20 20 20 20 65 78 65 63  refix.      exec
3e90: 73 71 6c 20 22 41 54 54 41 43 48 20 27 24 7b 70  sql "ATTACH '${p
3ea0: 72 65 66 69 78 7d 32 27 20 41 53 20 61 75 78 22  refix}2' AS aux"
3eb0: 0a 20 20 20 20 7d 20 7b 7d 0a 20 20 20 20 64 6f  .    } {}.    do
3ec0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61  _execsql_test pa
3ed0: 67 65 72 31 2d 34 2e 34 2e 24 74 6e 2e 35 20 7b  ger1-4.4.$tn.5 {
3ee0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 61 7d  SELECT * FROM a}
3ef0: 20 7b 64 6f 75 62 6c 65 2d 79 6f 75 20 77 68 79   {double-you why
3f00: 20 7a 65 64 7d 0a 20 20 20 20 64 6f 5f 65 78 65   zed}.    do_exe
3f10: 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31  csql_test pager1
3f20: 2d 34 2e 34 2e 24 74 6e 2e 36 20 7b 53 45 4c 45  -4.4.$tn.6 {SELE
3f30: 43 54 20 2a 20 46 52 4f 4d 20 62 7d 20 7b 77 6f  CT * FROM b} {wo
3f40: 6e 20 74 6f 6f 20 66 72 65 65 7d 0a 20 20 20 20  n too free}.    
3f50: 0a 20 20 20 20 23 20 52 65 73 74 6f 72 65 20 74  .    # Restore t
3f60: 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 61  he file-system a
3f70: 67 61 69 6e 2e 20 54 68 69 73 20 74 69 6d 65 2c  gain. This time,
3f80: 20 62 65 66 6f 72 65 20 72 65 6f 70 65 6e 69 6e   before reopenin
3f90: 67 20 74 68 65 20 64 61 74 61 62 61 73 65 73 2c  g the databases,
3fa0: 0a 20 20 20 20 23 20 64 65 6c 65 74 65 20 74 68  .    # delete th
3fb0: 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  e master-journal
3fc0: 20 66 69 6c 65 20 66 72 6f 6d 20 74 68 65 20 66   file from the f
3fd0: 69 6c 65 2d 73 79 73 74 65 6d 2e 20 49 74 20 6e  ile-system. It n
3fe0: 6f 77 20 61 70 70 65 61 72 73 20 74 68 61 74 0a  ow appears that.
3ff0: 20 20 20 20 23 20 74 68 65 20 74 72 61 6e 73 61      # the transa
4000: 63 74 69 6f 6e 20 77 61 73 20 63 6f 6d 6d 69 74  ction was commit
4010: 74 65 64 20 28 6e 6f 20 6d 61 73 74 65 72 2d 6a  ted (no master-j
4020: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 3d 3d 20 6e  ournal file == n
4030: 6f 20 72 6f 6c 6c 62 61 63 6b 29 2e 0a 20 20 20  o rollback)..   
4040: 20 23 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 70   #.    do_test p
4050: 61 67 65 72 31 2d 34 2e 34 2e 24 74 6e 2e 37 20  ager1-4.4.$tn.7 
4060: 7b 0a 20 20 20 20 20 20 66 61 75 6c 74 73 69 6d  {.      faultsim
4070: 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f  _restore_and_reo
4080: 70 65 6e 20 24 70 72 65 66 69 78 0a 20 20 20 20  pen $prefix.    
4090: 20 20 66 6f 72 65 61 63 68 20 66 20 5b 67 6c 6f    foreach f [glo
40a0: 62 20 24 7b 70 72 65 66 69 78 7d 2d 6d 6a 2a 5d  b ${prefix}-mj*]
40b0: 20 7b 20 66 69 6c 65 20 64 65 6c 65 74 65 20 2d   { file delete -
40c0: 66 6f 72 63 65 20 24 66 20 7d 0a 20 20 20 20 20  force $f }.     
40d0: 20 65 78 65 63 73 71 6c 20 22 41 54 54 41 43 48   execsql "ATTACH
40e0: 20 27 24 7b 70 72 65 66 69 78 7d 32 27 20 41 53   '${prefix}2' AS
40f0: 20 61 75 78 22 0a 20 20 20 20 7d 20 7b 7d 0a 20   aux".    } {}. 
4100: 20 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65     do_execsql_te
4110: 73 74 20 70 61 67 65 72 31 2d 34 2e 34 2e 24 74  st pager1-4.4.$t
4120: 6e 2e 38 20 7b 0a 20 20 20 20 20 20 53 45 4c 45  n.8 {.      SELE
4130: 43 54 20 2a 20 46 52 4f 4d 20 61 0a 20 20 20 20  CT * FROM a.    
4140: 7d 20 7b 64 6f 75 62 6c 65 2d 79 6f 75 20 77 68  } {double-you wh
4150: 79 20 7a 65 64 20 77 6f 6e 20 74 6f 6f 20 66 72  y zed won too fr
4160: 65 65 7d 0a 20 20 20 20 64 6f 5f 65 78 65 63 73  ee}.    do_execs
4170: 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 34  ql_test pager1-4
4180: 2e 34 2e 24 74 6e 2e 39 20 7b 0a 20 20 20 20 20  .4.$tn.9 {.     
4190: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 62   SELECT * FROM b
41a0: 0a 20 20 20 20 7d 20 7b 77 6f 6e 20 74 6f 6f 20  .    } {won too 
41b0: 66 72 65 65 20 64 6f 75 62 6c 65 2d 79 6f 75 20  free double-you 
41c0: 77 68 79 20 7a 65 64 7d 0a 20 20 7d 0a 0a 20 20  why zed}.  }..  
41d0: 63 64 20 24 70 77 64 0a 7d 0a 64 62 20 63 6c 6f  cd $pwd.}.db clo
41e0: 73 65 0a 74 76 20 64 65 6c 65 74 65 0a 66 69 6c  se.tv delete.fil
41f0: 65 20 64 65 6c 65 74 65 20 2d 66 6f 72 63 65 20  e delete -force 
4200: 24 64 69 72 6e 61 6d 65 0a 0a 0a 23 20 53 65 74  $dirname...# Set
4210: 20 75 70 20 61 20 56 46 53 20 74 6f 20 6d 61 6b   up a VFS to mak
4220: 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  e a copy of the 
4230: 66 69 6c 65 2d 73 79 73 74 65 6d 20 6a 75 73 74  file-system just
4240: 20 62 65 66 6f 72 65 20 64 65 6c 65 74 69 6e 67   before deleting
4250: 20 61 0a 23 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   a.# journal fil
4260: 65 20 74 6f 20 63 6f 6d 6d 69 74 20 61 20 74 72  e to commit a tr
4270: 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 74  ansaction. The t
4280: 72 61 6e 73 61 63 74 69 6f 6e 20 6d 6f 64 69 66  ransaction modif
4290: 69 65 73 20 65 78 61 63 74 6c 79 0a 23 20 74 77  ies exactly.# tw
42a0: 6f 20 64 61 74 61 62 61 73 65 20 70 61 67 65 73  o database pages
42b0: 20 28 61 6e 64 20 70 61 67 65 20 31 20 2d 20 74   (and page 1 - t
42c0: 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65  he change counte
42d0: 72 29 2e 0a 23 0a 74 65 73 74 76 66 73 20 74 76  r)..#.testvfs tv
42e0: 20 2d 64 65 66 61 75 6c 74 20 31 0a 74 76 20 73   -default 1.tv s
42f0: 65 63 74 6f 72 73 69 7a 65 20 35 31 32 0a 74 76  ectorsize 512.tv
4300: 20 73 63 72 69 70 74 20 63 6f 70 79 5f 6f 6e 5f   script copy_on_
4310: 6a 6f 75 72 6e 61 6c 5f 64 65 6c 65 74 65 0a 74  journal_delete.t
4320: 76 20 66 69 6c 74 65 72 20 78 44 65 6c 65 74 65  v filter xDelete
4330: 0a 73 65 74 20 3a 3a 6d 6a 5f 66 69 6c 65 6e 61  .set ::mj_filena
4340: 6d 65 5f 6c 65 6e 67 74 68 20 30 0a 70 72 6f 63  me_length 0.proc
4350: 20 63 6f 70 79 5f 6f 6e 5f 6a 6f 75 72 6e 61 6c   copy_on_journal
4360: 5f 64 65 6c 65 74 65 20 7b 6d 65 74 68 6f 64 20  _delete {method 
4370: 66 69 6c 65 6e 61 6d 65 20 61 72 67 73 7d 20 7b  filename args} {
4380: 0a 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6d  .  if {[string m
4390: 61 74 63 68 20 2a 6a 6f 75 72 6e 61 6c 20 24 66  atch *journal $f
43a0: 69 6c 65 6e 61 6d 65 5d 7d 20 66 61 75 6c 74 73  ilename]} faults
43b0: 69 6d 5f 73 61 76 65 20 0a 20 20 72 65 74 75 72  im_save .  retur
43c0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 7d 0a 66 61  n SQLITE_OK.}.fa
43d0: 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e  ultsim_delete_an
43e0: 64 5f 72 65 6f 70 65 6e 0a 64 6f 5f 65 78 65 63  d_reopen.do_exec
43f0: 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2e  sql_test pager1.
4400: 34 2e 35 2e 31 20 7b 0a 20 20 50 52 41 47 4d 41  4.5.1 {.  PRAGMA
4410: 20 70 61 67 65 5f 73 69 7a 65 20 3d 20 31 30 32   page_size = 102
4420: 34 3b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c  4;.  CREATE TABL
4430: 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 43 52  E t1(a, b);.  CR
4440: 45 41 54 45 20 54 41 42 4c 45 20 74 32 28 61 2c  EATE TABLE t2(a,
4450: 20 62 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e   b);.  INSERT IN
4460: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27 49 27  TO t1 VALUES('I'
4470: 2c 20 27 49 49 27 29 3b 0a 20 20 49 4e 53 45 52  , 'II');.  INSER
4480: 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53  T INTO t2 VALUES
4490: 28 27 49 49 49 27 2c 20 27 49 56 27 29 3b 0a 20  ('III', 'IV');. 
44a0: 20 42 45 47 49 4e 3b 0a 20 20 20 20 49 4e 53 45   BEGIN;.    INSE
44b0: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
44c0: 53 28 31 2c 20 32 29 3b 0a 20 20 20 20 49 4e 53  S(1, 2);.    INS
44d0: 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55  ERT INTO t2 VALU
44e0: 45 53 28 33 2c 20 34 29 3b 0a 20 20 43 4f 4d 4d  ES(3, 4);.  COMM
44f0: 49 54 3b 0a 7d 20 7b 7d 0a 74 76 20 66 69 6c 74  IT;.} {}.tv filt
4500: 65 72 20 7b 7d 0a 0a 23 20 43 68 65 63 6b 20 74  er {}..# Check t
4510: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  he transaction w
4520: 61 73 20 63 6f 6d 6d 69 74 74 65 64 3a 0a 23 0a  as committed:.#.
4530: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
4540: 70 61 67 65 72 31 2e 34 2e 35 2e 32 20 7b 0a 20  pager1.4.5.2 {. 
4550: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
4560: 31 3b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52  1;.  SELECT * FR
4570: 4f 4d 20 74 32 3b 0a 7d 20 7b 49 20 49 49 20 31  OM t2;.} {I II 1
4580: 20 32 20 49 49 49 20 49 56 20 33 20 34 7d 0a 0a   2 III IV 3 4}..
4590: 23 20 4e 6f 77 20 74 72 79 20 74 68 72 65 65 20  # Now try three 
45a0: 74 65 73 74 73 3a 0a 23 0a 23 20 20 70 61 67 65  tests:.#.#  page
45b0: 72 31 2d 34 2e 35 2e 33 3a 20 52 65 73 74 6f 72  r1-4.5.3: Restor
45c0: 65 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  e the file-syste
45d0: 6d 2e 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  m. Check that th
45e0: 65 20 77 68 6f 6c 65 20 74 72 61 6e 73 61 63 74  e whole transact
45f0: 69 6f 6e 20 0a 23 20 20 20 20 20 20 20 20 20 20  ion .#          
4600: 20 20 20 20 20 20 69 73 20 72 6f 6c 6c 65 64 20        is rolled 
4610: 62 61 63 6b 2e 0a 23 0a 23 20 20 70 61 67 65 72  back..#.#  pager
4620: 31 2d 34 2e 35 2e 34 3a 20 52 65 73 74 6f 72 65  1-4.5.4: Restore
4630: 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
4640: 2e 20 43 6f 72 72 75 70 74 20 74 68 65 20 66 69  . Corrupt the fi
4650: 72 73 74 20 72 65 63 6f 72 64 20 69 6e 20 74 68  rst record in th
4660: 65 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20  e.#             
4670: 20 20 20 6a 6f 75 72 6e 61 6c 2e 20 43 68 65 63     journal. Chec
4680: 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  k the transactio
4690: 6e 20 69 73 20 6e 6f 74 20 72 6f 6c 6c 65 64 20  n is not rolled 
46a0: 62 61 63 6b 2e 0a 23 0a 23 20 20 70 61 67 65 72  back..#.#  pager
46b0: 31 2d 34 2e 35 2e 35 3a 20 52 65 73 74 6f 72 65  1-4.5.5: Restore
46c0: 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
46d0: 2e 20 43 6f 72 72 75 70 74 20 74 68 65 20 73 65  . Corrupt the se
46e0: 63 6f 6e 64 20 72 65 63 6f 72 64 20 69 6e 20 74  cond record in t
46f0: 68 65 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  he.#            
4700: 20 20 20 20 6a 6f 75 72 6e 61 6c 2e 20 43 68 65      journal. Che
4710: 63 6b 20 74 68 61 74 20 74 68 65 20 66 69 72 73  ck that the firs
4720: 74 20 72 65 63 6f 72 64 20 69 6e 20 74 68 65 20  t record in the 
4730: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 0a  transaction is .
4740: 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  #               
4750: 20 70 6c 61 79 65 64 20 62 61 63 6b 2c 20 62 75   played back, bu
4760: 74 20 6e 6f 74 20 74 68 65 20 73 65 63 6f 6e 64  t not the second
4770: 2e 0a 23 0a 66 61 75 6c 74 73 69 6d 5f 72 65 73  ..#.faultsim_res
4780: 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a  tore_and_reopen.
4790: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
47a0: 70 61 67 65 72 31 2e 34 2e 35 2e 33 20 7b 0a 20  pager1.4.5.3 {. 
47b0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
47c0: 31 3b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52  1;.  SELECT * FR
47d0: 4f 4d 20 74 32 3b 0a 7d 20 7b 49 20 49 49 20 49  OM t2;.} {I II I
47e0: 49 49 20 49 56 7d 0a 66 61 75 6c 74 73 69 6d 5f  II IV}.faultsim_
47f0: 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70  restore_and_reop
4800: 65 6e 0a 68 65 78 69 6f 5f 77 72 69 74 65 20 74  en.hexio_write t
4810: 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 5b  est.db-journal [
4820: 65 78 70 72 20 35 31 32 2b 34 2b 31 30 32 34 20  expr 512+4+1024 
4830: 2d 20 32 30 32 5d 20 30 31 32 33 34 35 36 37 38  - 202] 012345678
4840: 39 41 42 43 44 45 46 0a 64 6f 5f 65 78 65 63 73  9ABCDEF.do_execs
4850: 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34  ql_test pager1.4
4860: 2e 35 2e 34 20 7b 0a 20 20 53 45 4c 45 43 54 20  .5.4 {.  SELECT 
4870: 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 53 45 4c  * FROM t1;.  SEL
4880: 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 7d  ECT * FROM t2;.}
4890: 20 7b 49 20 49 49 20 31 20 32 20 49 49 49 20 49   {I II 1 2 III I
48a0: 56 20 33 20 34 7d 0a 66 61 75 6c 74 73 69 6d 5f  V 3 4}.faultsim_
48b0: 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70  restore_and_reop
48c0: 65 6e 0a 68 65 78 69 6f 5f 77 72 69 74 65 20 74  en.hexio_write t
48d0: 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 5b  est.db-journal [
48e0: 65 78 70 72 20 35 31 32 2b 34 2b 31 30 32 34 2b  expr 512+4+1024+
48f0: 34 2b 34 2b 31 30 32 34 20 2d 20 32 30 32 5d 20  4+4+1024 - 202] 
4900: 30 31 32 33 34 35 36 37 38 39 41 42 43 44 45 46  0123456789ABCDEF
4910: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
4920: 20 70 61 67 65 72 31 2e 34 2e 35 2e 35 20 7b 0a   pager1.4.5.5 {.
4930: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
4940: 74 31 3b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46  t1;.  SELECT * F
4950: 52 4f 4d 20 74 32 3b 0a 7d 20 7b 49 20 49 49 20  ROM t2;.} {I II 
4960: 49 49 49 20 49 56 20 33 20 34 7d 0a 0a 64 62 20  III IV 3 4}..db 
4970: 63 6c 6f 73 65 0a 74 76 20 64 65 6c 65 74 65 0a  close.tv delete.
4980: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
4990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
49a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
49b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
49c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68  -----------.# Th
49d0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74  e following test
49e0: 73 20 64 65 61 6c 20 77 69 74 68 20 6d 75 6c 74  s deal with mult
49f0: 69 2d 66 69 6c 65 20 63 6f 6d 6d 69 74 73 2e 0a  i-file commits..
4a00: 23 0a 23 20 70 61 67 65 72 31 2d 35 2e 31 2e 2a  #.# pager1-5.1.*
4a10: 3a 20 54 68 65 20 63 61 73 65 20 77 68 65 72 65  : The case where
4a20: 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 63 61   a multi-file ca
4a30: 6e 6e 6f 74 20 62 65 20 63 6f 6d 6d 69 74 74 65  nnot be committe
4a40: 64 20 62 65 63 61 75 73 65 0a 23 20 20 20 20 20  d because.#     
4a50: 20 20 20 20 20 20 20 20 20 20 61 6e 6f 74 68 65            anothe
4a60: 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20  r connection is 
4a70: 68 6f 6c 64 69 6e 67 20 61 20 53 48 41 52 45 44  holding a SHARED
4a80: 20 6c 6f 63 6b 20 6f 6e 20 6f 6e 65 20 6f 66 20   lock on one of 
4a90: 74 68 65 0a 23 20 20 20 20 20 20 20 20 20 20 20  the.#           
4aa0: 20 20 20 20 66 69 6c 65 73 2e 20 41 66 74 65 72      files. After
4ab0: 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b   the SHARED lock
4ac0: 20 69 73 20 72 65 6d 6f 76 65 64 2c 20 74 68 65   is removed, the
4ad0: 20 43 4f 4d 4d 49 54 20 73 75 63 63 65 65 64 73   COMMIT succeeds
4ae0: 2e 0a 23 0a 23 20 70 61 67 65 72 31 2d 35 2e 32  ..#.# pager1-5.2
4af0: 2e 2a 3a 20 4d 75 6c 74 69 2d 66 69 6c 65 20 63  .*: Multi-file c
4b00: 6f 6d 6d 69 74 73 20 77 69 74 68 20 6a 6f 75 72  ommits with jour
4b10: 6e 61 6c 5f 6d 6f 64 65 3d 6d 65 6d 6f 72 79 2e  nal_mode=memory.
4b20: 0a 23 0a 23 20 70 61 67 65 72 31 2d 35 2e 33 2e  .#.# pager1-5.3.
4b30: 2a 3a 20 4d 75 6c 74 69 2d 66 69 6c 65 20 63 6f  *: Multi-file co
4b40: 6d 6d 69 74 73 20 77 69 74 68 20 6a 6f 75 72 6e  mmits with journ
4b50: 61 6c 5f 6d 6f 64 65 3d 6d 65 6d 6f 72 79 2e 0a  al_mode=memory..
4b60: 23 0a 23 20 70 61 67 65 72 31 2d 35 2e 34 2e 2a  #.# pager1-5.4.*
4b70: 3a 20 43 68 65 63 6b 20 74 68 61 74 20 77 69 74  : Check that wit
4b80: 68 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 6e 6f  h synchronous=no
4b90: 72 6d 61 6c 2c 20 74 68 65 20 6d 61 73 74 65 72  rmal, the master
4ba0: 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 23 20  -journal file.# 
4bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 61                na
4bc0: 6d 65 20 69 73 20 61 64 64 65 64 20 74 6f 20 61  me is added to a
4bd0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6d   journal file im
4be0: 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20  mediately after 
4bf0: 74 68 65 20 6c 61 73 74 0a 23 20 20 20 20 20 20  the last.#      
4c00: 20 20 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c           journal
4c10: 20 72 65 63 6f 72 64 2e 20 42 75 74 20 77 69 74   record. But wit
4c20: 68 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 66 75  h synchronous=fu
4c30: 6c 6c 2c 20 65 78 74 72 61 20 75 6e 75 73 65 64  ll, extra unused
4c40: 20 73 70 61 63 65 0a 23 20 20 20 20 20 20 20 20   space.#        
4c50: 20 20 20 20 20 20 20 69 73 20 61 6c 6c 6f 63 61         is alloca
4c60: 74 65 64 20 62 65 74 77 65 65 6e 20 74 68 65 20  ted between the 
4c70: 6c 61 73 74 20 6a 6f 75 72 6e 61 6c 20 72 65 63  last journal rec
4c80: 6f 72 64 20 61 6e 64 20 74 68 65 20 0a 23 20 20  ord and the .#  
4c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 61 73               mas
4ca0: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter-journal file
4cb0: 20 6e 61 6d 65 20 73 6f 20 74 68 61 74 20 74 68   name so that th
4cc0: 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  e master-journal
4cd0: 20 66 69 6c 65 0a 23 20 20 20 20 20 20 20 20 20   file.#         
4ce0: 20 20 20 20 20 20 6e 61 6d 65 20 64 6f 65 73 20        name does 
4cf0: 6e 6f 74 20 6c 69 65 20 6f 6e 20 74 68 65 20 73  not lie on the s
4d00: 61 6d 65 20 73 65 63 74 6f 72 20 61 73 20 74 68  ame sector as th
4d10: 65 20 6c 61 73 74 20 6a 6f 75 72 6e 61 6c 20 66  e last journal f
4d20: 69 6c 65 0a 23 20 20 20 20 20 20 20 20 20 20 20  ile.#           
4d30: 20 20 20 20 72 65 63 6f 72 64 2e 0a 23 0a 23 20      record..#.# 
4d40: 70 61 67 65 72 31 2d 35 2e 35 2e 2a 3a 20 43 68  pager1-5.5.*: Ch
4d50: 65 63 6b 20 74 68 61 74 20 69 6e 20 6a 6f 75 72  eck that in jour
4d60: 6e 61 6c 5f 6d 6f 64 65 3d 50 45 52 53 49 53 54  nal_mode=PERSIST
4d70: 20 6d 6f 64 65 2c 20 61 20 6a 6f 75 72 6e 61 6c   mode, a journal
4d80: 20 66 69 6c 65 20 69 73 0a 23 20 20 20 20 20 20   file is.#      
4d90: 20 20 20 20 20 20 20 20 20 74 72 75 6e 63 61 74           truncat
4da0: 65 64 20 74 6f 20 7a 65 72 6f 20 62 79 74 65 73  ed to zero bytes
4db0: 20 77 68 65 6e 20 61 20 6d 75 6c 74 69 2d 66 69   when a multi-fi
4dc0: 6c 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  le transaction i
4dd0: 73 20 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  s .#            
4de0: 20 20 20 63 6f 6d 6d 69 74 74 65 64 20 28 69 6e     committed (in
4df0: 73 74 65 61 64 20 6f 66 20 74 68 65 20 66 69 72  stead of the fir
4e00: 73 74 20 63 6f 75 70 6c 65 20 6f 66 20 62 79 74  st couple of byt
4e10: 65 73 20 62 65 69 6e 67 20 7a 65 72 6f 65 64 29  es being zeroed)
4e20: 2e 0a 23 0a 23 0a 64 6f 5f 74 65 73 74 20 70 61  ..#.#.do_test pa
4e30: 67 65 72 31 2d 35 2e 31 2e 31 20 7b 0a 20 20 66  ger1-5.1.1 {.  f
4e40: 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61  aultsim_delete_a
4e50: 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65 63  nd_reopen.  exec
4e60: 73 71 6c 20 7b 0a 20 20 20 20 41 54 54 41 43 48  sql {.    ATTACH
4e70: 20 27 74 65 73 74 2e 64 62 32 27 20 41 53 20 61   'test.db2' AS a
4e80: 75 78 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  ux;.    CREATE T
4e90: 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20  ABLE t1(a, b);. 
4ea0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
4eb0: 61 75 78 2e 74 32 28 61 2c 20 62 29 3b 0a 20 20  aux.t2(a, b);.  
4ec0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
4ed0: 20 56 41 4c 55 45 53 28 31 37 2c 20 27 4c 65 6e   VALUES(17, 'Len
4ee0: 69 6e 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  in');.    INSERT
4ef0: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
4f00: 32 32 2c 20 27 53 74 61 6c 69 6e 27 29 3b 0a 20  22, 'Stalin');. 
4f10: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
4f20: 31 20 56 41 4c 55 45 53 28 35 33 2c 20 27 4b 68  1 VALUES(53, 'Kh
4f30: 72 75 73 68 63 68 65 76 27 29 3b 0a 20 20 7d 0a  rushchev');.  }.
4f40: 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67  } {}.do_test pag
4f50: 65 72 31 2d 35 2e 31 2e 32 20 7b 0a 20 20 65 78  er1-5.1.2 {.  ex
4f60: 65 63 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49  ecsql {.    BEGI
4f70: 4e 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  N;.      INSERT 
4f80: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 36  INTO t1 VALUES(6
4f90: 34 2c 20 27 42 72 65 7a 68 6e 65 76 27 29 3b 0a  4, 'Brezhnev');.
4fa0: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
4fb0: 4f 20 74 32 20 53 45 4c 45 43 54 20 2a 20 46 52  O t2 SELECT * FR
4fc0: 4f 4d 20 74 31 3b 0a 20 20 7d 0a 20 20 73 71 6c  OM t1;.  }.  sql
4fd0: 69 74 65 33 20 64 62 32 20 74 65 73 74 2e 64 62  ite3 db2 test.db
4fe0: 32 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  2.  execsql {.  
4ff0: 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 53    BEGIN;.      S
5000: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b  ELECT * FROM t2;
5010: 0a 20 20 7d 20 64 62 32 0a 7d 20 7b 7d 0a 64 6f  .  } db2.} {}.do
5020: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 35 2e 31  _test pager1-5.1
5030: 2e 33 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20  .3 {.  catchsql 
5040: 43 4f 4d 4d 49 54 0a 7d 20 7b 31 20 7b 64 61 74  COMMIT.} {1 {dat
5050: 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 7d  abase is locked}
5060: 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  }.do_test pager1
5070: 2d 35 2e 31 2e 34 20 7b 0a 20 20 65 78 65 63 73  -5.1.4 {.  execs
5080: 71 6c 20 43 4f 4d 4d 49 54 20 64 62 32 0a 20 20  ql COMMIT db2.  
5090: 65 78 65 63 73 71 6c 20 43 4f 4d 4d 49 54 0a 20  execsql COMMIT. 
50a0: 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43   execsql { SELEC
50b0: 54 20 2a 20 46 52 4f 4d 20 74 32 20 7d 20 64 62  T * FROM t2 } db
50c0: 32 0a 7d 20 7b 31 37 20 4c 65 6e 69 6e 20 32 32  2.} {17 Lenin 22
50d0: 20 53 74 61 6c 69 6e 20 35 33 20 4b 68 72 75 73   Stalin 53 Khrus
50e0: 68 63 68 65 76 20 36 34 20 42 72 65 7a 68 6e 65  hchev 64 Brezhne
50f0: 76 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  v}.do_test pager
5100: 31 2d 35 2e 31 2e 35 20 7b 0a 20 20 64 62 32 20  1-5.1.5 {.  db2 
5110: 63 6c 6f 73 65 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74  close.} {}..do_t
5120: 65 73 74 20 70 61 67 65 72 31 2d 35 2e 32 2e 31  est pager1-5.2.1
5130: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
5140: 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61     PRAGMA journa
5150: 6c 5f 6d 6f 64 65 20 3d 20 6d 65 6d 6f 72 79 3b  l_mode = memory;
5160: 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20  .    BEGIN;.    
5170: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
5180: 20 56 41 4c 55 45 53 28 38 34 2c 20 27 41 6e 64   VALUES(84, 'And
5190: 72 6f 70 6f 76 27 29 3b 0a 20 20 20 20 20 20 49  ropov');.      I
51a0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41  NSERT INTO t2 VA
51b0: 4c 55 45 53 28 38 34 2c 20 27 41 6e 64 72 6f 70  LUES(84, 'Androp
51c0: 6f 76 27 29 3b 0a 20 20 20 20 43 4f 4d 4d 49 54  ov');.    COMMIT
51d0: 3b 0a 20 20 7d 0a 7d 20 7b 6d 65 6d 6f 72 79 7d  ;.  }.} {memory}
51e0: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
51f0: 35 2e 33 2e 31 20 7b 0a 20 20 65 78 65 63 73 71  5.3.1 {.  execsq
5200: 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a  l {.    PRAGMA j
5210: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 6f 66  ournal_mode = of
5220: 66 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20  f;.    BEGIN;.  
5230: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
5240: 74 31 20 56 41 4c 55 45 53 28 38 35 2c 20 27 47  t1 VALUES(85, 'G
5250: 6f 72 62 61 63 68 65 76 27 29 3b 0a 20 20 20 20  orbachev');.    
5260: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32    INSERT INTO t2
5270: 20 56 41 4c 55 45 53 28 38 35 2c 20 27 47 6f 72   VALUES(85, 'Gor
5280: 62 61 63 68 65 76 27 29 3b 0a 20 20 20 20 43 4f  bachev');.    CO
5290: 4d 4d 49 54 3b 0a 20 20 7d 0a 7d 20 7b 6f 66 66  MMIT;.  }.} {off
52a0: 7d 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  }..do_test pager
52b0: 31 2d 35 2e 34 2e 31 20 7b 0a 20 20 64 62 20 63  1-5.4.1 {.  db c
52c0: 6c 6f 73 65 0a 20 20 74 65 73 74 76 66 73 20 74  lose.  testvfs t
52d0: 76 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 74  v.  sqlite3 db t
52e0: 65 73 74 2e 64 62 20 2d 76 66 73 20 74 76 0a 20  est.db -vfs tv. 
52f0: 20 65 78 65 63 73 71 6c 20 7b 20 41 54 54 41 43   execsql { ATTAC
5300: 48 20 27 74 65 73 74 2e 64 62 32 27 20 41 53 20  H 'test.db2' AS 
5310: 61 75 78 20 7d 0a 0a 20 20 74 76 20 66 69 6c 74  aux }..  tv filt
5320: 65 72 20 78 44 65 6c 65 74 65 0a 20 20 74 76 20  er xDelete.  tv 
5330: 73 63 72 69 70 74 20 6d 61 78 5f 6a 6f 75 72 6e  script max_journ
5340: 61 6c 5f 73 69 7a 65 0a 20 20 74 76 20 73 65 63  al_size.  tv sec
5350: 74 6f 72 73 69 7a 65 20 35 31 32 0a 20 20 73 65  torsize 512.  se
5360: 74 20 3a 3a 6d 61 78 5f 6a 6f 75 72 6e 61 6c 20  t ::max_journal 
5370: 30 0a 20 20 70 72 6f 63 20 6d 61 78 5f 6a 6f 75  0.  proc max_jou
5380: 72 6e 61 6c 5f 73 69 7a 65 20 7b 6d 65 74 68 6f  rnal_size {metho
5390: 64 20 61 72 67 73 7d 20 7b 0a 20 20 20 20 73 65  d args} {.    se
53a0: 74 20 73 7a 20 30 0a 20 20 20 20 63 61 74 63 68  t sz 0.    catch
53b0: 20 7b 20 73 65 74 20 73 7a 20 5b 66 69 6c 65 20   { set sz [file 
53c0: 73 69 7a 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75  size test.db-jou
53d0: 72 6e 61 6c 5d 20 7d 0a 20 20 20 20 69 66 20 7b  rnal] }.    if {
53e0: 24 73 7a 20 3e 20 24 3a 3a 6d 61 78 5f 6a 6f 75  $sz > $::max_jou
53f0: 72 6e 61 6c 7d 20 7b 0a 20 20 20 20 20 20 73 65  rnal} {.      se
5400: 74 20 3a 3a 6d 61 78 5f 6a 6f 75 72 6e 61 6c 20  t ::max_journal 
5410: 24 73 7a 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  $sz.    }.    re
5420: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 20  turn SQLITE_OK. 
5430: 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   }.  execsql {. 
5440: 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61     PRAGMA journa
5450: 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c 45 54 45 3b  l_mode = DELETE;
5460: 0a 20 20 20 20 50 52 41 47 4d 41 20 73 79 6e 63  .    PRAGMA sync
5470: 68 72 6f 6e 6f 75 73 20 3d 20 4e 4f 52 4d 41 4c  hronous = NORMAL
5480: 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20  ;.    BEGIN;.   
5490: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
54a0: 31 20 56 41 4c 55 45 53 28 38 35 2c 20 27 47 6f  1 VALUES(85, 'Go
54b0: 72 62 61 63 68 65 76 27 29 3b 0a 20 20 20 20 20  rbachev');.     
54c0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20   INSERT INTO t2 
54d0: 56 41 4c 55 45 53 28 38 35 2c 20 27 47 6f 72 62  VALUES(85, 'Gorb
54e0: 61 63 68 65 76 27 29 3b 0a 20 20 20 20 43 4f 4d  achev');.    COM
54f0: 4d 49 54 3b 0a 20 20 7d 0a 20 20 73 65 74 20 3a  MIT;.  }.  set :
5500: 3a 6d 61 78 5f 6a 6f 75 72 6e 61 6c 0a 7d 20 5b  :max_journal.} [
5510: 65 78 70 72 20 32 36 31 35 2b 5b 73 74 72 69 6e  expr 2615+[strin
5520: 67 20 6c 65 6e 67 74 68 20 5b 70 77 64 5d 5d 5d  g length [pwd]]]
5530: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
5540: 35 2e 34 2e 32 20 7b 0a 20 20 73 65 74 20 3a 3a  5.4.2 {.  set ::
5550: 6d 61 78 5f 6a 6f 75 72 6e 61 6c 20 30 0a 20 20  max_journal 0.  
5560: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52  execsql {.    PR
5570: 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73  AGMA synchronous
5580: 20 3d 20 66 75 6c 6c 3b 0a 20 20 20 20 42 45 47   = full;.    BEG
5590: 49 4e 3b 0a 20 20 20 20 20 20 44 45 4c 45 54 45  IN;.      DELETE
55a0: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 62   FROM t1 WHERE b
55b0: 20 3d 20 27 4c 65 6e 69 6e 27 3b 0a 20 20 20 20   = 'Lenin';.    
55c0: 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 32    DELETE FROM t2
55d0: 20 57 48 45 52 45 20 62 20 3d 20 27 4c 65 6e 69   WHERE b = 'Leni
55e0: 6e 27 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a  n';.    COMMIT;.
55f0: 20 20 7d 0a 20 20 73 65 74 20 3a 3a 6d 61 78 5f    }.  set ::max_
5600: 6a 6f 75 72 6e 61 6c 0a 7d 20 5b 65 78 70 72 20  journal.} [expr 
5610: 33 31 31 31 2b 5b 73 74 72 69 6e 67 20 6c 65 6e  3111+[string len
5620: 67 74 68 20 5b 70 77 64 5d 5d 5d 0a 64 62 20 63  gth [pwd]]].db c
5630: 6c 6f 73 65 0a 74 76 20 64 65 6c 65 74 65 0a 0a  lose.tv delete..
5640: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 35  do_test pager1-5
5650: 2e 35 2e 31 20 7b 0a 20 20 73 71 6c 69 74 65 33  .5.1 {.  sqlite3
5660: 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20 65 78   db test.db.  ex
5670: 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 41 54 54  ecsql { .    ATT
5680: 41 43 48 20 27 74 65 73 74 2e 64 62 32 27 20 41  ACH 'test.db2' A
5690: 53 20 61 75 78 3b 0a 20 20 20 20 50 52 41 47 4d  S aux;.    PRAGM
56a0: 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d  A journal_mode =
56b0: 20 50 45 52 53 49 53 54 3b 0a 20 20 20 20 43 52   PERSIST;.    CR
56c0: 45 41 54 45 20 54 41 42 4c 45 20 74 33 28 61 2c  EATE TABLE t3(a,
56d0: 20 62 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   b);.    INSERT 
56e0: 49 4e 54 4f 20 74 33 20 53 45 4c 45 43 54 20 72  INTO t3 SELECT r
56f0: 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 2c  andomblob(1500),
5700: 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30   randomblob(1500
5710: 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 55  ) FROM t1;.    U
5720: 50 44 41 54 45 20 74 33 20 53 45 54 20 62 20 3d  PDATE t3 SET b =
5730: 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30   randomblob(1500
5740: 29 3b 0a 20 20 7d 0a 20 20 65 78 70 72 20 5b 66  );.  }.  expr [f
5750: 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62  ile size test.db
5760: 2d 6a 6f 75 72 6e 61 6c 5d 20 3e 20 31 35 30 30  -journal] > 1500
5770: 30 0a 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73 74 20  0.} {1}.do_test 
5780: 70 61 67 65 72 31 2d 35 2e 35 2e 32 20 7b 0a 20  pager1-5.5.2 {. 
5790: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50   execsql {.    P
57a0: 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75  RAGMA synchronou
57b0: 73 20 3d 20 66 75 6c 6c 3b 0a 20 20 20 20 42 45  s = full;.    BE
57c0: 47 49 4e 3b 0a 20 20 20 20 20 20 44 45 4c 45 54  GIN;.      DELET
57d0: 45 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  E FROM t1 WHERE 
57e0: 62 20 3d 20 27 53 74 61 6c 69 6e 27 3b 0a 20 20  b = 'Stalin';.  
57f0: 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20      DELETE FROM 
5800: 74 32 20 57 48 45 52 45 20 62 20 3d 20 27 53 74  t2 WHERE b = 'St
5810: 61 6c 69 6e 27 3b 0a 20 20 20 20 43 4f 4d 4d 49  alin';.    COMMI
5820: 54 3b 0a 20 20 7d 0a 20 20 66 69 6c 65 20 73 69  T;.  }.  file si
5830: 7a 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e  ze test.db-journ
5840: 61 6c 0a 7d 20 7b 30 7d 0a 0a 0a 23 2d 2d 2d 2d  al.} {0}...#----
5850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5890: 2d 2d 2d 2d 2d 0a 23 20 54 68 65 20 66 6f 6c 6c  -----.# The foll
58a0: 6f 77 69 6e 67 20 74 65 73 74 73 20 77 6f 72 6b  owing tests work
58b0: 20 77 69 74 68 20 22 50 52 41 47 4d 41 20 6d 61   with "PRAGMA ma
58c0: 78 5f 70 61 67 65 5f 63 6f 75 6e 74 22 0a 23 0a  x_page_count".#.
58d0: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 36  do_test pager1-6
58e0: 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f  .1 {.  faultsim_
58f0: 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65  delete_and_reope
5900: 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  n.  execsql {.  
5910: 20 20 50 52 41 47 4d 41 20 6d 61 78 5f 70 61 67    PRAGMA max_pag
5920: 65 5f 63 6f 75 6e 74 20 3d 20 31 30 3b 0a 20 20  e_count = 10;.  
5930: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
5940: 32 28 61 2c 20 62 29 3b 0a 20 20 20 20 43 52 45  2(a, b);.    CRE
5950: 41 54 45 20 54 41 42 4c 45 20 74 33 28 61 2c 20  ATE TABLE t3(a, 
5960: 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  b);.    CREATE T
5970: 41 42 4c 45 20 74 34 28 61 2c 20 62 29 3b 0a 20  ABLE t4(a, b);. 
5980: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
5990: 74 35 28 61 2c 20 62 29 3b 0a 20 20 20 20 43 52  t5(a, b);.    CR
59a0: 45 41 54 45 20 54 41 42 4c 45 20 74 36 28 61 2c  EATE TABLE t6(a,
59b0: 20 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20   b);.    CREATE 
59c0: 54 41 42 4c 45 20 74 37 28 61 2c 20 62 29 3b 0a  TABLE t7(a, b);.
59d0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
59e0: 20 74 38 28 61 2c 20 62 29 3b 0a 20 20 20 20 43   t8(a, b);.    C
59f0: 52 45 41 54 45 20 54 41 42 4c 45 20 74 39 28 61  REATE TABLE t9(a
5a00: 2c 20 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45  , b);.    CREATE
5a10: 20 54 41 42 4c 45 20 74 31 30 28 61 2c 20 62 29   TABLE t10(a, b)
5a20: 3b 0a 20 20 7d 0a 7d 20 7b 31 30 7d 0a 64 6f 5f  ;.  }.} {10}.do_
5a30: 74 65 73 74 20 70 61 67 65 72 31 2d 36 2e 32 20  test pager1-6.2 
5a40: 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20  {.  catchsql {. 
5a50: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
5a60: 74 31 31 28 61 2c 20 62 29 3b 0a 20 20 7d 0a 7d  t11(a, b);.  }.}
5a70: 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20 6f 72   {1 {database or
5a80: 20 64 69 73 6b 20 69 73 20 66 75 6c 6c 7d 7d 0a   disk is full}}.
5a90: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
5aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5ad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54  ------------.# T
5ae0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73  he following tes
5af0: 74 73 20 77 6f 72 6b 20 77 69 74 68 20 22 50 52  ts work with "PR
5b00: 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
5b10: 65 3d 54 52 55 4e 43 41 54 45 22 20 61 6e 64 0a  e=TRUNCATE" and.
5b20: 23 20 22 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e  # "PRAGMA lockin
5b30: 67 5f 6d 6f 64 65 3d 45 58 43 4c 55 53 49 56 45  g_mode=EXCLUSIVE
5b40: 22 2e 0a 23 0a 23 20 45 61 63 68 20 74 65 73 74  "..#.# Each test
5b50: 20 69 73 20 73 70 65 63 69 66 69 65 64 20 77 69   is specified wi
5b60: 74 68 20 35 20 76 61 72 69 61 62 6c 65 73 2e 20  th 5 variables. 
5b70: 41 73 20 66 6f 6c 6c 6f 77 73 3a 0a 23 0a 23 20  As follows:.#.# 
5b80: 20 20 24 74 6e 3a 20 20 54 65 73 74 20 4e 75 6d    $tn:  Test Num
5b90: 62 65 72 2e 20 55 73 65 64 20 61 73 20 70 61 72  ber. Used as par
5ba0: 74 20 6f 66 20 74 68 65 20 5b 64 6f 5f 74 65 73  t of the [do_tes
5bb0: 74 5d 20 74 65 73 74 20 6e 61 6d 65 73 2e 0a 23  t] test names..#
5bc0: 20 20 20 24 73 71 6c 3a 20 53 51 4c 20 74 6f 20     $sql: SQL to 
5bd0: 65 78 65 63 75 74 65 2e 0a 23 20 20 20 24 72 65  execute..#   $re
5be0: 73 3a 20 45 78 70 65 63 74 65 64 20 72 65 73 75  s: Expected resu
5bf0: 6c 74 20 6f 66 20 65 78 65 63 75 74 69 6e 67 20  lt of executing 
5c00: 24 73 71 6c 2e 0a 23 20 20 20 24 6a 73 3a 20 20  $sql..#   $js:  
5c10: 54 68 65 20 65 78 70 65 63 74 65 64 20 73 69 7a  The expected siz
5c20: 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
5c30: 20 66 69 6c 65 2c 20 69 6e 20 62 79 74 65 73 2c   file, in bytes,
5c40: 20 61 66 74 65 72 20 65 78 65 63 75 74 69 6e 67   after executing
5c50: 0a 23 20 20 20 20 20 20 20 20 20 74 68 65 20 53  .#         the S
5c60: 51 4c 20 73 63 72 69 70 74 2e 20 4f 72 20 2d 31  QL script. Or -1
5c70: 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   if the journal 
5c80: 69 73 20 6e 6f 74 20 65 78 70 65 63 74 65 64 20  is not expected 
5c90: 74 6f 20 65 78 69 73 74 2e 0a 23 20 20 20 24 77  to exist..#   $w
5ca0: 73 3a 20 20 54 68 65 20 65 78 70 65 63 74 65 64  s:  The expected
5cb0: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 57 41 4c   size of the WAL
5cc0: 20 66 69 6c 65 2c 20 69 6e 20 62 79 74 65 73 2c   file, in bytes,
5cd0: 20 61 66 74 65 72 20 65 78 65 63 75 74 69 6e 67   after executing
5ce0: 0a 23 20 20 20 20 20 20 20 20 20 74 68 65 20 53  .#         the S
5cf0: 51 4c 20 73 63 72 69 70 74 2e 20 4f 72 20 2d 31  QL script. Or -1
5d00: 20 69 66 20 74 68 65 20 57 41 4c 20 69 73 20 6e   if the WAL is n
5d10: 6f 74 20 65 78 70 65 63 74 65 64 20 74 6f 20 65  ot expected to e
5d20: 78 69 73 74 2e 0a 23 0a 66 61 75 6c 74 73 69 6d  xist..#.faultsim
5d30: 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70  _delete_and_reop
5d40: 65 6e 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20 73  en.foreach {tn s
5d50: 71 6c 20 72 65 73 20 6a 73 20 77 73 7d 20 5b 73  ql res js ws} [s
5d60: 75 62 73 74 20 7b 0a 0a 20 20 31 20 20 7b 0a 20  ubst {..  1  {. 
5d70: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
5d80: 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 50 52  t1(a, b);.    PR
5d90: 41 47 4d 41 20 61 75 74 6f 5f 76 61 63 75 75 6d  AGMA auto_vacuum
5da0: 3d 4f 46 46 3b 0a 20 20 20 20 50 52 41 47 4d 41  =OFF;.    PRAGMA
5db0: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4e 4f 52   synchronous=NOR
5dc0: 4d 41 4c 3b 0a 20 20 20 20 50 52 41 47 4d 41 20  MAL;.    PRAGMA 
5dd0: 70 61 67 65 5f 73 69 7a 65 3d 31 30 32 34 3b 0a  page_size=1024;.
5de0: 20 20 20 20 50 52 41 47 4d 41 20 6c 6f 63 6b 69      PRAGMA locki
5df0: 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55 53 49 56  ng_mode=EXCLUSIV
5e00: 45 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f  E;.    PRAGMA jo
5e10: 75 72 6e 61 6c 5f 6d 6f 64 65 3d 54 52 55 4e 43  urnal_mode=TRUNC
5e20: 41 54 45 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  ATE;.    INSERT 
5e30: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31  INTO t1 VALUES(1
5e40: 2c 20 32 29 3b 0a 20 20 7d 20 7b 65 78 63 6c 75  , 2);.  } {exclu
5e50: 73 69 76 65 20 74 72 75 6e 63 61 74 65 7d 20 30  sive truncate} 0
5e60: 20 2d 31 0a 0a 20 20 32 20 20 7b 0a 20 20 20 20   -1..  2  {.    
5e70: 42 45 47 49 4e 20 49 4d 4d 45 44 49 41 54 45 3b  BEGIN IMMEDIATE;
5e80: 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20  .      SELECT * 
5e90: 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 43 4f 4d  FROM t1;.    COM
5ea0: 4d 49 54 3b 0a 20 20 7d 20 7b 31 20 32 7d 20 30  MIT;.  } {1 2} 0
5eb0: 20 2d 31 0a 0a 20 20 33 20 20 7b 0a 20 20 20 20   -1..  3  {.    
5ec0: 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 53 45 4c  BEGIN;.      SEL
5ed0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20  ECT * FROM t1;. 
5ee0: 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 20 7b     COMMIT;.  } {
5ef0: 31 20 32 7d 20 30 20 2d 31 0a 0a 20 20 34 20 20  1 2} 0 -1..  4  
5f00: 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c  { PRAGMA journal
5f10: 5f 6d 6f 64 65 20 3d 20 57 41 4c 20 7d 20 20 20  _mode = WAL }   
5f20: 20 77 61 6c 20 20 20 20 2d 31 20 2d 31 0a 20 20   wal    -1 -1.  
5f30: 35 20 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f  5  { INSERT INTO
5f40: 20 74 31 20 56 41 4c 55 45 53 28 33 2c 20 34 29   t1 VALUES(3, 4)
5f50: 20 7d 20 20 7b 7d 20 20 20 20 20 2d 31 20 5b 77   }  {}     -1 [w
5f60: 61 6c 5f 66 69 6c 65 5f 73 69 7a 65 20 31 20 31  al_file_size 1 1
5f70: 30 32 34 5d 0a 20 20 36 20 20 7b 20 50 52 41 47  024].  6  { PRAG
5f80: 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 20  MA locking_mode 
5f90: 3d 20 4e 4f 52 4d 41 4c 20 7d 20 6e 6f 72 6d 61  = NORMAL } norma
5fa0: 6c 20 2d 31 20 5b 77 61 6c 5f 66 69 6c 65 5f 73  l -1 [wal_file_s
5fb0: 69 7a 65 20 31 20 31 30 32 34 5d 0a 20 20 37 20  ize 1 1024].  7 
5fc0: 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74   { INSERT INTO t
5fd0: 31 20 56 41 4c 55 45 53 28 35 2c 20 36 29 3b 20  1 VALUES(5, 6); 
5fe0: 7d 20 7b 7d 20 20 20 20 20 2d 31 20 5b 77 61 6c  } {}     -1 [wal
5ff0: 5f 66 69 6c 65 5f 73 69 7a 65 20 32 20 31 30 32  _file_size 2 102
6000: 34 5d 0a 0a 20 20 38 20 20 7b 20 50 52 41 47 4d  4]..  8  { PRAGM
6010: 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d  A journal_mode =
6020: 20 54 52 55 4e 43 41 54 45 20 7d 20 74 72 75 6e   TRUNCATE } trun
6030: 63 61 74 65 20 20 20 20 20 20 20 20 20 20 30 20  cate          0 
6040: 2d 31 0a 20 20 39 20 20 7b 20 49 4e 53 45 52 54  -1.  9  { INSERT
6050: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
6060: 37 2c 20 38 29 20 7d 20 20 20 20 7b 7d 20 20 20  7, 8) }    {}   
6070: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 2d               0 -
6080: 31 0a 20 20 31 30 20 7b 20 53 45 4c 45 43 54 20  1.  10 { SELECT 
6090: 2a 20 46 52 4f 4d 20 74 31 20 7d 20 20 20 20 20  * FROM t1 }     
60a0: 20 20 20 20 20 20 20 20 20 20 7b 31 20 32 20 33            {1 2 3
60b0: 20 34 20 35 20 36 20 37 20 38 7d 20 30 20 2d 31   4 5 6 7 8} 0 -1
60c0: 0a 0a 7d 5d 20 7b 0a 20 20 64 6f 5f 65 78 65 63  ..}] {.  do_exec
60d0: 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d  sql_test pager1-
60e0: 37 2e 31 2e 24 74 6e 2e 31 20 24 73 71 6c 20 24  7.1.$tn.1 $sql $
60f0: 72 65 73 0a 20 20 63 61 74 63 68 20 7b 20 73 65  res.  catch { se
6100: 74 20 4a 20 2d 31 20 3b 20 73 65 74 20 4a 20 5b  t J -1 ; set J [
6110: 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64  file size test.d
6120: 62 2d 6a 6f 75 72 6e 61 6c 5d 20 7d 0a 20 20 63  b-journal] }.  c
6130: 61 74 63 68 20 7b 20 73 65 74 20 57 20 2d 31 20  atch { set W -1 
6140: 3b 20 73 65 74 20 57 20 5b 66 69 6c 65 20 73 69  ; set W [file si
6150: 7a 65 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d 20  ze test.db-wal] 
6160: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65  }.  do_test page
6170: 72 31 2d 37 2e 31 2e 24 74 6e 2e 32 20 7b 20 6c  r1-7.1.$tn.2 { l
6180: 69 73 74 20 24 4a 20 24 57 20 7d 20 5b 6c 69 73  ist $J $W } [lis
6190: 74 20 24 6a 73 20 24 77 73 5d 0a 7d 0a 0a 66 6f  t $js $ws].}..fo
61a0: 72 65 61 63 68 20 7b 74 6e 20 66 69 6c 65 6e 61  reach {tn filena
61b0: 6d 65 7d 20 7b 0a 20 20 31 20 3a 6d 65 6d 6f 72  me} {.  1 :memor
61c0: 79 3a 0a 20 20 32 20 22 22 0a 7d 20 7b 0a 20 20  y:.  2 "".} {.  
61d0: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 38  do_test pager1-8
61e0: 2e 24 74 6e 2e 31 20 7b 0a 20 20 20 20 66 61 75  .$tn.1 {.    fau
61f0: 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64  ltsim_delete_and
6200: 5f 72 65 6f 70 65 6e 0a 20 20 20 20 64 62 20 63  _reopen.    db c
6210: 6c 6f 73 65 0a 20 20 20 20 73 71 6c 69 74 65 33  lose.    sqlite3
6220: 20 64 62 20 24 66 69 6c 65 6e 61 6d 65 0a 20 20   db $filename.  
6230: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
6240: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 78    CREATE TABLE x
6250: 31 28 78 29 3b 0a 20 20 20 20 20 20 49 4e 53 45  1(x);.      INSE
6260: 52 54 20 49 4e 54 4f 20 78 31 20 56 41 4c 55 45  RT INTO x1 VALUE
6270: 53 28 27 43 68 61 72 6c 65 73 27 29 3b 0a 20 20  S('Charles');.  
6280: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
6290: 78 31 20 56 41 4c 55 45 53 28 27 4a 61 6d 65 73  x1 VALUES('James
62a0: 27 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  ');.      INSERT
62b0: 20 49 4e 54 4f 20 78 31 20 56 41 4c 55 45 53 28   INTO x1 VALUES(
62c0: 27 4d 61 72 79 27 29 3b 0a 20 20 20 20 20 20 53  'Mary');.      S
62d0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 78 31 3b  ELECT * FROM x1;
62e0: 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 43 68 61 72  .    }.  } {Char
62f0: 6c 65 73 20 4a 61 6d 65 73 20 4d 61 72 79 7d 0a  les James Mary}.
6300: 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72  .  do_test pager
6310: 31 2d 38 2e 24 74 6e 2e 32 20 7b 0a 20 20 20 20  1-8.$tn.2 {.    
6320: 73 71 6c 69 74 65 33 20 64 62 32 20 24 66 69 6c  sqlite3 db2 $fil
6330: 65 6e 61 6d 65 0a 20 20 20 20 63 61 74 63 68 73  ename.    catchs
6340: 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52  ql { SELECT * FR
6350: 4f 4d 20 78 31 20 7d 20 64 62 32 0a 20 20 7d 20  OM x1 } db2.  } 
6360: 7b 31 20 7b 6e 6f 20 73 75 63 68 20 74 61 62 6c  {1 {no such tabl
6370: 65 3a 20 78 31 7d 7d 0a 0a 20 20 64 6f 5f 65 78  e: x1}}..  do_ex
6380: 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72  ecsql_test pager
6390: 31 2d 38 2e 24 74 6e 2e 33 20 7b 0a 20 20 20 20  1-8.$tn.3 {.    
63a0: 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 49 4e 53  BEGIN;.      INS
63b0: 45 52 54 20 49 4e 54 4f 20 78 31 20 56 41 4c 55  ERT INTO x1 VALU
63c0: 45 53 28 27 57 69 6c 6c 69 61 6d 27 29 3b 0a 20  ES('William');. 
63d0: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
63e0: 20 78 31 20 56 41 4c 55 45 53 28 27 41 6e 6e 65   x1 VALUES('Anne
63f0: 27 29 3b 0a 20 20 20 20 52 4f 4c 4c 42 41 43 4b  ');.    ROLLBACK
6400: 3b 0a 20 20 7d 20 7b 7d 0a 7d 0a 0a 66 69 6e 69  ;.  } {}.}..fini
6410: 73 68 5f 74 65 73 74 0a 0a                       sh_test..