/ Hex Artifact Content
Login

Artifact 141c39ea650c1365e85a49e402fa05cb9617fb97:


0000: 23 20 32 30 30 34 20 41 75 67 75 73 74 20 33 30  # 2004 August 30
0010: 20 7b 7d 0a 23 0a 23 20 54 68 65 20 61 75 74 68   {}.#.# The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 23 20 61 20 6c 65 67  place of.# a leg
0060: 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20  al notice, here 
0070: 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a 23  is a blessing:.#
0080: 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 20 64 6f  .#    May you do
0090: 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 20 65 76   good and not ev
00a0: 69 6c 2e 0a 23 20 20 20 20 4d 61 79 20 79 6f 75  il..#    May you
00b0: 20 66 69 6e 64 20 66 6f 72 67 69 76 65 6e 65 73   find forgivenes
00c0: 73 20 66 6f 72 20 79 6f 75 72 73 65 6c 66 20 61  s for yourself a
00d0: 6e 64 20 66 6f 72 67 69 76 65 20 6f 74 68 65 72  nd forgive other
00e0: 73 2e 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 20  s..#    May you 
00f0: 73 68 61 72 65 20 66 72 65 65 6c 79 2c 20 6e 65  share freely, ne
0100: 76 65 72 20 74 61 6b 69 6e 67 20 6d 6f 72 65 20  ver taking more 
0110: 74 68 61 6e 20 79 6f 75 20 67 69 76 65 2e 0a 23  than you give..#
0120: 0a 23 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 2a 2a 2a 2a 2a 0a 23 20 54 68 69 73  *********.# This
0170: 20 66 69 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 73   file implements
0180: 20 72 65 67 72 65 73 73 69 6f 6e 20 74 65 73 74   regression test
0190: 73 20 66 6f 72 20 53 51 4c 69 74 65 20 6c 69 62  s for SQLite lib
01a0: 72 61 72 79 2e 0a 23 0a 23 20 54 68 69 73 20 66  rary..#.# This f
01b0: 69 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74  ile implements t
01c0: 65 73 74 73 20 74 6f 20 6d 61 6b 65 20 73 75 72  ests to make sur
01d0: 65 20 53 51 4c 69 74 65 20 64 6f 65 73 20 6e 6f  e SQLite does no
01e0: 74 20 63 72 61 73 68 20 6f 72 0a 23 20 73 65 67  t crash or.# seg
01f0: 66 61 75 6c 74 20 69 66 20 69 74 20 73 65 65 73  fault if it sees
0200: 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62   a corrupt datab
0210: 61 73 65 20 66 69 6c 65 2e 0a 23 0a 23 20 24 49  ase file..#.# $I
0220: 64 3a 20 63 6f 72 72 75 70 74 2e 74 65 73 74 2c  d: corrupt.test,
0230: 76 20 31 2e 31 32 20 32 30 30 39 2f 30 37 2f 31  v 1.12 2009/07/1
0240: 33 20 30 39 3a 34 31 3a 34 35 20 64 61 6e 69 65  3 09:41:45 danie
0250: 6c 6b 31 39 37 37 20 45 78 70 20 24 0a 0a 63 61  lk1977 Exp $..ca
0260: 74 63 68 20 7b 66 6f 72 63 65 64 65 6c 65 74 65  tch {forcedelete
0270: 20 74 65 73 74 2e 64 62 20 74 65 73 74 2e 64 62   test.db test.db
0280: 2d 6a 6f 75 72 6e 61 6c 20 74 65 73 74 2e 62 75  -journal test.bu
0290: 7d 0a 0a 73 65 74 20 74 65 73 74 64 69 72 20 5b  }..set testdir [
02a0: 66 69 6c 65 20 64 69 72 6e 61 6d 65 20 24 61 72  file dirname $ar
02b0: 67 76 30 5d 0a 73 6f 75 72 63 65 20 24 74 65 73  gv0].source $tes
02c0: 74 64 69 72 2f 74 65 73 74 65 72 2e 74 63 6c 0a  tdir/tester.tcl.
02d0: 0a 23 20 44 6f 20 6e 6f 74 20 75 73 65 20 61 20  .# Do not use a 
02e0: 63 6f 64 65 63 20 66 6f 72 20 74 65 73 74 73 20  codec for tests 
02f0: 69 6e 20 74 68 69 73 20 66 69 6c 65 2c 20 61 73  in this file, as
0300: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
0310: 6c 65 20 69 73 0a 23 20 6d 61 6e 69 70 75 6c 61  le is.# manipula
0320: 74 65 64 20 64 69 72 65 63 74 6c 79 20 75 73 69  ted directly usi
0330: 6e 67 20 74 63 6c 20 73 63 72 69 70 74 73 20 28  ng tcl scripts (
0340: 75 73 69 6e 67 20 74 68 65 20 5b 68 65 78 69 6f  using the [hexio
0350: 5f 77 72 69 74 65 5d 20 63 6f 6d 6d 61 6e 64 29  _write] command)
0360: 2e 0a 23 0a 64 6f 5f 6e 6f 74 5f 75 73 65 5f 63  ..#.do_not_use_c
0370: 6f 64 65 63 0a 0a 23 20 54 68 65 73 65 20 74 65  odec..# These te
0380: 73 74 73 20 64 65 61 6c 20 77 69 74 68 20 63 6f  sts deal with co
0390: 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20 66  rrupt database f
03a0: 69 6c 65 73 0a 23 0a 64 61 74 61 62 61 73 65 5f  iles.#.database_
03b0: 6d 61 79 5f 62 65 5f 63 6f 72 72 75 70 74 0a 0a  may_be_corrupt..
03c0: 23 20 43 6f 6e 73 74 72 75 63 74 20 61 20 6c 61  # Construct a la
03d0: 72 67 65 20 64 61 74 61 62 61 73 65 20 66 6f 72  rge database for
03e0: 20 74 65 73 74 69 6e 67 2e 0a 23 0a 64 6f 5f 74   testing..#.do_t
03f0: 65 73 74 20 63 6f 72 72 75 70 74 2d 31 2e 31 20  est corrupt-1.1 
0400: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
0410: 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 43 52 45    BEGIN;.    CRE
0420: 41 54 45 20 54 41 42 4c 45 20 74 31 28 78 29 3b  ATE TABLE t1(x);
0430: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
0440: 20 74 31 20 56 41 4c 55 45 53 28 72 61 6e 64 73   t1 VALUES(rands
0450: 74 72 28 31 30 30 2c 31 30 30 29 29 3b 0a 20 20  tr(100,100));.  
0460: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
0470: 20 56 41 4c 55 45 53 28 72 61 6e 64 73 74 72 28   VALUES(randstr(
0480: 39 30 2c 39 30 29 29 3b 0a 20 20 20 20 49 4e 53  90,90));.    INS
0490: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
04a0: 45 53 28 72 61 6e 64 73 74 72 28 38 30 2c 38 30  ES(randstr(80,80
04b0: 29 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ));.    INSERT I
04c0: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 78 20  NTO t1 SELECT x 
04d0: 7c 7c 20 72 61 6e 64 73 74 72 28 35 2c 35 29 20  || randstr(5,5) 
04e0: 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53  FROM t1;.    INS
04f0: 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
0500: 43 54 20 78 20 7c 7c 20 72 61 6e 64 73 74 72 28  CT x || randstr(
0510: 36 2c 36 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20  6,6) FROM t1;.  
0520: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
0530: 20 53 45 4c 45 43 54 20 78 20 7c 7c 20 72 61 6e   SELECT x || ran
0540: 64 73 74 72 28 37 2c 37 29 20 46 52 4f 4d 20 74  dstr(7,7) FROM t
0550: 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  1;.    INSERT IN
0560: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 78 20 7c  TO t1 SELECT x |
0570: 7c 20 72 61 6e 64 73 74 72 28 38 2c 38 29 20 46  | randstr(8,8) F
0580: 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45  ROM t1;.    INSE
0590: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
05a0: 53 28 72 61 6e 64 73 74 72 28 33 30 30 30 2c 33  S(randstr(3000,3
05b0: 30 30 30 29 29 3b 0a 20 20 20 20 49 4e 53 45 52  000));.    INSER
05c0: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
05d0: 20 78 20 7c 7c 20 72 61 6e 64 73 74 72 28 39 2c   x || randstr(9,
05e0: 39 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20  9) FROM t1;.    
05f0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
0600: 45 4c 45 43 54 20 78 20 7c 7c 20 72 61 6e 64 73  ELECT x || rands
0610: 74 72 28 31 30 2c 31 30 29 20 46 52 4f 4d 20 74  tr(10,10) FROM t
0620: 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  1;.    INSERT IN
0630: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 78 20 7c  TO t1 SELECT x |
0640: 7c 20 72 61 6e 64 73 74 72 28 31 31 2c 31 31 29  | randstr(11,11)
0650: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e   FROM t1;.    IN
0660: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
0670: 45 43 54 20 78 20 7c 7c 20 72 61 6e 64 73 74 72  ECT x || randstr
0680: 28 31 32 2c 31 32 29 20 46 52 4f 4d 20 74 31 3b  (12,12) FROM t1;
0690: 0a 20 20 20 20 43 52 45 41 54 45 20 49 4e 44 45  .    CREATE INDE
06a0: 58 20 74 31 69 31 20 4f 4e 20 74 31 28 78 29 3b  X t1i1 ON t1(x);
06b0: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
06c0: 45 20 74 32 20 41 53 20 53 45 4c 45 43 54 20 2a  E t2 AS SELECT *
06d0: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 44 45   FROM t1;.    DE
06e0: 4c 45 54 45 20 46 52 4f 4d 20 74 32 20 57 48 45  LETE FROM t2 WHE
06f0: 52 45 20 72 6f 77 69 64 25 35 21 3d 30 3b 0a 20  RE rowid%5!=0;. 
0700: 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 7d     COMMIT;.  }.}
0710: 20 7b 7d 0a 69 6e 74 65 67 72 69 74 79 5f 63 68   {}.integrity_ch
0720: 65 63 6b 20 63 6f 72 72 75 70 74 2d 31 2e 32 0a  eck corrupt-1.2.
0730: 0a 23 20 53 65 74 75 70 20 66 6f 72 20 74 68 65  .# Setup for the
0740: 20 74 65 73 74 73 2e 20 20 4d 61 6b 65 20 61 20   tests.  Make a 
0750: 62 61 63 6b 75 70 20 63 6f 70 79 20 6f 66 20 74  backup copy of t
0760: 68 65 20 67 6f 6f 64 20 64 61 74 61 62 61 73 65  he good database
0770: 20 69 6e 20 74 65 73 74 2e 62 75 2e 0a 23 20 43   in test.bu..# C
0780: 72 65 61 74 65 20 61 20 73 74 72 69 6e 67 20 6f  reate a string o
0790: 66 20 67 61 72 62 61 67 65 20 64 61 74 61 20 74  f garbage data t
07a0: 68 61 74 20 69 73 20 32 35 36 20 62 79 74 65 73  hat is 256 bytes
07b0: 20 6c 6f 6e 67 2e 0a 23 0a 66 6f 72 63 65 63 6f   long..#.forceco
07c0: 70 79 20 74 65 73 74 2e 64 62 20 74 65 73 74 2e  py test.db test.
07d0: 62 75 0a 73 65 74 20 66 73 69 7a 65 20 5b 66 69  bu.set fsize [fi
07e0: 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 5d  le size test.db]
07f0: 0a 73 65 74 20 6a 75 6e 6b 20 22 61 62 63 64 65  .set junk "abcde
0800: 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75  fghijklmnopqrstu
0810: 76 77 78 79 7a 30 31 32 33 34 35 36 37 38 39 41  vwxyz0123456789A
0820: 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51  BCDEFGHIJKLMNOPQ
0830: 52 53 54 55 56 57 58 59 5a 22 0a 77 68 69 6c 65  RSTUVWXYZ".while
0840: 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68   {[string length
0850: 20 24 6a 75 6e 6b 5d 3c 32 35 36 7d 20 7b 61 70   $junk]<256} {ap
0860: 70 65 6e 64 20 6a 75 6e 6b 20 24 6a 75 6e 6b 7d  pend junk $junk}
0870: 0a 73 65 74 20 6a 75 6e 6b 20 5b 73 74 72 69 6e  .set junk [strin
0880: 67 20 72 61 6e 67 65 20 24 6a 75 6e 6b 20 30 20  g range $junk 0 
0890: 32 35 35 5d 0a 0a 23 20 47 6f 20 74 68 72 6f 75  255]..# Go throu
08a0: 67 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20  gh the database 
08b0: 61 6e 64 20 77 72 69 74 65 20 67 61 72 62 61 67  and write garbag
08c0: 65 20 64 61 74 61 20 69 6e 74 6f 20 65 61 63 68  e data into each
08d0: 20 32 35 36 20 73 65 67 6d 65 6e 74 0a 23 20 6f   256 segment.# o
08e0: 66 20 74 68 65 20 66 69 6c 65 2e 20 20 54 68 65  f the file.  The
08f0: 6e 20 64 6f 20 76 61 72 69 6f 75 73 20 6f 70 65  n do various ope
0900: 72 61 74 69 6f 6e 73 20 6f 6e 20 74 68 65 20 66  rations on the f
0910: 69 6c 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  ile to make sure
0920: 20 74 68 61 74 0a 23 20 74 68 65 20 64 61 74 61   that.# the data
0930: 62 61 73 65 20 65 6e 67 69 6e 65 20 63 61 6e 20  base engine can 
0940: 72 65 63 6f 76 65 72 20 67 72 61 63 65 66 75 6c  recover graceful
0950: 6c 79 20 66 72 6f 6d 20 74 68 65 20 63 6f 72 72  ly from the corr
0960: 75 70 74 69 6f 6e 2e 0a 23 0a 66 6f 72 20 7b 73  uption..#.for {s
0970: 65 74 20 69 20 5b 65 78 70 72 20 7b 31 2a 32 35  et i [expr {1*25
0980: 36 7d 5d 7d 20 7b 24 69 3c 24 66 73 69 7a 65 2d  6}]} {$i<$fsize-
0990: 32 35 36 7d 20 7b 69 6e 63 72 20 69 20 32 35 36  256} {incr i 256
09a0: 7d 20 7b 0a 20 20 73 65 74 20 74 6e 20 5b 65 78  } {.  set tn [ex
09b0: 70 72 20 7b 24 69 2f 32 35 36 7d 5d 0a 20 20 64  pr {$i/256}].  d
09c0: 62 20 63 6c 6f 73 65 0a 20 20 66 6f 72 63 65 63  b close.  forcec
09d0: 6f 70 79 20 74 65 73 74 2e 62 75 20 74 65 73 74  opy test.bu test
09e0: 2e 64 62 0a 20 20 73 65 74 20 66 64 20 5b 6f 70  .db.  set fd [op
09f0: 65 6e 20 74 65 73 74 2e 64 62 20 72 2b 5d 0a 20  en test.db r+]. 
0a00: 20 66 63 6f 6e 66 69 67 75 72 65 20 24 66 64 20   fconfigure $fd 
0a10: 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 20 62 69 6e  -translation bin
0a20: 61 72 79 0a 20 20 73 65 65 6b 20 24 66 64 20 24  ary.  seek $fd $
0a30: 69 0a 20 20 70 75 74 73 20 2d 6e 6f 6e 65 77 6c  i.  puts -nonewl
0a40: 69 6e 65 20 24 66 64 20 24 6a 75 6e 6b 0a 20 20  ine $fd $junk.  
0a50: 63 6c 6f 73 65 20 24 66 64 0a 20 20 64 6f 5f 74  close $fd.  do_t
0a60: 65 73 74 20 63 6f 72 72 75 70 74 2d 32 2e 24 74  est corrupt-2.$t
0a70: 6e 2e 31 20 7b 0a 20 20 20 20 73 71 6c 69 74 65  n.1 {.    sqlite
0a80: 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20 20  3 db test.db.   
0a90: 20 63 61 74 63 68 73 71 6c 20 7b 53 45 4c 45 43   catchsql {SELEC
0aa0: 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
0ab0: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 7d 0a 20  sqlite_master}. 
0ac0: 20 20 20 73 65 74 20 78 20 7b 7d 0a 20 20 7d 20     set x {}.  } 
0ad0: 7b 7d 0a 20 20 64 6f 5f 74 65 73 74 20 63 6f 72  {}.  do_test cor
0ae0: 72 75 70 74 2d 32 2e 24 74 6e 2e 32 20 7b 0a 20  rupt-2.$tn.2 {. 
0af0: 20 20 20 63 61 74 63 68 73 71 6c 20 7b 53 45 4c     catchsql {SEL
0b00: 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
0b10: 4d 20 74 31 7d 0a 20 20 20 20 73 65 74 20 78 20  M t1}.    set x 
0b20: 7b 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74  {}.  } {}.  do_t
0b30: 65 73 74 20 63 6f 72 72 75 70 74 2d 32 2e 24 74  est corrupt-2.$t
0b40: 6e 2e 33 20 7b 0a 20 20 20 20 63 61 74 63 68 73  n.3 {.    catchs
0b50: 71 6c 20 7b 53 45 4c 45 43 54 20 63 6f 75 6e 74  ql {SELECT count
0b60: 28 2a 29 20 46 52 4f 4d 20 74 31 20 57 48 45 52  (*) FROM t1 WHER
0b70: 45 20 78 3e 27 61 62 63 64 65 66 27 7d 0a 20 20  E x>'abcdef'}.  
0b80: 20 20 73 65 74 20 78 20 7b 7d 0a 20 20 7d 20 7b    set x {}.  } {
0b90: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 63 6f 72 72  }.  do_test corr
0ba0: 75 70 74 2d 32 2e 24 74 6e 2e 34 20 7b 0a 20 20  upt-2.$tn.4 {.  
0bb0: 20 20 63 61 74 63 68 73 71 6c 20 7b 53 45 4c 45    catchsql {SELE
0bc0: 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
0bd0: 20 74 32 7d 0a 20 20 20 20 73 65 74 20 78 20 7b   t2}.    set x {
0be0: 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65  }.  } {}.  do_te
0bf0: 73 74 20 63 6f 72 72 75 70 74 2d 32 2e 24 74 6e  st corrupt-2.$tn
0c00: 2e 35 20 7b 0a 20 20 20 20 63 61 74 63 68 73 71  .5 {.    catchsq
0c10: 6c 20 7b 43 52 45 41 54 45 20 54 41 42 4c 45 20  l {CREATE TABLE 
0c20: 74 33 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46  t3 AS SELECT * F
0c30: 52 4f 4d 20 74 31 7d 0a 20 20 20 20 73 65 74 20  ROM t1}.    set 
0c40: 78 20 7b 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f  x {}.  } {}.  do
0c50: 5f 74 65 73 74 20 63 6f 72 72 75 70 74 2d 32 2e  _test corrupt-2.
0c60: 24 74 6e 2e 36 20 7b 0a 20 20 20 20 63 61 74 63  $tn.6 {.    catc
0c70: 68 73 71 6c 20 7b 44 52 4f 50 20 54 41 42 4c 45  hsql {DROP TABLE
0c80: 20 74 31 7d 0a 20 20 20 20 73 65 74 20 78 20 7b   t1}.    set x {
0c90: 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65  }.  } {}.  do_te
0ca0: 73 74 20 63 6f 72 72 75 70 74 2d 32 2e 24 74 6e  st corrupt-2.$tn
0cb0: 2e 37 20 7b 0a 20 20 20 20 63 61 74 63 68 73 71  .7 {.    catchsq
0cc0: 6c 20 7b 50 52 41 47 4d 41 20 69 6e 74 65 67 72  l {PRAGMA integr
0cd0: 69 74 79 5f 63 68 65 63 6b 7d 0a 20 20 20 20 73  ity_check}.    s
0ce0: 65 74 20 78 20 7b 7d 0a 20 20 7d 20 7b 7d 0a 0a  et x {}.  } {}..
0cf0: 20 20 23 20 43 68 65 63 6b 20 74 68 61 74 20 6e    # Check that n
0d00: 6f 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65  o page reference
0d10: 73 20 77 65 72 65 20 6c 65 61 6b 65 64 2e 0a 20  s were leaked.. 
0d20: 20 64 6f 5f 74 65 73 74 20 63 6f 72 72 75 70 74   do_test corrupt
0d30: 2d 32 2e 24 74 6e 2e 38 20 7b 0a 20 20 20 20 73  -2.$tn.8 {.    s
0d40: 65 74 20 62 74 20 5b 62 74 72 65 65 5f 66 72 6f  et bt [btree_fro
0d50: 6d 5f 64 62 20 64 62 5d 0a 20 20 20 20 64 62 5f  m_db db].    db_
0d60: 65 6e 74 65 72 20 64 62 0a 20 20 20 20 61 72 72  enter db.    arr
0d70: 61 79 20 73 65 74 20 73 74 61 74 73 20 5b 62 74  ay set stats [bt
0d80: 72 65 65 5f 70 61 67 65 72 5f 73 74 61 74 73 20  ree_pager_stats 
0d90: 24 62 74 5d 0a 20 20 20 20 64 62 5f 6c 65 61 76  $bt].    db_leav
0da0: 65 20 64 62 0a 20 20 20 20 73 65 74 20 73 74 61  e db.    set sta
0db0: 74 73 28 72 65 66 29 0a 20 20 7d 20 7b 30 7d 0a  ts(ref).  } {0}.
0dc0: 7d 20 20 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }  ..#----------
0dd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0de0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0df0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
0e10: 20 46 6f 72 20 74 68 65 73 65 20 74 65 73 74 73   For these tests
0e20: 2c 20 73 77 61 70 20 74 68 65 20 72 6f 6f 74 70  , swap the rootp
0e30: 61 67 65 20 65 6e 74 72 69 65 73 20 6f 66 20 74  age entries of t
0e40: 31 20 28 61 20 74 61 62 6c 65 29 20 61 6e 64 20  1 (a table) and 
0e50: 74 31 69 31 20 28 61 6e 0a 23 20 69 6e 64 65 78  t1i1 (an.# index
0e60: 20 6f 6e 20 74 31 29 20 69 6e 20 73 71 6c 69 74   on t1) in sqlit
0e70: 65 5f 6d 61 73 74 65 72 2e 20 54 68 65 6e 20 70  e_master. Then p
0e80: 65 72 66 6f 72 6d 20 61 20 66 65 77 20 64 69 66  erform a few dif
0e90: 66 65 72 65 6e 74 20 71 75 65 72 69 65 73 0a 23  ferent queries.#
0ea0: 20 61 6e 64 20 6d 61 6b 65 20 73 75 72 65 20 74   and make sure t
0eb0: 68 69 73 20 69 73 20 64 65 74 65 63 74 65 64 20  his is detected 
0ec0: 61 73 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 23  as corruption..#
0ed0: 0a 64 6f 5f 74 65 73 74 20 63 6f 72 72 75 70 74  .do_test corrupt
0ee0: 2d 33 2e 31 20 7b 0a 20 20 64 62 20 63 6c 6f 73  -3.1 {.  db clos
0ef0: 65 0a 20 20 66 6f 72 63 65 63 6f 70 79 20 74 65  e.  forcecopy te
0f00: 73 74 2e 62 75 20 74 65 73 74 2e 64 62 0a 20 20  st.bu test.db.  
0f10: 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e  sqlite3 db test.
0f20: 64 62 0a 20 20 6c 69 73 74 0a 7d 20 7b 7d 0a 64  db.  list.} {}.d
0f30: 6f 5f 74 65 73 74 20 63 6f 72 72 75 70 74 2d 33  o_test corrupt-3
0f40: 2e 32 20 7b 0a 20 20 73 65 74 20 74 31 5f 72 20  .2 {.  set t1_r 
0f50: 5b 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43 54  [execsql {SELECT
0f60: 20 72 6f 6f 74 70 61 67 65 20 46 52 4f 4d 20 73   rootpage FROM s
0f70: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 57 48 45  qlite_master WHE
0f80: 52 45 20 6e 61 6d 65 20 3d 20 27 74 31 69 31 27  RE name = 't1i1'
0f90: 7d 5d 0a 20 20 73 65 74 20 74 31 69 31 5f 72 20  }].  set t1i1_r 
0fa0: 5b 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43 54  [execsql {SELECT
0fb0: 20 72 6f 6f 74 70 61 67 65 20 46 52 4f 4d 20 73   rootpage FROM s
0fc0: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 57 48 45  qlite_master WHE
0fd0: 52 45 20 6e 61 6d 65 20 3d 20 27 74 31 27 7d 5d  RE name = 't1'}]
0fe0: 0a 20 20 73 65 74 20 63 6f 6f 6b 69 65 20 5b 65  .  set cookie [e
0ff0: 78 70 72 20 5b 65 78 65 63 73 71 6c 20 7b 50 52  xpr [execsql {PR
1000: 41 47 4d 41 20 73 63 68 65 6d 61 5f 76 65 72 73  AGMA schema_vers
1010: 69 6f 6e 7d 5d 20 2b 20 31 5d 0a 20 20 65 78 65  ion}] + 1].  exe
1020: 63 73 71 6c 20 22 0a 20 20 20 20 50 52 41 47 4d  csql ".    PRAGM
1030: 41 20 77 72 69 74 61 62 6c 65 5f 73 63 68 65 6d  A writable_schem
1040: 61 20 3d 20 31 3b 0a 20 20 20 20 55 50 44 41 54  a = 1;.    UPDAT
1050: 45 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  E sqlite_master 
1060: 53 45 54 20 72 6f 6f 74 70 61 67 65 20 3d 20 24  SET rootpage = $
1070: 74 31 5f 72 20 57 48 45 52 45 20 6e 61 6d 65 20  t1_r WHERE name 
1080: 3d 20 27 74 31 27 3b 0a 20 20 20 20 55 50 44 41  = 't1';.    UPDA
1090: 54 45 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  TE sqlite_master
10a0: 20 53 45 54 20 72 6f 6f 74 70 61 67 65 20 3d 20   SET rootpage = 
10b0: 24 74 31 69 31 5f 72 20 57 48 45 52 45 20 6e 61  $t1i1_r WHERE na
10c0: 6d 65 20 3d 20 27 74 31 69 31 27 3b 0a 20 20 20  me = 't1i1';.   
10d0: 20 50 52 41 47 4d 41 20 77 72 69 74 61 62 6c 65   PRAGMA writable
10e0: 5f 73 63 68 65 6d 61 20 3d 20 30 3b 0a 20 20 20  _schema = 0;.   
10f0: 20 50 52 41 47 4d 41 20 73 63 68 65 6d 61 5f 76   PRAGMA schema_v
1100: 65 72 73 69 6f 6e 20 3d 20 24 63 6f 6f 6b 69 65  ersion = $cookie
1110: 3b 0a 20 20 22 0a 7d 20 7b 7d 0a 0a 23 20 54 68  ;.  ".} {}..# Th
1120: 69 73 20 6f 6e 65 20 74 65 73 74 73 20 74 68 65  is one tests the
1130: 20 63 61 73 65 20 63 61 75 67 68 74 20 62 79 20   case caught by 
1140: 63 6f 64 65 20 69 6e 20 63 68 65 63 6b 69 6e 20  code in checkin 
1150: 5b 32 33 31 33 5d 2e 0a 64 6f 5f 74 65 73 74 20  [2313]..do_test 
1160: 63 6f 72 72 75 70 74 2d 33 2e 33 20 7b 0a 20 20  corrupt-3.3 {.  
1170: 64 62 20 63 6c 6f 73 65 0a 20 20 73 71 6c 69 74  db close.  sqlit
1180: 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20  e3 db test.db.  
1190: 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 49  catchsql {.    I
11a0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
11b0: 4c 55 45 53 28 27 61 62 63 27 29 3b 0a 20 20 7d  LUES('abc');.  }
11c0: 0a 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20  .} {1 {database 
11d0: 64 69 73 6b 20 69 6d 61 67 65 20 69 73 20 6d 61  disk image is ma
11e0: 6c 66 6f 72 6d 65 64 7d 7d 0a 64 6f 5f 74 65 73  lformed}}.do_tes
11f0: 74 20 63 6f 72 72 75 70 74 2d 33 2e 34 20 7b 0a  t corrupt-3.4 {.
1200: 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 73 71 6c    db close.  sql
1210: 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a  ite3 db test.db.
1220: 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20    catchsql {.   
1230: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
1240: 31 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b 64 61 74  1;.  }.} {1 {dat
1250: 61 62 61 73 65 20 64 69 73 6b 20 69 6d 61 67 65  abase disk image
1260: 20 69 73 20 6d 61 6c 66 6f 72 6d 65 64 7d 7d 0a   is malformed}}.
1270: 64 6f 5f 74 65 73 74 20 63 6f 72 72 75 70 74 2d  do_test corrupt-
1280: 33 2e 35 20 7b 0a 20 20 64 62 20 63 6c 6f 73 65  3.5 {.  db close
1290: 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 74 65  .  sqlite3 db te
12a0: 73 74 2e 64 62 0a 20 20 63 61 74 63 68 73 71 6c  st.db.  catchsql
12b0: 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20   {.    SELECT * 
12c0: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 6f 69  FROM t1 WHERE oi
12d0: 64 20 3d 20 31 30 3b 0a 20 20 7d 0a 7d 20 7b 31  d = 10;.  }.} {1
12e0: 20 7b 64 61 74 61 62 61 73 65 20 64 69 73 6b 20   {database disk 
12f0: 69 6d 61 67 65 20 69 73 20 6d 61 6c 66 6f 72 6d  image is malform
1300: 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 63 6f 72  ed}}.do_test cor
1310: 72 75 70 74 2d 33 2e 36 20 7b 0a 20 20 64 62 20  rupt-3.6 {.  db 
1320: 63 6c 6f 73 65 0a 20 20 73 71 6c 69 74 65 33 20  close.  sqlite3 
1330: 64 62 20 74 65 73 74 2e 64 62 0a 20 20 63 61 74  db test.db.  cat
1340: 63 68 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45  chsql {.    SELE
1350: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45  CT * FROM t1 WHE
1360: 52 45 20 78 20 3d 20 27 61 62 63 64 65 27 3b 0a  RE x = 'abcde';.
1370: 20 20 7d 0a 7d 20 7b 31 20 7b 64 61 74 61 62 61    }.} {1 {databa
1380: 73 65 20 64 69 73 6b 20 69 6d 61 67 65 20 69 73  se disk image is
1390: 20 6d 61 6c 66 6f 72 6d 65 64 7d 7d 0a 0a 64 6f   malformed}}..do
13a0: 5f 74 65 73 74 20 63 6f 72 72 75 70 74 2d 34 2e  _test corrupt-4.
13b0: 31 20 7b 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20  1 {.  db close. 
13c0: 20 66 6f 72 63 65 64 65 6c 65 74 65 20 74 65 73   forcedelete tes
13d0: 74 2e 64 62 20 74 65 73 74 2e 64 62 2d 6a 6f 75  t.db test.db-jou
13e0: 72 6e 61 6c 0a 20 20 73 71 6c 69 74 65 33 20 64  rnal.  sqlite3 d
13f0: 62 20 74 65 73 74 2e 64 62 0a 20 20 65 78 65 63  b test.db.  exec
1400: 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41  sql {.    PRAGMA
1410: 20 70 61 67 65 5f 73 69 7a 65 20 3d 20 31 30 32   page_size = 102
1420: 34 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  4;.    CREATE TA
1430: 42 4c 45 20 74 31 28 61 20 49 4e 54 45 47 45 52  BLE t1(a INTEGER
1440: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 20   PRIMARY KEY, b 
1450: 54 45 58 54 29 3b 0a 20 20 7d 0a 20 20 66 6f 72  TEXT);.  }.  for
1460: 20 7b 73 65 74 20 69 20 30 7d 20 7b 24 69 20 3c   {set i 0} {$i <
1470: 20 31 30 7d 20 7b 69 6e 63 72 20 69 7d 20 7b 0a   10} {incr i} {.
1480: 20 20 20 20 73 65 74 20 74 65 78 74 20 5b 73 74      set text [st
1490: 72 69 6e 67 20 72 65 70 65 61 74 20 24 69 20 32  ring repeat $i 2
14a0: 32 30 5d 0a 20 20 20 20 65 78 65 63 73 71 6c 20  20].    execsql 
14b0: 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31  { INSERT INTO t1
14c0: 20 56 41 4c 55 45 53 28 24 69 2c 20 24 74 65 78   VALUES($i, $tex
14d0: 74 29 20 7d 0a 20 20 7d 0a 20 20 65 78 65 63 73  t) }.  }.  execs
14e0: 71 6c 20 7b 20 43 52 45 41 54 45 20 49 4e 44 45  ql { CREATE INDE
14f0: 58 20 69 31 20 4f 4e 20 74 31 28 62 29 20 7d 0a  X i1 ON t1(b) }.
1500: 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 63 6f 72  } {}.do_test cor
1510: 72 75 70 74 2d 34 2e 32 20 7b 0a 20 20 73 65 74  rupt-4.2 {.  set
1520: 20 69 52 6f 6f 74 20 5b 64 62 20 6f 6e 65 20 7b   iRoot [db one {
1530: 53 45 4c 45 43 54 20 72 6f 6f 74 70 61 67 65 20  SELECT rootpage 
1540: 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
1550: 65 72 20 57 48 45 52 45 20 6e 61 6d 65 20 3d 20  er WHERE name = 
1560: 27 69 31 27 7d 5d 0a 20 20 73 65 74 20 69 4f 66  'i1'}].  set iOf
1570: 66 73 65 74 20 5b 68 65 78 69 6f 5f 67 65 74 5f  fset [hexio_get_
1580: 69 6e 74 20 5b 68 65 78 69 6f 5f 72 65 61 64 20  int [hexio_read 
1590: 74 65 73 74 2e 64 62 20 5b 65 78 70 72 20 31 32  test.db [expr 12
15a0: 2b 28 24 69 52 6f 6f 74 2d 31 29 2a 31 30 32 34  +($iRoot-1)*1024
15b0: 5d 20 32 5d 5d 0a 20 20 73 65 74 20 64 61 74 61  ] 2]].  set data
15c0: 20 5b 68 65 78 69 6f 5f 72 65 6e 64 65 72 5f 69   [hexio_render_i
15d0: 6e 74 33 32 20 5b 65 78 70 72 20 24 69 52 6f 6f  nt32 [expr $iRoo
15e0: 74 20 2d 20 31 5d 5d 0a 20 20 68 65 78 69 6f 5f  t - 1]].  hexio_
15f0: 77 72 69 74 65 20 74 65 73 74 2e 64 62 20 5b 65  write test.db [e
1600: 78 70 72 20 28 24 69 52 6f 6f 74 2d 31 29 2a 31  xpr ($iRoot-1)*1
1610: 30 32 34 20 2b 20 24 69 4f 66 66 73 65 74 5d 20  024 + $iOffset] 
1620: 24 64 61 74 61 0a 20 20 64 62 20 63 6c 6f 73 65  $data.  db close
1630: 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 74 65  .  sqlite3 db te
1640: 73 74 2e 64 62 0a 0a 20 20 23 20 54 68 65 20 66  st.db..  # The f
1650: 6f 6c 6c 6f 77 69 6e 67 20 44 45 4c 45 54 45 20  ollowing DELETE 
1660: 73 74 61 74 65 6d 65 6e 74 20 61 74 74 65 6d 70  statement attemp
1670: 74 73 20 74 6f 20 64 65 6c 65 74 65 20 61 20 63  ts to delete a c
1680: 65 6c 6c 20 73 74 6f 72 65 64 20 6f 6e 20 74 68  ell stored on th
1690: 65 0a 20 20 23 20 72 6f 6f 74 20 70 61 67 65 20  e.  # root page 
16a0: 6f 66 20 69 6e 64 65 78 20 69 31 2e 20 41 66 74  of index i1. Aft
16b0: 65 72 20 74 68 69 73 20 63 65 6c 6c 20 69 73 20  er this cell is 
16c0: 64 65 6c 65 74 65 64 20 69 74 20 6d 75 73 74 20  deleted it must 
16d0: 62 65 20 72 65 70 6c 61 63 65 64 0a 20 20 23 20  be replaced.  # 
16e0: 62 79 20 61 20 63 65 6c 6c 20 72 65 74 72 69 65  by a cell retrie
16f0: 76 65 64 20 66 72 6f 6d 20 74 68 65 20 63 68 69  ved from the chi
1700: 6c 64 20 70 61 67 65 20 28 61 20 6c 65 61 66 29  ld page (a leaf)
1710: 20 6f 66 20 74 68 65 20 64 65 6c 65 74 65 64 20   of the deleted 
1720: 63 65 6c 6c 2e 0a 20 20 23 20 54 68 69 73 20 77  cell..  # This w
1730: 69 6c 6c 20 66 61 69 6c 2c 20 61 73 20 74 68 65  ill fail, as the
1740: 20 62 6c 6f 63 6b 20 6d 6f 64 69 66 69 65 64 20   block modified 
1750: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6d 61  the database ima
1760: 67 65 20 73 6f 20 74 68 61 74 20 74 68 65 0a 20  ge so that the. 
1770: 20 23 20 63 68 69 6c 64 20 70 61 67 65 20 6f 66   # child page of
1780: 20 74 68 65 20 64 65 6c 65 74 65 64 20 63 65 6c   the deleted cel
1790: 6c 20 69 73 20 66 72 6f 6d 20 61 20 74 61 62 6c  l is from a tabl
17a0: 65 20 28 69 6e 74 6b 65 79 29 20 62 2d 74 72 65  e (intkey) b-tre
17b0: 65 2c 20 6e 6f 74 20 61 6e 0a 20 20 23 20 69 6e  e, not an.  # in
17c0: 64 65 78 20 62 2d 74 72 65 65 20 61 73 20 65 78  dex b-tree as ex
17d0: 70 65 63 74 65 64 2e 20 41 74 20 6f 6e 65 20 70  pected. At one p
17e0: 6f 69 6e 74 20 74 68 69 73 20 77 61 73 20 63 61  oint this was ca
17f0: 75 73 69 6e 67 20 61 6e 20 61 73 73 65 72 74 28  using an assert(
1800: 29 0a 20 20 23 20 74 6f 20 66 61 69 6c 2e 0a 20  ).  # to fail.. 
1810: 20 63 61 74 63 68 73 71 6c 20 7b 20 44 45 4c 45   catchsql { DELE
1820: 54 45 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45  TE FROM t1 WHERE
1830: 20 72 6f 77 69 64 20 3d 20 33 20 7d 0a 7d 20 7b   rowid = 3 }.} {
1840: 31 20 7b 64 61 74 61 62 61 73 65 20 64 69 73 6b  1 {database disk
1850: 20 69 6d 61 67 65 20 69 73 20 6d 61 6c 66 6f 72   image is malfor
1860: 6d 65 64 7d 7d 0a 0a 64 6f 5f 74 65 73 74 20 63  med}}..do_test c
1870: 6f 72 72 75 70 74 2d 35 2e 31 20 7b 0a 20 20 64  orrupt-5.1 {.  d
1880: 62 20 63 6c 6f 73 65 0a 20 20 66 6f 72 63 65 64  b close.  forced
1890: 65 6c 65 74 65 20 74 65 73 74 2e 64 62 20 74 65  elete test.db te
18a0: 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 20 20  st.db-journal.  
18b0: 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e  sqlite3 db test.
18c0: 64 62 0a 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  db..  execsql { 
18d0: 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65  PRAGMA page_size
18e0: 20 3d 20 31 30 32 34 20 7d 0a 20 20 73 65 74 20   = 1024 }.  set 
18f0: 63 74 20 22 43 52 45 41 54 45 20 54 41 42 4c 45  ct "CREATE TABLE
1900: 20 74 31 28 63 30 20 22 0a 20 20 73 65 74 20 69   t1(c0 ".  set i
1910: 20 30 0a 20 20 77 68 69 6c 65 20 7b 5b 73 74 72   0.  while {[str
1920: 69 6e 67 20 6c 65 6e 67 74 68 20 24 63 74 5d 20  ing length $ct] 
1930: 3c 20 39 35 30 7d 20 7b 20 61 70 70 65 6e 64 20  < 950} { append 
1940: 63 74 20 22 2c 20 63 5b 69 6e 63 72 20 69 5d 22  ct ", c[incr i]"
1950: 20 7d 0a 20 20 61 70 70 65 6e 64 20 63 74 20 22   }.  append ct "
1960: 29 22 0a 20 20 65 78 65 63 73 71 6c 20 24 63 74  )".  execsql $ct
1970: 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74 20 63  .} {}..do_test c
1980: 6f 72 72 75 70 74 2d 35 2e 32 20 7b 0a 20 20 64  orrupt-5.2 {.  d
1990: 62 20 63 6c 6f 73 65 0a 20 20 68 65 78 69 6f 5f  b close.  hexio_
19a0: 77 72 69 74 65 20 74 65 73 74 2e 64 62 20 31 30  write test.db 10
19b0: 38 20 30 30 30 30 30 30 30 30 20 0a 20 20 73 71  8 00000000 .  sq
19c0: 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62  lite3 db test.db
19d0: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20 53 45  .  catchsql { SE
19e0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 71 6c 69  LECT * FROM sqli
19f0: 74 65 5f 6d 61 73 74 65 72 20 7d 0a 7d 20 7b 31  te_master }.} {1
1a00: 20 7b 64 61 74 61 62 61 73 65 20 64 69 73 6b 20   {database disk 
1a10: 69 6d 61 67 65 20 69 73 20 6d 61 6c 66 6f 72 6d  image is malform
1a20: 65 64 7d 7d 0a 0a 23 20 41 74 20 6f 6e 65 20 70  ed}}..# At one p
1a30: 6f 69 6e 74 2c 20 74 68 65 20 73 70 65 63 69 66  oint, the specif
1a40: 69 63 20 63 6f 72 72 75 70 74 69 6f 6e 20 63 61  ic corruption ca
1a50: 75 73 65 64 20 62 79 20 74 68 69 73 20 74 65 73  used by this tes
1a60: 74 20 63 61 73 65 20 77 61 73 0a 23 20 63 61 75  t case was.# cau
1a70: 73 69 6e 67 20 61 20 62 75 66 66 65 72 20 6f 76  sing a buffer ov
1a80: 65 72 77 72 69 74 65 2e 20 41 6c 74 68 6f 75 67  erwrite. Althoug
1a90: 68 20 61 20 63 72 61 73 68 20 77 61 73 20 6e 65  h a crash was ne
1aa0: 76 65 72 20 64 65 6d 6f 6e 73 74 72 61 74 65 64  ver demonstrated
1ab0: 2c 0a 23 20 72 75 6e 6e 69 6e 67 20 74 68 69 73  ,.# running this
1ac0: 20 74 65 73 74 63 61 73 65 20 75 6e 64 65 72 20   testcase under 
1ad0: 76 61 6c 67 72 69 6e 64 20 72 65 76 65 61 6c 65  valgrind reveale
1ae0: 64 20 74 68 65 20 70 72 6f 62 6c 65 6d 2e 0a 64  d the problem..d
1af0: 6f 5f 74 65 73 74 20 63 6f 72 72 75 70 74 2d 36  o_test corrupt-6
1b00: 2e 31 20 7b 0a 20 20 64 62 20 63 6c 6f 73 65 0a  .1 {.  db close.
1b10: 20 20 66 6f 72 63 65 64 65 6c 65 74 65 20 74 65    forcedelete te
1b20: 73 74 2e 64 62 20 74 65 73 74 2e 64 62 2d 6a 6f  st.db test.db-jo
1b30: 75 72 6e 61 6c 0a 20 20 73 71 6c 69 74 65 33 20  urnal.  sqlite3 
1b40: 64 62 20 74 65 73 74 2e 64 62 0a 20 20 65 78 65  db test.db.  exe
1b50: 63 73 71 6c 20 7b 20 0a 20 20 20 20 50 52 41 47  csql { .    PRAG
1b60: 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20 31  MA page_size = 1
1b70: 30 32 34 3b 20 43 52 45 41 54 45 20 54 41 42 4c  024; CREATE TABL
1b80: 45 20 74 31 28 78 29 3b 0a 20 20 7d 0a 0a 20 20  E t1(x);.  }..  
1b90: 23 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20  # The root page 
1ba0: 6f 66 20 74 31 20 69 73 20 31 30 32 34 20 62 79  of t1 is 1024 by
1bb0: 74 65 73 20 69 6e 20 73 69 7a 65 2e 20 54 68 65  tes in size. The
1bc0: 20 68 65 61 64 65 72 20 69 73 20 38 20 62 79 74   header is 8 byt
1bd0: 65 73 2c 20 61 6e 64 0a 20 20 23 20 65 61 63 68  es, and.  # each
1be0: 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 69 6e   of the cells in
1bf0: 73 65 72 74 65 64 20 62 79 20 74 68 65 20 66 6f  serted by the fo
1c00: 6c 6c 6f 77 69 6e 67 20 49 4e 53 45 52 54 20 73  llowing INSERT s
1c10: 74 61 74 65 6d 65 6e 74 73 20 63 6f 6e 73 75 6d  tatements consum
1c20: 65 0a 20 20 23 20 31 36 20 62 79 74 65 73 20 28  e.  # 16 bytes (
1c30: 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 32 20  including the 2 
1c40: 62 79 74 65 20 63 65 6c 6c 2d 6f 66 66 73 65 74  byte cell-offset
1c50: 20 61 72 72 61 79 20 65 6e 74 72 79 29 2e 20 53   array entry). S
1c60: 6f 20 74 68 65 20 70 61 67 65 0a 20 20 23 20 63  o the page.  # c
1c70: 61 6e 20 63 6f 6e 74 61 69 6e 20 75 70 20 74 6f  an contain up to
1c80: 20 36 33 20 63 65 6c 6c 73 2e 0a 20 20 66 6f 72   63 cells..  for
1c90: 20 7b 73 65 74 20 69 20 30 7d 20 7b 24 69 20 3c   {set i 0} {$i <
1ca0: 20 36 33 7d 20 7b 69 6e 63 72 20 69 7d 20 7b 0a   63} {incr i} {.
1cb0: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e      execsql { IN
1cc0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
1cd0: 55 45 53 28 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  UES( randomblob(
1ce0: 31 30 29 20 29 20 7d 0a 20 20 7d 0a 0a 20 20 23  10) ) }.  }..  #
1cf0: 20 46 72 65 65 20 74 68 65 20 63 65 6c 6c 20 73   Free the cell s
1d00: 74 6f 72 65 64 20 72 69 67 68 74 20 61 74 20 74  tored right at t
1d10: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61  he end of the pa
1d20: 67 65 20 28 61 74 20 6f 66 66 73 65 74 20 70 67  ge (at offset pg
1d30: 73 7a 2d 31 34 29 2e 0a 20 20 65 78 65 63 73 71  sz-14)..  execsq
1d40: 6c 20 7b 20 44 45 4c 45 54 45 20 46 52 4f 4d 20  l { DELETE FROM 
1d50: 74 31 20 57 48 45 52 45 20 72 6f 77 69 64 3d 31  t1 WHERE rowid=1
1d60: 20 7d 0a 20 20 73 65 74 20 72 6f 6f 74 70 61 67   }.  set rootpag
1d70: 65 20 5b 64 62 20 6f 6e 65 20 7b 53 45 4c 45 43  e [db one {SELEC
1d80: 54 20 72 6f 6f 74 70 61 67 65 20 46 52 4f 4d 20  T rootpage FROM 
1d90: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 57 48  sqlite_master WH
1da0: 45 52 45 20 6e 61 6d 65 20 3d 20 27 74 31 27 7d  ERE name = 't1'}
1db0: 5d 0a 20 20 64 62 20 63 6c 6f 73 65 0a 0a 20 20  ].  db close..  
1dc0: 73 65 74 20 6f 66 66 73 65 74 20 5b 65 78 70 72  set offset [expr
1dd0: 20 28 24 72 6f 6f 74 70 61 67 65 20 2a 20 31 30   ($rootpage * 10
1de0: 32 34 29 2d 31 34 2b 32 5d 0a 20 20 68 65 78 69  24)-14+2].  hexi
1df0: 6f 5f 77 72 69 74 65 20 74 65 73 74 2e 64 62 20  o_write test.db 
1e00: 24 6f 66 66 73 65 74 20 30 30 46 46 0a 20 20 73  $offset 00FF.  s
1e10: 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64  qlite3 db test.d
1e20: 62 20 0a 0a 20 20 63 61 74 63 68 73 71 6c 20 7b  b ..  catchsql {
1e30: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
1e40: 56 41 4c 55 45 53 28 20 72 61 6e 64 6f 6d 62 6c  VALUES( randombl
1e50: 6f 62 28 31 30 29 20 29 20 7d 0a 7d 20 7b 31 20  ob(10) ) }.} {1 
1e60: 7b 64 61 74 61 62 61 73 65 20 64 69 73 6b 20 69  {database disk i
1e70: 6d 61 67 65 20 69 73 20 6d 61 6c 66 6f 72 6d 65  mage is malforme
1e80: 64 7d 7d 0a 0a 69 66 63 61 70 61 62 6c 65 20 6f  d}}..ifcapable o
1e90: 76 65 72 73 69 7a 65 5f 63 65 6c 6c 5f 63 68 65  versize_cell_che
1ea0: 63 6b 20 7b 0a 20 20 64 62 20 63 6c 6f 73 65 0a  ck {.  db close.
1eb0: 20 20 66 6f 72 63 65 64 65 6c 65 74 65 20 74 65    forcedelete te
1ec0: 73 74 2e 64 62 20 74 65 73 74 2e 64 62 2d 6a 6f  st.db test.db-jo
1ed0: 75 72 6e 61 6c 0a 20 20 73 71 6c 69 74 65 33 20  urnal.  sqlite3 
1ee0: 64 62 20 74 65 73 74 2e 64 62 0a 20 20 65 78 65  db test.db.  exe
1ef0: 63 73 71 6c 20 7b 20 0a 20 20 20 20 50 52 41 47  csql { .    PRAG
1f00: 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20 31  MA page_size = 1
1f10: 30 32 34 3b 20 43 52 45 41 54 45 20 54 41 42 4c  024; CREATE TABL
1f20: 45 20 74 31 28 78 29 3b 0a 20 20 7d 0a 0a 20 20  E t1(x);.  }..  
1f30: 64 6f 5f 74 65 73 74 20 63 6f 72 72 75 70 74 2d  do_test corrupt-
1f40: 37 2e 31 20 7b 0a 20 20 20 20 66 6f 72 20 7b 73  7.1 {.    for {s
1f50: 65 74 20 69 20 30 7d 20 7b 24 69 20 3c 20 33 39  et i 0} {$i < 39
1f60: 7d 20 7b 69 6e 63 72 20 69 7d 20 7b 0a 20 20 20  } {incr i} {.   
1f70: 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20     execsql {.   
1f80: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
1f90: 20 74 31 20 56 41 4c 55 45 53 28 58 27 30 30 30   t1 VALUES(X'000
1fa0: 31 30 30 30 32 30 30 30 33 30 30 30 34 30 30 30  1000200030004000
1fb0: 35 30 30 30 36 30 30 30 37 30 30 30 38 30 30 30  5000600070008000
1fc0: 39 30 30 30 41 27 29 3b 0a 20 20 20 20 20 20 7d  9000A');.      }
1fd0: 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 7d 0a 20 20  .    }.  } {}.  
1fe0: 64 62 20 63 6c 6f 73 65 0a 20 20 0a 20 20 23 20  db close.  .  # 
1ff0: 43 6f 72 72 75 70 74 20 74 68 65 20 72 6f 6f 74  Corrupt the root
2000: 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65 20 74   page of table t
2010: 31 20 73 6f 20 74 68 61 74 20 74 68 65 20 66 69  1 so that the fi
2020: 72 73 74 20 6f 66 66 73 65 74 20 69 6e 20 74 68  rst offset in th
2030: 65 20 0a 20 20 23 20 63 65 6c 6c 2d 6f 66 66 73  e .  # cell-offs
2040: 65 74 20 61 72 72 61 79 20 70 6f 69 6e 74 73 20  et array points 
2050: 74 6f 20 74 68 65 20 64 61 74 61 20 66 6f 72 20  to the data for 
2060: 74 68 65 20 53 51 4c 20 62 6c 6f 62 20 61 73 73  the SQL blob ass
2070: 6f 63 69 61 74 65 64 20 77 69 74 68 0a 20 20 23  ociated with.  #
2080: 20 72 65 63 6f 72 64 20 28 72 6f 77 69 64 3d 31   record (rowid=1
2090: 30 29 2e 20 54 68 65 20 72 6f 6f 74 20 70 61 67  0). The root pag
20a0: 65 20 73 74 69 6c 6c 20 70 61 73 73 65 73 20 74  e still passes t
20b0: 68 65 20 63 68 65 63 6b 73 20 69 6e 20 62 74 72  he checks in btr
20c0: 65 65 49 6e 69 74 50 61 67 65 28 29 2c 0a 20 20  eeInitPage(),.  
20d0: 23 20 62 65 63 61 75 73 65 20 74 68 65 20 73 74  # because the st
20e0: 61 72 74 20 6f 66 20 73 61 69 64 20 62 6c 6f 62  art of said blob
20f0: 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 74 68 65 20   looks like the 
2100: 73 74 61 72 74 20 6f 66 20 61 20 6c 65 67 69 74  start of a legit
2110: 69 6d 61 74 65 20 0a 20 20 23 20 70 61 67 65 20  imate .  # page 
2120: 63 65 6c 6c 2e 0a 20 20 23 0a 20 20 23 20 54 65  cell..  #.  # Te
2130: 73 74 20 63 61 73 65 20 63 63 2d 32 20 6f 76 65  st case cc-2 ove
2140: 72 77 72 69 74 65 73 20 74 68 65 20 62 6c 6f 62  rwrites the blob
2150: 20 73 6f 20 74 68 61 74 20 69 74 20 6e 6f 20 6c   so that it no l
2160: 6f 6e 67 65 72 20 6c 6f 6f 6b 73 20 6c 69 6b 65  onger looks like
2170: 20 61 0a 20 20 23 20 72 65 61 6c 20 63 65 6c 6c   a.  # real cell
2180: 2e 20 42 75 74 2c 20 62 79 20 74 68 65 20 74 69  . But, by the ti
2190: 6d 65 20 69 74 20 69 73 20 6f 76 65 72 77 72 69  me it is overwri
21a0: 74 74 65 6e 2c 20 62 74 72 65 65 49 6e 69 74 50  tten, btreeInitP
21b0: 61 67 65 28 29 20 68 61 73 20 61 6c 72 65 61 64  age() has alread
21c0: 79 0a 20 20 23 20 69 6e 69 74 69 61 6c 69 7a 65  y.  # initialize
21d0: 64 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 2c  d the root page,
21e0: 20 73 6f 20 6e 6f 20 63 6f 72 72 75 70 74 69 6f   so no corruptio
21f0: 6e 20 69 73 20 64 65 74 65 63 74 65 64 2e 0a 20  n is detected.. 
2200: 20 23 0a 20 20 23 20 54 65 73 74 20 63 61 73 65   #.  # Test case
2210: 20 63 63 2d 33 20 69 6e 73 65 72 74 73 20 61 6e   cc-3 inserts an
2220: 20 65 78 74 72 61 20 72 65 63 6f 72 64 20 69 6e   extra record in
2230: 74 6f 20 74 31 2c 20 66 6f 72 63 69 6e 67 20 62  to t1, forcing b
2240: 61 6c 61 6e 63 65 2d 64 65 65 70 65 72 0a 20 20  alance-deeper.  
2250: 23 20 74 6f 20 72 75 6e 2e 20 41 66 74 65 72 20  # to run. After 
2260: 63 6f 70 79 69 6e 67 20 74 68 65 20 63 6f 6e 74  copying the cont
2270: 65 6e 74 73 20 6f 66 20 74 68 65 20 72 6f 6f 74  ents of the root
2280: 20 70 61 67 65 20 74 6f 20 74 68 65 20 6e 65 77   page to the new
2290: 20 63 68 69 6c 64 2c 0a 20 20 23 20 62 74 72 65   child,.  # btre
22a0: 65 49 6e 69 74 50 61 67 65 28 29 20 69 73 20 63  eInitPage() is c
22b0: 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 63 68 69  alled on the chi
22c0: 6c 64 2e 20 54 68 69 73 20 74 69 6d 65 2c 20 69  ld. This time, i
22d0: 74 20 64 65 74 65 63 74 73 20 63 6f 72 72 75 70  t detects corrup
22e0: 74 69 6f 6e 0a 20 20 23 20 28 62 65 63 61 75 73  tion.  # (becaus
22f0: 65 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  e the start of t
2300: 68 65 20 62 6c 6f 62 20 61 73 73 6f 63 69 61 74  he blob associat
2310: 65 64 20 77 69 74 68 20 74 68 65 20 28 72 6f 77  ed with the (row
2320: 69 64 3d 31 30 29 20 72 65 63 6f 72 64 0a 20 20  id=10) record.  
2330: 23 20 6e 6f 20 6c 6f 6e 67 65 72 20 6c 6f 6f 6b  # no longer look
2340: 73 20 6c 69 6b 65 20 61 20 72 65 61 6c 20 63 65  s like a real ce
2350: 6c 6c 29 2e 20 41 74 20 6f 6e 65 20 70 6f 69 6e  ll). At one poin
2360: 74 20 74 68 65 20 63 6f 64 65 20 61 73 73 75 6d  t the code assum
2370: 65 64 20 74 68 61 74 20 0a 20 20 23 20 64 65 74  ed that .  # det
2380: 65 63 74 69 6e 67 20 63 6f 72 72 75 70 74 69 6f  ecting corruptio
2390: 6e 20 77 61 73 20 6e 6f 74 20 70 6f 73 73 69 62  n was not possib
23a0: 6c 65 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74  le at that point
23b0: 2c 20 61 6e 64 20 61 6e 20 61 73 73 65 72 74 28  , and an assert(
23c0: 29 20 66 61 69 6c 65 64 2e 0a 20 20 23 0a 20 20  ) failed..  #.  
23d0: 73 65 74 20 66 64 20 5b 6f 70 65 6e 20 74 65 73  set fd [open tes
23e0: 74 2e 64 62 20 72 2b 5d 0a 20 20 66 63 6f 6e 66  t.db r+].  fconf
23f0: 69 67 75 72 65 20 24 66 64 20 2d 74 72 61 6e 73  igure $fd -trans
2400: 6c 61 74 69 6f 6e 20 62 69 6e 61 72 79 20 2d 65  lation binary -e
2410: 6e 63 6f 64 69 6e 67 20 62 69 6e 61 72 79 0a 20  ncoding binary. 
2420: 20 73 65 65 6b 20 24 66 64 20 5b 65 78 70 72 20   seek $fd [expr 
2430: 31 30 32 34 2b 38 5d 0a 20 20 70 75 74 73 20 2d  1024+8].  puts -
2440: 6e 6f 6e 65 77 6c 69 6e 65 20 24 66 64 20 22 5c  nonewline $fd "\
2450: 78 30 33 5c 78 31 34 22 0a 20 20 63 6c 6f 73 65  x03\x14".  close
2460: 20 24 66 64 0a 20 20 0a 20 20 73 71 6c 69 74 65   $fd.  .  sqlite
2470: 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20 64  3 db test.db.  d
2480: 6f 5f 74 65 73 74 20 63 6f 72 72 75 70 74 2d 37  o_test corrupt-7
2490: 2e 32 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c  .2 {.    execsql
24a0: 20 7b 20 0a 20 20 20 20 20 20 55 50 44 41 54 45   { .      UPDATE
24b0: 20 74 31 20 53 45 54 20 78 20 3d 20 58 27 38 37   t1 SET x = X'87
24c0: 30 34 30 30 30 32 30 30 30 33 30 30 30 34 30 30  0400020003000400
24d0: 30 35 30 30 30 36 30 30 30 37 30 30 30 38 30 30  0500060007000800
24e0: 30 39 30 30 30 41 27 20 0a 20 20 20 20 20 20 57  09000A' .      W
24f0: 48 45 52 45 20 72 6f 77 69 64 20 3d 20 31 30 3b  HERE rowid = 10;
2500: 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 7d 0a 20 20  .    }.  } {}.  
2510: 64 6f 5f 74 65 73 74 20 63 6f 72 72 75 70 74 2d  do_test corrupt-
2520: 37 2e 33 20 7b 0a 20 20 20 20 63 61 74 63 68 73  7.3 {.    catchs
2530: 71 6c 20 7b 0a 20 20 20 20 20 20 49 4e 53 45 52  ql {.      INSER
2540: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
2550: 28 58 27 30 30 30 31 30 30 30 32 30 30 30 33 30  (X'0001000200030
2560: 30 30 34 30 30 30 35 30 30 30 36 30 30 30 37 30  0040005000600070
2570: 30 30 38 30 30 30 39 30 30 30 41 27 29 3b 0a 20  0080009000A');. 
2580: 20 20 20 7d 0a 20 20 7d 20 7b 31 20 7b 64 61 74     }.  } {1 {dat
2590: 61 62 61 73 65 20 64 69 73 6b 20 69 6d 61 67 65  abase disk image
25a0: 20 69 73 20 6d 61 6c 66 6f 72 6d 65 64 7d 7d 0a   is malformed}}.
25b0: 7d 0a 0a 64 62 20 63 6c 6f 73 65 0a 66 6f 72 63  }..db close.forc
25c0: 65 64 65 6c 65 74 65 20 74 65 73 74 2e 64 62 20  edelete test.db 
25d0: 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a  test.db-journal.
25e0: 64 6f 5f 74 65 73 74 20 63 6f 72 72 75 70 74 2d  do_test corrupt-
25f0: 38 2e 31 20 7b 0a 20 20 73 71 6c 69 74 65 33 20  8.1 {.  sqlite3 
2600: 64 62 20 74 65 73 74 2e 64 62 0a 20 20 65 78 65  db test.db.  exe
2610: 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d  csql {.    PRAGM
2620: 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20 31 30  A page_size = 10
2630: 32 34 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 73  24;.    PRAGMA s
2640: 65 63 75 72 65 5f 64 65 6c 65 74 65 20 3d 20 6f  ecure_delete = o
2650: 6e 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 61 75  n;.    PRAGMA au
2660: 74 6f 5f 76 61 63 75 75 6d 20 3d 20 30 3b 0a 20  to_vacuum = 0;. 
2670: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
2680: 74 31 28 78 20 49 4e 54 45 47 45 52 20 50 52 49  t1(x INTEGER PRI
2690: 4d 41 52 59 20 4b 45 59 2c 20 79 29 3b 0a 20 20  MARY KEY, y);.  
26a0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
26b0: 20 56 41 4c 55 45 53 28 35 2c 20 72 61 6e 64 6f   VALUES(5, rando
26c0: 6d 62 6c 6f 62 28 31 39 30 30 29 29 3b 0a 20 20  mblob(1900));.  
26d0: 7d 0a 0a 20 20 68 65 78 69 6f 5f 77 72 69 74 65  }..  hexio_write
26e0: 20 74 65 73 74 2e 64 62 20 32 30 34 34 20 5b 68   test.db 2044 [h
26f0: 65 78 69 6f 5f 72 65 6e 64 65 72 5f 69 6e 74 33  exio_render_int3
2700: 32 20 32 5d 0a 20 20 68 65 78 69 6f 5f 77 72 69  2 2].  hexio_wri
2710: 74 65 20 74 65 73 74 2e 64 62 20 32 34 20 20 20  te test.db 24   
2720: 5b 68 65 78 69 6f 5f 72 65 6e 64 65 72 5f 69 6e  [hexio_render_in
2730: 74 33 32 20 34 35 5d 0a 0a 20 20 63 61 74 63 68  t32 45]..  catch
2740: 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 4f 52 20  sql { INSERT OR 
2750: 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 74 31 20  REPLACE INTO t1 
2760: 56 41 4c 55 45 53 28 35 2c 20 72 61 6e 64 6f 6d  VALUES(5, random
2770: 62 6c 6f 62 28 31 39 30 30 29 29 20 7d 0a 7d 20  blob(1900)) }.} 
2780: 7b 31 20 7b 64 61 74 61 62 61 73 65 20 64 69 73  {1 {database dis
2790: 6b 20 69 6d 61 67 65 20 69 73 20 6d 61 6c 66 6f  k image is malfo
27a0: 72 6d 65 64 7d 7d 0a 0a 64 62 20 63 6c 6f 73 65  rmed}}..db close
27b0: 0a 66 6f 72 63 65 64 65 6c 65 74 65 20 74 65 73  .forcedelete tes
27c0: 74 2e 64 62 20 74 65 73 74 2e 64 62 2d 6a 6f 75  t.db test.db-jou
27d0: 72 6e 61 6c 0a 64 6f 5f 74 65 73 74 20 63 6f 72  rnal.do_test cor
27e0: 72 75 70 74 2d 38 2e 32 20 7b 0a 20 20 73 71 6c  rupt-8.2 {.  sql
27f0: 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a  ite3 db test.db.
2800: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
2810: 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65  PRAGMA page_size
2820: 20 3d 20 31 30 32 34 3b 0a 20 20 20 20 50 52 41   = 1024;.    PRA
2830: 47 4d 41 20 73 65 63 75 72 65 5f 64 65 6c 65 74  GMA secure_delet
2840: 65 20 3d 20 6f 6e 3b 0a 20 20 20 20 50 52 41 47  e = on;.    PRAG
2850: 4d 41 20 61 75 74 6f 5f 76 61 63 75 75 6d 20 3d  MA auto_vacuum =
2860: 20 30 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54   0;.    CREATE T
2870: 41 42 4c 45 20 74 31 28 78 20 49 4e 54 45 47 45  ABLE t1(x INTEGE
2880: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 79  R PRIMARY KEY, y
2890: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
28a0: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 35 2c 20  TO t1 VALUES(5, 
28b0: 72 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29 29  randomblob(900))
28c0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
28d0: 4f 20 74 31 20 56 41 4c 55 45 53 28 36 2c 20 72  O t1 VALUES(6, r
28e0: 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29 29 3b  andomblob(900));
28f0: 0a 20 20 7d 0a 0a 20 20 68 65 78 69 6f 5f 77 72  .  }..  hexio_wr
2900: 69 74 65 20 74 65 73 74 2e 64 62 20 32 30 34 37  ite test.db 2047
2910: 20 46 46 0a 20 20 68 65 78 69 6f 5f 77 72 69 74   FF.  hexio_writ
2920: 65 20 74 65 73 74 2e 64 62 20 32 34 20 20 20 5b  e test.db 24   [
2930: 68 65 78 69 6f 5f 72 65 6e 64 65 72 5f 69 6e 74  hexio_render_int
2940: 33 32 20 34 35 5d 0a 0a 20 20 63 61 74 63 68 73  32 45]..  catchs
2950: 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f  ql { INSERT INTO
2960: 20 74 31 20 56 41 4c 55 45 53 28 34 2c 20 72 61   t1 VALUES(4, ra
2970: 6e 64 6f 6d 62 6c 6f 62 28 31 39 30 30 29 29 20  ndomblob(1900)) 
2980: 7d 0a 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65  }.} {1 {database
2990: 20 64 69 73 6b 20 69 6d 61 67 65 20 69 73 20 6d   disk image is m
29a0: 61 6c 66 6f 72 6d 65 64 7d 7d 0a 0a 66 69 6e 69  alformed}}..fini
29b0: 73 68 5f 74 65 73 74 0a                          sh_test.