/ Hex Artifact Content
Login

Artifact 18d3546658573ed7fffd32f482f7447f814f16d7:


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 0a 23 20 70    to grow..#.# p
1bf0: 61 67 65 72 31 2d 33 2e 31 2e 33 2e 2a 3a 20 55  ager1-3.1.3.*: U
1c00: 73 65 20 61 20 6a 6f 75 72 6e 61 6c 20 63 72 65  se a journal cre
1c10: 61 74 65 64 20 69 6e 20 73 79 6e 63 68 72 6f 6e  ated in synchron
1c20: 6f 75 73 3d 6f 66 66 20 6d 6f 64 65 20 61 73 20  ous=off mode as 
1c30: 70 61 72 74 0a 23 20 20 20 20 20 20 20 20 20 20  part.#          
1c40: 20 20 20 20 20 20 20 6f 66 20 61 20 73 61 76 65         of a save
1c50: 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 2e 0a  point rollback..
1c60: 23 20 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  # .do_test pager
1c70: 31 2d 33 2e 31 2e 31 20 7b 0a 20 20 66 61 75 6c  1-3.1.1 {.  faul
1c80: 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f  tsim_delete_and_
1c90: 72 65 6f 70 65 6e 0a 20 20 65 78 65 63 73 71 6c  reopen.  execsql
1ca0: 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41   {.    CREATE TA
1cb0: 42 4c 45 20 74 31 28 61 20 50 52 49 4d 41 52 59  BLE t1(a PRIMARY
1cc0: 20 4b 45 59 2c 20 62 29 3b 0a 20 20 20 20 43 52   KEY, b);.    CR
1cd0: 45 41 54 45 20 54 41 42 4c 45 20 63 6f 75 6e 74  EATE TABLE count
1ce0: 65 72 28 0a 20 20 20 20 20 20 69 20 43 48 45 43  er(.      i CHEC
1cf0: 4b 20 28 69 3c 35 29 2c 20 0a 20 20 20 20 20 20  K (i<5), .      
1d00: 75 20 43 48 45 43 4b 20 28 75 3c 31 30 29 0a 20  u CHECK (u<10). 
1d10: 20 20 20 29 3b 0a 20 20 20 20 49 4e 53 45 52 54     );.    INSERT
1d20: 20 49 4e 54 4f 20 63 6f 75 6e 74 65 72 20 56 41   INTO counter VA
1d30: 4c 55 45 53 28 30 2c 20 30 29 3b 0a 20 20 20 20  LUES(0, 0);.    
1d40: 43 52 45 41 54 45 20 54 52 49 47 47 45 52 20 74  CREATE TRIGGER t
1d50: 72 31 20 41 46 54 45 52 20 49 4e 53 45 52 54 20  r1 AFTER INSERT 
1d60: 4f 4e 20 74 31 20 42 45 47 49 4e 0a 20 20 20 20  ON t1 BEGIN.    
1d70: 20 20 55 50 44 41 54 45 20 63 6f 75 6e 74 65 72    UPDATE counter
1d80: 20 53 45 54 20 69 20 3d 20 69 2b 31 3b 0a 20 20   SET i = i+1;.  
1d90: 20 20 45 4e 44 3b 0a 20 20 20 20 43 52 45 41 54    END;.    CREAT
1da0: 45 20 54 52 49 47 47 45 52 20 74 72 32 20 41 46  E TRIGGER tr2 AF
1db0: 54 45 52 20 55 50 44 41 54 45 20 4f 4e 20 74 31  TER UPDATE ON t1
1dc0: 20 42 45 47 49 4e 0a 20 20 20 20 20 20 55 50 44   BEGIN.      UPD
1dd0: 41 54 45 20 63 6f 75 6e 74 65 72 20 53 45 54 20  ATE counter SET 
1de0: 75 20 3d 20 75 2b 31 3b 0a 20 20 20 20 45 4e 44  u = u+1;.    END
1df0: 3b 0a 20 20 7d 0a 20 20 65 78 65 63 73 71 6c 20  ;.  }.  execsql 
1e00: 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  { SELECT * FROM 
1e10: 63 6f 75 6e 74 65 72 20 7d 0a 7d 20 7b 30 20 30  counter }.} {0 0
1e20: 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  }..do_execsql_te
1e30: 73 74 20 70 61 67 65 72 31 2d 33 2e 31 2e 32 20  st pager1-3.1.2 
1e40: 7b 0a 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 49  {.  BEGIN;.    I
1e50: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
1e60: 4c 55 45 53 28 31 2c 20 72 61 6e 64 6f 6d 62 6c  LUES(1, randombl
1e70: 6f 62 28 31 35 30 30 29 29 3b 0a 20 20 20 20 49  ob(1500));.    I
1e80: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
1e90: 4c 55 45 53 28 32 2c 20 72 61 6e 64 6f 6d 62 6c  LUES(2, randombl
1ea0: 6f 62 28 31 35 30 30 29 29 3b 0a 20 20 20 20 49  ob(1500));.    I
1eb0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
1ec0: 4c 55 45 53 28 33 2c 20 72 61 6e 64 6f 6d 62 6c  LUES(3, randombl
1ed0: 6f 62 28 31 35 30 30 29 29 3b 0a 20 20 20 20 53  ob(1500));.    S
1ee0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 63 6f 75  ELECT * FROM cou
1ef0: 6e 74 65 72 3b 0a 7d 20 7b 33 20 30 7d 0a 64 6f  nter;.} {3 0}.do
1f00: 5f 63 61 74 63 68 73 71 6c 5f 74 65 73 74 20 70  _catchsql_test p
1f10: 61 67 65 72 31 2d 33 2e 31 2e 33 20 7b 0a 20 20  ager1-3.1.3 {.  
1f20: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
1f30: 20 53 45 4c 45 43 54 20 61 2b 33 2c 20 72 61 6e   SELECT a+3, ran
1f40: 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 20 46 52  domblob(1500) FR
1f50: 4f 4d 20 74 31 0a 7d 20 7b 31 20 7b 63 6f 6e 73  OM t1.} {1 {cons
1f60: 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a  traint failed}}.
1f70: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
1f80: 70 61 67 65 72 31 2d 33 2e 34 20 7b 20 53 45 4c  pager1-3.4 { SEL
1f90: 45 43 54 20 2a 20 46 52 4f 4d 20 63 6f 75 6e 74  ECT * FROM count
1fa0: 65 72 20 7d 20 7b 33 20 30 7d 0a 64 6f 5f 65 78  er } {3 0}.do_ex
1fb0: 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72  ecsql_test pager
1fc0: 31 2d 33 2e 35 20 7b 20 53 45 4c 45 43 54 20 61  1-3.5 { SELECT a
1fd0: 20 46 52 4f 4d 20 74 31 20 7d 20 7b 31 20 32 20   FROM t1 } {1 2 
1fe0: 33 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  3}.do_execsql_te
1ff0: 73 74 20 70 61 67 65 72 31 2d 33 2e 36 20 7b 20  st pager1-3.6 { 
2000: 43 4f 4d 4d 49 54 20 7d 20 7b 7d 0a 0a 66 6f 72  COMMIT } {}..for
2010: 65 61 63 68 20 7b 74 6e 20 73 71 6c 20 74 63 6c  each {tn sql tcl
2020: 7d 20 7b 0a 20 20 39 20 20 7b 20 50 52 41 47 4d  } {.  9  { PRAGM
2030: 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 3d 20  A synchronous = 
2040: 4e 4f 52 4d 41 4c 20 7d 20 7b 20 7d 0a 0a 20 20  NORMAL } { }..  
2050: 37 20 20 7b 20 50 52 41 47 4d 41 20 73 79 6e 63  7  { PRAGMA sync
2060: 68 72 6f 6e 6f 75 73 20 3d 20 4e 4f 52 4d 41 4c  hronous = NORMAL
2070: 20 7d 20 7b 0a 20 20 20 20 74 65 73 74 76 66 73   } {.    testvfs
2080: 20 74 76 20 2d 64 65 66 61 75 6c 74 20 31 0a 20   tv -default 1. 
2090: 20 20 20 74 76 20 64 65 76 63 68 61 72 20 73 61     tv devchar sa
20a0: 66 65 5f 61 70 70 65 6e 64 0a 20 20 7d 0a 20 20  fe_append.  }.  
20b0: 38 20 20 7b 20 50 52 41 47 4d 41 20 73 79 6e 63  8  { PRAGMA sync
20c0: 68 72 6f 6e 6f 75 73 20 3d 20 46 55 4c 4c 20 7d  hronous = FULL }
20d0: 20 7b 20 7d 0a 20 20 31 30 20 7b 20 50 52 41 47   { }.  10 { PRAG
20e0: 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 3d  MA synchronous =
20f0: 20 4f 46 46 20 7d 20 7b 20 7d 0a 20 20 31 31 20   OFF } { }.  11 
2100: 7b 20 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f  { PRAGMA synchro
2110: 6e 6f 75 73 20 3d 20 46 55 4c 4c 20 3b 20 50 52  nous = FULL ; PR
2120: 41 47 4d 41 20 66 75 6c 6c 66 73 79 6e 63 20 3d  AGMA fullfsync =
2130: 20 31 20 7d 20 7b 20 7d 0a 7d 20 7b 0a 20 20 64   1 } { }.} {.  d
2140: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 33 2e  o_test pager1-3.
2150: 24 74 6e 2e 31 20 7b 0a 20 20 20 20 65 76 61 6c  $tn.1 {.    eval
2160: 20 24 74 63 6c 0a 20 20 20 20 66 61 75 6c 74 73   $tcl.    faults
2170: 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65  im_delete_and_re
2180: 6f 70 65 6e 0a 20 20 20 20 64 62 20 66 75 6e 63  open.    db func
2190: 20 61 5f 73 74 72 69 6e 67 20 61 5f 73 74 72 69   a_string a_stri
21a0: 6e 67 0a 20 20 20 20 65 78 65 63 73 71 6c 20 24  ng.    execsql $
21b0: 73 71 6c 0a 20 20 20 20 65 78 65 63 73 71 6c 20  sql.    execsql 
21c0: 7b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 61  {.      PRAGMA a
21d0: 75 74 6f 5f 76 61 63 75 75 6d 20 3d 20 32 3b 0a  uto_vacuum = 2;.
21e0: 20 20 20 20 20 20 50 52 41 47 4d 41 20 63 61 63        PRAGMA cac
21f0: 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b 0a 20 20  he_size = 10;.  
2200: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
2210: 20 7a 28 78 20 49 4e 54 45 47 45 52 20 50 52 49   z(x INTEGER PRI
2220: 4d 41 52 59 20 4b 45 59 2c 20 79 29 3b 0a 20 20  MARY KEY, y);.  
2230: 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20      BEGIN;.     
2240: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a     INSERT INTO z
2250: 20 56 41 4c 55 45 53 28 4e 55 4c 4c 2c 20 61 5f   VALUES(NULL, a_
2260: 73 74 72 69 6e 67 28 38 30 30 29 29 3b 0a 20 20  string(800));.  
2270: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
2280: 4f 20 7a 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c  O z SELECT NULL,
2290: 20 61 5f 73 74 72 69 6e 67 28 38 30 30 29 20 46   a_string(800) F
22a0: 52 4f 4d 20 7a 3b 20 20 20 20 20 2d 2d 20 20 20  ROM z;     --   
22b0: 32 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54  2.        INSERT
22c0: 20 49 4e 54 4f 20 7a 20 53 45 4c 45 43 54 20 4e   INTO z SELECT N
22d0: 55 4c 4c 2c 20 61 5f 73 74 72 69 6e 67 28 38 30  ULL, a_string(80
22e0: 30 29 20 46 52 4f 4d 20 7a 3b 20 20 20 20 20 2d  0) FROM z;     -
22f0: 2d 20 20 20 34 0a 20 20 20 20 20 20 20 20 49 4e  -   4.        IN
2300: 53 45 52 54 20 49 4e 54 4f 20 7a 20 53 45 4c 45  SERT INTO z SELE
2310: 43 54 20 4e 55 4c 4c 2c 20 61 5f 73 74 72 69 6e  CT NULL, a_strin
2320: 67 28 38 30 30 29 20 46 52 4f 4d 20 7a 3b 20 20  g(800) FROM z;  
2330: 20 20 20 2d 2d 20 20 20 38 0a 20 20 20 20 20 20     --   8.      
2340: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a 20    INSERT INTO z 
2350: 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 61 5f 73  SELECT NULL, a_s
2360: 74 72 69 6e 67 28 38 30 30 29 20 46 52 4f 4d 20  tring(800) FROM 
2370: 7a 3b 20 20 20 20 20 2d 2d 20 20 31 36 0a 20 20  z;     --  16.  
2380: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
2390: 4f 20 7a 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c  O z SELECT NULL,
23a0: 20 61 5f 73 74 72 69 6e 67 28 38 30 30 29 20 46   a_string(800) F
23b0: 52 4f 4d 20 7a 3b 20 20 20 20 20 2d 2d 20 20 33  ROM z;     --  3
23c0: 32 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54  2.        INSERT
23d0: 20 49 4e 54 4f 20 7a 20 53 45 4c 45 43 54 20 4e   INTO z SELECT N
23e0: 55 4c 4c 2c 20 61 5f 73 74 72 69 6e 67 28 38 30  ULL, a_string(80
23f0: 30 29 20 46 52 4f 4d 20 7a 3b 20 20 20 20 20 2d  0) FROM z;     -
2400: 2d 20 20 36 34 0a 20 20 20 20 20 20 20 20 49 4e  -  64.        IN
2410: 53 45 52 54 20 49 4e 54 4f 20 7a 20 53 45 4c 45  SERT INTO z SELE
2420: 43 54 20 4e 55 4c 4c 2c 20 61 5f 73 74 72 69 6e  CT NULL, a_strin
2430: 67 28 38 30 30 29 20 46 52 4f 4d 20 7a 3b 20 20  g(800) FROM z;  
2440: 20 20 20 2d 2d 20 31 32 38 0a 20 20 20 20 20 20     -- 128.      
2450: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a 20    INSERT INTO z 
2460: 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 61 5f 73  SELECT NULL, a_s
2470: 74 72 69 6e 67 28 38 30 30 29 20 46 52 4f 4d 20  tring(800) FROM 
2480: 7a 3b 20 20 20 20 20 2d 2d 20 32 35 36 0a 20 20  z;     -- 256.  
2490: 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 20 20      COMMIT;.    
24a0: 7d 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20  }.    execsql { 
24b0: 50 52 41 47 4d 41 20 61 75 74 6f 5f 76 61 63 75  PRAGMA auto_vacu
24c0: 75 6d 20 7d 0a 20 20 7d 20 7b 32 7d 0a 20 20 64  um }.  } {2}.  d
24d0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70  o_execsql_test p
24e0: 61 67 65 72 31 2d 33 2e 24 74 6e 2e 32 20 7b 0a  ager1-3.$tn.2 {.
24f0: 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20      BEGIN;.     
2500: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a 20 56   INSERT INTO z V
2510: 41 4c 55 45 53 28 4e 55 4c 4c 2c 20 61 5f 73 74  ALUES(NULL, a_st
2520: 72 69 6e 67 28 38 30 30 29 29 3b 0a 20 20 20 20  ring(800));.    
2530: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a 20    INSERT INTO z 
2540: 56 41 4c 55 45 53 28 4e 55 4c 4c 2c 20 61 5f 73  VALUES(NULL, a_s
2550: 74 72 69 6e 67 28 38 30 30 29 29 3b 0a 20 20 20  tring(800));.   
2560: 20 20 20 53 41 56 45 50 4f 49 4e 54 20 6f 6e 65     SAVEPOINT one
2570: 3b 0a 20 20 20 20 20 20 20 20 55 50 44 41 54 45  ;.        UPDATE
2580: 20 7a 20 53 45 54 20 79 20 3d 20 4e 55 4c 4c 20   z SET y = NULL 
2590: 57 48 45 52 45 20 78 3e 32 35 36 3b 0a 20 20 20  WHERE x>256;.   
25a0: 20 20 20 20 20 50 52 41 47 4d 41 20 69 6e 63 72       PRAGMA incr
25b0: 65 6d 65 6e 74 61 6c 5f 76 61 63 75 75 6d 3b 0a  emental_vacuum;.
25c0: 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 63          SELECT c
25d0: 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 7a 20 57  ount(*) FROM z W
25e0: 48 45 52 45 20 78 20 3c 20 31 30 30 3b 0a 20 20  HERE x < 100;.  
25f0: 20 20 20 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20      ROLLBACK TO 
2600: 6f 6e 65 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b  one;.    COMMIT;
2610: 0a 20 20 7d 20 7b 39 39 7d 0a 0a 20 20 64 6f 5f  .  } {99}..  do_
2620: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67  execsql_test pag
2630: 65 72 31 2d 33 2e 24 74 6e 2e 33 20 7b 0a 20 20  er1-3.$tn.3 {.  
2640: 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 53    BEGIN;.      S
2650: 41 56 45 50 4f 49 4e 54 20 6f 6e 65 3b 0a 20 20  AVEPOINT one;.  
2660: 20 20 20 20 20 20 55 50 44 41 54 45 20 7a 20 53        UPDATE z S
2670: 45 54 20 79 20 3d 20 79 7c 7c 78 3b 0a 20 20 20  ET y = y||x;.   
2680: 20 20 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 6f     ROLLBACK TO o
2690: 6e 65 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a  ne;.    COMMIT;.
26a0: 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74      SELECT count
26b0: 28 2a 29 20 46 52 4f 4d 20 7a 3b 0a 20 20 7d 20  (*) FROM z;.  } 
26c0: 7b 32 35 38 7d 0a 0a 20 20 64 6f 5f 65 78 65 63  {258}..  do_exec
26d0: 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d  sql_test pager1-
26e0: 33 2e 24 74 6e 2e 34 20 7b 0a 20 20 20 20 53 41  3.$tn.4 {.    SA
26f0: 56 45 50 4f 49 4e 54 20 6f 6e 65 3b 0a 20 20 20  VEPOINT one;.   
2700: 20 20 20 55 50 44 41 54 45 20 7a 20 53 45 54 20     UPDATE z SET 
2710: 79 20 3d 20 79 7c 7c 78 3b 0a 20 20 20 20 52 4f  y = y||x;.    RO
2720: 4c 4c 42 41 43 4b 20 54 4f 20 6f 6e 65 3b 0a 20  LLBACK TO one;. 
2730: 20 7d 20 7b 7d 0a 20 20 64 6f 5f 65 78 65 63 73   } {}.  do_execs
2740: 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 33  ql_test pager1-3
2750: 2e 24 74 6e 2e 35 20 7b 0a 20 20 20 20 53 45 4c  .$tn.5 {.    SEL
2760: 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
2770: 4d 20 7a 3b 0a 20 20 20 20 52 45 4c 45 41 53 45  M z;.    RELEASE
2780: 20 6f 6e 65 3b 0a 20 20 20 20 50 52 41 47 4d 41   one;.    PRAGMA
2790: 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b   integrity_check
27a0: 3b 0a 20 20 7d 20 7b 32 35 38 20 6f 6b 7d 0a 0a  ;.  } {258 ok}..
27b0: 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 63 61 74    db close.  cat
27c0: 63 68 20 7b 20 74 76 20 64 65 6c 65 74 65 20 7d  ch { tv delete }
27d0: 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .}..#-----------
27e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
27f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
2820: 20 48 6f 74 20 6a 6f 75 72 6e 61 6c 20 72 6f 6c   Hot journal rol
2830: 6c 62 61 63 6b 20 72 65 6c 61 74 65 64 20 74 65  lback related te
2840: 73 74 20 63 61 73 65 73 2e 0a 23 0a 23 20 70 61  st cases..#.# pa
2850: 67 65 72 31 2e 34 2e 31 2e 2a 3a 20 54 65 73 74  ger1.4.1.*: Test
2860: 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20   that the pager 
2870: 6d 6f 64 75 6c 65 20 64 65 6c 65 74 65 73 20 76  module deletes v
2880: 65 72 79 20 73 6d 61 6c 6c 20 69 6e 76 61 6c 69  ery small invali
2890: 64 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20  d.#             
28a0: 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e    journal files.
28b0: 0a 23 0a 23 20 70 61 67 65 72 31 2e 34 2e 32 2e  .#.# pager1.4.2.
28c0: 2a 3a 20 54 65 73 74 20 74 68 61 74 20 69 66 20  *: Test that if 
28d0: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
28e0: 61 6c 20 70 6f 69 6e 74 65 72 20 61 74 20 74 68  al pointer at th
28f0: 65 20 65 6e 64 20 6f 66 20 61 0a 23 20 20 20 20  e end of a.#    
2900: 20 20 20 20 20 20 20 20 20 20 20 68 6f 74 2d 6a             hot-j
2910: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 70 70 65  ournal file appe
2920: 61 72 73 20 74 6f 20 62 65 20 63 6f 72 72 75 70  ars to be corrup
2930: 74 20 28 63 68 65 63 6b 73 75 6d 20 64 6f 65 73  t (checksum does
2940: 20 6e 6f 74 0a 23 20 20 20 20 20 20 20 20 20 20   not.#          
2950: 20 20 20 20 20 63 6f 6d 70 75 74 65 29 20 74 68       compute) th
2960: 65 20 61 73 73 6f 63 69 61 74 65 64 20 6a 6f 75  e associated jou
2970: 72 6e 61 6c 20 69 73 20 72 6f 6c 6c 65 64 20 62  rnal is rolled b
2980: 61 63 6b 20 28 61 6e 64 20 6e 6f 0a 23 20 20 20  ack (and no.#   
2990: 20 20 20 20 20 20 20 20 20 20 20 20 78 41 63 63              xAcc
29a0: 65 73 73 28 29 20 63 61 6c 6c 20 74 6f 20 63 68  ess() call to ch
29b0: 65 63 6b 20 66 6f 72 20 74 68 65 20 70 72 65 73  eck for the pres
29c0: 65 6e 63 65 20 6f 66 20 61 6e 79 20 6d 61 73 74  ence of any mast
29d0: 65 72 20 0a 23 20 20 20 20 20 20 20 20 20 20 20  er .#           
29e0: 20 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65      journal file
29f0: 20 69 73 20 6d 61 64 65 29 2e 0a 23 0a 23 20 70   is made)..#.# p
2a00: 61 67 65 72 31 2e 34 2e 33 2e 2a 3a 20 54 65 73  ager1.4.3.*: Tes
2a10: 74 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65  t that the conte
2a20: 6e 74 73 20 6f 66 20 61 20 68 6f 74 2d 6a 6f 75  nts of a hot-jou
2a30: 72 6e 61 6c 20 61 72 65 20 69 67 6e 6f 72 65 64  rnal are ignored
2a40: 20 69 66 20 74 68 65 0a 23 20 20 20 20 20 20 20   if the.#       
2a50: 20 20 20 20 20 20 20 20 70 61 67 65 2d 73 69 7a          page-siz
2a60: 65 20 6f 72 20 73 65 63 74 6f 72 2d 73 69 7a 65  e or sector-size
2a70: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
2a80: 68 65 61 64 65 72 20 61 70 70 65 61 72 20 74 6f  header appear to
2a90: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
2aa0: 20 62 65 20 69 6e 76 61 6c 69 64 20 28 74 6f 6f   be invalid (too
2ab0: 20 6c 61 72 67 65 2c 20 74 6f 6f 20 73 6d 61 6c   large, too smal
2ac0: 6c 20 6f 72 20 6e 6f 74 20 61 20 70 6f 77 65 72  l or not a power
2ad0: 20 6f 66 20 32 29 2e 0a 23 0a 23 20 70 61 67 65   of 2)..#.# page
2ae0: 72 31 2e 34 2e 34 2e 2a 3a 20 54 65 73 74 20 68  r1.4.4.*: Test h
2af0: 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
2b00: 61 63 6b 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 66  ack of journal f
2b10: 69 6c 65 20 77 69 74 68 20 61 20 6d 61 73 74 65  ile with a maste
2b20: 72 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20  r.#             
2b30: 20 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65    journal pointe
2b40: 72 20 67 65 6e 65 72 61 74 65 64 20 69 6e 20 76  r generated in v
2b50: 61 72 69 6f 75 73 20 22 50 52 41 47 4d 41 20 73  arious "PRAGMA s
2b60: 79 6e 63 68 72 6f 6e 6f 75 73 22 0a 23 20 20 20  ynchronous".#   
2b70: 20 20 20 20 20 20 20 20 20 20 20 20 6d 6f 64 65              mode
2b80: 73 2e 0a 23 0a 23 20 70 61 67 65 72 31 2e 34 2e  s..#.# pager1.4.
2b90: 35 2e 2a 3a 20 54 65 73 74 20 74 68 61 74 20 68  5.*: Test that h
2ba0: 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
2bb0: 61 63 6b 20 73 74 6f 70 73 20 69 66 20 69 74 20  ack stops if it 
2bc0: 65 6e 63 6f 75 6e 74 65 72 73 20 61 0a 23 20 20  encounters a.#  
2bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6a 6f 75               jou
2be0: 72 6e 61 6c 2d 72 65 63 6f 72 64 20 66 6f 72 20  rnal-record for 
2bf0: 77 68 69 63 68 20 74 68 65 20 63 68 65 63 6b 73  which the checks
2c00: 75 6d 20 66 61 69 6c 73 2e 0a 23 0a 23 20 70 61  um fails..#.# pa
2c10: 67 65 72 31 2e 34 2e 36 2e 2a 3a 20 54 65 73 74  ger1.4.6.*: Test
2c20: 20 74 68 61 74 20 77 68 65 6e 20 72 6f 6c 6c 69   that when rolli
2c30: 6e 67 20 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f  ng back a hot-jo
2c40: 75 72 6e 61 6c 20 74 68 61 74 20 63 6f 6e 74 61  urnal that conta
2c50: 69 6e 73 20 61 0a 23 20 20 20 20 20 20 20 20 20  ins a.#         
2c60: 20 20 20 20 20 20 6d 61 73 74 65 72 20 6a 6f 75        master jou
2c70: 72 6e 61 6c 20 70 6f 69 6e 74 65 72 2c 20 74 68  rnal pointer, th
2c80: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
2c90: 20 66 69 6c 65 20 69 73 20 64 65 6c 65 74 65 64   file is deleted
2ca0: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
2cb0: 20 61 66 74 65 72 20 61 6c 6c 20 74 68 65 20 68   after all the h
2cc0: 6f 74 2d 6a 6f 75 72 6e 61 6c 73 20 74 68 61 74  ot-journals that
2cd0: 20 72 65 66 65 72 20 74 6f 20 69 74 20 61 72 65   refer to it are
2ce0: 20 64 65 6c 65 74 65 64 2e 0a 23 20 0a 64 6f 5f   deleted..# .do_
2cf0: 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e 31 2e  test pager1.4.1.
2d00: 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64  1 {.  faultsim_d
2d10: 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e  elete_and_reopen
2d20: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20  .  execsql { .  
2d30: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 78    CREATE TABLE x
2d40: 28 79 2c 20 7a 29 3b 0a 20 20 20 20 49 4e 53 45  (y, z);.    INSE
2d50: 52 54 20 49 4e 54 4f 20 78 20 56 41 4c 55 45 53  RT INTO x VALUES
2d60: 28 31 2c 20 32 29 3b 0a 20 20 7d 0a 20 20 73 65  (1, 2);.  }.  se
2d70: 74 20 66 64 20 5b 6f 70 65 6e 20 74 65 73 74 2e  t fd [open test.
2d80: 64 62 2d 6a 6f 75 72 6e 61 6c 20 77 5d 0a 20 20  db-journal w].  
2d90: 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20  puts -nonewline 
2da0: 24 66 64 20 22 68 65 6c 6c 6f 77 6f 72 6c 64 22  $fd "helloworld"
2db0: 0a 20 20 63 6c 6f 73 65 20 24 66 64 0a 20 20 66  .  close $fd.  f
2dc0: 69 6c 65 20 65 78 69 73 74 73 20 74 65 73 74 2e  ile exists test.
2dd0: 64 62 2d 6a 6f 75 72 6e 61 6c 0a 7d 20 7b 31 7d  db-journal.} {1}
2de0: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2e  .do_test pager1.
2df0: 34 2e 31 2e 32 20 7b 20 65 78 65 63 73 71 6c 20  4.1.2 { execsql 
2e00: 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  { SELECT * FROM 
2e10: 78 20 7d 20 7d 20 7b 31 20 32 7d 0a 64 6f 5f 74  x } } {1 2}.do_t
2e20: 65 73 74 20 70 61 67 65 72 31 2e 34 2e 31 2e 33  est pager1.4.1.3
2e30: 20 7b 20 66 69 6c 65 20 65 78 69 73 74 73 20 74   { file exists t
2e40: 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 7d  est.db-journal }
2e50: 20 7b 30 7d 0a 0a 23 20 53 65 74 20 75 70 20 61   {0}..# Set up a
2e60: 20 5b 74 65 73 74 76 66 73 5d 20 74 6f 20 73 6e   [testvfs] to sn
2e70: 61 70 73 68 6f 74 20 74 68 65 20 66 69 6c 65 2d  apshot the file-
2e80: 73 79 73 74 65 6d 20 6a 75 73 74 20 62 65 66 6f  system just befo
2e90: 72 65 20 53 51 4c 69 74 65 0a 23 20 64 65 6c 65  re SQLite.# dele
2ea0: 74 65 73 20 74 68 65 20 6d 61 73 74 65 72 2d 6a  tes the master-j
2eb0: 6f 75 72 6e 61 6c 20 74 6f 20 63 6f 6d 6d 69 74  ournal to commit
2ec0: 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 74 72   a multi-file tr
2ed0: 61 6e 73 61 63 74 69 6f 6e 2e 0a 23 0a 23 20 49  ansaction..#.# I
2ee0: 6e 20 73 75 62 73 65 71 75 65 6e 74 20 74 65 73  n subsequent tes
2ef0: 74 20 63 61 73 65 73 2c 20 69 6e 76 6f 6b 69 6e  t cases, invokin
2f00: 67 20 5b 66 61 75 6c 74 73 69 6d 5f 72 65 73 74  g [faultsim_rest
2f10: 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 5d 20  ore_and_reopen] 
2f20: 73 65 74 73 0a 23 20 75 70 20 74 68 65 20 66 69  sets.# up the fi
2f30: 6c 65 20 73 79 73 74 65 6d 20 74 6f 20 63 6f 6e  le system to con
2f40: 74 61 69 6e 20 74 77 6f 20 64 61 74 61 62 61 73  tain two databas
2f50: 65 73 2c 20 74 77 6f 20 68 6f 74 2d 6a 6f 75 72  es, two hot-jour
2f60: 6e 61 6c 20 66 69 6c 65 73 20 61 6e 64 0a 23 20  nal files and.# 
2f70: 61 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  a master-journal
2f80: 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  ..#.do_test page
2f90: 72 31 2e 34 2e 32 2e 31 20 7b 0a 20 20 74 65 73  r1.4.2.1 {.  tes
2fa0: 74 76 66 73 20 74 73 74 76 66 73 20 2d 64 65 66  tvfs tstvfs -def
2fb0: 61 75 6c 74 20 31 0a 20 20 74 73 74 76 66 73 20  ault 1.  tstvfs 
2fc0: 66 69 6c 74 65 72 20 78 44 65 6c 65 74 65 0a 20  filter xDelete. 
2fd0: 20 74 73 74 76 66 73 20 73 63 72 69 70 74 20 78   tstvfs script x
2fe0: 44 65 6c 65 74 65 43 61 6c 6c 62 61 63 6b 0a 20  DeleteCallback. 
2ff0: 20 70 72 6f 63 20 78 44 65 6c 65 74 65 43 61 6c   proc xDeleteCal
3000: 6c 62 61 63 6b 20 7b 6d 65 74 68 6f 64 20 66 69  lback {method fi
3010: 6c 65 20 61 72 67 73 7d 20 7b 0a 20 20 20 20 73  le args} {.    s
3020: 65 74 20 66 69 6c 65 20 5b 66 69 6c 65 20 74 61  et file [file ta
3030: 69 6c 20 24 66 69 6c 65 5d 0a 20 20 20 20 69 66  il $file].    if
3040: 20 7b 20 5b 73 74 72 69 6e 67 20 6d 61 74 63 68   { [string match
3050: 20 2a 6d 6a 2a 20 24 66 69 6c 65 5d 20 7d 20 7b   *mj* $file] } {
3060: 20 66 61 75 6c 74 73 69 6d 5f 73 61 76 65 20 7d   faultsim_save }
3070: 0a 20 20 7d 0a 20 20 66 61 75 6c 74 73 69 6d 5f  .  }.  faultsim_
3080: 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65  delete_and_reope
3090: 6e 0a 20 20 64 62 20 66 75 6e 63 20 61 5f 73 74  n.  db func a_st
30a0: 72 69 6e 67 20 61 5f 73 74 72 69 6e 67 0a 20 20  ring a_string.  
30b0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 41 54  execsql {.    AT
30c0: 54 41 43 48 20 27 74 65 73 74 2e 64 62 32 27 20  TACH 'test.db2' 
30d0: 41 53 20 61 75 78 3b 0a 20 20 20 20 50 52 41 47  AS aux;.    PRAG
30e0: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  MA journal_mode 
30f0: 3d 20 44 45 4c 45 54 45 3b 0a 20 20 20 20 50 52  = DELETE;.    PR
3100: 41 47 4d 41 20 6d 61 69 6e 2e 63 61 63 68 65 5f  AGMA main.cache_
3110: 73 69 7a 65 20 3d 20 31 30 3b 0a 20 20 20 20 50  size = 10;.    P
3120: 52 41 47 4d 41 20 61 75 78 2e 63 61 63 68 65 5f  RAGMA aux.cache_
3130: 73 69 7a 65 20 3d 20 31 30 3b 0a 20 20 20 20 43  size = 10;.    C
3140: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61  REATE TABLE t1(a
3150: 20 55 4e 49 51 55 45 2c 20 62 20 55 4e 49 51 55   UNIQUE, b UNIQU
3160: 45 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  E);.    CREATE T
3170: 41 42 4c 45 20 61 75 78 2e 74 32 28 61 20 55 4e  ABLE aux.t2(a UN
3180: 49 51 55 45 2c 20 62 20 55 4e 49 51 55 45 29 3b  IQUE, b UNIQUE);
3190: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
31a0: 20 74 31 20 56 41 4c 55 45 53 28 61 5f 73 74 72   t1 VALUES(a_str
31b0: 69 6e 67 28 32 30 30 29 2c 20 61 5f 73 74 72 69  ing(200), a_stri
31c0: 6e 67 28 33 30 30 29 29 3b 0a 20 20 20 20 49 4e  ng(300));.    IN
31d0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
31e0: 45 43 54 20 61 5f 73 74 72 69 6e 67 28 32 30 30  ECT a_string(200
31f0: 29 2c 20 61 5f 73 74 72 69 6e 67 28 33 30 30 29  ), a_string(300)
3200: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e   FROM t1;.    IN
3210: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
3220: 45 43 54 20 61 5f 73 74 72 69 6e 67 28 32 30 30  ECT a_string(200
3230: 29 2c 20 61 5f 73 74 72 69 6e 67 28 33 30 30 29  ), a_string(300)
3240: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e   FROM t1;.    IN
3250: 53 45 52 54 20 49 4e 54 4f 20 74 32 20 53 45 4c  SERT INTO t2 SEL
3260: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20  ECT * FROM t1;. 
3270: 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20     BEGIN;.      
3280: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
3290: 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 32  ELECT a_string(2
32a0: 30 31 29 2c 20 61 5f 73 74 72 69 6e 67 28 33 30  01), a_string(30
32b0: 31 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20  1) FROM t1;.    
32c0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
32d0: 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67   SELECT a_string
32e0: 28 32 30 32 29 2c 20 61 5f 73 74 72 69 6e 67 28  (202), a_string(
32f0: 33 30 32 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20  302) FROM t1;.  
3300: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
3310: 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69  t1 SELECT a_stri
3320: 6e 67 28 32 30 33 29 2c 20 61 5f 73 74 72 69 6e  ng(203), a_strin
3330: 67 28 33 30 33 29 20 46 52 4f 4d 20 74 31 3b 0a  g(303) FROM t1;.
3340: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
3350: 4f 20 74 31 20 53 45 4c 45 43 54 20 61 5f 73 74  O t1 SELECT a_st
3360: 72 69 6e 67 28 32 30 34 29 2c 20 61 5f 73 74 72  ring(204), a_str
3370: 69 6e 67 28 33 30 34 29 20 46 52 4f 4d 20 74 31  ing(304) FROM t1
3380: 3b 0a 20 20 20 20 20 20 52 45 50 4c 41 43 45 20  ;.      REPLACE 
3390: 49 4e 54 4f 20 74 32 20 53 45 4c 45 43 54 20 2a  INTO t2 SELECT *
33a0: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 43 4f   FROM t1;.    CO
33b0: 4d 4d 49 54 3b 0a 20 20 7d 0a 20 20 64 62 20 63  MMIT;.  }.  db c
33c0: 6c 6f 73 65 0a 20 20 74 73 74 76 66 73 20 64 65  lose.  tstvfs de
33d0: 6c 65 74 65 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73  lete.} {}.do_tes
33e0: 74 20 70 61 67 65 72 31 2e 34 2e 32 2e 32 20 7b  t pager1.4.2.2 {
33f0: 0a 20 20 66 61 75 6c 74 73 69 6d 5f 72 65 73 74  .  faultsim_rest
3400: 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20  ore_and_reopen. 
3410: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53   execsql {.    S
3420: 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
3430: 52 4f 4d 20 74 31 3b 0a 20 20 20 20 50 52 41 47  ROM t1;.    PRAG
3440: 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65  MA integrity_che
3450: 63 6b 3b 0a 20 20 7d 0a 7d 20 7b 34 20 6f 6b 7d  ck;.  }.} {4 ok}
3460: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2e  .do_test pager1.
3470: 34 2e 32 2e 33 20 7b 0a 20 20 66 61 75 6c 74 73  4.2.3 {.  faults
3480: 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72  im_restore_and_r
3490: 65 6f 70 65 6e 0a 20 20 66 6f 72 65 61 63 68 20  eopen.  foreach 
34a0: 66 20 5b 67 6c 6f 62 20 74 65 73 74 2e 64 62 2d  f [glob test.db-
34b0: 6d 6a 2a 5d 20 7b 20 66 69 6c 65 20 64 65 6c 65  mj*] { file dele
34c0: 74 65 20 2d 66 6f 72 63 65 20 24 66 20 7d 0a 20  te -force $f }. 
34d0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53   execsql {.    S
34e0: 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
34f0: 52 4f 4d 20 74 31 3b 0a 20 20 20 20 50 52 41 47  ROM t1;.    PRAG
3500: 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65  MA integrity_che
3510: 63 6b 3b 0a 20 20 7d 0a 7d 20 7b 36 34 20 6f 6b  ck;.  }.} {64 ok
3520: 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  }.do_test pager1
3530: 2e 34 2e 32 2e 34 20 7b 0a 20 20 66 61 75 6c 74  .4.2.4 {.  fault
3540: 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f  sim_restore_and_
3550: 72 65 6f 70 65 6e 0a 20 20 68 65 78 69 6f 5f 77  reopen.  hexio_w
3560: 72 69 74 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75  rite test.db-jou
3570: 72 6e 61 6c 20 5b 65 78 70 72 20 5b 66 69 6c 65  rnal [expr [file
3580: 20 73 69 7a 65 20 74 65 73 74 2e 64 62 2d 6a 6f   size test.db-jo
3590: 75 72 6e 61 6c 5d 2d 32 30 5d 20 31 32 33 34 35  urnal]-20] 12345
35a0: 36 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  6.  execsql {.  
35b0: 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a    SELECT count(*
35c0: 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 50  ) FROM t1;.    P
35d0: 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f  RAGMA integrity_
35e0: 63 68 65 63 6b 3b 0a 20 20 7d 0a 7d 20 7b 34 20  check;.  }.} {4 
35f0: 6f 6b 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65  ok}.do_test page
3600: 72 31 2e 34 2e 32 2e 35 20 7b 0a 20 20 66 61 75  r1.4.2.5 {.  fau
3610: 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e  ltsim_restore_an
3620: 64 5f 72 65 6f 70 65 6e 0a 20 20 68 65 78 69 6f  d_reopen.  hexio
3630: 5f 77 72 69 74 65 20 74 65 73 74 2e 64 62 2d 6a  _write test.db-j
3640: 6f 75 72 6e 61 6c 20 5b 65 78 70 72 20 5b 66 69  ournal [expr [fi
3650: 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 2d  le size test.db-
3660: 6a 6f 75 72 6e 61 6c 5d 2d 32 30 5d 20 31 32 33  journal]-20] 123
3670: 34 35 36 0a 20 20 66 6f 72 65 61 63 68 20 66 20  456.  foreach f 
3680: 5b 67 6c 6f 62 20 74 65 73 74 2e 64 62 2d 6d 6a  [glob test.db-mj
3690: 2a 5d 20 7b 20 66 69 6c 65 20 64 65 6c 65 74 65  *] { file delete
36a0: 20 2d 66 6f 72 63 65 20 24 66 20 7d 0a 20 20 65   -force $f }.  e
36b0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c  xecsql {.    SEL
36c0: 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
36d0: 4d 20 74 31 3b 0a 20 20 20 20 50 52 41 47 4d 41  M t1;.    PRAGMA
36e0: 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b   integrity_check
36f0: 3b 0a 20 20 7d 0a 7d 20 7b 34 20 6f 6b 7d 0a 0a  ;.  }.} {4 ok}..
3700: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34  do_test pager1.4
3710: 2e 33 2e 31 20 7b 0a 20 20 74 65 73 74 76 66 73  .3.1 {.  testvfs
3720: 20 74 73 74 76 66 73 20 2d 64 65 66 61 75 6c 74   tstvfs -default
3730: 20 31 0a 20 20 74 73 74 76 66 73 20 66 69 6c 74   1.  tstvfs filt
3740: 65 72 20 78 53 79 6e 63 0a 20 20 74 73 74 76 66  er xSync.  tstvf
3750: 73 20 73 63 72 69 70 74 20 78 53 79 6e 63 43 61  s script xSyncCa
3760: 6c 6c 62 61 63 6b 0a 20 20 70 72 6f 63 20 78 53  llback.  proc xS
3770: 79 6e 63 43 61 6c 6c 62 61 63 6b 20 7b 6d 65 74  yncCallback {met
3780: 68 6f 64 20 66 69 6c 65 20 61 72 67 73 7d 20 7b  hod file args} {
3790: 0a 20 20 20 20 73 65 74 20 66 69 6c 65 20 5b 66  .    set file [f
37a0: 69 6c 65 20 74 61 69 6c 20 24 66 69 6c 65 5d 0a  ile tail $file].
37b0: 20 20 20 20 69 66 20 7b 20 30 3d 3d 5b 73 74 72      if { 0==[str
37c0: 69 6e 67 20 6d 61 74 63 68 20 2a 6a 6f 75 72 6e  ing match *journ
37d0: 61 6c 20 24 66 69 6c 65 5d 20 7d 20 7b 20 66 61  al $file] } { fa
37e0: 75 6c 74 73 69 6d 5f 73 61 76 65 20 7d 0a 20 20  ultsim_save }.  
37f0: 7d 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c  }.  faultsim_del
3800: 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20  ete_and_reopen. 
3810: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50   execsql {.    P
3820: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
3830: 64 65 20 3d 20 44 45 4c 45 54 45 3b 0a 20 20 20  de = DELETE;.   
3840: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
3850: 28 61 2c 20 62 29 3b 0a 20 20 20 20 49 4e 53 45  (a, b);.    INSE
3860: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
3870: 53 28 31 2c 20 32 29 3b 0a 20 20 20 20 49 4e 53  S(1, 2);.    INS
3880: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
3890: 45 53 28 33 2c 20 34 29 3b 0a 20 20 7d 0a 20 20  ES(3, 4);.  }.  
38a0: 64 62 20 63 6c 6f 73 65 0a 20 20 74 73 74 76 66  db close.  tstvf
38b0: 73 20 64 65 6c 65 74 65 0a 7d 20 7b 7d 0a 0a 66  s delete.} {}..f
38c0: 6f 72 65 61 63 68 20 7b 74 6e 20 6f 66 73 74 20  oreach {tn ofst 
38d0: 76 61 6c 75 65 20 72 65 73 75 6c 74 7d 20 7b 0a  value result} {.
38e0: 20 20 20 20 20 20 20 20 20 20 32 20 20 20 32 30            2   20
38f0: 20 20 20 20 33 31 20 20 20 20 20 20 20 7b 31 20      31       {1 
3900: 32 20 33 20 34 7d 0a 20 20 20 20 20 20 20 20 20  2 3 4}.         
3910: 20 33 20 20 20 32 30 20 20 20 20 33 32 20 20 20   3   20    32   
3920: 20 20 20 20 7b 31 20 32 20 33 20 34 7d 0a 20 20      {1 2 3 4}.  
3930: 20 20 20 20 20 20 20 20 34 20 20 20 32 30 20 20          4   20  
3940: 20 20 33 33 20 20 20 20 20 20 20 7b 31 20 32 20    33       {1 2 
3950: 33 20 34 7d 0a 20 20 20 20 20 20 20 20 20 20 35  3 4}.          5
3960: 20 20 20 32 30 20 20 20 20 36 35 35 33 36 20 20     20    65536  
3970: 20 20 7b 31 20 32 20 33 20 34 7d 0a 20 20 20 20    {1 2 3 4}.    
3980: 20 20 20 20 20 20 36 20 20 20 32 30 20 20 20 20        6   20    
3990: 31 33 31 30 37 32 20 20 20 7b 31 20 32 20 33 20  131072   {1 2 3 
39a0: 34 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 37 20  4}..          7 
39b0: 20 20 32 34 20 20 20 20 35 31 31 20 20 20 20 20    24    511     
39c0: 20 7b 31 20 32 20 33 20 34 7d 0a 20 20 20 20 20   {1 2 3 4}.     
39d0: 20 20 20 20 20 38 20 20 20 32 34 20 20 20 20 35       8   24    5
39e0: 31 33 20 20 20 20 20 20 7b 31 20 32 20 33 20 34  13      {1 2 3 4
39f0: 7d 0a 20 20 20 20 20 20 20 20 20 20 39 20 20 20  }.          9   
3a00: 32 34 20 20 20 20 36 35 35 33 36 20 20 20 20 7b  24    65536    {
3a10: 31 20 32 20 33 20 34 7d 0a 0a 20 20 20 20 20 20  1 2 3 4}..      
3a20: 20 20 20 31 30 20 20 20 33 32 20 20 20 20 36 35     10   32    65
3a30: 35 33 36 20 20 20 20 7b 31 20 32 7d 0a 7d 20 7b  536    {1 2}.} {
3a40: 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72  .  do_test pager
3a50: 31 2e 34 2e 33 2e 24 74 6e 20 7b 0a 20 20 20 20  1.4.3.$tn {.    
3a60: 66 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65  faultsim_restore
3a70: 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 20 20  _and_reopen.    
3a80: 68 65 78 69 6f 5f 77 72 69 74 65 20 74 65 73 74  hexio_write test
3a90: 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 24 6f 66 73  .db-journal $ofs
3aa0: 74 20 5b 66 6f 72 6d 61 74 20 25 2e 38 78 20 24  t [format %.8x $
3ab0: 76 61 6c 75 65 5d 0a 20 20 20 20 65 78 65 63 73  value].    execs
3ac0: 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52  ql { SELECT * FR
3ad0: 4f 4d 20 74 31 20 7d 0a 20 20 7d 20 24 72 65 73  OM t1 }.  } $res
3ae0: 75 6c 74 0a 7d 0a 64 62 20 63 6c 6f 73 65 0a 0a  ult.}.db close..
3af0: 23 20 53 65 74 20 75 70 20 61 20 56 46 53 20 74  # Set up a VFS t
3b00: 68 61 74 20 73 6e 61 70 73 68 6f 74 73 20 74 68  hat snapshots th
3b10: 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 6a 75  e file-system ju
3b20: 73 74 20 62 65 66 6f 72 65 20 61 20 6d 61 73 74  st before a mast
3b30: 65 72 20 6a 6f 75 72 6e 61 6c 0a 23 20 66 69 6c  er journal.# fil
3b40: 65 20 69 73 20 64 65 6c 65 74 65 64 20 74 6f 20  e is deleted to 
3b50: 63 6f 6d 6d 69 74 20 61 20 6d 75 6c 74 69 2d 66  commit a multi-f
3b60: 69 6c 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ile transaction.
3b70: 20 53 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 74   Specifically, t
3b80: 68 65 0a 23 20 66 69 6c 65 2d 73 79 73 74 65 6d  he.# file-system
3b90: 20 69 73 20 73 61 76 65 64 20 6a 75 73 74 20 62   is saved just b
3ba0: 65 66 6f 72 65 20 74 68 65 20 78 44 65 6c 65 74  efore the xDelet
3bb0: 65 28 29 20 63 61 6c 6c 20 74 6f 20 72 65 6d 6f  e() call to remo
3bc0: 76 65 20 74 68 65 20 0a 23 20 6d 61 73 74 65 72  ve the .# master
3bd0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 72   journal file fr
3be0: 6f 6d 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  om the file-syst
3bf0: 65 6d 2e 0a 23 0a 74 65 73 74 76 66 73 20 74 76  em..#.testvfs tv
3c00: 20 2d 64 65 66 61 75 6c 74 20 31 0a 74 76 20 73   -default 1.tv s
3c10: 63 72 69 70 74 20 63 6f 70 79 5f 6f 6e 5f 6d 6a  cript copy_on_mj
3c20: 5f 64 65 6c 65 74 65 0a 73 65 74 20 3a 3a 6d 6a  _delete.set ::mj
3c30: 5f 66 69 6c 65 6e 61 6d 65 5f 6c 65 6e 67 74 68  _filename_length
3c40: 20 30 0a 70 72 6f 63 20 63 6f 70 79 5f 6f 6e 5f   0.proc copy_on_
3c50: 6d 6a 5f 64 65 6c 65 74 65 20 7b 6d 65 74 68 6f  mj_delete {metho
3c60: 64 20 66 69 6c 65 6e 61 6d 65 20 61 72 67 73 7d  d filename args}
3c70: 20 7b 0a 20 20 69 66 20 7b 5b 73 74 72 69 6e 67   {.  if {[string
3c80: 20 6d 61 74 63 68 20 2a 6d 6a 2a 20 5b 66 69 6c   match *mj* [fil
3c90: 65 20 74 61 69 6c 20 24 66 69 6c 65 6e 61 6d 65  e tail $filename
3ca0: 5d 5d 7d 20 7b 20 0a 20 20 20 20 73 65 74 20 3a  ]]} { .    set :
3cb0: 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 5f 6c 65 6e  :mj_filename_len
3cc0: 67 74 68 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67  gth [string leng
3cd0: 74 68 20 24 66 69 6c 65 6e 61 6d 65 5d 0a 20 20  th $filename].  
3ce0: 20 20 66 61 75 6c 74 73 69 6d 5f 73 61 76 65 20    faultsim_save 
3cf0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
3d00: 4c 49 54 45 5f 4f 4b 0a 7d 0a 0a 73 65 74 20 70  LITE_OK.}..set p
3d10: 77 64 20 5b 70 77 64 5d 0a 66 6f 72 65 61 63 68  wd [pwd].foreach
3d20: 20 7b 74 6e 31 20 74 63 6c 7d 20 7b 0a 20 20 31   {tn1 tcl} {.  1
3d30: 20 7b 20 73 65 74 20 70 72 65 66 69 78 20 22 74   { set prefix "t
3d40: 65 73 74 2e 64 62 22 20 7d 0a 20 20 32 20 7b 20  est.db" }.  2 { 
3d50: 0a 20 20 20 20 23 20 54 68 69 73 20 74 65 73 74  .    # This test
3d60: 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20   depends on the 
3d70: 75 6e 64 65 72 6c 79 69 6e 67 20 56 46 53 20 62  underlying VFS b
3d80: 65 69 6e 67 20 61 62 6c 65 20 74 6f 20 6f 70 65  eing able to ope
3d90: 6e 20 70 61 74 68 73 0a 20 20 20 20 23 20 35 31  n paths.    # 51
3da0: 32 20 62 79 74 65 73 20 69 6e 20 6c 65 6e 67 74  2 bytes in lengt
3db0: 68 2e 20 54 68 65 20 69 64 65 61 20 69 73 20 74  h. The idea is t
3dc0: 6f 20 63 72 65 61 74 65 20 61 20 68 6f 74 2d 6a  o create a hot-j
3dd0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61 74  ournal file that
3de0: 0a 20 20 20 20 23 20 63 6f 6e 74 61 69 6e 73 20  .    # contains 
3df0: 61 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  a master-journal
3e00: 20 70 6f 69 6e 74 65 72 20 73 6f 20 6c 61 72 67   pointer so larg
3e10: 65 20 74 68 61 74 20 69 74 20 63 6f 75 6c 64 20  e that it could 
3e20: 63 6f 6e 74 61 69 6e 0a 20 20 20 20 23 20 61 20  contain.    # a 
3e30: 76 61 6c 69 64 20 70 61 67 65 20 72 65 63 6f 72  valid page recor
3e40: 64 20 28 69 66 20 74 68 65 20 66 69 6c 65 20 70  d (if the file p
3e50: 61 67 65 2d 73 69 7a 65 20 69 73 20 35 31 32 20  age-size is 512 
3e60: 62 79 74 65 73 29 2e 20 53 6f 20 61 73 20 74 6f  bytes). So as to
3e70: 0a 20 20 20 20 23 20 6d 61 6b 65 20 73 75 72 65  .    # make sure
3e80: 20 53 51 4c 69 74 65 20 64 6f 65 73 6e 27 74 20   SQLite doesn't 
3e90: 67 65 74 20 63 6f 6e 66 75 73 65 64 20 62 79 20  get confused by 
3ea0: 74 68 69 73 2e 0a 20 20 20 20 23 0a 20 20 20 20  this..    #.    
3eb0: 73 65 74 20 6e 50 61 64 64 69 6e 67 20 5b 65 78  set nPadding [ex
3ec0: 70 72 20 35 31 31 20 2d 20 24 3a 3a 6d 6a 5f 66  pr 511 - $::mj_f
3ed0: 69 6c 65 6e 61 6d 65 5f 6c 65 6e 67 74 68 5d 0a  ilename_length].
3ee0: 0a 20 20 20 20 23 20 57 65 20 63 61 6e 6e 6f 74  .    # We cannot
3ef0: 20 6a 75 73 74 20 63 72 65 61 74 65 20 61 20 72   just create a r
3f00: 65 61 6c 6c 79 20 6c 6f 6e 67 20 64 61 74 61 62  eally long datab
3f10: 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 74 6f  ase file name to
3f20: 20 6f 70 65 6e 2c 20 61 73 0a 20 20 20 20 23 20   open, as.    # 
3f30: 4c 69 6e 75 78 20 6c 69 6d 69 74 73 20 61 20 73  Linux limits a s
3f40: 69 6e 67 6c 65 20 63 6f 6d 70 6f 6e 65 6e 74 20  ingle component 
3f50: 6f 66 20 61 20 70 61 74 68 20 74 6f 20 32 35 35  of a path to 255
3f60: 20 62 79 74 65 73 20 62 79 20 64 65 66 61 75 6c   bytes by defaul
3f70: 74 0a 20 20 20 20 23 20 28 61 6e 64 20 70 72 65  t.    # (and pre
3f80: 73 75 6d 61 62 6c 79 20 6f 74 68 65 72 20 73 79  sumably other sy
3f90: 73 74 65 6d 73 20 68 61 76 65 20 6c 69 6d 69 74  stems have limit
3fa0: 73 20 74 6f 6f 29 2e 20 53 6f 20 63 72 65 61 74  s too). So creat
3fb0: 65 20 61 20 64 69 72 65 63 74 6f 72 79 0a 20 20  e a directory.  
3fc0: 20 20 23 20 68 69 65 72 61 72 63 68 79 20 74 6f    # hierarchy to
3fd0: 20 77 6f 72 6b 20 69 6e 2e 0a 20 20 20 20 23 0a   work in..    #.
3fe0: 20 20 20 20 73 65 74 20 64 69 72 6e 61 6d 65 20      set dirname 
3ff0: 22 64 31 32 33 34 35 36 37 38 39 30 31 32 33 34  "d12345678901234
4000: 35 36 37 38 39 30 31 32 33 34 35 36 37 38 39 30  5678901234567890
4010: 2f 22 0a 20 20 20 20 73 65 74 20 6e 44 69 72 20  /".    set nDir 
4020: 5b 65 78 70 72 20 24 6e 50 61 64 64 69 6e 67 20  [expr $nPadding 
4030: 2f 20 33 32 5d 0a 20 20 20 20 69 66 20 7b 20 24  / 32].    if { $
4040: 6e 44 69 72 20 7d 20 7b 0a 20 20 20 20 20 20 73  nDir } {.      s
4050: 65 74 20 70 20 5b 73 74 72 69 6e 67 20 72 65 70  et p [string rep
4060: 65 61 74 20 24 64 69 72 6e 61 6d 65 20 24 6e 44  eat $dirname $nD
4070: 69 72 5d 0a 20 20 20 20 20 20 66 69 6c 65 20 6d  ir].      file m
4080: 6b 64 69 72 20 24 70 0a 20 20 20 20 20 20 63 64  kdir $p.      cd
4090: 20 24 70 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73   $p.    }..    s
40a0: 65 74 20 70 61 64 64 69 6e 67 20 5b 73 74 72 69  et padding [stri
40b0: 6e 67 20 72 65 70 65 61 74 20 78 20 5b 65 78 70  ng repeat x [exp
40c0: 72 20 24 6e 50 61 64 64 69 6e 67 20 25 33 32 5d  r $nPadding %32]
40d0: 5d 0a 20 20 20 20 73 65 74 20 70 72 65 66 69 78  ].    set prefix
40e0: 20 22 74 65 73 74 2e 64 62 24 7b 70 61 64 64 69   "test.db${paddi
40f0: 6e 67 7d 22 0a 20 20 7d 0a 7d 20 7b 0a 20 20 65  ng}".  }.} {.  e
4100: 76 61 6c 20 24 74 63 6c 0a 20 20 66 6f 72 65 61  val $tcl.  forea
4110: 63 68 20 7b 74 6e 32 20 73 71 6c 7d 20 7b 0a 20  ch {tn2 sql} {. 
4120: 20 20 20 6f 20 7b 20 0a 20 20 20 20 20 20 50 52     o { .      PR
4130: 41 47 4d 41 20 6d 61 69 6e 2e 73 79 6e 63 68 72  AGMA main.synchr
4140: 6f 6e 6f 75 73 3d 4f 46 46 3b 0a 20 20 20 20 20  onous=OFF;.     
4150: 20 50 52 41 47 4d 41 20 61 75 78 2e 73 79 6e 63   PRAGMA aux.sync
4160: 68 72 6f 6e 6f 75 73 3d 4f 46 46 3b 0a 20 20 20  hronous=OFF;.   
4170: 20 7d 0a 20 20 20 20 6f 35 31 32 20 7b 20 0a 20   }.    o512 { . 
4180: 20 20 20 20 20 50 52 41 47 4d 41 20 6d 61 69 6e       PRAGMA main
4190: 2e 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46 46  .synchronous=OFF
41a0: 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 61  ;.      PRAGMA a
41b0: 75 78 2e 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f  ux.synchronous=O
41c0: 46 46 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41  FF;.      PRAGMA
41d0: 20 6d 61 69 6e 2e 70 61 67 65 5f 73 69 7a 65 20   main.page_size 
41e0: 3d 20 35 31 32 3b 0a 20 20 20 20 20 20 50 52 41  = 512;.      PRA
41f0: 47 4d 41 20 61 75 78 2e 70 61 67 65 5f 73 69 7a  GMA aux.page_siz
4200: 65 20 3d 20 35 31 32 3b 0a 20 20 20 20 7d 0a 20  e = 512;.    }. 
4210: 20 20 20 6e 20 7b 20 0a 20 20 20 20 20 20 50 52     n { .      PR
4220: 41 47 4d 41 20 6d 61 69 6e 2e 73 79 6e 63 68 72  AGMA main.synchr
4230: 6f 6e 6f 75 73 3d 4e 4f 52 4d 41 4c 3b 0a 20 20  onous=NORMAL;.  
4240: 20 20 20 20 50 52 41 47 4d 41 20 61 75 78 2e 73      PRAGMA aux.s
4250: 79 6e 63 68 72 6f 6e 6f 75 73 3d 4e 4f 52 4d 41  ynchronous=NORMA
4260: 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 20 7b  L;.    }.    f {
4270: 20 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 6d   .      PRAGMA m
4280: 61 69 6e 2e 73 79 6e 63 68 72 6f 6e 6f 75 73 3d  ain.synchronous=
4290: 46 55 4c 4c 3b 0a 20 20 20 20 20 20 50 52 41 47  FULL;.      PRAG
42a0: 4d 41 20 61 75 78 2e 73 79 6e 63 68 72 6f 6e 6f  MA aux.synchrono
42b0: 75 73 3d 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20  us=FULL;.    }. 
42c0: 20 7d 20 7b 0a 0a 20 20 20 20 73 65 74 20 74 6e   } {..    set tn
42d0: 20 22 24 7b 74 6e 31 7d 2e 24 7b 74 6e 32 7d 22   "${tn1}.${tn2}"
42e0: 0a 20 20 0a 20 20 20 20 23 20 53 65 74 20 75 70  .  .    # Set up
42f0: 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f   a connection to
4300: 20 68 61 76 65 20 74 77 6f 20 64 61 74 61 62 61   have two databa
4310: 73 65 73 2c 20 74 65 73 74 2e 64 62 20 28 6d 61  ses, test.db (ma
4320: 69 6e 29 20 61 6e 64 20 0a 20 20 20 20 23 20 74  in) and .    # t
4330: 65 73 74 2e 64 62 32 20 28 61 75 78 29 2e 20 54  est.db2 (aux). T
4340: 68 65 6e 20 72 75 6e 20 61 20 6d 75 6c 74 69 2d  hen run a multi-
4350: 66 69 6c 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  file transaction
4360: 20 6f 6e 20 74 68 65 6d 2e 20 54 68 65 0a 20 20   on them. The.  
4370: 20 20 23 20 56 46 53 20 77 69 6c 6c 20 73 6e 61    # VFS will sna
4380: 70 73 68 6f 74 20 74 68 65 20 66 69 6c 65 2d 73  pshot the file-s
4390: 79 73 74 65 6d 20 6a 75 73 74 20 62 65 66 6f 72  ystem just befor
43a0: 65 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75  e the master-jou
43b0: 72 6e 61 6c 0a 20 20 20 20 23 20 66 69 6c 65 20  rnal.    # file 
43c0: 69 73 20 64 65 6c 65 74 65 64 20 74 6f 20 63 6f  is deleted to co
43d0: 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61 63  mmit the transac
43e0: 74 69 6f 6e 2e 0a 20 20 20 20 23 0a 20 20 20 20  tion..    #.    
43f0: 74 76 20 66 69 6c 74 65 72 20 78 44 65 6c 65 74  tv filter xDelet
4400: 65 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 70 61  e.    do_test pa
4410: 67 65 72 31 2d 34 2e 34 2e 24 74 6e 2e 31 20 7b  ger1-4.4.$tn.1 {
4420: 0a 20 20 20 20 20 20 66 61 75 6c 74 73 69 6d 5f  .      faultsim_
4430: 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65  delete_and_reope
4440: 6e 20 24 70 72 65 66 69 78 0a 20 20 20 20 20 20  n $prefix.      
4450: 65 78 65 63 73 71 6c 20 22 0a 20 20 20 20 20 20  execsql ".      
4460: 20 20 41 54 54 41 43 48 20 27 24 7b 70 72 65 66    ATTACH '${pref
4470: 69 78 7d 32 27 20 41 53 20 61 75 78 3b 0a 20 20  ix}2' AS aux;.  
4480: 20 20 20 20 20 20 24 73 71 6c 0a 20 20 20 20 20        $sql.     
4490: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
44a0: 61 28 78 29 3b 0a 20 20 20 20 20 20 20 20 43 52  a(x);.        CR
44b0: 45 41 54 45 20 54 41 42 4c 45 20 61 75 78 2e 62  EATE TABLE aux.b
44c0: 28 78 29 3b 0a 20 20 20 20 20 20 20 20 49 4e 53  (x);.        INS
44d0: 45 52 54 20 49 4e 54 4f 20 61 20 56 41 4c 55 45  ERT INTO a VALUE
44e0: 53 28 27 64 6f 75 62 6c 65 2d 79 6f 75 27 29 3b  S('double-you');
44f0: 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20  .        INSERT 
4500: 49 4e 54 4f 20 61 20 56 41 4c 55 45 53 28 27 77  INTO a VALUES('w
4510: 68 79 27 29 3b 0a 20 20 20 20 20 20 20 20 49 4e  hy');.        IN
4520: 53 45 52 54 20 49 4e 54 4f 20 61 20 56 41 4c 55  SERT INTO a VALU
4530: 45 53 28 27 7a 65 64 27 29 3b 0a 20 20 20 20 20  ES('zed');.     
4540: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 62     INSERT INTO b
4550: 20 56 41 4c 55 45 53 28 27 77 6f 6e 27 29 3b 0a   VALUES('won');.
4560: 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49          INSERT I
4570: 4e 54 4f 20 62 20 56 41 4c 55 45 53 28 27 74 6f  NTO b VALUES('to
4580: 6f 27 29 3b 0a 20 20 20 20 20 20 20 20 49 4e 53  o');.        INS
4590: 45 52 54 20 49 4e 54 4f 20 62 20 56 41 4c 55 45  ERT INTO b VALUE
45a0: 53 28 27 66 72 65 65 27 29 3b 0a 20 20 20 20 20  S('free');.     
45b0: 20 22 0a 20 20 20 20 20 20 65 78 65 63 73 71 6c   ".      execsql
45c0: 20 7b 0a 20 20 20 20 20 20 20 20 42 45 47 49 4e   {.        BEGIN
45d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 49 4e 53 45  ;.          INSE
45e0: 52 54 20 49 4e 54 4f 20 61 20 53 45 4c 45 43 54  RT INTO a SELECT
45f0: 20 2a 20 46 52 4f 4d 20 62 20 57 48 45 52 45 20   * FROM b WHERE 
4600: 72 6f 77 69 64 3c 3d 33 3b 0a 20 20 20 20 20 20  rowid<=3;.      
4610: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
4620: 62 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  b SELECT * FROM 
4630: 61 20 57 48 45 52 45 20 72 6f 77 69 64 3c 3d 33  a WHERE rowid<=3
4640: 3b 0a 20 20 20 20 20 20 20 20 43 4f 4d 4d 49 54  ;.        COMMIT
4650: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20  ;.      }.    } 
4660: 7b 7d 0a 20 20 20 20 74 76 20 66 69 6c 74 65 72  {}.    tv filter
4670: 20 7b 7d 0a 20 20 20 20 0a 20 20 20 20 23 20 43   {}.    .    # C
4680: 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 74 72  heck that the tr
4690: 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 63 6f  ansaction was co
46a0: 6d 6d 69 74 74 65 64 20 73 75 63 63 65 73 73 66  mmitted successf
46b0: 75 6c 6c 79 2e 0a 20 20 20 20 23 0a 20 20 20 20  ully..    #.    
46c0: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
46d0: 70 61 67 65 72 31 2d 34 2e 34 2e 24 74 6e 2e 32  pager1-4.4.$tn.2
46e0: 20 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20   {.      SELECT 
46f0: 2a 20 46 52 4f 4d 20 61 0a 20 20 20 20 7d 20 7b  * FROM a.    } {
4700: 64 6f 75 62 6c 65 2d 79 6f 75 20 77 68 79 20 7a  double-you why z
4710: 65 64 20 77 6f 6e 20 74 6f 6f 20 66 72 65 65 7d  ed won too free}
4720: 0a 20 20 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f  .    do_execsql_
4730: 74 65 73 74 20 70 61 67 65 72 31 2d 34 2e 34 2e  test pager1-4.4.
4740: 24 74 6e 2e 33 20 7b 0a 20 20 20 20 20 20 53 45  $tn.3 {.      SE
4750: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 62 0a 20 20  LECT * FROM b.  
4760: 20 20 7d 20 7b 77 6f 6e 20 74 6f 6f 20 66 72 65    } {won too fre
4770: 65 20 64 6f 75 62 6c 65 2d 79 6f 75 20 77 68 79  e double-you why
4780: 20 7a 65 64 7d 0a 20 20 20 20 0a 20 20 20 20 23   zed}.    .    #
4790: 20 52 65 73 74 6f 72 65 20 74 68 65 20 66 69 6c   Restore the fil
47a0: 65 2d 73 79 73 74 65 6d 20 61 6e 64 20 72 65 6f  e-system and reo
47b0: 70 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  pen the database
47c0: 73 2e 20 43 68 65 63 6b 20 74 68 61 74 20 69 74  s. Check that it
47d0: 20 6e 6f 77 0a 20 20 20 20 23 20 61 70 70 65 61   now.    # appea
47e0: 72 73 20 74 68 61 74 20 74 68 65 20 74 72 61 6e  rs that the tran
47f0: 73 61 63 74 69 6f 6e 20 77 61 73 20 6e 6f 74 20  saction was not 
4800: 63 6f 6d 6d 69 74 74 65 64 20 28 62 65 63 61 75  committed (becau
4810: 73 65 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  se the file-syst
4820: 65 6d 0a 20 20 20 20 23 20 77 61 73 20 72 65 73  em.    # was res
4830: 74 6f 72 65 64 20 74 6f 20 74 68 65 20 73 74 61  tored to the sta
4840: 74 65 20 77 68 65 72 65 20 69 74 20 68 61 64 20  te where it had 
4850: 6e 6f 74 20 62 65 65 6e 29 2e 0a 20 20 20 20 23  not been)..    #
4860: 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 70 61 67  .    do_test pag
4870: 65 72 31 2d 34 2e 34 2e 24 74 6e 2e 34 20 7b 0a  er1-4.4.$tn.4 {.
4880: 20 20 20 20 20 20 66 61 75 6c 74 73 69 6d 5f 72        faultsim_r
4890: 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65  estore_and_reope
48a0: 6e 20 24 70 72 65 66 69 78 0a 20 20 20 20 20 20  n $prefix.      
48b0: 65 78 65 63 73 71 6c 20 22 41 54 54 41 43 48 20  execsql "ATTACH 
48c0: 27 24 7b 70 72 65 66 69 78 7d 32 27 20 41 53 20  '${prefix}2' AS 
48d0: 61 75 78 22 0a 20 20 20 20 7d 20 7b 7d 0a 20 20  aux".    } {}.  
48e0: 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73    do_execsql_tes
48f0: 74 20 70 61 67 65 72 31 2d 34 2e 34 2e 24 74 6e  t pager1-4.4.$tn
4900: 2e 35 20 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f  .5 {SELECT * FRO
4910: 4d 20 61 7d 20 7b 64 6f 75 62 6c 65 2d 79 6f 75  M a} {double-you
4920: 20 77 68 79 20 7a 65 64 7d 0a 20 20 20 20 64 6f   why zed}.    do
4930: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61  _execsql_test pa
4940: 67 65 72 31 2d 34 2e 34 2e 24 74 6e 2e 36 20 7b  ger1-4.4.$tn.6 {
4950: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 62 7d  SELECT * FROM b}
4960: 20 7b 77 6f 6e 20 74 6f 6f 20 66 72 65 65 7d 0a   {won too free}.
4970: 20 20 20 20 0a 20 20 20 20 23 20 52 65 73 74 6f      .    # Resto
4980: 72 65 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  re the file-syst
4990: 65 6d 20 61 67 61 69 6e 2e 20 54 68 69 73 20 74  em again. This t
49a0: 69 6d 65 2c 20 62 65 66 6f 72 65 20 72 65 6f 70  ime, before reop
49b0: 65 6e 69 6e 67 20 74 68 65 20 64 61 74 61 62 61  ening the databa
49c0: 73 65 73 2c 0a 20 20 20 20 23 20 64 65 6c 65 74  ses,.    # delet
49d0: 65 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75  e the master-jou
49e0: 72 6e 61 6c 20 66 69 6c 65 20 66 72 6f 6d 20 74  rnal file from t
49f0: 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e 20  he file-system. 
4a00: 49 74 20 6e 6f 77 20 61 70 70 65 61 72 73 20 74  It now appears t
4a10: 68 61 74 0a 20 20 20 20 23 20 74 68 65 20 74 72  hat.    # the tr
4a20: 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 63 6f  ansaction was co
4a30: 6d 6d 69 74 74 65 64 20 28 6e 6f 20 6d 61 73 74  mmitted (no mast
4a40: 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er-journal file 
4a50: 3d 3d 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 29 2e  == no rollback).
4a60: 0a 20 20 20 20 23 0a 20 20 20 20 64 6f 5f 74 65  .    #.    do_te
4a70: 73 74 20 70 61 67 65 72 31 2d 34 2e 34 2e 24 74  st pager1-4.4.$t
4a80: 6e 2e 37 20 7b 0a 20 20 20 20 20 20 66 61 75 6c  n.7 {.      faul
4a90: 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64  tsim_restore_and
4aa0: 5f 72 65 6f 70 65 6e 20 24 70 72 65 66 69 78 0a  _reopen $prefix.
4ab0: 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 20        foreach f 
4ac0: 5b 67 6c 6f 62 20 24 7b 70 72 65 66 69 78 7d 2d  [glob ${prefix}-
4ad0: 6d 6a 2a 5d 20 7b 20 66 69 6c 65 20 64 65 6c 65  mj*] { file dele
4ae0: 74 65 20 2d 66 6f 72 63 65 20 24 66 20 7d 0a 20  te -force $f }. 
4af0: 20 20 20 20 20 65 78 65 63 73 71 6c 20 22 41 54       execsql "AT
4b00: 54 41 43 48 20 27 24 7b 70 72 65 66 69 78 7d 32  TACH '${prefix}2
4b10: 27 20 41 53 20 61 75 78 22 0a 20 20 20 20 7d 20  ' AS aux".    } 
4b20: 7b 7d 0a 20 20 20 20 64 6f 5f 65 78 65 63 73 71  {}.    do_execsq
4b30: 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 34 2e  l_test pager1-4.
4b40: 34 2e 24 74 6e 2e 38 20 7b 0a 20 20 20 20 20 20  4.$tn.8 {.      
4b50: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 61 0a  SELECT * FROM a.
4b60: 20 20 20 20 7d 20 7b 64 6f 75 62 6c 65 2d 79 6f      } {double-yo
4b70: 75 20 77 68 79 20 7a 65 64 20 77 6f 6e 20 74 6f  u why zed won to
4b80: 6f 20 66 72 65 65 7d 0a 20 20 20 20 64 6f 5f 65  o free}.    do_e
4b90: 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65  xecsql_test page
4ba0: 72 31 2d 34 2e 34 2e 24 74 6e 2e 39 20 7b 0a 20  r1-4.4.$tn.9 {. 
4bb0: 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52       SELECT * FR
4bc0: 4f 4d 20 62 0a 20 20 20 20 7d 20 7b 77 6f 6e 20  OM b.    } {won 
4bd0: 74 6f 6f 20 66 72 65 65 20 64 6f 75 62 6c 65 2d  too free double-
4be0: 79 6f 75 20 77 68 79 20 7a 65 64 7d 0a 20 20 7d  you why zed}.  }
4bf0: 0a 0a 20 20 63 64 20 24 70 77 64 0a 7d 0a 64 62  ..  cd $pwd.}.db
4c00: 20 63 6c 6f 73 65 0a 74 76 20 64 65 6c 65 74 65   close.tv delete
4c10: 0a 66 69 6c 65 20 64 65 6c 65 74 65 20 2d 66 6f  .file delete -fo
4c20: 72 63 65 20 24 64 69 72 6e 61 6d 65 0a 0a 0a 23  rce $dirname...#
4c30: 20 53 65 74 20 75 70 20 61 20 56 46 53 20 74 6f   Set up a VFS to
4c40: 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20   make a copy of 
4c50: 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  the file-system 
4c60: 6a 75 73 74 20 62 65 66 6f 72 65 20 64 65 6c 65  just before dele
4c70: 74 69 6e 67 20 61 0a 23 20 6a 6f 75 72 6e 61 6c  ting a.# journal
4c80: 20 66 69 6c 65 20 74 6f 20 63 6f 6d 6d 69 74 20   file to commit 
4c90: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54  a transaction. T
4ca0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  he transaction m
4cb0: 6f 64 69 66 69 65 73 20 65 78 61 63 74 6c 79 0a  odifies exactly.
4cc0: 23 20 74 77 6f 20 64 61 74 61 62 61 73 65 20 70  # two database p
4cd0: 61 67 65 73 20 28 61 6e 64 20 70 61 67 65 20 31  ages (and page 1
4ce0: 20 2d 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f   - the change co
4cf0: 75 6e 74 65 72 29 2e 0a 23 0a 74 65 73 74 76 66  unter)..#.testvf
4d00: 73 20 74 76 20 2d 64 65 66 61 75 6c 74 20 31 0a  s tv -default 1.
4d10: 74 76 20 73 65 63 74 6f 72 73 69 7a 65 20 35 31  tv sectorsize 51
4d20: 32 0a 74 76 20 73 63 72 69 70 74 20 63 6f 70 79  2.tv script copy
4d30: 5f 6f 6e 5f 6a 6f 75 72 6e 61 6c 5f 64 65 6c 65  _on_journal_dele
4d40: 74 65 0a 74 76 20 66 69 6c 74 65 72 20 78 44 65  te.tv filter xDe
4d50: 6c 65 74 65 0a 73 65 74 20 3a 3a 6d 6a 5f 66 69  lete.set ::mj_fi
4d60: 6c 65 6e 61 6d 65 5f 6c 65 6e 67 74 68 20 30 0a  lename_length 0.
4d70: 70 72 6f 63 20 63 6f 70 79 5f 6f 6e 5f 6a 6f 75  proc copy_on_jou
4d80: 72 6e 61 6c 5f 64 65 6c 65 74 65 20 7b 6d 65 74  rnal_delete {met
4d90: 68 6f 64 20 66 69 6c 65 6e 61 6d 65 20 61 72 67  hod filename arg
4da0: 73 7d 20 7b 0a 20 20 69 66 20 7b 5b 73 74 72 69  s} {.  if {[stri
4db0: 6e 67 20 6d 61 74 63 68 20 2a 6a 6f 75 72 6e 61  ng match *journa
4dc0: 6c 20 24 66 69 6c 65 6e 61 6d 65 5d 7d 20 66 61  l $filename]} fa
4dd0: 75 6c 74 73 69 6d 5f 73 61 76 65 20 0a 20 20 72  ultsim_save .  r
4de0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a  eturn SQLITE_OK.
4df0: 7d 0a 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74  }.faultsim_delet
4e00: 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 64 6f 5f  e_and_reopen.do_
4e10: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67  execsql_test pag
4e20: 65 72 31 2e 34 2e 35 2e 31 20 7b 0a 20 20 50 52  er1.4.5.1 {.  PR
4e30: 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d  AGMA page_size =
4e40: 20 31 30 32 34 3b 0a 20 20 43 52 45 41 54 45 20   1024;.  CREATE 
4e50: 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a  TABLE t1(a, b);.
4e60: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
4e70: 32 28 61 2c 20 62 29 3b 0a 20 20 49 4e 53 45 52  2(a, b);.  INSER
4e80: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
4e90: 28 27 49 27 2c 20 27 49 49 27 29 3b 0a 20 20 49  ('I', 'II');.  I
4ea0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41  NSERT INTO t2 VA
4eb0: 4c 55 45 53 28 27 49 49 49 27 2c 20 27 49 56 27  LUES('III', 'IV'
4ec0: 29 3b 0a 20 20 42 45 47 49 4e 3b 0a 20 20 20 20  );.  BEGIN;.    
4ed0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
4ee0: 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20 20 20  ALUES(1, 2);.   
4ef0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20   INSERT INTO t2 
4f00: 56 41 4c 55 45 53 28 33 2c 20 34 29 3b 0a 20 20  VALUES(3, 4);.  
4f10: 43 4f 4d 4d 49 54 3b 0a 7d 20 7b 7d 0a 74 76 20  COMMIT;.} {}.tv 
4f20: 66 69 6c 74 65 72 20 7b 7d 0a 0a 23 20 43 68 65  filter {}..# Che
4f30: 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ck the transacti
4f40: 6f 6e 20 77 61 73 20 63 6f 6d 6d 69 74 74 65 64  on was committed
4f50: 3a 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  :.#.do_execsql_t
4f60: 65 73 74 20 70 61 67 65 72 31 2e 34 2e 35 2e 32  est pager1.4.5.2
4f70: 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52   {.  SELECT * FR
4f80: 4f 4d 20 74 31 3b 0a 20 20 53 45 4c 45 43 54 20  OM t1;.  SELECT 
4f90: 2a 20 46 52 4f 4d 20 74 32 3b 0a 7d 20 7b 49 20  * FROM t2;.} {I 
4fa0: 49 49 20 31 20 32 20 49 49 49 20 49 56 20 33 20  II 1 2 III IV 3 
4fb0: 34 7d 0a 0a 23 20 4e 6f 77 20 74 72 79 20 66 6f  4}..# Now try fo
4fc0: 75 72 20 74 65 73 74 73 3a 0a 23 0a 23 20 20 70  ur tests:.#.#  p
4fd0: 61 67 65 72 31 2d 34 2e 35 2e 33 3a 20 52 65 73  ager1-4.5.3: Res
4fe0: 74 6f 72 65 20 74 68 65 20 66 69 6c 65 2d 73 79  tore the file-sy
4ff0: 73 74 65 6d 2e 20 43 68 65 63 6b 20 74 68 61 74  stem. Check that
5000: 20 74 68 65 20 77 68 6f 6c 65 20 74 72 61 6e 73   the whole trans
5010: 61 63 74 69 6f 6e 20 0a 23 20 20 20 20 20 20 20  action .#       
5020: 20 20 20 20 20 20 20 20 20 69 73 20 72 6f 6c 6c           is roll
5030: 65 64 20 62 61 63 6b 2e 0a 23 0a 23 20 20 70 61  ed back..#.#  pa
5040: 67 65 72 31 2d 34 2e 35 2e 34 3a 20 52 65 73 74  ger1-4.5.4: Rest
5050: 6f 72 65 20 74 68 65 20 66 69 6c 65 2d 73 79 73  ore the file-sys
5060: 74 65 6d 2e 20 43 6f 72 72 75 70 74 20 74 68 65  tem. Corrupt the
5070: 20 66 69 72 73 74 20 72 65 63 6f 72 64 20 69 6e   first record in
5080: 20 74 68 65 0a 23 20 20 20 20 20 20 20 20 20 20   the.#          
5090: 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 2e 20 43        journal. C
50a0: 68 65 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63  heck the transac
50b0: 74 69 6f 6e 20 69 73 20 6e 6f 74 20 72 6f 6c 6c  tion is not roll
50c0: 65 64 20 62 61 63 6b 2e 0a 23 0a 23 20 20 70 61  ed back..#.#  pa
50d0: 67 65 72 31 2d 34 2e 35 2e 35 3a 20 52 65 73 74  ger1-4.5.5: Rest
50e0: 6f 72 65 20 74 68 65 20 66 69 6c 65 2d 73 79 73  ore the file-sys
50f0: 74 65 6d 2e 20 43 6f 72 72 75 70 74 20 74 68 65  tem. Corrupt the
5100: 20 73 65 63 6f 6e 64 20 72 65 63 6f 72 64 20 69   second record i
5110: 6e 20 74 68 65 0a 23 20 20 20 20 20 20 20 20 20  n the.#         
5120: 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 2e 20         journal. 
5130: 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 66  Check that the f
5140: 69 72 73 74 20 72 65 63 6f 72 64 20 69 6e 20 74  irst record in t
5150: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  he transaction i
5160: 73 20 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  s .#            
5170: 20 20 20 20 70 6c 61 79 65 64 20 62 61 63 6b 2c      played back,
5180: 20 62 75 74 20 6e 6f 74 20 74 68 65 20 73 65 63   but not the sec
5190: 6f 6e 64 2e 0a 23 0a 23 20 20 70 61 67 65 72 31  ond..#.#  pager1
51a0: 2d 34 2e 35 2e 36 3a 20 52 65 73 74 6f 72 65 20  -4.5.6: Restore 
51b0: 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e  the file-system.
51c0: 20 54 72 79 20 74 6f 20 6f 70 65 6e 20 74 68 65   Try to open the
51d0: 20 64 61 74 61 62 61 73 65 20 77 69 74 68 20 61   database with a
51e0: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
51f0: 20 20 72 65 61 64 6f 6e 6c 79 20 63 6f 6e 6e 65    readonly conne
5200: 63 74 69 6f 6e 2e 20 54 68 69 73 20 73 68 6f 75  ction. This shou
5210: 6c 64 20 66 61 69 6c 2c 20 61 73 20 61 20 72 65  ld fail, as a re
5220: 61 64 2d 6f 6e 6c 79 0a 23 20 20 20 20 20 20 20  ad-only.#       
5230: 20 20 20 20 20 20 20 20 20 63 6f 6e 6e 65 63 74           connect
5240: 69 6f 6e 20 63 61 6e 6e 6f 74 20 72 6f 6c 6c 20  ion cannot roll 
5250: 62 61 63 6b 20 74 68 65 20 64 61 74 61 62 61 73  back the databas
5260: 65 20 66 69 6c 65 2e 0a 23 0a 66 61 75 6c 74 73  e file..#.faults
5270: 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72  im_restore_and_r
5280: 65 6f 70 65 6e 0a 64 6f 5f 65 78 65 63 73 71 6c  eopen.do_execsql
5290: 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e 35  _test pager1.4.5
52a0: 2e 33 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20  .3 {.  SELECT * 
52b0: 46 52 4f 4d 20 74 31 3b 0a 20 20 53 45 4c 45 43  FROM t1;.  SELEC
52c0: 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 7d 20 7b  T * FROM t2;.} {
52d0: 49 20 49 49 20 49 49 49 20 49 56 7d 0a 66 61 75  I II III IV}.fau
52e0: 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e  ltsim_restore_an
52f0: 64 5f 72 65 6f 70 65 6e 0a 68 65 78 69 6f 5f 77  d_reopen.hexio_w
5300: 72 69 74 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75  rite test.db-jou
5310: 72 6e 61 6c 20 5b 65 78 70 72 20 35 31 32 2b 34  rnal [expr 512+4
5320: 2b 31 30 32 34 20 2d 20 32 30 32 5d 20 30 31 32  +1024 - 202] 012
5330: 33 34 35 36 37 38 39 41 42 43 44 45 46 0a 64 6f  3456789ABCDEF.do
5340: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61  _execsql_test pa
5350: 67 65 72 31 2e 34 2e 35 2e 34 20 7b 0a 20 20 53  ger1.4.5.4 {.  S
5360: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b  ELECT * FROM t1;
5370: 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  .  SELECT * FROM
5380: 20 74 32 3b 0a 7d 20 7b 49 20 49 49 20 31 20 32   t2;.} {I II 1 2
5390: 20 49 49 49 20 49 56 20 33 20 34 7d 0a 66 61 75   III IV 3 4}.fau
53a0: 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e  ltsim_restore_an
53b0: 64 5f 72 65 6f 70 65 6e 0a 68 65 78 69 6f 5f 77  d_reopen.hexio_w
53c0: 72 69 74 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75  rite test.db-jou
53d0: 72 6e 61 6c 20 5b 65 78 70 72 20 35 31 32 2b 34  rnal [expr 512+4
53e0: 2b 31 30 32 34 2b 34 2b 34 2b 31 30 32 34 20 2d  +1024+4+4+1024 -
53f0: 20 32 30 32 5d 20 30 31 32 33 34 35 36 37 38 39   202] 0123456789
5400: 41 42 43 44 45 46 0a 64 6f 5f 65 78 65 63 73 71  ABCDEF.do_execsq
5410: 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e  l_test pager1.4.
5420: 35 2e 35 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a  5.5 {.  SELECT *
5430: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 53 45 4c 45   FROM t1;.  SELE
5440: 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 7d 20  CT * FROM t2;.} 
5450: 7b 49 20 49 49 20 49 49 49 20 49 56 20 33 20 34  {I II III IV 3 4
5460: 7d 0a 0a 66 61 75 6c 74 73 69 6d 5f 72 65 73 74  }..faultsim_rest
5470: 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 64  ore_and_reopen.d
5480: 62 20 63 6c 6f 73 65 0a 73 71 6c 69 74 65 33 20  b close.sqlite3 
5490: 64 62 20 74 65 73 74 2e 64 62 20 2d 72 65 61 64  db test.db -read
54a0: 6f 6e 6c 79 20 31 0a 64 6f 5f 63 61 74 63 68 73  only 1.do_catchs
54b0: 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34  ql_test pager1.4
54c0: 2e 35 2e 36 20 7b 0a 20 20 53 45 4c 45 43 54 20  .5.6 {.  SELECT 
54d0: 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 53 45 4c  * FROM t1;.  SEL
54e0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 7d  ECT * FROM t2;.}
54f0: 20 7b 31 20 7b 64 69 73 6b 20 49 2f 4f 20 65 72   {1 {disk I/O er
5500: 72 6f 72 7d 7d 0a 64 62 20 63 6c 6f 73 65 0a 0a  ror}}.db close..
5510: 23 20 53 6e 61 70 73 68 6f 74 20 74 68 65 20 66  # Snapshot the f
5520: 69 6c 65 2d 73 79 73 74 65 6d 20 6a 75 73 74 20  ile-system just 
5530: 62 65 66 6f 72 65 20 6d 75 6c 74 69 2d 66 69 6c  before multi-fil
5540: 65 20 63 6f 6d 6d 69 74 2e 20 53 61 76 65 20 74  e commit. Save t
5550: 68 65 20 6e 61 6d 65 0a 23 20 6f 66 20 74 68 65  he name.# of the
5560: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
5570: 66 69 6c 65 20 69 6e 20 24 3a 3a 6d 6a 5f 66 69  file in $::mj_fi
5580: 6c 65 6e 61 6d 65 2e 0a 23 0a 74 76 20 73 63 72  lename..#.tv scr
5590: 69 70 74 20 63 6f 70 79 5f 6f 6e 5f 6d 6a 5f 64  ipt copy_on_mj_d
55a0: 65 6c 65 74 65 0a 74 76 20 66 69 6c 74 65 72 20  elete.tv filter 
55b0: 78 44 65 6c 65 74 65 0a 70 72 6f 63 20 63 6f 70  xDelete.proc cop
55c0: 79 5f 6f 6e 5f 6d 6a 5f 64 65 6c 65 74 65 20 7b  y_on_mj_delete {
55d0: 6d 65 74 68 6f 64 20 66 69 6c 65 6e 61 6d 65 20  method filename 
55e0: 61 72 67 73 7d 20 7b 0a 20 20 69 66 20 7b 5b 73  args} {.  if {[s
55f0: 74 72 69 6e 67 20 6d 61 74 63 68 20 2a 6d 6a 2a  tring match *mj*
5600: 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 66 69 6c   [file tail $fil
5610: 65 6e 61 6d 65 5d 5d 7d 20 7b 20 0a 20 20 20 20  ename]]} { .    
5620: 73 65 74 20 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d  set ::mj_filenam
5630: 65 20 24 66 69 6c 65 6e 61 6d 65 0a 20 20 20 20  e $filename.    
5640: 66 61 75 6c 74 73 69 6d 5f 73 61 76 65 20 0a 20  faultsim_save . 
5650: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
5660: 54 45 5f 4f 4b 0a 7d 0a 64 6f 5f 74 65 73 74 20  TE_OK.}.do_test 
5670: 70 61 67 65 72 31 2e 34 2e 36 2e 31 20 7b 0a 20  pager1.4.6.1 {. 
5680: 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65   faultsim_delete
5690: 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78  _and_reopen.  ex
56a0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 41 54 54 41  ecsql {.    ATTA
56b0: 43 48 20 27 74 65 73 74 2e 64 62 32 27 20 41 53  CH 'test.db2' AS
56c0: 20 74 77 6f 3b 0a 20 20 20 20 43 52 45 41 54 45   two;.    CREATE
56d0: 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b   TABLE t1(a, b);
56e0: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
56f0: 45 20 74 77 6f 2e 74 32 28 61 2c 20 62 29 3b 0a  E two.t2(a, b);.
5700: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
5710: 74 31 20 56 41 4c 55 45 53 28 31 2c 20 27 74 31  t1 VALUES(1, 't1
5720: 2e 31 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  .1');.    INSERT
5730: 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28   INTO t2 VALUES(
5740: 31 2c 20 27 74 32 2e 31 27 29 3b 0a 20 20 20 20  1, 't2.1');.    
5750: 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 55 50 44  BEGIN;.      UPD
5760: 41 54 45 20 74 31 20 53 45 54 20 62 20 3d 20 27  ATE t1 SET b = '
5770: 74 31 2e 32 27 3b 0a 20 20 20 20 20 20 55 50 44  t1.2';.      UPD
5780: 41 54 45 20 74 32 20 53 45 54 20 62 20 3d 20 27  ATE t2 SET b = '
5790: 74 32 2e 32 27 3b 0a 20 20 20 20 43 4f 4d 4d 49  t2.2';.    COMMI
57a0: 54 3b 0a 20 20 7d 0a 20 20 74 76 20 66 69 6c 74  T;.  }.  tv filt
57b0: 65 72 20 7b 7d 0a 20 20 64 62 20 63 6c 6f 73 65  er {}.  db close
57c0: 0a 7d 20 7b 7d 0a 0a 66 61 75 6c 74 73 69 6d 5f  .} {}..faultsim_
57d0: 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70  restore_and_reop
57e0: 65 6e 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  en.do_execsql_te
57f0: 73 74 20 70 61 67 65 72 31 2e 34 2e 36 2e 32 20  st pager1.4.6.2 
5800: 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  { SELECT * FROM 
5810: 74 31 20 7d 20 20 20 20 20 20 20 20 20 20 20 7b  t1 }           {
5820: 31 20 74 31 2e 31 7d 0a 64 6f 5f 74 65 73 74 20  1 t1.1}.do_test 
5830: 20 20 20 20 20 20 20 20 70 61 67 65 72 31 2e 34          pager1.4
5840: 2e 36 2e 33 20 7b 20 66 69 6c 65 20 65 78 69 73  .6.3 { file exis
5850: 74 73 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d  ts $::mj_filenam
5860: 65 20 7d 20 7b 31 7d 0a 64 6f 5f 65 78 65 63 73  e } {1}.do_execs
5870: 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34  ql_test pager1.4
5880: 2e 36 2e 34 20 7b 0a 20 20 41 54 54 41 43 48 20  .6.4 {.  ATTACH 
5890: 27 74 65 73 74 2e 64 62 32 27 20 41 53 20 74 77  'test.db2' AS tw
58a0: 6f 3b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52  o;.  SELECT * FR
58b0: 4f 4d 20 74 32 3b 0a 7d 20 7b 31 20 74 32 2e 31  OM t2;.} {1 t2.1
58c0: 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  }.do_test pager1
58d0: 2e 34 2e 36 2e 35 20 7b 20 66 69 6c 65 20 65 78  .4.6.5 { file ex
58e0: 69 73 74 73 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e  ists $::mj_filen
58f0: 61 6d 65 20 7d 20 7b 30 7d 0a 0a 66 61 75 6c 74  ame } {0}..fault
5900: 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f  sim_restore_and_
5910: 72 65 6f 70 65 6e 0a 64 62 20 63 6c 6f 73 65 0a  reopen.db close.
5920: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2e 34  do_test pager1.4
5930: 2e 36 2e 38 20 7b 0a 20 20 73 65 74 20 3a 3a 6d  .6.8 {.  set ::m
5940: 6a 5f 66 69 6c 65 6e 61 6d 65 31 20 24 3a 3a 6d  j_filename1 $::m
5950: 6a 5f 66 69 6c 65 6e 61 6d 65 0a 20 20 74 76 20  j_filename.  tv 
5960: 66 69 6c 74 65 72 20 78 44 65 6c 65 74 65 0a 20  filter xDelete. 
5970: 20 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74   sqlite3 db test
5980: 2e 64 62 32 0a 20 20 65 78 65 63 73 71 6c 20 7b  .db2.  execsql {
5990: 0a 20 20 20 20 41 54 54 41 43 48 20 27 74 65 73  .    ATTACH 'tes
59a0: 74 2e 64 62 33 27 20 41 53 20 74 68 72 65 65 3b  t.db3' AS three;
59b0: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
59c0: 45 20 74 68 72 65 65 2e 74 33 28 61 2c 20 62 29  E three.t3(a, b)
59d0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
59e0: 4f 20 74 33 20 56 41 4c 55 45 53 28 31 2c 20 27  O t3 VALUES(1, '
59f0: 74 33 2e 31 27 29 3b 0a 20 20 20 20 42 45 47 49  t3.1');.    BEGI
5a00: 4e 3b 0a 20 20 20 20 20 20 55 50 44 41 54 45 20  N;.      UPDATE 
5a10: 74 32 20 53 45 54 20 62 20 3d 20 27 74 32 2e 33  t2 SET b = 't2.3
5a20: 27 3b 0a 20 20 20 20 20 20 55 50 44 41 54 45 20  ';.      UPDATE 
5a30: 74 33 20 53 45 54 20 62 20 3d 20 27 74 33 2e 33  t3 SET b = 't3.3
5a40: 27 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20  ';.    COMMIT;. 
5a50: 20 7d 0a 20 20 65 78 70 72 20 7b 24 3a 3a 6d 6a   }.  expr {$::mj
5a60: 5f 66 69 6c 65 6e 61 6d 65 31 20 21 3d 20 24 3a  _filename1 != $:
5a70: 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 7d 0a 7d 20  :mj_filename}.} 
5a80: 7b 31 7d 0a 66 61 75 6c 74 73 69 6d 5f 72 65 73  {1}.faultsim_res
5a90: 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a  tore_and_reopen.
5aa0: 74 76 20 66 69 6c 74 65 72 20 7b 7d 0a 0a 23 20  tv filter {}..# 
5ab0: 54 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  The file-system 
5ac0: 6e 6f 77 20 63 6f 6e 74 61 69 6e 73 3a 0a 23 0a  now contains:.#.
5ad0: 23 20 20 20 2a 20 74 68 72 65 65 20 64 61 74 61  #   * three data
5ae0: 62 61 73 65 73 0a 23 20 20 20 2a 20 74 68 72 65  bases.#   * thre
5af0: 65 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69  e hot-journal fi
5b00: 6c 65 73 0a 23 20 20 20 2a 20 74 77 6f 20 6d 61  les.#   * two ma
5b10: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster-journal fil
5b20: 65 73 2e 0a 23 0a 23 20 54 68 65 20 68 6f 74 2d  es..#.# The hot-
5b30: 6a 6f 75 72 6e 61 6c 73 20 61 73 73 6f 63 69 61  journals associa
5b40: 74 65 64 20 77 69 74 68 20 74 65 73 74 2e 64 62  ted with test.db
5b50: 32 20 61 6e 64 20 74 65 73 74 2e 64 62 33 20 70  2 and test.db3 p
5b60: 6f 69 6e 74 20 74 6f 0a 23 20 6d 61 73 74 65 72  oint to.# master
5b70: 20 6a 6f 75 72 6e 61 6c 20 24 3a 3a 6d 6a 5f 66   journal $::mj_f
5b80: 69 6c 65 6e 61 6d 65 2e 20 54 68 65 20 68 6f 74  ilename. The hot
5b90: 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 73  -journal file as
5ba0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a 23 20  sociated with.# 
5bb0: 74 65 73 74 2e 64 62 20 70 6f 69 6e 74 73 20 74  test.db points t
5bc0: 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  o master journal
5bd0: 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 31   $::mj_filename1
5be0: 2e 20 53 6f 20 72 65 61 64 69 6e 67 20 66 72 6f  . So reading fro
5bf0: 6d 0a 23 20 74 65 73 74 2e 64 62 20 73 68 6f 75  m.# test.db shou
5c00: 6c 64 20 64 65 6c 65 74 65 20 24 3a 3a 6d 6a 5f  ld delete $::mj_
5c10: 66 69 6c 65 6e 61 6d 65 31 2e 0a 23 0a 64 6f 5f  filename1..#.do_
5c20: 74 65 73 74 20 70 61 67 65 72 31 2e 34 2e 36 2e  test pager1.4.6.
5c30: 39 20 7b 0a 20 20 6c 73 6f 72 74 20 5b 67 6c 6f  9 {.  lsort [glo
5c40: 62 20 74 65 73 74 2e 64 62 2a 5d 0a 7d 20 5b 6c  b test.db*].} [l
5c50: 73 6f 72 74 20 5b 6c 69 73 74 20 20 20 20 20 20  sort [list      
5c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c80: 20 20 20 20 20 5c 0a 20 20 74 65 73 74 2e 64 62       \.  test.db
5c90: 20 74 65 73 74 2e 64 62 32 20 74 65 73 74 2e 64   test.db2 test.d
5ca0: 62 33 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b3              
5cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5cc0: 5c 0a 20 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72  \.  test.db-jour
5cd0: 6e 61 6c 20 74 65 73 74 2e 64 62 32 2d 6a 6f 75  nal test.db2-jou
5ce0: 72 6e 61 6c 20 74 65 73 74 2e 64 62 33 2d 6a 6f  rnal test.db3-jo
5cf0: 75 72 6e 61 6c 20 20 20 20 20 20 5c 0a 20 20 5b  urnal      \.  [
5d00: 66 69 6c 65 20 74 61 69 6c 20 24 3a 3a 6d 6a 5f  file tail $::mj_
5d10: 66 69 6c 65 6e 61 6d 65 5d 20 5b 66 69 6c 65 20  filename] [file 
5d20: 74 61 69 6c 20 24 3a 3a 6d 6a 5f 66 69 6c 65 6e  tail $::mj_filen
5d30: 61 6d 65 31 5d 0a 5d 5d 0a 0a 23 20 54 68 65 20  ame1].]]..# The 
5d40: 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 24  master-journal $
5d50: 3a 3a 6d 6a 5f 66 69 6c 65 6e 61 6d 65 31 20 63  ::mj_filename1 c
5d60: 6f 6e 74 61 69 6e 73 20 70 6f 69 6e 74 65 72 73  ontains pointers
5d70: 20 74 6f 20 74 65 73 74 2e 64 62 20 61 6e 64 20   to test.db and 
5d80: 0a 23 20 74 65 73 74 2e 64 62 32 2e 20 48 6f 77  .# test.db2. How
5d90: 65 76 65 72 20 74 68 65 20 68 6f 74 2d 6a 6f 75  ever the hot-jou
5da0: 72 6e 61 6c 20 61 73 73 6f 63 69 61 74 65 64 20  rnal associated 
5db0: 77 69 74 68 20 74 65 73 74 2e 64 62 32 20 70 6f  with test.db2 po
5dc0: 69 6e 74 73 20 74 6f 0a 23 20 61 20 64 69 66 66  ints to.# a diff
5dd0: 65 72 65 6e 74 20 6d 61 73 74 65 72 2d 6a 6f 75  erent master-jou
5de0: 72 6e 61 6c 2e 20 54 68 65 72 65 66 6f 72 65 2c  rnal. Therefore,
5df0: 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 74 65   reading from te
5e00: 73 74 2e 64 62 20 6f 6e 6c 79 20 73 68 6f 75 6c  st.db only shoul
5e10: 64 0a 23 20 62 65 20 65 6e 6f 75 67 68 20 74 6f  d.# be enough to
5e20: 20 63 61 75 73 65 20 53 51 4c 69 74 65 20 74 6f   cause SQLite to
5e30: 20 64 65 6c 65 74 65 20 24 3a 3a 6d 6a 5f 66 69   delete $::mj_fi
5e40: 6c 65 6e 61 6d 65 31 2e 0a 23 0a 64 6f 5f 74 65  lename1..#.do_te
5e50: 73 74 20 20 20 20 20 20 20 20 20 70 61 67 65 72  st         pager
5e60: 31 2e 34 2e 36 2e 31 30 20 7b 20 66 69 6c 65 20  1.4.6.10 { file 
5e70: 65 78 69 73 74 73 20 24 3a 3a 6d 6a 5f 66 69 6c  exists $::mj_fil
5e80: 65 6e 61 6d 65 20 20 7d 20 7b 31 7d 0a 64 6f 5f  ename  } {1}.do_
5e90: 74 65 73 74 20 20 20 20 20 20 20 20 20 70 61 67  test         pag
5ea0: 65 72 31 2e 34 2e 36 2e 31 31 20 7b 20 66 69 6c  er1.4.6.11 { fil
5eb0: 65 20 65 78 69 73 74 73 20 24 3a 3a 6d 6a 5f 66  e exists $::mj_f
5ec0: 69 6c 65 6e 61 6d 65 31 20 7d 20 7b 31 7d 0a 64  ilename1 } {1}.d
5ed0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70  o_execsql_test p
5ee0: 61 67 65 72 31 2e 34 2e 36 2e 31 32 20 7b 20 53  ager1.4.6.12 { S
5ef0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
5f00: 7d 20 7b 31 20 74 31 2e 31 7d 0a 64 6f 5f 74 65  } {1 t1.1}.do_te
5f10: 73 74 20 20 20 20 20 20 20 20 20 70 61 67 65 72  st         pager
5f20: 31 2e 34 2e 36 2e 31 33 20 7b 20 66 69 6c 65 20  1.4.6.13 { file 
5f30: 65 78 69 73 74 73 20 24 3a 3a 6d 6a 5f 66 69 6c  exists $::mj_fil
5f40: 65 6e 61 6d 65 20 20 7d 20 7b 31 7d 0a 64 6f 5f  ename  } {1}.do_
5f50: 74 65 73 74 20 20 20 20 20 20 20 20 20 70 61 67  test         pag
5f60: 65 72 31 2e 34 2e 36 2e 31 34 20 7b 20 66 69 6c  er1.4.6.14 { fil
5f70: 65 20 65 78 69 73 74 73 20 24 3a 3a 6d 6a 5f 66  e exists $::mj_f
5f80: 69 6c 65 6e 61 6d 65 31 20 7d 20 7b 30 7d 0a 0a  ilename1 } {0}..
5f90: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
5fa0: 70 61 67 65 72 31 2e 34 2e 36 2e 31 32 20 7b 0a  pager1.4.6.12 {.
5fb0: 20 20 41 54 54 41 43 48 20 27 74 65 73 74 2e 64    ATTACH 'test.d
5fc0: 62 32 27 20 41 53 20 74 77 6f 3b 0a 20 20 53 45  b2' AS two;.  SE
5fd0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a  LECT * FROM t2;.
5fe0: 7d 20 7b 31 20 74 32 2e 31 7d 0a 64 6f 5f 74 65  } {1 t2.1}.do_te
5ff0: 73 74 20 20 20 20 20 20 20 20 20 70 61 67 65 72  st         pager
6000: 31 2e 34 2e 36 2e 31 33 20 7b 20 66 69 6c 65 20  1.4.6.13 { file 
6010: 65 78 69 73 74 73 20 24 3a 3a 6d 6a 5f 66 69 6c  exists $::mj_fil
6020: 65 6e 61 6d 65 20 7d 20 20 7b 31 7d 0a 64 6f 5f  ename }  {1}.do_
6030: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67  execsql_test pag
6040: 65 72 31 2e 34 2e 36 2e 31 34 20 7b 0a 20 20 41  er1.4.6.14 {.  A
6050: 54 54 41 43 48 20 27 74 65 73 74 2e 64 62 33 27  TTACH 'test.db3'
6060: 20 41 53 20 74 68 72 65 65 3b 0a 20 20 53 45 4c   AS three;.  SEL
6070: 45 43 54 20 2a 20 46 52 4f 4d 20 74 33 3b 0a 7d  ECT * FROM t3;.}
6080: 20 7b 31 20 74 33 2e 31 7d 0a 64 6f 5f 74 65 73   {1 t3.1}.do_tes
6090: 74 20 20 20 20 20 20 20 20 20 70 61 67 65 72 31  t         pager1
60a0: 2e 34 2e 36 2e 31 35 20 7b 20 66 69 6c 65 20 65  .4.6.15 { file e
60b0: 78 69 73 74 73 20 24 3a 3a 6d 6a 5f 66 69 6c 65  xists $::mj_file
60c0: 6e 61 6d 65 20 7d 20 20 7b 30 7d 0a 0a 64 62 20  name }  {0}..db 
60d0: 63 6c 6f 73 65 0a 74 76 20 64 65 6c 65 74 65 0a  close.tv delete.
60e0: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
60f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68  -----------.# Th
6130: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74  e following test
6140: 73 20 64 65 61 6c 20 77 69 74 68 20 6d 75 6c 74  s deal with mult
6150: 69 2d 66 69 6c 65 20 63 6f 6d 6d 69 74 73 2e 0a  i-file commits..
6160: 23 0a 23 20 70 61 67 65 72 31 2d 35 2e 31 2e 2a  #.# pager1-5.1.*
6170: 3a 20 54 68 65 20 63 61 73 65 20 77 68 65 72 65  : The case where
6180: 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 63 61   a multi-file ca
6190: 6e 6e 6f 74 20 62 65 20 63 6f 6d 6d 69 74 74 65  nnot be committe
61a0: 64 20 62 65 63 61 75 73 65 0a 23 20 20 20 20 20  d because.#     
61b0: 20 20 20 20 20 20 20 20 20 20 61 6e 6f 74 68 65            anothe
61c0: 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20  r connection is 
61d0: 68 6f 6c 64 69 6e 67 20 61 20 53 48 41 52 45 44  holding a SHARED
61e0: 20 6c 6f 63 6b 20 6f 6e 20 6f 6e 65 20 6f 66 20   lock on one of 
61f0: 74 68 65 0a 23 20 20 20 20 20 20 20 20 20 20 20  the.#           
6200: 20 20 20 20 66 69 6c 65 73 2e 20 41 66 74 65 72      files. After
6210: 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b   the SHARED lock
6220: 20 69 73 20 72 65 6d 6f 76 65 64 2c 20 74 68 65   is removed, the
6230: 20 43 4f 4d 4d 49 54 20 73 75 63 63 65 65 64 73   COMMIT succeeds
6240: 2e 0a 23 0a 23 20 70 61 67 65 72 31 2d 35 2e 32  ..#.# pager1-5.2
6250: 2e 2a 3a 20 4d 75 6c 74 69 2d 66 69 6c 65 20 63  .*: Multi-file c
6260: 6f 6d 6d 69 74 73 20 77 69 74 68 20 6a 6f 75 72  ommits with jour
6270: 6e 61 6c 5f 6d 6f 64 65 3d 6d 65 6d 6f 72 79 2e  nal_mode=memory.
6280: 0a 23 0a 23 20 70 61 67 65 72 31 2d 35 2e 33 2e  .#.# pager1-5.3.
6290: 2a 3a 20 4d 75 6c 74 69 2d 66 69 6c 65 20 63 6f  *: Multi-file co
62a0: 6d 6d 69 74 73 20 77 69 74 68 20 6a 6f 75 72 6e  mmits with journ
62b0: 61 6c 5f 6d 6f 64 65 3d 6d 65 6d 6f 72 79 2e 0a  al_mode=memory..
62c0: 23 0a 23 20 70 61 67 65 72 31 2d 35 2e 34 2e 2a  #.# pager1-5.4.*
62d0: 3a 20 43 68 65 63 6b 20 74 68 61 74 20 77 69 74  : Check that wit
62e0: 68 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 6e 6f  h synchronous=no
62f0: 72 6d 61 6c 2c 20 74 68 65 20 6d 61 73 74 65 72  rmal, the master
6300: 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 23 20  -journal file.# 
6310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 61                na
6320: 6d 65 20 69 73 20 61 64 64 65 64 20 74 6f 20 61  me is added to a
6330: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6d   journal file im
6340: 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20  mediately after 
6350: 74 68 65 20 6c 61 73 74 0a 23 20 20 20 20 20 20  the last.#      
6360: 20 20 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c           journal
6370: 20 72 65 63 6f 72 64 2e 20 42 75 74 20 77 69 74   record. But wit
6380: 68 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 66 75  h synchronous=fu
6390: 6c 6c 2c 20 65 78 74 72 61 20 75 6e 75 73 65 64  ll, extra unused
63a0: 20 73 70 61 63 65 0a 23 20 20 20 20 20 20 20 20   space.#        
63b0: 20 20 20 20 20 20 20 69 73 20 61 6c 6c 6f 63 61         is alloca
63c0: 74 65 64 20 62 65 74 77 65 65 6e 20 74 68 65 20  ted between the 
63d0: 6c 61 73 74 20 6a 6f 75 72 6e 61 6c 20 72 65 63  last journal rec
63e0: 6f 72 64 20 61 6e 64 20 74 68 65 20 0a 23 20 20  ord and the .#  
63f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 61 73               mas
6400: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter-journal file
6410: 20 6e 61 6d 65 20 73 6f 20 74 68 61 74 20 74 68   name so that th
6420: 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  e master-journal
6430: 20 66 69 6c 65 0a 23 20 20 20 20 20 20 20 20 20   file.#         
6440: 20 20 20 20 20 20 6e 61 6d 65 20 64 6f 65 73 20        name does 
6450: 6e 6f 74 20 6c 69 65 20 6f 6e 20 74 68 65 20 73  not lie on the s
6460: 61 6d 65 20 73 65 63 74 6f 72 20 61 73 20 74 68  ame sector as th
6470: 65 20 6c 61 73 74 20 6a 6f 75 72 6e 61 6c 20 66  e last journal f
6480: 69 6c 65 0a 23 20 20 20 20 20 20 20 20 20 20 20  ile.#           
6490: 20 20 20 20 72 65 63 6f 72 64 2e 0a 23 0a 23 20      record..#.# 
64a0: 70 61 67 65 72 31 2d 35 2e 35 2e 2a 3a 20 43 68  pager1-5.5.*: Ch
64b0: 65 63 6b 20 74 68 61 74 20 69 6e 20 6a 6f 75 72  eck that in jour
64c0: 6e 61 6c 5f 6d 6f 64 65 3d 50 45 52 53 49 53 54  nal_mode=PERSIST
64d0: 20 6d 6f 64 65 2c 20 61 20 6a 6f 75 72 6e 61 6c   mode, a journal
64e0: 20 66 69 6c 65 20 69 73 0a 23 20 20 20 20 20 20   file is.#      
64f0: 20 20 20 20 20 20 20 20 20 74 72 75 6e 63 61 74           truncat
6500: 65 64 20 74 6f 20 7a 65 72 6f 20 62 79 74 65 73  ed to zero bytes
6510: 20 77 68 65 6e 20 61 20 6d 75 6c 74 69 2d 66 69   when a multi-fi
6520: 6c 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  le transaction i
6530: 73 20 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  s .#            
6540: 20 20 20 63 6f 6d 6d 69 74 74 65 64 20 28 69 6e     committed (in
6550: 73 74 65 61 64 20 6f 66 20 74 68 65 20 66 69 72  stead of the fir
6560: 73 74 20 63 6f 75 70 6c 65 20 6f 66 20 62 79 74  st couple of byt
6570: 65 73 20 62 65 69 6e 67 20 7a 65 72 6f 65 64 29  es being zeroed)
6580: 2e 0a 23 0a 23 0a 64 6f 5f 74 65 73 74 20 70 61  ..#.#.do_test pa
6590: 67 65 72 31 2d 35 2e 31 2e 31 20 7b 0a 20 20 66  ger1-5.1.1 {.  f
65a0: 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61  aultsim_delete_a
65b0: 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65 63  nd_reopen.  exec
65c0: 73 71 6c 20 7b 0a 20 20 20 20 41 54 54 41 43 48  sql {.    ATTACH
65d0: 20 27 74 65 73 74 2e 64 62 32 27 20 41 53 20 61   'test.db2' AS a
65e0: 75 78 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  ux;.    CREATE T
65f0: 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20  ABLE t1(a, b);. 
6600: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
6610: 61 75 78 2e 74 32 28 61 2c 20 62 29 3b 0a 20 20  aux.t2(a, b);.  
6620: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
6630: 20 56 41 4c 55 45 53 28 31 37 2c 20 27 4c 65 6e   VALUES(17, 'Len
6640: 69 6e 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  in');.    INSERT
6650: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
6660: 32 32 2c 20 27 53 74 61 6c 69 6e 27 29 3b 0a 20  22, 'Stalin');. 
6670: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
6680: 31 20 56 41 4c 55 45 53 28 35 33 2c 20 27 4b 68  1 VALUES(53, 'Kh
6690: 72 75 73 68 63 68 65 76 27 29 3b 0a 20 20 7d 0a  rushchev');.  }.
66a0: 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67  } {}.do_test pag
66b0: 65 72 31 2d 35 2e 31 2e 32 20 7b 0a 20 20 65 78  er1-5.1.2 {.  ex
66c0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49  ecsql {.    BEGI
66d0: 4e 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  N;.      INSERT 
66e0: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 36  INTO t1 VALUES(6
66f0: 34 2c 20 27 42 72 65 7a 68 6e 65 76 27 29 3b 0a  4, 'Brezhnev');.
6700: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
6710: 4f 20 74 32 20 53 45 4c 45 43 54 20 2a 20 46 52  O t2 SELECT * FR
6720: 4f 4d 20 74 31 3b 0a 20 20 7d 0a 20 20 73 71 6c  OM t1;.  }.  sql
6730: 69 74 65 33 20 64 62 32 20 74 65 73 74 2e 64 62  ite3 db2 test.db
6740: 32 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  2.  execsql {.  
6750: 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 53    BEGIN;.      S
6760: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b  ELECT * FROM t2;
6770: 0a 20 20 7d 20 64 62 32 0a 7d 20 7b 7d 0a 64 6f  .  } db2.} {}.do
6780: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 35 2e 31  _test pager1-5.1
6790: 2e 33 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20  .3 {.  catchsql 
67a0: 43 4f 4d 4d 49 54 0a 7d 20 7b 31 20 7b 64 61 74  COMMIT.} {1 {dat
67b0: 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 7d  abase is locked}
67c0: 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  }.do_test pager1
67d0: 2d 35 2e 31 2e 34 20 7b 0a 20 20 65 78 65 63 73  -5.1.4 {.  execs
67e0: 71 6c 20 43 4f 4d 4d 49 54 20 64 62 32 0a 20 20  ql COMMIT db2.  
67f0: 65 78 65 63 73 71 6c 20 43 4f 4d 4d 49 54 0a 20  execsql COMMIT. 
6800: 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43   execsql { SELEC
6810: 54 20 2a 20 46 52 4f 4d 20 74 32 20 7d 20 64 62  T * FROM t2 } db
6820: 32 0a 7d 20 7b 31 37 20 4c 65 6e 69 6e 20 32 32  2.} {17 Lenin 22
6830: 20 53 74 61 6c 69 6e 20 35 33 20 4b 68 72 75 73   Stalin 53 Khrus
6840: 68 63 68 65 76 20 36 34 20 42 72 65 7a 68 6e 65  hchev 64 Brezhne
6850: 76 7d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  v}.do_test pager
6860: 31 2d 35 2e 31 2e 35 20 7b 0a 20 20 64 62 32 20  1-5.1.5 {.  db2 
6870: 63 6c 6f 73 65 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74  close.} {}..do_t
6880: 65 73 74 20 70 61 67 65 72 31 2d 35 2e 32 2e 31  est pager1-5.2.1
6890: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
68a0: 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61     PRAGMA journa
68b0: 6c 5f 6d 6f 64 65 20 3d 20 6d 65 6d 6f 72 79 3b  l_mode = memory;
68c0: 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20  .    BEGIN;.    
68d0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
68e0: 20 56 41 4c 55 45 53 28 38 34 2c 20 27 41 6e 64   VALUES(84, 'And
68f0: 72 6f 70 6f 76 27 29 3b 0a 20 20 20 20 20 20 49  ropov');.      I
6900: 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41  NSERT INTO t2 VA
6910: 4c 55 45 53 28 38 34 2c 20 27 41 6e 64 72 6f 70  LUES(84, 'Androp
6920: 6f 76 27 29 3b 0a 20 20 20 20 43 4f 4d 4d 49 54  ov');.    COMMIT
6930: 3b 0a 20 20 7d 0a 7d 20 7b 6d 65 6d 6f 72 79 7d  ;.  }.} {memory}
6940: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
6950: 35 2e 33 2e 31 20 7b 0a 20 20 65 78 65 63 73 71  5.3.1 {.  execsq
6960: 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a  l {.    PRAGMA j
6970: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 6f 66  ournal_mode = of
6980: 66 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20  f;.    BEGIN;.  
6990: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
69a0: 74 31 20 56 41 4c 55 45 53 28 38 35 2c 20 27 47  t1 VALUES(85, 'G
69b0: 6f 72 62 61 63 68 65 76 27 29 3b 0a 20 20 20 20  orbachev');.    
69c0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32    INSERT INTO t2
69d0: 20 56 41 4c 55 45 53 28 38 35 2c 20 27 47 6f 72   VALUES(85, 'Gor
69e0: 62 61 63 68 65 76 27 29 3b 0a 20 20 20 20 43 4f  bachev');.    CO
69f0: 4d 4d 49 54 3b 0a 20 20 7d 0a 7d 20 7b 6f 66 66  MMIT;.  }.} {off
6a00: 7d 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72  }..do_test pager
6a10: 31 2d 35 2e 34 2e 31 20 7b 0a 20 20 64 62 20 63  1-5.4.1 {.  db c
6a20: 6c 6f 73 65 0a 20 20 74 65 73 74 76 66 73 20 74  lose.  testvfs t
6a30: 76 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 74  v.  sqlite3 db t
6a40: 65 73 74 2e 64 62 20 2d 76 66 73 20 74 76 0a 20  est.db -vfs tv. 
6a50: 20 65 78 65 63 73 71 6c 20 7b 20 41 54 54 41 43   execsql { ATTAC
6a60: 48 20 27 74 65 73 74 2e 64 62 32 27 20 41 53 20  H 'test.db2' AS 
6a70: 61 75 78 20 7d 0a 0a 20 20 74 76 20 66 69 6c 74  aux }..  tv filt
6a80: 65 72 20 78 44 65 6c 65 74 65 0a 20 20 74 76 20  er xDelete.  tv 
6a90: 73 63 72 69 70 74 20 6d 61 78 5f 6a 6f 75 72 6e  script max_journ
6aa0: 61 6c 5f 73 69 7a 65 0a 20 20 74 76 20 73 65 63  al_size.  tv sec
6ab0: 74 6f 72 73 69 7a 65 20 35 31 32 0a 20 20 73 65  torsize 512.  se
6ac0: 74 20 3a 3a 6d 61 78 5f 6a 6f 75 72 6e 61 6c 20  t ::max_journal 
6ad0: 30 0a 20 20 70 72 6f 63 20 6d 61 78 5f 6a 6f 75  0.  proc max_jou
6ae0: 72 6e 61 6c 5f 73 69 7a 65 20 7b 6d 65 74 68 6f  rnal_size {metho
6af0: 64 20 61 72 67 73 7d 20 7b 0a 20 20 20 20 73 65  d args} {.    se
6b00: 74 20 73 7a 20 30 0a 20 20 20 20 63 61 74 63 68  t sz 0.    catch
6b10: 20 7b 20 73 65 74 20 73 7a 20 5b 66 69 6c 65 20   { set sz [file 
6b20: 73 69 7a 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75  size test.db-jou
6b30: 72 6e 61 6c 5d 20 7d 0a 20 20 20 20 69 66 20 7b  rnal] }.    if {
6b40: 24 73 7a 20 3e 20 24 3a 3a 6d 61 78 5f 6a 6f 75  $sz > $::max_jou
6b50: 72 6e 61 6c 7d 20 7b 0a 20 20 20 20 20 20 73 65  rnal} {.      se
6b60: 74 20 3a 3a 6d 61 78 5f 6a 6f 75 72 6e 61 6c 20  t ::max_journal 
6b70: 24 73 7a 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  $sz.    }.    re
6b80: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 20  turn SQLITE_OK. 
6b90: 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   }.  execsql {. 
6ba0: 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61     PRAGMA journa
6bb0: 6c 5f 6d 6f 64 65 20 3d 20 44 45 4c 45 54 45 3b  l_mode = DELETE;
6bc0: 0a 20 20 20 20 50 52 41 47 4d 41 20 73 79 6e 63  .    PRAGMA sync
6bd0: 68 72 6f 6e 6f 75 73 20 3d 20 4e 4f 52 4d 41 4c  hronous = NORMAL
6be0: 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20  ;.    BEGIN;.   
6bf0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
6c00: 31 20 56 41 4c 55 45 53 28 38 35 2c 20 27 47 6f  1 VALUES(85, 'Go
6c10: 72 62 61 63 68 65 76 27 29 3b 0a 20 20 20 20 20  rbachev');.     
6c20: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20   INSERT INTO t2 
6c30: 56 41 4c 55 45 53 28 38 35 2c 20 27 47 6f 72 62  VALUES(85, 'Gorb
6c40: 61 63 68 65 76 27 29 3b 0a 20 20 20 20 43 4f 4d  achev');.    COM
6c50: 4d 49 54 3b 0a 20 20 7d 0a 20 20 73 65 74 20 3a  MIT;.  }.  set :
6c60: 3a 6d 61 78 5f 6a 6f 75 72 6e 61 6c 0a 7d 20 5b  :max_journal.} [
6c70: 65 78 70 72 20 32 36 31 35 2b 5b 73 74 72 69 6e  expr 2615+[strin
6c80: 67 20 6c 65 6e 67 74 68 20 5b 70 77 64 5d 5d 5d  g length [pwd]]]
6c90: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
6ca0: 35 2e 34 2e 32 20 7b 0a 20 20 73 65 74 20 3a 3a  5.4.2 {.  set ::
6cb0: 6d 61 78 5f 6a 6f 75 72 6e 61 6c 20 30 0a 20 20  max_journal 0.  
6cc0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52  execsql {.    PR
6cd0: 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73  AGMA synchronous
6ce0: 20 3d 20 66 75 6c 6c 3b 0a 20 20 20 20 42 45 47   = full;.    BEG
6cf0: 49 4e 3b 0a 20 20 20 20 20 20 44 45 4c 45 54 45  IN;.      DELETE
6d00: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 62   FROM t1 WHERE b
6d10: 20 3d 20 27 4c 65 6e 69 6e 27 3b 0a 20 20 20 20   = 'Lenin';.    
6d20: 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 32    DELETE FROM t2
6d30: 20 57 48 45 52 45 20 62 20 3d 20 27 4c 65 6e 69   WHERE b = 'Leni
6d40: 6e 27 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a  n';.    COMMIT;.
6d50: 20 20 7d 0a 20 20 73 65 74 20 3a 3a 6d 61 78 5f    }.  set ::max_
6d60: 6a 6f 75 72 6e 61 6c 0a 7d 20 5b 65 78 70 72 20  journal.} [expr 
6d70: 33 31 31 31 2b 5b 73 74 72 69 6e 67 20 6c 65 6e  3111+[string len
6d80: 67 74 68 20 5b 70 77 64 5d 5d 5d 0a 64 62 20 63  gth [pwd]]].db c
6d90: 6c 6f 73 65 0a 74 76 20 64 65 6c 65 74 65 0a 0a  lose.tv delete..
6da0: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 35  do_test pager1-5
6db0: 2e 35 2e 31 20 7b 0a 20 20 73 71 6c 69 74 65 33  .5.1 {.  sqlite3
6dc0: 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20 65 78   db test.db.  ex
6dd0: 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 41 54 54  ecsql { .    ATT
6de0: 41 43 48 20 27 74 65 73 74 2e 64 62 32 27 20 41  ACH 'test.db2' A
6df0: 53 20 61 75 78 3b 0a 20 20 20 20 50 52 41 47 4d  S aux;.    PRAGM
6e00: 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d  A journal_mode =
6e10: 20 50 45 52 53 49 53 54 3b 0a 20 20 20 20 43 52   PERSIST;.    CR
6e20: 45 41 54 45 20 54 41 42 4c 45 20 74 33 28 61 2c  EATE TABLE t3(a,
6e30: 20 62 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   b);.    INSERT 
6e40: 49 4e 54 4f 20 74 33 20 53 45 4c 45 43 54 20 72  INTO t3 SELECT r
6e50: 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 2c  andomblob(1500),
6e60: 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30   randomblob(1500
6e70: 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 55  ) FROM t1;.    U
6e80: 50 44 41 54 45 20 74 33 20 53 45 54 20 62 20 3d  PDATE t3 SET b =
6e90: 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30   randomblob(1500
6ea0: 29 3b 0a 20 20 7d 0a 20 20 65 78 70 72 20 5b 66  );.  }.  expr [f
6eb0: 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62  ile size test.db
6ec0: 2d 6a 6f 75 72 6e 61 6c 5d 20 3e 20 31 35 30 30  -journal] > 1500
6ed0: 30 0a 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73 74 20  0.} {1}.do_test 
6ee0: 70 61 67 65 72 31 2d 35 2e 35 2e 32 20 7b 0a 20  pager1-5.5.2 {. 
6ef0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50   execsql {.    P
6f00: 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75  RAGMA synchronou
6f10: 73 20 3d 20 66 75 6c 6c 3b 0a 20 20 20 20 42 45  s = full;.    BE
6f20: 47 49 4e 3b 0a 20 20 20 20 20 20 44 45 4c 45 54  GIN;.      DELET
6f30: 45 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  E FROM t1 WHERE 
6f40: 62 20 3d 20 27 53 74 61 6c 69 6e 27 3b 0a 20 20  b = 'Stalin';.  
6f50: 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20      DELETE FROM 
6f60: 74 32 20 57 48 45 52 45 20 62 20 3d 20 27 53 74  t2 WHERE b = 'St
6f70: 61 6c 69 6e 27 3b 0a 20 20 20 20 43 4f 4d 4d 49  alin';.    COMMI
6f80: 54 3b 0a 20 20 7d 0a 20 20 66 69 6c 65 20 73 69  T;.  }.  file si
6f90: 7a 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e  ze test.db-journ
6fa0: 61 6c 0a 7d 20 7b 30 7d 0a 0a 0a 23 2d 2d 2d 2d  al.} {0}...#----
6fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ff0: 2d 2d 2d 2d 2d 0a 23 20 54 68 65 20 66 6f 6c 6c  -----.# The foll
7000: 6f 77 69 6e 67 20 74 65 73 74 73 20 77 6f 72 6b  owing tests work
7010: 20 77 69 74 68 20 22 50 52 41 47 4d 41 20 6d 61   with "PRAGMA ma
7020: 78 5f 70 61 67 65 5f 63 6f 75 6e 74 22 0a 23 0a  x_page_count".#.
7030: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 36  do_test pager1-6
7040: 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f  .1 {.  faultsim_
7050: 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65  delete_and_reope
7060: 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  n.  execsql {.  
7070: 20 20 50 52 41 47 4d 41 20 6d 61 78 5f 70 61 67    PRAGMA max_pag
7080: 65 5f 63 6f 75 6e 74 20 3d 20 31 30 3b 0a 20 20  e_count = 10;.  
7090: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
70a0: 32 28 61 2c 20 62 29 3b 0a 20 20 20 20 43 52 45  2(a, b);.    CRE
70b0: 41 54 45 20 54 41 42 4c 45 20 74 33 28 61 2c 20  ATE TABLE t3(a, 
70c0: 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  b);.    CREATE T
70d0: 41 42 4c 45 20 74 34 28 61 2c 20 62 29 3b 0a 20  ABLE t4(a, b);. 
70e0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
70f0: 74 35 28 61 2c 20 62 29 3b 0a 20 20 20 20 43 52  t5(a, b);.    CR
7100: 45 41 54 45 20 54 41 42 4c 45 20 74 36 28 61 2c  EATE TABLE t6(a,
7110: 20 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20   b);.    CREATE 
7120: 54 41 42 4c 45 20 74 37 28 61 2c 20 62 29 3b 0a  TABLE t7(a, b);.
7130: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
7140: 20 74 38 28 61 2c 20 62 29 3b 0a 20 20 20 20 43   t8(a, b);.    C
7150: 52 45 41 54 45 20 54 41 42 4c 45 20 74 39 28 61  REATE TABLE t9(a
7160: 2c 20 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45  , b);.    CREATE
7170: 20 54 41 42 4c 45 20 74 31 30 28 61 2c 20 62 29   TABLE t10(a, b)
7180: 3b 0a 20 20 7d 0a 7d 20 7b 31 30 7d 0a 64 6f 5f  ;.  }.} {10}.do_
7190: 74 65 73 74 20 70 61 67 65 72 31 2d 36 2e 32 20  test pager1-6.2 
71a0: 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20  {.  catchsql {. 
71b0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
71c0: 74 31 31 28 61 2c 20 62 29 3b 0a 20 20 7d 0a 7d  t11(a, b);.  }.}
71d0: 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20 6f 72   {1 {database or
71e0: 20 64 69 73 6b 20 69 73 20 66 75 6c 6c 7d 7d 0a   disk is full}}.
71f0: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
7200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54  ------------.# T
7240: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73  he following tes
7250: 74 73 20 77 6f 72 6b 20 77 69 74 68 20 22 50 52  ts work with "PR
7260: 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
7270: 65 3d 54 52 55 4e 43 41 54 45 22 20 61 6e 64 0a  e=TRUNCATE" and.
7280: 23 20 22 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e  # "PRAGMA lockin
7290: 67 5f 6d 6f 64 65 3d 45 58 43 4c 55 53 49 56 45  g_mode=EXCLUSIVE
72a0: 22 2e 0a 23 0a 23 20 45 61 63 68 20 74 65 73 74  "..#.# Each test
72b0: 20 69 73 20 73 70 65 63 69 66 69 65 64 20 77 69   is specified wi
72c0: 74 68 20 35 20 76 61 72 69 61 62 6c 65 73 2e 20  th 5 variables. 
72d0: 41 73 20 66 6f 6c 6c 6f 77 73 3a 0a 23 0a 23 20  As follows:.#.# 
72e0: 20 20 24 74 6e 3a 20 20 54 65 73 74 20 4e 75 6d    $tn:  Test Num
72f0: 62 65 72 2e 20 55 73 65 64 20 61 73 20 70 61 72  ber. Used as par
7300: 74 20 6f 66 20 74 68 65 20 5b 64 6f 5f 74 65 73  t of the [do_tes
7310: 74 5d 20 74 65 73 74 20 6e 61 6d 65 73 2e 0a 23  t] test names..#
7320: 20 20 20 24 73 71 6c 3a 20 53 51 4c 20 74 6f 20     $sql: SQL to 
7330: 65 78 65 63 75 74 65 2e 0a 23 20 20 20 24 72 65  execute..#   $re
7340: 73 3a 20 45 78 70 65 63 74 65 64 20 72 65 73 75  s: Expected resu
7350: 6c 74 20 6f 66 20 65 78 65 63 75 74 69 6e 67 20  lt of executing 
7360: 24 73 71 6c 2e 0a 23 20 20 20 24 6a 73 3a 20 20  $sql..#   $js:  
7370: 54 68 65 20 65 78 70 65 63 74 65 64 20 73 69 7a  The expected siz
7380: 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
7390: 20 66 69 6c 65 2c 20 69 6e 20 62 79 74 65 73 2c   file, in bytes,
73a0: 20 61 66 74 65 72 20 65 78 65 63 75 74 69 6e 67   after executing
73b0: 0a 23 20 20 20 20 20 20 20 20 20 74 68 65 20 53  .#         the S
73c0: 51 4c 20 73 63 72 69 70 74 2e 20 4f 72 20 2d 31  QL script. Or -1
73d0: 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   if the journal 
73e0: 69 73 20 6e 6f 74 20 65 78 70 65 63 74 65 64 20  is not expected 
73f0: 74 6f 20 65 78 69 73 74 2e 0a 23 20 20 20 24 77  to exist..#   $w
7400: 73 3a 20 20 54 68 65 20 65 78 70 65 63 74 65 64  s:  The expected
7410: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 57 41 4c   size of the WAL
7420: 20 66 69 6c 65 2c 20 69 6e 20 62 79 74 65 73 2c   file, in bytes,
7430: 20 61 66 74 65 72 20 65 78 65 63 75 74 69 6e 67   after executing
7440: 0a 23 20 20 20 20 20 20 20 20 20 74 68 65 20 53  .#         the S
7450: 51 4c 20 73 63 72 69 70 74 2e 20 4f 72 20 2d 31  QL script. Or -1
7460: 20 69 66 20 74 68 65 20 57 41 4c 20 69 73 20 6e   if the WAL is n
7470: 6f 74 20 65 78 70 65 63 74 65 64 20 74 6f 20 65  ot expected to e
7480: 78 69 73 74 2e 0a 23 0a 66 61 75 6c 74 73 69 6d  xist..#.faultsim
7490: 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70  _delete_and_reop
74a0: 65 6e 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20 73  en.foreach {tn s
74b0: 71 6c 20 72 65 73 20 6a 73 20 77 73 7d 20 5b 73  ql res js ws} [s
74c0: 75 62 73 74 20 7b 0a 0a 20 20 31 20 20 7b 0a 20  ubst {..  1  {. 
74d0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
74e0: 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 50 52  t1(a, b);.    PR
74f0: 41 47 4d 41 20 61 75 74 6f 5f 76 61 63 75 75 6d  AGMA auto_vacuum
7500: 3d 4f 46 46 3b 0a 20 20 20 20 50 52 41 47 4d 41  =OFF;.    PRAGMA
7510: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4e 4f 52   synchronous=NOR
7520: 4d 41 4c 3b 0a 20 20 20 20 50 52 41 47 4d 41 20  MAL;.    PRAGMA 
7530: 70 61 67 65 5f 73 69 7a 65 3d 31 30 32 34 3b 0a  page_size=1024;.
7540: 20 20 20 20 50 52 41 47 4d 41 20 6c 6f 63 6b 69      PRAGMA locki
7550: 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55 53 49 56  ng_mode=EXCLUSIV
7560: 45 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f  E;.    PRAGMA jo
7570: 75 72 6e 61 6c 5f 6d 6f 64 65 3d 54 52 55 4e 43  urnal_mode=TRUNC
7580: 41 54 45 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  ATE;.    INSERT 
7590: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31  INTO t1 VALUES(1
75a0: 2c 20 32 29 3b 0a 20 20 7d 20 7b 65 78 63 6c 75  , 2);.  } {exclu
75b0: 73 69 76 65 20 74 72 75 6e 63 61 74 65 7d 20 30  sive truncate} 0
75c0: 20 2d 31 0a 0a 20 20 32 20 20 7b 0a 20 20 20 20   -1..  2  {.    
75d0: 42 45 47 49 4e 20 49 4d 4d 45 44 49 41 54 45 3b  BEGIN IMMEDIATE;
75e0: 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20  .      SELECT * 
75f0: 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 43 4f 4d  FROM t1;.    COM
7600: 4d 49 54 3b 0a 20 20 7d 20 7b 31 20 32 7d 20 30  MIT;.  } {1 2} 0
7610: 20 2d 31 0a 0a 20 20 33 20 20 7b 0a 20 20 20 20   -1..  3  {.    
7620: 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 53 45 4c  BEGIN;.      SEL
7630: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20  ECT * FROM t1;. 
7640: 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 20 7b     COMMIT;.  } {
7650: 31 20 32 7d 20 30 20 2d 31 0a 0a 20 20 34 20 20  1 2} 0 -1..  4  
7660: 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c  { PRAGMA journal
7670: 5f 6d 6f 64 65 20 3d 20 57 41 4c 20 7d 20 20 20  _mode = WAL }   
7680: 20 77 61 6c 20 20 20 20 2d 31 20 2d 31 0a 20 20   wal    -1 -1.  
7690: 35 20 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f  5  { INSERT INTO
76a0: 20 74 31 20 56 41 4c 55 45 53 28 33 2c 20 34 29   t1 VALUES(3, 4)
76b0: 20 7d 20 20 7b 7d 20 20 20 20 20 2d 31 20 5b 77   }  {}     -1 [w
76c0: 61 6c 5f 66 69 6c 65 5f 73 69 7a 65 20 31 20 31  al_file_size 1 1
76d0: 30 32 34 5d 0a 20 20 36 20 20 7b 20 50 52 41 47  024].  6  { PRAG
76e0: 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 20  MA locking_mode 
76f0: 3d 20 4e 4f 52 4d 41 4c 20 7d 20 6e 6f 72 6d 61  = NORMAL } norma
7700: 6c 20 2d 31 20 5b 77 61 6c 5f 66 69 6c 65 5f 73  l -1 [wal_file_s
7710: 69 7a 65 20 31 20 31 30 32 34 5d 0a 20 20 37 20  ize 1 1024].  7 
7720: 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74   { INSERT INTO t
7730: 31 20 56 41 4c 55 45 53 28 35 2c 20 36 29 3b 20  1 VALUES(5, 6); 
7740: 7d 20 7b 7d 20 20 20 20 20 2d 31 20 5b 77 61 6c  } {}     -1 [wal
7750: 5f 66 69 6c 65 5f 73 69 7a 65 20 32 20 31 30 32  _file_size 2 102
7760: 34 5d 0a 0a 20 20 38 20 20 7b 20 50 52 41 47 4d  4]..  8  { PRAGM
7770: 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d  A journal_mode =
7780: 20 54 52 55 4e 43 41 54 45 20 7d 20 74 72 75 6e   TRUNCATE } trun
7790: 63 61 74 65 20 20 20 20 20 20 20 20 20 20 30 20  cate          0 
77a0: 2d 31 0a 20 20 39 20 20 7b 20 49 4e 53 45 52 54  -1.  9  { INSERT
77b0: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
77c0: 37 2c 20 38 29 20 7d 20 20 20 20 7b 7d 20 20 20  7, 8) }    {}   
77d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 2d               0 -
77e0: 31 0a 20 20 31 30 20 7b 20 53 45 4c 45 43 54 20  1.  10 { SELECT 
77f0: 2a 20 46 52 4f 4d 20 74 31 20 7d 20 20 20 20 20  * FROM t1 }     
7800: 20 20 20 20 20 20 20 20 20 20 7b 31 20 32 20 33            {1 2 3
7810: 20 34 20 35 20 36 20 37 20 38 7d 20 30 20 2d 31   4 5 6 7 8} 0 -1
7820: 0a 0a 7d 5d 20 7b 0a 20 20 64 6f 5f 65 78 65 63  ..}] {.  do_exec
7830: 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d  sql_test pager1-
7840: 37 2e 31 2e 24 74 6e 2e 31 20 24 73 71 6c 20 24  7.1.$tn.1 $sql $
7850: 72 65 73 0a 20 20 63 61 74 63 68 20 7b 20 73 65  res.  catch { se
7860: 74 20 4a 20 2d 31 20 3b 20 73 65 74 20 4a 20 5b  t J -1 ; set J [
7870: 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64  file size test.d
7880: 62 2d 6a 6f 75 72 6e 61 6c 5d 20 7d 0a 20 20 63  b-journal] }.  c
7890: 61 74 63 68 20 7b 20 73 65 74 20 57 20 2d 31 20  atch { set W -1 
78a0: 3b 20 73 65 74 20 57 20 5b 66 69 6c 65 20 73 69  ; set W [file si
78b0: 7a 65 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d 20  ze test.db-wal] 
78c0: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65  }.  do_test page
78d0: 72 31 2d 37 2e 31 2e 24 74 6e 2e 32 20 7b 20 6c  r1-7.1.$tn.2 { l
78e0: 69 73 74 20 24 4a 20 24 57 20 7d 20 5b 6c 69 73  ist $J $W } [lis
78f0: 74 20 24 6a 73 20 24 77 73 5d 0a 7d 0a 0a 66 6f  t $js $ws].}..fo
7900: 72 65 61 63 68 20 7b 74 6e 20 66 69 6c 65 6e 61  reach {tn filena
7910: 6d 65 7d 20 7b 0a 20 20 31 20 3a 6d 65 6d 6f 72  me} {.  1 :memor
7920: 79 3a 0a 20 20 32 20 22 22 0a 7d 20 7b 0a 20 20  y:.  2 "".} {.  
7930: 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 38  do_test pager1-8
7940: 2e 24 74 6e 2e 31 20 7b 0a 20 20 20 20 66 61 75  .$tn.1 {.    fau
7950: 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64  ltsim_delete_and
7960: 5f 72 65 6f 70 65 6e 0a 20 20 20 20 64 62 20 63  _reopen.    db c
7970: 6c 6f 73 65 0a 20 20 20 20 73 71 6c 69 74 65 33  lose.    sqlite3
7980: 20 64 62 20 24 66 69 6c 65 6e 61 6d 65 0a 20 20   db $filename.  
7990: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
79a0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 78    CREATE TABLE x
79b0: 31 28 78 29 3b 0a 20 20 20 20 20 20 49 4e 53 45  1(x);.      INSE
79c0: 52 54 20 49 4e 54 4f 20 78 31 20 56 41 4c 55 45  RT INTO x1 VALUE
79d0: 53 28 27 43 68 61 72 6c 65 73 27 29 3b 0a 20 20  S('Charles');.  
79e0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
79f0: 78 31 20 56 41 4c 55 45 53 28 27 4a 61 6d 65 73  x1 VALUES('James
7a00: 27 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  ');.      INSERT
7a10: 20 49 4e 54 4f 20 78 31 20 56 41 4c 55 45 53 28   INTO x1 VALUES(
7a20: 27 4d 61 72 79 27 29 3b 0a 20 20 20 20 20 20 53  'Mary');.      S
7a30: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 78 31 3b  ELECT * FROM x1;
7a40: 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 43 68 61 72  .    }.  } {Char
7a50: 6c 65 73 20 4a 61 6d 65 73 20 4d 61 72 79 7d 0a  les James Mary}.
7a60: 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72  .  do_test pager
7a70: 31 2d 38 2e 24 74 6e 2e 32 20 7b 0a 20 20 20 20  1-8.$tn.2 {.    
7a80: 73 71 6c 69 74 65 33 20 64 62 32 20 24 66 69 6c  sqlite3 db2 $fil
7a90: 65 6e 61 6d 65 0a 20 20 20 20 63 61 74 63 68 73  ename.    catchs
7aa0: 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52  ql { SELECT * FR
7ab0: 4f 4d 20 78 31 20 7d 20 64 62 32 0a 20 20 7d 20  OM x1 } db2.  } 
7ac0: 7b 31 20 7b 6e 6f 20 73 75 63 68 20 74 61 62 6c  {1 {no such tabl
7ad0: 65 3a 20 78 31 7d 7d 0a 0a 20 20 64 6f 5f 65 78  e: x1}}..  do_ex
7ae0: 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65 72  ecsql_test pager
7af0: 31 2d 38 2e 24 74 6e 2e 33 20 7b 0a 20 20 20 20  1-8.$tn.3 {.    
7b00: 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 49 4e 53  BEGIN;.      INS
7b10: 45 52 54 20 49 4e 54 4f 20 78 31 20 56 41 4c 55  ERT INTO x1 VALU
7b20: 45 53 28 27 57 69 6c 6c 69 61 6d 27 29 3b 0a 20  ES('William');. 
7b30: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
7b40: 20 78 31 20 56 41 4c 55 45 53 28 27 41 6e 6e 65   x1 VALUES('Anne
7b50: 27 29 3b 0a 20 20 20 20 52 4f 4c 4c 42 41 43 4b  ');.    ROLLBACK
7b60: 3b 0a 20 20 7d 20 7b 7d 0a 7d 0a 0a 23 2d 2d 2d  ;.  } {}.}..#---
7b70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7b80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7b90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7ba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7bb0: 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 65 20 6e 65 78  ------.# The nex
7bc0: 74 20 62 6c 6f 63 6b 20 6f 66 20 74 65 73 74 73  t block of tests
7bd0: 20 2d 20 70 61 67 65 72 31 2d 39 2e 2a 20 2d 20   - pager1-9.* - 
7be0: 64 65 61 6c 20 77 69 74 68 20 69 6e 74 65 72 61  deal with intera
7bf0: 63 74 69 6f 6e 73 20 62 65 74 77 65 65 6e 0a 23  ctions between.#
7c00: 20 74 68 65 20 70 61 67 65 72 20 61 6e 64 20 74   the pager and t
7c10: 68 65 20 62 61 63 6b 75 70 20 41 50 49 2e 20 54  he backup API. T
7c20: 65 73 74 20 63 61 73 65 73 3a 0a 23 0a 23 20 20  est cases:.#.#  
7c30: 20 70 61 67 65 72 31 2d 39 2e 31 2e 2a 3a 20 54   pager1-9.1.*: T
7c40: 65 73 74 20 74 68 61 74 20 61 20 62 61 63 6b 75  est that a backu
7c50: 70 20 63 6f 6d 70 6c 65 74 65 73 20 73 75 63 63  p completes succ
7c60: 65 73 73 66 75 6c 6c 79 20 65 76 65 6e 20 69 66  essfully even if
7c70: 20 74 68 65 0a 23 20 20 20 20 20 20 20 20 20 20   the.#          
7c80: 20 20 20 20 20 20 20 73 6f 75 72 63 65 20 64 62         source db
7c90: 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 64   is written to d
7ca0: 75 72 69 6e 67 20 74 68 65 20 62 61 63 6b 75 70  uring the backup
7cb0: 20 6f 70 2e 0a 23 0a 23 20 20 20 70 61 67 65 72   op..#.#   pager
7cc0: 31 2d 39 2e 32 2e 2a 3a 20 54 65 73 74 20 74 68  1-9.2.*: Test th
7cd0: 61 74 20 61 20 62 61 63 6b 75 70 20 63 6f 6d 70  at a backup comp
7ce0: 6c 65 74 65 73 20 73 75 63 63 65 73 73 66 75 6c  letes successful
7cf0: 6c 79 20 65 76 65 6e 20 69 66 20 74 68 65 0a 23  ly even if the.#
7d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d10: 20 73 6f 75 72 63 65 20 64 62 20 69 73 20 77 72   source db is wr
7d20: 69 74 74 65 6e 20 74 6f 20 61 6e 64 20 74 68 65  itten to and the
7d30: 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 64 75  n rolled back du
7d40: 72 69 6e 67 20 61 20 0a 23 20 20 20 20 20 20 20  ring a .#       
7d50: 20 20 20 20 20 20 20 20 20 20 62 61 63 6b 75 70            backup
7d60: 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 23 0a 64 6f   operation..#.do
7d70: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 39 2e 30  _test pager1-9.0
7d80: 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f  .1 {.  faultsim_
7d90: 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65  delete_and_reope
7da0: 6e 0a 20 20 64 62 20 66 75 6e 63 20 61 5f 73 74  n.  db func a_st
7db0: 72 69 6e 67 20 61 5f 73 74 72 69 6e 67 0a 20 20  ring a_string.  
7dc0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52  execsql {.    PR
7dd0: 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 20  AGMA cache_size 
7de0: 3d 20 31 30 3b 0a 20 20 20 20 42 45 47 49 4e 3b  = 10;.    BEGIN;
7df0: 0a 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41  .      CREATE TA
7e00: 42 4c 45 20 61 62 28 61 2c 20 62 2c 20 55 4e 49  BLE ab(a, b, UNI
7e10: 51 55 45 28 61 2c 20 62 29 29 3b 0a 20 20 20 20  QUE(a, b));.    
7e20: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 62    INSERT INTO ab
7e30: 20 56 41 4c 55 45 53 28 20 61 5f 73 74 72 69 6e   VALUES( a_strin
7e40: 67 28 32 30 30 29 2c 20 61 5f 73 74 72 69 6e 67  g(200), a_string
7e50: 28 33 30 30 29 20 29 3b 0a 20 20 20 20 20 20 49  (300) );.      I
7e60: 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 20 53 45  NSERT INTO ab SE
7e70: 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28 32 30  LECT a_string(20
7e80: 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 33 30 30  0), a_string(300
7e90: 29 20 46 52 4f 4d 20 61 62 3b 0a 20 20 20 20 20  ) FROM ab;.     
7ea0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 20   INSERT INTO ab 
7eb0: 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28  SELECT a_string(
7ec0: 32 30 30 29 2c 20 61 5f 73 74 72 69 6e 67 28 33  200), a_string(3
7ed0: 30 30 29 20 46 52 4f 4d 20 61 62 3b 0a 20 20 20  00) FROM ab;.   
7ee0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61     INSERT INTO a
7ef0: 62 20 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e  b SELECT a_strin
7f00: 67 28 32 30 30 29 2c 20 61 5f 73 74 72 69 6e 67  g(200), a_string
7f10: 28 33 30 30 29 20 46 52 4f 4d 20 61 62 3b 0a 20  (300) FROM ab;. 
7f20: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
7f30: 20 61 62 20 53 45 4c 45 43 54 20 61 5f 73 74 72   ab SELECT a_str
7f40: 69 6e 67 28 32 30 30 29 2c 20 61 5f 73 74 72 69  ing(200), a_stri
7f50: 6e 67 28 33 30 30 29 20 46 52 4f 4d 20 61 62 3b  ng(300) FROM ab;
7f60: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
7f70: 54 4f 20 61 62 20 53 45 4c 45 43 54 20 61 5f 73  TO ab SELECT a_s
7f80: 74 72 69 6e 67 28 32 30 30 29 2c 20 61 5f 73 74  tring(200), a_st
7f90: 72 69 6e 67 28 33 30 30 29 20 46 52 4f 4d 20 61  ring(300) FROM a
7fa0: 62 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  b;.      INSERT 
7fb0: 49 4e 54 4f 20 61 62 20 53 45 4c 45 43 54 20 61  INTO ab SELECT a
7fc0: 5f 73 74 72 69 6e 67 28 32 30 30 29 2c 20 61 5f  _string(200), a_
7fd0: 73 74 72 69 6e 67 28 33 30 30 29 20 46 52 4f 4d  string(300) FROM
7fe0: 20 61 62 3b 0a 20 20 20 20 20 20 49 4e 53 45 52   ab;.      INSER
7ff0: 54 20 49 4e 54 4f 20 61 62 20 53 45 4c 45 43 54  T INTO ab SELECT
8000: 20 61 5f 73 74 72 69 6e 67 28 32 30 30 29 2c 20   a_string(200), 
8010: 61 5f 73 74 72 69 6e 67 28 33 30 30 29 20 46 52  a_string(300) FR
8020: 4f 4d 20 61 62 3b 0a 20 20 20 20 43 4f 4d 4d 49  OM ab;.    COMMI
8030: 54 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74  T;.  }.} {}.do_t
8040: 65 73 74 20 70 61 67 65 72 31 2d 39 2e 30 2e 32  est pager1-9.0.2
8050: 20 7b 0a 20 20 73 71 6c 69 74 65 33 20 64 62 32   {.  sqlite3 db2
8060: 20 74 65 73 74 2e 64 62 32 0a 20 20 64 62 32 20   test.db2.  db2 
8070: 65 76 61 6c 20 7b 20 50 52 41 47 4d 41 20 63 61  eval { PRAGMA ca
8080: 63 68 65 5f 73 69 7a 65 20 3d 20 31 30 20 7d 0a  che_size = 10 }.
8090: 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70    sqlite3_backup
80a0: 20 42 20 64 62 32 20 6d 61 69 6e 20 64 62 20 6d   B db2 main db m
80b0: 61 69 6e 0a 20 20 6c 69 73 74 20 5b 42 20 73 74  ain.  list [B st
80c0: 65 70 20 31 30 30 30 30 5d 20 5b 42 20 66 69 6e  ep 10000] [B fin
80d0: 69 73 68 5d 0a 7d 20 7b 53 51 4c 49 54 45 5f 44  ish].} {SQLITE_D
80e0: 4f 4e 45 20 53 51 4c 49 54 45 5f 4f 4b 7d 0a 64  ONE SQLITE_OK}.d
80f0: 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d 39 2e  o_test pager1-9.
8100: 30 2e 33 20 7b 0a 20 64 62 20 6f 6e 65 20 7b 53  0.3 {. db one {S
8110: 45 4c 45 43 54 20 6d 64 35 73 75 6d 28 61 2c 20  ELECT md5sum(a, 
8120: 62 29 20 46 52 4f 4d 20 61 62 7d 0a 7d 20 5b 64  b) FROM ab}.} [d
8130: 62 32 20 6f 6e 65 20 7b 53 45 4c 45 43 54 20 6d  b2 one {SELECT m
8140: 64 35 73 75 6d 28 61 2c 20 62 29 20 46 52 4f 4d  d5sum(a, b) FROM
8150: 20 61 62 7d 5d 0a 0a 64 6f 5f 74 65 73 74 20 70   ab}]..do_test p
8160: 61 67 65 72 31 2d 39 2e 31 2e 31 20 7b 0a 20 20  ager1-9.1.1 {.  
8170: 65 78 65 63 73 71 6c 20 7b 20 55 50 44 41 54 45  execsql { UPDATE
8180: 20 61 62 20 53 45 54 20 61 20 3d 20 61 5f 73 74   ab SET a = a_st
8190: 72 69 6e 67 28 32 30 31 29 20 7d 0a 20 20 73 71  ring(201) }.  sq
81a0: 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 42 20 64  lite3_backup B d
81b0: 62 32 20 6d 61 69 6e 20 64 62 20 6d 61 69 6e 0a  b2 main db main.
81c0: 20 20 42 20 73 74 65 70 20 33 30 0a 7d 20 7b 53    B step 30.} {S
81d0: 51 4c 49 54 45 5f 4f 4b 7d 0a 64 6f 5f 74 65 73  QLITE_OK}.do_tes
81e0: 74 20 70 61 67 65 72 31 2d 39 2e 31 2e 32 20 7b  t pager1-9.1.2 {
81f0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 55 50 44  .  execsql { UPD
8200: 41 54 45 20 61 62 20 53 45 54 20 62 20 3d 20 61  ATE ab SET b = a
8210: 5f 73 74 72 69 6e 67 28 33 30 31 29 20 7d 0a 20  _string(301) }. 
8220: 20 6c 69 73 74 20 5b 42 20 73 74 65 70 20 31 30   list [B step 10
8230: 30 30 30 5d 20 5b 42 20 66 69 6e 69 73 68 5d 0a  000] [B finish].
8240: 7d 20 7b 53 51 4c 49 54 45 5f 44 4f 4e 45 20 53  } {SQLITE_DONE S
8250: 51 4c 49 54 45 5f 4f 4b 7d 0a 64 6f 5f 74 65 73  QLITE_OK}.do_tes
8260: 74 20 70 61 67 65 72 31 2d 39 2e 31 2e 33 20 7b  t pager1-9.1.3 {
8270: 0a 20 64 62 20 6f 6e 65 20 7b 53 45 4c 45 43 54  . db one {SELECT
8280: 20 6d 64 35 73 75 6d 28 61 2c 20 62 29 20 46 52   md5sum(a, b) FR
8290: 4f 4d 20 61 62 7d 0a 7d 20 5b 64 62 32 20 6f 6e  OM ab}.} [db2 on
82a0: 65 20 7b 53 45 4c 45 43 54 20 6d 64 35 73 75 6d  e {SELECT md5sum
82b0: 28 61 2c 20 62 29 20 46 52 4f 4d 20 61 62 7d 5d  (a, b) FROM ab}]
82c0: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
82d0: 39 2e 31 2e 34 20 7b 20 65 78 65 63 73 71 6c 20  9.1.4 { execsql 
82e0: 7b 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a  { SELECT count(*
82f0: 29 20 46 52 4f 4d 20 61 62 20 7d 20 7d 20 7b 31  ) FROM ab } } {1
8300: 32 38 7d 0a 0a 64 6f 5f 74 65 73 74 20 70 61 67  28}..do_test pag
8310: 65 72 31 2d 39 2e 32 2e 31 20 7b 0a 20 20 65 78  er1-9.2.1 {.  ex
8320: 65 63 73 71 6c 20 7b 20 55 50 44 41 54 45 20 61  ecsql { UPDATE a
8330: 62 20 53 45 54 20 61 20 3d 20 61 5f 73 74 72 69  b SET a = a_stri
8340: 6e 67 28 32 30 32 29 20 7d 0a 20 20 73 71 6c 69  ng(202) }.  sqli
8350: 74 65 33 5f 62 61 63 6b 75 70 20 42 20 64 62 32  te3_backup B db2
8360: 20 6d 61 69 6e 20 64 62 20 6d 61 69 6e 0a 20 20   main db main.  
8370: 42 20 73 74 65 70 20 33 30 0a 7d 20 7b 53 51 4c  B step 30.} {SQL
8380: 49 54 45 5f 4f 4b 7d 0a 64 6f 5f 74 65 73 74 20  ITE_OK}.do_test 
8390: 70 61 67 65 72 31 2d 39 2e 32 2e 32 20 7b 0a 20  pager1-9.2.2 {. 
83a0: 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20   execsql { .    
83b0: 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 55 50 44  BEGIN;.      UPD
83c0: 41 54 45 20 61 62 20 53 45 54 20 62 20 3d 20 61  ATE ab SET b = a
83d0: 5f 73 74 72 69 6e 67 28 33 30 31 29 3b 0a 20 20  _string(301);.  
83e0: 20 20 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 7d 0a    ROLLBACK;.  }.
83f0: 20 20 6c 69 73 74 20 5b 42 20 73 74 65 70 20 31    list [B step 1
8400: 30 30 30 30 5d 20 5b 42 20 66 69 6e 69 73 68 5d  0000] [B finish]
8410: 0a 7d 20 7b 53 51 4c 49 54 45 5f 44 4f 4e 45 20  .} {SQLITE_DONE 
8420: 53 51 4c 49 54 45 5f 4f 4b 7d 0a 64 6f 5f 74 65  SQLITE_OK}.do_te
8430: 73 74 20 70 61 67 65 72 31 2d 39 2e 32 2e 33 20  st pager1-9.2.3 
8440: 7b 0a 20 64 62 20 6f 6e 65 20 7b 53 45 4c 45 43  {. db one {SELEC
8450: 54 20 6d 64 35 73 75 6d 28 61 2c 20 62 29 20 46  T md5sum(a, b) F
8460: 52 4f 4d 20 61 62 7d 0a 7d 20 5b 64 62 32 20 6f  ROM ab}.} [db2 o
8470: 6e 65 20 7b 53 45 4c 45 43 54 20 6d 64 35 73 75  ne {SELECT md5su
8480: 6d 28 61 2c 20 62 29 20 46 52 4f 4d 20 61 62 7d  m(a, b) FROM ab}
8490: 5d 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31  ].do_test pager1
84a0: 2d 39 2e 32 2e 34 20 7b 20 65 78 65 63 73 71 6c  -9.2.4 { execsql
84b0: 20 7b 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28   { SELECT count(
84c0: 2a 29 20 46 52 4f 4d 20 61 62 20 7d 20 7d 20 7b  *) FROM ab } } {
84d0: 31 32 38 7d 0a 64 62 20 63 6c 6f 73 65 0a 64 62  128}.db close.db
84e0: 32 20 63 6c 6f 73 65 0a 0a 23 2d 2d 2d 2d 2d 2d  2 close..#------
84f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8530: 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68 61 74 20  ---.# Test that 
8540: 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68  regardless of th
8550: 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
8560: 20 62 79 20 78 53 65 63 74 6f 72 53 69 7a 65 28   by xSectorSize(
8570: 29 2c 20 74 68 65 0a 23 20 6d 69 6e 69 6d 75 6d  ), the.# minimum
8580: 20 65 66 66 65 63 74 69 76 65 20 73 65 63 74 6f   effective secto
8590: 72 2d 73 69 7a 65 20 69 73 20 35 31 32 20 61 6e  r-size is 512 an
85a0: 64 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 36 35  d the maximum 65
85b0: 35 33 36 20 62 79 74 65 73 2e 0a 23 0a 74 65 73  536 bytes..#.tes
85c0: 74 76 66 73 20 74 76 20 2d 64 65 66 61 75 6c 74  tvfs tv -default
85d0: 20 31 0a 66 6f 72 65 61 63 68 20 73 65 63 74 6f   1.foreach secto
85e0: 72 73 69 7a 65 20 7b 0a 20 20 20 20 33 32 20 20  rsize {.    32  
85f0: 20 36 34 20 20 20 31 32 38 20 20 20 32 35 36 20   64   128   256 
8600: 20 20 35 31 32 20 20 20 31 30 32 34 20 20 20 32    512   1024   2
8610: 30 34 38 20 0a 20 20 20 20 34 30 39 36 20 38 31  048 .    4096 81
8620: 39 32 20 31 36 33 38 34 20 33 32 37 36 38 20 36  92 16384 32768 6
8630: 35 35 33 36 20 31 33 31 30 37 32 20 32 36 32 31  5536 131072 2621
8640: 34 34 0a 7d 20 7b 0a 20 20 74 76 20 73 65 63 74  44.} {.  tv sect
8650: 6f 72 73 69 7a 65 20 24 73 65 63 74 6f 72 73 69  orsize $sectorsi
8660: 7a 65 0a 20 20 73 65 74 20 65 66 66 20 24 73 65  ze.  set eff $se
8670: 63 74 6f 72 73 69 7a 65 0a 20 20 69 66 20 7b 24  ctorsize.  if {$
8680: 73 65 63 74 6f 72 73 69 7a 65 20 3c 20 35 31 32  sectorsize < 512
8690: 7d 20 20 20 7b 20 73 65 74 20 65 66 66 20 35 31  }   { set eff 51
86a0: 32 20 7d 0a 20 20 69 66 20 7b 24 73 65 63 74 6f  2 }.  if {$secto
86b0: 72 73 69 7a 65 20 3e 20 36 35 35 33 36 7d 20 7b  rsize > 65536} {
86c0: 20 73 65 74 20 65 66 66 20 36 35 35 33 36 20 7d   set eff 65536 }
86d0: 0a 0a 20 20 64 6f 5f 74 65 73 74 20 70 61 67 65  ..  do_test page
86e0: 72 31 2d 31 30 2e 24 73 65 63 74 6f 72 73 69 7a  r1-10.$sectorsiz
86f0: 65 20 7b 0a 20 20 20 20 66 61 75 6c 74 73 69 6d  e {.    faultsim
8700: 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70  _delete_and_reop
8710: 65 6e 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b  en.    execsql {
8720: 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 6a 6f  .      PRAGMA jo
8730: 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 50 45 52  urnal_mode = PER
8740: 53 49 53 54 3b 0a 20 20 20 20 20 20 50 52 41 47  SIST;.      PRAG
8750: 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20 31  MA page_size = 1
8760: 30 32 34 3b 0a 20 20 20 20 20 20 43 52 45 41 54  024;.      CREAT
8770: 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29  E TABLE t1(a, b)
8780: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 69 6c 65  ;.    }.    file
8790: 20 73 69 7a 65 20 74 65 73 74 2e 64 62 2d 6a 6f   size test.db-jo
87a0: 75 72 6e 61 6c 0a 20 20 7d 20 5b 65 78 70 72 20  urnal.  } [expr 
87b0: 24 73 65 63 74 6f 72 73 69 7a 65 20 3e 20 36 35  $sectorsize > 65
87c0: 35 33 36 20 3f 20 36 35 35 33 36 20 3a 20 24 73  536 ? 65536 : $s
87d0: 65 63 74 6f 72 73 69 7a 65 5d 0a 7d 0a 64 62 20  ectorsize].}.db 
87e0: 63 6c 6f 73 65 0a 74 76 20 64 65 6c 65 74 65 0a  close.tv delete.
87f0: 0a 74 65 73 74 76 66 73 20 74 76 20 2d 64 65 66  .testvfs tv -def
8800: 61 75 6c 74 20 31 0a 66 61 75 6c 74 73 69 6d 5f  ault 1.faultsim_
8810: 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65  delete_and_reope
8820: 6e 0a 64 62 20 66 75 6e 63 20 61 5f 73 74 72 69  n.db func a_stri
8830: 6e 67 20 61 5f 73 74 72 69 6e 67 0a 64 6f 5f 65  ng a_string.do_e
8840: 78 65 63 73 71 6c 5f 74 65 73 74 20 70 61 67 65  xecsql_test page
8850: 72 31 2d 31 31 2e 31 20 7b 0a 20 20 50 52 41 47  r1-11.1 {.  PRAG
8860: 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 20 3d 20  MA cache_size = 
8870: 31 30 3b 0a 20 20 42 45 47 49 4e 3b 0a 20 20 20  10;.  BEGIN;.   
8880: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 7a 7a   CREATE TABLE zz
8890: 28 74 6f 70 20 50 52 49 4d 41 52 59 20 4b 45 59  (top PRIMARY KEY
88a0: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
88b0: 54 4f 20 7a 7a 20 56 41 4c 55 45 53 28 61 5f 73  TO zz VALUES(a_s
88c0: 74 72 69 6e 67 28 32 32 32 29 29 3b 0a 20 20 20  tring(222));.   
88d0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 7a 7a 20   INSERT INTO zz 
88e0: 53 45 4c 45 43 54 20 61 5f 73 74 72 69 6e 67 28  SELECT a_string(
88f0: 28 53 45 4c 45 43 54 20 32 32 32 2b 6d 61 78 28  (SELECT 222+max(
8900: 72 6f 77 69 64 29 20 46 52 4f 4d 20 7a 7a 29 29  rowid) FROM zz))
8910: 20 46 52 4f 4d 20 7a 7a 3b 0a 20 20 20 20 49 4e   FROM zz;.    IN
8920: 53 45 52 54 20 49 4e 54 4f 20 7a 7a 20 53 45 4c  SERT INTO zz SEL
8930: 45 43 54 20 61 5f 73 74 72 69 6e 67 28 28 53 45  ECT a_string((SE
8940: 4c 45 43 54 20 32 32 32 2b 6d 61 78 28 72 6f 77  LECT 222+max(row
8950: 69 64 29 20 46 52 4f 4d 20 7a 7a 29 29 20 46 52  id) FROM zz)) FR
8960: 4f 4d 20 7a 7a 3b 0a 20 20 20 20 49 4e 53 45 52  OM zz;.    INSER
8970: 54 20 49 4e 54 4f 20 7a 7a 20 53 45 4c 45 43 54  T INTO zz SELECT
8980: 20 61 5f 73 74 72 69 6e 67 28 28 53 45 4c 45 43   a_string((SELEC
8990: 54 20 32 32 32 2b 6d 61 78 28 72 6f 77 69 64 29  T 222+max(rowid)
89a0: 20 46 52 4f 4d 20 7a 7a 29 29 20 46 52 4f 4d 20   FROM zz)) FROM 
89b0: 7a 7a 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  zz;.    INSERT I
89c0: 4e 54 4f 20 7a 7a 20 53 45 4c 45 43 54 20 61 5f  NTO zz SELECT a_
89d0: 73 74 72 69 6e 67 28 28 53 45 4c 45 43 54 20 32  string((SELECT 2
89e0: 32 32 2b 6d 61 78 28 72 6f 77 69 64 29 20 46 52  22+max(rowid) FR
89f0: 4f 4d 20 7a 7a 29 29 20 46 52 4f 4d 20 7a 7a 3b  OM zz)) FROM zz;
8a00: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
8a10: 20 7a 7a 20 53 45 4c 45 43 54 20 61 5f 73 74 72   zz SELECT a_str
8a20: 69 6e 67 28 28 53 45 4c 45 43 54 20 32 32 32 2b  ing((SELECT 222+
8a30: 6d 61 78 28 72 6f 77 69 64 29 20 46 52 4f 4d 20  max(rowid) FROM 
8a40: 7a 7a 29 29 20 46 52 4f 4d 20 7a 7a 3b 0a 20 20  zz)) FROM zz;.  
8a50: 43 4f 4d 4d 49 54 3b 0a 20 20 42 45 47 49 4e 3b  COMMIT;.  BEGIN;
8a60: 0a 20 20 20 20 55 50 44 41 54 45 20 7a 7a 20 53  .    UPDATE zz S
8a70: 45 54 20 74 6f 70 20 3d 20 61 5f 73 74 72 69 6e  ET top = a_strin
8a80: 67 28 33 34 35 29 3b 0a 7d 20 7b 7d 0a 0a 70 72  g(345);.} {}..pr
8a90: 6f 63 20 6c 6f 63 6b 6f 75 74 20 7b 6d 65 74 68  oc lockout {meth
8aa0: 6f 64 20 61 72 67 73 7d 20 7b 20 72 65 74 75 72  od args} { retur
8ab0: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 7d  n SQLITE_IOERR }
8ac0: 0a 74 76 20 73 63 72 69 70 74 20 6c 6f 63 6b 6f  .tv script locko
8ad0: 75 74 0a 74 76 20 66 69 6c 74 65 72 20 7b 78 57  ut.tv filter {xW
8ae0: 72 69 74 65 20 78 54 72 75 6e 63 61 74 65 20 78  rite xTruncate x
8af0: 53 79 6e 63 7d 0a 64 6f 5f 63 61 74 63 68 73 71  Sync}.do_catchsq
8b00: 6c 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 31  l_test pager1-11
8b10: 2e 32 20 7b 20 43 4f 4d 4d 49 54 20 7d 20 7b 31  .2 { COMMIT } {1
8b20: 20 7b 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72   {disk I/O error
8b30: 7d 7d 0a 0a 74 76 20 73 63 72 69 70 74 20 7b 7d  }}..tv script {}
8b40: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
8b50: 31 31 2e 33 20 7b 0a 20 20 73 71 6c 69 74 65 33  11.3 {.  sqlite3
8b60: 20 64 62 32 20 74 65 73 74 2e 64 62 0a 20 20 65   db2 test.db.  e
8b70: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41  xecsql {.    PRA
8b80: 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
8b90: 20 3d 20 54 52 55 4e 43 41 54 45 3b 0a 20 20 20   = TRUNCATE;.   
8ba0: 20 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74   PRAGMA integrit
8bb0: 79 5f 63 68 65 63 6b 3b 0a 20 20 7d 20 64 62 32  y_check;.  } db2
8bc0: 0a 7d 20 7b 74 72 75 6e 63 61 74 65 20 6f 6b 7d  .} {truncate ok}
8bd0: 0a 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d  .do_test pager1-
8be0: 31 31 2e 34 20 7b 0a 20 20 64 62 32 20 63 6c 6f  11.4 {.  db2 clo
8bf0: 73 65 0a 20 20 66 69 6c 65 20 73 69 7a 65 20 74  se.  file size t
8c00: 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 7d  est.db-journal.}
8c10: 20 7b 30 7d 0a 62 72 65 61 6b 70 6f 69 6e 74 0a   {0}.breakpoint.
8c20: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
8c30: 70 61 67 65 72 31 2d 31 31 2e 35 20 7b 20 53 45  pager1-11.5 { SE
8c40: 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
8c50: 4f 4d 20 7a 7a 20 7d 20 7b 33 32 7d 0a 64 62 20  OM zz } {32}.db 
8c60: 63 6c 6f 73 65 0a 74 76 20 64 65 6c 65 74 65 0a  close.tv delete.
8c70: 20 20 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    .#------------
8c80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8c90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8ca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
8cc0: 54 65 73 74 20 22 50 52 41 47 4d 41 20 70 61 67  Test "PRAGMA pag
8cd0: 65 5f 73 69 7a 65 22 0a 23 0a 66 6f 72 65 61 63  e_size".#.foreac
8ce0: 68 20 70 61 67 65 73 69 7a 65 20 7b 0a 20 20 20  h pagesize {.   
8cf0: 20 35 31 32 20 20 20 31 30 32 34 20 20 20 32 30   512   1024   20
8d00: 34 38 20 34 30 39 36 20 38 31 39 32 20 31 36 33  48 4096 8192 163
8d10: 38 34 20 33 32 37 36 38 20 0a 7d 20 7b 0a 20 20  84 32768 .} {.  
8d20: 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f  faultsim_delete_
8d30: 61 6e 64 5f 72 65 6f 70 65 6e 0a 0a 20 20 64 6f  and_reopen..  do
8d40: 5f 74 65 73 74 20 70 61 67 65 72 31 2d 31 32 2e  _test pager1-12.
8d50: 24 70 61 67 65 73 69 7a 65 2e 31 20 7b 0a 20 20  $pagesize.1 {.  
8d60: 20 20 73 71 6c 69 74 65 33 20 64 62 32 20 74 65    sqlite3 db2 te
8d70: 73 74 2e 64 62 0a 20 20 20 20 65 78 65 63 73 71  st.db.    execsq
8d80: 6c 20 22 0a 20 20 20 20 20 20 50 52 41 47 4d 41  l ".      PRAGMA
8d90: 20 70 61 67 65 5f 73 69 7a 65 20 3d 20 24 70 61   page_size = $pa
8da0: 67 65 73 69 7a 65 3b 0a 20 20 20 20 20 20 43 52  gesize;.      CR
8db0: 45 41 54 45 20 56 49 45 57 20 76 20 41 53 20 53  EATE VIEW v AS S
8dc0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 71 6c  ELECT * FROM sql
8dd0: 69 74 65 5f 6d 61 73 74 65 72 3b 0a 20 20 20 20  ite_master;.    
8de0: 22 20 64 62 32 0a 20 20 20 20 66 69 6c 65 20 73  " db2.    file s
8df0: 69 7a 65 20 74 65 73 74 2e 64 62 0a 20 20 7d 20  ize test.db.  } 
8e00: 24 70 61 67 65 73 69 7a 65 0a 20 20 64 6f 5f 74  $pagesize.  do_t
8e10: 65 73 74 20 70 61 67 65 72 31 2d 31 32 2e 24 70  est pager1-12.$p
8e20: 61 67 65 73 69 7a 65 2e 32 20 7b 0a 20 20 20 20  agesize.2 {.    
8e30: 73 71 6c 69 74 65 33 20 64 62 32 20 74 65 73 74  sqlite3 db2 test
8e40: 2e 64 62 0a 20 20 20 20 65 78 65 63 73 71 6c 20  .db.    execsql 
8e50: 7b 20 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20  { .      SELECT 
8e60: 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 76 3b  count(*) FROM v;
8e70: 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 6d 61  .      PRAGMA ma
8e80: 69 6e 2e 70 61 67 65 5f 73 69 7a 65 3b 0a 20 20  in.page_size;.  
8e90: 20 20 7d 20 64 62 32 0a 20 20 7d 20 5b 6c 69 73    } db2.  } [lis
8ea0: 74 20 31 20 24 70 61 67 65 73 69 7a 65 5d 0a 20  t 1 $pagesize]. 
8eb0: 20 64 6f 5f 74 65 73 74 20 70 61 67 65 72 31 2d   do_test pager1-
8ec0: 31 32 2e 24 70 61 67 65 73 69 7a 65 2e 33 20 7b  12.$pagesize.3 {
8ed0: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 0a  .    execsql { .
8ee0: 20 20 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75        SELECT cou
8ef0: 6e 74 28 2a 29 20 46 52 4f 4d 20 76 3b 0a 20 20  nt(*) FROM v;.  
8f00: 20 20 20 20 50 52 41 47 4d 41 20 6d 61 69 6e 2e      PRAGMA main.
8f10: 70 61 67 65 5f 73 69 7a 65 3b 0a 20 20 20 20 7d  page_size;.    }
8f20: 0a 20 20 7d 20 5b 6c 69 73 74 20 31 20 24 70 61  .  } [list 1 $pa
8f30: 67 65 73 69 7a 65 5d 0a 20 20 64 62 32 20 63 6c  gesize].  db2 cl
8f40: 6f 73 65 0a 7d 0a 0a 66 69 6e 69 73 68 5f 74 65  ose.}..finish_te
8f50: 73 74 0a 0a                                      st..