/ Hex Artifact Content
Login

Artifact 483aa35dadfd96bdf549e38d75ffc2942576477e:


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 34 20 32  tC.test,v 1.14 2
02c0: 30 30 39 2f 30 37 2f 31 31 20 30 36 3a 35 35 3a  009/07/11 06:55:
02d0: 33 34 20 64 61 6e 69 65 6c 6b 31 39 37 37 20 45  34 danielk1977 E
02e0: 78 70 20 24 0a 0a 63 61 74 63 68 20 7b 66 69 6c  xp $..catch {fil
02f0: 65 20 64 65 6c 65 74 65 20 2d 66 6f 72 63 65 20  e delete -force 
0300: 74 65 73 74 2e 64 62 20 74 65 73 74 2e 64 62 2d  test.db test.db-
0310: 6a 6f 75 72 6e 61 6c 20 74 65 73 74 2e 62 75 7d  journal test.bu}
0320: 0a 0a 73 65 74 20 74 65 73 74 64 69 72 20 5b 66  ..set testdir [f
0330: 69 6c 65 20 64 69 72 6e 61 6d 65 20 24 61 72 67  ile dirname $arg
0340: 76 30 5d 0a 73 6f 75 72 63 65 20 24 74 65 73 74  v0].source $test
0350: 64 69 72 2f 74 65 73 74 65 72 2e 74 63 6c 0a 0a  dir/tester.tcl..
0360: 23 20 44 6f 20 6e 6f 74 20 75 73 65 20 61 20 63  # Do not use a c
0370: 6f 64 65 63 20 66 6f 72 20 74 65 73 74 73 20 69  odec for tests i
0380: 6e 20 74 68 69 73 20 66 69 6c 65 2c 20 61 73 20  n this file, as 
0390: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
03a0: 65 20 69 73 0a 23 20 6d 61 6e 69 70 75 6c 61 74  e is.# manipulat
03b0: 65 64 20 64 69 72 65 63 74 6c 79 20 75 73 69 6e  ed directly usin
03c0: 67 20 74 63 6c 20 73 63 72 69 70 74 73 20 28 75  g tcl scripts (u
03d0: 73 69 6e 67 20 74 68 65 20 5b 68 65 78 69 6f 5f  sing the [hexio_
03e0: 77 72 69 74 65 5d 20 63 6f 6d 6d 61 6e 64 29 2e  write] command).
03f0: 0a 23 0a 64 6f 5f 6e 6f 74 5f 75 73 65 5f 63 6f  .#.do_not_use_co
0400: 64 65 63 0a 0a 23 20 43 6f 6e 73 74 72 75 63 74  dec..# Construct
0410: 20 61 20 63 6f 6d 70 61 63 74 2c 20 64 65 6e 73   a compact, dens
0420: 65 20 64 61 74 61 62 61 73 65 20 66 6f 72 20 74  e database for t
0430: 65 73 74 69 6e 67 2e 0a 23 0a 64 6f 5f 74 65 73  esting..#.do_tes
0440: 74 20 63 6f 72 72 75 70 74 43 2d 31 2e 31 20 7b  t corruptC-1.1 {
0450: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
0460: 20 50 52 41 47 4d 41 20 61 75 74 6f 5f 76 61 63   PRAGMA auto_vac
0470: 75 75 6d 20 3d 20 30 3b 0a 20 20 20 20 50 52 41  uum = 0;.    PRA
0480: 47 4d 41 20 6c 65 67 61 63 79 5f 66 69 6c 65 5f  GMA legacy_file_
0490: 66 6f 72 6d 61 74 3d 31 3b 0a 20 20 20 20 42 45  format=1;.    BE
04a0: 47 49 4e 3b 0a 20 20 20 20 43 52 45 41 54 45 20  GIN;.    CREATE 
04b0: 54 41 42 4c 45 20 74 31 28 78 2c 79 29 3b 0a 20  TABLE t1(x,y);. 
04c0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
04d0: 31 20 56 41 4c 55 45 53 28 31 2c 31 29 3b 0a 20  1 VALUES(1,1);. 
04e0: 20 20 20 49 4e 53 45 52 54 20 4f 52 20 49 47 4e     INSERT OR IGN
04f0: 4f 52 45 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ORE INTO t1 SELE
0500: 43 54 20 78 2a 32 2c 79 20 46 52 4f 4d 20 74 31  CT x*2,y FROM t1
0510: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 4f 52 20  ;.    INSERT OR 
0520: 49 47 4e 4f 52 45 20 49 4e 54 4f 20 74 31 20 53  IGNORE INTO t1 S
0530: 45 4c 45 43 54 20 78 2a 33 2c 79 20 46 52 4f 4d  ELECT x*3,y FROM
0540: 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   t1;.    INSERT 
0550: 4f 52 20 49 47 4e 4f 52 45 20 49 4e 54 4f 20 74  OR IGNORE INTO t
0560: 31 20 53 45 4c 45 43 54 20 78 2a 35 2c 79 20 46  1 SELECT x*5,y F
0570: 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45  ROM t1;.    INSE
0580: 52 54 20 4f 52 20 49 47 4e 4f 52 45 20 49 4e 54  RT OR IGNORE INT
0590: 4f 20 74 31 20 53 45 4c 45 43 54 20 78 2a 37 2c  O t1 SELECT x*7,
05a0: 79 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49  y FROM t1;.    I
05b0: 4e 53 45 52 54 20 4f 52 20 49 47 4e 4f 52 45 20  NSERT OR IGNORE 
05c0: 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 78  INTO t1 SELECT x
05d0: 2a 31 31 2c 79 20 46 52 4f 4d 20 74 31 3b 0a 20  *11,y FROM t1;. 
05e0: 20 20 20 49 4e 53 45 52 54 20 4f 52 20 49 47 4e     INSERT OR IGN
05f0: 4f 52 45 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ORE INTO t1 SELE
0600: 43 54 20 78 2a 31 33 2c 79 20 46 52 4f 4d 20 74  CT x*13,y FROM t
0610: 31 3b 0a 20 20 20 20 43 52 45 41 54 45 20 49 4e  1;.    CREATE IN
0620: 44 45 58 20 74 31 69 31 20 4f 4e 20 74 31 28 78  DEX t1i1 ON t1(x
0630: 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  );.    CREATE TA
0640: 42 4c 45 20 74 32 20 41 53 20 53 45 4c 45 43 54  BLE t2 AS SELECT
0650: 20 78 2c 32 20 61 73 20 79 20 46 52 4f 4d 20 74   x,2 as y FROM t
0660: 31 20 57 48 45 52 45 20 72 6f 77 69 64 25 35 21  1 WHERE rowid%5!
0670: 3d 30 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a  =0;.    COMMIT;.
0680: 20 20 7d 0a 7d 20 7b 7d 0a 0a 69 66 63 61 70 61    }.} {}..ifcapa
0690: 62 6c 65 20 7b 69 6e 74 65 67 72 69 74 79 63 6b  ble {integrityck
06a0: 7d 20 7b 0a 20 20 69 6e 74 65 67 72 69 74 79 5f  } {.  integrity_
06b0: 63 68 65 63 6b 20 63 6f 72 72 75 70 74 43 2d 31  check corruptC-1
06c0: 2e 32 0a 7d 0a 0a 23 20 47 65 6e 65 72 61 74 65  .2.}..# Generate
06d0: 20 72 61 6e 64 6f 6d 20 69 6e 74 65 67 65 72 0a   random integer.
06e0: 23 0a 70 72 6f 63 20 72 61 6e 64 6f 6d 20 7b 72  #.proc random {r
06f0: 61 6e 67 65 7d 20 7b 0a 20 20 72 65 74 75 72 6e  ange} {.  return
0700: 20 5b 65 78 70 72 20 7b 72 6f 75 6e 64 28 72 61   [expr {round(ra
0710: 6e 64 28 29 2a 24 72 61 6e 67 65 29 7d 5d 0a 7d  nd()*$range)}].}
0720: 0a 0a 23 20 43 6f 70 79 20 66 69 6c 65 20 24 66  ..# Copy file $f
0730: 72 6f 6d 20 69 6e 74 6f 20 24 74 6f 0a 23 0a 70  rom into $to.#.p
0740: 72 6f 63 20 63 6f 70 79 5f 66 69 6c 65 20 7b 66  roc copy_file {f
0750: 72 6f 6d 20 74 6f 7d 20 7b 0a 20 20 66 69 6c 65  rom to} {.  file
0760: 20 63 6f 70 79 20 2d 66 6f 72 63 65 20 24 66 72   copy -force $fr
0770: 6f 6d 20 24 74 6f 0a 7d 0a 0a 23 20 53 65 74 75  om $to.}..# Setu
0780: 70 20 66 6f 72 20 74 68 65 20 74 65 73 74 73 2e  p for the tests.
0790: 20 20 4d 61 6b 65 20 61 20 62 61 63 6b 75 70 20    Make a backup 
07a0: 63 6f 70 79 20 6f 66 20 74 68 65 20 67 6f 6f 64  copy of the good
07b0: 20 64 61 74 61 62 61 73 65 20 69 6e 20 74 65 73   database in tes
07c0: 74 2e 62 75 2e 0a 23 0a 64 62 20 63 6c 6f 73 65  t.bu..#.db close
07d0: 0a 63 6f 70 79 5f 66 69 6c 65 20 74 65 73 74 2e  .copy_file test.
07e0: 64 62 20 74 65 73 74 2e 62 75 0a 73 71 6c 69 74  db test.bu.sqlit
07f0: 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 73 65  e3 db test.db.se
0800: 74 20 66 73 69 7a 65 20 5b 66 69 6c 65 20 73 69  t fsize [file si
0810: 7a 65 20 74 65 73 74 2e 64 62 5d 0a 0a 23 20 53  ze test.db]..# S
0820: 65 74 20 61 20 71 75 61 73 69 2d 72 61 6e 64 6f  et a quasi-rando
0830: 6d 20 72 61 6e 64 6f 6d 20 73 65 65 64 2e 20 0a  m random seed. .
0840: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
0850: 20 3a 3a 47 28 69 73 73 6f 61 6b 29 5d 7d 20 7b   ::G(issoak)]} {
0860: 0a 20 20 23 20 49 66 20 77 65 20 61 72 65 20 64  .  # If we are d
0870: 6f 69 6e 67 20 53 4f 41 4b 20 74 65 73 74 73 2c  oing SOAK tests,
0880: 20 77 65 20 77 61 6e 74 20 61 20 64 69 66 66 65   we want a diffe
0890: 72 65 6e 74 0a 20 20 23 20 72 61 6e 64 6f 6d 20  rent.  # random 
08a0: 73 65 65 64 20 66 6f 72 20 65 61 63 68 20 72 75  seed for each ru
08b0: 6e 2e 20 20 49 64 65 61 6c 6c 79 20 77 65 20 77  n.  Ideally we w
08c0: 6f 75 6c 64 20 6c 69 6b 65 20 0a 20 20 23 20 74  ould like .  # t
08d0: 6f 20 75 73 65 20 5b 63 6c 6f 63 6b 20 63 6c 69  o use [clock cli
08e0: 63 6b 73 5d 20 6f 72 20 73 6f 6d 65 74 68 69 6e  cks] or somethin
08f0: 67 20 6c 69 6b 65 20 74 68 61 74 20 68 65 72 65  g like that here
0900: 2e 0a 20 20 73 65 74 20 71 73 65 65 64 20 5b 66  ..  set qseed [f
0910: 69 6c 65 20 6d 74 69 6d 65 20 74 65 73 74 2e 64  ile mtime test.d
0920: 62 5d 0a 7d 20 65 6c 73 65 20 7b 0a 20 20 23 20  b].} else {.  # 
0930: 49 66 20 77 65 20 61 72 65 20 6e 6f 74 20 64 6f  If we are not do
0940: 69 6e 67 20 73 6f 61 6b 20 74 65 73 74 73 2c 0a  ing soak tests,.
0950: 20 20 23 20 6d 61 6b 65 20 69 74 20 72 65 70 65    # make it repe
0960: 61 74 61 62 6c 65 2e 0a 20 20 73 65 74 20 71 73  atable..  set qs
0970: 65 65 64 20 30 0a 7d 0a 65 78 70 72 20 73 72 61  eed 0.}.expr sra
0980: 6e 64 28 24 71 73 65 65 64 29 0a 0a 23 0a 23 20  nd($qseed)..#.# 
0990: 46 69 72 73 74 20 74 65 73 74 20 73 6f 6d 65 20  First test some 
09a0: 73 70 65 63 69 66 69 63 20 63 6f 72 72 75 70 74  specific corrupt
09b0: 69 6f 6e 20 74 65 73 74 73 20 66 6f 75 6e 64 20  ion tests found 
09c0: 66 72 6f 6d 20 65 61 72 6c 69 65 72 20 72 75 6e  from earlier run
09d0: 73 0a 23 20 77 69 74 68 20 73 70 65 63 69 66 69  s.# with specifi
09e0: 63 20 73 65 65 64 73 2e 0a 23 0a 0a 23 20 74 65  c seeds..#..# te
09f0: 73 74 20 74 68 61 74 20 61 20 63 6f 72 72 75 70  st that a corrup
0a00: 74 20 63 6f 6e 74 65 6e 74 20 6f 66 66 73 65 74  t content offset
0a10: 20 73 69 7a 65 20 69 73 20 68 61 6e 64 6c 65 64   size is handled
0a20: 20 28 73 65 65 64 20 35 35 37 37 29 0a 64 6f 5f   (seed 5577).do_
0a30: 74 65 73 74 20 63 6f 72 72 75 70 74 43 2d 32 2e  test corruptC-2.
0a40: 31 20 7b 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20  1 {.  db close. 
0a50: 20 63 6f 70 79 5f 66 69 6c 65 20 74 65 73 74 2e   copy_file test.
0a60: 62 75 20 74 65 73 74 2e 64 62 0a 0a 20 20 23 20  bu test.db..  # 
0a70: 69 6e 73 65 72 74 20 63 6f 72 72 75 70 74 20 62  insert corrupt b
0a80: 79 74 65 28 73 29 0a 20 20 68 65 78 69 6f 5f 77  yte(s).  hexio_w
0a90: 72 69 74 65 20 74 65 73 74 2e 64 62 20 32 30 35  rite test.db 205
0aa0: 33 20 5b 66 6f 72 6d 61 74 20 25 30 32 78 20 30  3 [format %02x 0
0ab0: 78 30 34 5d 0a 0a 20 20 73 71 6c 69 74 65 33 20  x04]..  sqlite3 
0ac0: 64 62 20 74 65 73 74 2e 64 62 0a 20 20 63 61 74  db test.db.  cat
0ad0: 63 68 73 71 6c 20 7b 50 52 41 47 4d 41 20 69 6e  chsql {PRAGMA in
0ae0: 74 65 67 72 69 74 79 5f 63 68 65 63 6b 7d 0a 7d  tegrity_check}.}
0af0: 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20 64 69   {1 {database di
0b00: 73 6b 20 69 6d 61 67 65 20 69 73 20 6d 61 6c 66  sk image is malf
0b10: 6f 72 6d 65 64 7d 7d 0a 0a 23 20 74 65 73 74 20  ormed}}..# test 
0b20: 74 68 61 74 20 61 20 63 6f 72 72 75 70 74 20 63  that a corrupt c
0b30: 6f 6e 74 65 6e 74 20 6f 66 66 73 65 74 20 73 69  ontent offset si
0b40: 7a 65 20 69 73 20 68 61 6e 64 6c 65 64 20 28 73  ze is handled (s
0b50: 65 65 64 20 35 36 34 39 29 0a 64 6f 5f 74 65 73  eed 5649).do_tes
0b60: 74 20 63 6f 72 72 75 70 74 43 2d 32 2e 32 20 7b  t corruptC-2.2 {
0b70: 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 63 6f  .  db close.  co
0b80: 70 79 5f 66 69 6c 65 20 74 65 73 74 2e 62 75 20  py_file test.bu 
0b90: 74 65 73 74 2e 64 62 0a 0a 20 20 23 20 69 6e 73  test.db..  # ins
0ba0: 65 72 74 20 63 6f 72 72 75 70 74 20 62 79 74 65  ert corrupt byte
0bb0: 28 73 29 0a 20 20 68 65 78 69 6f 5f 77 72 69 74  (s).  hexio_writ
0bc0: 65 20 74 65 73 74 2e 64 62 20 32 37 20 20 20 5b  e test.db 27   [
0bd0: 66 6f 72 6d 61 74 20 25 30 32 78 20 30 78 30 38  format %02x 0x08
0be0: 5d 0a 20 20 68 65 78 69 6f 5f 77 72 69 74 65 20  ].  hexio_write 
0bf0: 74 65 73 74 2e 64 62 20 32 33 33 20 20 5b 66 6f  test.db 233  [fo
0c00: 72 6d 61 74 20 25 30 32 78 20 30 78 36 61 5d 0a  rmat %02x 0x6a].
0c10: 20 20 68 65 78 69 6f 5f 77 72 69 74 65 20 74 65    hexio_write te
0c20: 73 74 2e 64 62 20 33 32 38 20 20 5b 66 6f 72 6d  st.db 328  [form
0c30: 61 74 20 25 30 32 78 20 30 78 36 37 5d 0a 20 20  at %02x 0x67].  
0c40: 68 65 78 69 6f 5f 77 72 69 74 65 20 74 65 73 74  hexio_write test
0c50: 2e 64 62 20 37 35 30 20 20 5b 66 6f 72 6d 61 74  .db 750  [format
0c60: 20 25 30 32 78 20 30 78 31 66 5d 0a 20 20 68 65   %02x 0x1f].  he
0c70: 78 69 6f 5f 77 72 69 74 65 20 74 65 73 74 2e 64  xio_write test.d
0c80: 62 20 31 31 33 32 20 5b 66 6f 72 6d 61 74 20 25  b 1132 [format %
0c90: 30 32 78 20 30 78 35 32 5d 0a 20 20 68 65 78 69  02x 0x52].  hexi
0ca0: 6f 5f 77 72 69 74 65 20 74 65 73 74 2e 64 62 20  o_write test.db 
0cb0: 31 31 33 33 20 5b 66 6f 72 6d 61 74 20 25 30 32  1133 [format %02
0cc0: 78 20 30 78 38 34 5d 0a 20 20 68 65 78 69 6f 5f  x 0x84].  hexio_
0cd0: 77 72 69 74 65 20 74 65 73 74 2e 64 62 20 31 32  write test.db 12
0ce0: 32 30 20 5b 66 6f 72 6d 61 74 20 25 30 32 78 20  20 [format %02x 
0cf0: 30 78 30 31 5d 0a 20 20 68 65 78 69 6f 5f 77 72  0x01].  hexio_wr
0d00: 69 74 65 20 74 65 73 74 2e 64 62 20 33 36 38 38  ite test.db 3688
0d10: 20 5b 66 6f 72 6d 61 74 20 25 30 32 78 20 30 78   [format %02x 0x
0d20: 63 31 5d 0a 20 20 68 65 78 69 6f 5f 77 72 69 74  c1].  hexio_writ
0d30: 65 20 74 65 73 74 2e 64 62 20 33 37 31 34 20 5b  e test.db 3714 [
0d40: 66 6f 72 6d 61 74 20 25 30 32 78 20 30 78 35 38  format %02x 0x58
0d50: 5d 0a 20 20 68 65 78 69 6f 5f 77 72 69 74 65 20  ].  hexio_write 
0d60: 74 65 73 74 2e 64 62 20 33 37 34 36 20 5b 66 6f  test.db 3746 [fo
0d70: 72 6d 61 74 20 25 30 32 78 20 30 78 39 61 5d 0a  rmat %02x 0x9a].
0d80: 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 74 65  .  sqlite3 db te
0d90: 73 74 2e 64 62 0a 20 20 63 61 74 63 68 73 71 6c  st.db.  catchsql
0da0: 20 7b 55 50 44 41 54 45 20 74 31 20 53 45 54 20   {UPDATE t1 SET 
0db0: 79 3d 31 7d 0a 7d 20 7b 31 20 7b 64 61 74 61 62  y=1}.} {1 {datab
0dc0: 61 73 65 20 64 69 73 6b 20 69 6d 61 67 65 20 69  ase disk image i
0dd0: 73 20 6d 61 6c 66 6f 72 6d 65 64 7d 7d 0a 0a 23  s malformed}}..#
0de0: 20 74 65 73 74 20 74 68 61 74 20 61 20 63 6f 72   test that a cor
0df0: 72 75 70 74 20 66 72 65 65 20 63 65 6c 6c 20 73  rupt free cell s
0e00: 69 7a 65 20 69 73 20 68 61 6e 64 6c 65 64 20 28  ize is handled (
0e10: 73 65 65 64 20 31 33 33 32 39 29 0a 64 6f 5f 74  seed 13329).do_t
0e20: 65 73 74 20 63 6f 72 72 75 70 74 43 2d 32 2e 33  est corruptC-2.3
0e30: 20 7b 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20   {.  db close.  
0e40: 63 6f 70 79 5f 66 69 6c 65 20 74 65 73 74 2e 62  copy_file test.b
0e50: 75 20 74 65 73 74 2e 64 62 0a 0a 20 20 23 20 69  u test.db..  # i
0e60: 6e 73 65 72 74 20 63 6f 72 72 75 70 74 20 62 79  nsert corrupt by
0e70: 74 65 28 73 29 0a 20 20 68 65 78 69 6f 5f 77 72  te(s).  hexio_wr
0e80: 69 74 65 20 74 65 73 74 2e 64 62 20 31 30 39 34  ite test.db 1094
0e90: 20 5b 66 6f 72 6d 61 74 20 25 30 32 78 20 30 78   [format %02x 0x
0ea0: 37 36 5d 0a 0a 20 20 73 71 6c 69 74 65 33 20 64  76]..  sqlite3 d
0eb0: 62 20 74 65 73 74 2e 64 62 0a 20 20 63 61 74 63  b test.db.  catc
0ec0: 68 73 71 6c 20 7b 55 50 44 41 54 45 20 74 31 20  hsql {UPDATE t1 
0ed0: 53 45 54 20 79 3d 31 7d 0a 7d 20 7b 31 20 7b 64  SET y=1}.} {1 {d
0ee0: 61 74 61 62 61 73 65 20 64 69 73 6b 20 69 6d 61  atabase disk ima
0ef0: 67 65 20 69 73 20 6d 61 6c 66 6f 72 6d 65 64 7d  ge is malformed}
0f00: 7d 0a 0a 23 20 74 65 73 74 20 74 68 61 74 20 61  }..# test that a
0f10: 20 63 6f 72 72 75 70 74 20 66 72 65 65 20 63 65   corrupt free ce
0f20: 6c 6c 20 73 69 7a 65 20 69 73 20 68 61 6e 64 6c  ll size is handl
0f30: 65 64 20 28 73 65 65 64 20 31 36 39 35 37 31 29  ed (seed 169571)
0f40: 0a 64 6f 5f 74 65 73 74 20 63 6f 72 72 75 70 74  .do_test corrupt
0f50: 43 2d 32 2e 34 20 7b 0a 20 20 64 62 20 63 6c 6f  C-2.4 {.  db clo
0f60: 73 65 0a 20 20 63 6f 70 79 5f 66 69 6c 65 20 74  se.  copy_file t
0f70: 65 73 74 2e 62 75 20 74 65 73 74 2e 64 62 0a 0a  est.bu test.db..
0f80: 20 20 23 20 69 6e 73 65 72 74 20 63 6f 72 72 75    # insert corru
0f90: 70 74 20 62 79 74 65 28 73 29 0a 20 20 68 65 78  pt byte(s).  hex
0fa0: 69 6f 5f 77 72 69 74 65 20 74 65 73 74 2e 64 62  io_write test.db
0fb0: 20 33 31 31 39 20 5b 66 6f 72 6d 61 74 20 25 30   3119 [format %0
0fc0: 32 78 20 30 78 64 66 5d 0a 0a 20 20 73 71 6c 69  2x 0xdf]..  sqli
0fd0: 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20  te3 db test.db. 
0fe0: 20 63 61 74 63 68 73 71 6c 20 7b 55 50 44 41 54   catchsql {UPDAT
0ff0: 45 20 74 32 20 53 45 54 20 79 3d 27 61 62 63 64  E t2 SET y='abcd
1000: 65 66 2d 75 76 77 78 79 7a 27 7d 0a 7d 20 7b 31  ef-uvwxyz'}.} {1
1010: 20 7b 64 61 74 61 62 61 73 65 20 64 69 73 6b 20   {database disk 
1020: 69 6d 61 67 65 20 69 73 20 6d 61 6c 66 6f 72 6d  image is malform
1030: 65 64 7d 7d 0a 0a 23 20 74 65 73 74 20 74 68 61  ed}}..# test tha
1040: 74 20 61 20 63 6f 72 72 75 70 74 20 66 72 65 65  t a corrupt free
1050: 20 63 65 6c 6c 20 73 69 7a 65 20 69 73 20 68 61   cell size is ha
1060: 6e 64 6c 65 64 20 28 73 65 65 64 20 31 36 39 35  ndled (seed 1695
1070: 37 31 29 0a 64 6f 5f 74 65 73 74 20 63 6f 72 72  71).do_test corr
1080: 75 70 74 43 2d 32 2e 35 20 7b 0a 20 20 64 62 20  uptC-2.5 {.  db 
1090: 63 6c 6f 73 65 0a 20 20 63 6f 70 79 5f 66 69 6c  close.  copy_fil
10a0: 65 20 74 65 73 74 2e 62 75 20 74 65 73 74 2e 64  e test.bu test.d
10b0: 62 0a 0a 20 20 23 20 69 6e 73 65 72 74 20 63 6f  b..  # insert co
10c0: 72 72 75 70 74 20 62 79 74 65 28 73 29 0a 20 20  rrupt byte(s).  
10d0: 68 65 78 69 6f 5f 77 72 69 74 65 20 74 65 73 74  hexio_write test
10e0: 2e 64 62 20 33 31 31 39 20 5b 66 6f 72 6d 61 74  .db 3119 [format
10f0: 20 25 30 32 78 20 30 78 64 66 5d 0a 20 20 68 65   %02x 0xdf].  he
1100: 78 69 6f 5f 77 72 69 74 65 20 74 65 73 74 2e 64  xio_write test.d
1110: 62 20 34 30 37 33 20 5b 66 6f 72 6d 61 74 20 25  b 4073 [format %
1120: 30 32 78 20 30 78 62 66 5d 0a 0a 20 20 73 71 6c  02x 0xbf]..  sql
1130: 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a  ite3 db test.db.
1140: 20 20 63 61 74 63 68 73 71 6c 20 7b 42 45 47 49    catchsql {BEGI
1150: 4e 3b 20 55 50 44 41 54 45 20 74 32 20 53 45 54  N; UPDATE t2 SET
1160: 20 79 3d 27 61 62 63 64 65 66 2d 75 76 77 78 79   y='abcdef-uvwxy
1170: 7a 27 3b 20 52 4f 4c 4c 42 41 43 4b 3b 7d 0a 20  z'; ROLLBACK;}. 
1180: 20 63 61 74 63 68 73 71 6c 20 7b 50 52 41 47 4d   catchsql {PRAGM
1190: 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63  A integrity_chec
11a0: 6b 7d 0a 7d 20 7b 30 20 7b 7b 2a 2a 2a 20 69 6e  k}.} {0 {{*** in
11b0: 20 64 61 74 61 62 61 73 65 20 6d 61 69 6e 20 2a   database main *
11c0: 2a 2a 0a 50 61 67 65 20 34 3a 20 62 74 72 65 65  **.Page 4: btree
11d0: 49 6e 69 74 50 61 67 65 28 29 20 72 65 74 75 72  InitPage() retur
11e0: 6e 73 20 65 72 72 6f 72 20 63 6f 64 65 20 31 31  ns error code 11
11f0: 7d 7d 7d 0a 0a 23 20 7b 30 20 7b 7b 2a 2a 2a 20  }}}..# {0 {{*** 
1200: 69 6e 20 64 61 74 61 62 61 73 65 20 6d 61 69 6e  in database main
1210: 20 2a 2a 2a 0a 23 20 43 6f 72 72 75 70 74 69 6f   ***.# Corruptio
1220: 6e 20 64 65 74 65 63 74 65 64 20 69 6e 20 63 65  n detected in ce
1230: 6c 6c 20 37 31 30 20 6f 6e 20 70 61 67 65 20 34  ll 710 on page 4
1240: 0a 23 20 4d 75 6c 74 69 70 6c 65 20 75 73 65 73  .# Multiple uses
1250: 20 66 6f 72 20 62 79 74 65 20 36 36 31 20 6f 66   for byte 661 of
1260: 20 70 61 67 65 20 34 0a 23 20 46 72 61 67 6d 65   page 4.# Fragme
1270: 6e 74 65 64 20 73 70 61 63 65 20 69 73 20 32 34  nted space is 24
1280: 39 20 62 79 74 65 20 72 65 70 6f 72 74 65 64 20  9 byte reported 
1290: 61 73 20 32 31 20 6f 6e 20 70 61 67 65 20 34 7d  as 21 on page 4}
12a0: 7d 7d 0a 0a 23 20 74 65 73 74 20 74 68 61 74 20  }}..# test that 
12b0: 61 20 63 6f 72 72 75 70 74 20 66 72 65 65 20 63  a corrupt free c
12c0: 65 6c 6c 20 73 69 7a 65 20 69 73 20 68 61 6e 64  ell size is hand
12d0: 6c 65 64 20 28 73 65 65 64 20 31 36 39 35 39 35  led (seed 169595
12e0: 29 0a 64 6f 5f 74 65 73 74 20 63 6f 72 72 75 70  ).do_test corrup
12f0: 74 43 2d 32 2e 36 20 7b 0a 20 20 64 62 20 63 6c  tC-2.6 {.  db cl
1300: 6f 73 65 0a 20 20 63 6f 70 79 5f 66 69 6c 65 20  ose.  copy_file 
1310: 74 65 73 74 2e 62 75 20 74 65 73 74 2e 64 62 0a  test.bu test.db.
1320: 0a 20 20 23 20 69 6e 73 65 72 74 20 63 6f 72 72  .  # insert corr
1330: 75 70 74 20 62 79 74 65 28 73 29 0a 20 20 68 65  upt byte(s).  he
1340: 78 69 6f 5f 77 72 69 74 65 20 74 65 73 74 2e 64  xio_write test.d
1350: 62 20 36 31 39 20 5b 66 6f 72 6d 61 74 20 25 30  b 619 [format %0
1360: 32 78 20 30 78 65 32 5d 0a 20 20 68 65 78 69 6f  2x 0xe2].  hexio
1370: 5f 77 72 69 74 65 20 74 65 73 74 2e 64 62 20 33  _write test.db 3
1380: 31 35 30 20 5b 66 6f 72 6d 61 74 20 25 30 32 78  150 [format %02x
1390: 20 30 78 61 38 5d 0a 0a 20 20 73 71 6c 69 74 65   0xa8]..  sqlite
13a0: 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20 63  3 db test.db.  c
13b0: 61 74 63 68 73 71 6c 20 7b 42 45 47 49 4e 3b 20  atchsql {BEGIN; 
13c0: 55 50 44 41 54 45 20 74 32 20 53 45 54 20 79 3d  UPDATE t2 SET y=
13d0: 27 61 62 63 64 65 66 2d 75 76 77 78 79 7a 27 3b  'abcdef-uvwxyz';
13e0: 20 52 4f 4c 4c 42 41 43 4b 3b 7d 0a 7d 20 7b 31   ROLLBACK;}.} {1
13f0: 20 7b 64 61 74 61 62 61 73 65 20 64 69 73 6b 20   {database disk 
1400: 69 6d 61 67 65 20 69 73 20 6d 61 6c 66 6f 72 6d  image is malform
1410: 65 64 7d 7d 0a 0a 23 20 63 6f 72 72 75 70 74 69  ed}}..# corrupti
1420: 6f 6e 20 28 73 65 65 64 20 31 37 38 36 39 32 29  on (seed 178692)
1430: 0a 64 6f 5f 74 65 73 74 20 63 6f 72 72 75 70 74  .do_test corrupt
1440: 43 2d 32 2e 37 20 7b 0a 20 20 64 62 20 63 6c 6f  C-2.7 {.  db clo
1450: 73 65 0a 20 20 63 6f 70 79 5f 66 69 6c 65 20 74  se.  copy_file t
1460: 65 73 74 2e 62 75 20 74 65 73 74 2e 64 62 0a 0a  est.bu test.db..
1470: 20 20 23 20 69 6e 73 65 72 74 20 63 6f 72 72 75    # insert corru
1480: 70 74 20 62 79 74 65 28 73 29 0a 20 20 68 65 78  pt byte(s).  hex
1490: 69 6f 5f 77 72 69 74 65 20 74 65 73 74 2e 64 62  io_write test.db
14a0: 20 33 30 37 34 20 5b 66 6f 72 6d 61 74 20 25 30   3074 [format %0
14b0: 32 78 20 30 78 61 30 5d 0a 0a 20 20 73 71 6c 69  2x 0xa0]..  sqli
14c0: 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20  te3 db test.db. 
14d0: 20 63 61 74 63 68 73 71 6c 20 7b 42 45 47 49 4e   catchsql {BEGIN
14e0: 3b 20 55 50 44 41 54 45 20 74 32 20 53 45 54 20  ; UPDATE t2 SET 
14f0: 79 3d 27 61 62 63 64 65 66 2d 75 76 77 78 79 7a  y='abcdef-uvwxyz
1500: 27 3b 20 52 4f 4c 4c 42 41 43 4b 3b 7d 0a 7d 20  '; ROLLBACK;}.} 
1510: 7b 31 20 7b 64 61 74 61 62 61 73 65 20 64 69 73  {1 {database dis
1520: 6b 20 69 6d 61 67 65 20 69 73 20 6d 61 6c 66 6f  k image is malfo
1530: 72 6d 65 64 7d 7d 0a 0a 23 20 63 6f 72 72 75 70  rmed}}..# corrup
1540: 74 69 6f 6e 20 28 73 65 65 64 20 31 37 39 30 36  tion (seed 17906
1550: 39 29 0a 64 6f 5f 74 65 73 74 20 63 6f 72 72 75  9).do_test corru
1560: 70 74 43 2d 32 2e 38 20 7b 0a 20 20 64 62 20 63  ptC-2.8 {.  db c
1570: 6c 6f 73 65 0a 20 20 63 6f 70 79 5f 66 69 6c 65  lose.  copy_file
1580: 20 74 65 73 74 2e 62 75 20 74 65 73 74 2e 64 62   test.bu test.db
1590: 0a 0a 20 20 23 20 69 6e 73 65 72 74 20 63 6f 72  ..  # insert cor
15a0: 72 75 70 74 20 62 79 74 65 28 73 29 0a 20 20 68  rupt byte(s).  h
15b0: 65 78 69 6f 5f 77 72 69 74 65 20 74 65 73 74 2e  exio_write test.
15c0: 64 62 20 31 33 39 33 20 5b 66 6f 72 6d 61 74 20  db 1393 [format 
15d0: 25 30 32 78 20 30 78 37 64 5d 0a 20 20 68 65 78  %02x 0x7d].  hex
15e0: 69 6f 5f 77 72 69 74 65 20 74 65 73 74 2e 64 62  io_write test.db
15f0: 20 38 34 20 5b 66 6f 72 6d 61 74 20 25 30 32 78   84 [format %02x
1600: 20 30 78 31 39 5d 0a 20 20 68 65 78 69 6f 5f 77   0x19].  hexio_w
1610: 72 69 74 65 20 74 65 73 74 2e 64 62 20 33 32 38  rite test.db 328
1620: 37 20 5b 66 6f 72 6d 61 74 20 25 30 32 78 20 30  7 [format %02x 0
1630: 78 33 62 5d 0a 20 20 68 65 78 69 6f 5f 77 72 69  x3b].  hexio_wri
1640: 74 65 20 74 65 73 74 2e 64 62 20 32 35 36 34 20  te test.db 2564 
1650: 5b 66 6f 72 6d 61 74 20 25 30 32 78 20 30 78 65  [format %02x 0xe
1660: 64 5d 0a 20 20 68 65 78 69 6f 5f 77 72 69 74 65  d].  hexio_write
1670: 20 74 65 73 74 2e 64 62 20 32 31 33 39 20 5b 66   test.db 2139 [f
1680: 6f 72 6d 61 74 20 25 30 32 78 20 30 78 35 35 5d  ormat %02x 0x55]
1690: 0a 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 74  ..  sqlite3 db t
16a0: 65 73 74 2e 64 62 0a 20 20 63 61 74 63 68 73 71  est.db.  catchsq
16b0: 6c 20 7b 42 45 47 49 4e 3b 20 44 45 4c 45 54 45  l {BEGIN; DELETE
16c0: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 78   FROM t1 WHERE x
16d0: 3e 31 33 3b 20 52 4f 4c 4c 42 41 43 4b 3b 7d 0a  >13; ROLLBACK;}.
16e0: 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20 64  } {1 {database d
16f0: 69 73 6b 20 69 6d 61 67 65 20 69 73 20 6d 61 6c  isk image is mal
1700: 66 6f 72 6d 65 64 7d 7d 0a 0a 23 20 63 6f 72 72  formed}}..# corr
1710: 75 70 74 69 6f 6e 20 28 73 65 65 64 20 31 37 30  uption (seed 170
1720: 34 33 34 29 0a 64 6f 5f 74 65 73 74 20 63 6f 72  434).do_test cor
1730: 72 75 70 74 43 2d 32 2e 39 20 7b 0a 20 20 64 62  ruptC-2.9 {.  db
1740: 20 63 6c 6f 73 65 0a 20 20 63 6f 70 79 5f 66 69   close.  copy_fi
1750: 6c 65 20 74 65 73 74 2e 62 75 20 74 65 73 74 2e  le test.bu test.
1760: 64 62 0a 0a 20 20 23 20 69 6e 73 65 72 74 20 63  db..  # insert c
1770: 6f 72 72 75 70 74 20 62 79 74 65 28 73 29 0a 20  orrupt byte(s). 
1780: 20 68 65 78 69 6f 5f 77 72 69 74 65 20 74 65 73   hexio_write tes
1790: 74 2e 64 62 20 32 30 39 35 20 5b 66 6f 72 6d 61  t.db 2095 [forma
17a0: 74 20 25 30 32 78 20 30 78 64 36 5d 0a 0a 20 20  t %02x 0xd6]..  
17b0: 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e  sqlite3 db test.
17c0: 64 62 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 42  db.  catchsql {B
17d0: 45 47 49 4e 3b 20 44 45 4c 45 54 45 20 46 52 4f  EGIN; DELETE FRO
17e0: 4d 20 74 31 20 57 48 45 52 45 20 78 3e 31 33 3b  M t1 WHERE x>13;
17f0: 20 52 4f 4c 4c 42 41 43 4b 3b 7d 0a 7d 20 7b 31   ROLLBACK;}.} {1
1800: 20 7b 64 61 74 61 62 61 73 65 20 64 69 73 6b 20   {database disk 
1810: 69 6d 61 67 65 20 69 73 20 6d 61 6c 66 6f 72 6d  image is malform
1820: 65 64 7d 7d 0a 0a 23 20 63 6f 72 72 75 70 74 69  ed}}..# corrupti
1830: 6f 6e 20 28 73 65 65 64 20 31 38 36 35 30 34 29  on (seed 186504)
1840: 0a 64 6f 5f 74 65 73 74 20 63 6f 72 72 75 70 74  .do_test corrupt
1850: 43 2d 32 2e 31 30 20 7b 0a 20 20 64 62 20 63 6c  C-2.10 {.  db cl
1860: 6f 73 65 0a 20 20 63 6f 70 79 5f 66 69 6c 65 20  ose.  copy_file 
1870: 74 65 73 74 2e 62 75 20 74 65 73 74 2e 64 62 0a  test.bu test.db.
1880: 0a 20 20 23 20 69 6e 73 65 72 74 20 63 6f 72 72  .  # insert corr
1890: 75 70 74 20 62 79 74 65 28 73 29 0a 20 20 68 65  upt byte(s).  he
18a0: 78 69 6f 5f 77 72 69 74 65 20 74 65 73 74 2e 64  xio_write test.d
18b0: 62 20 33 31 33 30 20 5b 66 6f 72 6d 61 74 20 25  b 3130 [format %
18c0: 30 32 78 20 30 78 30 32 5d 0a 20 20 0a 20 20 73  02x 0x02].  .  s
18d0: 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64  qlite3 db test.d
18e0: 62 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 42 45  b.  catchsql {BE
18f0: 47 49 4e 3b 20 55 50 44 41 54 45 20 74 32 20 53  GIN; UPDATE t2 S
1900: 45 54 20 79 3d 27 61 62 63 64 65 66 2d 75 76 77  ET y='abcdef-uvw
1910: 78 79 7a 27 3b 20 52 4f 4c 4c 42 41 43 4b 3b 7d  xyz'; ROLLBACK;}
1920: 0a 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20  .} {1 {database 
1930: 64 69 73 6b 20 69 6d 61 67 65 20 69 73 20 6d 61  disk image is ma
1940: 6c 66 6f 72 6d 65 64 7d 7d 0a 0a 23 20 63 6f 72  lformed}}..# cor
1950: 72 75 70 74 69 6f 6e 20 28 73 65 65 64 20 31 35  ruption (seed 15
1960: 38 39 29 0a 64 6f 5f 74 65 73 74 20 63 6f 72 72  89).do_test corr
1970: 75 70 74 43 2d 32 2e 31 31 20 7b 0a 20 20 64 62  uptC-2.11 {.  db
1980: 20 63 6c 6f 73 65 0a 20 20 63 6f 70 79 5f 66 69   close.  copy_fi
1990: 6c 65 20 74 65 73 74 2e 62 75 20 74 65 73 74 2e  le test.bu test.
19a0: 64 62 0a 0a 20 20 23 20 69 6e 73 65 72 74 20 63  db..  # insert c
19b0: 6f 72 72 75 70 74 20 62 79 74 65 28 73 29 0a 20  orrupt byte(s). 
19c0: 20 68 65 78 69 6f 5f 77 72 69 74 65 20 74 65 73   hexio_write tes
19d0: 74 2e 64 62 20 35 35 20 5b 66 6f 72 6d 61 74 20  t.db 55 [format 
19e0: 25 30 32 78 20 30 78 61 37 5d 0a 20 20 0a 20 20  %02x 0xa7].  .  
19f0: 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e  sqlite3 db test.
1a00: 64 62 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 42  db.  catchsql {B
1a10: 45 47 49 4e 3b 20 43 52 45 41 54 45 20 54 41 42  EGIN; CREATE TAB
1a20: 4c 45 20 74 33 20 41 53 20 53 45 4c 45 43 54 20  LE t3 AS SELECT 
1a30: 78 2c 33 20 61 73 20 79 20 46 52 4f 4d 20 74 32  x,3 as y FROM t2
1a40: 20 57 48 45 52 45 20 72 6f 77 69 64 25 35 21 3d   WHERE rowid%5!=
1a50: 30 3b 20 52 4f 4c 4c 42 41 43 4b 3b 7d 0a 7d 20  0; ROLLBACK;}.} 
1a60: 7b 31 20 7b 64 61 74 61 62 61 73 65 20 64 69 73  {1 {database dis
1a70: 6b 20 69 6d 61 67 65 20 69 73 20 6d 61 6c 66 6f  k image is malfo
1a80: 72 6d 65 64 7d 7d 0a 0a 23 20 63 6f 72 72 75 70  rmed}}..# corrup
1a90: 74 69 6f 6e 20 28 73 65 65 64 20 31 34 31 36 36  tion (seed 14166
1aa0: 29 0a 64 6f 5f 74 65 73 74 20 63 6f 72 72 75 70  ).do_test corrup
1ab0: 74 43 2d 32 2e 31 32 20 7b 0a 20 20 64 62 20 63  tC-2.12 {.  db c
1ac0: 6c 6f 73 65 0a 20 20 63 6f 70 79 5f 66 69 6c 65  lose.  copy_file
1ad0: 20 74 65 73 74 2e 62 75 20 74 65 73 74 2e 64 62   test.bu test.db
1ae0: 0a 0a 20 20 23 20 69 6e 73 65 72 74 20 63 6f 72  ..  # insert cor
1af0: 72 75 70 74 20 62 79 74 65 28 73 29 0a 20 20 68  rupt byte(s).  h
1b00: 65 78 69 6f 5f 77 72 69 74 65 20 74 65 73 74 2e  exio_write test.
1b10: 64 62 20 39 37 34 20 5b 66 6f 72 6d 61 74 20 25  db 974 [format %
1b20: 30 32 78 20 30 78 32 65 5d 0a 20 20 0a 20 20 73  02x 0x2e].  .  s
1b30: 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64  qlite3 db test.d
1b40: 62 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 53 45  b.  catchsql {SE
1b50: 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
1b60: 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  OM sqlite_master
1b70: 3b 7d 0a 7d 20 7b 31 20 7b 6d 61 6c 66 6f 72 6d  ;}.} {1 {malform
1b80: 65 64 20 64 61 74 61 62 61 73 65 20 73 63 68 65  ed database sche
1b90: 6d 61 20 28 74 31 69 31 29 20 2d 20 63 6f 72 72  ma (t1i1) - corr
1ba0: 75 70 74 20 64 61 74 61 62 61 73 65 7d 7d 0a 0a  upt database}}..
1bb0: 23 20 63 6f 72 72 75 70 74 69 6f 6e 20 28 73 65  # corruption (se
1bc0: 65 64 20 32 31 38 38 30 33 29 0a 64 6f 5f 74 65  ed 218803).do_te
1bd0: 73 74 20 63 6f 72 72 75 70 74 43 2d 32 2e 31 33  st corruptC-2.13
1be0: 20 7b 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20   {.  db close.  
1bf0: 63 6f 70 79 5f 66 69 6c 65 20 74 65 73 74 2e 62  copy_file test.b
1c00: 75 20 74 65 73 74 2e 64 62 0a 0a 20 20 23 20 69  u test.db..  # i
1c10: 6e 73 65 72 74 20 63 6f 72 72 75 70 74 20 62 79  nsert corrupt by
1c20: 74 65 28 73 29 0a 20 20 68 65 78 69 6f 5f 77 72  te(s).  hexio_wr
1c30: 69 74 65 20 74 65 73 74 2e 64 62 20 31 30 32 20  ite test.db 102 
1c40: 5b 66 6f 72 6d 61 74 20 25 30 32 78 20 30 78 31  [format %02x 0x1
1c50: 32 5d 0a 20 20 0a 20 20 73 71 6c 69 74 65 33 20  2].  .  sqlite3 
1c60: 64 62 20 74 65 73 74 2e 64 62 0a 20 20 63 61 74  db test.db.  cat
1c70: 63 68 73 71 6c 20 7b 42 45 47 49 4e 3b 20 43 52  chsql {BEGIN; CR
1c80: 45 41 54 45 20 54 41 42 4c 45 20 74 33 20 41 53  EATE TABLE t3 AS
1c90: 20 53 45 4c 45 43 54 20 78 2c 33 20 61 73 20 79   SELECT x,3 as y
1ca0: 20 46 52 4f 4d 20 74 32 20 57 48 45 52 45 20 72   FROM t2 WHERE r
1cb0: 6f 77 69 64 25 35 21 3d 30 3b 20 52 4f 4c 4c 42  owid%5!=0; ROLLB
1cc0: 41 43 4b 3b 7d 0a 7d 20 7b 31 20 7b 64 61 74 61  ACK;}.} {1 {data
1cd0: 62 61 73 65 20 64 69 73 6b 20 69 6d 61 67 65 20  base disk image 
1ce0: 69 73 20 6d 61 6c 66 6f 72 6d 65 64 7d 7d 0a 0a  is malformed}}..
1cf0: 64 6f 5f 74 65 73 74 20 63 6f 72 72 75 70 74 43  do_test corruptC
1d00: 2d 32 2e 31 34 20 7b 0a 20 20 64 62 20 63 6c 6f  -2.14 {.  db clo
1d10: 73 65 0a 20 20 63 6f 70 79 5f 66 69 6c 65 20 74  se.  copy_file t
1d20: 65 73 74 2e 62 75 20 74 65 73 74 2e 64 62 0a 0a  est.bu test.db..
1d30: 20 20 73 71 6c 69 74 65 33 20 64 62 20 74 65 73    sqlite3 db tes
1d40: 74 2e 64 62 0a 20 20 73 65 74 20 62 6c 6f 62 20  t.db.  set blob 
1d50: 5b 73 74 72 69 6e 67 20 72 65 70 65 61 74 20 61  [string repeat a
1d60: 62 63 64 65 66 67 68 69 6a 20 31 30 30 30 30 5d  bcdefghij 10000]
1d70: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53  .  execsql { INS
1d80: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
1d90: 45 53 20 28 31 2c 20 24 62 6c 6f 62 29 20 7d 0a  ES (1, $blob) }.
1da0: 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 74 65  .  sqlite3 db te
1db0: 73 74 2e 64 62 0a 20 20 73 65 74 20 66 69 6c 65  st.db.  set file
1dc0: 73 69 7a 65 20 5b 66 69 6c 65 20 73 69 7a 65 20  size [file size 
1dd0: 74 65 73 74 2e 64 62 5d 0a 20 20 68 65 78 69 6f  test.db].  hexio
1de0: 5f 77 72 69 74 65 20 74 65 73 74 2e 64 62 20 5b  _write test.db [
1df0: 65 78 70 72 20 24 66 69 6c 65 73 69 7a 65 2d 32  expr $filesize-2
1e00: 30 34 38 5d 20 30 30 30 30 30 30 30 31 0a 20 20  048] 00000001.  
1e10: 63 61 74 63 68 73 71 6c 20 7b 44 45 4c 45 54 45  catchsql {DELETE
1e20: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 72   FROM t1 WHERE r
1e30: 6f 77 69 64 20 3d 20 28 53 45 4c 45 43 54 20 6d  owid = (SELECT m
1e40: 61 78 28 72 6f 77 69 64 29 20 46 52 4f 4d 20 74  ax(rowid) FROM t
1e50: 31 29 7d 0a 7d 20 7b 31 20 7b 64 61 74 61 62 61  1)}.} {1 {databa
1e60: 73 65 20 64 69 73 6b 20 69 6d 61 67 65 20 69 73  se disk image is
1e70: 20 6d 61 6c 66 6f 72 6d 65 64 7d 7d 0a 0a 23 20   malformed}}..# 
1e80: 41 74 20 6f 6e 65 20 70 6f 69 6e 74 20 74 68 69  At one point thi
1e90: 73 20 70 61 72 74 69 63 75 6c 61 72 20 63 6f 72  s particular cor
1ea0: 72 75 70 74 20 64 61 74 61 62 61 73 65 20 77 61  rupt database wa
1eb0: 73 20 63 61 75 73 69 6e 67 20 61 20 62 75 66 66  s causing a buff
1ec0: 65 72 0a 23 20 6f 76 65 72 72 65 61 64 2e 20 57  er.# overread. W
1ed0: 68 69 63 68 20 63 61 75 73 65 64 20 61 20 63 72  hich caused a cr
1ee0: 61 73 68 20 69 6e 20 61 20 72 75 6e 20 6f 66 20  ash in a run of 
1ef0: 61 6c 6c 2e 74 65 73 74 20 6f 6e 63 65 2e 0a 23  all.test once..#
1f00: 0a 64 6f 5f 74 65 73 74 20 63 6f 72 72 75 70 74  .do_test corrupt
1f10: 43 2d 32 2e 31 35 20 7b 0a 20 20 64 62 20 63 6c  C-2.15 {.  db cl
1f20: 6f 73 65 0a 20 20 63 6f 70 79 5f 66 69 6c 65 20  ose.  copy_file 
1f30: 74 65 73 74 2e 62 75 20 74 65 73 74 2e 64 62 0a  test.bu test.db.
1f40: 20 20 68 65 78 69 6f 5f 77 72 69 74 65 20 74 65    hexio_write te
1f50: 73 74 2e 64 62 20 39 38 36 20 62 39 0a 20 20 73  st.db 986 b9.  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 20 20 63 61 74 63 68 73 71 6c 20 7b 53 45  b.  catchsql {SE
1f80: 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
1f90: 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  OM sqlite_master
1fa0: 3b 7d 0a 7d 20 7b 31 20 7b 6d 61 6c 66 6f 72 6d  ;}.} {1 {malform
1fb0: 65 64 20 64 61 74 61 62 61 73 65 20 73 63 68 65  ed database sche
1fc0: 6d 61 20 28 74 31 69 31 29 20 2d 20 6e 6f 20 73  ma (t1i1) - no s
1fd0: 75 63 68 20 74 61 62 6c 65 3a 20 6d 61 69 6e 2e  uch table: main.
1fe0: 74 31 7d 7d 0a 0a 23 0a 23 20 4e 6f 77 20 74 65  t1}}..#.# Now te
1ff0: 73 74 20 66 6f 72 20 61 20 73 65 72 69 65 73 20  st for a series 
2000: 6f 66 20 71 75 61 73 69 2d 72 61 6e 64 6f 6d 20  of quasi-random 
2010: 73 65 65 64 73 2e 0a 23 20 57 65 20 6c 6f 6f 70  seeds..# We loop
2020: 20 6f 76 65 72 20 74 68 65 20 65 6e 74 69 72 65   over the entire
2030: 20 66 69 6c 65 20 73 69 7a 65 20 61 6e 64 20 74   file size and t
2040: 6f 75 63 68 0a 23 20 65 61 63 68 20 62 79 74 65  ouch.# each byte
2050: 20 61 74 20 6c 65 61 73 74 20 6f 6e 63 65 2e 0a   at least once..
2060: 66 6f 72 20 7b 73 65 74 20 74 6e 20 30 7d 20 7b  for {set tn 0} {
2070: 24 74 6e 3c 24 66 73 69 7a 65 7d 20 7b 69 6e 63  $tn<$fsize} {inc
2080: 72 20 74 6e 20 31 7d 20 7b 0a 0a 20 20 23 20 73  r tn 1} {..  # s
2090: 65 74 75 70 20 66 6f 72 20 74 65 73 74 0a 20 20  etup for test.  
20a0: 64 62 20 63 6c 6f 73 65 0a 20 20 63 6f 70 79 5f  db close.  copy_
20b0: 66 69 6c 65 20 74 65 73 74 2e 62 75 20 74 65 73  file test.bu tes
20c0: 74 2e 64 62 0a 20 20 73 71 6c 69 74 65 33 20 64  t.db.  sqlite3 d
20d0: 62 20 74 65 73 74 2e 64 62 0a 0a 20 20 23 20 53  b test.db..  # S
20e0: 65 65 6b 20 74 6f 20 61 20 72 61 6e 64 6f 6d 20  eek to a random 
20f0: 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20  location in the 
2100: 66 69 6c 65 2c 20 61 6e 64 20 77 72 69 74 65 20  file, and write 
2110: 61 20 72 61 6e 64 6f 6d 20 73 69 6e 67 6c 65 20  a random single 
2120: 62 79 74 65 0a 20 20 23 20 76 61 6c 75 65 2e 20  byte.  # value. 
2130: 20 54 68 65 6e 20 64 6f 20 76 61 72 69 6f 75 73   Then do various
2140: 20 6f 70 65 72 61 74 69 6f 6e 73 20 6f 6e 20 74   operations on t
2150: 68 65 20 66 69 6c 65 20 74 6f 20 6d 61 6b 65 20  he file to make 
2160: 73 75 72 65 20 74 68 61 74 0a 20 20 23 20 74 68  sure that.  # th
2170: 65 20 64 61 74 61 62 61 73 65 20 65 6e 67 69 6e  e database engin
2180: 65 20 63 61 6e 20 68 61 6e 64 6c 65 20 74 68 65  e can handle the
2190: 20 63 6f 72 72 75 70 74 69 6f 6e 20 67 72 61 63   corruption grac
21a0: 65 66 75 6c 6c 79 2e 0a 20 20 23 0a 20 20 73 65  efully..  #.  se
21b0: 74 20 6c 61 73 74 20 30 0a 20 20 66 6f 72 20 7b  t last 0.  for {
21c0: 73 65 74 20 69 20 31 7d 20 7b 24 69 3c 3d 35 31  set i 1} {$i<=51
21d0: 32 20 26 26 20 21 24 6c 61 73 74 7d 20 7b 69 6e  2 && !$last} {in
21e0: 63 72 20 69 20 31 7d 20 7b 0a 0a 20 20 20 20 64  cr i 1} {..    d
21f0: 62 20 63 6c 6f 73 65 0a 20 20 20 20 69 66 20 7b  b close.    if {
2200: 24 69 3d 3d 31 7d 20 7b 0a 20 20 20 20 20 20 23  $i==1} {.      #
2210: 20 6f 6e 20 74 68 65 20 66 69 72 73 74 20 63 6f   on the first co
2220: 72 72 75 70 74 20 76 61 6c 75 65 2c 20 75 73 65  rrupt value, use
2230: 20 6c 6f 63 61 74 69 6f 6e 20 24 74 6e 0a 20 20   location $tn.  
2240: 20 20 20 20 23 20 74 68 69 73 20 65 6e 73 75 72      # this ensur
2250: 65 73 20 74 68 61 74 20 77 65 20 74 6f 75 63 68  es that we touch
2260: 20 65 61 63 68 20 6c 6f 63 61 74 69 6f 6e 20 69   each location i
2270: 6e 20 74 68 65 20 0a 20 20 20 20 20 20 23 20 66  n the .      # f
2280: 69 6c 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 63  ile at least onc
2290: 65 2e 0a 20 20 20 20 20 20 73 65 74 20 72 6f 66  e..      set rof
22a0: 66 73 65 74 20 24 74 6e 0a 20 20 20 20 7d 20 65  fset $tn.    } e
22b0: 6c 73 65 20 7b 20 0a 20 20 20 20 20 20 23 20 69  lse { .      # i
22c0: 6e 73 65 72 74 20 72 61 6e 64 6f 6d 20 62 79 74  nsert random byt
22d0: 65 20 61 74 20 72 61 6e 64 6f 6d 20 6c 6f 63 61  e at random loca
22e0: 74 69 6f 6e 0a 20 20 20 20 20 20 73 65 74 20 72  tion.      set r
22f0: 6f 66 66 73 65 74 20 5b 72 61 6e 64 6f 6d 20 24  offset [random $
2300: 66 73 69 7a 65 5d 0a 20 20 20 20 7d 0a 20 20 20  fsize].    }.   
2310: 20 73 65 74 20 72 62 79 74 65 20 5b 66 6f 72 6d   set rbyte [form
2320: 61 74 20 25 30 32 78 20 5b 72 61 6e 64 6f 6d 20  at %02x [random 
2330: 32 35 35 5d 5d 0a 0a 20 20 20 20 23 20 59 6f 75  255]]..    # You
2340: 20 63 61 6e 20 75 6e 63 6f 6d 6d 65 6e 74 20 74   can uncomment t
2350: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 6f 20  he following to 
2360: 68 61 76 65 20 69 74 20 74 72 61 63 65 0a 20 20  have it trace.  
2370: 20 20 23 20 65 78 61 63 74 6c 79 20 68 6f 77 20    # exactly how 
2380: 69 74 27 73 20 63 6f 72 72 75 70 74 69 6e 67 20  it's corrupting 
2390: 74 68 65 20 66 69 6c 65 2e 20 20 54 68 69 73 20  the file.  This 
23a0: 69 73 20 0a 20 20 20 20 23 20 75 73 65 66 75 6c  is .    # useful
23b0: 20 66 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20   for generating 
23c0: 74 68 65 20 22 73 65 65 64 20 73 70 65 63 69 66  the "seed specif
23d0: 69 63 22 20 74 65 73 74 73 0a 20 20 20 20 23 20  ic" tests.    # 
23e0: 61 62 6f 76 65 2e 0a 20 20 20 20 23 20 73 65 74  above..    # set
23f0: 20 72 6c 69 6e 65 20 22 24 72 6f 66 66 73 65 74   rline "$roffset
2400: 20 24 72 62 79 74 65 22 0a 20 20 20 20 23 20 70   $rbyte".    # p
2410: 75 74 73 20 73 74 64 6f 75 74 20 24 72 6c 69 6e  uts stdout $rlin
2420: 65 0a 0a 20 20 20 20 68 65 78 69 6f 5f 77 72 69  e..    hexio_wri
2430: 74 65 20 74 65 73 74 2e 64 62 20 24 72 6f 66 66  te test.db $roff
2440: 73 65 74 20 24 72 62 79 74 65 0a 20 20 20 20 73  set $rbyte.    s
2450: 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64  qlite3 db test.d
2460: 62 0a 0a 20 20 20 20 23 20 64 6f 20 61 20 66 65  b..    # do a fe
2470: 77 20 72 61 6e 64 6f 6d 20 6f 70 65 72 61 74 69  w random operati
2480: 6f 6e 73 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  ons to make sure
2490: 20 74 68 61 74 20 69 66 20 0a 20 20 20 20 23 20   that if .    # 
24a0: 74 68 65 79 20 65 72 72 6f 72 2c 20 74 68 65 79  they error, they
24b0: 20 65 72 72 6f 72 20 67 72 61 63 65 66 75 6c 6c   error gracefull
24c0: 79 20 69 6e 73 74 65 61 64 20 6f 66 20 63 72 61  y instead of cra
24d0: 73 68 69 6e 67 2e 0a 20 20 20 20 64 6f 5f 74 65  shing..    do_te
24e0: 73 74 20 63 6f 72 72 75 70 74 43 2d 33 2e 24 74  st corruptC-3.$t
24f0: 6e 2e 28 24 71 73 65 65 64 29 2e 24 69 2e 31 20  n.($qseed).$i.1 
2500: 7b 0a 20 20 20 20 20 20 63 61 74 63 68 73 71 6c  {.      catchsql
2510: 20 7b 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a   {SELECT count(*
2520: 29 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61  ) FROM sqlite_ma
2530: 73 74 65 72 7d 0a 20 20 20 20 20 20 73 65 74 20  ster}.      set 
2540: 78 20 7b 7d 0a 20 20 20 20 7d 20 7b 7d 0a 20 20  x {}.    } {}.  
2550: 20 20 64 6f 5f 74 65 73 74 20 63 6f 72 72 75 70    do_test corrup
2560: 74 43 2d 33 2e 24 74 6e 2e 28 24 71 73 65 65 64  tC-3.$tn.($qseed
2570: 29 2e 24 69 2e 32 20 7b 0a 20 20 20 20 20 20 63  ).$i.2 {.      c
2580: 61 74 63 68 73 71 6c 20 7b 53 45 4c 45 43 54 20  atchsql {SELECT 
2590: 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31  count(*) FROM t1
25a0: 7d 0a 20 20 20 20 20 20 73 65 74 20 78 20 7b 7d  }.      set x {}
25b0: 0a 20 20 20 20 7d 20 7b 7d 0a 20 20 20 20 64 6f  .    } {}.    do
25c0: 5f 74 65 73 74 20 63 6f 72 72 75 70 74 43 2d 33  _test corruptC-3
25d0: 2e 24 74 6e 2e 28 24 71 73 65 65 64 29 2e 24 69  .$tn.($qseed).$i
25e0: 2e 33 20 7b 0a 20 20 20 20 20 20 63 61 74 63 68  .3 {.      catch
25f0: 73 71 6c 20 7b 53 45 4c 45 43 54 20 63 6f 75 6e  sql {SELECT coun
2600: 74 28 2a 29 20 46 52 4f 4d 20 74 31 20 57 48 45  t(*) FROM t1 WHE
2610: 52 45 20 78 3e 31 33 7d 0a 20 20 20 20 20 20 73  RE x>13}.      s
2620: 65 74 20 78 20 7b 7d 0a 20 20 20 20 7d 20 7b 7d  et x {}.    } {}
2630: 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 63 6f 72  .    do_test cor
2640: 72 75 70 74 43 2d 33 2e 24 74 6e 2e 28 24 71 73  ruptC-3.$tn.($qs
2650: 65 65 64 29 2e 24 69 2e 34 20 7b 0a 20 20 20 20  eed).$i.4 {.    
2660: 20 20 63 61 74 63 68 73 71 6c 20 7b 53 45 4c 45    catchsql {SELE
2670: 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
2680: 20 74 32 7d 0a 20 20 20 20 20 20 73 65 74 20 78   t2}.      set x
2690: 20 7b 7d 0a 20 20 20 20 7d 20 7b 7d 0a 20 20 20   {}.    } {}.   
26a0: 20 64 6f 5f 74 65 73 74 20 63 6f 72 72 75 70 74   do_test corrupt
26b0: 43 2d 33 2e 24 74 6e 2e 28 24 71 73 65 65 64 29  C-3.$tn.($qseed)
26c0: 2e 24 69 2e 35 20 7b 0a 20 20 20 20 20 20 63 61  .$i.5 {.      ca
26d0: 74 63 68 73 71 6c 20 7b 53 45 4c 45 43 54 20 63  tchsql {SELECT c
26e0: 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 32 20  ount(*) FROM t2 
26f0: 57 48 45 52 45 20 78 3c 31 33 7d 0a 20 20 20 20  WHERE x<13}.    
2700: 20 20 73 65 74 20 78 20 7b 7d 0a 20 20 20 20 7d    set x {}.    }
2710: 20 7b 7d 0a 20 20 20 20 64 6f 5f 74 65 73 74 20   {}.    do_test 
2720: 63 6f 72 72 75 70 74 43 2d 33 2e 24 74 6e 2e 28  corruptC-3.$tn.(
2730: 24 71 73 65 65 64 29 2e 24 69 2e 36 20 7b 0a 20  $qseed).$i.6 {. 
2740: 20 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b 42       catchsql {B
2750: 45 47 49 4e 3b 20 55 50 44 41 54 45 20 74 31 20  EGIN; UPDATE t1 
2760: 53 45 54 20 79 3d 31 3b 20 52 4f 4c 4c 42 41 43  SET y=1; ROLLBAC
2770: 4b 3b 7d 0a 20 20 20 20 20 20 73 65 74 20 78 20  K;}.      set x 
2780: 7b 7d 0a 20 20 20 20 7d 20 7b 7d 0a 20 20 20 20  {}.    } {}.    
2790: 64 6f 5f 74 65 73 74 20 63 6f 72 72 75 70 74 43  do_test corruptC
27a0: 2d 33 2e 24 74 6e 2e 28 24 71 73 65 65 64 29 2e  -3.$tn.($qseed).
27b0: 24 69 2e 37 20 7b 0a 20 20 20 20 20 20 63 61 74  $i.7 {.      cat
27c0: 63 68 73 71 6c 20 7b 42 45 47 49 4e 3b 20 55 50  chsql {BEGIN; UP
27d0: 44 41 54 45 20 74 32 20 53 45 54 20 79 3d 27 61  DATE t2 SET y='a
27e0: 62 63 64 65 66 2d 75 76 77 78 79 7a 27 3b 20 52  bcdef-uvwxyz'; R
27f0: 4f 4c 4c 42 41 43 4b 3b 7d 0a 20 20 20 20 20 20  OLLBACK;}.      
2800: 73 65 74 20 78 20 7b 7d 0a 20 20 20 20 7d 20 7b  set x {}.    } {
2810: 7d 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 63 6f  }.    do_test co
2820: 72 72 75 70 74 43 2d 33 2e 24 74 6e 2e 28 24 71  rruptC-3.$tn.($q
2830: 73 65 65 64 29 2e 24 69 2e 38 20 7b 0a 20 20 20  seed).$i.8 {.   
2840: 20 20 20 63 61 74 63 68 73 71 6c 20 7b 42 45 47     catchsql {BEG
2850: 49 4e 3b 20 44 45 4c 45 54 45 20 46 52 4f 4d 20  IN; DELETE FROM 
2860: 74 31 20 57 48 45 52 45 20 78 3e 31 33 3b 20 52  t1 WHERE x>13; R
2870: 4f 4c 4c 42 41 43 4b 3b 7d 0a 20 20 20 20 20 20  OLLBACK;}.      
2880: 73 65 74 20 78 20 7b 7d 0a 20 20 20 20 7d 20 7b  set x {}.    } {
2890: 7d 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 63 6f  }.    do_test co
28a0: 72 72 75 70 74 43 2d 33 2e 24 74 6e 2e 28 24 71  rruptC-3.$tn.($q
28b0: 73 65 65 64 29 2e 24 69 2e 39 20 7b 0a 20 20 20  seed).$i.9 {.   
28c0: 20 20 20 63 61 74 63 68 73 71 6c 20 7b 42 45 47     catchsql {BEG
28d0: 49 4e 3b 20 44 45 4c 45 54 45 20 46 52 4f 4d 20  IN; DELETE FROM 
28e0: 74 32 20 57 48 45 52 45 20 78 3c 31 33 3b 20 52  t2 WHERE x<13; R
28f0: 4f 4c 4c 42 41 43 4b 3b 7d 0a 20 20 20 20 20 20  OLLBACK;}.      
2900: 73 65 74 20 78 20 7b 7d 0a 20 20 20 20 7d 20 7b  set x {}.    } {
2910: 7d 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 63 6f  }.    do_test co
2920: 72 72 75 70 74 43 2d 33 2e 24 74 6e 2e 28 24 71  rruptC-3.$tn.($q
2930: 73 65 65 64 29 2e 24 69 2e 31 30 20 7b 0a 20 20  seed).$i.10 {.  
2940: 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b 42 45      catchsql {BE
2950: 47 49 4e 3b 20 43 52 45 41 54 45 20 54 41 42 4c  GIN; CREATE TABL
2960: 45 20 74 33 20 41 53 20 53 45 4c 45 43 54 20 78  E t3 AS SELECT x
2970: 2c 33 20 61 73 20 79 20 46 52 4f 4d 20 74 32 20  ,3 as y FROM t2 
2980: 57 48 45 52 45 20 72 6f 77 69 64 25 35 21 3d 30  WHERE rowid%5!=0
2990: 3b 20 52 4f 4c 4c 42 41 43 4b 3b 7d 0a 20 20 20  ; ROLLBACK;}.   
29a0: 20 20 20 73 65 74 20 78 20 7b 7d 0a 20 20 20 20     set x {}.    
29b0: 7d 20 7b 7d 0a 0a 20 20 20 20 23 20 63 68 65 63  } {}..    # chec
29c0: 6b 20 74 68 65 20 69 6e 74 65 67 72 69 74 79 20  k the integrity 
29d0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
29e0: 0a 20 20 20 20 23 20 6f 6e 63 65 20 74 68 65 20  .    # once the 
29f0: 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 64 65  corruption is de
2a00: 74 65 63 74 65 64 2c 20 77 65 20 63 61 6e 20 73  tected, we can s
2a10: 74 6f 70 2e 0a 20 20 20 20 69 66 63 61 70 61 62  top..    ifcapab
2a20: 6c 65 20 7b 69 6e 74 65 67 72 69 74 79 63 6b 7d  le {integrityck}
2a30: 20 7b 0a 20 20 20 20 20 20 73 65 74 20 72 65 73   {.      set res
2a40: 20 5b 20 63 61 74 63 68 73 71 6c 20 7b 50 52 41   [ catchsql {PRA
2a50: 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68  GMA integrity_ch
2a60: 65 63 6b 7d 20 5d 0a 20 20 20 20 20 20 73 65 74  eck} ].      set
2a70: 20 61 6e 73 20 5b 6c 69 6e 64 65 78 20 24 72 65   ans [lindex $re
2a80: 73 20 31 5d 0a 20 20 20 20 20 20 69 66 20 7b 20  s 1].      if { 
2a90: 5b 20 73 74 72 69 6e 67 20 63 6f 6d 70 61 72 65  [ string compare
2aa0: 20 24 61 6e 73 20 22 6f 6b 22 20 5d 20 21 3d 20   $ans "ok" ] != 
2ab0: 30 20 7d 20 7b 0a 20 20 20 20 20 20 20 20 73 65  0 } {.        se
2ac0: 74 20 6c 61 73 74 20 2d 31 0a 20 20 20 20 20 20  t last -1.      
2ad0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 23 20 69 66  }.    }.    # if
2ae0: 20 77 65 20 61 72 65 20 6e 6f 74 20 63 61 70 61   we are not capa
2af0: 62 6c 65 20 6f 66 20 64 6f 69 6e 67 20 61 6e 20  ble of doing an 
2b00: 69 6e 74 65 67 72 69 74 79 20 63 68 65 63 6b 2c  integrity check,
2b10: 0a 20 20 20 20 23 20 73 74 6f 70 20 61 66 74 65  .    # stop afte
2b20: 72 20 63 6f 72 72 75 70 74 69 6e 67 20 35 20 62  r corrupting 5 b
2b30: 79 74 65 73 2e 0a 20 20 20 20 69 66 63 61 70 61  ytes..    ifcapa
2b40: 62 6c 65 20 7b 21 69 6e 74 65 67 72 69 74 79 63  ble {!integrityc
2b50: 6b 7d 20 7b 0a 20 20 20 20 20 20 69 66 20 7b 20  k} {.      if { 
2b60: 24 69 20 3e 20 35 20 7d 20 7b 0a 20 20 20 20 20  $i > 5 } {.     
2b70: 20 20 20 73 65 74 20 6c 61 73 74 20 2d 31 0a 20     set last -1. 
2b80: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
2b90: 20 20 23 20 43 68 65 63 6b 20 74 68 61 74 20 6e    # Check that n
2ba0: 6f 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65  o page reference
2bb0: 73 20 77 65 72 65 20 6c 65 61 6b 65 64 2e 0a 20  s were leaked.. 
2bc0: 20 20 20 23 20 54 42 44 3a 20 20 6e 65 65 64 20     # TBD:  need 
2bd0: 74 6f 20 66 69 67 75 72 65 20 6f 75 74 20 77 68  to figure out wh
2be0: 79 20 74 68 69 73 20 64 6f 65 73 6e 27 74 20 77  y this doesn't w
2bf0: 6f 72 6b 0a 20 20 20 20 23 20 77 6f 72 6b 20 77  ork.    # work w
2c00: 69 74 68 20 52 4f 4c 4c 42 41 43 4b 73 2e 2e 2e  ith ROLLBACKs...
2c10: 0a 20 20 20 20 69 66 20 7b 30 7d 20 7b 0a 20 20  .    if {0} {.  
2c20: 20 20 20 20 64 6f 5f 74 65 73 74 20 63 6f 72 72      do_test corr
2c30: 75 70 74 43 2d 33 2e 24 74 6e 2e 28 24 71 73 65  uptC-3.$tn.($qse
2c40: 65 64 29 2e 24 69 2e 31 31 20 7b 0a 20 20 20 20  ed).$i.11 {.    
2c50: 20 20 20 20 73 65 74 20 62 74 20 5b 62 74 72 65      set bt [btre
2c60: 65 5f 66 72 6f 6d 5f 64 62 20 64 62 5d 0a 20 20  e_from_db db].  
2c70: 20 20 20 20 20 20 64 62 5f 65 6e 74 65 72 20 64        db_enter d
2c80: 62 0a 20 20 20 20 20 20 20 20 61 72 72 61 79 20  b.        array 
2c90: 73 65 74 20 73 74 61 74 73 20 5b 62 74 72 65 65  set stats [btree
2ca0: 5f 70 61 67 65 72 5f 73 74 61 74 73 20 24 62 74  _pager_stats $bt
2cb0: 5d 0a 20 20 20 20 20 20 20 20 64 62 5f 6c 65 61  ].        db_lea
2cc0: 76 65 20 64 62 0a 20 20 20 20 20 20 20 20 73 65  ve db.        se
2cd0: 74 20 73 74 61 74 73 28 72 65 66 29 0a 20 20 20  t stats(ref).   
2ce0: 20 20 20 7d 20 7b 30 7d 0a 20 20 20 20 7d 0a 20     } {0}.    }. 
2cf0: 20 7d 0a 20 20 23 20 65 6e 64 20 66 6f 72 20 69   }.  # end for i
2d00: 0a 0a 7d 0a 23 20 65 6e 64 20 66 6f 72 20 74 6e  ..}.# end for tn
2d10: 0a 0a 66 69 6e 69 73 68 5f 74 65 73 74 0a        ..finish_test.