/ Hex Artifact Content
Login

Artifact 7290b61145d954be549340e462ca84826d8a31a3:


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 63 61 74 63 68 20 7b 66 69 6c 65 20 64  $..catch {file d
02a0: 65 6c 65 74 65 20 2d 66 6f 72 63 65 20 74 65 73  elete -force tes
02b0: 74 2e 64 62 20 74 65 73 74 2e 64 62 2d 6a 6f 75  t.db test.db-jou
02c0: 72 6e 61 6c 20 74 65 73 74 2e 62 75 7d 0a 0a 73  rnal test.bu}..s
02d0: 65 74 20 74 65 73 74 64 69 72 20 5b 66 69 6c 65  et testdir [file
02e0: 20 64 69 72 6e 61 6d 65 20 24 61 72 67 76 30 5d   dirname $argv0]
02f0: 0a 73 6f 75 72 63 65 20 24 74 65 73 74 64 69 72  .source $testdir
0300: 2f 74 65 73 74 65 72 2e 74 63 6c 0a 0a 23 20 44  /tester.tcl..# D
0310: 6f 20 6e 6f 74 20 75 73 65 20 61 20 63 6f 64 65  o not use a code
0320: 63 20 66 6f 72 20 74 65 73 74 73 20 69 6e 20 74  c for tests in t
0330: 68 69 73 20 66 69 6c 65 2c 20 61 73 20 74 68 65  his file, as the
0340: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
0350: 73 0a 23 20 6d 61 6e 69 70 75 6c 61 74 65 64 20  s.# manipulated 
0360: 64 69 72 65 63 74 6c 79 20 75 73 69 6e 67 20 74  directly using t
0370: 63 6c 20 73 63 72 69 70 74 73 20 28 75 73 69 6e  cl scripts (usin
0380: 67 20 74 68 65 20 5b 68 65 78 69 6f 5f 77 72 69  g the [hexio_wri
0390: 74 65 5d 20 63 6f 6d 6d 61 6e 64 29 2e 0a 23 0a  te] command)..#.
03a0: 64 6f 5f 6e 6f 74 5f 75 73 65 5f 63 6f 64 65 63  do_not_use_codec
03b0: 0a 0a 23 20 44 6f 20 6e 6f 74 20 72 75 6e 20 74  ..# Do not run t
03c0: 68 65 20 74 65 73 74 73 20 69 6e 20 74 68 69 73  he tests in this
03d0: 20 66 69 6c 65 20 69 66 20 45 4e 41 42 4c 45 5f   file if ENABLE_
03e0: 4f 56 45 52 53 49 5a 45 5f 43 45 4c 4c 5f 43 48  OVERSIZE_CELL_CH
03f0: 45 43 4b 20 69 73 20 6f 6e 2e 0a 23 0a 69 66 63  ECK is on..#.ifc
0400: 61 70 61 62 6c 65 20 6f 76 65 72 73 69 7a 65 5f  apable oversize_
0410: 63 65 6c 6c 5f 63 68 65 63 6b 20 7b 0a 20 20 66  cell_check {.  f
0420: 69 6e 69 73 68 5f 74 65 73 74 0a 20 20 72 65 74  inish_test.  ret
0430: 75 72 6e 0a 7d 0a 0a 23 20 43 6f 6e 73 74 72 75  urn.}..# Constru
0440: 63 74 20 61 20 63 6f 6d 70 61 63 74 2c 20 64 65  ct a compact, de
0450: 6e 73 65 20 64 61 74 61 62 61 73 65 20 66 6f 72  nse database for
0460: 20 74 65 73 74 69 6e 67 2e 0a 23 0a 64 6f 5f 74   testing..#.do_t
0470: 65 73 74 20 63 6f 72 72 75 70 74 45 2d 31 2e 31  est corruptE-1.1
0480: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
0490: 20 20 20 50 52 41 47 4d 41 20 61 75 74 6f 5f 76     PRAGMA auto_v
04a0: 61 63 75 75 6d 20 3d 20 30 3b 0a 20 20 20 20 50  acuum = 0;.    P
04b0: 52 41 47 4d 41 20 6c 65 67 61 63 79 5f 66 69 6c  RAGMA legacy_fil
04c0: 65 5f 66 6f 72 6d 61 74 3d 31 3b 0a 20 20 20 20  e_format=1;.    
04d0: 42 45 47 49 4e 3b 0a 20 20 20 20 43 52 45 41 54  BEGIN;.    CREAT
04e0: 45 20 54 41 42 4c 45 20 74 31 28 78 2c 79 29 3b  E TABLE t1(x,y);
04f0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
0500: 20 74 31 20 56 41 4c 55 45 53 28 31 2c 31 29 3b   t1 VALUES(1,1);
0510: 0a 20 20 20 20 49 4e 53 45 52 54 20 4f 52 20 49  .    INSERT OR I
0520: 47 4e 4f 52 45 20 49 4e 54 4f 20 74 31 20 53 45  GNORE INTO t1 SE
0530: 4c 45 43 54 20 78 2a 32 2c 79 20 46 52 4f 4d 20  LECT x*2,y FROM 
0540: 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 4f  t1;.    INSERT O
0550: 52 20 49 47 4e 4f 52 45 20 49 4e 54 4f 20 74 31  R IGNORE INTO t1
0560: 20 53 45 4c 45 43 54 20 78 2a 33 2c 79 20 46 52   SELECT x*3,y FR
0570: 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52  OM t1;.    INSER
0580: 54 20 4f 52 20 49 47 4e 4f 52 45 20 49 4e 54 4f  T OR IGNORE INTO
0590: 20 74 31 20 53 45 4c 45 43 54 20 78 2a 35 2c 79   t1 SELECT x*5,y
05a0: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e   FROM t1;.    IN
05b0: 53 45 52 54 20 4f 52 20 49 47 4e 4f 52 45 20 49  SERT OR IGNORE I
05c0: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 78 2a  NTO t1 SELECT x*
05d0: 37 2c 79 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20  7,y FROM t1;.   
05e0: 20 49 4e 53 45 52 54 20 4f 52 20 49 47 4e 4f 52   INSERT OR IGNOR
05f0: 45 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  E INTO t1 SELECT
0600: 20 78 2a 31 31 2c 79 20 46 52 4f 4d 20 74 31 3b   x*11,y FROM t1;
0610: 0a 20 20 20 20 49 4e 53 45 52 54 20 4f 52 20 49  .    INSERT OR I
0620: 47 4e 4f 52 45 20 49 4e 54 4f 20 74 31 20 53 45  GNORE INTO t1 SE
0630: 4c 45 43 54 20 78 2a 31 33 2c 79 20 46 52 4f 4d  LECT x*13,y FROM
0640: 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   t1;.    INSERT 
0650: 4f 52 20 49 47 4e 4f 52 45 20 49 4e 54 4f 20 74  OR IGNORE INTO t
0660: 31 20 53 45 4c 45 43 54 20 78 2a 31 37 2c 79 20  1 SELECT x*17,y 
0670: 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53  FROM t1;.    INS
0680: 45 52 54 20 4f 52 20 49 47 4e 4f 52 45 20 49 4e  ERT OR IGNORE IN
0690: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 78 2a 31  TO t1 SELECT x*1
06a0: 39 2c 79 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20  9,y FROM t1;.   
06b0: 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 74 31   CREATE INDEX t1
06c0: 69 31 20 4f 4e 20 74 31 28 78 29 3b 0a 20 20 20  i1 ON t1(x);.   
06d0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32   CREATE TABLE t2
06e0: 20 41 53 20 53 45 4c 45 43 54 20 78 2c 32 20 61   AS SELECT x,2 a
06f0: 73 20 79 20 46 52 4f 4d 20 74 31 20 57 48 45 52  s y FROM t1 WHER
0700: 45 20 72 6f 77 69 64 25 35 21 3d 30 3b 0a 20 20  E rowid%5!=0;.  
0710: 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 7d 20    COMMIT;.  }.} 
0720: 7b 7d 0a 0a 69 66 63 61 70 61 62 6c 65 20 7b 69  {}..ifcapable {i
0730: 6e 74 65 67 72 69 74 79 63 6b 7d 20 7b 0a 20 20  ntegrityck} {.  
0740: 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20  integrity_check 
0750: 63 6f 72 72 75 70 74 45 2d 31 2e 32 0a 7d 0a 0a  corruptE-1.2.}..
0760: 23 20 43 6f 70 79 20 66 69 6c 65 20 24 66 72 6f  # Copy file $fro
0770: 6d 20 69 6e 74 6f 20 24 74 6f 0a 23 0a 70 72 6f  m into $to.#.pro
0780: 63 20 63 6f 70 79 5f 66 69 6c 65 20 7b 66 72 6f  c copy_file {fro
0790: 6d 20 74 6f 7d 20 7b 0a 20 20 66 69 6c 65 20 63  m to} {.  file c
07a0: 6f 70 79 20 2d 66 6f 72 63 65 20 24 66 72 6f 6d  opy -force $from
07b0: 20 24 74 6f 0a 7d 0a 0a 23 20 53 65 74 75 70 20   $to.}..# Setup 
07c0: 66 6f 72 20 74 68 65 20 74 65 73 74 73 2e 20 20  for the tests.  
07d0: 4d 61 6b 65 20 61 20 62 61 63 6b 75 70 20 63 6f  Make a backup co
07e0: 70 79 20 6f 66 20 74 68 65 20 67 6f 6f 64 20 64  py of the good d
07f0: 61 74 61 62 61 73 65 20 69 6e 20 74 65 73 74 2e  atabase in test.
0800: 62 75 2e 0a 23 0a 64 62 20 63 6c 6f 73 65 0a 63  bu..#.db close.c
0810: 6f 70 79 5f 66 69 6c 65 20 74 65 73 74 2e 64 62  opy_file test.db
0820: 20 74 65 73 74 2e 62 75 0a 73 71 6c 69 74 65 33   test.bu.sqlite3
0830: 20 64 62 20 74 65 73 74 2e 64 62 0a 73 65 74 20   db test.db.set 
0840: 66 73 69 7a 65 20 5b 66 69 6c 65 20 73 69 7a 65  fsize [file size
0850: 20 74 65 73 74 2e 64 62 5d 0a 0a 0a 64 6f 5f 74   test.db]...do_t
0860: 65 73 74 20 63 6f 72 72 75 70 74 45 2d 32 2e 31  est corruptE-2.1
0870: 20 7b 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20   {.  db close.  
0880: 63 6f 70 79 5f 66 69 6c 65 20 74 65 73 74 2e 62  copy_file test.b
0890: 75 20 74 65 73 74 2e 64 62 0a 0a 20 20 23 20 69  u test.db..  # i
08a0: 6e 73 65 72 74 20 63 6f 72 72 75 70 74 20 62 79  nsert corrupt by
08b0: 74 65 28 73 29 0a 20 20 68 65 78 69 6f 5f 77 72  te(s).  hexio_wr
08c0: 69 74 65 20 74 65 73 74 2e 64 62 20 32 30 34 31  ite test.db 2041
08d0: 20 5b 66 6f 72 6d 61 74 20 25 30 32 78 20 30 78   [format %02x 0x
08e0: 32 65 5d 0a 0a 20 20 73 71 6c 69 74 65 33 20 64  2e]..  sqlite3 d
08f0: 62 20 74 65 73 74 2e 64 62 0a 0a 20 20 73 65 74  b test.db..  set
0900: 20 72 65 73 20 5b 20 63 61 74 63 68 73 71 6c 20   res [ catchsql 
0910: 7b 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74  {PRAGMA integrit
0920: 79 5f 63 68 65 63 6b 7d 20 5d 0a 20 20 73 65 74  y_check} ].  set
0930: 20 61 6e 73 20 5b 6c 69 6e 64 65 78 20 24 72 65   ans [lindex $re
0940: 73 20 31 5d 0a 0a 20 20 6c 69 73 74 20 5b 72 65  s 1]..  list [re
0950: 67 65 78 70 20 7b 6f 75 74 20 6f 66 20 6f 72 64  gexp {out of ord
0960: 65 72 2e 2a 70 72 65 76 69 6f 75 73 20 77 61 73  er.*previous was
0970: 7d 20 24 61 6e 73 5d 20 5c 0a 20 20 20 20 20 20  } $ans] \.      
0980: 20 5b 72 65 67 65 78 70 20 7b 6f 75 74 20 6f 66   [regexp {out of
0990: 20 6f 72 64 65 72 2e 2a 6d 61 78 20 6c 61 72 67   order.*max larg
09a0: 65 72 20 74 68 61 6e 20 70 61 72 65 6e 74 20 6d  er than parent m
09b0: 61 78 7d 20 24 61 6e 73 5d 0a 7d 20 7b 31 20 31  ax} $ans].} {1 1
09c0: 7d 0a 0a 64 6f 5f 74 65 73 74 20 63 6f 72 72 75  }..do_test corru
09d0: 70 74 45 2d 32 2e 32 20 7b 0a 20 20 64 62 20 63  ptE-2.2 {.  db c
09e0: 6c 6f 73 65 0a 20 20 63 6f 70 79 5f 66 69 6c 65  lose.  copy_file
09f0: 20 74 65 73 74 2e 62 75 20 74 65 73 74 2e 64 62   test.bu test.db
0a00: 0a 0a 20 20 23 20 69 6e 73 65 72 74 20 63 6f 72  ..  # insert cor
0a10: 72 75 70 74 20 62 79 74 65 28 73 29 0a 20 20 68  rupt byte(s).  h
0a20: 65 78 69 6f 5f 77 72 69 74 65 20 74 65 73 74 2e  exio_write test.
0a30: 64 62 20 32 30 34 37 20 5b 66 6f 72 6d 61 74 20  db 2047 [format 
0a40: 25 30 32 78 20 30 78 38 34 5d 0a 0a 20 20 73 71  %02x 0x84]..  sq
0a50: 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62  lite3 db test.db
0a60: 0a 0a 20 20 73 65 74 20 72 65 73 20 5b 20 63 61  ..  set res [ ca
0a70: 74 63 68 73 71 6c 20 7b 50 52 41 47 4d 41 20 69  tchsql {PRAGMA i
0a80: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 7d 20  ntegrity_check} 
0a90: 5d 0a 20 20 73 65 74 20 61 6e 73 20 5b 6c 69 6e  ].  set ans [lin
0aa0: 64 65 78 20 24 72 65 73 20 31 5d 0a 0a 20 20 6c  dex $res 1]..  l
0ab0: 69 73 74 20 5b 72 65 67 65 78 70 20 7b 6f 75 74  ist [regexp {out
0ac0: 20 6f 66 20 6f 72 64 65 72 2e 2a 70 72 65 76 69   of order.*previ
0ad0: 6f 75 73 20 77 61 73 7d 20 24 61 6e 73 5d 20 5c  ous was} $ans] \
0ae0: 0a 20 20 20 20 20 20 20 5b 72 65 67 65 78 70 20  .       [regexp 
0af0: 7b 6f 75 74 20 6f 66 20 6f 72 64 65 72 2e 2a 6d  {out of order.*m
0b00: 69 6e 20 6c 65 73 73 20 74 68 61 6e 20 70 61 72  in less than par
0b10: 65 6e 74 20 6d 69 6e 7d 20 24 61 6e 73 5d 0a 7d  ent min} $ans].}
0b20: 20 7b 31 20 31 7d 0a 0a 64 6f 5f 74 65 73 74 20   {1 1}..do_test 
0b30: 63 6f 72 72 75 70 74 45 2d 32 2e 33 20 7b 0a 20  corruptE-2.3 {. 
0b40: 20 64 62 20 63 6c 6f 73 65 0a 20 20 63 6f 70 79   db close.  copy
0b50: 5f 66 69 6c 65 20 74 65 73 74 2e 62 75 20 74 65  _file test.bu te
0b60: 73 74 2e 64 62 0a 0a 20 20 23 20 69 6e 73 65 72  st.db..  # inser
0b70: 74 20 63 6f 72 72 75 70 74 20 62 79 74 65 28 73  t corrupt byte(s
0b80: 29 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 37 34 32 30 20 5b 66 6f  test.db 7420 [fo
0ba0: 72 6d 61 74 20 25 30 32 78 20 30 78 61 38 5d 0a  rmat %02x 0xa8].
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 31 30 34 35 39 20 5b 66 6f 72  st.db 10459 [for
0bd0: 6d 61 74 20 25 30 32 78 20 30 78 38 64 5d 0a 0a  mat %02x 0x8d]..
0be0: 20 20 73 71 6c 69 74 65 33 20 64 62 20 74 65 73    sqlite3 db tes
0bf0: 74 2e 64 62 0a 0a 20 20 73 65 74 20 72 65 73 20  t.db..  set res 
0c00: 5b 20 63 61 74 63 68 73 71 6c 20 7b 50 52 41 47  [ catchsql {PRAG
0c10: 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65  MA integrity_che
0c20: 63 6b 7d 20 5d 0a 20 20 73 65 74 20 61 6e 73 20  ck} ].  set ans 
0c30: 5b 6c 69 6e 64 65 78 20 24 72 65 73 20 31 5d 0a  [lindex $res 1].
0c40: 0a 20 20 6c 69 73 74 20 5b 72 65 67 65 78 70 20  .  list [regexp 
0c50: 7b 6f 75 74 20 6f 66 20 6f 72 64 65 72 2e 2a 6d  {out of order.*m
0c60: 61 78 20 6c 61 72 67 65 72 20 74 68 61 6e 20 70  ax larger than p
0c70: 61 72 65 6e 74 20 6d 69 6e 7d 20 24 61 6e 73 5d  arent min} $ans]
0c80: 0a 7d 20 7b 31 7d 0a 0a 64 6f 5f 74 65 73 74 20  .} {1}..do_test 
0c90: 63 6f 72 72 75 70 74 45 2d 32 2e 34 20 7b 0a 20  corruptE-2.4 {. 
0ca0: 20 64 62 20 63 6c 6f 73 65 0a 20 20 63 6f 70 79   db close.  copy
0cb0: 5f 66 69 6c 65 20 74 65 73 74 2e 62 75 20 74 65  _file test.bu te
0cc0: 73 74 2e 64 62 0a 0a 20 20 23 20 69 6e 73 65 72  st.db..  # inser
0cd0: 74 20 63 6f 72 72 75 70 74 20 62 79 74 65 28 73  t corrupt byte(s
0ce0: 29 0a 20 20 68 65 78 69 6f 5f 77 72 69 74 65 20  ).  hexio_write 
0cf0: 74 65 73 74 2e 64 62 20 31 30 32 33 33 20 5b 66  test.db 10233 [f
0d00: 6f 72 6d 61 74 20 25 30 32 78 20 30 78 64 30 5d  ormat %02x 0xd0]
0d10: 0a 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 74  ..  sqlite3 db t
0d20: 65 73 74 2e 64 62 0a 0a 20 20 73 65 74 20 72 65  est.db..  set re
0d30: 73 20 5b 20 63 61 74 63 68 73 71 6c 20 7b 50 52  s [ catchsql {PR
0d40: 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63  AGMA integrity_c
0d50: 68 65 63 6b 7d 20 5d 0a 20 20 73 65 74 20 61 6e  heck} ].  set an
0d60: 73 20 5b 6c 69 6e 64 65 78 20 24 72 65 73 20 31  s [lindex $res 1
0d70: 5d 0a 0a 20 20 6c 69 73 74 20 5b 72 65 67 65 78  ]..  list [regex
0d80: 70 20 7b 6f 75 74 20 6f 66 20 6f 72 64 65 72 2e  p {out of order.
0d90: 2a 6d 69 6e 20 6c 65 73 73 20 74 68 61 6e 20 70  *min less than p
0da0: 61 72 65 6e 74 20 6d 61 78 7d 20 24 61 6e 73 5d  arent max} $ans]
0db0: 0a 7d 20 7b 31 7d 0a 0a 0a 73 65 74 20 74 65 73  .} {1}...set tes
0dc0: 74 73 20 5b 6c 69 73 74 20 7b 31 30 32 33 33 20  ts [list {10233 
0dd0: 30 78 64 30 7d 20 5c 0a 20 20 20 20 20 20 20 20  0xd0} \.        
0de0: 20 20 20 20 20 20 20 20 7b 39 34 31 20 30 78 34          {941 0x4
0df0: 32 7d 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20  2} \.           
0e00: 20 20 20 20 20 7b 31 30 32 38 20 30 78 35 33 7d       {1028 0x53}
0e10: 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   \.             
0e20: 20 20 20 7b 32 30 34 31 20 30 78 64 30 7d 20 5c     {2041 0xd0} \
0e30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
0e40: 20 7b 32 30 34 32 20 30 78 31 66 7d 20 5c 0a 20   {2042 0x1f} \. 
0e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
0e60: 32 30 34 37 20 30 78 61 61 7d 20 5c 0a 20 20 20  2047 0xaa} \.   
0e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 32 32               {22
0e80: 36 33 20 30 78 32 39 7d 20 5c 0a 20 20 20 20 20  63 0x29} \.     
0e90: 20 20 20 20 20 20 20 20 20 20 20 7b 32 32 37 34             {2274
0ea0: 20 30 78 37 35 7d 20 5c 0a 20 20 20 20 20 20 20   0x75} \.       
0eb0: 20 20 20 20 20 20 20 20 20 7b 33 32 36 37 20 30           {3267 0
0ec0: 78 66 32 7d 20 5c 0a 20 20 20 20 20 20 20 20 20  xf2} \.         
0ed0: 20 20 20 20 20 20 20 7b 34 31 30 34 20 30 78 32         {4104 0x2
0ee0: 63 7d 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20  c} \.           
0ef0: 20 20 20 20 20 7b 35 31 31 33 20 30 78 33 36 7d       {5113 0x36}
0f00: 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   \.             
0f10: 20 20 20 7b 31 30 32 33 33 20 30 78 38 34 7d 20     {10233 0x84} 
0f20: 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  \.              
0f30: 20 20 7b 31 30 32 33 34 20 30 78 37 34 7d 20 5c    {10234 0x74} \
0f40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
0f50: 20 7b 31 30 32 33 39 20 30 78 34 31 7d 20 5c 0a   {10239 0x41} \.
0f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0f70: 7b 31 30 34 35 33 20 30 78 31 31 7d 20 5c 0a 20  {10453 0x11} \. 
0f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
0f90: 31 31 32 37 33 20 30 78 32 38 7d 20 5c 0a 20 20  11273 0x28} \.  
0fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 31                {1
0fb0: 31 34 35 35 20 30 78 31 31 7d 20 5c 0a 20 20 20  1455 0x11} \.   
0fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 31 31               {11
0fd0: 34 36 31 20 30 78 65 36 7d 20 5c 0a 20 20 20 20  461 0xe6} \.    
0fe0: 20 20 20 20 20 20 20 20 20 20 20 20 7b 31 32 32              {122
0ff0: 38 31 20 30 78 39 39 7d 20 5c 0a 20 20 20 20 20  81 0x99} \.     
1000: 20 20 20 20 20 20 20 20 20 20 20 7b 31 32 32 39             {1229
1010: 36 20 30 78 39 65 7d 20 5c 0a 20 20 20 20 20 20  6 0x9e} \.      
1020: 20 20 20 20 20 20 20 20 20 20 7b 31 32 32 39 37            {12297
1030: 20 30 78 64 37 7d 20 5c 0a 20 20 20 20 20 20 20   0xd7} \.       
1040: 20 20 20 20 20 20 20 20 20 7b 31 33 33 30 33 20           {13303 
1050: 30 78 35 33 7d 20 5d 0a 0a 73 65 74 20 74 63 20  0x53} ]..set tc 
1060: 31 0a 66 6f 72 65 61 63 68 20 74 65 73 74 20 24  1.foreach test $
1070: 74 65 73 74 73 20 7b 0a 20 20 64 6f 5f 74 65 73  tests {.  do_tes
1080: 74 20 63 6f 72 72 75 70 74 45 2d 33 2e 24 74 63  t corruptE-3.$tc
1090: 20 7b 0a 20 20 20 20 64 62 20 63 6c 6f 73 65 0a   {.    db close.
10a0: 20 20 20 20 63 6f 70 79 5f 66 69 6c 65 20 74 65      copy_file te
10b0: 73 74 2e 62 75 20 74 65 73 74 2e 64 62 0a 0a 20  st.bu test.db.. 
10c0: 20 20 20 23 20 69 6e 73 65 72 74 20 63 6f 72 72     # insert corr
10d0: 75 70 74 20 62 79 74 65 28 73 29 0a 20 20 20 20  upt byte(s).    
10e0: 68 65 78 69 6f 5f 77 72 69 74 65 20 74 65 73 74  hexio_write test
10f0: 2e 64 62 20 5b 6c 69 6e 64 65 78 20 24 74 65 73  .db [lindex $tes
1100: 74 20 30 5d 20 5b 66 6f 72 6d 61 74 20 25 30 32  t 0] [format %02
1110: 78 20 5b 6c 69 6e 64 65 78 20 24 74 65 73 74 20  x [lindex $test 
1120: 31 5d 5d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33  1]]..    sqlite3
1130: 20 64 62 20 74 65 73 74 2e 64 62 0a 0a 20 20 20   db test.db..   
1140: 20 73 65 74 20 72 65 73 20 5b 20 63 61 74 63 68   set res [ catch
1150: 73 71 6c 20 7b 50 52 41 47 4d 41 20 69 6e 74 65  sql {PRAGMA inte
1160: 67 72 69 74 79 5f 63 68 65 63 6b 7d 20 5d 0a 20  grity_check} ]. 
1170: 20 20 20 73 65 74 20 61 6e 73 20 5b 6c 69 6e 64     set ans [lind
1180: 65 78 20 24 72 65 73 20 31 5d 0a 0a 20 20 20 20  ex $res 1]..    
1190: 6c 69 73 74 20 5b 72 65 67 65 78 70 20 7b 6f 75  list [regexp {ou
11a0: 74 20 6f 66 20 6f 72 64 65 72 7d 20 24 61 6e 73  t of order} $ans
11b0: 5d 0a 20 20 7d 20 7b 31 7d 0a 20 20 69 6e 63 72  ].  } {1}.  incr
11c0: 20 74 63 20 31 0a 7d 0a 0a 66 69 6e 69 73 68 5f   tc 1.}..finish_
11d0: 74 65 73 74 0a                                   test.