/ Hex Artifact Content
Login

Artifact c798aa395a8d052fba88bd1be8e1945309e3f94a:


0000: 23 20 32 30 30 34 20 41 75 67 75 73 74 20 33 30  # 2004 August 30
0010: 0a 23 0a 23 20 54 68 65 20 61 75 74 68 6f 72 20  .#.# The author 
0020: 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79 72 69  disclaims copyri
0030: 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f 75 72  ght to this sour
0040: 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70 6c 61  ce code.  In pla
0050: 63 65 20 6f 66 0a 23 20 61 20 6c 65 67 61 6c 20  ce of.# a legal 
0060: 6e 6f 74 69 63 65 2c 20 68 65 72 65 20 69 73 20  notice, here is 
0070: 61 20 62 6c 65 73 73 69 6e 67 3a 0a 23 0a 23 20  a blessing:.#.# 
0080: 20 20 20 4d 61 79 20 79 6f 75 20 64 6f 20 67 6f     May you do go
0090: 6f 64 20 61 6e 64 20 6e 6f 74 20 65 76 69 6c 2e  od and not evil.
00a0: 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 20 66 69  .#    May you fi
00b0: 6e 64 20 66 6f 72 67 69 76 65 6e 65 73 73 20 66  nd forgiveness f
00c0: 6f 72 20 79 6f 75 72 73 65 6c 66 20 61 6e 64 20  or yourself and 
00d0: 66 6f 72 67 69 76 65 20 6f 74 68 65 72 73 2e 0a  forgive others..
00e0: 23 20 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61  #    May you sha
00f0: 72 65 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72  re freely, never
0100: 20 74 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61   taking more tha
0110: 6e 20 79 6f 75 20 67 69 76 65 2e 0a 23 0a 23 2a  n 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 2a 2a 0a 23 20 54 68 69 73 20 66 69  ******.# This fi
0170: 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 72 65  le implements re
0180: 67 72 65 73 73 69 6f 6e 20 74 65 73 74 73 20 66  gression tests f
0190: 6f 72 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72  or SQLite librar
01a0: 79 2e 0a 23 0a 23 20 54 68 69 73 20 66 69 6c 65  y..#.# This file
01b0: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 65 73 74   implements test
01c0: 73 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 53  s to make sure S
01d0: 51 4c 69 74 65 20 64 6f 65 73 20 6e 6f 74 20 63  QLite does not c
01e0: 72 61 73 68 20 6f 72 0a 23 20 73 65 67 66 61 75  rash or.# segfau
01f0: 6c 74 20 69 66 20 69 74 20 73 65 65 73 20 61 20  lt if it sees a 
0200: 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65  corrupt database
0210: 20 66 69 6c 65 2e 20 20 49 74 20 63 72 65 61 74   file.  It creat
0220: 65 73 20 61 20 62 61 73 65 0a 23 20 64 61 74 61  es a base.# data
0230: 20 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e   base file, then
0240: 20 74 65 73 74 73 20 74 68 61 74 20 73 69 6e 67   tests that sing
0250: 6c 65 20 62 79 74 65 20 63 6f 72 72 75 70 74 69  le byte corrupti
0260: 6f 6e 73 20 69 6e 20 0a 23 20 69 6e 63 72 65 61  ons in .# increa
0270: 73 69 6e 67 6c 79 20 6c 61 72 67 65 72 20 71 75  singly larger qu
0280: 61 6e 74 69 74 69 65 73 20 61 72 65 20 68 61 6e  antities are han
0290: 64 6c 65 64 20 67 72 61 63 65 66 75 6c 6c 79 2e  dled gracefully.
02a0: 0a 23 0a 23 20 24 49 64 3a 20 63 6f 72 72 75 70  .#.# $Id: corrup
02b0: 74 43 2e 74 65 73 74 2c 76 20 31 2e 31 30 20 32  tC.test,v 1.10 2
02c0: 30 30 38 2f 31 31 2f 31 39 20 31 38 3a 34 33 3a  008/11/19 18:43:
02d0: 30 37 20 64 72 68 20 45 78 70 20 24 0a 0a 63 61  07 drh Exp $..ca
02e0: 74 63 68 20 7b 66 69 6c 65 20 64 65 6c 65 74 65  tch {file delete
02f0: 20 2d 66 6f 72 63 65 20 74 65 73 74 2e 64 62 20   -force test.db 
0300: 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20  test.db-journal 
0310: 74 65 73 74 2e 62 75 7d 0a 0a 73 65 74 20 74 65  test.bu}..set te
0320: 73 74 64 69 72 20 5b 66 69 6c 65 20 64 69 72 6e  stdir [file dirn
0330: 61 6d 65 20 24 61 72 67 76 30 5d 0a 73 6f 75 72  ame $argv0].sour
0340: 63 65 20 24 74 65 73 74 64 69 72 2f 74 65 73 74  ce $testdir/test
0350: 65 72 2e 74 63 6c 0a 0a 23 20 43 6f 6e 73 74 72  er.tcl..# Constr
0360: 75 63 74 20 61 20 63 6f 6d 70 61 63 74 2c 20 64  uct a compact, d
0370: 65 6e 73 65 20 64 61 74 61 62 61 73 65 20 66 6f  ense database fo
0380: 72 20 74 65 73 74 69 6e 67 2e 0a 23 0a 64 6f 5f  r testing..#.do_
0390: 74 65 73 74 20 63 6f 72 72 75 70 74 43 2d 31 2e  test corruptC-1.
03a0: 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  1 {.  execsql {.
03b0: 20 20 20 20 50 52 41 47 4d 41 20 61 75 74 6f 5f      PRAGMA auto_
03c0: 76 61 63 75 75 6d 20 3d 20 30 3b 0a 20 20 20 20  vacuum = 0;.    
03d0: 50 52 41 47 4d 41 20 6c 65 67 61 63 79 5f 66 69  PRAGMA legacy_fi
03e0: 6c 65 5f 66 6f 72 6d 61 74 3d 31 3b 0a 20 20 20  le_format=1;.   
03f0: 20 42 45 47 49 4e 3b 0a 20 20 20 20 43 52 45 41   BEGIN;.    CREA
0400: 54 45 20 54 41 42 4c 45 20 74 31 28 78 2c 79 29  TE TABLE t1(x,y)
0410: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
0420: 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c 31 29  O t1 VALUES(1,1)
0430: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 4f 52 20  ;.    INSERT OR 
0440: 49 47 4e 4f 52 45 20 49 4e 54 4f 20 74 31 20 53  IGNORE INTO t1 S
0450: 45 4c 45 43 54 20 78 2a 32 2c 79 20 46 52 4f 4d  ELECT x*2,y FROM
0460: 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   t1;.    INSERT 
0470: 4f 52 20 49 47 4e 4f 52 45 20 49 4e 54 4f 20 74  OR IGNORE INTO t
0480: 31 20 53 45 4c 45 43 54 20 78 2a 33 2c 79 20 46  1 SELECT x*3,y F
0490: 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45  ROM t1;.    INSE
04a0: 52 54 20 4f 52 20 49 47 4e 4f 52 45 20 49 4e 54  RT OR IGNORE INT
04b0: 4f 20 74 31 20 53 45 4c 45 43 54 20 78 2a 35 2c  O t1 SELECT x*5,
04c0: 79 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49  y FROM t1;.    I
04d0: 4e 53 45 52 54 20 4f 52 20 49 47 4e 4f 52 45 20  NSERT OR IGNORE 
04e0: 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 78  INTO t1 SELECT x
04f0: 2a 37 2c 79 20 46 52 4f 4d 20 74 31 3b 0a 20 20  *7,y FROM t1;.  
0500: 20 20 49 4e 53 45 52 54 20 4f 52 20 49 47 4e 4f    INSERT OR IGNO
0510: 52 45 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RE INTO t1 SELEC
0520: 54 20 78 2a 31 31 2c 79 20 46 52 4f 4d 20 74 31  T x*11,y FROM t1
0530: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 4f 52 20  ;.    INSERT OR 
0540: 49 47 4e 4f 52 45 20 49 4e 54 4f 20 74 31 20 53  IGNORE INTO t1 S
0550: 45 4c 45 43 54 20 78 2a 31 33 2c 79 20 46 52 4f  ELECT x*13,y FRO
0560: 4d 20 74 31 3b 0a 20 20 20 20 43 52 45 41 54 45  M t1;.    CREATE
0570: 20 49 4e 44 45 58 20 74 31 69 31 20 4f 4e 20 74   INDEX t1i1 ON t
0580: 31 28 78 29 3b 0a 20 20 20 20 43 52 45 41 54 45  1(x);.    CREATE
0590: 20 54 41 42 4c 45 20 74 32 20 41 53 20 53 45 4c   TABLE t2 AS SEL
05a0: 45 43 54 20 78 2c 32 20 61 73 20 79 20 46 52 4f  ECT x,2 as y FRO
05b0: 4d 20 74 31 20 57 48 45 52 45 20 72 6f 77 69 64  M t1 WHERE rowid
05c0: 25 35 21 3d 30 3b 0a 20 20 20 20 43 4f 4d 4d 49  %5!=0;.    COMMI
05d0: 54 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 69 66 63  T;.  }.} {}..ifc
05e0: 61 70 61 62 6c 65 20 7b 69 6e 74 65 67 72 69 74  apable {integrit
05f0: 79 63 6b 7d 20 7b 0a 20 20 69 6e 74 65 67 72 69  yck} {.  integri
0600: 74 79 5f 63 68 65 63 6b 20 63 6f 72 72 75 70 74  ty_check corrupt
0610: 43 2d 31 2e 32 0a 7d 0a 0a 23 20 47 65 6e 65 72  C-1.2.}..# Gener
0620: 61 74 65 20 72 61 6e 64 6f 6d 20 69 6e 74 65 67  ate random integ
0630: 65 72 0a 23 0a 70 72 6f 63 20 72 61 6e 64 6f 6d  er.#.proc random
0640: 20 7b 72 61 6e 67 65 7d 20 7b 0a 20 20 72 65 74   {range} {.  ret
0650: 75 72 6e 20 5b 65 78 70 72 20 7b 72 6f 75 6e 64  urn [expr {round
0660: 28 72 61 6e 64 28 29 2a 24 72 61 6e 67 65 29 7d  (rand()*$range)}
0670: 5d 0a 7d 0a 0a 23 20 43 6f 70 79 20 66 69 6c 65  ].}..# Copy file
0680: 20 24 66 72 6f 6d 20 69 6e 74 6f 20 24 74 6f 0a   $from into $to.
0690: 23 0a 70 72 6f 63 20 63 6f 70 79 5f 66 69 6c 65  #.proc copy_file
06a0: 20 7b 66 72 6f 6d 20 74 6f 7d 20 7b 0a 20 20 66   {from to} {.  f
06b0: 69 6c 65 20 63 6f 70 79 20 2d 66 6f 72 63 65 20  ile copy -force 
06c0: 24 66 72 6f 6d 20 24 74 6f 0a 7d 0a 0a 23 20 53  $from $to.}..# S
06d0: 65 74 75 70 20 66 6f 72 20 74 68 65 20 74 65 73  etup for the tes
06e0: 74 73 2e 20 20 4d 61 6b 65 20 61 20 62 61 63 6b  ts.  Make a back
06f0: 75 70 20 63 6f 70 79 20 6f 66 20 74 68 65 20 67  up copy of the g
0700: 6f 6f 64 20 64 61 74 61 62 61 73 65 20 69 6e 20  ood database in 
0710: 74 65 73 74 2e 62 75 2e 0a 23 0a 64 62 20 63 6c  test.bu..#.db cl
0720: 6f 73 65 0a 63 6f 70 79 5f 66 69 6c 65 20 74 65  ose.copy_file te
0730: 73 74 2e 64 62 20 74 65 73 74 2e 62 75 0a 73 71  st.db test.bu.sq
0740: 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62  lite3 db test.db
0750: 0a 73 65 74 20 66 73 69 7a 65 20 5b 66 69 6c 65  .set fsize [file
0760: 20 73 69 7a 65 20 74 65 73 74 2e 64 62 5d 0a 0a   size test.db]..
0770: 23 20 53 65 74 20 61 20 71 75 61 73 69 2d 72 61  # Set a quasi-ra
0780: 6e 64 6f 6d 20 72 61 6e 64 6f 6d 20 73 65 65 64  ndom random seed
0790: 2e 20 0a 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69  . .if {[info exi
07a0: 73 74 73 20 53 4f 41 4b 54 45 53 54 5d 7d 20 7b  sts SOAKTEST]} {
07b0: 0a 20 20 23 20 49 66 20 77 65 20 61 72 65 20 64  .  # If we are d
07c0: 6f 69 6e 67 20 53 4f 41 4b 20 74 65 73 74 73 2c  oing SOAK tests,
07d0: 20 77 65 20 77 61 6e 74 20 61 20 64 69 66 66 65   we want a diffe
07e0: 72 65 6e 74 0a 20 20 23 20 72 61 6e 64 6f 6d 20  rent.  # random 
07f0: 73 65 65 64 20 66 6f 72 20 65 61 63 68 20 72 75  seed for each ru
0800: 6e 2e 20 20 49 64 65 61 6c 6c 79 20 77 65 20 77  n.  Ideally we w
0810: 6f 75 6c 64 20 6c 69 6b 65 20 0a 20 20 23 20 74  ould like .  # t
0820: 6f 20 75 73 65 20 5b 63 6c 6f 63 6b 20 63 6c 69  o use [clock cli
0830: 63 6b 73 5d 20 6f 72 20 73 6f 6d 65 74 68 69 6e  cks] or somethin
0840: 67 20 6c 69 6b 65 20 74 68 61 74 20 68 65 72 65  g like that here
0850: 2e 0a 20 20 73 65 74 20 71 73 65 65 64 20 5b 66  ..  set qseed [f
0860: 69 6c 65 20 6d 74 69 6d 65 20 74 65 73 74 2e 64  ile mtime test.d
0870: 62 5d 0a 7d 20 65 6c 73 65 20 7b 0a 20 20 23 20  b].} else {.  # 
0880: 49 66 20 77 65 20 61 72 65 20 6e 6f 74 20 64 6f  If we are not do
0890: 69 6e 67 20 73 6f 61 6b 20 74 65 73 74 73 2c 0a  ing soak tests,.
08a0: 20 20 23 20 6d 61 6b 65 20 69 74 20 72 65 70 65    # make it repe
08b0: 61 74 61 62 6c 65 2e 0a 20 20 73 65 74 20 71 73  atable..  set qs
08c0: 65 65 64 20 30 0a 7d 0a 65 78 70 72 20 73 72 61  eed 0.}.expr sra
08d0: 6e 64 28 24 71 73 65 65 64 29 0a 0a 23 0a 23 20  nd($qseed)..#.# 
08e0: 46 69 72 73 74 20 74 65 73 74 20 73 6f 6d 65 20  First test some 
08f0: 73 70 65 63 69 66 69 63 20 63 6f 72 72 75 70 74  specific corrupt
0900: 69 6f 6e 20 74 65 73 74 73 20 66 6f 75 6e 64 20  ion tests found 
0910: 66 72 6f 6d 20 65 61 72 6c 69 65 72 20 72 75 6e  from earlier run
0920: 73 0a 23 20 77 69 74 68 20 73 70 65 63 69 66 69  s.# with specifi
0930: 63 20 73 65 65 64 73 2e 0a 23 0a 0a 23 20 74 65  c seeds..#..# te
0940: 73 74 20 74 68 61 74 20 61 20 63 6f 72 72 75 70  st that a corrup
0950: 74 20 63 6f 6e 74 65 6e 74 20 6f 66 66 73 65 74  t content offset
0960: 20 73 69 7a 65 20 69 73 20 68 61 6e 64 6c 65 64   size is handled
0970: 20 28 73 65 65 64 20 35 35 37 37 29 0a 64 6f 5f   (seed 5577).do_
0980: 74 65 73 74 20 63 6f 72 72 75 70 74 43 2d 32 2e  test corruptC-2.
0990: 31 20 7b 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20  1 {.  db close. 
09a0: 20 63 6f 70 79 5f 66 69 6c 65 20 74 65 73 74 2e   copy_file test.
09b0: 62 75 20 74 65 73 74 2e 64 62 0a 0a 20 20 23 20  bu test.db..  # 
09c0: 69 6e 73 65 72 74 20 63 6f 72 72 75 70 74 20 62  insert corrupt b
09d0: 79 74 65 28 73 29 0a 20 20 68 65 78 69 6f 5f 77  yte(s).  hexio_w
09e0: 72 69 74 65 20 74 65 73 74 2e 64 62 20 32 30 35  rite test.db 205
09f0: 33 20 5b 66 6f 72 6d 61 74 20 25 30 32 78 20 30  3 [format %02x 0
0a00: 78 30 34 5d 0a 0a 20 20 73 71 6c 69 74 65 33 20  x04]..  sqlite3 
0a10: 64 62 20 74 65 73 74 2e 64 62 0a 20 20 63 61 74  db test.db.  cat
0a20: 63 68 73 71 6c 20 7b 50 52 41 47 4d 41 20 69 6e  chsql {PRAGMA in
0a30: 74 65 67 72 69 74 79 5f 63 68 65 63 6b 7d 0a 7d  tegrity_check}.}
0a40: 20 7b 30 20 7b 7b 2a 2a 2a 20 69 6e 20 64 61 74   {0 {{*** in dat
0a50: 61 62 61 73 65 20 6d 61 69 6e 20 2a 2a 2a 0a 43  abase main ***.C
0a60: 6f 72 72 75 70 74 69 6f 6e 20 64 65 74 65 63 74  orruption detect
0a70: 65 64 20 69 6e 20 68 65 61 64 65 72 20 6f 6e 20  ed in header on 
0a80: 70 61 67 65 20 33 7d 7d 7d 0a 0a 23 20 74 65 73  page 3}}}..# tes
0a90: 74 20 74 68 61 74 20 61 20 63 6f 72 72 75 70 74  t that a corrupt
0aa0: 20 63 6f 6e 74 65 6e 74 20 6f 66 66 73 65 74 20   content offset 
0ab0: 73 69 7a 65 20 69 73 20 68 61 6e 64 6c 65 64 20  size is handled 
0ac0: 28 73 65 65 64 20 35 36 34 39 29 0a 64 6f 5f 74  (seed 5649).do_t
0ad0: 65 73 74 20 63 6f 72 72 75 70 74 43 2d 32 2e 32  est corruptC-2.2
0ae0: 20 7b 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20   {.  db close.  
0af0: 63 6f 70 79 5f 66 69 6c 65 20 74 65 73 74 2e 62  copy_file test.b
0b00: 75 20 74 65 73 74 2e 64 62 0a 0a 20 20 23 20 69  u test.db..  # i
0b10: 6e 73 65 72 74 20 63 6f 72 72 75 70 74 20 62 79  nsert corrupt by
0b20: 74 65 28 73 29 0a 20 20 68 65 78 69 6f 5f 77 72  te(s).  hexio_wr
0b30: 69 74 65 20 74 65 73 74 2e 64 62 20 32 37 20 20  ite test.db 27  
0b40: 20 5b 66 6f 72 6d 61 74 20 25 30 32 78 20 30 78   [format %02x 0x
0b50: 30 38 5d 0a 20 20 68 65 78 69 6f 5f 77 72 69 74  08].  hexio_writ
0b60: 65 20 74 65 73 74 2e 64 62 20 32 33 33 20 20 5b  e test.db 233  [
0b70: 66 6f 72 6d 61 74 20 25 30 32 78 20 30 78 36 61  format %02x 0x6a
0b80: 5d 0a 20 20 68 65 78 69 6f 5f 77 72 69 74 65 20  ].  hexio_write 
0b90: 74 65 73 74 2e 64 62 20 33 32 38 20 20 5b 66 6f  test.db 328  [fo
0ba0: 72 6d 61 74 20 25 30 32 78 20 30 78 36 37 5d 0a  rmat %02x 0x67].
0bb0: 20 20 68 65 78 69 6f 5f 77 72 69 74 65 20 74 65    hexio_write te
0bc0: 73 74 2e 64 62 20 37 35 30 20 20 5b 66 6f 72 6d  st.db 750  [form
0bd0: 61 74 20 25 30 32 78 20 30 78 31 66 5d 0a 20 20  at %02x 0x1f].  
0be0: 68 65 78 69 6f 5f 77 72 69 74 65 20 74 65 73 74  hexio_write test
0bf0: 2e 64 62 20 31 31 33 32 20 5b 66 6f 72 6d 61 74  .db 1132 [format
0c00: 20 25 30 32 78 20 30 78 35 32 5d 0a 20 20 68 65   %02x 0x52].  he
0c10: 78 69 6f 5f 77 72 69 74 65 20 74 65 73 74 2e 64  xio_write test.d
0c20: 62 20 31 31 33 33 20 5b 66 6f 72 6d 61 74 20 25  b 1133 [format %
0c30: 30 32 78 20 30 78 38 34 5d 0a 20 20 68 65 78 69  02x 0x84].  hexi
0c40: 6f 5f 77 72 69 74 65 20 74 65 73 74 2e 64 62 20  o_write test.db 
0c50: 31 32 32 30 20 5b 66 6f 72 6d 61 74 20 25 30 32  1220 [format %02
0c60: 78 20 30 78 30 31 5d 0a 20 20 68 65 78 69 6f 5f  x 0x01].  hexio_
0c70: 77 72 69 74 65 20 74 65 73 74 2e 64 62 20 33 36  write test.db 36
0c80: 38 38 20 5b 66 6f 72 6d 61 74 20 25 30 32 78 20  88 [format %02x 
0c90: 30 78 63 31 5d 0a 20 20 68 65 78 69 6f 5f 77 72  0xc1].  hexio_wr
0ca0: 69 74 65 20 74 65 73 74 2e 64 62 20 33 37 31 34  ite test.db 3714
0cb0: 20 5b 66 6f 72 6d 61 74 20 25 30 32 78 20 30 78   [format %02x 0x
0cc0: 35 38 5d 0a 20 20 68 65 78 69 6f 5f 77 72 69 74  58].  hexio_writ
0cd0: 65 20 74 65 73 74 2e 64 62 20 33 37 34 36 20 5b  e test.db 3746 [
0ce0: 66 6f 72 6d 61 74 20 25 30 32 78 20 30 78 39 61  format %02x 0x9a
0cf0: 5d 0a 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20  ]..  sqlite3 db 
0d00: 74 65 73 74 2e 64 62 0a 20 20 63 61 74 63 68 73  test.db.  catchs
0d10: 71 6c 20 7b 55 50 44 41 54 45 20 74 31 20 53 45  ql {UPDATE t1 SE
0d20: 54 20 79 3d 31 7d 0a 7d 20 7b 31 20 7b 64 61 74  T y=1}.} {1 {dat
0d30: 61 62 61 73 65 20 64 69 73 6b 20 69 6d 61 67 65  abase disk image
0d40: 20 69 73 20 6d 61 6c 66 6f 72 6d 65 64 7d 7d 0a   is malformed}}.
0d50: 0a 23 20 74 65 73 74 20 74 68 61 74 20 61 20 63  .# test that a c
0d60: 6f 72 72 75 70 74 20 66 72 65 65 20 63 65 6c 6c  orrupt free cell
0d70: 20 73 69 7a 65 20 69 73 20 68 61 6e 64 6c 65 64   size is handled
0d80: 20 28 73 65 65 64 20 31 33 33 32 39 29 0a 64 6f   (seed 13329).do
0d90: 5f 74 65 73 74 20 63 6f 72 72 75 70 74 43 2d 32  _test corruptC-2
0da0: 2e 33 20 7b 0a 20 20 64 62 20 63 6c 6f 73 65 0a  .3 {.  db close.
0db0: 20 20 63 6f 70 79 5f 66 69 6c 65 20 74 65 73 74    copy_file test
0dc0: 2e 62 75 20 74 65 73 74 2e 64 62 0a 0a 20 20 23  .bu test.db..  #
0dd0: 20 69 6e 73 65 72 74 20 63 6f 72 72 75 70 74 20   insert corrupt 
0de0: 62 79 74 65 28 73 29 0a 20 20 68 65 78 69 6f 5f  byte(s).  hexio_
0df0: 77 72 69 74 65 20 74 65 73 74 2e 64 62 20 31 30  write test.db 10
0e00: 39 34 20 5b 66 6f 72 6d 61 74 20 25 30 32 78 20  94 [format %02x 
0e10: 30 78 37 36 5d 0a 0a 20 20 73 71 6c 69 74 65 33  0x76]..  sqlite3
0e20: 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20 63 61   db test.db.  ca
0e30: 74 63 68 73 71 6c 20 7b 55 50 44 41 54 45 20 74  tchsql {UPDATE t
0e40: 31 20 53 45 54 20 79 3d 31 7d 0a 7d 20 7b 31 20  1 SET y=1}.} {1 
0e50: 7b 64 61 74 61 62 61 73 65 20 64 69 73 6b 20 69  {database disk i
0e60: 6d 61 67 65 20 69 73 20 6d 61 6c 66 6f 72 6d 65  mage is malforme
0e70: 64 7d 7d 0a 0a 23 20 74 65 73 74 20 74 68 61 74  d}}..# test that
0e80: 20 61 20 63 6f 72 72 75 70 74 20 66 72 65 65 20   a corrupt free 
0e90: 63 65 6c 6c 20 73 69 7a 65 20 69 73 20 68 61 6e  cell size is han
0ea0: 64 6c 65 64 20 28 73 65 65 64 20 31 36 39 35 37  dled (seed 16957
0eb0: 31 29 0a 64 6f 5f 74 65 73 74 20 63 6f 72 72 75  1).do_test corru
0ec0: 70 74 43 2d 32 2e 34 20 7b 0a 20 20 64 62 20 63  ptC-2.4 {.  db c
0ed0: 6c 6f 73 65 0a 20 20 63 6f 70 79 5f 66 69 6c 65  lose.  copy_file
0ee0: 20 74 65 73 74 2e 62 75 20 74 65 73 74 2e 64 62   test.bu test.db
0ef0: 0a 0a 20 20 23 20 69 6e 73 65 72 74 20 63 6f 72  ..  # insert cor
0f00: 72 75 70 74 20 62 79 74 65 28 73 29 0a 20 20 68  rupt byte(s).  h
0f10: 65 78 69 6f 5f 77 72 69 74 65 20 74 65 73 74 2e  exio_write test.
0f20: 64 62 20 33 31 31 39 20 5b 66 6f 72 6d 61 74 20  db 3119 [format 
0f30: 25 30 32 78 20 30 78 64 66 5d 0a 0a 20 20 73 71  %02x 0xdf]..  sq
0f40: 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62  lite3 db test.db
0f50: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 55 50 44  .  catchsql {UPD
0f60: 41 54 45 20 74 32 20 53 45 54 20 79 3d 27 61 62  ATE t2 SET y='ab
0f70: 63 64 65 66 2d 75 76 77 78 79 7a 27 7d 0a 7d 20  cdef-uvwxyz'}.} 
0f80: 7b 31 20 7b 64 61 74 61 62 61 73 65 20 64 69 73  {1 {database dis
0f90: 6b 20 69 6d 61 67 65 20 69 73 20 6d 61 6c 66 6f  k image is malfo
0fa0: 72 6d 65 64 7d 7d 0a 0a 23 20 74 65 73 74 20 74  rmed}}..# test t
0fb0: 68 61 74 20 61 20 63 6f 72 72 75 70 74 20 66 72  hat a corrupt fr
0fc0: 65 65 20 63 65 6c 6c 20 73 69 7a 65 20 69 73 20  ee cell size is 
0fd0: 68 61 6e 64 6c 65 64 20 28 73 65 65 64 20 31 36  handled (seed 16
0fe0: 39 35 37 31 29 0a 64 6f 5f 74 65 73 74 20 63 6f  9571).do_test co
0ff0: 72 72 75 70 74 43 2d 32 2e 35 20 7b 0a 20 20 64  rruptC-2.5 {.  d
1000: 62 20 63 6c 6f 73 65 0a 20 20 63 6f 70 79 5f 66  b close.  copy_f
1010: 69 6c 65 20 74 65 73 74 2e 62 75 20 74 65 73 74  ile test.bu test
1020: 2e 64 62 0a 0a 20 20 23 20 69 6e 73 65 72 74 20  .db..  # insert 
1030: 63 6f 72 72 75 70 74 20 62 79 74 65 28 73 29 0a  corrupt byte(s).
1040: 20 20 68 65 78 69 6f 5f 77 72 69 74 65 20 74 65    hexio_write te
1050: 73 74 2e 64 62 20 33 31 31 39 20 5b 66 6f 72 6d  st.db 3119 [form
1060: 61 74 20 25 30 32 78 20 30 78 64 66 5d 0a 20 20  at %02x 0xdf].  
1070: 68 65 78 69 6f 5f 77 72 69 74 65 20 74 65 73 74  hexio_write test
1080: 2e 64 62 20 34 30 37 33 20 5b 66 6f 72 6d 61 74  .db 4073 [format
1090: 20 25 30 32 78 20 30 78 62 66 5d 0a 0a 20 20 73   %02x 0xbf]..  s
10a0: 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64  qlite3 db test.d
10b0: 62 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 42 45  b.  catchsql {BE
10c0: 47 49 4e 3b 20 55 50 44 41 54 45 20 74 32 20 53  GIN; UPDATE t2 S
10d0: 45 54 20 79 3d 27 61 62 63 64 65 66 2d 75 76 77  ET y='abcdef-uvw
10e0: 78 79 7a 27 3b 20 52 4f 4c 4c 42 41 43 4b 3b 7d  xyz'; ROLLBACK;}
10f0: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 50 52 41  .  catchsql {PRA
1100: 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68  GMA integrity_ch
1110: 65 63 6b 7d 0a 7d 20 7b 30 20 7b 7b 2a 2a 2a 20  eck}.} {0 {{*** 
1120: 69 6e 20 64 61 74 61 62 61 73 65 20 6d 61 69 6e  in database main
1130: 20 2a 2a 2a 0a 43 6f 72 72 75 70 74 69 6f 6e 20   ***.Corruption 
1140: 64 65 74 65 63 74 65 64 20 69 6e 20 63 65 6c 6c  detected in cell
1150: 20 37 31 30 20 6f 6e 20 70 61 67 65 20 34 0a 4d   710 on page 4.M
1160: 75 6c 74 69 70 6c 65 20 75 73 65 73 20 66 6f 72  ultiple uses for
1170: 20 62 79 74 65 20 36 36 31 20 6f 66 20 70 61 67   byte 661 of pag
1180: 65 20 34 0a 46 72 61 67 6d 65 6e 74 65 64 20 73  e 4.Fragmented s
1190: 70 61 63 65 20 69 73 20 32 34 39 20 62 79 74 65  pace is 249 byte
11a0: 20 72 65 70 6f 72 74 65 64 20 61 73 20 32 31 20   reported as 21 
11b0: 6f 6e 20 70 61 67 65 20 34 7d 7d 7d 0a 0a 23 20  on page 4}}}..# 
11c0: 74 65 73 74 20 74 68 61 74 20 61 20 63 6f 72 72  test that a corr
11d0: 75 70 74 20 66 72 65 65 20 63 65 6c 6c 20 73 69  upt free cell si
11e0: 7a 65 20 69 73 20 68 61 6e 64 6c 65 64 20 28 73  ze is handled (s
11f0: 65 65 64 20 31 36 39 35 39 35 29 0a 64 6f 5f 74  eed 169595).do_t
1200: 65 73 74 20 63 6f 72 72 75 70 74 43 2d 32 2e 36  est corruptC-2.6
1210: 20 7b 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20   {.  db close.  
1220: 63 6f 70 79 5f 66 69 6c 65 20 74 65 73 74 2e 62  copy_file test.b
1230: 75 20 74 65 73 74 2e 64 62 0a 0a 20 20 23 20 69  u test.db..  # i
1240: 6e 73 65 72 74 20 63 6f 72 72 75 70 74 20 62 79  nsert corrupt by
1250: 74 65 28 73 29 0a 20 20 68 65 78 69 6f 5f 77 72  te(s).  hexio_wr
1260: 69 74 65 20 74 65 73 74 2e 64 62 20 36 31 39 20  ite test.db 619 
1270: 5b 66 6f 72 6d 61 74 20 25 30 32 78 20 30 78 65  [format %02x 0xe
1280: 32 5d 0a 20 20 68 65 78 69 6f 5f 77 72 69 74 65  2].  hexio_write
1290: 20 74 65 73 74 2e 64 62 20 33 31 35 30 20 5b 66   test.db 3150 [f
12a0: 6f 72 6d 61 74 20 25 30 32 78 20 30 78 61 38 5d  ormat %02x 0xa8]
12b0: 0a 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 74  ..  sqlite3 db t
12c0: 65 73 74 2e 64 62 0a 20 20 63 61 74 63 68 73 71  est.db.  catchsq
12d0: 6c 20 7b 42 45 47 49 4e 3b 20 55 50 44 41 54 45  l {BEGIN; UPDATE
12e0: 20 74 32 20 53 45 54 20 79 3d 27 61 62 63 64 65   t2 SET y='abcde
12f0: 66 2d 75 76 77 78 79 7a 27 3b 20 52 4f 4c 4c 42  f-uvwxyz'; ROLLB
1300: 41 43 4b 3b 7d 0a 7d 20 7b 31 20 7b 64 61 74 61  ACK;}.} {1 {data
1310: 62 61 73 65 20 64 69 73 6b 20 69 6d 61 67 65 20  base disk image 
1320: 69 73 20 6d 61 6c 66 6f 72 6d 65 64 7d 7d 0a 0a  is malformed}}..
1330: 23 20 63 6f 72 72 75 70 74 69 6f 6e 20 28 73 65  # corruption (se
1340: 65 64 20 31 37 38 36 39 32 29 0a 64 6f 5f 74 65  ed 178692).do_te
1350: 73 74 20 63 6f 72 72 75 70 74 43 2d 32 2e 37 20  st corruptC-2.7 
1360: 7b 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 63  {.  db close.  c
1370: 6f 70 79 5f 66 69 6c 65 20 74 65 73 74 2e 62 75  opy_file test.bu
1380: 20 74 65 73 74 2e 64 62 0a 0a 20 20 23 20 69 6e   test.db..  # in
1390: 73 65 72 74 20 63 6f 72 72 75 70 74 20 62 79 74  sert corrupt byt
13a0: 65 28 73 29 0a 20 20 68 65 78 69 6f 5f 77 72 69  e(s).  hexio_wri
13b0: 74 65 20 74 65 73 74 2e 64 62 20 33 30 37 34 20  te test.db 3074 
13c0: 5b 66 6f 72 6d 61 74 20 25 30 32 78 20 30 78 61  [format %02x 0xa
13d0: 30 5d 0a 0a 20 20 73 71 6c 69 74 65 33 20 64 62  0]..  sqlite3 db
13e0: 20 74 65 73 74 2e 64 62 0a 20 20 63 61 74 63 68   test.db.  catch
13f0: 73 71 6c 20 7b 42 45 47 49 4e 3b 20 55 50 44 41  sql {BEGIN; UPDA
1400: 54 45 20 74 32 20 53 45 54 20 79 3d 27 61 62 63  TE t2 SET y='abc
1410: 64 65 66 2d 75 76 77 78 79 7a 27 3b 20 52 4f 4c  def-uvwxyz'; ROL
1420: 4c 42 41 43 4b 3b 7d 0a 7d 20 7b 31 20 7b 64 61  LBACK;}.} {1 {da
1430: 74 61 62 61 73 65 20 64 69 73 6b 20 69 6d 61 67  tabase disk imag
1440: 65 20 69 73 20 6d 61 6c 66 6f 72 6d 65 64 7d 7d  e is malformed}}
1450: 0a 0a 23 20 63 6f 72 72 75 70 74 69 6f 6e 20 28  ..# corruption (
1460: 73 65 65 64 20 31 37 39 30 36 39 29 0a 64 6f 5f  seed 179069).do_
1470: 74 65 73 74 20 63 6f 72 72 75 70 74 43 2d 32 2e  test corruptC-2.
1480: 38 20 7b 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20  8 {.  db close. 
1490: 20 63 6f 70 79 5f 66 69 6c 65 20 74 65 73 74 2e   copy_file test.
14a0: 62 75 20 74 65 73 74 2e 64 62 0a 0a 20 20 23 20  bu test.db..  # 
14b0: 69 6e 73 65 72 74 20 63 6f 72 72 75 70 74 20 62  insert corrupt b
14c0: 79 74 65 28 73 29 0a 20 20 68 65 78 69 6f 5f 77  yte(s).  hexio_w
14d0: 72 69 74 65 20 74 65 73 74 2e 64 62 20 31 33 39  rite test.db 139
14e0: 33 20 5b 66 6f 72 6d 61 74 20 25 30 32 78 20 30  3 [format %02x 0
14f0: 78 37 64 5d 0a 20 20 68 65 78 69 6f 5f 77 72 69  x7d].  hexio_wri
1500: 74 65 20 74 65 73 74 2e 64 62 20 38 34 20 5b 66  te test.db 84 [f
1510: 6f 72 6d 61 74 20 25 30 32 78 20 30 78 31 39 5d  ormat %02x 0x19]
1520: 0a 20 20 68 65 78 69 6f 5f 77 72 69 74 65 20 74  .  hexio_write t
1530: 65 73 74 2e 64 62 20 33 32 38 37 20 5b 66 6f 72  est.db 3287 [for
1540: 6d 61 74 20 25 30 32 78 20 30 78 33 62 5d 0a 20  mat %02x 0x3b]. 
1550: 20 68 65 78 69 6f 5f 77 72 69 74 65 20 74 65 73   hexio_write tes
1560: 74 2e 64 62 20 32 35 36 34 20 5b 66 6f 72 6d 61  t.db 2564 [forma
1570: 74 20 25 30 32 78 20 30 78 65 64 5d 0a 20 20 68  t %02x 0xed].  h
1580: 65 78 69 6f 5f 77 72 69 74 65 20 74 65 73 74 2e  exio_write test.
1590: 64 62 20 32 31 33 39 20 5b 66 6f 72 6d 61 74 20  db 2139 [format 
15a0: 25 30 32 78 20 30 78 35 35 5d 0a 0a 20 20 73 71  %02x 0x55]..  sq
15b0: 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62  lite3 db test.db
15c0: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 42 45 47  .  catchsql {BEG
15d0: 49 4e 3b 20 44 45 4c 45 54 45 20 46 52 4f 4d 20  IN; DELETE FROM 
15e0: 74 31 20 57 48 45 52 45 20 78 3e 31 33 3b 20 52  t1 WHERE x>13; R
15f0: 4f 4c 4c 42 41 43 4b 3b 7d 0a 7d 20 7b 31 20 7b  OLLBACK;}.} {1 {
1600: 64 61 74 61 62 61 73 65 20 64 69 73 6b 20 69 6d  database disk im
1610: 61 67 65 20 69 73 20 6d 61 6c 66 6f 72 6d 65 64  age is malformed
1620: 7d 7d 0a 0a 23 20 63 6f 72 72 75 70 74 69 6f 6e  }}..# corruption
1630: 20 28 73 65 65 64 20 31 37 30 34 33 34 29 0a 64   (seed 170434).d
1640: 6f 5f 74 65 73 74 20 63 6f 72 72 75 70 74 43 2d  o_test corruptC-
1650: 32 2e 39 20 7b 0a 20 20 64 62 20 63 6c 6f 73 65  2.9 {.  db close
1660: 0a 20 20 63 6f 70 79 5f 66 69 6c 65 20 74 65 73  .  copy_file tes
1670: 74 2e 62 75 20 74 65 73 74 2e 64 62 0a 0a 20 20  t.bu test.db..  
1680: 23 20 69 6e 73 65 72 74 20 63 6f 72 72 75 70 74  # insert corrupt
1690: 20 62 79 74 65 28 73 29 0a 20 20 68 65 78 69 6f   byte(s).  hexio
16a0: 5f 77 72 69 74 65 20 74 65 73 74 2e 64 62 20 32  _write test.db 2
16b0: 30 39 35 20 5b 66 6f 72 6d 61 74 20 25 30 32 78  095 [format %02x
16c0: 20 30 78 64 36 5d 0a 0a 20 20 73 71 6c 69 74 65   0xd6]..  sqlite
16d0: 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20 63  3 db test.db.  c
16e0: 61 74 63 68 73 71 6c 20 7b 42 45 47 49 4e 3b 20  atchsql {BEGIN; 
16f0: 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 20 57  DELETE FROM t1 W
1700: 48 45 52 45 20 78 3e 31 33 3b 20 52 4f 4c 4c 42  HERE x>13; ROLLB
1710: 41 43 4b 3b 7d 0a 7d 20 7b 31 20 7b 64 61 74 61  ACK;}.} {1 {data
1720: 62 61 73 65 20 64 69 73 6b 20 69 6d 61 67 65 20  base disk image 
1730: 69 73 20 6d 61 6c 66 6f 72 6d 65 64 7d 7d 0a 0a  is malformed}}..
1740: 23 20 63 6f 72 72 75 70 74 69 6f 6e 20 28 73 65  # corruption (se
1750: 65 64 20 31 38 36 35 30 34 29 0a 64 6f 5f 74 65  ed 186504).do_te
1760: 73 74 20 63 6f 72 72 75 70 74 43 2d 32 2e 31 30  st corruptC-2.10
1770: 20 7b 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20   {.  db close.  
1780: 63 6f 70 79 5f 66 69 6c 65 20 74 65 73 74 2e 62  copy_file test.b
1790: 75 20 74 65 73 74 2e 64 62 0a 0a 20 20 23 20 69  u test.db..  # i
17a0: 6e 73 65 72 74 20 63 6f 72 72 75 70 74 20 62 79  nsert corrupt by
17b0: 74 65 28 73 29 0a 20 20 68 65 78 69 6f 5f 77 72  te(s).  hexio_wr
17c0: 69 74 65 20 74 65 73 74 2e 64 62 20 33 31 33 30  ite test.db 3130
17d0: 20 5b 66 6f 72 6d 61 74 20 25 30 32 78 20 30 78   [format %02x 0x
17e0: 30 32 5d 0a 20 20 0a 20 20 73 71 6c 69 74 65 33  02].  .  sqlite3
17f0: 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20 63 61   db test.db.  ca
1800: 74 63 68 73 71 6c 20 7b 42 45 47 49 4e 3b 20 55  tchsql {BEGIN; U
1810: 50 44 41 54 45 20 74 32 20 53 45 54 20 79 3d 27  PDATE t2 SET y='
1820: 61 62 63 64 65 66 2d 75 76 77 78 79 7a 27 3b 20  abcdef-uvwxyz'; 
1830: 52 4f 4c 4c 42 41 43 4b 3b 7d 0a 7d 20 7b 31 20  ROLLBACK;}.} {1 
1840: 7b 64 61 74 61 62 61 73 65 20 64 69 73 6b 20 69  {database disk i
1850: 6d 61 67 65 20 69 73 20 6d 61 6c 66 6f 72 6d 65  mage is malforme
1860: 64 7d 7d 0a 0a 23 20 63 6f 72 72 75 70 74 69 6f  d}}..# corruptio
1870: 6e 20 28 73 65 65 64 20 31 35 38 39 29 0a 64 6f  n (seed 1589).do
1880: 5f 74 65 73 74 20 63 6f 72 72 75 70 74 43 2d 32  _test corruptC-2
1890: 2e 31 31 20 7b 0a 20 20 64 62 20 63 6c 6f 73 65  .11 {.  db close
18a0: 0a 20 20 63 6f 70 79 5f 66 69 6c 65 20 74 65 73  .  copy_file tes
18b0: 74 2e 62 75 20 74 65 73 74 2e 64 62 0a 0a 20 20  t.bu test.db..  
18c0: 23 20 69 6e 73 65 72 74 20 63 6f 72 72 75 70 74  # insert corrupt
18d0: 20 62 79 74 65 28 73 29 0a 20 20 68 65 78 69 6f   byte(s).  hexio
18e0: 5f 77 72 69 74 65 20 74 65 73 74 2e 64 62 20 35  _write test.db 5
18f0: 35 20 5b 66 6f 72 6d 61 74 20 25 30 32 78 20 30  5 [format %02x 0
1900: 78 61 37 5d 0a 20 20 0a 20 20 73 71 6c 69 74 65  xa7].  .  sqlite
1910: 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20 63  3 db test.db.  c
1920: 61 74 63 68 73 71 6c 20 7b 42 45 47 49 4e 3b 20  atchsql {BEGIN; 
1930: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 33 20  CREATE TABLE t3 
1940: 41 53 20 53 45 4c 45 43 54 20 78 2c 33 20 61 73  AS SELECT x,3 as
1950: 20 79 20 46 52 4f 4d 20 74 32 20 57 48 45 52 45   y FROM t2 WHERE
1960: 20 72 6f 77 69 64 25 35 21 3d 30 3b 20 52 4f 4c   rowid%5!=0; ROL
1970: 4c 42 41 43 4b 3b 7d 0a 7d 20 7b 31 20 7b 64 61  LBACK;}.} {1 {da
1980: 74 61 62 61 73 65 20 64 69 73 6b 20 69 6d 61 67  tabase disk imag
1990: 65 20 69 73 20 6d 61 6c 66 6f 72 6d 65 64 7d 7d  e is malformed}}
19a0: 0a 0a 23 20 63 6f 72 72 75 70 74 69 6f 6e 20 28  ..# corruption (
19b0: 73 65 65 64 20 31 34 31 36 36 29 0a 64 6f 5f 74  seed 14166).do_t
19c0: 65 73 74 20 63 6f 72 72 75 70 74 43 2d 32 2e 31  est corruptC-2.1
19d0: 32 20 7b 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20  2 {.  db close. 
19e0: 20 63 6f 70 79 5f 66 69 6c 65 20 74 65 73 74 2e   copy_file test.
19f0: 62 75 20 74 65 73 74 2e 64 62 0a 0a 20 20 23 20  bu test.db..  # 
1a00: 69 6e 73 65 72 74 20 63 6f 72 72 75 70 74 20 62  insert corrupt b
1a10: 79 74 65 28 73 29 0a 20 20 68 65 78 69 6f 5f 77  yte(s).  hexio_w
1a20: 72 69 74 65 20 74 65 73 74 2e 64 62 20 39 37 34  rite test.db 974
1a30: 20 5b 66 6f 72 6d 61 74 20 25 30 32 78 20 30 78   [format %02x 0x
1a40: 32 65 5d 0a 20 20 0a 20 20 73 71 6c 69 74 65 33  2e].  .  sqlite3
1a50: 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20 63 61   db test.db.  ca
1a60: 74 63 68 73 71 6c 20 7b 53 45 4c 45 43 54 20 63  tchsql {SELECT c
1a70: 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 73 71 6c  ount(*) FROM sql
1a80: 69 74 65 5f 6d 61 73 74 65 72 3b 7d 0a 7d 20 7b  ite_master;}.} {
1a90: 31 20 7b 6d 61 6c 66 6f 72 6d 65 64 20 64 61 74  1 {malformed dat
1aa0: 61 62 61 73 65 20 73 63 68 65 6d 61 20 28 74 31  abase schema (t1
1ab0: 69 31 29 20 2d 20 63 6f 72 72 75 70 74 20 64 61  i1) - corrupt da
1ac0: 74 61 62 61 73 65 7d 7d 0a 0a 23 20 63 6f 72 72  tabase}}..# corr
1ad0: 75 70 74 69 6f 6e 20 28 73 65 65 64 20 32 31 38  uption (seed 218
1ae0: 38 30 33 29 0a 64 6f 5f 74 65 73 74 20 63 6f 72  803).do_test cor
1af0: 72 75 70 74 43 2d 32 2e 31 33 20 7b 0a 20 20 64  ruptC-2.13 {.  d
1b00: 62 20 63 6c 6f 73 65 0a 20 20 63 6f 70 79 5f 66  b close.  copy_f
1b10: 69 6c 65 20 74 65 73 74 2e 62 75 20 74 65 73 74  ile test.bu test
1b20: 2e 64 62 0a 0a 20 20 23 20 69 6e 73 65 72 74 20  .db..  # insert 
1b30: 63 6f 72 72 75 70 74 20 62 79 74 65 28 73 29 0a  corrupt byte(s).
1b40: 20 20 68 65 78 69 6f 5f 77 72 69 74 65 20 74 65    hexio_write te
1b50: 73 74 2e 64 62 20 31 30 32 20 5b 66 6f 72 6d 61  st.db 102 [forma
1b60: 74 20 25 30 32 78 20 30 78 31 32 5d 0a 20 20 0a  t %02x 0x12].  .
1b70: 20 20 73 71 6c 69 74 65 33 20 64 62 20 74 65 73    sqlite3 db tes
1b80: 74 2e 64 62 0a 20 20 63 61 74 63 68 73 71 6c 20  t.db.  catchsql 
1b90: 7b 42 45 47 49 4e 3b 20 43 52 45 41 54 45 20 54  {BEGIN; CREATE T
1ba0: 41 42 4c 45 20 74 33 20 41 53 20 53 45 4c 45 43  ABLE t3 AS SELEC
1bb0: 54 20 78 2c 33 20 61 73 20 79 20 46 52 4f 4d 20  T x,3 as y FROM 
1bc0: 74 32 20 57 48 45 52 45 20 72 6f 77 69 64 25 35  t2 WHERE rowid%5
1bd0: 21 3d 30 3b 20 52 4f 4c 4c 42 41 43 4b 3b 7d 0a  !=0; ROLLBACK;}.
1be0: 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20 64  } {1 {database d
1bf0: 69 73 6b 20 69 6d 61 67 65 20 69 73 20 6d 61 6c  isk image is mal
1c00: 66 6f 72 6d 65 64 7d 7d 0a 0a 0a 23 0a 23 20 6e  formed}}...#.# n
1c10: 6f 77 20 74 65 73 74 20 66 6f 72 20 61 20 73 65  ow test for a se
1c20: 72 69 65 73 20 6f 66 20 71 75 61 73 69 2d 72 61  ries of quasi-ra
1c30: 6e 64 6f 6d 20 73 65 65 64 73 0a 66 6f 72 20 7b  ndom seeds.for {
1c40: 73 65 74 20 74 6e 20 30 7d 20 7b 24 74 6e 3c 31  set tn 0} {$tn<1
1c50: 30 32 34 7d 20 7b 69 6e 63 72 20 74 6e 20 31 7d  024} {incr tn 1}
1c60: 20 7b 0a 0a 20 20 23 20 73 65 74 75 70 20 66 6f   {..  # setup fo
1c70: 72 20 74 65 73 74 0a 20 20 64 62 20 63 6c 6f 73  r test.  db clos
1c80: 65 0a 20 20 63 6f 70 79 5f 66 69 6c 65 20 74 65  e.  copy_file te
1c90: 73 74 2e 62 75 20 74 65 73 74 2e 64 62 0a 20 20  st.bu test.db.  
1ca0: 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e  sqlite3 db test.
1cb0: 64 62 0a 0a 20 20 23 20 53 65 65 6b 20 74 6f 20  db..  # Seek to 
1cc0: 61 20 72 61 6e 64 6f 6d 20 6c 6f 63 61 74 69 6f  a random locatio
1cd0: 6e 20 69 6e 20 74 68 65 20 66 69 6c 65 2c 20 61  n in the file, a
1ce0: 6e 64 20 77 72 69 74 65 20 61 20 72 61 6e 64 6f  nd write a rando
1cf0: 6d 20 73 69 6e 67 6c 65 20 62 79 74 65 0a 20 20  m single byte.  
1d00: 23 20 76 61 6c 75 65 2e 20 20 54 68 65 6e 20 64  # value.  Then d
1d10: 6f 20 76 61 72 69 6f 75 73 20 6f 70 65 72 61 74  o various operat
1d20: 69 6f 6e 73 20 6f 6e 20 74 68 65 20 66 69 6c 65  ions on the file
1d30: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
1d40: 61 74 0a 20 20 23 20 74 68 65 20 64 61 74 61 62  at.  # the datab
1d50: 61 73 65 20 65 6e 67 69 6e 65 20 63 61 6e 20 68  ase engine can h
1d60: 61 6e 64 6c 65 20 74 68 65 20 63 6f 72 72 75 70  andle the corrup
1d70: 74 69 6f 6e 20 67 72 61 63 65 66 75 6c 6c 79 2e  tion gracefully.
1d80: 0a 20 20 23 0a 20 20 73 65 74 20 6c 61 73 74 20  .  #.  set last 
1d90: 30 0a 20 20 66 6f 72 20 7b 73 65 74 20 69 20 31  0.  for {set i 1
1da0: 7d 20 7b 24 69 3c 3d 35 31 32 20 26 26 20 21 24  } {$i<=512 && !$
1db0: 6c 61 73 74 7d 20 7b 69 6e 63 72 20 69 20 31 7d  last} {incr i 1}
1dc0: 20 7b 0a 0a 20 20 20 20 23 20 69 6e 73 65 72 74   {..    # insert
1dd0: 20 72 61 6e 64 6f 6d 20 62 79 74 65 20 61 74 20   random byte at 
1de0: 72 61 6e 64 6f 6d 20 6c 6f 63 61 74 69 6f 6e 0a  random location.
1df0: 20 20 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 20      db close.   
1e00: 20 73 65 74 20 72 6f 66 66 73 65 74 20 5b 72 61   set roffset [ra
1e10: 6e 64 6f 6d 20 24 66 73 69 7a 65 5d 0a 20 20 20  ndom $fsize].   
1e20: 20 73 65 74 20 72 62 79 74 65 20 5b 66 6f 72 6d   set rbyte [form
1e30: 61 74 20 25 30 32 78 20 5b 72 61 6e 64 6f 6d 20  at %02x [random 
1e40: 32 35 35 5d 5d 0a 0a 20 20 20 20 23 20 59 6f 75  255]]..    # You
1e50: 20 63 61 6e 20 75 6e 63 6f 6d 6d 65 6e 74 20 74   can uncomment t
1e60: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 6f 20  he following to 
1e70: 68 61 76 65 20 69 74 20 74 72 61 63 65 0a 20 20  have it trace.  
1e80: 20 20 23 20 65 78 61 63 74 6c 79 20 68 6f 77 20    # exactly how 
1e90: 69 74 27 73 20 63 6f 72 72 75 70 74 69 6e 67 20  it's corrupting 
1ea0: 74 68 65 20 66 69 6c 65 2e 20 20 54 68 69 73 20  the file.  This 
1eb0: 69 73 20 0a 20 20 20 20 23 20 75 73 65 66 75 6c  is .    # useful
1ec0: 20 66 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20   for generating 
1ed0: 74 68 65 20 22 73 65 65 64 20 73 70 65 63 69 66  the "seed specif
1ee0: 69 63 22 20 74 65 73 74 73 0a 20 20 20 20 23 20  ic" tests.    # 
1ef0: 61 62 6f 76 65 2e 0a 20 20 20 20 23 20 73 65 74  above..    # set
1f00: 20 72 6c 69 6e 65 20 22 24 72 6f 66 66 73 65 74   rline "$roffset
1f10: 20 24 72 62 79 74 65 22 0a 20 20 20 20 23 20 70   $rbyte".    # p
1f20: 75 74 73 20 73 74 64 6f 75 74 20 24 72 6c 69 6e  uts stdout $rlin
1f30: 65 0a 0a 20 20 20 20 68 65 78 69 6f 5f 77 72 69  e..    hexio_wri
1f40: 74 65 20 74 65 73 74 2e 64 62 20 24 72 6f 66 66  te test.db $roff
1f50: 73 65 74 20 24 72 62 79 74 65 0a 20 20 20 20 73  set $rbyte.    s
1f60: 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64  qlite3 db test.d
1f70: 62 0a 0a 20 20 20 20 23 20 64 6f 20 61 20 66 65  b..    # do a fe
1f80: 77 20 72 61 6e 64 6f 6d 20 6f 70 65 72 61 74 69  w random operati
1f90: 6f 6e 73 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  ons to make sure
1fa0: 20 74 68 61 74 20 69 66 20 0a 20 20 20 20 23 20   that if .    # 
1fb0: 74 68 65 79 20 65 72 72 6f 72 2c 20 74 68 65 79  they error, they
1fc0: 20 65 72 72 6f 72 20 67 72 61 63 65 66 75 6c 6c   error gracefull
1fd0: 79 20 69 6e 73 74 65 61 64 20 6f 66 20 63 72 61  y instead of cra
1fe0: 73 68 69 6e 67 2e 0a 20 20 20 20 64 6f 5f 74 65  shing..    do_te
1ff0: 73 74 20 63 6f 72 72 75 70 74 43 2d 33 2e 24 74  st corruptC-3.$t
2000: 6e 2e 28 24 71 73 65 65 64 29 2e 24 69 2e 31 20  n.($qseed).$i.1 
2010: 7b 0a 20 20 20 20 20 20 63 61 74 63 68 73 71 6c  {.      catchsql
2020: 20 7b 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a   {SELECT count(*
2030: 29 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61  ) FROM sqlite_ma
2040: 73 74 65 72 7d 0a 20 20 20 20 20 20 73 65 74 20  ster}.      set 
2050: 78 20 7b 7d 0a 20 20 20 20 7d 20 7b 7d 0a 20 20  x {}.    } {}.  
2060: 20 20 64 6f 5f 74 65 73 74 20 63 6f 72 72 75 70    do_test corrup
2070: 74 43 2d 33 2e 24 74 6e 2e 28 24 71 73 65 65 64  tC-3.$tn.($qseed
2080: 29 2e 24 69 2e 32 20 7b 0a 20 20 20 20 20 20 63  ).$i.2 {.      c
2090: 61 74 63 68 73 71 6c 20 7b 53 45 4c 45 43 54 20  atchsql {SELECT 
20a0: 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31  count(*) FROM t1
20b0: 7d 0a 20 20 20 20 20 20 73 65 74 20 78 20 7b 7d  }.      set x {}
20c0: 0a 20 20 20 20 7d 20 7b 7d 0a 20 20 20 20 64 6f  .    } {}.    do
20d0: 5f 74 65 73 74 20 63 6f 72 72 75 70 74 43 2d 33  _test corruptC-3
20e0: 2e 24 74 6e 2e 28 24 71 73 65 65 64 29 2e 24 69  .$tn.($qseed).$i
20f0: 2e 33 20 7b 0a 20 20 20 20 20 20 63 61 74 63 68  .3 {.      catch
2100: 73 71 6c 20 7b 53 45 4c 45 43 54 20 63 6f 75 6e  sql {SELECT coun
2110: 74 28 2a 29 20 46 52 4f 4d 20 74 31 20 57 48 45  t(*) FROM t1 WHE
2120: 52 45 20 78 3e 31 33 7d 0a 20 20 20 20 20 20 73  RE x>13}.      s
2130: 65 74 20 78 20 7b 7d 0a 20 20 20 20 7d 20 7b 7d  et x {}.    } {}
2140: 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 63 6f 72  .    do_test cor
2150: 72 75 70 74 43 2d 33 2e 24 74 6e 2e 28 24 71 73  ruptC-3.$tn.($qs
2160: 65 65 64 29 2e 24 69 2e 34 20 7b 0a 20 20 20 20  eed).$i.4 {.    
2170: 20 20 63 61 74 63 68 73 71 6c 20 7b 53 45 4c 45    catchsql {SELE
2180: 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
2190: 20 74 32 7d 0a 20 20 20 20 20 20 73 65 74 20 78   t2}.      set x
21a0: 20 7b 7d 0a 20 20 20 20 7d 20 7b 7d 0a 20 20 20   {}.    } {}.   
21b0: 20 64 6f 5f 74 65 73 74 20 63 6f 72 72 75 70 74   do_test corrupt
21c0: 43 2d 33 2e 24 74 6e 2e 28 24 71 73 65 65 64 29  C-3.$tn.($qseed)
21d0: 2e 24 69 2e 35 20 7b 0a 20 20 20 20 20 20 63 61  .$i.5 {.      ca
21e0: 74 63 68 73 71 6c 20 7b 53 45 4c 45 43 54 20 63  tchsql {SELECT c
21f0: 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 32 20  ount(*) FROM t2 
2200: 57 48 45 52 45 20 78 3c 31 33 7d 0a 20 20 20 20  WHERE x<13}.    
2210: 20 20 73 65 74 20 78 20 7b 7d 0a 20 20 20 20 7d    set x {}.    }
2220: 20 7b 7d 0a 20 20 20 20 64 6f 5f 74 65 73 74 20   {}.    do_test 
2230: 63 6f 72 72 75 70 74 43 2d 33 2e 24 74 6e 2e 28  corruptC-3.$tn.(
2240: 24 71 73 65 65 64 29 2e 24 69 2e 36 20 7b 0a 20  $qseed).$i.6 {. 
2250: 20 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b 42       catchsql {B
2260: 45 47 49 4e 3b 20 55 50 44 41 54 45 20 74 31 20  EGIN; UPDATE t1 
2270: 53 45 54 20 79 3d 31 3b 20 52 4f 4c 4c 42 41 43  SET y=1; ROLLBAC
2280: 4b 3b 7d 0a 20 20 20 20 20 20 73 65 74 20 78 20  K;}.      set x 
2290: 7b 7d 0a 20 20 20 20 7d 20 7b 7d 0a 20 20 20 20  {}.    } {}.    
22a0: 64 6f 5f 74 65 73 74 20 63 6f 72 72 75 70 74 43  do_test corruptC
22b0: 2d 33 2e 24 74 6e 2e 28 24 71 73 65 65 64 29 2e  -3.$tn.($qseed).
22c0: 24 69 2e 37 20 7b 0a 20 20 20 20 20 20 63 61 74  $i.7 {.      cat
22d0: 63 68 73 71 6c 20 7b 42 45 47 49 4e 3b 20 55 50  chsql {BEGIN; UP
22e0: 44 41 54 45 20 74 32 20 53 45 54 20 79 3d 27 61  DATE t2 SET y='a
22f0: 62 63 64 65 66 2d 75 76 77 78 79 7a 27 3b 20 52  bcdef-uvwxyz'; R
2300: 4f 4c 4c 42 41 43 4b 3b 7d 0a 20 20 20 20 20 20  OLLBACK;}.      
2310: 73 65 74 20 78 20 7b 7d 0a 20 20 20 20 7d 20 7b  set x {}.    } {
2320: 7d 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 63 6f  }.    do_test co
2330: 72 72 75 70 74 43 2d 33 2e 24 74 6e 2e 28 24 71  rruptC-3.$tn.($q
2340: 73 65 65 64 29 2e 24 69 2e 38 20 7b 0a 20 20 20  seed).$i.8 {.   
2350: 20 20 20 63 61 74 63 68 73 71 6c 20 7b 42 45 47     catchsql {BEG
2360: 49 4e 3b 20 44 45 4c 45 54 45 20 46 52 4f 4d 20  IN; DELETE FROM 
2370: 74 31 20 57 48 45 52 45 20 78 3e 31 33 3b 20 52  t1 WHERE x>13; R
2380: 4f 4c 4c 42 41 43 4b 3b 7d 0a 20 20 20 20 20 20  OLLBACK;}.      
2390: 73 65 74 20 78 20 7b 7d 0a 20 20 20 20 7d 20 7b  set x {}.    } {
23a0: 7d 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 63 6f  }.    do_test co
23b0: 72 72 75 70 74 43 2d 33 2e 24 74 6e 2e 28 24 71  rruptC-3.$tn.($q
23c0: 73 65 65 64 29 2e 24 69 2e 39 20 7b 0a 20 20 20  seed).$i.9 {.   
23d0: 20 20 20 63 61 74 63 68 73 71 6c 20 7b 42 45 47     catchsql {BEG
23e0: 49 4e 3b 20 44 45 4c 45 54 45 20 46 52 4f 4d 20  IN; DELETE FROM 
23f0: 74 32 20 57 48 45 52 45 20 78 3c 31 33 3b 20 52  t2 WHERE x<13; R
2400: 4f 4c 4c 42 41 43 4b 3b 7d 0a 20 20 20 20 20 20  OLLBACK;}.      
2410: 73 65 74 20 78 20 7b 7d 0a 20 20 20 20 7d 20 7b  set x {}.    } {
2420: 7d 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 63 6f  }.    do_test co
2430: 72 72 75 70 74 43 2d 33 2e 24 74 6e 2e 28 24 71  rruptC-3.$tn.($q
2440: 73 65 65 64 29 2e 24 69 2e 31 30 20 7b 0a 20 20  seed).$i.10 {.  
2450: 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b 42 45      catchsql {BE
2460: 47 49 4e 3b 20 43 52 45 41 54 45 20 54 41 42 4c  GIN; CREATE TABL
2470: 45 20 74 33 20 41 53 20 53 45 4c 45 43 54 20 78  E t3 AS SELECT x
2480: 2c 33 20 61 73 20 79 20 46 52 4f 4d 20 74 32 20  ,3 as y FROM t2 
2490: 57 48 45 52 45 20 72 6f 77 69 64 25 35 21 3d 30  WHERE rowid%5!=0
24a0: 3b 20 52 4f 4c 4c 42 41 43 4b 3b 7d 0a 20 20 20  ; ROLLBACK;}.   
24b0: 20 20 20 73 65 74 20 78 20 7b 7d 0a 20 20 20 20     set x {}.    
24c0: 7d 20 7b 7d 0a 0a 20 20 20 20 23 20 63 68 65 63  } {}..    # chec
24d0: 6b 20 74 68 65 20 69 6e 74 65 67 72 69 74 79 20  k the integrity 
24e0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
24f0: 0a 20 20 20 20 23 20 6f 6e 63 65 20 74 68 65 20  .    # once the 
2500: 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 64 65  corruption is de
2510: 74 65 63 74 65 64 2c 20 77 65 20 63 61 6e 20 73  tected, we can s
2520: 74 6f 70 2e 0a 20 20 20 20 69 66 63 61 70 61 62  top..    ifcapab
2530: 6c 65 20 7b 69 6e 74 65 67 72 69 74 79 63 6b 7d  le {integrityck}
2540: 20 7b 0a 20 20 20 20 20 20 73 65 74 20 72 65 73   {.      set res
2550: 20 5b 20 63 61 74 63 68 73 71 6c 20 7b 50 52 41   [ catchsql {PRA
2560: 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68  GMA integrity_ch
2570: 65 63 6b 7d 20 5d 0a 20 20 20 20 20 20 73 65 74  eck} ].      set
2580: 20 61 6e 73 20 5b 6c 69 6e 64 65 78 20 24 72 65   ans [lindex $re
2590: 73 20 31 5d 0a 20 20 20 20 20 20 69 66 20 7b 20  s 1].      if { 
25a0: 5b 20 73 74 72 69 6e 67 20 63 6f 6d 70 61 72 65  [ string compare
25b0: 20 24 61 6e 73 20 22 6f 6b 22 20 5d 20 21 3d 20   $ans "ok" ] != 
25c0: 30 20 7d 20 7b 0a 20 20 20 20 20 20 20 20 73 65  0 } {.        se
25d0: 74 20 6c 61 73 74 20 2d 31 0a 20 20 20 20 20 20  t last -1.      
25e0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 23 20 69 66  }.    }.    # if
25f0: 20 77 65 20 61 72 65 20 6e 6f 74 20 63 61 70 61   we are not capa
2600: 62 6c 65 20 6f 66 20 64 6f 69 6e 67 20 61 6e 20  ble of doing an 
2610: 69 6e 74 65 67 72 69 74 79 20 63 68 65 63 6b 2c  integrity check,
2620: 0a 20 20 20 20 23 20 73 74 6f 70 20 61 66 74 65  .    # stop afte
2630: 72 20 63 6f 72 72 75 70 74 69 6e 67 20 35 20 62  r corrupting 5 b
2640: 79 74 65 73 2e 0a 20 20 20 20 69 66 63 61 70 61  ytes..    ifcapa
2650: 62 6c 65 20 7b 21 69 6e 74 65 67 72 69 74 79 63  ble {!integrityc
2660: 6b 7d 20 7b 0a 20 20 20 20 20 20 69 66 20 7b 20  k} {.      if { 
2670: 24 69 20 3e 20 35 20 7d 20 7b 0a 20 20 20 20 20  $i > 5 } {.     
2680: 20 20 20 73 65 74 20 6c 61 73 74 20 2d 31 0a 20     set last -1. 
2690: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
26a0: 20 20 23 20 43 68 65 63 6b 20 74 68 61 74 20 6e    # Check that n
26b0: 6f 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65  o page reference
26c0: 73 20 77 65 72 65 20 6c 65 61 6b 65 64 2e 0a 20  s were leaked.. 
26d0: 20 20 20 23 20 54 42 44 3a 20 20 6e 65 65 64 20     # TBD:  need 
26e0: 74 6f 20 66 69 67 75 72 65 20 6f 75 74 20 77 68  to figure out wh
26f0: 79 20 74 68 69 73 20 64 6f 65 73 6e 27 74 20 77  y this doesn't w
2700: 6f 72 6b 0a 20 20 20 20 23 20 77 6f 72 6b 20 77  ork.    # work w
2710: 69 74 68 20 52 4f 4c 4c 42 41 43 4b 73 2e 2e 2e  ith ROLLBACKs...
2720: 0a 20 20 20 20 69 66 20 7b 30 7d 20 7b 0a 20 20  .    if {0} {.  
2730: 20 20 20 20 64 6f 5f 74 65 73 74 20 63 6f 72 72      do_test corr
2740: 75 70 74 43 2d 33 2e 24 74 6e 2e 28 24 71 73 65  uptC-3.$tn.($qse
2750: 65 64 29 2e 24 69 2e 31 31 20 7b 0a 20 20 20 20  ed).$i.11 {.    
2760: 20 20 20 20 73 65 74 20 62 74 20 5b 62 74 72 65      set bt [btre
2770: 65 5f 66 72 6f 6d 5f 64 62 20 64 62 5d 0a 20 20  e_from_db db].  
2780: 20 20 20 20 20 20 64 62 5f 65 6e 74 65 72 20 64        db_enter d
2790: 62 0a 20 20 20 20 20 20 20 20 61 72 72 61 79 20  b.        array 
27a0: 73 65 74 20 73 74 61 74 73 20 5b 62 74 72 65 65  set stats [btree
27b0: 5f 70 61 67 65 72 5f 73 74 61 74 73 20 24 62 74  _pager_stats $bt
27c0: 5d 0a 20 20 20 20 20 20 20 20 64 62 5f 6c 65 61  ].        db_lea
27d0: 76 65 20 64 62 0a 20 20 20 20 20 20 20 20 73 65  ve db.        se
27e0: 74 20 73 74 61 74 73 28 72 65 66 29 0a 20 20 20  t stats(ref).   
27f0: 20 20 20 7d 20 7b 30 7d 0a 20 20 20 20 7d 0a 20     } {0}.    }. 
2800: 20 7d 0a 20 20 23 20 65 6e 64 20 66 6f 72 20 69   }.  # end for i
2810: 0a 0a 7d 0a 23 20 65 6e 64 20 66 6f 72 20 74 6e  ..}.# end for tn
2820: 0a 0a 66 69 6e 69 73 68 5f 74 65 73 74 0a        ..finish_test.