/ Hex Artifact Content
Login

Artifact b7099656ae9162fd192b13fafab0361c2a910022:


0000: 23 20 32 30 31 30 20 4a 75 6e 65 20 31 35 0a 23  # 2010 June 15.#
0010: 0a 23 20 54 68 65 20 61 75 74 68 6f 72 20 64 69  .# The author di
0020: 73 63 6c 61 69 6d 73 20 63 6f 70 79 72 69 67 68  sclaims copyrigh
0030: 74 20 74 6f 20 74 68 69 73 20 73 6f 75 72 63 65  t to this source
0040: 20 63 6f 64 65 2e 20 20 49 6e 20 70 6c 61 63 65   code.  In place
0050: 20 6f 66 0a 23 20 61 20 6c 65 67 61 6c 20 6e 6f   of.# a legal no
0060: 74 69 63 65 2c 20 68 65 72 65 20 69 73 20 61 20  tice, here is a 
0070: 62 6c 65 73 73 69 6e 67 3a 0a 23 0a 23 20 20 20  blessing:.#.#   
0080: 20 4d 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64   May you do good
0090: 20 61 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 23   and not evil..#
00a0: 20 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64      May you find
00b0: 20 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72   forgiveness for
00c0: 20 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f   yourself and fo
00d0: 72 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 23 20  rgive others..# 
00e0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
00f0: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0100: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0110: 79 6f 75 20 67 69 76 65 2e 0a 23 0a 23 2a 2a 2a  you give..#.#***
0120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 0a 23 0a 0a 73 65 74 20 74 65 73 74  ****.#..set test
0170: 64 69 72 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d  dir [file dirnam
0180: 65 20 24 61 72 67 76 30 5d 0a 73 6f 75 72 63 65  e $argv0].source
0190: 20 24 74 65 73 74 64 69 72 2f 74 65 73 74 65 72   $testdir/tester
01a0: 2e 74 63 6c 0a 73 6f 75 72 63 65 20 24 74 65 73  .tcl.source $tes
01b0: 74 64 69 72 2f 6c 6f 63 6b 5f 63 6f 6d 6d 6f 6e  tdir/lock_common
01c0: 2e 74 63 6c 0a 73 6f 75 72 63 65 20 24 74 65 73  .tcl.source $tes
01d0: 74 64 69 72 2f 6d 61 6c 6c 6f 63 5f 63 6f 6d 6d  tdir/malloc_comm
01e0: 6f 6e 2e 74 63 6c 0a 73 6f 75 72 63 65 20 24 74  on.tcl.source $t
01f0: 65 73 74 64 69 72 2f 77 61 6c 5f 63 6f 6d 6d 6f  estdir/wal_commo
0200: 6e 2e 74 63 6c 0a 20 0a 23 20 44 6f 20 6e 6f 74  n.tcl. .# Do not
0210: 20 75 73 65 20 61 20 63 6f 64 65 63 20 66 6f 72   use a codec for
0220: 20 74 65 73 74 73 20 69 6e 20 74 68 69 73 20 66   tests in this f
0230: 69 6c 65 2c 20 61 73 20 74 68 65 20 64 61 74 61  ile, as the data
0240: 62 61 73 65 20 66 69 6c 65 20 69 73 0a 23 20 6d  base file is.# m
0250: 61 6e 69 70 75 6c 61 74 65 64 20 64 69 72 65 63  anipulated direc
0260: 74 6c 79 20 75 73 69 6e 67 20 74 63 6c 20 73 63  tly using tcl sc
0270: 72 69 70 74 73 20 28 75 73 69 6e 67 20 74 68 65  ripts (using the
0280: 20 5b 68 65 78 69 6f 5f 77 72 69 74 65 5d 20 63   [hexio_write] c
0290: 6f 6d 6d 61 6e 64 29 2e 0a 23 0a 64 6f 5f 6e 6f  ommand)..#.do_no
02a0: 74 5f 75 73 65 5f 63 6f 64 65 63 0a 0a 23 0a 23  t_use_codec..#.#
02b0: 20 70 61 67 65 72 31 2d 31 2e 2a 3a 20 54 65 73   pager1-1.*: Tes
02c0: 74 20 69 6e 74 65 72 2d 70 72 6f 63 65 73 73 20  t inter-process 
02d0: 6c 6f 63 6b 69 6e 67 20 28 63 6c 69 65 6e 74 73  locking (clients
02e0: 20 69 6e 20 6d 75 6c 74 69 70 6c 65 20 70 72 6f   in multiple pro
02f0: 63 65 73 73 65 73 29 2e 0a 23 0a 23 20 70 61 67  cesses)..#.# pag
0300: 65 72 31 2d 32 2e 2a 3a 20 54 65 73 74 20 69 6e  er1-2.*: Test in
0310: 74 72 61 2d 70 72 6f 63 65 73 73 20 6c 6f 63 6b  tra-process lock
0320: 69 6e 67 20 28 6d 75 6c 74 69 70 6c 65 20 63 6c  ing (multiple cl
0330: 69 65 6e 74 73 20 69 6e 20 74 68 69 73 20 70 72  ients in this pr
0340: 6f 63 65 73 73 29 2e 0a 23 0a 23 20 70 61 67 65  ocess)..#.# page
0350: 72 31 2d 33 2e 2a 3a 20 53 61 76 65 70 6f 69 6e  r1-3.*: Savepoin
0360: 74 20 72 65 6c 61 74 65 64 20 74 65 73 74 73 2e  t related tests.
0370: 0a 23 0a 23 20 70 61 67 65 72 31 2d 34 2e 2a 3a  .#.# pager1-4.*:
0380: 20 48 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 65 6c   Hot-journal rel
0390: 61 74 65 64 20 74 65 73 74 73 2e 0a 23 0a 23 20  ated tests..#.# 
03a0: 70 61 67 65 72 31 2d 35 2e 2a 3a 20 43 61 73 65  pager1-5.*: Case
03b0: 73 20 72 65 6c 61 74 65 64 20 74 6f 20 6d 75 6c  s related to mul
03c0: 74 69 2d 66 69 6c 65 20 63 6f 6d 6d 69 74 73 2e  ti-file commits.
03d0: 0a 23 0a 23 20 70 61 67 65 72 31 2d 36 2e 2a 3a  .#.# pager1-6.*:
03e0: 20 43 61 73 65 73 20 72 65 6c 61 74 65 64 20 74   Cases related t
03f0: 6f 20 22 50 52 41 47 4d 41 20 6d 61 78 5f 70 61  o "PRAGMA max_pa
0400: 67 65 5f 63 6f 75 6e 74 22 0a 23 0a 23 20 70 61  ge_count".#.# pa
0410: 67 65 72 31 2d 37 2e 2a 3a 20 43 61 73 65 73 20  ger1-7.*: Cases 
0420: 73 70 65 63 69 66 69 63 20 74 6f 20 22 50 52 41  specific to "PRA
0430: 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
0440: 3d 54 52 55 4e 43 41 54 45 22 0a 23 0a 23 20 70  =TRUNCATE".#.# p
0450: 61 67 65 72 31 2d 38 2e 2a 3a 20 43 61 73 65 73  ager1-8.*: Cases
0460: 20 75 73 69 6e 67 20 74 65 6d 70 6f 72 61 72 79   using temporary
0470: 20 61 6e 64 20 69 6e 2d 6d 65 6d 6f 72 79 20 64   and in-memory d
0480: 61 74 61 62 61 73 65 73 2e 0a 23 0a 23 20 70 61  atabases..#.# pa
0490: 67 65 72 31 2d 39 2e 2a 3a 20 54 65 73 74 73 20  ger1-9.*: Tests 
04a0: 72 65 6c 61 74 65 64 20 74 6f 20 74 68 65 20 62  related to the b
04b0: 61 63 6b 75 70 20 41 50 49 2e 0a 23 0a 23 20 70  ackup API..#.# p
04c0: 61 67 65 72 31 2d 31 30 2e 2a 3a 20 54 65 73 74  ager1-10.*: Test
04d0: 20 74 68 61 74 20 74 68 65 20 61 73 73 75 6d 65   that the assume
04e0: 64 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73 65  d file-system se
04f0: 63 74 6f 72 2d 73 69 7a 65 20 69 73 20 6c 69 6d  ctor-size is lim
0500: 69 74 65 64 20 74 6f 0a 23 20 20 20 20 20 20 20  ited to.#       
0510: 20 20 20 20 20 20 20 36 34 4b 42 2e 0a 23 20 20         64KB..#  
0520: 20 20 20 20 20 20 20 20 20 20 20 20 0a 23 0a 0a              .#..
0530: 73 65 74 20 61 5f 73 74 72 69 6e 67 5f 63 6f 75  set a_string_cou
0540: 6e 74 65 72 20 31 0a 70 72 6f 63 20 61 5f 73 74  nter 1.proc a_st
0550: 72 69 6e 67 20 7b 6e 7d 20 7b 0a 20 20 67 6c 6f  ring {n} {.  glo
0560: 62 61 6c 20 61 5f 73 74 72 69 6e 67 5f 63 6f 75  bal a_string_cou
0570: 6e 74 65 72 0a 20 20 69 6e 63 72 20 61 5f 73 74  nter.  incr a_st
0580: 72 69 6e 67 5f 63 6f 75 6e 74 65 72 0a 20 20 73  ring_counter.  s
0590: 74 72 69 6e 67 20 72 61 6e 67 65 20 5b 73 74 72  tring range [str
05a0: 69 6e 67 20 72 65 70 65 61 74 20 22 24 7b 61 5f  ing repeat "${a_
05b0: 73 74 72 69 6e 67 5f 63 6f 75 6e 74 65 72 7d 2e  string_counter}.
05c0: 22 20 24 6e 5d 20 31 20 24 6e 0a 7d 0a 64 62 20  " $n] 1 $n.}.db 
05d0: 66 75 6e 63 20 61 5f 73 74 72 69 6e 67 20 61 5f  func a_string a_
05e0: 73 74 72 69 6e 67 0a 0a 64 6f 5f 6d 75 6c 74 69  string..do_multi
05f0: 63 6c 69 65 6e 74 5f 74 65 73 74 20 74 6e 20 7b  client_test tn {
0600: 0a 0a 20 20 23 20 43 72 65 61 74 65 20 61 6e 64  ..  # Create and
0610: 20 70 6f 70 75 6c 61 74 65 20 61 20 64 61 74 61   populate a data
0620: 62 61 73 65 20 74 61 62 6c 65 20 75 73 69 6e 67  base table using
0630: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 5b 64 62 5d   connection [db]
0640: 2e 20 43 68 65 63 6b 20 0a 20 20 23 20 74 68 61  . Check .  # tha
0650: 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 5b 64  t connections [d
0660: 62 32 5d 20 61 6e 64 20 5b 64 62 33 5d 20 63 61  b2] and [db3] ca
0670: 6e 20 73 65 65 20 74 68 65 20 73 63 68 65 6d 61  n see the schema
0680: 20 61 6e 64 20 63 6f 6e 74 65 6e 74 2e 0a 20 20   and content..  
0690: 23 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65  #.  do_test page
06a0: 72 31 2d 24 74 6e 2e 31 20 7b 0a 20 20 20 20 73  r1-$tn.1 {.    s
06b0: 71 6c 31 20 7b 0a 20 20 20 20 20 20 43 52 45 41  ql1 {.      CREA
06c0: 54 45 20 54 41 42 4c 45 20 74 31 28 61 20 50 52  TE TABLE t1(a PR
06d0: 49 4d 41 52 59 20 4b 45 59 2c 20 62 29 3b 0a 20  IMARY KEY, b);. 
06e0: 20 20 20 20 20 43 52 45 41 54 45 20 49 4e 44 45       CREATE INDE
06f0: 58 20 69 31 20 4f 4e 20 74 31 28 62 29 3b 0a 20  X i1 ON t1(b);. 
0700: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
0710: 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20 27 6f   t1 VALUES(1, 'o
0720: 6e 65 27 29 3b 0a 20 20 20 20 20 20 49 4e 53 45  ne');.      INSE
0730: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
0740: 53 28 32 2c 20 27 74 77 6f 27 29 3b 0a 20 20 20  S(2, 'two');.   
0750: 20 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74   }.  } {}.  do_t
0760: 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 32  est pager1-$tn.2
0770: 20 7b 20 73 71 6c 32 20 7b 20 53 45 4c 45 43 54   { sql2 { SELECT
0780: 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7d 20 7b   * FROM t1 } } {
0790: 31 20 6f 6e 65 20 32 20 74 77 6f 7d 0a 20 20 64  1 one 2 two}.  d
07a0: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24 74  o_test pager1-$t
07b0: 6e 2e 33 20 7b 20 73 71 6c 33 20 7b 20 53 45 4c  n.3 { sql3 { SEL
07c0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20  ECT * FROM t1 } 
07d0: 7d 20 7b 31 20 6f 6e 65 20 32 20 74 77 6f 7d 0a  } {1 one 2 two}.
07e0: 0a 20 20 23 20 4f 70 65 6e 20 61 20 74 72 61 6e  .  # Open a tran
07f0: 73 61 63 74 69 6f 6e 20 61 6e 64 20 61 64 64 20  saction and add 
0800: 61 20 72 6f 77 20 75 73 69 6e 67 20 5b 64 62 5d  a row using [db]
0810: 2e 20 54 68 69 73 20 70 75 74 73 20 5b 64 62 5d  . This puts [db]
0820: 20 69 6e 0a 20 20 23 20 52 45 53 45 52 56 45 44   in.  # RESERVED
0830: 20 73 74 61 74 65 2e 20 43 68 65 63 6b 20 74 68   state. Check th
0840: 61 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 5b  at connections [
0850: 64 62 32 5d 20 61 6e 64 20 5b 64 62 33 5d 20 63  db2] and [db3] c
0860: 61 6e 20 73 74 69 6c 6c 0a 20 20 23 20 72 65 61  an still.  # rea
0870: 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  d the database c
0880: 6f 6e 74 65 6e 74 20 61 73 20 69 74 20 77 61 73  ontent as it was
0890: 20 62 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e   before the tran
08a0: 73 61 63 74 69 6f 6e 20 77 61 73 0a 20 20 23 20  saction was.  # 
08b0: 6f 70 65 6e 65 64 2e 20 5b 64 62 5d 20 73 68 6f  opened. [db] sho
08c0: 75 6c 64 20 73 65 65 20 74 68 65 20 69 6e 73 65  uld see the inse
08d0: 72 74 65 64 20 72 6f 77 2e 0a 20 20 23 0a 20 20  rted row..  #.  
08e0: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24  do_test pager1-$
08f0: 74 6e 2e 34 20 7b 0a 20 20 20 20 73 71 6c 31 20  tn.4 {.    sql1 
0900: 7b 0a 20 20 20 20 20 20 42 45 47 49 4e 3b 0a 20  {.      BEGIN;. 
0910: 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e         INSERT IN
0920: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 33 2c 20  TO t1 VALUES(3, 
0930: 27 74 68 72 65 65 27 29 3b 0a 20 20 20 20 7d 0a  'three');.    }.
0940: 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74    } {}.  do_test
0950: 20 70 61 67 65 72 31 2d 24 74 6e 2e 35 20 7b 20   pager1-$tn.5 { 
0960: 73 71 6c 32 20 7b 20 53 45 4c 45 43 54 20 2a 20  sql2 { SELECT * 
0970: 46 52 4f 4d 20 74 31 20 7d 20 7d 20 7b 31 20 6f  FROM t1 } } {1 o
0980: 6e 65 20 32 20 74 77 6f 7d 0a 20 20 64 6f 5f 74  ne 2 two}.  do_t
0990: 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 37  est pager1-$tn.7
09a0: 20 7b 20 73 71 6c 31 20 7b 20 53 45 4c 45 43 54   { sql1 { SELECT
09b0: 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7d 20 7b   * FROM t1 } } {
09c0: 31 20 6f 6e 65 20 32 20 74 77 6f 20 33 20 74 68  1 one 2 two 3 th
09d0: 72 65 65 7d 0a 0a 20 20 23 20 5b 64 62 5d 20 73  ree}..  # [db] s
09e0: 74 69 6c 6c 20 68 61 73 20 61 6e 20 6f 70 65 6e  till has an open
09f0: 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
0a00: 6f 6e 2e 20 43 68 65 63 6b 20 74 68 61 74 20 74  on. Check that t
0a10: 68 69 73 20 70 72 65 76 65 6e 74 73 0a 20 20 23  his prevents.  #
0a20: 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f   other connectio
0a30: 6e 73 20 28 73 70 65 63 69 66 69 63 61 6c 6c 79  ns (specifically
0a40: 20 5b 64 62 32 5d 29 20 66 72 6f 6d 20 77 72 69   [db2]) from wri
0a50: 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61  ting to the data
0a60: 62 61 73 65 2e 0a 20 20 23 0a 20 20 23 20 45 76  base..  #.  # Ev
0a70: 65 6e 20 69 66 20 5b 64 62 32 5d 20 6f 70 65 6e  en if [db2] open
0a80: 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  s a transaction 
0a90: 66 69 72 73 74 2c 20 69 74 20 6d 61 79 20 6e 6f  first, it may no
0aa0: 74 20 77 72 69 74 65 20 74 6f 20 74 68 65 0a 20  t write to the. 
0ab0: 20 23 20 64 61 74 61 62 61 73 65 2e 20 41 66 74   # database. Aft
0ac0: 65 72 20 74 68 65 20 61 74 74 65 6d 70 74 20 74  er the attempt t
0ad0: 6f 20 77 72 69 74 65 20 74 68 65 20 64 62 20 77  o write the db w
0ae0: 69 74 68 69 6e 20 61 20 74 72 61 6e 73 61 63 74  ithin a transact
0af0: 69 6f 6e 2c 20 0a 20 20 23 20 5b 64 62 32 5d 20  ion, .  # [db2] 
0b00: 69 73 20 6c 65 66 74 20 77 69 74 68 20 61 6e 20  is left with an 
0b10: 6f 70 65 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e  open transaction
0b20: 2c 20 62 75 74 20 6e 6f 74 20 61 20 72 65 61 64  , but not a read
0b30: 2d 6c 6f 63 6b 20 6f 6e 0a 20 20 23 20 74 68 65  -lock on.  # the
0b40: 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 2e 20   main database. 
0b50: 53 6f 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 70  So it does not p
0b60: 72 65 76 65 6e 74 20 5b 64 62 5d 20 66 72 6f 6d  revent [db] from
0b70: 20 63 6f 6d 6d 69 74 74 69 6e 67 2e 0a 20 20 23   committing..  #
0b80: 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72  .  do_test pager
0b90: 31 2d 24 74 6e 2e 38 20 7b 20 0a 20 20 20 20 63  1-$tn.8 { .    c
0ba0: 73 71 6c 32 20 7b 20 55 50 44 41 54 45 20 74 31  sql2 { UPDATE t1
0bb0: 20 53 45 54 20 61 20 3d 20 61 20 2b 20 31 30 20   SET a = a + 10 
0bc0: 7d 0a 20 20 7d 20 7b 31 20 7b 64 61 74 61 62 61  }.  } {1 {databa
0bd0: 73 65 20 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 20  se is locked}}. 
0be0: 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
0bf0: 24 74 6e 2e 39 20 7b 20 0a 20 20 20 20 63 73 71  $tn.9 { .    csq
0c00: 6c 32 20 7b 20 0a 20 20 20 20 20 20 42 45 47 49  l2 { .      BEGI
0c10: 4e 3b 0a 20 20 20 20 20 20 55 50 44 41 54 45 20  N;.      UPDATE 
0c20: 74 31 20 53 45 54 20 61 20 3d 20 61 20 2b 20 31  t1 SET a = a + 1
0c30: 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 31 20  0;.    }.  } {1 
0c40: 7b 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63  {database is loc
0c50: 6b 65 64 7d 7d 0a 0a 20 20 23 20 48 61 76 65 20  ked}}..  # Have 
0c60: 5b 64 62 5d 20 63 6f 6d 6d 69 74 20 69 74 73 20  [db] commit its 
0c70: 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e 20 43 68  transactions. Ch
0c80: 65 63 6b 20 74 68 65 20 6f 74 68 65 72 20 63 6f  eck the other co
0c90: 6e 6e 65 63 74 69 6f 6e 73 20 63 61 6e 0a 20 20  nnections can.  
0ca0: 23 20 6e 6f 77 20 73 65 65 20 74 68 65 20 6e 65  # now see the ne
0cb0: 77 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 65  w database conte
0cc0: 6e 74 2e 0a 20 20 23 0a 20 20 64 6f 5f 74 65 73  nt..  #.  do_tes
0cd0: 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 31 30 20  t pager1-$tn.10 
0ce0: 7b 20 73 71 6c 31 20 7b 20 43 4f 4d 4d 49 54 20  { sql1 { COMMIT 
0cf0: 7d 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74  } } {}.  do_test
0d00: 20 70 61 67 65 72 31 2d 24 74 6e 2e 31 31 20 7b   pager1-$tn.11 {
0d10: 20 73 71 6c 31 20 7b 20 53 45 4c 45 43 54 20 2a   sql1 { SELECT *
0d20: 20 46 52 4f 4d 20 74 31 20 7d 20 7d 20 7b 31 20   FROM t1 } } {1 
0d30: 6f 6e 65 20 32 20 74 77 6f 20 33 20 74 68 72 65  one 2 two 3 thre
0d40: 65 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67  e}.  do_test pag
0d50: 65 72 31 2d 24 74 6e 2e 31 32 20 7b 20 73 71 6c  er1-$tn.12 { sql
0d60: 32 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  2 { SELECT * FRO
0d70: 4d 20 74 31 20 7d 20 7d 20 7b 31 20 6f 6e 65 20  M t1 } } {1 one 
0d80: 32 20 74 77 6f 20 33 20 74 68 72 65 65 7d 0a 20  2 two 3 three}. 
0d90: 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
0da0: 24 74 6e 2e 31 33 20 7b 20 73 71 6c 33 20 7b 20  $tn.13 { sql3 { 
0db0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
0dc0: 20 7d 20 7d 20 7b 31 20 6f 6e 65 20 32 20 74 77   } } {1 one 2 tw
0dd0: 6f 20 33 20 74 68 72 65 65 7d 0a 0a 20 20 23 20  o 3 three}..  # 
0de0: 43 68 65 63 6b 20 74 68 61 74 2c 20 61 73 20 6e  Check that, as n
0df0: 6f 74 65 64 20 61 62 6f 76 65 2c 20 5b 64 62 32  oted above, [db2
0e00: 5d 20 72 65 61 6c 6c 79 20 64 69 64 20 6b 65 65  ] really did kee
0e10: 70 20 61 6e 20 6f 70 65 6e 20 74 72 61 6e 73 61  p an open transa
0e20: 63 74 69 6f 6e 0a 20 20 23 20 61 66 74 65 72 20  ction.  # after 
0e30: 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 77  the attempt to w
0e40: 72 69 74 65 20 74 68 65 20 64 61 74 61 62 61 73  rite the databas
0e50: 65 20 66 61 69 6c 65 64 2e 0a 20 20 23 0a 20 20  e failed..  #.  
0e60: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24  do_test pager1-$
0e70: 74 6e 2e 31 34 20 7b 20 0a 20 20 20 20 63 73 71  tn.14 { .    csq
0e80: 6c 32 20 7b 20 42 45 47 49 4e 20 7d 20 0a 20 20  l2 { BEGIN } .  
0e90: 7d 20 7b 31 20 7b 63 61 6e 6e 6f 74 20 73 74 61  } {1 {cannot sta
0ea0: 72 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  rt a transaction
0eb0: 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73 61   within a transa
0ec0: 63 74 69 6f 6e 7d 7d 0a 20 20 64 6f 5f 74 65 73  ction}}.  do_tes
0ed0: 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 31 35 20  t pager1-$tn.15 
0ee0: 7b 20 73 71 6c 32 20 7b 20 52 4f 4c 4c 42 41 43  { sql2 { ROLLBAC
0ef0: 4b 20 7d 20 7d 20 7b 7d 0a 0a 20 20 23 20 48 61  K } } {}..  # Ha
0f00: 76 65 20 5b 64 62 32 5d 20 6f 70 65 6e 20 61 20  ve [db2] open a 
0f10: 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20  transaction and 
0f20: 74 61 6b 65 20 61 20 72 65 61 64 2d 6c 6f 63 6b  take a read-lock
0f30: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
0f40: 2e 0a 20 20 23 20 43 68 65 63 6b 20 74 68 61 74  ..  # Check that
0f50: 20 74 68 69 73 20 70 72 65 76 65 6e 74 73 20 5b   this prevents [
0f60: 64 62 5d 20 66 72 6f 6d 20 77 72 69 74 69 6e 67  db] from writing
0f70: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
0f80: 20 28 6f 75 74 73 69 64 65 0a 20 20 23 20 6f 66   (outside.  # of
0f90: 20 61 6e 79 20 74 72 61 6e 73 61 63 74 69 6f 6e   any transaction
0fa0: 29 2e 20 41 66 74 65 72 20 74 68 69 73 20 66 61  ). After this fa
0fb0: 69 6c 73 2c 20 63 68 65 63 6b 20 74 68 61 74 20  ils, check that 
0fc0: 5b 64 62 33 5d 20 63 61 6e 20 72 65 61 64 0a 20  [db3] can read. 
0fd0: 20 23 20 74 68 65 20 64 62 20 28 73 68 6f 77 69   # the db (showi
0fe0: 6e 67 20 74 68 61 74 20 5b 64 62 5d 20 64 69 64  ng that [db] did
0ff0: 20 6e 6f 74 20 74 61 6b 65 20 61 20 50 45 4e 44   not take a PEND
1000: 49 4e 47 20 6c 6f 63 6b 20 65 74 63 2e 29 0a 20  ING lock etc.). 
1010: 20 23 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67   #.  do_test pag
1020: 65 72 31 2d 24 74 6e 2e 31 35 20 7b 20 0a 20 20  er1-$tn.15 { .  
1030: 20 20 73 71 6c 32 20 7b 20 42 45 47 49 4e 3b 20    sql2 { BEGIN; 
1040: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
1050: 3b 20 7d 0a 20 20 7d 20 7b 31 20 6f 6e 65 20 32  ; }.  } {1 one 2
1060: 20 74 77 6f 20 33 20 74 68 72 65 65 7d 0a 20 20   two 3 three}.  
1070: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24  do_test pager1-$
1080: 74 6e 2e 31 36 20 7b 20 0a 20 20 20 20 63 73 71  tn.16 { .    csq
1090: 6c 31 20 7b 20 55 50 44 41 54 45 20 74 31 20 53  l1 { UPDATE t1 S
10a0: 45 54 20 61 20 3d 20 61 20 2b 20 31 30 20 7d 0a  ET a = a + 10 }.
10b0: 20 20 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65    } {1 {database
10c0: 20 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 20 20 64   is locked}}.  d
10d0: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24 74  o_test pager1-$t
10e0: 6e 2e 31 37 20 7b 20 73 71 6c 33 20 7b 20 53 45  n.17 { sql3 { SE
10f0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d  LECT * FROM t1 }
1100: 20 7d 20 7b 31 20 6f 6e 65 20 32 20 74 77 6f 20   } {1 one 2 two 
1110: 33 20 74 68 72 65 65 7d 0a 0a 20 20 23 20 54 68  3 three}..  # Th
1120: 69 73 20 74 69 6d 65 2c 20 68 61 76 65 20 5b 64  is time, have [d
1130: 62 5d 20 6f 70 65 6e 20 61 20 74 72 61 6e 73 61  b] open a transa
1140: 63 74 69 6f 6e 20 62 65 66 6f 72 65 20 77 72 69  ction before wri
1150: 74 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ting the databas
1160: 65 2e 0a 20 20 23 20 54 68 69 73 20 77 6f 72 6b  e..  # This work
1170: 73 20 2d 20 5b 64 62 5d 20 67 65 74 73 20 61 20  s - [db] gets a 
1180: 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 77 68  RESERVED lock wh
1190: 69 63 68 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e  ich does not con
11a0: 66 6c 69 63 74 20 77 69 74 68 0a 20 20 23 20 74  flict with.  # t
11b0: 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 5b  he SHARED lock [
11c0: 64 62 32 5d 20 69 73 20 68 6f 6c 64 69 6e 67 2e  db2] is holding.
11d0: 0a 20 20 23 0a 20 20 64 6f 5f 74 65 73 74 20 70  .  #.  do_test p
11e0: 61 67 65 72 31 2d 24 74 6e 2e 31 38 20 7b 20 0a  ager1-$tn.18 { .
11f0: 20 20 20 20 73 71 6c 31 20 7b 20 0a 20 20 20 20      sql1 { .    
1200: 20 20 42 45 47 49 4e 3b 20 20 0a 20 20 20 20 20    BEGIN;  .     
1210: 20 55 50 44 41 54 45 20 74 31 20 53 45 54 20 61   UPDATE t1 SET a
1220: 20 3d 20 61 20 2b 20 31 30 3b 20 0a 20 20 20 20   = a + 10; .    
1230: 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65  }.  } {}.  do_te
1240: 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2d 31 39  st pager1-$tn-19
1250: 20 7b 20 0a 20 20 20 20 73 71 6c 31 20 7b 20 50   { .    sql1 { P
1260: 52 41 47 4d 41 20 6c 6f 63 6b 5f 73 74 61 74 75  RAGMA lock_statu
1270: 73 20 7d 20 0a 20 20 7d 20 7b 6d 61 69 6e 20 72  s } .  } {main r
1280: 65 73 65 72 76 65 64 20 74 65 6d 70 20 63 6c 6f  eserved temp clo
1290: 73 65 64 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70  sed}.  do_test p
12a0: 61 67 65 72 31 2d 24 74 6e 2d 32 30 20 7b 20 0a  ager1-$tn-20 { .
12b0: 20 20 20 20 73 71 6c 32 20 7b 20 50 52 41 47 4d      sql2 { PRAGM
12c0: 41 20 6c 6f 63 6b 5f 73 74 61 74 75 73 20 7d 20  A lock_status } 
12d0: 0a 20 20 7d 20 7b 6d 61 69 6e 20 73 68 61 72 65  .  } {main share
12e0: 64 20 74 65 6d 70 20 63 6c 6f 73 65 64 7d 0a 0a  d temp closed}..
12f0: 20 20 23 20 43 68 65 63 6b 20 74 68 61 74 20 61    # Check that a
1300: 6c 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 63  ll connections c
1310: 61 6e 20 73 74 69 6c 6c 20 72 65 61 64 20 74 68  an still read th
1320: 65 20 64 61 74 61 62 61 73 65 2e 20 4f 6e 6c 79  e database. Only
1330: 20 5b 64 62 5d 20 73 65 65 73 0a 20 20 23 20 74   [db] sees.  # t
1340: 68 65 20 75 70 64 61 74 65 64 20 63 6f 6e 74 65  he updated conte
1350: 6e 74 20 28 61 73 20 74 68 65 20 74 72 61 6e 73  nt (as the trans
1360: 61 63 74 69 6f 6e 20 68 61 73 20 6e 6f 74 20 62  action has not b
1370: 65 65 6e 20 63 6f 6d 6d 69 74 74 65 64 20 79 65  een committed ye
1380: 74 29 2e 0a 20 20 23 0a 20 20 64 6f 5f 74 65 73  t)..  #.  do_tes
1390: 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 32 31 20  t pager1-$tn.21 
13a0: 7b 20 73 71 6c 31 20 7b 20 53 45 4c 45 43 54 20  { sql1 { SELECT 
13b0: 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7d 20 7b 31  * FROM t1 } } {1
13c0: 31 20 6f 6e 65 20 31 32 20 74 77 6f 20 31 33 20  1 one 12 two 13 
13d0: 74 68 72 65 65 7d 0a 20 20 64 6f 5f 74 65 73 74  three}.  do_test
13e0: 20 70 61 67 65 72 31 2d 24 74 6e 2e 32 32 20 7b   pager1-$tn.22 {
13f0: 20 73 71 6c 32 20 7b 20 53 45 4c 45 43 54 20 2a   sql2 { SELECT *
1400: 20 46 52 4f 4d 20 74 31 20 7d 20 7d 20 7b 31 20   FROM t1 } } {1 
1410: 6f 6e 65 20 32 20 74 77 6f 20 33 20 74 68 72 65  one 2 two 3 thre
1420: 65 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67  e}.  do_test pag
1430: 65 72 31 2d 24 74 6e 2e 32 33 20 7b 20 73 71 6c  er1-$tn.23 { sql
1440: 33 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  3 { SELECT * FRO
1450: 4d 20 74 31 20 7d 20 7d 20 7b 31 20 6f 6e 65 20  M t1 } } {1 one 
1460: 32 20 74 77 6f 20 33 20 74 68 72 65 65 7d 0a 0a  2 two 3 three}..
1470: 20 20 23 20 42 65 63 61 75 73 65 20 5b 64 62 32    # Because [db2
1480: 5d 20 73 74 69 6c 6c 20 68 61 73 20 74 68 65 20  ] still has the 
1490: 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 5b 64 62  SHARED lock, [db
14a0: 5d 20 69 73 20 75 6e 61 62 6c 65 20 74 6f 20 63  ] is unable to c
14b0: 6f 6d 6d 69 74 20 74 68 65 0a 20 20 23 20 74 72  ommit the.  # tr
14c0: 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 69 74  ansaction. If it
14d0: 20 74 72 69 65 73 2c 20 61 6e 20 65 72 72 6f 72   tries, an error
14e0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
14f0: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
1500: 0a 20 20 23 20 75 70 67 72 61 64 65 73 20 74 6f  .  # upgrades to
1510: 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 2e   a PENDING lock.
1520: 0a 20 20 23 0a 20 20 23 20 4f 6e 63 65 20 74 68  .  #.  # Once th
1530: 69 73 20 68 61 70 70 65 6e 73 2c 20 5b 64 62 5d  is happens, [db]
1540: 20 63 61 6e 20 72 65 61 64 20 74 68 65 20 64 61   can read the da
1550: 74 61 62 61 73 65 20 61 6e 64 20 73 65 65 20 74  tabase and see t
1560: 68 65 20 6e 65 77 20 63 6f 6e 74 65 6e 74 2c 0a  he new content,.
1570: 20 20 23 20 5b 64 62 32 5d 20 28 73 74 69 6c 6c    # [db2] (still
1580: 20 68 6f 6c 64 69 6e 67 20 53 48 41 52 45 44 29   holding SHARED)
1590: 20 63 61 6e 20 73 74 69 6c 6c 20 72 65 61 64 20   can still read 
15a0: 74 68 65 20 6f 6c 64 20 63 6f 6e 74 65 6e 74 2c  the old content,
15b0: 20 62 75 74 20 5b 64 62 33 5d 0a 20 20 23 20 28   but [db3].  # (
15c0: 6e 6f 74 20 68 6f 6c 64 69 6e 67 20 61 6e 79 20  not holding any 
15d0: 6c 6f 63 6b 29 20 69 73 20 70 72 65 76 65 6e 74  lock) is prevent
15e0: 65 64 20 62 79 20 5b 64 62 5d 27 73 20 50 45 4e  ed by [db]'s PEN
15f0: 44 49 4e 47 20 66 72 6f 6d 20 72 65 61 64 69 6e  DING from readin
1600: 67 0a 20 20 23 20 74 68 65 20 64 61 74 61 62 61  g.  # the databa
1610: 73 65 2e 0a 20 20 23 0a 20 20 64 6f 5f 74 65 73  se..  #.  do_tes
1620: 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 32 34 20  t pager1-$tn.24 
1630: 7b 20 63 73 71 6c 31 20 7b 20 43 4f 4d 4d 49 54  { csql1 { COMMIT
1640: 20 7d 20 7d 20 7b 31 20 7b 64 61 74 61 62 61 73   } } {1 {databas
1650: 65 20 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 20 20  e is locked}}.  
1660: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24  do_test pager1-$
1670: 74 6e 2d 32 35 20 7b 20 0a 20 20 20 20 73 71 6c  tn-25 { .    sql
1680: 31 20 7b 20 50 52 41 47 4d 41 20 6c 6f 63 6b 5f  1 { PRAGMA lock_
1690: 73 74 61 74 75 73 20 7d 20 0a 20 20 7d 20 7b 6d  status } .  } {m
16a0: 61 69 6e 20 70 65 6e 64 69 6e 67 20 74 65 6d 70  ain pending temp
16b0: 20 63 6c 6f 73 65 64 7d 0a 20 20 64 6f 5f 74 65   closed}.  do_te
16c0: 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 32 36  st pager1-$tn.26
16d0: 20 7b 20 73 71 6c 31 20 7b 20 53 45 4c 45 43 54   { sql1 { SELECT
16e0: 20 2a 20 46 52 4f 4d 20 74 31 20 20 7d 20 7d 20   * FROM t1  } } 
16f0: 7b 31 31 20 6f 6e 65 20 31 32 20 74 77 6f 20 31  {11 one 12 two 1
1700: 33 20 74 68 72 65 65 7d 0a 20 20 64 6f 5f 74 65  3 three}.  do_te
1710: 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 32 37  st pager1-$tn.27
1720: 20 7b 20 73 71 6c 32 20 7b 20 53 45 4c 45 43 54   { sql2 { SELECT
1730: 20 2a 20 46 52 4f 4d 20 74 31 20 20 7d 20 7d 20   * FROM t1  } } 
1740: 7b 31 20 6f 6e 65 20 32 20 74 77 6f 20 33 20 74  {1 one 2 two 3 t
1750: 68 72 65 65 7d 0a 20 20 64 6f 5f 74 65 73 74 20  hree}.  do_test 
1760: 70 61 67 65 72 31 2d 24 74 6e 2e 32 38 20 7b 20  pager1-$tn.28 { 
1770: 63 73 71 6c 33 20 7b 20 53 45 4c 45 43 54 20 2a  csql3 { SELECT *
1780: 20 46 52 4f 4d 20 74 31 20 7d 20 7d 20 7b 31 20   FROM t1 } } {1 
1790: 7b 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63  {database is loc
17a0: 6b 65 64 7d 7d 0a 0a 20 20 23 20 48 61 76 65 20  ked}}..  # Have 
17b0: 5b 64 62 32 5d 20 63 6f 6d 6d 69 74 20 69 74 73  [db2] commit its
17c0: 20 72 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f   read transactio
17d0: 6e 2c 20 72 65 6c 65 61 73 69 6e 67 20 74 68 65  n, releasing the
17e0: 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 74 0a   SHARED lock it.
17f0: 20 20 23 20 69 73 20 68 6f 6c 64 69 6e 67 2e 20    # is holding. 
1800: 4e 6f 77 2c 20 6e 65 69 74 68 65 72 20 5b 64 62  Now, neither [db
1810: 32 5d 20 6e 6f 72 20 5b 64 62 33 5d 20 6d 61 79  2] nor [db3] may
1820: 20 72 65 61 64 20 74 68 65 20 64 61 74 61 62 61   read the databa
1830: 73 65 20 28 61 73 20 5b 64 62 5d 0a 20 20 23 20  se (as [db].  # 
1840: 69 73 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67  is still holding
1850: 20 61 20 50 45 4e 44 49 4e 47 29 2e 0a 20 20 23   a PENDING)..  #
1860: 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72  .  do_test pager
1870: 31 2d 24 74 6e 2e 32 39 20 7b 20 73 71 6c 32 20  1-$tn.29 { sql2 
1880: 7b 20 43 4f 4d 4d 49 54 20 7d 20 7d 20 7b 7d 0a  { COMMIT } } {}.
1890: 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
18a0: 2d 24 74 6e 2e 33 30 20 7b 20 63 73 71 6c 32 20  -$tn.30 { csql2 
18b0: 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  { SELECT * FROM 
18c0: 74 31 20 7d 20 7d 20 7b 31 20 7b 64 61 74 61 62  t1 } } {1 {datab
18d0: 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a  ase is locked}}.
18e0: 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
18f0: 2d 24 74 6e 2e 33 31 20 7b 20 63 73 71 6c 33 20  -$tn.31 { csql3 
1900: 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  { SELECT * FROM 
1910: 74 31 20 7d 20 7d 20 7b 31 20 7b 64 61 74 61 62  t1 } } {1 {datab
1920: 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a  ase is locked}}.
1930: 0a 20 20 23 20 5b 64 62 5d 20 69 73 20 6e 6f 77  .  # [db] is now
1940: 20 61 62 6c 65 20 74 6f 20 63 6f 6d 6d 69 74 20   able to commit 
1950: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
1960: 20 4f 6e 63 65 20 74 68 65 20 74 72 61 6e 73 61   Once the transa
1970: 63 74 69 6f 6e 20 69 73 20 0a 20 20 23 20 63 6f  ction is .  # co
1980: 6d 6d 69 74 74 65 64 2c 20 61 6c 6c 20 74 68 72  mmitted, all thr
1990: 65 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 63  ee connections c
19a0: 61 6e 20 72 65 61 64 20 74 68 65 20 6e 65 77 20  an read the new 
19b0: 63 6f 6e 74 65 6e 74 2e 0a 20 20 23 0a 20 20 64  content..  #.  d
19c0: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24 74  o_test pager1-$t
19d0: 6e 2e 32 35 20 7b 20 73 71 6c 31 20 7b 20 55 50  n.25 { sql1 { UP
19e0: 44 41 54 45 20 74 31 20 53 45 54 20 61 20 3d 20  DATE t1 SET a = 
19f0: 61 2b 31 30 20 7d 20 7d 20 7b 7d 0a 20 20 64 6f  a+10 } } {}.  do
1a00: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e  _test pager1-$tn
1a10: 2e 32 36 20 7b 20 73 71 6c 31 20 7b 20 43 4f 4d  .26 { sql1 { COM
1a20: 4d 49 54 20 7d 20 7d 20 7b 7d 0a 20 20 64 6f 5f  MIT } } {}.  do_
1a30: 74 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e  test pager1-$tn.
1a40: 32 37 20 7b 20 73 71 6c 31 20 7b 20 53 45 4c 45  27 { sql1 { SELE
1a50: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7d  CT * FROM t1 } }
1a60: 20 7b 32 31 20 6f 6e 65 20 32 32 20 74 77 6f 20   {21 one 22 two 
1a70: 32 33 20 74 68 72 65 65 7d 0a 20 20 64 6f 5f 74  23 three}.  do_t
1a80: 65 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 32  est pager1-$tn.2
1a90: 37 20 7b 20 73 71 6c 32 20 7b 20 53 45 4c 45 43  7 { sql2 { SELEC
1aa0: 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7d 20  T * FROM t1 } } 
1ab0: 7b 32 31 20 6f 6e 65 20 32 32 20 74 77 6f 20 32  {21 one 22 two 2
1ac0: 33 20 74 68 72 65 65 7d 0a 20 20 64 6f 5f 74 65  3 three}.  do_te
1ad0: 73 74 20 70 61 67 65 72 31 2d 24 74 6e 2e 32 38  st pager1-$tn.28
1ae0: 20 7b 20 73 71 6c 33 20 7b 20 53 45 4c 45 43 54   { sql3 { SELECT
1af0: 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7d 20 7b   * FROM t1 } } {
1b00: 32 31 20 6f 6e 65 20 32 32 20 74 77 6f 20 32 33  21 one 22 two 23
1b10: 20 74 68 72 65 65 7d 0a 7d 0a 0a 23 2d 2d 2d 2d   three}.}..#----
1b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1b40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1b50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1b60: 2d 2d 2d 2d 2d 0a 23 20 53 61 76 65 70 6f 69 6e  -----.# Savepoin
1b70: 74 20 72 65 6c 61 74 65 64 20 74 65 73 74 20 63  t related test c
1b80: 61 73 65 73 2e 0a 23 0a 23 20 70 61 67 65 72 31  ases..#.# pager1
1b90: 2d 33 2e 31 2e 32 2e 2a 3a 20 46 6f 72 63 65 20  -3.1.2.*: Force 
1ba0: 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c  a savepoint roll
1bb0: 62 61 63 6b 20 74 6f 20 63 61 75 73 65 20 74 68  back to cause th
1bc0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a  e database file.
1bd0: 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  #               
1be0: 20 20 74 6f 20 67 72 6f 77 2e 0a 23 20 0a 64 6f    to grow..# .do
1bf0: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 33 2e 31  _test pager1-3.1
1c00: 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f  .1 {.  faultsim_
1c10: 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65  delete_and_reope
1c20: 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  n.  execsql {.  
1c30: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
1c40: 31 28 61 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  1(a PRIMARY KEY,
1c50: 20 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20   b);.    CREATE 
1c60: 54 41 42 4c 45 20 63 6f 75 6e 74 65 72 28 0a 20  TABLE counter(. 
1c70: 20 20 20 20 20 69 20 43 48 45 43 4b 20 28 69 3c       i CHECK (i<
1c80: 35 29 2c 20 0a 20 20 20 20 20 20 75 20 43 48 45  5), .      u CHE
1c90: 43 4b 20 28 75 3c 31 30 29 0a 20 20 20 20 29 3b  CK (u<10).    );
1ca0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
1cb0: 20 63 6f 75 6e 74 65 72 20 56 41 4c 55 45 53 28   counter VALUES(
1cc0: 30 2c 20 30 29 3b 0a 20 20 20 20 43 52 45 41 54  0, 0);.    CREAT
1cd0: 45 20 54 52 49 47 47 45 52 20 74 72 31 20 41 46  E TRIGGER tr1 AF
1ce0: 54 45 52 20 49 4e 53 45 52 54 20 4f 4e 20 74 31  TER INSERT ON t1
1cf0: 20 42 45 47 49 4e 0a 20 20 20 20 20 20 55 50 44   BEGIN.      UPD
1d00: 41 54 45 20 63 6f 75 6e 74 65 72 20 53 45 54 20  ATE counter SET 
1d10: 69 20 3d 20 69 2b 31 3b 0a 20 20 20 20 45 4e 44  i = i+1;.    END
1d20: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 52 49  ;.    CREATE TRI
1d30: 47 47 45 52 20 74 72 32 20 41 46 54 45 52 20 55  GGER tr2 AFTER U
1d40: 50 44 41 54 45 20 4f 4e 20 74 31 20 42 45 47 49  PDATE ON t1 BEGI
1d50: 4e 0a 20 20 20 20 20 20 55 50 44 41 54 45 20 63  N.      UPDATE c
1d60: 6f 75 6e 74 65 72 20 53 45 54 20 75 20 3d 20 75  ounter SET u = u
1d70: 2b 31 3b 0a 20 20 20 20 45 4e 44 3b 0a 20 20 7d  +1;.    END;.  }
1d80: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c  .  execsql { SEL
1d90: 45 43 54 20 2a 20 46 52 4f 4d 20 63 6f 75 6e 74  ECT * FROM count
1da0: 65 72 20 7d 0a 7d 20 7b 30 20 30 7d 0a 0a 64 6f  er }.} {0 0}..do
1db0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61  _execsql_test pa
1dc0: 67 65 72 31 2d 33 2e 31 2e 32 20 7b 0a 20 20 42  ger1-3.1.2 {.  B
1dd0: 45 47 49 4e 3b 0a 20 20 20 20 49 4e 53 45 52 54  EGIN;.    INSERT
1de0: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
1df0: 31 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35  1, randomblob(15
1e00: 30 30 29 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  00));.    INSERT
1e10: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
1e20: 32 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35  2, randomblob(15
1e30: 30 30 29 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  00));.    INSERT
1e40: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
1e50: 33 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35  3, randomblob(15
1e60: 30 30 29 29 3b 0a 20 20 20 20 53 45 4c 45 43 54  00));.    SELECT
1e70: 20 2a 20 46 52 4f 4d 20 63 6f 75 6e 74 65 72 3b   * FROM counter;
1e80: 0a 7d 20 7b 33 20 30 7d 0a 64 6f 5f 63 61 74 63  .} {3 0}.do_catc
1e90: 68 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31  hsql_test pager1
1ea0: 2d 33 2e 31 2e 33 20 7b 0a 20 20 20 20 49 4e 53  -3.1.3 {.    INS
1eb0: 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
1ec0: 43 54 20 61 2b 33 2c 20 72 61 6e 64 6f 6d 62 6c  CT a+3, randombl
1ed0: 6f 62 28 31 35 30 30 29 20 46 52 4f 4d 20 74 31  ob(1500) FROM t1
1ee0: 0a 7d 20 7b 31 20 7b 63 6f 6e 73 74 72 61 69 6e  .} {1 {constrain
1ef0: 74 20 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f 65 78  t failed}}.do_ex
1f00: 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72  ecsql_test pager
1f10: 31 2d 33 2e 34 20 7b 20 53 45 4c 45 43 54 20 2a  1-3.4 { SELECT *
1f20: 20 46 52 4f 4d 20 63 6f 75 6e 74 65 72 20 7d 20   FROM counter } 
1f30: 7b 33 20 30 7d 0a 64 6f 5f 65 78 65 63 73 71 6c  {3 0}.do_execsql
1f40: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 33 2e 35  _test pager1-3.5
1f50: 20 7b 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d   { SELECT a FROM
1f60: 20 74 31 20 7d 20 7b 31 20 32 20 33 7d 0a 64 6f   t1 } {1 2 3}.do
1f70: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61  _execsql_test pa
1f80: 67 65 72 31 2d 33 2e 36 20 7b 20 43 4f 4d 4d 49  ger1-3.6 { COMMI
1f90: 54 20 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74 20  T } {}..do_test 
1fa0: 70 61 67 65 72 31 2d 33 2e 32 2e 31 20 7b 0a 20  pager1-3.2.1 {. 
1fb0: 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65   faultsim_delete
1fc0: 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 64 62  _and_reopen.  db
1fd0: 20 66 75 6e 63 20 61 5f 73 74 72 69 6e 67 20 61   func a_string a
1fe0: 5f 73 74 72 69 6e 67 0a 20 20 65 78 65 63 73 71  _string.  execsq
1ff0: 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 61  l {.    PRAGMA a
2000: 75 74 6f 5f 76 61 63 75 75 6d 20 3d 20 32 3b 0a  uto_vacuum = 2;.
2010: 20 20 20 20 50 52 41 47 4d 41 20 63 61 63 68 65      PRAGMA cache
2020: 5f 73 69 7a 65 20 3d 20 31 30 3b 0a 20 20 20 20  _size = 10;.    
2030: 43 52 45 41 54 45 20 54 41 42 4c 45 20 7a 28 78  CREATE TABLE z(x
2040: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
2050: 20 4b 45 59 2c 20 79 29 3b 0a 20 20 20 20 42 45   KEY, y);.    BE
2060: 47 49 4e 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  GIN;.      INSER
2070: 54 20 49 4e 54 4f 20 7a 20 56 41 4c 55 45 53 28  T INTO z VALUES(
2080: 4e 55 4c 4c 2c 20 61 5f 73 74 72 69 6e 67 28 38  NULL, a_string(8
2090: 30 30 29 29 3b 0a 20 20 20 20 20 20 49 4e 53 45  00));.      INSE
20a0: 52 54 20 49 4e 54 4f 20 7a 20 53 45 4c 45 43 54  RT INTO z SELECT
20b0: 20 4e 55 4c 4c 2c 20 61 5f 73 74 72 69 6e 67 28   NULL, a_string(
20c0: 38 30 30 29 20 46 52 4f 4d 20 7a 3b 20 20 20 20  800) FROM z;    
20d0: 20 2d 2d 20 20 20 32 0a 20 20 20 20 20 20 49 4e   --   2.      IN
20e0: 53 45 52 54 20 49 4e 54 4f 20 7a 20 53 45 4c 45  SERT INTO z SELE
20f0: 43 54 20 4e 55 4c 4c 2c 20 61 5f 73 74 72 69 6e  CT NULL, a_strin
2100: 67 28 38 30 30 29 20 46 52 4f 4d 20 7a 3b 20 20  g(800) FROM z;  
2110: 20 20 20 2d 2d 20 20 20 34 0a 20 20 20 20 20 20     --   4.      
2120: 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a 20 53 45  INSERT INTO z SE
2130: 4c 45 43 54 20 4e 55 4c 4c 2c 20 61 5f 73 74 72  LECT NULL, a_str
2140: 69 6e 67 28 38 30 30 29 20 46 52 4f 4d 20 7a 3b  ing(800) FROM z;
2150: 20 20 20 20 20 2d 2d 20 20 20 38 0a 20 20 20 20       --   8.    
2160: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a 20    INSERT INTO z 
2170: 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 61 5f 73  SELECT NULL, a_s
2180: 74 72 69 6e 67 28 38 30 30 29 20 46 52 4f 4d 20  tring(800) FROM 
2190: 7a 3b 20 20 20 20 20 2d 2d 20 20 31 36 0a 20 20  z;     --  16.  
21a0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
21b0: 7a 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 61  z SELECT NULL, a
21c0: 5f 73 74 72 69 6e 67 28 38 30 30 29 20 46 52 4f  _string(800) FRO
21d0: 4d 20 7a 3b 20 20 20 20 20 2d 2d 20 20 33 32 0a  M z;     --  32.
21e0: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
21f0: 4f 20 7a 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c  O z SELECT NULL,
2200: 20 61 5f 73 74 72 69 6e 67 28 38 30 30 29 20 46   a_string(800) F
2210: 52 4f 4d 20 7a 3b 20 20 20 20 20 2d 2d 20 20 36  ROM z;     --  6
2220: 34 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  4.      INSERT I
2230: 4e 54 4f 20 7a 20 53 45 4c 45 43 54 20 4e 55 4c  NTO z SELECT NUL
2240: 4c 2c 20 61 5f 73 74 72 69 6e 67 28 38 30 30 29  L, a_string(800)
2250: 20 46 52 4f 4d 20 7a 3b 20 20 20 20 20 2d 2d 20   FROM z;     -- 
2260: 31 32 38 0a 20 20 20 20 20 20 49 4e 53 45 52 54  128.      INSERT
2270: 20 49 4e 54 4f 20 7a 20 53 45 4c 45 43 54 20 4e   INTO z SELECT N
2280: 55 4c 4c 2c 20 61 5f 73 74 72 69 6e 67 28 38 30  ULL, a_string(80
2290: 30 29 20 46 52 4f 4d 20 7a 3b 20 20 20 20 20 2d  0) FROM z;     -
22a0: 2d 20 32 35 36 0a 20 20 20 20 43 4f 4d 4d 49 54  - 256.    COMMIT
22b0: 3b 0a 20 20 7d 0a 20 20 65 78 65 63 73 71 6c 20  ;.  }.  execsql 
22c0: 7b 20 50 52 41 47 4d 41 20 61 75 74 6f 5f 76 61  { PRAGMA auto_va
22d0: 63 75 75 6d 20 7d 0a 7d 20 7b 32 7d 0a 64 6f 5f  cuum }.} {2}.do_
22e0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67  execsql_test pag
22f0: 65 72 31 2d 33 2e 32 2e 32 20 7b 0a 20 20 42 45  er1-3.2.2 {.  BE
2300: 47 49 4e 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  GIN;.    INSERT 
2310: 49 4e 54 4f 20 7a 20 56 41 4c 55 45 53 28 4e 55  INTO z VALUES(NU
2320: 4c 4c 2c 20 61 5f 73 74 72 69 6e 67 28 38 30 30  LL, a_string(800
2330: 29 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ));.    INSERT I
2340: 4e 54 4f 20 7a 20 56 41 4c 55 45 53 28 4e 55 4c  NTO z VALUES(NUL
2350: 4c 2c 20 61 5f 73 74 72 69 6e 67 28 38 30 30 29  L, a_string(800)
2360: 29 3b 0a 20 20 20 20 53 41 56 45 50 4f 49 4e 54  );.    SAVEPOINT
2370: 20 6f 6e 65 3b 0a 20 20 20 20 20 20 44 45 4c 45   one;.      DELE
2380: 54 45 20 46 52 4f 4d 20 7a 20 57 48 45 52 45 20  TE FROM z WHERE 
2390: 78 3e 32 35 36 3b 0a 20 20 20 20 20 20 50 52 41  x>256;.      PRA
23a0: 47 4d 41 20 69 6e 63 72 65 6d 65 6e 74 61 6c 5f  GMA incremental_
23b0: 76 61 63 75 75 6d 3b 0a 20 20 20 20 20 20 53 45  vacuum;.      SE
23c0: 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
23d0: 4f 4d 20 7a 20 57 48 45 52 45 20 78 20 3c 20 31  OM z WHERE x < 1
23e0: 30 30 3b 0a 20 20 20 20 52 4f 4c 4c 42 41 43 4b  00;.    ROLLBACK
23f0: 20 54 4f 20 6f 6e 65 3b 0a 20 20 43 4f 4d 4d 49   TO one;.  COMMI
2400: 54 3b 0a 7d 20 7b 39 39 7d 0a 0a 23 2d 2d 2d 2d  T;.} {99}..#----
2410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2450: 2d 2d 2d 2d 2d 0a 23 20 48 6f 74 20 6a 6f 75 72  -----.# Hot jour
2460: 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 72 65 6c  nal rollback rel
2470: 61 74 65 64 20 74 65 73 74 20 63 61 73 65 73 2e  ated test cases.
2480: 0a 23 0a 23 20 70 61 67 65 72 31 2e 34 2e 31 2e  .#.# pager1.4.1.
2490: 2a 3a 20 54 65 73 74 20 74 68 61 74 20 74 68 65  *: Test that the
24a0: 20 70 61 67 65 72 20 6d 6f 64 75 6c 65 20 64 65   pager module de
24b0: 6c 65 74 65 73 20 76 65 72 79 20 73 6d 61 6c 6c  letes very small
24c0: 20 69 6e 76 61 6c 69 64 0a 23 20 20 20 20 20 20   invalid.#      
24d0: 20 20 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c           journal
24e0: 20 66 69 6c 65 73 2e 0a 23 0a 23 20 70 61 67 65   files..#.# page
24f0: 72 31 2e 34 2e 32 2e 2a 3a 20 54 65 73 74 20 74  r1.4.2.*: Test t
2500: 68 61 74 20 69 66 20 74 68 65 20 6d 61 73 74 65  hat if the maste
2510: 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65  r journal pointe
2520: 72 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  r at the end of 
2530: 61 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20  a.#             
2540: 20 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69    hot-journal fi
2550: 6c 65 20 61 70 70 65 61 72 73 20 74 6f 20 62 65  le appears to be
2560: 20 63 6f 72 72 75 70 74 20 28 63 68 65 63 6b 73   corrupt (checks
2570: 75 6d 20 64 6f 65 73 20 6e 6f 74 0a 23 20 20 20  um does not.#   
2580: 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6d 70              comp
2590: 75 74 65 29 20 74 68 65 20 61 73 73 6f 63 69 61  ute) the associa
25a0: 74 65 64 20 6a 6f 75 72 6e 61 6c 20 69 73 20 72  ted journal is r
25b0: 6f 6c 6c 65 64 20 62 61 63 6b 20 28 61 6e 64 20  olled back (and 
25c0: 6e 6f 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  no.#            
25d0: 20 20 20 78 41 63 63 65 73 73 28 29 20 63 61 6c     xAccess() cal
25e0: 6c 20 74 6f 20 63 68 65 63 6b 20 66 6f 72 20 74  l to check for t
25f0: 68 65 20 70 72 65 73 65 6e 63 65 20 6f 66 20 61  he presence of a
2600: 6e 79 20 6d 61 73 74 65 72 20 0a 23 20 20 20 20  ny master .#    
2610: 20 20 20 20 20 20 20 20 20 20 20 6a 6f 75 72 6e             journ
2620: 61 6c 20 66 69 6c 65 20 69 73 20 6d 61 64 65 29  al file is made)
2630: 2e 0a 23 0a 23 20 70 61 67 65 72 31 2e 34 2e 33  ..#.# pager1.4.3
2640: 2e 2a 3a 20 54 65 73 74 20 74 68 61 74 20 74 68  .*: Test that th
2650: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61 20  e contents of a 
2660: 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 61 72 65 20  hot-journal are 
2670: 69 67 6e 6f 72 65 64 20 69 66 20 74 68 65 0a 23  ignored if the.#
2680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
2690: 61 67 65 2d 73 69 7a 65 20 6f 72 20 73 65 63 74  age-size or sect
26a0: 6f 72 2d 73 69 7a 65 20 69 6e 20 74 68 65 20 6a  or-size in the j
26b0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 61 70  ournal header ap
26c0: 70 65 61 72 20 74 6f 0a 23 20 20 20 20 20 20 20  pear to.#       
26d0: 20 20 20 20 20 20 20 20 62 65 20 69 6e 76 61 6c          be inval
26e0: 69 64 20 28 74 6f 6f 20 6c 61 72 67 65 2c 20 74  id (too large, t
26f0: 6f 6f 20 73 6d 61 6c 6c 20 6f 72 20 6e 6f 74 20  oo small or not 
2700: 61 20 70 6f 77 65 72 20 6f 66 20 32 29 2e 0a 23  a power of 2)..#
2710: 0a 23 20 70 61 67 65 72 31 2e 34 2e 34 2e 2a 3a  .# pager1.4.4.*:
2720: 20 54 65 73 74 20 68 6f 74 2d 6a 6f 75 72 6e 61   Test hot-journa
2730: 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 6a 6f  l rollback of jo
2740: 75 72 6e 61 6c 20 66 69 6c 65 20 77 69 74 68 20  urnal file with 
2750: 61 20 6d 61 73 74 65 72 0a 23 20 20 20 20 20 20  a master.#      
2760: 20 20 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c           journal
2770: 20 70 6f 69 6e 74 65 72 20 67 65 6e 65 72 61 74   pointer generat
2780: 65 64 20 69 6e 20 76 61 72 69 6f 75 73 20 22 50  ed in various "P
2790: 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75  RAGMA synchronou
27a0: 73 22 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  s".#            
27b0: 20 20 20 6d 6f 64 65 73 2e 0a 23 0a 23 20 70 61     modes..#.# pa
27c0: 67 65 72 31 2e 34 2e 35 2e 2a 3a 20 54 65 73 74  ger1.4.5.*: Test
27d0: 20 74 68 61 74 20 68 6f 74 2d 6a 6f 75 72 6e 61   that hot-journa
27e0: 6c 20 72 6f 6c 6c 62 61 63 6b 20 73 74 6f 70 73  l rollback stops
27f0: 20 69 66 20 69 74 20 65 6e 63 6f 75 6e 74 65 72   if it encounter
2800: 73 20 61 0a 23 20 20 20 20 20 20 20 20 20 20 20  s a.#           
2810: 20 20 20 20 6a 6f 75 72 6e 61 6c 2d 72 65 63 6f      journal-reco
2820: 72 64 20 66 6f 72 20 77 68 69 63 68 20 74 68 65  rd for which the
2830: 20 63 68 65 63 6b 73 75 6d 20 66 61 69 6c 73 2e   checksum fails.
2840: 0a 23 0a 23 20 70 61 67 65 72 31 2e 34 2e 36 2e  .#.# pager1.4.6.
2850: 2a 3a 20 54 65 73 74 20 74 68 61 74 20 77 68 65  *: Test that whe
2860: 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61  n rolling back a
2870: 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 74 68 61   hot-journal tha
2880: 74 20 63 6f 6e 74 61 69 6e 73 20 61 0a 23 20 20  t contains a.#  
2890: 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 61 73               mas
28a0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  ter journal poin
28b0: 74 65 72 2c 20 74 68 65 20 6d 61 73 74 65 72 20  ter, the master 
28c0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
28d0: 64 65 6c 65 74 65 64 0a 23 20 20 20 20 20 20 20  deleted.#       
28e0: 20 20 20 20 20 20 20 20 61 66 74 65 72 20 61 6c          after al
28f0: 6c 20 74 68 65 20 68 6f 74 2d 6a 6f 75 72 6e 61  l the hot-journa
2900: 6c 73 20 74 68 61 74 20 72 65 66 65 72 20 74 6f  ls that refer to
2910: 20 69 74 20 61 72 65 20 64 65 6c 65 74 65 64 2e   it are deleted.
2920: 0a 23 20 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  .# .do_test page
2930: 72 31 2e 34 2e 31 2e 31 20 7b 0a 20 20 66 61 75  r1.4.1.1 {.  fau
2940: 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64  ltsim_delete_and
2950: 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65 63 73 71  _reopen.  execsq
2960: 6c 20 7b 20 0a 20 20 20 20 43 52 45 41 54 45 20  l { .    CREATE 
2970: 54 41 42 4c 45 20 78 28 79 2c 20 7a 29 3b 0a 20  TABLE x(y, z);. 
2980: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78     INSERT INTO x
2990: 20 56 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20   VALUES(1, 2);. 
29a0: 20 7d 0a 20 20 73 65 74 20 66 64 20 5b 6f 70 65   }.  set fd [ope
29b0: 6e 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61  n test.db-journa
29c0: 6c 20 77 5d 0a 20 20 70 75 74 73 20 2d 6e 6f 6e  l w].  puts -non
29d0: 65 77 6c 69 6e 65 20 24 66 64 20 22 68 65 6c 6c  ewline $fd "hell
29e0: 6f 77 6f 72 6c 64 22 0a 20 20 63 6c 6f 73 65 20  oworld".  close 
29f0: 24 66 64 0a 20 20 66 69 6c 65 20 65 78 69 73 74  $fd.  file exist
2a00: 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61  s test.db-journa
2a10: 6c 0a 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73 74 20  l.} {1}.do_test 
2a20: 70 61 67 65 72 31 2e 34 2e 31 2e 32 20 7b 20 65  pager1.4.1.2 { e
2a30: 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20  xecsql { SELECT 
2a40: 2a 20 46 52 4f 4d 20 78 20 7d 20 7d 20 7b 31 20  * FROM x } } {1 
2a50: 32 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  2}.do_test pager
2a60: 31 2e 34 2e 31 2e 33 20 7b 20 66 69 6c 65 20 65  1.4.1.3 { file e
2a70: 78 69 73 74 73 20 74 65 73 74 2e 64 62 2d 6a 6f  xists test.db-jo
2a80: 75 72 6e 61 6c 20 7d 20 7b 30 7d 0a 0a 23 20 53  urnal } {0}..# S
2a90: 65 74 20 75 70 20 61 20 5b 74 65 73 74 76 66 73  et up a [testvfs
2aa0: 5d 20 74 6f 20 73 6e 61 70 73 68 6f 74 20 74 68  ] to snapshot th
2ab0: 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 6a 75  e file-system ju
2ac0: 73 74 20 62 65 66 6f 72 65 20 53 51 4c 69 74 65  st before SQLite
2ad0: 0a 23 20 64 65 6c 65 74 65 73 20 74 68 65 20 6d  .# deletes the m
2ae0: 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 74 6f  aster-journal to
2af0: 20 63 6f 6d 6d 69 74 20 61 20 6d 75 6c 74 69 2d   commit a multi-
2b00: 66 69 6c 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  file transaction
2b10: 2e 0a 23 0a 23 20 49 6e 20 73 75 62 73 65 71 75  ..#.# In subsequ
2b20: 65 6e 74 20 74 65 73 74 20 63 61 73 65 73 2c 20  ent test cases, 
2b30: 69 6e 76 6f 6b 69 6e 67 20 5b 66 61 75 6c 74 73  invoking [faults
2b40: 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72  im_restore_and_r
2b50: 65 6f 70 65 6e 5d 20 73 65 74 73 0a 23 20 75 70  eopen] sets.# up
2b60: 20 74 68 65 20 66 69 6c 65 20 73 79 73 74 65 6d   the file system
2b70: 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 77 6f 20   to contain two 
2b80: 64 61 74 61 62 61 73 65 73 2c 20 74 77 6f 20 68  databases, two h
2b90: 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  ot-journal files
2ba0: 20 61 6e 64 0a 23 20 61 20 6d 61 73 74 65 72 2d   and.# a master-
2bb0: 6a 6f 75 72 6e 61 6c 2e 0a 23 0a 64 6f 5f 74 65  journal..#.do_te
2bc0: 73 74 20 70 61 67 65 72 31 2e 34 2e 32 2e 31 20  st pager1.4.2.1 
2bd0: 7b 0a 20 20 74 65 73 74 76 66 73 20 74 73 74 76  {.  testvfs tstv
2be0: 66 73 20 2d 64 65 66 61 75 6c 74 20 31 0a 20 20  fs -default 1.  
2bf0: 74 73 74 76 66 73 20 66 69 6c 74 65 72 20 78 44  tstvfs filter xD
2c00: 65 6c 65 74 65 0a 20 20 74 73 74 76 66 73 20 73  elete.  tstvfs s
2c10: 63 72 69 70 74 20 78 44 65 6c 65 74 65 43 61 6c  cript xDeleteCal
2c20: 6c 62 61 63 6b 0a 20 20 70 72 6f 63 20 78 44 65  lback.  proc xDe
2c30: 6c 65 74 65 43 61 6c 6c 62 61 63 6b 20 7b 6d 65  leteCallback {me
2c40: 74 68 6f 64 20 66 69 6c 65 20 61 72 67 73 7d 20  thod file args} 
2c50: 7b 0a 20 20 20 20 73 65 74 20 66 69 6c 65 20 5b  {.    set file [
2c60: 66 69 6c 65 20 74 61 69 6c 20 24 66 69 6c 65 5d  file tail $file]
2c70: 0a 20 20 20 20 69 66 20 7b 20 5b 73 74 72 69 6e  .    if { [strin
2c80: 67 20 6d 61 74 63 68 20 2a 6d 6a 2a 20 24 66 69  g match *mj* $fi
2c90: 6c 65 5d 20 7d 20 7b 20 66 61 75 6c 74 73 69 6d  le] } { faultsim
2ca0: 5f 73 61 76 65 20 7d 0a 20 20 7d 0a 20 20 66 61  _save }.  }.  fa
2cb0: 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e  ultsim_delete_an
2cc0: 64 5f 72 65 6f 70 65 6e 0a 20 20 64 62 20 66 75  d_reopen.  db fu
2cd0: 6e 63 20 61 5f 73 74 72 69 6e 67 20 61 5f 73 74  nc a_string a_st
2ce0: 72 69 6e 67 0a 20 20 65 78 65 63 73 71 6c 20 7b  ring.  execsql {
2cf0: 0a 20 20 20 20 41 54 54 41 43 48 20 27 74 65 73  .    ATTACH 'tes
2d00: 74 2e 64 62 32 27 20 41 53 20 61 75 78 3b 0a 20  t.db2' AS aux;. 
2d10: 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61     PRAGMA journa
2d20: 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c 45 54 45 3b  l_mode = DELETE;
2d30: 0a 20 20 20 20 50 52 41 47 4d 41 20 6d 61 69 6e  .    PRAGMA main
2d40: 2e 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 31 30  .cache_size = 10
2d50: 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 61 75 78  ;.    PRAGMA aux
2d60: 2e 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 31 30  .cache_size = 10
2d70: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
2d80: 4c 45 20 74 31 28 61 20 55 4e 49 51 55 45 2c 20  LE t1(a UNIQUE, 
2d90: 62 20 55 4e 49 51 55 45 29 3b 0a 20 20 20 20 43  b UNIQUE);.    C
2da0: 52 45 41 54 45 20 54 41 42 4c 45 20 61 75 78 2e  REATE TABLE aux.
2db0: 74 32 28 61 20 55 4e 49 51 55 45 2c 20 62 20 55  t2(a UNIQUE, b U
2dc0: 4e 49 51 55 45 29 3b 0a 20 20 20 20 49 4e 53 45  NIQUE);.    INSE
2dd0: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
2de0: 53 28 61 5f 73 74 72 69 6e 67 28 32 30 30 29 2c  S(a_string(200),
2df0: 20 61 5f 73 74 72 69 6e 67 28 33 30 30 29 29 3b   a_string(300));
2e00: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
2e10: 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74 72   t1 SELECT a_str
2e20: 69 6e 67 28 32 30 30 29 2c 20 61 5f 73 74 72 69  ing(200), a_stri
2e30: 6e 67 28 33 30 30 29 20 46 52 4f 4d 20 74 31 3b  ng(300) FROM t1;
2e40: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
2e50: 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74 72   t1 SELECT a_str
2e60: 69 6e 67 28 32 30 30 29 2c 20 61 5f 73 74 72 69  ing(200), a_stri
2e70: 6e 67 28 33 30 30 29 20 46 52 4f 4d 20 74 31 3b  ng(300) FROM t1;
2e80: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
2e90: 20 74 32 20 53 45 4c 45 43 54 20 2a 20 46 52 4f   t2 SELECT * FRO
2ea0: 4d 20 74 31 3b 0a 20 20 20 20 42 45 47 49 4e 3b  M t1;.    BEGIN;
2eb0: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
2ec0: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73  TO t1 SELECT a_s
2ed0: 74 72 69 6e 67 28 32 30 31 29 2c 20 61 5f 73 74  tring(201), a_st
2ee0: 72 69 6e 67 28 33 30 31 29 20 46 52 4f 4d 20 74  ring(301) FROM t
2ef0: 31 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  1;.      INSERT 
2f00: 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61  INTO t1 SELECT a
2f10: 5f 73 74 72 69 6e 67 28 32 30 32 29 2c 20 61 5f  _string(202), a_
2f20: 73 74 72 69 6e 67 28 33 30 32 29 20 46 52 4f 4d  string(302) FROM
2f30: 20 74 31 3b 0a 20 20 20 20 20 20 49 4e 53 45 52   t1;.      INSER
2f40: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
2f50: 20 61 5f 73 74 72 69 6e 67 28 32 30 33 29 2c 20   a_string(203), 
2f60: 61 5f 73 74 72 69 6e 67 28 33 30 33 29 20 46 52  a_string(303) FR
2f70: 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20 49 4e 53  OM t1;.      INS
2f80: 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
2f90: 43 54 20 61 5f 73 74 72 69 6e 67 28 32 30 34 29  CT a_string(204)
2fa0: 2c 20 61 5f 73 74 72 69 6e 67 28 33 30 34 29 20  , a_string(304) 
2fb0: 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20 52  FROM t1;.      R
2fc0: 45 50 4c 41 43 45 20 49 4e 54 4f 20 74 32 20 53  EPLACE INTO t2 S
2fd0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b  ELECT * FROM t1;
2fe0: 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d  .    COMMIT;.  }
2ff0: 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 74 73  .  db close.  ts
3000: 74 76 66 73 20 64 65 6c 65 74 65 0a 7d 20 7b 7d  tvfs delete.} {}
3010: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2e  .do_test pager1.
3020: 34 2e 32 2e 32 20 7b 0a 20 20 66 61 75 6c 74 73  4.2.2 {.  faults
3030: 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72  im_restore_and_r
3040: 65 6f 70 65 6e 0a 20 20 65 78 65 63 73 71 6c 20  eopen.  execsql 
3050: 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75  {.    SELECT cou
3060: 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31 3b 0a 20  nt(*) FROM t1;. 
3070: 20 20 20 50 52 41 47 4d 41 20 69 6e 74 65 67 72     PRAGMA integr
3080: 69 74 79 5f 63 68 65 63 6b 3b 0a 20 20 7d 0a 7d  ity_check;.  }.}
3090: 20 7b 34 20 6f 6b 7d 0a 64 6f 5f 74 65 73 74 20   {4 ok}.do_test 
30a0: 70 61 67 65 72 31 2e 34 2e 32 2e 33 20 7b 0a 20  pager1.4.2.3 {. 
30b0: 20 66 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72   faultsim_restor
30c0: 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 66  e_and_reopen.  f
30d0: 6f 72 65 61 63 68 20 66 20 5b 67 6c 6f 62 20 74  oreach f [glob t
30e0: 65 73 74 2e 64 62 2d 6d 6a 2a 5d 20 7b 20 66 69  est.db-mj*] { fi
30f0: 6c 65 20 64 65 6c 65 74 65 20 2d 66 6f 72 63 65  le delete -force
3100: 20 24 66 20 7d 0a 20 20 65 78 65 63 73 71 6c 20   $f }.  execsql 
3110: 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75  {.    SELECT cou
3120: 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31 3b 0a 20  nt(*) FROM t1;. 
3130: 20 20 20 50 52 41 47 4d 41 20 69 6e 74 65 67 72     PRAGMA integr
3140: 69 74 79 5f 63 68 65 63 6b 3b 0a 20 20 7d 0a 7d  ity_check;.  }.}
3150: 20 7b 36 34 20 6f 6b 7d 0a 64 6f 5f 74 65 73 74   {64 ok}.do_test
3160: 20 70 61 67 65 72 31 2e 34 2e 32 2e 34 20 7b 0a   pager1.4.2.4 {.
3170: 20 20 66 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f    faultsim_resto
3180: 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20  re_and_reopen.  
3190: 68 65 78 69 6f 5f 77 72 69 74 65 20 74 65 73 74  hexio_write test
31a0: 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 5b 65 78 70  .db-journal [exp
31b0: 72 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73  r [file size tes
31c0: 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5d 2d 32 30  t.db-journal]-20
31d0: 5d 20 31 32 33 34 35 36 0a 20 20 65 78 65 63 73  ] 123456.  execs
31e0: 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  ql {.    SELECT 
31f0: 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31  count(*) FROM t1
3200: 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 69 6e 74  ;.    PRAGMA int
3210: 65 67 72 69 74 79 5f 63 68 65 63 6b 3b 0a 20 20  egrity_check;.  
3220: 7d 0a 7d 20 7b 34 20 6f 6b 7d 0a 64 6f 5f 74 65  }.} {4 ok}.do_te
3230: 73 74 20 70 61 67 65 72 31 2e 34 2e 32 2e 35 20  st pager1.4.2.5 
3240: 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 72 65 73  {.  faultsim_res
3250: 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a  tore_and_reopen.
3260: 20 20 68 65 78 69 6f 5f 77 72 69 74 65 20 74 65    hexio_write te
3270: 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 5b 65  st.db-journal [e
3280: 78 70 72 20 5b 66 69 6c 65 20 73 69 7a 65 20 74  xpr [file size t
3290: 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5d 2d  est.db-journal]-
32a0: 32 30 5d 20 31 32 33 34 35 36 0a 20 20 66 6f 72  20] 123456.  for
32b0: 65 61 63 68 20 66 20 5b 67 6c 6f 62 20 74 65 73  each f [glob tes
32c0: 74 2e 64 62 2d 6d 6a 2a 5d 20 7b 20 66 69 6c 65  t.db-mj*] { file
32d0: 20 64 65 6c 65 74 65 20 2d 66 6f 72 63 65 20 24   delete -force $
32e0: 66 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  f }.  execsql {.
32f0: 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74      SELECT count
3300: 28 2a 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20  (*) FROM t1;.   
3310: 20 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74   PRAGMA integrit
3320: 79 5f 63 68 65 63 6b 3b 0a 20 20 7d 0a 7d 20 7b  y_check;.  }.} {
3330: 34 20 6f 6b 7d 0a 0a 64 6f 5f 74 65 73 74 20 70  4 ok}..do_test p
3340: 61 67 65 72 31 2e 34 2e 33 2e 31 20 7b 0a 20 20  ager1.4.3.1 {.  
3350: 74 65 73 74 76 66 73 20 74 73 74 76 66 73 20 2d  testvfs tstvfs -
3360: 64 65 66 61 75 6c 74 20 31 0a 20 20 74 73 74 76  default 1.  tstv
3370: 66 73 20 66 69 6c 74 65 72 20 78 53 79 6e 63 0a  fs filter xSync.
3380: 20 20 74 73 74 76 66 73 20 73 63 72 69 70 74 20    tstvfs script 
3390: 78 53 79 6e 63 43 61 6c 6c 62 61 63 6b 0a 20 20  xSyncCallback.  
33a0: 70 72 6f 63 20 78 53 79 6e 63 43 61 6c 6c 62 61  proc xSyncCallba
33b0: 63 6b 20 7b 6d 65 74 68 6f 64 20 66 69 6c 65 20  ck {method file 
33c0: 61 72 67 73 7d 20 7b 0a 20 20 20 20 73 65 74 20  args} {.    set 
33d0: 66 69 6c 65 20 5b 66 69 6c 65 20 74 61 69 6c 20  file [file tail 
33e0: 24 66 69 6c 65 5d 0a 20 20 20 20 69 66 20 7b 20  $file].    if { 
33f0: 30 3d 3d 5b 73 74 72 69 6e 67 20 6d 61 74 63 68  0==[string match
3400: 20 2a 6a 6f 75 72 6e 61 6c 20 24 66 69 6c 65 5d   *journal $file]
3410: 20 7d 20 7b 20 66 61 75 6c 74 73 69 6d 5f 73 61   } { faultsim_sa
3420: 76 65 20 7d 0a 20 20 7d 0a 20 20 66 61 75 6c 74  ve }.  }.  fault
3430: 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72  sim_delete_and_r
3440: 65 6f 70 65 6e 0a 20 20 65 78 65 63 73 71 6c 20  eopen.  execsql 
3450: 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75  {.    PRAGMA jou
3460: 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c 45  rnal_mode = DELE
3470: 54 45 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  TE;.    CREATE T
3480: 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20  ABLE t1(a, b);. 
3490: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
34a0: 31 20 56 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a  1 VALUES(1, 2);.
34b0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
34c0: 74 31 20 56 41 4c 55 45 53 28 33 2c 20 34 29 3b  t1 VALUES(3, 4);
34d0: 0a 20 20 7d 0a 20 20 64 62 20 63 6c 6f 73 65 0a  .  }.  db close.
34e0: 20 20 74 73 74 76 66 73 20 64 65 6c 65 74 65 0a    tstvfs delete.
34f0: 7d 20 7b 7d 0a 0a 66 6f 72 65 61 63 68 20 7b 74  } {}..foreach {t
3500: 6e 20 6f 66 73 74 20 76 61 6c 75 65 20 72 65 73  n ofst value res
3510: 75 6c 74 7d 20 7b 0a 20 20 20 20 20 20 20 20 20  ult} {.         
3520: 20 32 20 20 20 32 30 20 20 20 20 33 31 20 20 20   2   20    31   
3530: 20 20 20 20 7b 31 20 32 20 33 20 34 7d 0a 20 20      {1 2 3 4}.  
3540: 20 20 20 20 20 20 20 20 33 20 20 20 32 30 20 20          3   20  
3550: 20 20 33 32 20 20 20 20 20 20 20 7b 31 20 32 20    32       {1 2 
3560: 33 20 34 7d 0a 20 20 20 20 20 20 20 20 20 20 34  3 4}.          4
3570: 20 20 20 32 30 20 20 20 20 33 33 20 20 20 20 20     20    33     
3580: 20 20 7b 31 20 32 20 33 20 34 7d 0a 20 20 20 20    {1 2 3 4}.    
3590: 20 20 20 20 20 20 35 20 20 20 32 30 20 20 20 20        5   20    
35a0: 36 35 35 33 36 20 20 20 20 7b 31 20 32 20 33 20  65536    {1 2 3 
35b0: 34 7d 0a 20 20 20 20 20 20 20 20 20 20 36 20 20  4}.          6  
35c0: 20 32 30 20 20 20 20 31 33 31 30 37 32 20 20 20   20    131072   
35d0: 7b 31 20 32 20 33 20 34 7d 0a 0a 20 20 20 20 20  {1 2 3 4}..     
35e0: 20 20 20 20 20 37 20 20 20 32 34 20 20 20 20 35       7   24    5
35f0: 31 31 20 20 20 20 20 20 7b 31 20 32 20 33 20 34  11      {1 2 3 4
3600: 7d 0a 20 20 20 20 20 20 20 20 20 20 38 20 20 20  }.          8   
3610: 32 34 20 20 20 20 35 31 33 20 20 20 20 20 20 7b  24    513      {
3620: 31 20 32 20 33 20 34 7d 0a 20 20 20 20 20 20 20  1 2 3 4}.       
3630: 20 20 20 39 20 20 20 32 34 20 20 20 20 36 35 35     9   24    655
3640: 33 36 20 20 20 20 7b 31 20 32 20 33 20 34 7d 0a  36    {1 2 3 4}.
3650: 0a 20 20 20 20 20 20 20 20 20 31 30 20 20 20 33  .         10   3
3660: 32 20 20 20 20 36 35 35 33 36 20 20 20 20 7b 31  2    65536    {1
3670: 20 32 7d 0a 7d 20 7b 0a 20 20 64 6f 5f 74 65 73   2}.} {.  do_tes
3680: 74 20 70 61 67 65 72 31 2e 34 2e 33 2e 24 74 6e  t pager1.4.3.$tn
3690: 20 7b 0a 20 20 20 20 66 61 75 6c 74 73 69 6d 5f   {.    faultsim_
36a0: 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70  restore_and_reop
36b0: 65 6e 0a 20 20 20 20 68 65 78 69 6f 5f 77 72 69  en.    hexio_wri
36c0: 74 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e  te test.db-journ
36d0: 61 6c 20 24 6f 66 73 74 20 5b 66 6f 72 6d 61 74  al $ofst [format
36e0: 20 25 2e 38 78 20 24 76 61 6c 75 65 5d 0a 20 20   %.8x $value].  
36f0: 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45    execsql { SELE
3700: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 0a 20  CT * FROM t1 }. 
3710: 20 7d 20 24 72 65 73 75 6c 74 0a 7d 0a 64 62 20   } $result.}.db 
3720: 63 6c 6f 73 65 0a 0a 23 20 53 65 74 20 75 70 20  close..# Set up 
3730: 61 20 56 46 53 20 74 68 61 74 20 73 6e 61 70 73  a VFS that snaps
3740: 68 6f 74 73 20 74 68 65 20 66 69 6c 65 2d 73 79  hots the file-sy
3750: 73 74 65 6d 20 6a 75 73 74 20 62 65 66 6f 72 65  stem just before
3760: 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
3770: 6c 0a 23 20 66 69 6c 65 20 69 73 20 64 65 6c 65  l.# file is dele
3780: 74 65 64 20 74 6f 20 63 6f 6d 6d 69 74 20 61 20  ted to commit a 
3790: 6d 75 6c 74 69 2d 66 69 6c 65 20 74 72 61 6e 73  multi-file trans
37a0: 61 63 74 69 6f 6e 2e 20 53 70 65 63 69 66 69 63  action. Specific
37b0: 61 6c 6c 79 2c 20 74 68 65 0a 23 20 66 69 6c 65  ally, the.# file
37c0: 2d 73 79 73 74 65 6d 20 69 73 20 73 61 76 65 64  -system is saved
37d0: 20 6a 75 73 74 20 62 65 66 6f 72 65 20 74 68 65   just before the
37e0: 20 78 44 65 6c 65 74 65 28 29 20 63 61 6c 6c 20   xDelete() call 
37f0: 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 0a 23  to remove the .#
3800: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
3810: 66 69 6c 65 20 66 72 6f 6d 20 74 68 65 20 66 69  file from the fi
3820: 6c 65 2d 73 79 73 74 65 6d 2e 0a 23 0a 74 65 73  le-system..#.tes
3830: 74 76 66 73 20 74 76 20 2d 64 65 66 61 75 6c 74  tvfs tv -default
3840: 20 31 0a 74 76 20 73 63 72 69 70 74 20 63 6f 70   1.tv script cop
3850: 79 5f 6f 6e 5f 6d 6a 5f 64 65 6c 65 74 65 0a 73  y_on_mj_delete.s
3860: 65 74 20 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65  et ::mj_filename
3870: 5f 6c 65 6e 67 74 68 20 30 0a 70 72 6f 63 20 63  _length 0.proc c
3880: 6f 70 79 5f 6f 6e 5f 6d 6a 5f 64 65 6c 65 74 65  opy_on_mj_delete
3890: 20 7b 6d 65 74 68 6f 64 20 66 69 6c 65 6e 61 6d   {method filenam
38a0: 65 20 61 72 67 73 7d 20 7b 0a 20 20 69 66 20 7b  e args} {.  if {
38b0: 5b 73 74 72 69 6e 67 20 6d 61 74 63 68 20 2a 6d  [string match *m
38c0: 6a 2a 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 66  j* [file tail $f
38d0: 69 6c 65 6e 61 6d 65 5d 5d 7d 20 7b 20 0a 20 20  ilename]]} { .  
38e0: 20 20 73 65 74 20 3a 3a 6d 6a 5f 66 69 6c 65 6e    set ::mj_filen
38f0: 61 6d 65 5f 6c 65 6e 67 74 68 20 5b 73 74 72 69  ame_length [stri
3900: 6e 67 20 6c 65 6e 67 74 68 20 24 66 69 6c 65 6e  ng length $filen
3910: 61 6d 65 5d 0a 20 20 20 20 66 61 75 6c 74 73 69  ame].    faultsi
3920: 6d 5f 73 61 76 65 20 0a 20 20 7d 0a 20 20 72 65  m_save .  }.  re
3930: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 7d  turn SQLITE_OK.}
3940: 0a 0a 73 65 74 20 70 77 64 20 5b 70 77 64 5d 0a  ..set pwd [pwd].
3950: 66 6f 72 65 61 63 68 20 7b 74 6e 31 20 74 63 6c  foreach {tn1 tcl
3960: 7d 20 7b 0a 20 20 31 20 7b 20 73 65 74 20 70 72  } {.  1 { set pr
3970: 65 66 69 78 20 22 74 65 73 74 2e 64 62 22 20 7d  efix "test.db" }
3980: 0a 20 20 32 20 7b 20 0a 20 20 20 20 23 20 54 68  .  2 { .    # Th
3990: 69 73 20 74 65 73 74 20 64 65 70 65 6e 64 73 20  is test depends 
39a0: 6f 6e 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  on the underlyin
39b0: 67 20 56 46 53 20 62 65 69 6e 67 20 61 62 6c 65  g VFS being able
39c0: 20 74 6f 20 6f 70 65 6e 20 70 61 74 68 73 0a 20   to open paths. 
39d0: 20 20 20 23 20 35 31 32 20 62 79 74 65 73 20 69     # 512 bytes i
39e0: 6e 20 6c 65 6e 67 74 68 2e 20 54 68 65 20 69 64  n length. The id
39f0: 65 61 20 69 73 20 74 6f 20 63 72 65 61 74 65 20  ea is to create 
3a00: 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69  a hot-journal fi
3a10: 6c 65 20 74 68 61 74 0a 20 20 20 20 23 20 63 6f  le that.    # co
3a20: 6e 74 61 69 6e 73 20 61 20 6d 61 73 74 65 72 2d  ntains a master-
3a30: 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20  journal pointer 
3a40: 73 6f 20 6c 61 72 67 65 20 74 68 61 74 20 69 74  so large that it
3a50: 20 63 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 0a 20   could contain. 
3a60: 20 20 20 23 20 61 20 76 61 6c 69 64 20 70 61 67     # a valid pag
3a70: 65 20 72 65 63 6f 72 64 20 28 69 66 20 74 68 65  e record (if the
3a80: 20 66 69 6c 65 20 70 61 67 65 2d 73 69 7a 65 20   file page-size 
3a90: 69 73 20 35 31 32 20 62 79 74 65 73 29 2e 20 53  is 512 bytes). S
3aa0: 6f 20 61 73 20 74 6f 0a 20 20 20 20 23 20 6d 61  o as to.    # ma
3ab0: 6b 65 20 73 75 72 65 20 53 51 4c 69 74 65 20 64  ke sure SQLite d
3ac0: 6f 65 73 6e 27 74 20 67 65 74 20 63 6f 6e 66 75  oesn't get confu
3ad0: 73 65 64 20 62 79 20 74 68 69 73 2e 0a 20 20 20  sed by this..   
3ae0: 20 23 0a 20 20 20 20 73 65 74 20 6e 50 61 64 64   #.    set nPadd
3af0: 69 6e 67 20 5b 65 78 70 72 20 35 31 31 20 2d 20  ing [expr 511 - 
3b00: 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 5f 6c  $::mj_filename_l
3b10: 65 6e 67 74 68 5d 0a 0a 20 20 20 20 23 20 57 65  ength]..    # We
3b20: 20 63 61 6e 6e 6f 74 20 6a 75 73 74 20 63 72 65   cannot just cre
3b30: 61 74 65 20 61 20 72 65 61 6c 6c 79 20 6c 6f 6e  ate a really lon
3b40: 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  g database file 
3b50: 6e 61 6d 65 20 74 6f 20 6f 70 65 6e 2c 20 61 73  name to open, as
3b60: 0a 20 20 20 20 23 20 4c 69 6e 75 78 20 6c 69 6d  .    # Linux lim
3b70: 69 74 73 20 61 20 73 69 6e 67 6c 65 20 63 6f 6d  its a single com
3b80: 70 6f 6e 65 6e 74 20 6f 66 20 61 20 70 61 74 68  ponent of a path
3b90: 20 74 6f 20 32 35 35 20 62 79 74 65 73 20 62 79   to 255 bytes by
3ba0: 20 64 65 66 61 75 6c 74 0a 20 20 20 20 23 20 28   default.    # (
3bb0: 61 6e 64 20 70 72 65 73 75 6d 61 62 6c 79 20 6f  and presumably o
3bc0: 74 68 65 72 20 73 79 73 74 65 6d 73 20 68 61 76  ther systems hav
3bd0: 65 20 6c 69 6d 69 74 73 20 74 6f 6f 29 2e 20 53  e limits too). S
3be0: 6f 20 63 72 65 61 74 65 20 61 20 64 69 72 65 63  o create a direc
3bf0: 74 6f 72 79 0a 20 20 20 20 23 20 68 69 65 72 61  tory.    # hiera
3c00: 72 63 68 79 20 74 6f 20 77 6f 72 6b 20 69 6e 2e  rchy to work in.
3c10: 0a 20 20 20 20 23 0a 20 20 20 20 73 65 74 20 64  .    #.    set d
3c20: 69 72 6e 61 6d 65 20 22 64 31 32 33 34 35 36 37  irname "d1234567
3c30: 38 39 30 31 32 33 34 35 36 37 38 39 30 31 32 33  8901234567890123
3c40: 34 35 36 37 38 39 30 2f 22 0a 20 20 20 20 73 65  4567890/".    se
3c50: 74 20 6e 44 69 72 20 5b 65 78 70 72 20 24 6e 50  t nDir [expr $nP
3c60: 61 64 64 69 6e 67 20 2f 20 33 32 5d 0a 20 20 20  adding / 32].   
3c70: 20 69 66 20 7b 20 24 6e 44 69 72 20 7d 20 7b 0a   if { $nDir } {.
3c80: 20 20 20 20 20 20 73 65 74 20 70 20 5b 73 74 72        set p [str
3c90: 69 6e 67 20 72 65 70 65 61 74 20 24 64 69 72 6e  ing repeat $dirn
3ca0: 61 6d 65 20 24 6e 44 69 72 5d 0a 20 20 20 20 20  ame $nDir].     
3cb0: 20 66 69 6c 65 20 6d 6b 64 69 72 20 24 70 0a 20   file mkdir $p. 
3cc0: 20 20 20 20 20 63 64 20 24 70 0a 20 20 20 20 7d       cd $p.    }
3cd0: 0a 0a 20 20 20 20 73 65 74 20 70 61 64 64 69 6e  ..    set paddin
3ce0: 67 20 5b 73 74 72 69 6e 67 20 72 65 70 65 61 74  g [string repeat
3cf0: 20 78 20 5b 65 78 70 72 20 24 6e 50 61 64 64 69   x [expr $nPaddi
3d00: 6e 67 20 25 33 32 5d 5d 0a 20 20 20 20 73 65 74  ng %32]].    set
3d10: 20 70 72 65 66 69 78 20 22 74 65 73 74 2e 64 62   prefix "test.db
3d20: 24 7b 70 61 64 64 69 6e 67 7d 22 0a 20 20 7d 0a  ${padding}".  }.
3d30: 7d 20 7b 0a 20 20 65 76 61 6c 20 24 74 63 6c 0a  } {.  eval $tcl.
3d40: 20 20 66 6f 72 65 61 63 68 20 7b 74 6e 32 20 73    foreach {tn2 s
3d50: 71 6c 7d 20 7b 0a 20 20 20 20 6f 20 7b 20 0a 20  ql} {.    o { . 
3d60: 20 20 20 20 20 50 52 41 47 4d 41 20 6d 61 69 6e       PRAGMA main
3d70: 2e 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46 46  .synchronous=OFF
3d80: 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 61  ;.      PRAGMA a
3d90: 75 78 2e 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f  ux.synchronous=O
3da0: 46 46 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f 35  FF;.    }.    o5
3db0: 31 32 20 7b 20 0a 20 20 20 20 20 20 50 52 41 47  12 { .      PRAG
3dc0: 4d 41 20 6d 61 69 6e 2e 73 79 6e 63 68 72 6f 6e  MA main.synchron
3dd0: 6f 75 73 3d 4f 46 46 3b 0a 20 20 20 20 20 20 50  ous=OFF;.      P
3de0: 52 41 47 4d 41 20 61 75 78 2e 73 79 6e 63 68 72  RAGMA aux.synchr
3df0: 6f 6e 6f 75 73 3d 4f 46 46 3b 0a 20 20 20 20 20  onous=OFF;.     
3e00: 20 50 52 41 47 4d 41 20 6d 61 69 6e 2e 70 61 67   PRAGMA main.pag
3e10: 65 5f 73 69 7a 65 20 3d 20 35 31 32 3b 0a 20 20  e_size = 512;.  
3e20: 20 20 20 20 50 52 41 47 4d 41 20 61 75 78 2e 70      PRAGMA aux.p
3e30: 61 67 65 5f 73 69 7a 65 20 3d 20 35 31 32 3b 0a  age_size = 512;.
3e40: 20 20 20 20 7d 0a 20 20 20 20 6e 20 7b 20 0a 20      }.    n { . 
3e50: 20 20 20 20 20 50 52 41 47 4d 41 20 6d 61 69 6e       PRAGMA main
3e60: 2e 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4e 4f 52  .synchronous=NOR
3e70: 4d 41 4c 3b 0a 20 20 20 20 20 20 50 52 41 47 4d  MAL;.      PRAGM
3e80: 41 20 61 75 78 2e 73 79 6e 63 68 72 6f 6e 6f 75  A aux.synchronou
3e90: 73 3d 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 7d 0a  s=NORMAL;.    }.
3ea0: 20 20 20 20 66 20 7b 20 0a 20 20 20 20 20 20 50      f { .      P
3eb0: 52 41 47 4d 41 20 6d 61 69 6e 2e 73 79 6e 63 68  RAGMA main.synch
3ec0: 72 6f 6e 6f 75 73 3d 46 55 4c 4c 3b 0a 20 20 20  ronous=FULL;.   
3ed0: 20 20 20 50 52 41 47 4d 41 20 61 75 78 2e 73 79     PRAGMA aux.sy
3ee0: 6e 63 68 72 6f 6e 6f 75 73 3d 46 55 4c 4c 3b 0a  nchronous=FULL;.
3ef0: 20 20 20 20 7d 0a 20 20 7d 20 7b 0a 0a 20 20 20      }.  } {..   
3f00: 20 73 65 74 20 74 6e 20 22 24 7b 74 6e 31 7d 2e   set tn "${tn1}.
3f10: 24 7b 74 6e 32 7d 22 0a 20 20 0a 20 20 20 20 23  ${tn2}".  .    #
3f20: 20 53 65 74 20 75 70 20 61 20 63 6f 6e 6e 65 63   Set up a connec
3f30: 74 69 6f 6e 20 74 6f 20 68 61 76 65 20 74 77 6f  tion to have two
3f40: 20 64 61 74 61 62 61 73 65 73 2c 20 74 65 73 74   databases, test
3f50: 2e 64 62 20 28 6d 61 69 6e 29 20 61 6e 64 20 0a  .db (main) and .
3f60: 20 20 20 20 23 20 74 65 73 74 2e 64 62 32 20 28      # test.db2 (
3f70: 61 75 78 29 2e 20 54 68 65 6e 20 72 75 6e 20 61  aux). Then run a
3f80: 20 6d 75 6c 74 69 2d 66 69 6c 65 20 74 72 61 6e   multi-file tran
3f90: 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 6d 2e  saction on them.
3fa0: 20 54 68 65 0a 20 20 20 20 23 20 56 46 53 20 77   The.    # VFS w
3fb0: 69 6c 6c 20 73 6e 61 70 73 68 6f 74 20 74 68 65  ill snapshot the
3fc0: 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 6a 75 73   file-system jus
3fd0: 74 20 62 65 66 6f 72 65 20 74 68 65 20 6d 61 73  t before the mas
3fe0: 74 65 72 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  ter-journal.    
3ff0: 23 20 66 69 6c 65 20 69 73 20 64 65 6c 65 74 65  # file is delete
4000: 64 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65 20  d to commit the 
4010: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20  transaction..   
4020: 20 23 0a 20 20 20 20 74 76 20 66 69 6c 74 65 72   #.    tv filter
4030: 20 78 44 65 6c 65 74 65 0a 20 20 20 20 64 6f 5f   xDelete.    do_
4040: 74 65 73 74 20 70 61 67 65 72 31 2d 34 2e 34 2e  test pager1-4.4.
4050: 24 74 6e 2e 31 20 7b 0a 20 20 20 20 20 20 66 61  $tn.1 {.      fa
4060: 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e  ultsim_delete_an
4070: 64 5f 72 65 6f 70 65 6e 20 24 70 72 65 66 69 78  d_reopen $prefix
4080: 0a 20 20 20 20 20 20 65 78 65 63 73 71 6c 20 22  .      execsql "
4090: 0a 20 20 20 20 20 20 20 20 41 54 54 41 43 48 20  .        ATTACH 
40a0: 27 24 7b 70 72 65 66 69 78 7d 32 27 20 41 53 20  '${prefix}2' AS 
40b0: 61 75 78 3b 0a 20 20 20 20 20 20 20 20 24 73 71  aux;.        $sq
40c0: 6c 0a 20 20 20 20 20 20 20 20 43 52 45 41 54 45  l.        CREATE
40d0: 20 54 41 42 4c 45 20 61 28 78 29 3b 0a 20 20 20   TABLE a(x);.   
40e0: 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c       CREATE TABL
40f0: 45 20 61 75 78 2e 62 28 78 29 3b 0a 20 20 20 20  E aux.b(x);.    
4100: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
4110: 61 20 56 41 4c 55 45 53 28 27 64 6f 75 62 6c 65  a VALUES('double
4120: 2d 79 6f 75 27 29 3b 0a 20 20 20 20 20 20 20 20  -you');.        
4130: 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 20 56 41  INSERT INTO a VA
4140: 4c 55 45 53 28 27 77 68 79 27 29 3b 0a 20 20 20  LUES('why');.   
4150: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
4160: 20 61 20 56 41 4c 55 45 53 28 27 7a 65 64 27 29   a VALUES('zed')
4170: 3b 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54  ;.        INSERT
4180: 20 49 4e 54 4f 20 62 20 56 41 4c 55 45 53 28 27   INTO b VALUES('
4190: 77 6f 6e 27 29 3b 0a 20 20 20 20 20 20 20 20 49  won');.        I
41a0: 4e 53 45 52 54 20 49 4e 54 4f 20 62 20 56 41 4c  NSERT INTO b VAL
41b0: 55 45 53 28 27 74 6f 6f 27 29 3b 0a 20 20 20 20  UES('too');.    
41c0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
41d0: 62 20 56 41 4c 55 45 53 28 27 66 72 65 65 27 29  b VALUES('free')
41e0: 3b 0a 20 20 20 20 20 20 22 0a 20 20 20 20 20 20  ;.      ".      
41f0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20  execsql {.      
4200: 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 20    BEGIN;.       
4210: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61     INSERT INTO a
4220: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 62   SELECT * FROM b
4230: 20 57 48 45 52 45 20 72 6f 77 69 64 3c 3d 33 3b   WHERE rowid<=3;
4240: 0a 20 20 20 20 20 20 20 20 20 20 49 4e 53 45 52  .          INSER
4250: 54 20 49 4e 54 4f 20 62 20 53 45 4c 45 43 54 20  T INTO b SELECT 
4260: 2a 20 46 52 4f 4d 20 61 20 57 48 45 52 45 20 72  * FROM a WHERE r
4270: 6f 77 69 64 3c 3d 33 3b 0a 20 20 20 20 20 20 20  owid<=3;.       
4280: 20 43 4f 4d 4d 49 54 3b 0a 20 20 20 20 20 20 7d   COMMIT;.      }
4290: 0a 20 20 20 20 7d 20 7b 7d 0a 20 20 20 20 74 76  .    } {}.    tv
42a0: 20 66 69 6c 74 65 72 20 7b 7d 0a 20 20 20 20 0a   filter {}.    .
42b0: 20 20 20 20 23 20 43 68 65 63 6b 20 74 68 61 74      # Check that
42c0: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
42d0: 20 77 61 73 20 63 6f 6d 6d 69 74 74 65 64 20 73   was committed s
42e0: 75 63 63 65 73 73 66 75 6c 6c 79 2e 0a 20 20 20  uccessfully..   
42f0: 20 23 0a 20 20 20 20 64 6f 5f 65 78 65 63 73 71   #.    do_execsq
4300: 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 34 2e  l_test pager1-4.
4310: 34 2e 24 74 6e 2e 32 20 7b 0a 20 20 20 20 20 20  4.$tn.2 {.      
4320: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 61 0a  SELECT * FROM a.
4330: 20 20 20 20 7d 20 7b 64 6f 75 62 6c 65 2d 79 6f      } {double-yo
4340: 75 20 77 68 79 20 7a 65 64 20 77 6f 6e 20 74 6f  u why zed won to
4350: 6f 20 66 72 65 65 7d 0a 20 20 20 20 64 6f 5f 65  o free}.    do_e
4360: 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65  xecsql_test page
4370: 72 31 2d 34 2e 34 2e 24 74 6e 2e 33 20 7b 0a 20  r1-4.4.$tn.3 {. 
4380: 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52       SELECT * FR
4390: 4f 4d 20 62 0a 20 20 20 20 7d 20 7b 77 6f 6e 20  OM b.    } {won 
43a0: 74 6f 6f 20 66 72 65 65 20 64 6f 75 62 6c 65 2d  too free double-
43b0: 79 6f 75 20 77 68 79 20 7a 65 64 7d 0a 20 20 20  you why zed}.   
43c0: 20 0a 20 20 20 20 23 20 52 65 73 74 6f 72 65 20   .    # Restore 
43d0: 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  the file-system 
43e0: 61 6e 64 20 72 65 6f 70 65 6e 20 74 68 65 20 64  and reopen the d
43f0: 61 74 61 62 61 73 65 73 2e 20 43 68 65 63 6b 20  atabases. Check 
4400: 74 68 61 74 20 69 74 20 6e 6f 77 0a 20 20 20 20  that it now.    
4410: 23 20 61 70 70 65 61 72 73 20 74 68 61 74 20 74  # appears that t
4420: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  he transaction w
4430: 61 73 20 6e 6f 74 20 63 6f 6d 6d 69 74 74 65 64  as not committed
4440: 20 28 62 65 63 61 75 73 65 20 74 68 65 20 66 69   (because the fi
4450: 6c 65 2d 73 79 73 74 65 6d 0a 20 20 20 20 23 20  le-system.    # 
4460: 77 61 73 20 72 65 73 74 6f 72 65 64 20 74 6f 20  was restored to 
4470: 74 68 65 20 73 74 61 74 65 20 77 68 65 72 65 20  the state where 
4480: 69 74 20 68 61 64 20 6e 6f 74 20 62 65 65 6e 29  it had not been)
4490: 2e 0a 20 20 20 20 23 0a 20 20 20 20 64 6f 5f 74  ..    #.    do_t
44a0: 65 73 74 20 70 61 67 65 72 31 2d 34 2e 34 2e 24  est pager1-4.4.$
44b0: 74 6e 2e 34 20 7b 0a 20 20 20 20 20 20 66 61 75  tn.4 {.      fau
44c0: 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e  ltsim_restore_an
44d0: 64 5f 72 65 6f 70 65 6e 20 24 70 72 65 66 69 78  d_reopen $prefix
44e0: 0a 20 20 20 20 20 20 65 78 65 63 73 71 6c 20 22  .      execsql "
44f0: 41 54 54 41 43 48 20 27 24 7b 70 72 65 66 69 78  ATTACH '${prefix
4500: 7d 32 27 20 41 53 20 61 75 78 22 0a 20 20 20 20  }2' AS aux".    
4510: 7d 20 7b 7d 0a 20 20 20 20 64 6f 5f 65 78 65 63  } {}.    do_exec
4520: 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d  sql_test pager1-
4530: 34 2e 34 2e 24 74 6e 2e 35 20 7b 53 45 4c 45 43  4.4.$tn.5 {SELEC
4540: 54 20 2a 20 46 52 4f 4d 20 61 7d 20 7b 64 6f 75  T * FROM a} {dou
4550: 62 6c 65 2d 79 6f 75 20 77 68 79 20 7a 65 64 7d  ble-you why zed}
4560: 0a 20 20 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f  .    do_execsql_
4570: 74 65 73 74 20 70 61 67 65 72 31 2d 34 2e 34 2e  test pager1-4.4.
4580: 24 74 6e 2e 36 20 7b 53 45 4c 45 43 54 20 2a 20  $tn.6 {SELECT * 
4590: 46 52 4f 4d 20 62 7d 20 7b 77 6f 6e 20 74 6f 6f  FROM b} {won too
45a0: 20 66 72 65 65 7d 0a 20 20 20 20 0a 20 20 20 20   free}.    .    
45b0: 23 20 52 65 73 74 6f 72 65 20 74 68 65 20 66 69  # Restore the fi
45c0: 6c 65 2d 73 79 73 74 65 6d 20 61 67 61 69 6e 2e  le-system again.
45d0: 20 54 68 69 73 20 74 69 6d 65 2c 20 62 65 66 6f   This time, befo
45e0: 72 65 20 72 65 6f 70 65 6e 69 6e 67 20 74 68 65  re reopening the
45f0: 20 64 61 74 61 62 61 73 65 73 2c 0a 20 20 20 20   databases,.    
4600: 23 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  # delete the mas
4610: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter-journal file
4620: 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 2d 73   from the file-s
4630: 79 73 74 65 6d 2e 20 49 74 20 6e 6f 77 20 61 70  ystem. It now ap
4640: 70 65 61 72 73 20 74 68 61 74 0a 20 20 20 20 23  pears that.    #
4650: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
4660: 20 77 61 73 20 63 6f 6d 6d 69 74 74 65 64 20 28   was committed (
4670: 6e 6f 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  no master-journa
4680: 6c 20 66 69 6c 65 20 3d 3d 20 6e 6f 20 72 6f 6c  l file == no rol
4690: 6c 62 61 63 6b 29 2e 0a 20 20 20 20 23 0a 20 20  lback)..    #.  
46a0: 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31    do_test pager1
46b0: 2d 34 2e 34 2e 24 74 6e 2e 37 20 7b 0a 20 20 20  -4.4.$tn.7 {.   
46c0: 20 20 20 66 61 75 6c 74 73 69 6d 5f 72 65 73 74     faultsim_rest
46d0: 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 20 24  ore_and_reopen $
46e0: 70 72 65 66 69 78 0a 20 20 20 20 20 20 66 6f 72  prefix.      for
46f0: 65 61 63 68 20 66 20 5b 67 6c 6f 62 20 24 7b 70  each f [glob ${p
4700: 72 65 66 69 78 7d 2d 6d 6a 2a 5d 20 7b 20 66 69  refix}-mj*] { fi
4710: 6c 65 20 64 65 6c 65 74 65 20 2d 66 6f 72 63 65  le delete -force
4720: 20 24 66 20 7d 0a 20 20 20 20 20 20 65 78 65 63   $f }.      exec
4730: 73 71 6c 20 22 41 54 54 41 43 48 20 27 24 7b 70  sql "ATTACH '${p
4740: 72 65 66 69 78 7d 32 27 20 41 53 20 61 75 78 22  refix}2' AS aux"
4750: 0a 20 20 20 20 7d 20 7b 7d 0a 20 20 20 20 64 6f  .    } {}.    do
4760: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61  _execsql_test pa
4770: 67 65 72 31 2d 34 2e 34 2e 24 74 6e 2e 38 20 7b  ger1-4.4.$tn.8 {
4780: 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20  .      SELECT * 
4790: 46 52 4f 4d 20 61 0a 20 20 20 20 7d 20 7b 64 6f  FROM a.    } {do
47a0: 75 62 6c 65 2d 79 6f 75 20 77 68 79 20 7a 65 64  uble-you why zed
47b0: 20 77 6f 6e 20 74 6f 6f 20 66 72 65 65 7d 0a 20   won too free}. 
47c0: 20 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65     do_execsql_te
47d0: 73 74 20 70 61 67 65 72 31 2d 34 2e 34 2e 24 74  st pager1-4.4.$t
47e0: 6e 2e 39 20 7b 0a 20 20 20 20 20 20 53 45 4c 45  n.9 {.      SELE
47f0: 43 54 20 2a 20 46 52 4f 4d 20 62 0a 20 20 20 20  CT * FROM b.    
4800: 7d 20 7b 77 6f 6e 20 74 6f 6f 20 66 72 65 65 20  } {won too free 
4810: 64 6f 75 62 6c 65 2d 79 6f 75 20 77 68 79 20 7a  double-you why z
4820: 65 64 7d 0a 20 20 7d 0a 0a 20 20 63 64 20 24 70  ed}.  }..  cd $p
4830: 77 64 0a 7d 0a 64 62 20 63 6c 6f 73 65 0a 74 76  wd.}.db close.tv
4840: 20 64 65 6c 65 74 65 0a 66 69 6c 65 20 64 65 6c   delete.file del
4850: 65 74 65 20 2d 66 6f 72 63 65 20 24 64 69 72 6e  ete -force $dirn
4860: 61 6d 65 0a 0a 0a 23 20 53 65 74 20 75 70 20 61  ame...# Set up a
4870: 20 56 46 53 20 74 6f 20 6d 61 6b 65 20 61 20 63   VFS to make a c
4880: 6f 70 79 20 6f 66 20 74 68 65 20 66 69 6c 65 2d  opy of the file-
4890: 73 79 73 74 65 6d 20 6a 75 73 74 20 62 65 66 6f  system just befo
48a0: 72 65 20 64 65 6c 65 74 69 6e 67 20 61 0a 23 20  re deleting a.# 
48b0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20  journal file to 
48c0: 63 6f 6d 6d 69 74 20 61 20 74 72 61 6e 73 61 63  commit a transac
48d0: 74 69 6f 6e 2e 20 54 68 65 20 74 72 61 6e 73 61  tion. The transa
48e0: 63 74 69 6f 6e 20 6d 6f 64 69 66 69 65 73 20 65  ction modifies e
48f0: 78 61 63 74 6c 79 0a 23 20 74 77 6f 20 64 61 74  xactly.# two dat
4900: 61 62 61 73 65 20 70 61 67 65 73 20 28 61 6e 64  abase pages (and
4910: 20 70 61 67 65 20 31 20 2d 20 74 68 65 20 63 68   page 1 - the ch
4920: 61 6e 67 65 20 63 6f 75 6e 74 65 72 29 2e 0a 23  ange counter)..#
4930: 0a 74 65 73 74 76 66 73 20 74 76 20 2d 64 65 66  .testvfs tv -def
4940: 61 75 6c 74 20 31 0a 74 76 20 73 65 63 74 6f 72  ault 1.tv sector
4950: 73 69 7a 65 20 35 31 32 0a 74 76 20 73 63 72 69  size 512.tv scri
4960: 70 74 20 63 6f 70 79 5f 6f 6e 5f 6a 6f 75 72 6e  pt copy_on_journ
4970: 61 6c 5f 64 65 6c 65 74 65 0a 74 76 20 66 69 6c  al_delete.tv fil
4980: 74 65 72 20 78 44 65 6c 65 74 65 0a 73 65 74 20  ter xDelete.set 
4990: 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 5f 6c 65  ::mj_filename_le
49a0: 6e 67 74 68 20 30 0a 70 72 6f 63 20 63 6f 70 79  ngth 0.proc copy
49b0: 5f 6f 6e 5f 6a 6f 75 72 6e 61 6c 5f 64 65 6c 65  _on_journal_dele
49c0: 74 65 20 7b 6d 65 74 68 6f 64 20 66 69 6c 65 6e  te {method filen
49d0: 61 6d 65 20 61 72 67 73 7d 20 7b 0a 20 20 69 66  ame args} {.  if
49e0: 20 7b 5b 73 74 72 69 6e 67 20 6d 61 74 63 68 20   {[string match 
49f0: 2a 6a 6f 75 72 6e 61 6c 20 24 66 69 6c 65 6e 61  *journal $filena
4a00: 6d 65 5d 7d 20 66 61 75 6c 74 73 69 6d 5f 73 61  me]} faultsim_sa
4a10: 76 65 20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ve .  return SQL
4a20: 49 54 45 5f 4f 4b 0a 7d 0a 66 61 75 6c 74 73 69  ITE_OK.}.faultsi
4a30: 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f  m_delete_and_reo
4a40: 70 65 6e 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  pen.do_execsql_t
4a50: 65 73 74 20 70 61 67 65 72 31 2e 34 2e 35 2e 31  est pager1.4.5.1
4a60: 20 7b 0a 20 20 50 52 41 47 4d 41 20 70 61 67 65   {.  PRAGMA page
4a70: 5f 73 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20  _size = 1024;.  
4a80: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
4a90: 61 2c 20 62 29 3b 0a 20 20 43 52 45 41 54 45 20  a, b);.  CREATE 
4aa0: 54 41 42 4c 45 20 74 32 28 61 2c 20 62 29 3b 0a  TABLE t2(a, b);.
4ab0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
4ac0: 20 56 41 4c 55 45 53 28 27 49 27 2c 20 27 49 49   VALUES('I', 'II
4ad0: 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  ');.  INSERT INT
4ae0: 4f 20 74 32 20 56 41 4c 55 45 53 28 27 49 49 49  O t2 VALUES('III
4af0: 27 2c 20 27 49 56 27 29 3b 0a 20 20 42 45 47 49  ', 'IV');.  BEGI
4b00: 4e 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  N;.    INSERT IN
4b10: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20  TO t1 VALUES(1, 
4b20: 32 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  2);.    INSERT I
4b30: 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 33 2c  NTO t2 VALUES(3,
4b40: 20 34 29 3b 0a 20 20 43 4f 4d 4d 49 54 3b 0a 7d   4);.  COMMIT;.}
4b50: 20 7b 7d 0a 74 76 20 66 69 6c 74 65 72 20 7b 7d   {}.tv filter {}
4b60: 0a 0a 23 20 43 68 65 63 6b 20 74 68 65 20 74 72  ..# Check the tr
4b70: 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 63 6f  ansaction was co
4b80: 6d 6d 69 74 74 65 64 3a 0a 23 0a 64 6f 5f 65 78  mmitted:.#.do_ex
4b90: 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72  ecsql_test pager
4ba0: 31 2e 34 2e 35 2e 32 20 7b 0a 20 20 53 45 4c 45  1.4.5.2 {.  SELE
4bb0: 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20  CT * FROM t1;.  
4bc0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32  SELECT * FROM t2
4bd0: 3b 0a 7d 20 7b 49 20 49 49 20 31 20 32 20 49 49  ;.} {I II 1 2 II
4be0: 49 20 49 56 20 33 20 34 7d 0a 0a 23 20 4e 6f 77  I IV 3 4}..# Now
4bf0: 20 74 72 79 20 66 6f 75 72 20 74 65 73 74 73 3a   try four tests:
4c00: 0a 23 0a 23 20 20 70 61 67 65 72 31 2d 34 2e 35  .#.#  pager1-4.5
4c10: 2e 33 3a 20 52 65 73 74 6f 72 65 20 74 68 65 20  .3: Restore the 
4c20: 66 69 6c 65 2d 73 79 73 74 65 6d 2e 20 43 68 65  file-system. Che
4c30: 63 6b 20 74 68 61 74 20 74 68 65 20 77 68 6f 6c  ck that the whol
4c40: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 23  e transaction .#
4c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c60: 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  is rolled back..
4c70: 23 0a 23 20 20 70 61 67 65 72 31 2d 34 2e 35 2e  #.#  pager1-4.5.
4c80: 34 3a 20 52 65 73 74 6f 72 65 20 74 68 65 20 66  4: Restore the f
4c90: 69 6c 65 2d 73 79 73 74 65 6d 2e 20 43 6f 72 72  ile-system. Corr
4ca0: 75 70 74 20 74 68 65 20 66 69 72 73 74 20 72 65  upt the first re
4cb0: 63 6f 72 64 20 69 6e 20 74 68 65 0a 23 20 20 20  cord in the.#   
4cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6a 6f 75               jou
4cd0: 72 6e 61 6c 2e 20 43 68 65 63 6b 20 74 68 65 20  rnal. Check the 
4ce0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6e  transaction is n
4cf0: 6f 74 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  ot rolled back..
4d00: 23 0a 23 20 20 70 61 67 65 72 31 2d 34 2e 35 2e  #.#  pager1-4.5.
4d10: 35 3a 20 52 65 73 74 6f 72 65 20 74 68 65 20 66  5: Restore the f
4d20: 69 6c 65 2d 73 79 73 74 65 6d 2e 20 43 6f 72 72  ile-system. Corr
4d30: 75 70 74 20 74 68 65 20 73 65 63 6f 6e 64 20 72  upt the second r
4d40: 65 63 6f 72 64 20 69 6e 20 74 68 65 0a 23 20 20  ecord in the.#  
4d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6a 6f                jo
4d60: 75 72 6e 61 6c 2e 20 43 68 65 63 6b 20 74 68 61  urnal. Check tha
4d70: 74 20 74 68 65 20 66 69 72 73 74 20 72 65 63 6f  t the first reco
4d80: 72 64 20 69 6e 20 74 68 65 20 74 72 61 6e 73 61  rd in the transa
4d90: 63 74 69 6f 6e 20 69 73 20 0a 23 20 20 20 20 20  ction is .#     
4da0: 20 20 20 20 20 20 20 20 20 20 20 70 6c 61 79 65             playe
4db0: 64 20 62 61 63 6b 2c 20 62 75 74 20 6e 6f 74 20  d back, but not 
4dc0: 74 68 65 20 73 65 63 6f 6e 64 2e 0a 23 0a 23 20  the second..#.# 
4dd0: 20 70 61 67 65 72 31 2d 34 2e 35 2e 36 3a 20 52   pager1-4.5.6: R
4de0: 65 73 74 6f 72 65 20 74 68 65 20 66 69 6c 65 2d  estore the file-
4df0: 73 79 73 74 65 6d 2e 20 54 72 79 20 74 6f 20 6f  system. Try to o
4e00: 70 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  pen the database
4e10: 20 77 69 74 68 20 61 0a 23 20 20 20 20 20 20 20   with a.#       
4e20: 20 20 20 20 20 20 20 20 20 72 65 61 64 6f 6e 6c           readonl
4e30: 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 54 68  y connection. Th
4e40: 69 73 20 73 68 6f 75 6c 64 20 66 61 69 6c 2c 20  is should fail, 
4e50: 61 73 20 61 20 72 65 61 64 2d 6f 6e 6c 79 0a 23  as a read-only.#
4e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e70: 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 61 6e 6e 6f  connection canno
4e80: 74 20 72 6f 6c 6c 20 62 61 63 6b 20 74 68 65 20  t roll back the 
4e90: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 23  database file..#
4ea0: 0a 66 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72  .faultsim_restor
4eb0: 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 64 6f 5f  e_and_reopen.do_
4ec0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67  execsql_test pag
4ed0: 65 72 31 2e 34 2e 35 2e 33 20 7b 0a 20 20 53 45  er1.4.5.3 {.  SE
4ee0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a  LECT * FROM t1;.
4ef0: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
4f00: 74 32 3b 0a 7d 20 7b 49 20 49 49 20 49 49 49 20  t2;.} {I II III 
4f10: 49 56 7d 0a 66 61 75 6c 74 73 69 6d 5f 72 65 73  IV}.faultsim_res
4f20: 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a  tore_and_reopen.
4f30: 68 65 78 69 6f 5f 77 72 69 74 65 20 74 65 73 74  hexio_write test
4f40: 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 5b 65 78 70  .db-journal [exp
4f50: 72 20 35 31 32 2b 34 2b 31 30 32 34 20 2d 20 32  r 512+4+1024 - 2
4f60: 30 32 5d 20 30 31 32 33 34 35 36 37 38 39 41 42  02] 0123456789AB
4f70: 43 44 45 46 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  CDEF.do_execsql_
4f80: 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e 35 2e  test pager1.4.5.
4f90: 34 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46  4 {.  SELECT * F
4fa0: 52 4f 4d 20 74 31 3b 0a 20 20 53 45 4c 45 43 54  ROM t1;.  SELECT
4fb0: 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 7d 20 7b 49   * FROM t2;.} {I
4fc0: 20 49 49 20 31 20 32 20 49 49 49 20 49 56 20 33   II 1 2 III IV 3
4fd0: 20 34 7d 0a 66 61 75 6c 74 73 69 6d 5f 72 65 73   4}.faultsim_res
4fe0: 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a  tore_and_reopen.
4ff0: 68 65 78 69 6f 5f 77 72 69 74 65 20 74 65 73 74  hexio_write test
5000: 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 5b 65 78 70  .db-journal [exp
5010: 72 20 35 31 32 2b 34 2b 31 30 32 34 2b 34 2b 34  r 512+4+1024+4+4
5020: 2b 31 30 32 34 20 2d 20 32 30 32 5d 20 30 31 32  +1024 - 202] 012
5030: 33 34 35 36 37 38 39 41 42 43 44 45 46 0a 64 6f  3456789ABCDEF.do
5040: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61  _execsql_test pa
5050: 67 65 72 31 2e 34 2e 35 2e 35 20 7b 0a 20 20 53  ger1.4.5.5 {.  S
5060: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b  ELECT * FROM t1;
5070: 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  .  SELECT * FROM
5080: 20 74 32 3b 0a 7d 20 7b 49 20 49 49 20 49 49 49   t2;.} {I II III
5090: 20 49 56 20 33 20 34 7d 0a 0a 66 61 75 6c 74 73   IV 3 4}..faults
50a0: 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72  im_restore_and_r
50b0: 65 6f 70 65 6e 0a 64 62 20 63 6c 6f 73 65 0a 73  eopen.db close.s
50c0: 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64  qlite3 db test.d
50d0: 62 20 2d 72 65 61 64 6f 6e 6c 79 20 31 0a 64 6f  b -readonly 1.do
50e0: 5f 63 61 74 63 68 73 71 6c 5f 74 65 73 74 20 70  _catchsql_test p
50f0: 61 67 65 72 31 2e 34 2e 35 2e 36 20 7b 0a 20 20  ager1.4.5.6 {.  
5100: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
5110: 3b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  ;.  SELECT * FRO
5120: 4d 20 74 32 3b 0a 7d 20 7b 31 20 7b 64 69 73 6b  M t2;.} {1 {disk
5130: 20 49 2f 4f 20 65 72 72 6f 72 7d 7d 0a 64 62 20   I/O error}}.db 
5140: 63 6c 6f 73 65 0a 0a 23 20 53 6e 61 70 73 68 6f  close..# Snapsho
5150: 74 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  t the file-syste
5160: 6d 20 6a 75 73 74 20 62 65 66 6f 72 65 20 6d 75  m just before mu
5170: 6c 74 69 2d 66 69 6c 65 20 63 6f 6d 6d 69 74 2e  lti-file commit.
5180: 20 53 61 76 65 20 74 68 65 20 6e 61 6d 65 0a 23   Save the name.#
5190: 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a   of the master j
51a0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 24  ournal file in $
51b0: 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 2e 0a 23  ::mj_filename..#
51c0: 0a 74 76 20 73 63 72 69 70 74 20 63 6f 70 79 5f  .tv script copy_
51d0: 6f 6e 5f 6d 6a 5f 64 65 6c 65 74 65 0a 74 76 20  on_mj_delete.tv 
51e0: 66 69 6c 74 65 72 20 78 44 65 6c 65 74 65 0a 70  filter xDelete.p
51f0: 72 6f 63 20 63 6f 70 79 5f 6f 6e 5f 6d 6a 5f 64  roc copy_on_mj_d
5200: 65 6c 65 74 65 20 7b 6d 65 74 68 6f 64 20 66 69  elete {method fi
5210: 6c 65 6e 61 6d 65 20 61 72 67 73 7d 20 7b 0a 20  lename args} {. 
5220: 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6d 61 74   if {[string mat
5230: 63 68 20 2a 6d 6a 2a 20 5b 66 69 6c 65 20 74 61  ch *mj* [file ta
5240: 69 6c 20 24 66 69 6c 65 6e 61 6d 65 5d 5d 7d 20  il $filename]]} 
5250: 7b 20 0a 20 20 20 20 73 65 74 20 3a 3a 6d 6a 5f  { .    set ::mj_
5260: 66 69 6c 65 6e 61 6d 65 20 24 66 69 6c 65 6e 61  filename $filena
5270: 6d 65 0a 20 20 20 20 66 61 75 6c 74 73 69 6d 5f  me.    faultsim_
5280: 73 61 76 65 20 0a 20 20 7d 0a 20 20 72 65 74 75  save .  }.  retu
5290: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 7d 0a 64  rn SQLITE_OK.}.d
52a0: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e  o_test pager1.4.
52b0: 36 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d  6.1 {.  faultsim
52c0: 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70  _delete_and_reop
52d0: 65 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  en.  execsql {. 
52e0: 20 20 20 41 54 54 41 43 48 20 27 74 65 73 74 2e     ATTACH 'test.
52f0: 64 62 32 27 20 41 53 20 74 77 6f 3b 0a 20 20 20  db2' AS two;.   
5300: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
5310: 28 61 2c 20 62 29 3b 0a 20 20 20 20 43 52 45 41  (a, b);.    CREA
5320: 54 45 20 54 41 42 4c 45 20 74 77 6f 2e 74 32 28  TE TABLE two.t2(
5330: 61 2c 20 62 29 3b 0a 20 20 20 20 49 4e 53 45 52  a, b);.    INSER
5340: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
5350: 28 31 2c 20 27 74 31 2e 31 27 29 3b 0a 20 20 20  (1, 't1.1');.   
5360: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20   INSERT INTO t2 
5370: 56 41 4c 55 45 53 28 31 2c 20 27 74 32 2e 31 27  VALUES(1, 't2.1'
5380: 29 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20  );.    BEGIN;.  
5390: 20 20 20 20 55 50 44 41 54 45 20 74 31 20 53 45      UPDATE t1 SE
53a0: 54 20 62 20 3d 20 27 74 31 2e 32 27 3b 0a 20 20  T b = 't1.2';.  
53b0: 20 20 20 20 55 50 44 41 54 45 20 74 32 20 53 45      UPDATE t2 SE
53c0: 54 20 62 20 3d 20 27 74 32 2e 32 27 3b 0a 20 20  T b = 't2.2';.  
53d0: 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 20 20    COMMIT;.  }.  
53e0: 74 76 20 66 69 6c 74 65 72 20 7b 7d 0a 20 20 64  tv filter {}.  d
53f0: 62 20 63 6c 6f 73 65 0a 7d 20 7b 7d 0a 0a 66 61  b close.} {}..fa
5400: 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61  ultsim_restore_a
5410: 6e 64 5f 72 65 6f 70 65 6e 0a 64 6f 5f 65 78 65  nd_reopen.do_exe
5420: 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31  csql_test pager1
5430: 2e 34 2e 36 2e 32 20 7b 20 53 45 4c 45 43 54 20  .4.6.2 { SELECT 
5440: 2a 20 46 52 4f 4d 20 74 31 20 7d 20 20 20 20 20  * FROM t1 }     
5450: 20 20 20 20 20 20 7b 31 20 74 31 2e 31 7d 0a 64        {1 t1.1}.d
5460: 6f 5f 74 65 73 74 20 20 20 20 20 20 20 20 20 70  o_test         p
5470: 61 67 65 72 31 2e 34 2e 36 2e 33 20 7b 20 66 69  ager1.4.6.3 { fi
5480: 6c 65 20 65 78 69 73 74 73 20 24 3a 3a 6d 6a 5f  le exists $::mj_
5490: 66 69 6c 65 6e 61 6d 65 20 7d 20 7b 31 7d 0a 64  filename } {1}.d
54a0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70  o_execsql_test p
54b0: 61 67 65 72 31 2e 34 2e 36 2e 34 20 7b 0a 20 20  ager1.4.6.4 {.  
54c0: 41 54 54 41 43 48 20 27 74 65 73 74 2e 64 62 32  ATTACH 'test.db2
54d0: 27 20 41 53 20 74 77 6f 3b 0a 20 20 53 45 4c 45  ' AS two;.  SELE
54e0: 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 7d 20  CT * FROM t2;.} 
54f0: 7b 31 20 74 32 2e 31 7d 0a 64 6f 5f 74 65 73 74  {1 t2.1}.do_test
5500: 20 70 61 67 65 72 31 2e 34 2e 36 2e 35 20 7b 20   pager1.4.6.5 { 
5510: 66 69 6c 65 20 65 78 69 73 74 73 20 24 3a 3a 6d  file exists $::m
5520: 6a 5f 66 69 6c 65 6e 61 6d 65 20 7d 20 7b 30 7d  j_filename } {0}
5530: 0a 0a 66 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f  ..faultsim_resto
5540: 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 64 62  re_and_reopen.db
5550: 20 63 6c 6f 73 65 0a 64 6f 5f 74 65 73 74 20 70   close.do_test p
5560: 61 67 65 72 31 2e 34 2e 36 2e 38 20 7b 0a 20 20  ager1.4.6.8 {.  
5570: 73 65 74 20 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d  set ::mj_filenam
5580: 65 31 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d  e1 $::mj_filenam
5590: 65 0a 20 20 74 76 20 66 69 6c 74 65 72 20 78 44  e.  tv filter xD
55a0: 65 6c 65 74 65 0a 20 20 73 71 6c 69 74 65 33 20  elete.  sqlite3 
55b0: 64 62 20 74 65 73 74 2e 64 62 32 0a 20 20 65 78  db test.db2.  ex
55c0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 41 54 54 41  ecsql {.    ATTA
55d0: 43 48 20 27 74 65 73 74 2e 64 62 33 27 20 41 53  CH 'test.db3' AS
55e0: 20 74 68 72 65 65 3b 0a 20 20 20 20 43 52 45 41   three;.    CREA
55f0: 54 45 20 54 41 42 4c 45 20 74 68 72 65 65 2e 74  TE TABLE three.t
5600: 33 28 61 2c 20 62 29 3b 0a 20 20 20 20 49 4e 53  3(a, b);.    INS
5610: 45 52 54 20 49 4e 54 4f 20 74 33 20 56 41 4c 55  ERT INTO t3 VALU
5620: 45 53 28 31 2c 20 27 74 33 2e 31 27 29 3b 0a 20  ES(1, 't3.1');. 
5630: 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20     BEGIN;.      
5640: 55 50 44 41 54 45 20 74 32 20 53 45 54 20 62 20  UPDATE t2 SET b 
5650: 3d 20 27 74 32 2e 33 27 3b 0a 20 20 20 20 20 20  = 't2.3';.      
5660: 55 50 44 41 54 45 20 74 33 20 53 45 54 20 62 20  UPDATE t3 SET b 
5670: 3d 20 27 74 33 2e 33 27 3b 0a 20 20 20 20 43 4f  = 't3.3';.    CO
5680: 4d 4d 49 54 3b 0a 20 20 7d 0a 20 20 65 78 70 72  MMIT;.  }.  expr
5690: 20 7b 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65   {$::mj_filename
56a0: 31 20 21 3d 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e  1 != $::mj_filen
56b0: 61 6d 65 7d 0a 7d 20 7b 31 7d 0a 66 61 75 6c 74  ame}.} {1}.fault
56c0: 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f  sim_restore_and_
56d0: 72 65 6f 70 65 6e 0a 74 76 20 66 69 6c 74 65 72  reopen.tv filter
56e0: 20 7b 7d 0a 0a 23 20 54 68 65 20 66 69 6c 65 2d   {}..# The file-
56f0: 73 79 73 74 65 6d 20 6e 6f 77 20 63 6f 6e 74 61  system now conta
5700: 69 6e 73 3a 0a 23 0a 23 20 20 20 2a 20 74 68 72  ins:.#.#   * thr
5710: 65 65 20 64 61 74 61 62 61 73 65 73 0a 23 20 20  ee databases.#  
5720: 20 2a 20 74 68 72 65 65 20 68 6f 74 2d 6a 6f 75   * three hot-jou
5730: 72 6e 61 6c 20 66 69 6c 65 73 0a 23 20 20 20 2a  rnal files.#   *
5740: 20 74 77 6f 20 6d 61 73 74 65 72 2d 6a 6f 75 72   two master-jour
5750: 6e 61 6c 20 66 69 6c 65 73 2e 0a 23 0a 23 20 54  nal files..#.# T
5760: 68 65 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 73 20  he hot-journals 
5770: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
5780: 74 65 73 74 2e 64 62 32 20 61 6e 64 20 74 65 73  test.db2 and tes
5790: 74 2e 64 62 33 20 70 6f 69 6e 74 20 74 6f 0a 23  t.db3 point to.#
57a0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
57b0: 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 2e 20  $::mj_filename. 
57c0: 54 68 65 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  The hot-journal 
57d0: 66 69 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20  file associated 
57e0: 77 69 74 68 0a 23 20 74 65 73 74 2e 64 62 20 70  with.# test.db p
57f0: 6f 69 6e 74 73 20 74 6f 20 6d 61 73 74 65 72 20  oints to master 
5800: 6a 6f 75 72 6e 61 6c 20 24 3a 3a 6d 6a 5f 66 69  journal $::mj_fi
5810: 6c 65 6e 61 6d 65 31 2e 20 53 6f 20 72 65 61 64  lename1. So read
5820: 69 6e 67 20 66 72 6f 6d 0a 23 20 74 65 73 74 2e  ing from.# test.
5830: 64 62 20 73 68 6f 75 6c 64 20 64 65 6c 65 74 65  db should delete
5840: 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 31   $::mj_filename1
5850: 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  ..#.do_test page
5860: 72 31 2e 34 2e 36 2e 39 20 7b 0a 20 20 6c 73 6f  r1.4.6.9 {.  lso
5870: 72 74 20 5b 67 6c 6f 62 20 74 65 73 74 2e 64 62  rt [glob test.db
5880: 2a 5d 0a 7d 20 5b 6c 73 6f 72 74 20 5b 6c 69 73  *].} [lsort [lis
5890: 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
58a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
58b0: 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
58c0: 74 65 73 74 2e 64 62 20 74 65 73 74 2e 64 62 32  test.db test.db2
58d0: 20 74 65 73 74 2e 64 62 33 20 20 20 20 20 20 20   test.db3       
58e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
58f0: 20 20 20 20 20 20 20 5c 0a 20 20 74 65 73 74 2e         \.  test.
5900: 64 62 2d 6a 6f 75 72 6e 61 6c 20 74 65 73 74 2e  db-journal test.
5910: 64 62 32 2d 6a 6f 75 72 6e 61 6c 20 74 65 73 74  db2-journal test
5920: 2e 64 62 33 2d 6a 6f 75 72 6e 61 6c 20 20 20 20  .db3-journal    
5930: 20 20 5c 0a 20 20 5b 66 69 6c 65 20 74 61 69 6c    \.  [file tail
5940: 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 5d   $::mj_filename]
5950: 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 3a 3a 6d   [file tail $::m
5960: 6a 5f 66 69 6c 65 6e 61 6d 65 31 5d 0a 5d 5d 0a  j_filename1].]].
5970: 0a 23 20 54 68 65 20 6d 61 73 74 65 72 2d 6a 6f  .# The master-jo
5980: 75 72 6e 61 6c 20 24 3a 3a 6d 6a 5f 66 69 6c 65  urnal $::mj_file
5990: 6e 61 6d 65 31 20 63 6f 6e 74 61 69 6e 73 20 70  name1 contains p
59a0: 6f 69 6e 74 65 72 73 20 74 6f 20 74 65 73 74 2e  ointers to test.
59b0: 64 62 20 61 6e 64 20 0a 23 20 74 65 73 74 2e 64  db and .# test.d
59c0: 62 32 2e 20 48 6f 77 65 76 65 72 20 74 68 65 20  b2. However the 
59d0: 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 61 73 73 6f  hot-journal asso
59e0: 63 69 61 74 65 64 20 77 69 74 68 20 74 65 73 74  ciated with test
59f0: 2e 64 62 32 20 70 6f 69 6e 74 73 20 74 6f 0a 23  .db2 points to.#
5a00: 20 61 20 64 69 66 66 65 72 65 6e 74 20 6d 61 73   a different mas
5a10: 74 65 72 2d 6a 6f 75 72 6e 61 6c 2e 20 54 68 65  ter-journal. The
5a20: 72 65 66 6f 72 65 2c 20 72 65 61 64 69 6e 67 20  refore, reading 
5a30: 66 72 6f 6d 20 74 65 73 74 2e 64 62 20 6f 6e 6c  from test.db onl
5a40: 79 20 73 68 6f 75 6c 64 0a 23 20 62 65 20 65 6e  y should.# be en
5a50: 6f 75 67 68 20 74 6f 20 63 61 75 73 65 20 53 51  ough to cause SQ
5a60: 4c 69 74 65 20 74 6f 20 64 65 6c 65 74 65 20 24  Lite to delete $
5a70: 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 31 2e 0a  ::mj_filename1..
5a80: 23 0a 64 6f 5f 74 65 73 74 20 20 20 20 20 20 20  #.do_test       
5a90: 20 20 70 61 67 65 72 31 2e 34 2e 36 2e 31 30 20    pager1.4.6.10 
5aa0: 7b 20 66 69 6c 65 20 65 78 69 73 74 73 20 24 3a  { file exists $:
5ab0: 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 20 20 7d 20  :mj_filename  } 
5ac0: 7b 31 7d 0a 64 6f 5f 74 65 73 74 20 20 20 20 20  {1}.do_test     
5ad0: 20 20 20 20 70 61 67 65 72 31 2e 34 2e 36 2e 31      pager1.4.6.1
5ae0: 31 20 7b 20 66 69 6c 65 20 65 78 69 73 74 73 20  1 { file exists 
5af0: 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 31 20  $::mj_filename1 
5b00: 7d 20 7b 31 7d 0a 64 6f 5f 65 78 65 63 73 71 6c  } {1}.do_execsql
5b10: 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e 36  _test pager1.4.6
5b20: 2e 31 32 20 7b 20 53 45 4c 45 43 54 20 2a 20 46  .12 { SELECT * F
5b30: 52 4f 4d 20 74 31 20 7d 20 7b 31 20 74 31 2e 31  ROM t1 } {1 t1.1
5b40: 7d 0a 64 6f 5f 74 65 73 74 20 20 20 20 20 20 20  }.do_test       
5b50: 20 20 70 61 67 65 72 31 2e 34 2e 36 2e 31 33 20    pager1.4.6.13 
5b60: 7b 20 66 69 6c 65 20 65 78 69 73 74 73 20 24 3a  { file exists $:
5b70: 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 20 20 7d 20  :mj_filename  } 
5b80: 7b 31 7d 0a 64 6f 5f 74 65 73 74 20 20 20 20 20  {1}.do_test     
5b90: 20 20 20 20 70 61 67 65 72 31 2e 34 2e 36 2e 31      pager1.4.6.1
5ba0: 34 20 7b 20 66 69 6c 65 20 65 78 69 73 74 73 20  4 { file exists 
5bb0: 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 31 20  $::mj_filename1 
5bc0: 7d 20 7b 30 7d 0a 0a 64 6f 5f 65 78 65 63 73 71  } {0}..do_execsq
5bd0: 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e  l_test pager1.4.
5be0: 36 2e 31 32 20 7b 0a 20 20 41 54 54 41 43 48 20  6.12 {.  ATTACH 
5bf0: 27 74 65 73 74 2e 64 62 32 27 20 41 53 20 74 77  'test.db2' AS tw
5c00: 6f 3b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52  o;.  SELECT * FR
5c10: 4f 4d 20 74 32 3b 0a 7d 20 7b 31 20 74 32 2e 31  OM t2;.} {1 t2.1
5c20: 7d 0a 64 6f 5f 74 65 73 74 20 20 20 20 20 20 20  }.do_test       
5c30: 20 20 70 61 67 65 72 31 2e 34 2e 36 2e 31 33 20    pager1.4.6.13 
5c40: 7b 20 66 69 6c 65 20 65 78 69 73 74 73 20 24 3a  { file exists $:
5c50: 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 20 7d 20 20  :mj_filename }  
5c60: 7b 31 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  {1}.do_execsql_t
5c70: 65 73 74 20 70 61 67 65 72 31 2e 34 2e 36 2e 31  est pager1.4.6.1
5c80: 34 20 7b 0a 20 20 41 54 54 41 43 48 20 27 74 65  4 {.  ATTACH 'te
5c90: 73 74 2e 64 62 33 27 20 41 53 20 74 68 72 65 65  st.db3' AS three
5ca0: 3b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  ;.  SELECT * FRO
5cb0: 4d 20 74 33 3b 0a 7d 20 7b 31 20 74 33 2e 31 7d  M t3;.} {1 t3.1}
5cc0: 0a 64 6f 5f 74 65 73 74 20 20 20 20 20 20 20 20  .do_test        
5cd0: 20 70 61 67 65 72 31 2e 34 2e 36 2e 31 35 20 7b   pager1.4.6.15 {
5ce0: 20 66 69 6c 65 20 65 78 69 73 74 73 20 24 3a 3a   file exists $::
5cf0: 6d 6a 5f 66 69 6c 65 6e 61 6d 65 20 7d 20 20 7b  mj_filename }  {
5d00: 30 7d 0a 0a 64 62 20 63 6c 6f 73 65 0a 74 76 20  0}..db close.tv 
5d10: 64 65 6c 65 74 65 0a 0a 23 2d 2d 2d 2d 2d 2d 2d  delete..#-------
5d20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5d60: 2d 2d 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69  --.# The followi
5d70: 6e 67 20 74 65 73 74 73 20 64 65 61 6c 20 77 69  ng tests deal wi
5d80: 74 68 20 6d 75 6c 74 69 2d 66 69 6c 65 20 63 6f  th multi-file co
5d90: 6d 6d 69 74 73 2e 0a 23 0a 23 20 70 61 67 65 72  mmits..#.# pager
5da0: 31 2d 35 2e 31 2e 2a 3a 20 54 68 65 20 63 61 73  1-5.1.*: The cas
5db0: 65 20 77 68 65 72 65 20 61 20 6d 75 6c 74 69 2d  e where a multi-
5dc0: 66 69 6c 65 20 63 61 6e 6e 6f 74 20 62 65 20 63  file cannot be c
5dd0: 6f 6d 6d 69 74 74 65 64 20 62 65 63 61 75 73 65  ommitted because
5de0: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
5df0: 20 61 6e 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74   another connect
5e00: 69 6f 6e 20 69 73 20 68 6f 6c 64 69 6e 67 20 61  ion is holding a
5e10: 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 20   SHARED lock on 
5e20: 6f 6e 65 20 6f 66 20 74 68 65 0a 23 20 20 20 20  one of the.#    
5e30: 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 73             files
5e40: 2e 20 41 66 74 65 72 20 74 68 65 20 53 48 41 52  . After the SHAR
5e50: 45 44 20 6c 6f 63 6b 20 69 73 20 72 65 6d 6f 76  ED lock is remov
5e60: 65 64 2c 20 74 68 65 20 43 4f 4d 4d 49 54 20 73  ed, the COMMIT s
5e70: 75 63 63 65 65 64 73 2e 0a 23 0a 23 20 70 61 67  ucceeds..#.# pag
5e80: 65 72 31 2d 35 2e 32 2e 2a 3a 20 4d 75 6c 74 69  er1-5.2.*: Multi
5e90: 2d 66 69 6c 65 20 63 6f 6d 6d 69 74 73 20 77 69  -file commits wi
5ea0: 74 68 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  th journal_mode=
5eb0: 6d 65 6d 6f 72 79 2e 0a 23 0a 23 20 70 61 67 65  memory..#.# page
5ec0: 72 31 2d 35 2e 33 2e 2a 3a 20 4d 75 6c 74 69 2d  r1-5.3.*: Multi-
5ed0: 66 69 6c 65 20 63 6f 6d 6d 69 74 73 20 77 69 74  file commits wit
5ee0: 68 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 6d  h journal_mode=m
5ef0: 65 6d 6f 72 79 2e 0a 23 0a 23 20 70 61 67 65 72  emory..#.# pager
5f00: 31 2d 35 2e 34 2e 2a 3a 20 43 68 65 63 6b 20 74  1-5.4.*: Check t
5f10: 68 61 74 20 77 69 74 68 20 73 79 6e 63 68 72 6f  hat with synchro
5f20: 6e 6f 75 73 3d 6e 6f 72 6d 61 6c 2c 20 74 68 65  nous=normal, the
5f30: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
5f40: 66 69 6c 65 0a 23 20 20 20 20 20 20 20 20 20 20  file.#          
5f50: 20 20 20 20 20 6e 61 6d 65 20 69 73 20 61 64 64       name is add
5f60: 65 64 20 74 6f 20 61 20 6a 6f 75 72 6e 61 6c 20  ed to a journal 
5f70: 66 69 6c 65 20 69 6d 6d 65 64 69 61 74 65 6c 79  file immediately
5f80: 20 61 66 74 65 72 20 74 68 65 20 6c 61 73 74 0a   after the last.
5f90: 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  #               
5fa0: 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 2e 20  journal record. 
5fb0: 42 75 74 20 77 69 74 68 20 73 79 6e 63 68 72 6f  But with synchro
5fc0: 6e 6f 75 73 3d 66 75 6c 6c 2c 20 65 78 74 72 61  nous=full, extra
5fd0: 20 75 6e 75 73 65 64 20 73 70 61 63 65 0a 23 20   unused space.# 
5fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73                is
5ff0: 20 61 6c 6c 6f 63 61 74 65 64 20 62 65 74 77 65   allocated betwe
6000: 65 6e 20 74 68 65 20 6c 61 73 74 20 6a 6f 75 72  en the last jour
6010: 6e 61 6c 20 72 65 63 6f 72 64 20 61 6e 64 20 74  nal record and t
6020: 68 65 20 0a 23 20 20 20 20 20 20 20 20 20 20 20  he .#           
6030: 20 20 20 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e      master-journ
6040: 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 73 6f 20  al file name so 
6050: 74 68 61 74 20 74 68 65 20 6d 61 73 74 65 72 2d  that the master-
6060: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 23 20 20  journal file.#  
6070: 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 61 6d               nam
6080: 65 20 64 6f 65 73 20 6e 6f 74 20 6c 69 65 20 6f  e does not lie o
6090: 6e 20 74 68 65 20 73 61 6d 65 20 73 65 63 74 6f  n the same secto
60a0: 72 20 61 73 20 74 68 65 20 6c 61 73 74 20 6a 6f  r as the last jo
60b0: 75 72 6e 61 6c 20 66 69 6c 65 0a 23 20 20 20 20  urnal file.#    
60c0: 20 20 20 20 20 20 20 20 20 20 20 72 65 63 6f 72             recor
60d0: 64 2e 0a 23 0a 23 20 70 61 67 65 72 31 2d 35 2e  d..#.# pager1-5.
60e0: 35 2e 2a 3a 20 43 68 65 63 6b 20 74 68 61 74 20  5.*: Check that 
60f0: 69 6e 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  in journal_mode=
6100: 50 45 52 53 49 53 54 20 6d 6f 64 65 2c 20 61 20  PERSIST mode, a 
6110: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 0a  journal file is.
6120: 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  #               
6130: 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72  truncated to zer
6140: 6f 20 62 79 74 65 73 20 77 68 65 6e 20 61 20 6d  o bytes when a m
6150: 75 6c 74 69 2d 66 69 6c 65 20 74 72 61 6e 73 61  ulti-file transa
6160: 63 74 69 6f 6e 20 69 73 20 0a 23 20 20 20 20 20  ction is .#     
6170: 20 20 20 20 20 20 20 20 20 20 63 6f 6d 6d 69 74            commit
6180: 74 65 64 20 28 69 6e 73 74 65 61 64 20 6f 66 20  ted (instead of 
6190: 74 68 65 20 66 69 72 73 74 20 63 6f 75 70 6c 65  the first couple
61a0: 20 6f 66 20 62 79 74 65 73 20 62 65 69 6e 67 20   of bytes being 
61b0: 7a 65 72 6f 65 64 29 2e 0a 23 0a 23 0a 64 6f 5f  zeroed)..#.#.do_
61c0: 74 65 73 74 20 70 61 67 65 72 31 2d 35 2e 31 2e  test pager1-5.1.
61d0: 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64  1 {.  faultsim_d
61e0: 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e  elete_and_reopen
61f0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
6200: 20 41 54 54 41 43 48 20 27 74 65 73 74 2e 64 62   ATTACH 'test.db
6210: 32 27 20 41 53 20 61 75 78 3b 0a 20 20 20 20 43  2' AS aux;.    C
6220: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61  REATE TABLE t1(a
6230: 2c 20 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45  , b);.    CREATE
6240: 20 54 41 42 4c 45 20 61 75 78 2e 74 32 28 61 2c   TABLE aux.t2(a,
6250: 20 62 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   b);.    INSERT 
6260: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31  INTO t1 VALUES(1
6270: 37 2c 20 27 4c 65 6e 69 6e 27 29 3b 0a 20 20 20  7, 'Lenin');.   
6280: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
6290: 56 41 4c 55 45 53 28 32 32 2c 20 27 53 74 61 6c  VALUES(22, 'Stal
62a0: 69 6e 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  in');.    INSERT
62b0: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
62c0: 35 33 2c 20 27 4b 68 72 75 73 68 63 68 65 76 27  53, 'Khrushchev'
62d0: 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74  );.  }.} {}.do_t
62e0: 65 73 74 20 70 61 67 65 72 31 2d 35 2e 31 2e 32  est pager1-5.1.2
62f0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
6300: 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20     BEGIN;.      
6310: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
6320: 41 4c 55 45 53 28 36 34 2c 20 27 42 72 65 7a 68  ALUES(64, 'Brezh
6330: 6e 65 76 27 29 3b 0a 20 20 20 20 20 20 49 4e 53  nev');.      INS
6340: 45 52 54 20 49 4e 54 4f 20 74 32 20 53 45 4c 45  ERT INTO t2 SELE
6350: 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20  CT * FROM t1;.  
6360: 7d 0a 20 20 73 71 6c 69 74 65 33 20 64 62 32 20  }.  sqlite3 db2 
6370: 74 65 73 74 2e 64 62 32 0a 20 20 65 78 65 63 73  test.db2.  execs
6380: 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a  ql {.    BEGIN;.
6390: 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46        SELECT * F
63a0: 52 4f 4d 20 74 32 3b 0a 20 20 7d 20 64 62 32 0a  ROM t2;.  } db2.
63b0: 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67  } {}.do_test pag
63c0: 65 72 31 2d 35 2e 31 2e 33 20 7b 0a 20 20 63 61  er1-5.1.3 {.  ca
63d0: 74 63 68 73 71 6c 20 43 4f 4d 4d 49 54 0a 7d 20  tchsql COMMIT.} 
63e0: 7b 31 20 7b 64 61 74 61 62 61 73 65 20 69 73 20  {1 {database is 
63f0: 6c 6f 63 6b 65 64 7d 7d 0a 64 6f 5f 74 65 73 74  locked}}.do_test
6400: 20 70 61 67 65 72 31 2d 35 2e 31 2e 34 20 7b 0a   pager1-5.1.4 {.
6410: 20 20 65 78 65 63 73 71 6c 20 43 4f 4d 4d 49 54    execsql COMMIT
6420: 20 64 62 32 0a 20 20 65 78 65 63 73 71 6c 20 43   db2.  execsql C
6430: 4f 4d 4d 49 54 0a 20 20 65 78 65 63 73 71 6c 20  OMMIT.  execsql 
6440: 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  { SELECT * FROM 
6450: 74 32 20 7d 20 64 62 32 0a 7d 20 7b 31 37 20 4c  t2 } db2.} {17 L
6460: 65 6e 69 6e 20 32 32 20 53 74 61 6c 69 6e 20 35  enin 22 Stalin 5
6470: 33 20 4b 68 72 75 73 68 63 68 65 76 20 36 34 20  3 Khrushchev 64 
6480: 42 72 65 7a 68 6e 65 76 7d 0a 64 6f 5f 74 65 73  Brezhnev}.do_tes
6490: 74 20 70 61 67 65 72 31 2d 35 2e 31 2e 35 20 7b  t pager1-5.1.5 {
64a0: 0a 20 20 64 62 32 20 63 6c 6f 73 65 0a 7d 20 7b  .  db2 close.} {
64b0: 7d 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  }..do_test pager
64c0: 31 2d 35 2e 32 2e 31 20 7b 0a 20 20 65 78 65 63  1-5.2.1 {.  exec
64d0: 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41  sql {.    PRAGMA
64e0: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20   journal_mode = 
64f0: 6d 65 6d 6f 72 79 3b 0a 20 20 20 20 42 45 47 49  memory;.    BEGI
6500: 4e 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  N;.      INSERT 
6510: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 38  INTO t1 VALUES(8
6520: 34 2c 20 27 41 6e 64 72 6f 70 6f 76 27 29 3b 0a  4, 'Andropov');.
6530: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
6540: 4f 20 74 32 20 56 41 4c 55 45 53 28 38 34 2c 20  O t2 VALUES(84, 
6550: 27 41 6e 64 72 6f 70 6f 76 27 29 3b 0a 20 20 20  'Andropov');.   
6560: 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 7d 20 7b   COMMIT;.  }.} {
6570: 6d 65 6d 6f 72 79 7d 0a 64 6f 5f 74 65 73 74 20  memory}.do_test 
6580: 70 61 67 65 72 31 2d 35 2e 33 2e 31 20 7b 0a 20  pager1-5.3.1 {. 
6590: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50   execsql {.    P
65a0: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
65b0: 64 65 20 3d 20 6f 66 66 3b 0a 20 20 20 20 42 45  de = off;.    BE
65c0: 47 49 4e 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  GIN;.      INSER
65d0: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
65e0: 28 38 35 2c 20 27 47 6f 72 62 61 63 68 65 76 27  (85, 'Gorbachev'
65f0: 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  );.      INSERT 
6600: 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 38  INTO t2 VALUES(8
6610: 35 2c 20 27 47 6f 72 62 61 63 68 65 76 27 29 3b  5, 'Gorbachev');
6620: 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d  .    COMMIT;.  }
6630: 0a 7d 20 7b 6f 66 66 7d 0a 0a 64 6f 5f 74 65 73  .} {off}..do_tes
6640: 74 20 70 61 67 65 72 31 2d 35 2e 34 2e 31 20 7b  t pager1-5.4.1 {
6650: 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 74 65  .  db close.  te
6660: 73 74 76 66 73 20 74 76 0a 20 20 73 71 6c 69 74  stvfs tv.  sqlit
6670: 65 33 20 64 62 20 74 65 73 74 2e 64 62 20 2d 76  e3 db test.db -v
6680: 66 73 20 74 76 0a 20 20 65 78 65 63 73 71 6c 20  fs tv.  execsql 
6690: 7b 20 41 54 54 41 43 48 20 27 74 65 73 74 2e 64  { ATTACH 'test.d
66a0: 62 32 27 20 41 53 20 61 75 78 20 7d 0a 0a 20 20  b2' AS aux }..  
66b0: 74 76 20 66 69 6c 74 65 72 20 78 44 65 6c 65 74  tv filter xDelet
66c0: 65 0a 20 20 74 76 20 73 63 72 69 70 74 20 6d 61  e.  tv script ma
66d0: 78 5f 6a 6f 75 72 6e 61 6c 5f 73 69 7a 65 0a 20  x_journal_size. 
66e0: 20 74 76 20 73 65 63 74 6f 72 73 69 7a 65 20 35   tv sectorsize 5
66f0: 31 32 0a 20 20 73 65 74 20 3a 3a 6d 61 78 5f 6a  12.  set ::max_j
6700: 6f 75 72 6e 61 6c 20 30 0a 20 20 70 72 6f 63 20  ournal 0.  proc 
6710: 6d 61 78 5f 6a 6f 75 72 6e 61 6c 5f 73 69 7a 65  max_journal_size
6720: 20 7b 6d 65 74 68 6f 64 20 61 72 67 73 7d 20 7b   {method args} {
6730: 0a 20 20 20 20 73 65 74 20 73 7a 20 30 0a 20 20  .    set sz 0.  
6740: 20 20 63 61 74 63 68 20 7b 20 73 65 74 20 73 7a    catch { set sz
6750: 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74   [file size test
6760: 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5d 20 7d 0a 20  .db-journal] }. 
6770: 20 20 20 69 66 20 7b 24 73 7a 20 3e 20 24 3a 3a     if {$sz > $::
6780: 6d 61 78 5f 6a 6f 75 72 6e 61 6c 7d 20 7b 0a 20  max_journal} {. 
6790: 20 20 20 20 20 73 65 74 20 3a 3a 6d 61 78 5f 6a       set ::max_j
67a0: 6f 75 72 6e 61 6c 20 24 73 7a 0a 20 20 20 20 7d  ournal $sz.    }
67b0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
67c0: 54 45 5f 4f 4b 0a 20 20 7d 0a 20 20 65 78 65 63  TE_OK.  }.  exec
67d0: 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41  sql {.    PRAGMA
67e0: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20   journal_mode = 
67f0: 44 45 4c 45 54 45 3b 0a 20 20 20 20 50 52 41 47  DELETE;.    PRAG
6800: 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 3d  MA synchronous =
6810: 20 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 42 45 47   NORMAL;.    BEG
6820: 49 4e 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  IN;.      INSERT
6830: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
6840: 38 35 2c 20 27 47 6f 72 62 61 63 68 65 76 27 29  85, 'Gorbachev')
6850: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
6860: 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 38 35  NTO t2 VALUES(85
6870: 2c 20 27 47 6f 72 62 61 63 68 65 76 27 29 3b 0a  , 'Gorbachev');.
6880: 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a      COMMIT;.  }.
6890: 20 20 73 65 74 20 3a 3a 6d 61 78 5f 6a 6f 75 72    set ::max_jour
68a0: 6e 61 6c 0a 7d 20 5b 65 78 70 72 20 32 36 31 35  nal.} [expr 2615
68b0: 2b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  +[string length 
68c0: 5b 70 77 64 5d 5d 5d 0a 64 6f 5f 74 65 73 74 20  [pwd]]].do_test 
68d0: 70 61 67 65 72 31 2d 35 2e 34 2e 32 20 7b 0a 20  pager1-5.4.2 {. 
68e0: 20 73 65 74 20 3a 3a 6d 61 78 5f 6a 6f 75 72 6e   set ::max_journ
68f0: 61 6c 20 30 0a 20 20 65 78 65 63 73 71 6c 20 7b  al 0.  execsql {
6900: 0a 20 20 20 20 50 52 41 47 4d 41 20 73 79 6e 63  .    PRAGMA sync
6910: 68 72 6f 6e 6f 75 73 20 3d 20 66 75 6c 6c 3b 0a  hronous = full;.
6920: 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20      BEGIN;.     
6930: 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 20   DELETE FROM t1 
6940: 57 48 45 52 45 20 62 20 3d 20 27 4c 65 6e 69 6e  WHERE b = 'Lenin
6950: 27 3b 0a 20 20 20 20 20 20 44 45 4c 45 54 45 20  ';.      DELETE 
6960: 46 52 4f 4d 20 74 32 20 57 48 45 52 45 20 62 20  FROM t2 WHERE b 
6970: 3d 20 27 4c 65 6e 69 6e 27 3b 0a 20 20 20 20 43  = 'Lenin';.    C
6980: 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 20 20 73 65 74  OMMIT;.  }.  set
6990: 20 3a 3a 6d 61 78 5f 6a 6f 75 72 6e 61 6c 0a 7d   ::max_journal.}
69a0: 20 5b 65 78 70 72 20 33 31 31 31 2b 5b 73 74 72   [expr 3111+[str
69b0: 69 6e 67 20 6c 65 6e 67 74 68 20 5b 70 77 64 5d  ing length [pwd]
69c0: 5d 5d 0a 64 62 20 63 6c 6f 73 65 0a 74 76 20 64  ]].db close.tv d
69d0: 65 6c 65 74 65 0a 0a 64 6f 5f 74 65 73 74 20 70  elete..do_test p
69e0: 61 67 65 72 31 2d 35 2e 35 2e 31 20 7b 0a 20 20  ager1-5.5.1 {.  
69f0: 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e  sqlite3 db test.
6a00: 64 62 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 0a  db.  execsql { .
6a10: 20 20 20 20 41 54 54 41 43 48 20 27 74 65 73 74      ATTACH 'test
6a20: 2e 64 62 32 27 20 41 53 20 61 75 78 3b 0a 20 20  .db2' AS aux;.  
6a30: 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c    PRAGMA journal
6a40: 5f 6d 6f 64 65 20 3d 20 50 45 52 53 49 53 54 3b  _mode = PERSIST;
6a50: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
6a60: 45 20 74 33 28 61 2c 20 62 29 3b 0a 20 20 20 20  E t3(a, b);.    
6a70: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 20 53  INSERT INTO t3 S
6a80: 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62  ELECT randomblob
6a90: 28 31 35 30 30 29 2c 20 72 61 6e 64 6f 6d 62 6c  (1500), randombl
6aa0: 6f 62 28 31 35 30 30 29 20 46 52 4f 4d 20 74 31  ob(1500) FROM t1
6ab0: 3b 0a 20 20 20 20 55 50 44 41 54 45 20 74 33 20  ;.    UPDATE t3 
6ac0: 53 45 54 20 62 20 3d 20 72 61 6e 64 6f 6d 62 6c  SET b = randombl
6ad0: 6f 62 28 31 35 30 30 29 3b 0a 20 20 7d 0a 20 20  ob(1500);.  }.  
6ae0: 65 78 70 72 20 5b 66 69 6c 65 20 73 69 7a 65 20  expr [file size 
6af0: 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5d  test.db-journal]
6b00: 20 3e 20 31 35 30 30 30 0a 7d 20 7b 31 7d 0a 64   > 15000.} {1}.d
6b10: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 35 2e  o_test pager1-5.
6b20: 35 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  5.2 {.  execsql 
6b30: 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 73 79 6e  {.    PRAGMA syn
6b40: 63 68 72 6f 6e 6f 75 73 20 3d 20 66 75 6c 6c 3b  chronous = full;
6b50: 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20  .    BEGIN;.    
6b60: 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31    DELETE FROM t1
6b70: 20 57 48 45 52 45 20 62 20 3d 20 27 53 74 61 6c   WHERE b = 'Stal
6b80: 69 6e 27 3b 0a 20 20 20 20 20 20 44 45 4c 45 54  in';.      DELET
6b90: 45 20 46 52 4f 4d 20 74 32 20 57 48 45 52 45 20  E FROM t2 WHERE 
6ba0: 62 20 3d 20 27 53 74 61 6c 69 6e 27 3b 0a 20 20  b = 'Stalin';.  
6bb0: 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 20 20    COMMIT;.  }.  
6bc0: 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64  file size test.d
6bd0: 62 2d 6a 6f 75 72 6e 61 6c 0a 7d 20 7b 30 7d 0a  b-journal.} {0}.
6be0: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
6bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6c10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6c20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54  ------------.# T
6c30: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73  he following tes
6c40: 74 73 20 77 6f 72 6b 20 77 69 74 68 20 22 50 52  ts work with "PR
6c50: 41 47 4d 41 20 6d 61 78 5f 70 61 67 65 5f 63 6f  AGMA max_page_co
6c60: 75 6e 74 22 0a 23 0a 64 6f 5f 74 65 73 74 20 70  unt".#.do_test p
6c70: 61 67 65 72 31 2d 36 2e 31 20 7b 0a 20 20 66 61  ager1-6.1 {.  fa
6c80: 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e  ultsim_delete_an
6c90: 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65 63 73  d_reopen.  execs
6ca0: 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20  ql {.    PRAGMA 
6cb0: 6d 61 78 5f 70 61 67 65 5f 63 6f 75 6e 74 20 3d  max_page_count =
6cc0: 20 31 30 3b 0a 20 20 20 20 43 52 45 41 54 45 20   10;.    CREATE 
6cd0: 54 41 42 4c 45 20 74 32 28 61 2c 20 62 29 3b 0a  TABLE t2(a, b);.
6ce0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
6cf0: 20 74 33 28 61 2c 20 62 29 3b 0a 20 20 20 20 43   t3(a, b);.    C
6d00: 52 45 41 54 45 20 54 41 42 4c 45 20 74 34 28 61  REATE TABLE t4(a
6d10: 2c 20 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45  , b);.    CREATE
6d20: 20 54 41 42 4c 45 20 74 35 28 61 2c 20 62 29 3b   TABLE t5(a, b);
6d30: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
6d40: 45 20 74 36 28 61 2c 20 62 29 3b 0a 20 20 20 20  E t6(a, b);.    
6d50: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 37 28  CREATE TABLE t7(
6d60: 61 2c 20 62 29 3b 0a 20 20 20 20 43 52 45 41 54  a, b);.    CREAT
6d70: 45 20 54 41 42 4c 45 20 74 38 28 61 2c 20 62 29  E TABLE t8(a, b)
6d80: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
6d90: 4c 45 20 74 39 28 61 2c 20 62 29 3b 0a 20 20 20  LE t9(a, b);.   
6da0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
6db0: 30 28 61 2c 20 62 29 3b 0a 20 20 7d 0a 7d 20 7b  0(a, b);.  }.} {
6dc0: 31 30 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  10}.do_test page
6dd0: 72 31 2d 36 2e 32 20 7b 0a 20 20 63 61 74 63 68  r1-6.2 {.  catch
6de0: 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45  sql {.    CREATE
6df0: 20 54 41 42 4c 45 20 74 31 31 28 61 2c 20 62 29   TABLE t11(a, b)
6e00: 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b 64 61 74 61  ;.  }.} {1 {data
6e10: 62 61 73 65 20 6f 72 20 64 69 73 6b 20 69 73 20  base or disk is 
6e20: 66 75 6c 6c 7d 7d 0a 0a 0a 23 2d 2d 2d 2d 2d 2d  full}}...#------
6e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6e70: 2d 2d 2d 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77  ---.# The follow
6e80: 69 6e 67 20 74 65 73 74 73 20 77 6f 72 6b 20 77  ing tests work w
6e90: 69 74 68 20 22 50 52 41 47 4d 41 20 6a 6f 75 72  ith "PRAGMA jour
6ea0: 6e 61 6c 5f 6d 6f 64 65 3d 54 52 55 4e 43 41 54  nal_mode=TRUNCAT
6eb0: 45 22 20 61 6e 64 0a 23 20 22 50 52 41 47 4d 41  E" and.# "PRAGMA
6ec0: 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58   locking_mode=EX
6ed0: 43 4c 55 53 49 56 45 22 2e 0a 23 0a 23 20 45 61  CLUSIVE"..#.# Ea
6ee0: 63 68 20 74 65 73 74 20 69 73 20 73 70 65 63 69  ch test is speci
6ef0: 66 69 65 64 20 77 69 74 68 20 35 20 76 61 72 69  fied with 5 vari
6f00: 61 62 6c 65 73 2e 20 41 73 20 66 6f 6c 6c 6f 77  ables. As follow
6f10: 73 3a 0a 23 0a 23 20 20 20 24 74 6e 3a 20 20 54  s:.#.#   $tn:  T
6f20: 65 73 74 20 4e 75 6d 62 65 72 2e 20 55 73 65 64  est Number. Used
6f30: 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   as part of the 
6f40: 5b 64 6f 5f 74 65 73 74 5d 20 74 65 73 74 20 6e  [do_test] test n
6f50: 61 6d 65 73 2e 0a 23 20 20 20 24 73 71 6c 3a 20  ames..#   $sql: 
6f60: 53 51 4c 20 74 6f 20 65 78 65 63 75 74 65 2e 0a  SQL to execute..
6f70: 23 20 20 20 24 72 65 73 3a 20 45 78 70 65 63 74  #   $res: Expect
6f80: 65 64 20 72 65 73 75 6c 74 20 6f 66 20 65 78 65  ed result of exe
6f90: 63 75 74 69 6e 67 20 24 73 71 6c 2e 0a 23 20 20  cuting $sql..#  
6fa0: 20 24 6a 73 3a 20 20 54 68 65 20 65 78 70 65 63   $js:  The expec
6fb0: 74 65 64 20 73 69 7a 65 20 6f 66 20 74 68 65 20  ted size of the 
6fc0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 69 6e  journal file, in
6fd0: 20 62 79 74 65 73 2c 20 61 66 74 65 72 20 65 78   bytes, after ex
6fe0: 65 63 75 74 69 6e 67 0a 23 20 20 20 20 20 20 20  ecuting.#       
6ff0: 20 20 74 68 65 20 53 51 4c 20 73 63 72 69 70 74    the SQL script
7000: 2e 20 4f 72 20 2d 31 20 69 66 20 74 68 65 20 6a  . Or -1 if the j
7010: 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 65 78  ournal is not ex
7020: 70 65 63 74 65 64 20 74 6f 20 65 78 69 73 74 2e  pected to exist.
7030: 0a 23 20 20 20 24 77 73 3a 20 20 54 68 65 20 65  .#   $ws:  The e
7040: 78 70 65 63 74 65 64 20 73 69 7a 65 20 6f 66 20  xpected size of 
7050: 74 68 65 20 57 41 4c 20 66 69 6c 65 2c 20 69 6e  the WAL file, in
7060: 20 62 79 74 65 73 2c 20 61 66 74 65 72 20 65 78   bytes, after ex
7070: 65 63 75 74 69 6e 67 0a 23 20 20 20 20 20 20 20  ecuting.#       
7080: 20 20 74 68 65 20 53 51 4c 20 73 63 72 69 70 74    the SQL script
7090: 2e 20 4f 72 20 2d 31 20 69 66 20 74 68 65 20 57  . Or -1 if the W
70a0: 41 4c 20 69 73 20 6e 6f 74 20 65 78 70 65 63 74  AL is not expect
70b0: 65 64 20 74 6f 20 65 78 69 73 74 2e 0a 23 0a 66  ed to exist..#.f
70c0: 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61  aultsim_delete_a
70d0: 6e 64 5f 72 65 6f 70 65 6e 0a 66 6f 72 65 61 63  nd_reopen.foreac
70e0: 68 20 7b 74 6e 20 73 71 6c 20 72 65 73 20 6a 73  h {tn sql res js
70f0: 20 77 73 7d 20 5b 73 75 62 73 74 20 7b 0a 0a 20   ws} [subst {.. 
7100: 20 31 20 20 7b 0a 20 20 20 20 43 52 45 41 54 45   1  {.    CREATE
7110: 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b   TABLE t1(a, b);
7120: 0a 20 20 20 20 50 52 41 47 4d 41 20 61 75 74 6f  .    PRAGMA auto
7130: 5f 76 61 63 75 75 6d 3d 4f 46 46 3b 0a 20 20 20  _vacuum=OFF;.   
7140: 20 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e   PRAGMA synchron
7150: 6f 75 73 3d 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20  ous=NORMAL;.    
7160: 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65  PRAGMA page_size
7170: 3d 31 30 32 34 3b 0a 20 20 20 20 50 52 41 47 4d  =1024;.    PRAGM
7180: 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45  A locking_mode=E
7190: 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20 50 52  XCLUSIVE;.    PR
71a0: 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
71b0: 65 3d 54 52 55 4e 43 41 54 45 3b 0a 20 20 20 20  e=TRUNCATE;.    
71c0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
71d0: 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20 20 7d  ALUES(1, 2);.  }
71e0: 20 7b 65 78 63 6c 75 73 69 76 65 20 74 72 75 6e   {exclusive trun
71f0: 63 61 74 65 7d 20 30 20 2d 31 0a 0a 20 20 32 20  cate} 0 -1..  2 
7200: 20 7b 0a 20 20 20 20 42 45 47 49 4e 20 49 4d 4d   {.    BEGIN IMM
7210: 45 44 49 41 54 45 3b 0a 20 20 20 20 20 20 53 45  EDIATE;.      SE
7220: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a  LECT * FROM t1;.
7230: 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 20      COMMIT;.  } 
7240: 7b 31 20 32 7d 20 30 20 2d 31 0a 0a 20 20 33 20  {1 2} 0 -1..  3 
7250: 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20   {.    BEGIN;.  
7260: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
7270: 4d 20 74 31 3b 0a 20 20 20 20 43 4f 4d 4d 49 54  M t1;.    COMMIT
7280: 3b 0a 20 20 7d 20 7b 31 20 32 7d 20 30 20 2d 31  ;.  } {1 2} 0 -1
7290: 0a 0a 20 20 34 20 20 7b 20 50 52 41 47 4d 41 20  ..  4  { PRAGMA 
72a0: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 57  journal_mode = W
72b0: 41 4c 20 7d 20 20 20 20 77 61 6c 20 20 20 20 2d  AL }    wal    -
72c0: 31 20 2d 31 0a 20 20 35 20 20 7b 20 49 4e 53 45  1 -1.  5  { INSE
72d0: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
72e0: 53 28 33 2c 20 34 29 20 7d 20 20 7b 7d 20 20 20  S(3, 4) }  {}   
72f0: 20 20 2d 31 20 5b 77 61 6c 5f 66 69 6c 65 5f 73    -1 [wal_file_s
7300: 69 7a 65 20 31 20 31 30 32 34 5d 0a 20 20 36 20  ize 1 1024].  6 
7310: 20 7b 20 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e   { PRAGMA lockin
7320: 67 5f 6d 6f 64 65 20 3d 20 4e 4f 52 4d 41 4c 20  g_mode = NORMAL 
7330: 7d 20 6e 6f 72 6d 61 6c 20 2d 31 20 5b 77 61 6c  } normal -1 [wal
7340: 5f 66 69 6c 65 5f 73 69 7a 65 20 31 20 31 30 32  _file_size 1 102
7350: 34 5d 0a 20 20 37 20 20 7b 20 49 4e 53 45 52 54  4].  7  { INSERT
7360: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
7370: 35 2c 20 36 29 3b 20 7d 20 7b 7d 20 20 20 20 20  5, 6); } {}     
7380: 2d 31 20 5b 77 61 6c 5f 66 69 6c 65 5f 73 69 7a  -1 [wal_file_siz
7390: 65 20 32 20 31 30 32 34 5d 0a 0a 20 20 38 20 20  e 2 1024]..  8  
73a0: 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c  { PRAGMA journal
73b0: 5f 6d 6f 64 65 20 3d 20 54 52 55 4e 43 41 54 45  _mode = TRUNCATE
73c0: 20 7d 20 74 72 75 6e 63 61 74 65 20 20 20 20 20   } truncate     
73d0: 20 20 20 20 20 30 20 2d 31 0a 20 20 39 20 20 7b       0 -1.  9  {
73e0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
73f0: 56 41 4c 55 45 53 28 37 2c 20 38 29 20 7d 20 20  VALUES(7, 8) }  
7400: 20 20 7b 7d 20 20 20 20 20 20 20 20 20 20 20 20    {}            
7410: 20 20 20 20 30 20 2d 31 0a 20 20 31 30 20 7b 20      0 -1.  10 { 
7420: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
7430: 20 7d 20 20 20 20 20 20 20 20 20 20 20 20 20 20   }              
7440: 20 7b 31 20 32 20 33 20 34 20 35 20 36 20 37 20   {1 2 3 4 5 6 7 
7450: 38 7d 20 30 20 2d 31 0a 0a 7d 5d 20 7b 0a 20 20  8} 0 -1..}] {.  
7460: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
7470: 70 61 67 65 72 31 2d 37 2e 31 2e 24 74 6e 2e 31  pager1-7.1.$tn.1
7480: 20 24 73 71 6c 20 24 72 65 73 0a 20 20 63 61 74   $sql $res.  cat
7490: 63 68 20 7b 20 73 65 74 20 4a 20 2d 31 20 3b 20  ch { set J -1 ; 
74a0: 73 65 74 20 4a 20 5b 66 69 6c 65 20 73 69 7a 65  set J [file size
74b0: 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c   test.db-journal
74c0: 5d 20 7d 0a 20 20 63 61 74 63 68 20 7b 20 73 65  ] }.  catch { se
74d0: 74 20 57 20 2d 31 20 3b 20 73 65 74 20 57 20 5b  t W -1 ; set W [
74e0: 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64  file size test.d
74f0: 62 2d 77 61 6c 5d 20 7d 0a 20 20 64 6f 5f 74 65  b-wal] }.  do_te
7500: 73 74 20 70 61 67 65 72 31 2d 37 2e 31 2e 24 74  st pager1-7.1.$t
7510: 6e 2e 32 20 7b 20 6c 69 73 74 20 24 4a 20 24 57  n.2 { list $J $W
7520: 20 7d 20 5b 6c 69 73 74 20 24 6a 73 20 24 77 73   } [list $js $ws
7530: 5d 0a 7d 0a 0a 66 6f 72 65 61 63 68 20 7b 74 6e  ].}..foreach {tn
7540: 20 66 69 6c 65 6e 61 6d 65 7d 20 7b 0a 20 20 31   filename} {.  1
7550: 20 3a 6d 65 6d 6f 72 79 3a 0a 20 20 32 20 22 22   :memory:.  2 ""
7560: 0a 7d 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 70  .} {.  do_test p
7570: 61 67 65 72 31 2d 38 2e 24 74 6e 2e 31 20 7b 0a  ager1-8.$tn.1 {.
7580: 20 20 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c      faultsim_del
7590: 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20  ete_and_reopen. 
75a0: 20 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 20 20     db close.    
75b0: 73 71 6c 69 74 65 33 20 64 62 20 24 66 69 6c 65  sqlite3 db $file
75c0: 6e 61 6d 65 0a 20 20 20 20 65 78 65 63 73 71 6c  name.    execsql
75d0: 20 7b 0a 20 20 20 20 20 20 43 52 45 41 54 45 20   {.      CREATE 
75e0: 54 41 42 4c 45 20 78 31 28 78 29 3b 0a 20 20 20  TABLE x1(x);.   
75f0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78     INSERT INTO x
7600: 31 20 56 41 4c 55 45 53 28 27 43 68 61 72 6c 65  1 VALUES('Charle
7610: 73 27 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  s');.      INSER
7620: 54 20 49 4e 54 4f 20 78 31 20 56 41 4c 55 45 53  T INTO x1 VALUES
7630: 28 27 4a 61 6d 65 73 27 29 3b 0a 20 20 20 20 20  ('James');.     
7640: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 31 20   INSERT INTO x1 
7650: 56 41 4c 55 45 53 28 27 4d 61 72 79 27 29 3b 0a  VALUES('Mary');.
7660: 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46        SELECT * F
7670: 52 4f 4d 20 78 31 3b 0a 20 20 20 20 7d 0a 20 20  ROM x1;.    }.  
7680: 7d 20 7b 43 68 61 72 6c 65 73 20 4a 61 6d 65 73  } {Charles James
7690: 20 4d 61 72 79 7d 0a 0a 20 20 64 6f 5f 74 65 73   Mary}..  do_tes
76a0: 74 20 70 61 67 65 72 31 2d 38 2e 24 74 6e 2e 32  t pager1-8.$tn.2
76b0: 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 64   {.    sqlite3 d
76c0: 62 32 20 24 66 69 6c 65 6e 61 6d 65 0a 20 20 20  b2 $filename.   
76d0: 20 63 61 74 63 68 73 71 6c 20 7b 20 53 45 4c 45   catchsql { SELE
76e0: 43 54 20 2a 20 46 52 4f 4d 20 78 31 20 7d 20 64  CT * FROM x1 } d
76f0: 62 32 0a 20 20 7d 20 7b 31 20 7b 6e 6f 20 73 75  b2.  } {1 {no su
7700: 63 68 20 74 61 62 6c 65 3a 20 78 31 7d 7d 0a 0a  ch table: x1}}..
7710: 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73    do_execsql_tes
7720: 74 20 70 61 67 65 72 31 2d 38 2e 24 74 6e 2e 33  t pager1-8.$tn.3
7730: 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20   {.    BEGIN;.  
7740: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
7750: 78 31 20 56 41 4c 55 45 53 28 27 57 69 6c 6c 69  x1 VALUES('Willi
7760: 61 6d 27 29 3b 0a 20 20 20 20 20 20 49 4e 53 45  am');.      INSE
7770: 52 54 20 49 4e 54 4f 20 78 31 20 56 41 4c 55 45  RT INTO x1 VALUE
7780: 53 28 27 41 6e 6e 65 27 29 3b 0a 20 20 20 20 52  S('Anne');.    R
7790: 4f 4c 4c 42 41 43 4b 3b 0a 20 20 7d 20 7b 7d 0a  OLLBACK;.  } {}.
77a0: 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }..#------------
77b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
77c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
77d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
77e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
77f0: 54 68 65 20 6e 65 78 74 20 62 6c 6f 63 6b 20 6f  The next block o
7800: 66 20 74 65 73 74 73 20 2d 20 70 61 67 65 72 31  f tests - pager1
7810: 2d 39 2e 2a 20 2d 20 64 65 61 6c 20 77 69 74 68  -9.* - deal with
7820: 20 69 6e 74 65 72 61 63 74 69 6f 6e 73 20 62 65   interactions be
7830: 74 77 65 65 6e 0a 23 20 74 68 65 20 70 61 67 65  tween.# the page
7840: 72 20 61 6e 64 20 74 68 65 20 62 61 63 6b 75 70  r and the backup
7850: 20 41 50 49 2e 20 54 65 73 74 20 63 61 73 65 73   API. Test cases
7860: 3a 0a 23 0a 23 20 20 20 70 61 67 65 72 31 2d 39  :.#.#   pager1-9
7870: 2e 31 2e 2a 3a 20 54 65 73 74 20 74 68 61 74 20  .1.*: Test that 
7880: 61 20 62 61 63 6b 75 70 20 63 6f 6d 70 6c 65 74  a backup complet
7890: 65 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  es successfully 
78a0: 65 76 65 6e 20 69 66 20 74 68 65 0a 23 20 20 20  even if the.#   
78b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 6f                so
78c0: 75 72 63 65 20 64 62 20 69 73 20 77 72 69 74 74  urce db is writt
78d0: 65 6e 20 74 6f 20 64 75 72 69 6e 67 20 74 68 65  en to during the
78e0: 20 62 61 63 6b 75 70 20 6f 70 2e 0a 23 0a 23 20   backup op..#.# 
78f0: 20 20 70 61 67 65 72 31 2d 39 2e 32 2e 2a 3a 20    pager1-9.2.*: 
7900: 54 65 73 74 20 74 68 61 74 20 61 20 62 61 63 6b  Test that a back
7910: 75 70 20 63 6f 6d 70 6c 65 74 65 73 20 73 75 63  up completes suc
7920: 63 65 73 73 66 75 6c 6c 79 20 65 76 65 6e 20 69  cessfully even i
7930: 66 20 74 68 65 0a 23 20 20 20 20 20 20 20 20 20  f the.#         
7940: 20 20 20 20 20 20 20 20 73 6f 75 72 63 65 20 64          source d
7950: 62 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  b is written to 
7960: 61 6e 64 20 74 68 65 6e 20 72 6f 6c 6c 65 64 20  and then rolled 
7970: 62 61 63 6b 20 64 75 72 69 6e 67 20 61 20 0a 23  back during a .#
7980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7990: 20 62 61 63 6b 75 70 20 6f 70 65 72 61 74 69 6f   backup operatio
79a0: 6e 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 70 61 67  n..#.do_test pag
79b0: 65 72 31 2d 39 2e 30 2e 31 20 7b 0a 20 20 66 61  er1-9.0.1 {.  fa
79c0: 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e  ultsim_delete_an
79d0: 64 5f 72 65 6f 70 65 6e 0a 20 20 64 62 20 66 75  d_reopen.  db fu
79e0: 6e 63 20 61 5f 73 74 72 69 6e 67 20 61 5f 73 74  nc a_string a_st
79f0: 72 69 6e 67 0a 20 20 65 78 65 63 73 71 6c 20 7b  ring.  execsql {
7a00: 0a 20 20 20 20 50 52 41 47 4d 41 20 63 61 63 68  .    PRAGMA cach
7a10: 65 5f 73 69 7a 65 20 3d 20 31 30 3b 0a 20 20 20  e_size = 10;.   
7a20: 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 43 52   BEGIN;.      CR
7a30: 45 41 54 45 20 54 41 42 4c 45 20 61 62 28 61 2c  EATE TABLE ab(a,
7a40: 20 62 2c 20 55 4e 49 51 55 45 28 61 2c 20 62 29   b, UNIQUE(a, b)
7a50: 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  );.      INSERT 
7a60: 49 4e 54 4f 20 61 62 20 56 41 4c 55 45 53 28 20  INTO ab VALUES( 
7a70: 61 5f 73 74 72 69 6e 67 28 32 30 30 29 2c 20 61  a_string(200), a
7a80: 5f 73 74 72 69 6e 67 28 33 30 30 29 20 29 3b 0a  _string(300) );.
7a90: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
7aa0: 4f 20 61 62 20 53 45 4c 45 43 54 20 61 5f 73 74  O ab SELECT a_st
7ab0: 72 69 6e 67 28 32 30 30 29 2c 20 61 5f 73 74 72  ring(200), a_str
7ac0: 69 6e 67 28 33 30 30 29 20 46 52 4f 4d 20 61 62  ing(300) FROM ab
7ad0: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
7ae0: 4e 54 4f 20 61 62 20 53 45 4c 45 43 54 20 61 5f  NTO ab SELECT a_
7af0: 73 74 72 69 6e 67 28 32 30 30 29 2c 20 61 5f 73  string(200), a_s
7b00: 74 72 69 6e 67 28 33 30 30 29 20 46 52 4f 4d 20  tring(300) FROM 
7b10: 61 62 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  ab;.      INSERT
7b20: 20 49 4e 54 4f 20 61 62 20 53 45 4c 45 43 54 20   INTO ab SELECT 
7b30: 61 5f 73 74 72 69 6e 67 28 32 30 30 29 2c 20 61  a_string(200), a
7b40: 5f 73 74 72 69 6e 67 28 33 30 30 29 20 46 52 4f  _string(300) FRO
7b50: 4d 20 61 62 3b 0a 20 20 20 20 20 20 49 4e 53 45  M ab;.      INSE
7b60: 52 54 20 49 4e 54 4f 20 61 62 20 53 45 4c 45 43  RT INTO ab SELEC
7b70: 54 20 61 5f 73 74 72 69 6e 67 28 32 30 30 29 2c  T a_string(200),
7b80: 20 61 5f 73 74 72 69 6e 67 28 33 30 30 29 20 46   a_string(300) F
7b90: 52 4f 4d 20 61 62 3b 0a 20 20 20 20 20 20 49 4e  ROM ab;.      IN
7ba0: 53 45 52 54 20 49 4e 54 4f 20 61 62 20 53 45 4c  SERT INTO ab SEL
7bb0: 45 43 54 20 61 5f 73 74 72 69 6e 67 28 32 30 30  ECT a_string(200
7bc0: 29 2c 20 61 5f 73 74 72 69 6e 67 28 33 30 30 29  ), a_string(300)
7bd0: 20 46 52 4f 4d 20 61 62 3b 0a 20 20 20 20 20 20   FROM ab;.      
7be0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 20 53  INSERT INTO ab S
7bf0: 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 32  ELECT a_string(2
7c00: 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 33 30  00), a_string(30
7c10: 30 29 20 46 52 4f 4d 20 61 62 3b 0a 20 20 20 20  0) FROM ab;.    
7c20: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 62    INSERT INTO ab
7c30: 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67   SELECT a_string
7c40: 28 32 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28  (200), a_string(
7c50: 33 30 30 29 20 46 52 4f 4d 20 61 62 3b 0a 20 20  300) FROM ab;.  
7c60: 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 7d 20    COMMIT;.  }.} 
7c70: 7b 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  {}.do_test pager
7c80: 31 2d 39 2e 30 2e 32 20 7b 0a 20 20 73 71 6c 69  1-9.0.2 {.  sqli
7c90: 74 65 33 20 64 62 32 20 74 65 73 74 2e 64 62 32  te3 db2 test.db2
7ca0: 0a 20 20 64 62 32 20 65 76 61 6c 20 7b 20 50 52  .  db2 eval { PR
7cb0: 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 20  AGMA cache_size 
7cc0: 3d 20 31 30 20 7d 0a 20 20 73 71 6c 69 74 65 33  = 10 }.  sqlite3
7cd0: 5f 62 61 63 6b 75 70 20 42 20 64 62 32 20 6d 61  _backup B db2 ma
7ce0: 69 6e 20 64 62 20 6d 61 69 6e 0a 20 20 6c 69 73  in db main.  lis
7cf0: 74 20 5b 42 20 73 74 65 70 20 31 30 30 30 30 5d  t [B step 10000]
7d00: 20 5b 42 20 66 69 6e 69 73 68 5d 0a 7d 20 7b 53   [B finish].} {S
7d10: 51 4c 49 54 45 5f 44 4f 4e 45 20 53 51 4c 49 54  QLITE_DONE SQLIT
7d20: 45 5f 4f 4b 7d 0a 64 6f 5f 74 65 73 74 20 70 61  E_OK}.do_test pa
7d30: 67 65 72 31 2d 39 2e 30 2e 33 20 7b 0a 20 64 62  ger1-9.0.3 {. db
7d40: 20 6f 6e 65 20 7b 53 45 4c 45 43 54 20 6d 64 35   one {SELECT md5
7d50: 73 75 6d 28 61 2c 20 62 29 20 46 52 4f 4d 20 61  sum(a, b) FROM a
7d60: 62 7d 0a 7d 20 5b 64 62 32 20 6f 6e 65 20 7b 53  b}.} [db2 one {S
7d70: 45 4c 45 43 54 20 6d 64 35 73 75 6d 28 61 2c 20  ELECT md5sum(a, 
7d80: 62 29 20 46 52 4f 4d 20 61 62 7d 5d 0a 0a 64 6f  b) FROM ab}]..do
7d90: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 39 2e 31  _test pager1-9.1
7da0: 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .1 {.  execsql {
7db0: 20 55 50 44 41 54 45 20 61 62 20 53 45 54 20 61   UPDATE ab SET a
7dc0: 20 3d 20 61 5f 73 74 72 69 6e 67 28 32 30 31 29   = a_string(201)
7dd0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 62 61 63   }.  sqlite3_bac
7de0: 6b 75 70 20 42 20 64 62 32 20 6d 61 69 6e 20 64  kup B db2 main d
7df0: 62 20 6d 61 69 6e 0a 20 20 42 20 73 74 65 70 20  b main.  B step 
7e00: 33 30 0a 7d 20 7b 53 51 4c 49 54 45 5f 4f 4b 7d  30.} {SQLITE_OK}
7e10: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
7e20: 39 2e 31 2e 32 20 7b 0a 20 20 65 78 65 63 73 71  9.1.2 {.  execsq
7e30: 6c 20 7b 20 55 50 44 41 54 45 20 61 62 20 53 45  l { UPDATE ab SE
7e40: 54 20 62 20 3d 20 61 5f 73 74 72 69 6e 67 28 33  T b = a_string(3
7e50: 30 31 29 20 7d 0a 20 20 6c 69 73 74 20 5b 42 20  01) }.  list [B 
7e60: 73 74 65 70 20 31 30 30 30 30 5d 20 5b 42 20 66  step 10000] [B f
7e70: 69 6e 69 73 68 5d 0a 7d 20 7b 53 51 4c 49 54 45  inish].} {SQLITE
7e80: 5f 44 4f 4e 45 20 53 51 4c 49 54 45 5f 4f 4b 7d  _DONE SQLITE_OK}
7e90: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
7ea0: 39 2e 31 2e 33 20 7b 0a 20 64 62 20 6f 6e 65 20  9.1.3 {. db one 
7eb0: 7b 53 45 4c 45 43 54 20 6d 64 35 73 75 6d 28 61  {SELECT md5sum(a
7ec0: 2c 20 62 29 20 46 52 4f 4d 20 61 62 7d 0a 7d 20  , b) FROM ab}.} 
7ed0: 5b 64 62 32 20 6f 6e 65 20 7b 53 45 4c 45 43 54  [db2 one {SELECT
7ee0: 20 6d 64 35 73 75 6d 28 61 2c 20 62 29 20 46 52   md5sum(a, b) FR
7ef0: 4f 4d 20 61 62 7d 5d 0a 64 6f 5f 74 65 73 74 20  OM ab}].do_test 
7f00: 70 61 67 65 72 31 2d 39 2e 31 2e 34 20 7b 20 65  pager1-9.1.4 { e
7f10: 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20  xecsql { SELECT 
7f20: 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 61 62  count(*) FROM ab
7f30: 20 7d 20 7d 20 7b 31 32 38 7d 0a 0a 64 6f 5f 74   } } {128}..do_t
7f40: 65 73 74 20 70 61 67 65 72 31 2d 39 2e 32 2e 31  est pager1-9.2.1
7f50: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 55   {.  execsql { U
7f60: 50 44 41 54 45 20 61 62 20 53 45 54 20 61 20 3d  PDATE ab SET a =
7f70: 20 61 5f 73 74 72 69 6e 67 28 32 30 32 29 20 7d   a_string(202) }
7f80: 0a 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75  .  sqlite3_backu
7f90: 70 20 42 20 64 62 32 20 6d 61 69 6e 20 64 62 20  p B db2 main db 
7fa0: 6d 61 69 6e 0a 20 20 42 20 73 74 65 70 20 33 30  main.  B step 30
7fb0: 0a 7d 20 7b 53 51 4c 49 54 45 5f 4f 4b 7d 0a 64  .} {SQLITE_OK}.d
7fc0: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 39 2e  o_test pager1-9.
7fd0: 32 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  2.2 {.  execsql 
7fe0: 7b 20 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20  { .    BEGIN;.  
7ff0: 20 20 20 20 55 50 44 41 54 45 20 61 62 20 53 45      UPDATE ab SE
8000: 54 20 62 20 3d 20 61 5f 73 74 72 69 6e 67 28 33  T b = a_string(3
8010: 30 31 29 3b 0a 20 20 20 20 52 4f 4c 4c 42 41 43  01);.    ROLLBAC
8020: 4b 3b 0a 20 20 7d 0a 20 20 6c 69 73 74 20 5b 42  K;.  }.  list [B
8030: 20 73 74 65 70 20 31 30 30 30 30 5d 20 5b 42 20   step 10000] [B 
8040: 66 69 6e 69 73 68 5d 0a 7d 20 7b 53 51 4c 49 54  finish].} {SQLIT
8050: 45 5f 44 4f 4e 45 20 53 51 4c 49 54 45 5f 4f 4b  E_DONE SQLITE_OK
8060: 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  }.do_test pager1
8070: 2d 39 2e 32 2e 33 20 7b 0a 20 64 62 20 6f 6e 65  -9.2.3 {. db one
8080: 20 7b 53 45 4c 45 43 54 20 6d 64 35 73 75 6d 28   {SELECT md5sum(
8090: 61 2c 20 62 29 20 46 52 4f 4d 20 61 62 7d 0a 7d  a, b) FROM ab}.}
80a0: 20 5b 64 62 32 20 6f 6e 65 20 7b 53 45 4c 45 43   [db2 one {SELEC
80b0: 54 20 6d 64 35 73 75 6d 28 61 2c 20 62 29 20 46  T md5sum(a, b) F
80c0: 52 4f 4d 20 61 62 7d 5d 0a 64 6f 5f 74 65 73 74  ROM ab}].do_test
80d0: 20 70 61 67 65 72 31 2d 39 2e 32 2e 34 20 7b 20   pager1-9.2.4 { 
80e0: 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54  execsql { SELECT
80f0: 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 61   count(*) FROM a
8100: 62 20 7d 20 7d 20 7b 31 32 38 7d 0a 64 62 20 63  b } } {128}.db c
8110: 6c 6f 73 65 0a 64 62 32 20 63 6c 6f 73 65 0a 0a  lose.db2 close..
8120: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
8130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73  ----------.# Tes
8170: 74 20 74 68 61 74 20 72 65 67 61 72 64 6c 65 73  t that regardles
8180: 73 20 6f 66 20 74 68 65 20 76 61 6c 75 65 20 72  s of the value r
8190: 65 74 75 72 6e 65 64 20 62 79 20 78 53 65 63 74  eturned by xSect
81a0: 6f 72 53 69 7a 65 28 29 2c 20 74 68 65 0a 23 20  orSize(), the.# 
81b0: 6d 69 6e 69 6d 75 6d 20 65 66 66 65 63 74 69 76  minimum effectiv
81c0: 65 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 69 73  e sector-size is
81d0: 20 35 31 32 20 61 6e 64 20 74 68 65 20 6d 61 78   512 and the max
81e0: 69 6d 75 6d 20 36 35 35 33 36 20 62 79 74 65 73  imum 65536 bytes
81f0: 2e 0a 23 0a 74 65 73 74 76 66 73 20 74 76 20 2d  ..#.testvfs tv -
8200: 64 65 66 61 75 6c 74 20 31 0a 66 6f 72 65 61 63  default 1.foreac
8210: 68 20 73 65 63 74 6f 72 73 69 7a 65 20 7b 0a 20  h sectorsize {. 
8220: 20 20 20 33 32 20 20 20 36 34 20 20 20 31 32 38     32   64   128
8230: 20 20 20 32 35 36 20 20 20 35 31 32 20 20 20 31     256   512   1
8240: 30 32 34 20 20 20 32 30 34 38 20 0a 20 20 20 20  024   2048 .    
8250: 34 30 39 36 20 38 31 39 32 20 31 36 33 38 34 20  4096 8192 16384 
8260: 33 32 37 36 38 20 36 35 35 33 36 20 31 33 31 30  32768 65536 1310
8270: 37 32 20 32 36 32 31 34 34 0a 7d 20 7b 0a 20 20  72 262144.} {.  
8280: 74 76 20 73 65 63 74 6f 72 73 69 7a 65 20 24 73  tv sectorsize $s
8290: 65 63 74 6f 72 73 69 7a 65 0a 20 20 73 65 74 20  ectorsize.  set 
82a0: 65 66 66 20 24 73 65 63 74 6f 72 73 69 7a 65 0a  eff $sectorsize.
82b0: 20 20 69 66 20 7b 24 73 65 63 74 6f 72 73 69 7a    if {$sectorsiz
82c0: 65 20 3c 20 35 31 32 7d 20 20 20 7b 20 73 65 74  e < 512}   { set
82d0: 20 65 66 66 20 35 31 32 20 7d 0a 20 20 69 66 20   eff 512 }.  if 
82e0: 7b 24 73 65 63 74 6f 72 73 69 7a 65 20 3e 20 36  {$sectorsize > 6
82f0: 35 35 33 36 7d 20 7b 20 73 65 74 20 65 66 66 20  5536} { set eff 
8300: 36 35 35 33 36 20 7d 0a 0a 20 20 64 6f 5f 74 65  65536 }..  do_te
8310: 73 74 20 70 61 67 65 72 31 2d 31 30 2e 24 73 65  st pager1-10.$se
8320: 63 74 6f 72 73 69 7a 65 20 7b 0a 20 20 20 20 66  ctorsize {.    f
8330: 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61  aultsim_delete_a
8340: 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 20 20 65 78  nd_reopen.    ex
8350: 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 50 52  ecsql {.      PR
8360: 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
8370: 65 20 3d 20 50 45 52 53 49 53 54 3b 0a 20 20 20  e = PERSIST;.   
8380: 20 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73     PRAGMA page_s
8390: 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20 20 20  ize = 1024;.    
83a0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
83b0: 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 7d 0a 20  1(a, b);.    }. 
83c0: 20 20 20 66 69 6c 65 20 73 69 7a 65 20 74 65 73     file size tes
83d0: 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 20 20 7d  t.db-journal.  }
83e0: 20 5b 65 78 70 72 20 24 73 65 63 74 6f 72 73 69   [expr $sectorsi
83f0: 7a 65 20 3e 20 36 35 35 33 36 20 3f 20 36 35 35  ze > 65536 ? 655
8400: 33 36 20 3a 20 24 73 65 63 74 6f 72 73 69 7a 65  36 : $sectorsize
8410: 5d 0a 7d 0a 64 62 20 63 6c 6f 73 65 0a 74 76 20  ].}.db close.tv 
8420: 64 65 6c 65 74 65 0a 0a 74 65 73 74 76 66 73 20  delete..testvfs 
8430: 74 76 20 2d 64 65 66 61 75 6c 74 20 31 0a 66 61  tv -default 1.fa
8440: 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e  ultsim_delete_an
8450: 64 5f 72 65 6f 70 65 6e 0a 64 62 20 66 75 6e 63  d_reopen.db func
8460: 20 61 5f 73 74 72 69 6e 67 20 61 5f 73 74 72 69   a_string a_stri
8470: 6e 67 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  ng.do_execsql_te
8480: 73 74 20 70 61 67 65 72 31 2d 31 31 2e 31 20 7b  st pager1-11.1 {
8490: 0a 20 20 50 52 41 47 4d 41 20 63 61 63 68 65 5f  .  PRAGMA cache_
84a0: 73 69 7a 65 20 3d 20 31 30 3b 0a 20 20 42 45 47  size = 10;.  BEG
84b0: 49 4e 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  IN;.    CREATE T
84c0: 41 42 4c 45 20 7a 7a 28 74 6f 70 20 50 52 49 4d  ABLE zz(top PRIM
84d0: 41 52 59 20 4b 45 59 29 3b 0a 20 20 20 20 49 4e  ARY KEY);.    IN
84e0: 53 45 52 54 20 49 4e 54 4f 20 7a 7a 20 56 41 4c  SERT INTO zz VAL
84f0: 55 45 53 28 61 5f 73 74 72 69 6e 67 28 32 32 32  UES(a_string(222
8500: 29 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ));.    INSERT I
8510: 4e 54 4f 20 7a 7a 20 53 45 4c 45 43 54 20 61 5f  NTO zz SELECT a_
8520: 73 74 72 69 6e 67 28 28 53 45 4c 45 43 54 20 32  string((SELECT 2
8530: 32 32 2b 6d 61 78 28 72 6f 77 69 64 29 20 46 52  22+max(rowid) FR
8540: 4f 4d 20 7a 7a 29 29 20 46 52 4f 4d 20 7a 7a 3b  OM zz)) FROM zz;
8550: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
8560: 20 7a 7a 20 53 45 4c 45 43 54 20 61 5f 73 74 72   zz SELECT a_str
8570: 69 6e 67 28 28 53 45 4c 45 43 54 20 32 32 32 2b  ing((SELECT 222+
8580: 6d 61 78 28 72 6f 77 69 64 29 20 46 52 4f 4d 20  max(rowid) FROM 
8590: 7a 7a 29 29 20 46 52 4f 4d 20 7a 7a 3b 0a 20 20  zz)) FROM zz;.  
85a0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a 7a    INSERT INTO zz
85b0: 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67   SELECT a_string
85c0: 28 28 53 45 4c 45 43 54 20 32 32 32 2b 6d 61 78  ((SELECT 222+max
85d0: 28 72 6f 77 69 64 29 20 46 52 4f 4d 20 7a 7a 29  (rowid) FROM zz)
85e0: 29 20 46 52 4f 4d 20 7a 7a 3b 0a 20 20 20 20 49  ) FROM zz;.    I
85f0: 4e 53 45 52 54 20 49 4e 54 4f 20 7a 7a 20 53 45  NSERT INTO zz SE
8600: 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 28 53  LECT a_string((S
8610: 45 4c 45 43 54 20 32 32 32 2b 6d 61 78 28 72 6f  ELECT 222+max(ro
8620: 77 69 64 29 20 46 52 4f 4d 20 7a 7a 29 29 20 46  wid) FROM zz)) F
8630: 52 4f 4d 20 7a 7a 3b 0a 20 20 20 20 49 4e 53 45  ROM zz;.    INSE
8640: 52 54 20 49 4e 54 4f 20 7a 7a 20 53 45 4c 45 43  RT INTO zz SELEC
8650: 54 20 61 5f 73 74 72 69 6e 67 28 28 53 45 4c 45  T a_string((SELE
8660: 43 54 20 32 32 32 2b 6d 61 78 28 72 6f 77 69 64  CT 222+max(rowid
8670: 29 20 46 52 4f 4d 20 7a 7a 29 29 20 46 52 4f 4d  ) FROM zz)) FROM
8680: 20 7a 7a 3b 0a 20 20 43 4f 4d 4d 49 54 3b 0a 20   zz;.  COMMIT;. 
8690: 20 42 45 47 49 4e 3b 0a 20 20 20 20 55 50 44 41   BEGIN;.    UPDA
86a0: 54 45 20 7a 7a 20 53 45 54 20 74 6f 70 20 3d 20  TE zz SET top = 
86b0: 61 5f 73 74 72 69 6e 67 28 33 34 35 29 3b 0a 7d  a_string(345);.}
86c0: 20 7b 7d 0a 0a 70 72 6f 63 20 6c 6f 63 6b 6f 75   {}..proc lockou
86d0: 74 20 7b 6d 65 74 68 6f 64 20 61 72 67 73 7d 20  t {method args} 
86e0: 7b 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  { return SQLITE_
86f0: 49 4f 45 52 52 20 7d 0a 74 76 20 73 63 72 69 70  IOERR }.tv scrip
8700: 74 20 6c 6f 63 6b 6f 75 74 0a 74 76 20 66 69 6c  t lockout.tv fil
8710: 74 65 72 20 7b 78 57 72 69 74 65 20 78 54 72 75  ter {xWrite xTru
8720: 6e 63 61 74 65 20 78 53 79 6e 63 7d 0a 64 6f 5f  ncate xSync}.do_
8730: 63 61 74 63 68 73 71 6c 5f 74 65 73 74 20 70 61  catchsql_test pa
8740: 67 65 72 31 2d 31 31 2e 32 20 7b 20 43 4f 4d 4d  ger1-11.2 { COMM
8750: 49 54 20 7d 20 7b 31 20 7b 64 69 73 6b 20 49 2f  IT } {1 {disk I/
8760: 4f 20 65 72 72 6f 72 7d 7d 0a 0a 74 76 20 73 63  O error}}..tv sc
8770: 72 69 70 74 20 7b 7d 0a 64 6f 5f 74 65 73 74 20  ript {}.do_test 
8780: 70 61 67 65 72 31 2d 31 31 2e 33 20 7b 0a 20 20  pager1-11.3 {.  
8790: 73 71 6c 69 74 65 33 20 64 62 32 20 74 65 73 74  sqlite3 db2 test
87a0: 2e 64 62 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  .db.  execsql {.
87b0: 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e      PRAGMA journ
87c0: 61 6c 5f 6d 6f 64 65 20 3d 20 54 52 55 4e 43 41  al_mode = TRUNCA
87d0: 54 45 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 69  TE;.    PRAGMA i
87e0: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 3b 0a  ntegrity_check;.
87f0: 20 20 7d 20 64 62 32 0a 7d 20 7b 74 72 75 6e 63    } db2.} {trunc
8800: 61 74 65 20 6f 6b 7d 0a 64 6f 5f 74 65 73 74 20  ate ok}.do_test 
8810: 70 61 67 65 72 31 2d 31 31 2e 34 20 7b 0a 20 20  pager1-11.4 {.  
8820: 64 62 32 20 63 6c 6f 73 65 0a 20 20 66 69 6c 65  db2 close.  file
8830: 20 73 69 7a 65 20 74 65 73 74 2e 64 62 2d 6a 6f   size test.db-jo
8840: 75 72 6e 61 6c 0a 7d 20 7b 30 7d 0a 62 72 65 61  urnal.} {0}.brea
8850: 6b 70 6f 69 6e 74 0a 64 6f 5f 65 78 65 63 73 71  kpoint.do_execsq
8860: 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 31  l_test pager1-11
8870: 2e 35 20 7b 20 53 45 4c 45 43 54 20 63 6f 75 6e  .5 { SELECT coun
8880: 74 28 2a 29 20 46 52 4f 4d 20 7a 7a 20 7d 20 7b  t(*) FROM zz } {
8890: 33 32 7d 0a 20 20 0a 0a 66 69 6e 69 73 68 5f 74  32}.  ..finish_t
88a0: 65 73 74 0a 0a                                   est..