/ Hex Artifact Content
Login

Artifact 193b4ca4e927e77c1d5f4f56203ddc998432a7ee:


0000: 23 20 32 30 31 30 20 46 65 62 72 75 61 72 79 20  # 2010 February 
0010: 31 38 0a 23 0a 23 20 54 68 65 20 61 75 74 68 6f  18.#.# The autho
0020: 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79  r disclaims copy
0030: 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f  right to this so
0040: 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70  urce code.  In p
0050: 6c 61 63 65 20 6f 66 0a 23 20 61 20 6c 65 67 61  lace of.# a lega
0060: 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20 69  l notice, here i
0070: 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a 23 0a  s a blessing:.#.
0080: 23 20 20 20 20 4d 61 79 20 79 6f 75 20 64 6f 20  #    May you do 
0090: 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 20 65 76 69  good and not evi
00a0: 6c 2e 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 20  l..#    May you 
00b0: 66 69 6e 64 20 66 6f 72 67 69 76 65 6e 65 73 73  find forgiveness
00c0: 20 66 6f 72 20 79 6f 75 72 73 65 6c 66 20 61 6e   for yourself an
00d0: 64 20 66 6f 72 67 69 76 65 20 6f 74 68 65 72 73  d forgive others
00e0: 2e 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 20 73  ..#    May you s
00f0: 68 61 72 65 20 66 72 65 65 6c 79 2c 20 6e 65 76  hare freely, nev
0100: 65 72 20 74 61 6b 69 6e 67 20 6d 6f 72 65 20 74  er taking more t
0110: 68 61 6e 20 79 6f 75 20 67 69 76 65 2e 0a 23 0a  han you give..#.
0120: 23 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 2a 2a 0a 23 20 54 68 69 73 20  ********.# This 
0170: 66 69 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20  file implements 
0180: 72 65 67 72 65 73 73 69 6f 6e 20 74 65 73 74 73  regression tests
0190: 20 66 6f 72 20 53 51 4c 69 74 65 20 6c 69 62 72   for SQLite libr
01a0: 61 72 79 2e 0a 23 0a 23 20 54 68 69 73 20 66 69  ary..#.# This fi
01b0: 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 65  le implements te
01c0: 73 74 73 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  sts to make sure
01d0: 20 53 51 4c 69 74 65 20 64 6f 65 73 20 6e 6f 74   SQLite does not
01e0: 20 63 72 61 73 68 20 6f 72 0a 23 20 73 65 67 66   crash or.# segf
01f0: 61 75 6c 74 20 69 66 20 69 74 20 73 65 65 73 20  ault if it sees 
0200: 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61  a corrupt databa
0210: 73 65 20 66 69 6c 65 2e 20 20 49 74 20 73 70 65  se file.  It spe
0220: 63 69 66 63 61 6c 6c 79 0a 23 20 66 6f 63 75 73  cifcally.# focus
0230: 65 73 20 6f 6e 20 72 6f 77 69 64 20 6f 72 64 65  es on rowid orde
0240: 72 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 23 0a  r corruption..#.
0250: 23 20 24 49 64 3a 20 63 6f 72 72 75 70 74 45 2e  # $Id: corruptE.
0260: 74 65 73 74 2c 76 20 31 2e 31 34 20 32 30 30 39  test,v 1.14 2009
0270: 2f 30 37 2f 31 31 20 30 36 3a 35 35 3a 33 34 20  /07/11 06:55:34 
0280: 64 61 6e 69 65 6c 6b 31 39 37 37 20 45 78 70 20  danielk1977 Exp 
0290: 24 0a 0a 73 65 74 20 74 65 73 74 64 69 72 20 5b  $..set testdir [
02a0: 66 69 6c 65 20 64 69 72 6e 61 6d 65 20 24 61 72  file dirname $ar
02b0: 67 76 30 5d 0a 73 6f 75 72 63 65 20 24 74 65 73  gv0].source $tes
02c0: 74 64 69 72 2f 74 65 73 74 65 72 2e 74 63 6c 0a  tdir/tester.tcl.
02d0: 0a 23 20 44 6f 20 6e 6f 74 20 75 73 65 20 61 20  .# Do not use a 
02e0: 63 6f 64 65 63 20 66 6f 72 20 74 65 73 74 73 20  codec for tests 
02f0: 69 6e 20 74 68 69 73 20 66 69 6c 65 2c 20 61 73  in this file, as
0300: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
0310: 6c 65 20 69 73 0a 23 20 6d 61 6e 69 70 75 6c 61  le is.# manipula
0320: 74 65 64 20 64 69 72 65 63 74 6c 79 20 75 73 69  ted directly usi
0330: 6e 67 20 74 63 6c 20 73 63 72 69 70 74 73 20 28  ng tcl scripts (
0340: 75 73 69 6e 67 20 74 68 65 20 5b 68 65 78 69 6f  using the [hexio
0350: 5f 77 72 69 74 65 5d 20 63 6f 6d 6d 61 6e 64 29  _write] command)
0360: 2e 0a 23 0a 64 6f 5f 6e 6f 74 5f 75 73 65 5f 63  ..#.do_not_use_c
0370: 6f 64 65 63 0a 0a 23 20 54 68 65 73 65 20 74 65  odec..# These te
0380: 73 74 73 20 64 65 61 6c 20 77 69 74 68 20 63 6f  sts deal with co
0390: 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20 66  rrupt database f
03a0: 69 6c 65 73 0a 23 0a 64 61 74 61 62 61 73 65 5f  iles.#.database_
03b0: 6d 61 79 5f 62 65 5f 63 6f 72 72 75 70 74 0a 0a  may_be_corrupt..
03c0: 23 20 44 6f 20 6e 6f 74 20 72 75 6e 20 74 68 65  # Do not run the
03d0: 20 74 65 73 74 73 20 69 6e 20 74 68 69 73 20 66   tests in this f
03e0: 69 6c 65 20 69 66 20 45 4e 41 42 4c 45 5f 4f 56  ile if ENABLE_OV
03f0: 45 52 53 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43  ERSIZE_CELL_CHEC
0400: 4b 20 69 73 20 6f 6e 2e 0a 23 0a 69 66 63 61 70  K is on..#.ifcap
0410: 61 62 6c 65 20 6f 76 65 72 73 69 7a 65 5f 63 65  able oversize_ce
0420: 6c 6c 5f 63 68 65 63 6b 20 7b 0a 20 20 66 69 6e  ll_check {.  fin
0430: 69 73 68 5f 74 65 73 74 0a 20 20 72 65 74 75 72  ish_test.  retur
0440: 6e 0a 7d 0a 0a 23 20 43 6f 6e 73 74 72 75 63 74  n.}..# Construct
0450: 20 61 20 63 6f 6d 70 61 63 74 2c 20 64 65 6e 73   a compact, dens
0460: 65 20 64 61 74 61 62 61 73 65 20 66 6f 72 20 74  e database for t
0470: 65 73 74 69 6e 67 2e 0a 23 0a 64 6f 5f 74 65 73  esting..#.do_tes
0480: 74 20 63 6f 72 72 75 70 74 45 2d 31 2e 31 20 7b  t corruptE-1.1 {
0490: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
04a0: 20 50 52 41 47 4d 41 20 61 75 74 6f 5f 76 61 63   PRAGMA auto_vac
04b0: 75 75 6d 20 3d 20 30 3b 0a 20 20 20 20 50 52 41  uum = 0;.    PRA
04c0: 47 4d 41 20 6c 65 67 61 63 79 5f 66 69 6c 65 5f  GMA legacy_file_
04d0: 66 6f 72 6d 61 74 3d 31 3b 0a 20 20 20 20 42 45  format=1;.    BE
04e0: 47 49 4e 3b 0a 20 20 20 20 43 52 45 41 54 45 20  GIN;.    CREATE 
04f0: 54 41 42 4c 45 20 74 31 28 78 2c 79 29 3b 0a 20  TABLE t1(x,y);. 
0500: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
0510: 31 20 56 41 4c 55 45 53 28 31 2c 31 29 3b 0a 20  1 VALUES(1,1);. 
0520: 20 20 20 49 4e 53 45 52 54 20 4f 52 20 49 47 4e     INSERT OR IGN
0530: 4f 52 45 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ORE INTO t1 SELE
0540: 43 54 20 78 2a 32 2c 79 20 46 52 4f 4d 20 74 31  CT x*2,y FROM t1
0550: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 4f 52 20  ;.    INSERT OR 
0560: 49 47 4e 4f 52 45 20 49 4e 54 4f 20 74 31 20 53  IGNORE INTO t1 S
0570: 45 4c 45 43 54 20 78 2a 33 2c 79 20 46 52 4f 4d  ELECT x*3,y FROM
0580: 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   t1;.    INSERT 
0590: 4f 52 20 49 47 4e 4f 52 45 20 49 4e 54 4f 20 74  OR IGNORE INTO t
05a0: 31 20 53 45 4c 45 43 54 20 78 2a 35 2c 79 20 46  1 SELECT x*5,y F
05b0: 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45  ROM t1;.    INSE
05c0: 52 54 20 4f 52 20 49 47 4e 4f 52 45 20 49 4e 54  RT OR IGNORE INT
05d0: 4f 20 74 31 20 53 45 4c 45 43 54 20 78 2a 37 2c  O t1 SELECT x*7,
05e0: 79 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49  y FROM t1;.    I
05f0: 4e 53 45 52 54 20 4f 52 20 49 47 4e 4f 52 45 20  NSERT OR IGNORE 
0600: 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 78  INTO t1 SELECT x
0610: 2a 31 31 2c 79 20 46 52 4f 4d 20 74 31 3b 0a 20  *11,y FROM t1;. 
0620: 20 20 20 49 4e 53 45 52 54 20 4f 52 20 49 47 4e     INSERT OR IGN
0630: 4f 52 45 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ORE INTO t1 SELE
0640: 43 54 20 78 2a 31 33 2c 79 20 46 52 4f 4d 20 74  CT x*13,y FROM t
0650: 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 4f 52  1;.    INSERT OR
0660: 20 49 47 4e 4f 52 45 20 49 4e 54 4f 20 74 31 20   IGNORE INTO t1 
0670: 53 45 4c 45 43 54 20 78 2a 31 37 2c 79 20 46 52  SELECT x*17,y FR
0680: 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52  OM t1;.    INSER
0690: 54 20 4f 52 20 49 47 4e 4f 52 45 20 49 4e 54 4f  T OR IGNORE INTO
06a0: 20 74 31 20 53 45 4c 45 43 54 20 78 2a 31 39 2c   t1 SELECT x*19,
06b0: 79 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 43  y FROM t1;.    C
06c0: 52 45 41 54 45 20 49 4e 44 45 58 20 74 31 69 31  REATE INDEX t1i1
06d0: 20 4f 4e 20 74 31 28 78 29 3b 0a 20 20 20 20 43   ON t1(x);.    C
06e0: 52 45 41 54 45 20 54 41 42 4c 45 20 74 32 20 41  REATE TABLE t2 A
06f0: 53 20 53 45 4c 45 43 54 20 78 2c 32 20 61 73 20  S SELECT x,2 as 
0700: 79 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  y FROM t1 WHERE 
0710: 72 6f 77 69 64 25 35 21 3d 30 20 4f 52 44 45 52  rowid%5!=0 ORDER
0720: 20 42 59 20 72 6f 77 69 64 3b 0a 20 20 20 20 43   BY rowid;.    C
0730: 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a  OMMIT;.  }.} {}.
0740: 0a 69 66 63 61 70 61 62 6c 65 20 7b 69 6e 74 65  .ifcapable {inte
0750: 67 72 69 74 79 63 6b 7d 20 7b 0a 20 20 69 6e 74  grityck} {.  int
0760: 65 67 72 69 74 79 5f 63 68 65 63 6b 20 63 6f 72  egrity_check cor
0770: 72 75 70 74 45 2d 31 2e 32 0a 7d 0a 0a 23 20 53  ruptE-1.2.}..# S
0780: 65 74 75 70 20 66 6f 72 20 74 68 65 20 74 65 73  etup for the tes
0790: 74 73 2e 20 20 4d 61 6b 65 20 61 20 62 61 63 6b  ts.  Make a back
07a0: 75 70 20 63 6f 70 79 20 6f 66 20 74 68 65 20 67  up copy of the g
07b0: 6f 6f 64 20 64 61 74 61 62 61 73 65 20 69 6e 20  ood database in 
07c0: 74 65 73 74 2e 62 75 2e 0a 23 0a 64 62 20 63 6c  test.bu..#.db cl
07d0: 6f 73 65 0a 66 6f 72 63 65 63 6f 70 79 20 74 65  ose.forcecopy te
07e0: 73 74 2e 64 62 20 74 65 73 74 2e 62 75 0a 73 71  st.db test.bu.sq
07f0: 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62  lite3 db test.db
0800: 0a 73 65 74 20 66 73 69 7a 65 20 5b 66 69 6c 65  .set fsize [file
0810: 20 73 69 7a 65 20 74 65 73 74 2e 64 62 5d 0a 0a   size test.db]..
0820: 0a 64 6f 5f 74 65 73 74 20 63 6f 72 72 75 70 74  .do_test corrupt
0830: 45 2d 32 2e 31 20 7b 0a 20 20 64 62 20 63 6c 6f  E-2.1 {.  db clo
0840: 73 65 0a 20 20 66 6f 72 63 65 63 6f 70 79 20 74  se.  forcecopy t
0850: 65 73 74 2e 62 75 20 74 65 73 74 2e 64 62 0a 0a  est.bu test.db..
0860: 20 20 23 20 69 6e 73 65 72 74 20 63 6f 72 72 75    # insert corru
0870: 70 74 20 62 79 74 65 28 73 29 0a 20 20 68 65 78  pt byte(s).  hex
0880: 69 6f 5f 77 72 69 74 65 20 74 65 73 74 2e 64 62  io_write test.db
0890: 20 32 30 34 31 20 5b 66 6f 72 6d 61 74 20 25 30   2041 [format %0
08a0: 32 78 20 30 78 32 65 5d 0a 0a 20 20 73 71 6c 69  2x 0x2e]..  sqli
08b0: 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 0a  te3 db test.db..
08c0: 20 20 73 65 74 20 72 65 73 20 5b 20 63 61 74 63    set res [ catc
08d0: 68 73 71 6c 20 7b 50 52 41 47 4d 41 20 69 6e 74  hsql {PRAGMA int
08e0: 65 67 72 69 74 79 5f 63 68 65 63 6b 7d 20 5d 0a  egrity_check} ].
08f0: 20 20 73 65 74 20 61 6e 73 20 5b 6c 69 6e 64 65    set ans [linde
0900: 78 20 24 72 65 73 20 31 5d 0a 0a 20 20 6c 69 73  x $res 1]..  lis
0910: 74 20 5b 72 65 67 65 78 70 20 7b 6f 75 74 20 6f  t [regexp {out o
0920: 66 20 6f 72 64 65 72 2e 2a 70 72 65 76 69 6f 75  f order.*previou
0930: 73 20 77 61 73 7d 20 24 61 6e 73 5d 20 5c 0a 20  s was} $ans] \. 
0940: 20 20 20 20 20 20 5b 72 65 67 65 78 70 20 7b 6f        [regexp {o
0950: 75 74 20 6f 66 20 6f 72 64 65 72 2e 2a 6d 61 78  ut of order.*max
0960: 20 6c 61 72 67 65 72 20 74 68 61 6e 20 70 61 72   larger than par
0970: 65 6e 74 20 6d 61 78 7d 20 24 61 6e 73 5d 0a 7d  ent max} $ans].}
0980: 20 7b 31 20 31 7d 0a 0a 64 6f 5f 74 65 73 74 20   {1 1}..do_test 
0990: 63 6f 72 72 75 70 74 45 2d 32 2e 32 20 7b 0a 20  corruptE-2.2 {. 
09a0: 20 64 62 20 63 6c 6f 73 65 0a 20 20 66 6f 72 63   db close.  forc
09b0: 65 63 6f 70 79 20 74 65 73 74 2e 62 75 20 74 65  ecopy test.bu te
09c0: 73 74 2e 64 62 0a 0a 20 20 23 20 69 6e 73 65 72  st.db..  # inser
09d0: 74 20 63 6f 72 72 75 70 74 20 62 79 74 65 28 73  t corrupt byte(s
09e0: 29 0a 20 20 68 65 78 69 6f 5f 77 72 69 74 65 20  ).  hexio_write 
09f0: 74 65 73 74 2e 64 62 20 32 30 34 37 20 5b 66 6f  test.db 2047 [fo
0a00: 72 6d 61 74 20 25 30 32 78 20 30 78 38 34 5d 0a  rmat %02x 0x84].
0a10: 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 74 65  .  sqlite3 db te
0a20: 73 74 2e 64 62 0a 0a 20 20 73 65 74 20 72 65 73  st.db..  set res
0a30: 20 5b 20 63 61 74 63 68 73 71 6c 20 7b 50 52 41   [ catchsql {PRA
0a40: 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68  GMA integrity_ch
0a50: 65 63 6b 7d 20 5d 0a 20 20 73 65 74 20 61 6e 73  eck} ].  set ans
0a60: 20 5b 6c 69 6e 64 65 78 20 24 72 65 73 20 31 5d   [lindex $res 1]
0a70: 0a 0a 20 20 6c 69 73 74 20 5b 72 65 67 65 78 70  ..  list [regexp
0a80: 20 7b 6f 75 74 20 6f 66 20 6f 72 64 65 72 2e 2a   {out of order.*
0a90: 70 72 65 76 69 6f 75 73 20 77 61 73 7d 20 24 61  previous was} $a
0aa0: 6e 73 5d 20 5c 0a 20 20 20 20 20 20 20 5b 72 65  ns] \.       [re
0ab0: 67 65 78 70 20 7b 6f 75 74 20 6f 66 20 6f 72 64  gexp {out of ord
0ac0: 65 72 2e 2a 6d 69 6e 20 6c 65 73 73 20 74 68 61  er.*min less tha
0ad0: 6e 20 70 61 72 65 6e 74 20 6d 69 6e 7d 20 24 61  n parent min} $a
0ae0: 6e 73 5d 0a 7d 20 7b 31 20 31 7d 0a 0a 64 6f 5f  ns].} {1 1}..do_
0af0: 74 65 73 74 20 63 6f 72 72 75 70 74 45 2d 32 2e  test corruptE-2.
0b00: 33 20 7b 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20  3 {.  db close. 
0b10: 20 66 6f 72 63 65 63 6f 70 79 20 74 65 73 74 2e   forcecopy test.
0b20: 62 75 20 74 65 73 74 2e 64 62 0a 0a 20 20 23 20  bu test.db..  # 
0b30: 69 6e 73 65 72 74 20 63 6f 72 72 75 70 74 20 62  insert corrupt b
0b40: 79 74 65 28 73 29 0a 20 20 68 65 78 69 6f 5f 77  yte(s).  hexio_w
0b50: 72 69 74 65 20 74 65 73 74 2e 64 62 20 37 34 32  rite test.db 742
0b60: 30 20 5b 66 6f 72 6d 61 74 20 25 30 32 78 20 30  0 [format %02x 0
0b70: 78 61 38 5d 0a 20 20 68 65 78 69 6f 5f 77 72 69  xa8].  hexio_wri
0b80: 74 65 20 74 65 73 74 2e 64 62 20 31 30 34 35 39  te test.db 10459
0b90: 20 5b 66 6f 72 6d 61 74 20 25 30 32 78 20 30 78   [format %02x 0x
0ba0: 38 64 5d 0a 0a 20 20 73 71 6c 69 74 65 33 20 64  8d]..  sqlite3 d
0bb0: 62 20 74 65 73 74 2e 64 62 0a 0a 20 20 73 65 74  b test.db..  set
0bc0: 20 72 65 73 20 5b 20 63 61 74 63 68 73 71 6c 20   res [ catchsql 
0bd0: 7b 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74  {PRAGMA integrit
0be0: 79 5f 63 68 65 63 6b 7d 20 5d 0a 20 20 73 65 74  y_check} ].  set
0bf0: 20 61 6e 73 20 5b 6c 69 6e 64 65 78 20 24 72 65   ans [lindex $re
0c00: 73 20 31 5d 0a 0a 20 20 6c 69 73 74 20 5b 72 65  s 1]..  list [re
0c10: 67 65 78 70 20 7b 6f 75 74 20 6f 66 20 6f 72 64  gexp {out of ord
0c20: 65 72 2e 2a 6d 61 78 20 6c 61 72 67 65 72 20 74  er.*max larger t
0c30: 68 61 6e 20 70 61 72 65 6e 74 20 6d 69 6e 7d 20  han parent min} 
0c40: 24 61 6e 73 5d 0a 7d 20 7b 31 7d 0a 0a 64 6f 5f  $ans].} {1}..do_
0c50: 74 65 73 74 20 63 6f 72 72 75 70 74 45 2d 32 2e  test corruptE-2.
0c60: 34 20 7b 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20  4 {.  db close. 
0c70: 20 66 6f 72 63 65 63 6f 70 79 20 74 65 73 74 2e   forcecopy test.
0c80: 62 75 20 74 65 73 74 2e 64 62 0a 0a 20 20 23 20  bu test.db..  # 
0c90: 69 6e 73 65 72 74 20 63 6f 72 72 75 70 74 20 62  insert corrupt b
0ca0: 79 74 65 28 73 29 0a 20 20 68 65 78 69 6f 5f 77  yte(s).  hexio_w
0cb0: 72 69 74 65 20 74 65 73 74 2e 64 62 20 31 30 32  rite test.db 102
0cc0: 33 33 20 5b 66 6f 72 6d 61 74 20 25 30 32 78 20  33 [format %02x 
0cd0: 30 78 64 30 5d 0a 0a 20 20 73 71 6c 69 74 65 33  0xd0]..  sqlite3
0ce0: 20 64 62 20 74 65 73 74 2e 64 62 0a 0a 20 20 73   db test.db..  s
0cf0: 65 74 20 72 65 73 20 5b 20 63 61 74 63 68 73 71  et res [ catchsq
0d00: 6c 20 7b 50 52 41 47 4d 41 20 69 6e 74 65 67 72  l {PRAGMA integr
0d10: 69 74 79 5f 63 68 65 63 6b 7d 20 5d 0a 20 20 73  ity_check} ].  s
0d20: 65 74 20 61 6e 73 20 5b 6c 69 6e 64 65 78 20 24  et ans [lindex $
0d30: 72 65 73 20 31 5d 0a 0a 20 20 6c 69 73 74 20 5b  res 1]..  list [
0d40: 72 65 67 65 78 70 20 7b 6f 75 74 20 6f 66 20 6f  regexp {out of o
0d50: 72 64 65 72 2e 2a 6d 69 6e 20 6c 65 73 73 20 74  rder.*min less t
0d60: 68 61 6e 20 70 61 72 65 6e 74 20 6d 61 78 7d 20  han parent max} 
0d70: 24 61 6e 73 5d 0a 7d 20 7b 31 7d 0a 0a 0a 73 65  $ans].} {1}...se
0d80: 74 20 74 65 73 74 73 20 5b 6c 69 73 74 20 7b 31  t tests [list {1
0d90: 30 32 33 33 20 30 78 64 30 7d 20 5c 0a 20 20 20  0233 0xd0} \.   
0da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 39 34               {94
0db0: 31 20 30 78 34 32 7d 20 5c 0a 20 20 20 20 20 20  1 0x42} \.      
0dc0: 20 20 20 20 20 20 20 20 20 20 7b 31 30 32 38 20            {1028 
0dd0: 30 78 35 33 7d 20 5c 0a 20 20 20 20 20 20 20 20  0x53} \.        
0de0: 20 20 20 20 20 20 20 20 7b 32 30 34 31 20 30 78          {2041 0x
0df0: 64 30 7d 20 5c 0a 20 20 20 20 20 20 20 20 20 20  d0} \.          
0e00: 20 20 20 20 20 20 7b 32 30 34 32 20 30 78 31 66        {2042 0x1f
0e10: 7d 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20  } \.            
0e20: 20 20 20 20 7b 32 30 34 37 20 30 78 61 61 7d 20      {2047 0xaa} 
0e30: 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  \.              
0e40: 20 20 7b 32 32 36 33 20 30 78 32 39 7d 20 5c 0a    {2263 0x29} \.
0e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e60: 7b 32 32 37 34 20 30 78 37 35 7d 20 5c 0a 20 20  {2274 0x75} \.  
0e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 33                {3
0e80: 32 36 37 20 30 78 66 32 7d 20 5c 0a 20 20 20 20  267 0xf2} \.    
0e90: 20 20 20 20 20 20 20 20 20 20 20 20 7b 34 31 30              {410
0ea0: 34 20 30 78 32 63 7d 20 5c 0a 20 20 20 20 20 20  4 0x2c} \.      
0eb0: 20 20 20 20 20 20 20 20 20 20 7b 35 31 31 33 20            {5113 
0ec0: 30 78 33 36 7d 20 5c 0a 20 20 20 20 20 20 20 20  0x36} \.        
0ed0: 20 20 20 20 20 20 20 20 7b 31 30 32 33 33 20 30          {10233 0
0ee0: 78 38 34 7d 20 5c 0a 20 20 20 20 20 20 20 20 20  x84} \.         
0ef0: 20 20 20 20 20 20 20 7b 31 30 32 33 34 20 30 78         {10234 0x
0f00: 37 34 7d 20 5c 0a 20 20 20 20 20 20 20 20 20 20  74} \.          
0f10: 20 20 20 20 20 20 7b 31 30 32 33 39 20 30 78 34        {10239 0x4
0f20: 31 7d 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20  1} \.           
0f30: 20 20 20 20 20 7b 31 30 34 35 33 20 30 78 31 31       {10453 0x11
0f40: 7d 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20  } \.            
0f50: 20 20 20 20 7b 31 31 32 37 33 20 30 78 32 38 7d      {11273 0x28}
0f60: 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   \.             
0f70: 20 20 20 7b 31 31 34 35 35 20 30 78 31 31 7d 20     {11455 0x11} 
0f80: 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  \.              
0f90: 20 20 7b 31 31 34 36 31 20 30 78 65 36 7d 20 5c    {11461 0xe6} \
0fa0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
0fb0: 20 7b 31 32 32 38 31 20 30 78 39 39 7d 20 5c 0a   {12281 0x99} \.
0fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0fd0: 7b 31 32 32 39 36 20 30 78 39 65 7d 20 5c 0a 20  {12296 0x9e} \. 
0fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
0ff0: 31 32 32 39 37 20 30 78 64 37 7d 20 5c 0a 20 20  12297 0xd7} \.  
1000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 31                {1
1010: 33 33 30 33 20 30 78 35 33 7d 20 5d 0a 0a 73 65  3303 0x53} ]..se
1020: 74 20 74 63 20 31 0a 66 6f 72 65 61 63 68 20 74  t tc 1.foreach t
1030: 65 73 74 20 24 74 65 73 74 73 20 7b 0a 20 20 64  est $tests {.  d
1040: 6f 5f 74 65 73 74 20 63 6f 72 72 75 70 74 45 2d  o_test corruptE-
1050: 33 2e 24 74 63 20 7b 0a 20 20 20 20 64 62 20 63  3.$tc {.    db c
1060: 6c 6f 73 65 0a 20 20 20 20 66 6f 72 63 65 63 6f  lose.    forceco
1070: 70 79 20 74 65 73 74 2e 62 75 20 74 65 73 74 2e  py test.bu test.
1080: 64 62 0a 0a 20 20 20 20 23 20 69 6e 73 65 72 74  db..    # insert
1090: 20 63 6f 72 72 75 70 74 20 62 79 74 65 28 73 29   corrupt byte(s)
10a0: 0a 20 20 20 20 68 65 78 69 6f 5f 77 72 69 74 65  .    hexio_write
10b0: 20 74 65 73 74 2e 64 62 20 5b 6c 69 6e 64 65 78   test.db [lindex
10c0: 20 24 74 65 73 74 20 30 5d 20 5b 66 6f 72 6d 61   $test 0] [forma
10d0: 74 20 25 30 32 78 20 5b 6c 69 6e 64 65 78 20 24  t %02x [lindex $
10e0: 74 65 73 74 20 31 5d 5d 0a 0a 20 20 20 20 73 71  test 1]]..    sq
10f0: 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62  lite3 db test.db
1100: 0a 0a 20 20 20 20 73 65 74 20 72 65 73 20 5b 20  ..    set res [ 
1110: 63 61 74 63 68 73 71 6c 20 7b 50 52 41 47 4d 41  catchsql {PRAGMA
1120: 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b   integrity_check
1130: 7d 20 5d 0a 20 20 20 20 73 65 74 20 61 6e 73 20  } ].    set ans 
1140: 5b 6c 69 6e 64 65 78 20 24 72 65 73 20 31 5d 0a  [lindex $res 1].
1150: 0a 20 20 20 20 6c 69 73 74 20 5b 72 65 67 65 78  .    list [regex
1160: 70 20 7b 6f 75 74 20 6f 66 20 6f 72 64 65 72 7d  p {out of order}
1170: 20 24 61 6e 73 5d 0a 20 20 7d 20 7b 31 7d 0a 20   $ans].  } {1}. 
1180: 20 69 6e 63 72 20 74 63 20 31 0a 7d 0a 0a 66 69   incr tc 1.}..fi
1190: 6e 69 73 68 5f 74 65 73 74 0a                    nish_test.