/ Hex Artifact Content
Login

Artifact 9c0ab4becd50e9050bc1ebb8675456a4e5587bf0:


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 0a 23 0a 23 20 24 49 64 3a 20   file..#.# $Id: 
0220: 63 6f 72 72 75 70 74 32 2e 74 65 73 74 2c 76 20  corrupt2.test,v 
0230: 31 2e 32 30 20 32 30 30 39 2f 30 34 2f 30 36 20  1.20 2009/04/06 
0240: 31 37 3a 35 30 3a 30 33 20 64 61 6e 69 65 6c 6b  17:50:03 danielk
0250: 31 39 37 37 20 45 78 70 20 24 0a 0a 73 65 74 20  1977 Exp $..set 
0260: 74 65 73 74 64 69 72 20 5b 66 69 6c 65 20 64 69  testdir [file di
0270: 72 6e 61 6d 65 20 24 61 72 67 76 30 5d 0a 73 6f  rname $argv0].so
0280: 75 72 63 65 20 24 74 65 73 74 64 69 72 2f 74 65  urce $testdir/te
0290: 73 74 65 72 2e 74 63 6c 0a 0a 23 20 44 6f 20 6e  ster.tcl..# Do n
02a0: 6f 74 20 75 73 65 20 61 20 63 6f 64 65 63 20 66  ot use a codec f
02b0: 6f 72 20 74 65 73 74 73 20 69 6e 20 74 68 69 73  or tests in this
02c0: 20 66 69 6c 65 2c 20 61 73 20 74 68 65 20 64 61   file, as the da
02d0: 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 0a 23  tabase file is.#
02e0: 20 6d 61 6e 69 70 75 6c 61 74 65 64 20 64 69 72   manipulated dir
02f0: 65 63 74 6c 79 20 75 73 69 6e 67 20 74 63 6c 20  ectly using tcl 
0300: 73 63 72 69 70 74 73 20 28 75 73 69 6e 67 20 74  scripts (using t
0310: 68 65 20 5b 68 65 78 69 6f 5f 77 72 69 74 65 5d  he [hexio_write]
0320: 20 63 6f 6d 6d 61 6e 64 29 2e 0a 23 0a 64 6f 5f   command)..#.do_
0330: 6e 6f 74 5f 75 73 65 5f 63 6f 64 65 63 0a 0a 73  not_use_codec..s
0340: 65 74 20 70 72 65 73 71 6c 20 22 22 0a 63 61 74  et presql "".cat
0350: 63 68 20 7b 20 73 65 74 20 70 72 65 73 71 6c 20  ch { set presql 
0360: 22 24 3a 3a 47 28 70 65 72 6d 3a 70 72 65 73 71  "$::G(perm:presq
0370: 6c 29 3b 22 20 7d 0a 75 6e 73 65 74 20 2d 6e 6f  l);" }.unset -no
0380: 63 6f 6d 70 6c 61 69 6e 20 3a 3a 47 28 70 65 72  complain ::G(per
0390: 6d 3a 70 72 65 73 71 6c 29 0a 0a 23 20 54 68 65  m:presql)..# The
03a0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74 73   following tests
03b0: 20 2d 20 63 6f 72 72 75 70 74 32 2d 31 2e 2a 20   - corrupt2-1.* 
03c0: 2d 20 63 72 65 61 74 65 20 73 6f 6d 65 20 64 61  - create some da
03d0: 74 61 62 61 73 65 73 20 63 6f 72 72 75 70 74 65  tabases corrupte
03e0: 64 20 69 6e 0a 23 20 73 70 65 63 69 66 69 63 20  d in.# specific 
03f0: 77 61 79 73 20 61 6e 64 20 65 6e 73 75 72 65 20  ways and ensure 
0400: 74 68 61 74 20 53 51 4c 69 74 65 20 64 65 74 65  that SQLite dete
0410: 63 74 73 20 74 68 65 6d 20 61 73 20 63 6f 72 72  cts them as corr
0420: 75 70 74 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 63  upt..#.do_test c
0430: 6f 72 72 75 70 74 32 2d 31 2e 31 20 7b 0a 20 20  orrupt2-1.1 {.  
0440: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52  execsql {.    PR
0450: 41 47 4d 41 20 61 75 74 6f 5f 76 61 63 75 75 6d  AGMA auto_vacuum
0460: 3d 30 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 70  =0;.    PRAGMA p
0470: 61 67 65 5f 73 69 7a 65 3d 31 30 32 34 3b 0a 20  age_size=1024;. 
0480: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
0490: 61 62 63 28 61 2c 20 62 2c 20 63 29 3b 0a 20 20  abc(a, b, c);.  
04a0: 7d 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74 20  }.} {}..do_test 
04b0: 63 6f 72 72 75 70 74 32 2d 31 2e 32 20 7b 0a 0a  corrupt2-1.2 {..
04c0: 20 20 23 20 43 6f 72 72 75 70 74 20 74 68 65 20    # Corrupt the 
04d0: 31 36 20 62 79 74 65 20 6d 61 67 69 63 20 73 74  16 byte magic st
04e0: 72 69 6e 67 20 61 74 20 74 68 65 20 73 74 61 72  ring at the star
04f0: 74 20 6f 66 20 74 68 65 20 66 69 6c 65 0a 20 20  t of the file.  
0500: 66 6f 72 63 65 64 65 6c 65 74 65 20 63 6f 72 72  forcedelete corr
0510: 75 70 74 2e 64 62 0a 20 20 66 6f 72 63 65 64 65  upt.db.  forcede
0520: 6c 65 74 65 20 63 6f 72 72 75 70 74 2e 64 62 2d  lete corrupt.db-
0530: 6a 6f 75 72 6e 61 6c 0a 20 20 66 6f 72 63 65 63  journal.  forcec
0540: 6f 70 79 20 74 65 73 74 2e 64 62 20 63 6f 72 72  opy test.db corr
0550: 75 70 74 2e 64 62 0a 20 20 73 65 74 20 66 20 5b  upt.db.  set f [
0560: 6f 70 65 6e 20 63 6f 72 72 75 70 74 2e 64 62 20  open corrupt.db 
0570: 52 44 57 52 5d 0a 20 20 73 65 65 6b 20 24 66 20  RDWR].  seek $f 
0580: 38 20 73 74 61 72 74 0a 20 20 70 75 74 73 20 24  8 start.  puts $
0590: 66 20 62 6c 61 68 0a 20 20 63 6c 6f 73 65 20 24  f blah.  close $
05a0: 66 0a 0a 20 20 73 71 6c 69 74 65 33 20 64 62 32  f..  sqlite3 db2
05b0: 20 63 6f 72 72 75 70 74 2e 64 62 0a 20 20 63 61   corrupt.db.  ca
05c0: 74 63 68 73 71 6c 20 22 0a 20 20 20 20 24 3a 3a  tchsql ".    $::
05d0: 70 72 65 73 71 6c 0a 20 20 20 20 53 45 4c 45 43  presql.    SELEC
05e0: 54 20 2a 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  T * FROM sqlite_
05f0: 6d 61 73 74 65 72 3b 0a 20 20 22 20 64 62 32 0a  master;.  " db2.
0600: 7d 20 7b 31 20 7b 66 69 6c 65 20 69 73 20 65 6e  } {1 {file is en
0610: 63 72 79 70 74 65 64 20 6f 72 20 69 73 20 6e 6f  crypted or is no
0620: 74 20 61 20 64 61 74 61 62 61 73 65 7d 7d 0a 0a  t a database}}..
0630: 64 6f 5f 74 65 73 74 20 63 6f 72 72 75 70 74 32  do_test corrupt2
0640: 2d 31 2e 33 20 7b 0a 20 20 64 62 32 20 63 6c 6f  -1.3 {.  db2 clo
0650: 73 65 0a 0a 20 20 23 20 43 6f 72 72 75 70 74 20  se..  # Corrupt 
0660: 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 28 62  the page-size (b
0670: 79 74 65 73 20 31 36 20 61 6e 64 20 31 37 20 6f  ytes 16 and 17 o
0680: 66 20 70 61 67 65 20 31 29 2e 0a 20 20 66 6f 72  f page 1)..  for
0690: 63 65 64 65 6c 65 74 65 20 63 6f 72 72 75 70 74  cedelete corrupt
06a0: 2e 64 62 0a 20 20 66 6f 72 63 65 64 65 6c 65 74  .db.  forcedelet
06b0: 65 20 63 6f 72 72 75 70 74 2e 64 62 2d 6a 6f 75  e corrupt.db-jou
06c0: 72 6e 61 6c 0a 20 20 66 6f 72 63 65 63 6f 70 79  rnal.  forcecopy
06d0: 20 74 65 73 74 2e 64 62 20 63 6f 72 72 75 70 74   test.db corrupt
06e0: 2e 64 62 0a 20 20 73 65 74 20 66 20 5b 6f 70 65  .db.  set f [ope
06f0: 6e 20 63 6f 72 72 75 70 74 2e 64 62 20 52 44 57  n corrupt.db RDW
0700: 52 5d 0a 20 20 66 63 6f 6e 66 69 67 75 72 65 20  R].  fconfigure 
0710: 24 66 20 2d 65 6e 63 6f 64 69 6e 67 20 62 69 6e  $f -encoding bin
0720: 61 72 79 0a 20 20 73 65 65 6b 20 24 66 20 31 36  ary.  seek $f 16
0730: 20 73 74 61 72 74 0a 20 20 70 75 74 73 20 2d 6e   start.  puts -n
0740: 6f 6e 65 77 6c 69 6e 65 20 24 66 20 22 5c 78 30  onewline $f "\x0
0750: 30 5c 78 46 46 22 0a 20 20 63 6c 6f 73 65 20 24  0\xFF".  close $
0760: 66 0a 0a 20 20 73 71 6c 69 74 65 33 20 64 62 32  f..  sqlite3 db2
0770: 20 63 6f 72 72 75 70 74 2e 64 62 0a 20 20 63 61   corrupt.db.  ca
0780: 74 63 68 73 71 6c 20 22 0a 20 20 20 20 24 3a 3a  tchsql ".    $::
0790: 70 72 65 73 71 6c 0a 20 20 20 20 53 45 4c 45 43  presql.    SELEC
07a0: 54 20 2a 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  T * FROM sqlite_
07b0: 6d 61 73 74 65 72 3b 0a 20 20 22 20 64 62 32 0a  master;.  " db2.
07c0: 7d 20 7b 31 20 7b 66 69 6c 65 20 69 73 20 65 6e  } {1 {file is en
07d0: 63 72 79 70 74 65 64 20 6f 72 20 69 73 20 6e 6f  crypted or is no
07e0: 74 20 61 20 64 61 74 61 62 61 73 65 7d 7d 0a 0a  t a database}}..
07f0: 64 6f 5f 74 65 73 74 20 63 6f 72 72 75 70 74 32  do_test corrupt2
0800: 2d 31 2e 34 20 7b 0a 20 20 64 62 32 20 63 6c 6f  -1.4 {.  db2 clo
0810: 73 65 0a 0a 20 20 23 20 43 6f 72 72 75 70 74 20  se..  # Corrupt 
0820: 74 68 65 20 66 72 65 65 2d 62 6c 6f 63 6b 20 6c  the free-block l
0830: 69 73 74 20 6f 6e 20 70 61 67 65 20 31 2e 0a 20  ist on page 1.. 
0840: 20 66 6f 72 63 65 64 65 6c 65 74 65 20 63 6f 72   forcedelete cor
0850: 72 75 70 74 2e 64 62 0a 20 20 66 6f 72 63 65 64  rupt.db.  forced
0860: 65 6c 65 74 65 20 63 6f 72 72 75 70 74 2e 64 62  elete corrupt.db
0870: 2d 6a 6f 75 72 6e 61 6c 0a 20 20 66 6f 72 63 65  -journal.  force
0880: 63 6f 70 79 20 74 65 73 74 2e 64 62 20 63 6f 72  copy test.db cor
0890: 72 75 70 74 2e 64 62 0a 20 20 73 65 74 20 66 20  rupt.db.  set f 
08a0: 5b 6f 70 65 6e 20 63 6f 72 72 75 70 74 2e 64 62  [open corrupt.db
08b0: 20 52 44 57 52 5d 0a 20 20 66 63 6f 6e 66 69 67   RDWR].  fconfig
08c0: 75 72 65 20 24 66 20 2d 65 6e 63 6f 64 69 6e 67  ure $f -encoding
08d0: 20 62 69 6e 61 72 79 0a 20 20 73 65 65 6b 20 24   binary.  seek $
08e0: 66 20 31 30 31 20 73 74 61 72 74 0a 20 20 70 75  f 101 start.  pu
08f0: 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 24 66  ts -nonewline $f
0900: 20 22 5c 78 46 46 5c 78 46 46 22 0a 20 20 63 6c   "\xFF\xFF".  cl
0910: 6f 73 65 20 24 66 0a 0a 20 20 73 71 6c 69 74 65  ose $f..  sqlite
0920: 33 20 64 62 32 20 63 6f 72 72 75 70 74 2e 64 62  3 db2 corrupt.db
0930: 0a 20 20 63 61 74 63 68 73 71 6c 20 22 0a 20 20  .  catchsql ".  
0940: 20 20 24 3a 3a 70 72 65 73 71 6c 0a 20 20 20 20    $::presql.    
0950: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 71  SELECT * FROM sq
0960: 6c 69 74 65 5f 6d 61 73 74 65 72 3b 0a 20 20 22  lite_master;.  "
0970: 20 64 62 32 0a 7d 20 7b 31 20 7b 64 61 74 61 62   db2.} {1 {datab
0980: 61 73 65 20 64 69 73 6b 20 69 6d 61 67 65 20 69  ase disk image i
0990: 73 20 6d 61 6c 66 6f 72 6d 65 64 7d 7d 0a 0a 64  s malformed}}..d
09a0: 6f 5f 74 65 73 74 20 63 6f 72 72 75 70 74 32 2d  o_test corrupt2-
09b0: 31 2e 35 20 7b 0a 20 20 64 62 32 20 63 6c 6f 73  1.5 {.  db2 clos
09c0: 65 0a 0a 20 20 23 20 43 6f 72 72 75 70 74 20 74  e..  # Corrupt t
09d0: 68 65 20 66 72 65 65 2d 62 6c 6f 63 6b 20 6c 69  he free-block li
09e0: 73 74 20 6f 6e 20 70 61 67 65 20 31 2e 0a 20 20  st on page 1..  
09f0: 66 6f 72 63 65 64 65 6c 65 74 65 20 63 6f 72 72  forcedelete corr
0a00: 75 70 74 2e 64 62 0a 20 20 66 6f 72 63 65 64 65  upt.db.  forcede
0a10: 6c 65 74 65 20 63 6f 72 72 75 70 74 2e 64 62 2d  lete corrupt.db-
0a20: 6a 6f 75 72 6e 61 6c 0a 20 20 66 6f 72 63 65 63  journal.  forcec
0a30: 6f 70 79 20 74 65 73 74 2e 64 62 20 63 6f 72 72  opy test.db corr
0a40: 75 70 74 2e 64 62 0a 20 20 73 65 74 20 66 20 5b  upt.db.  set f [
0a50: 6f 70 65 6e 20 63 6f 72 72 75 70 74 2e 64 62 20  open corrupt.db 
0a60: 52 44 57 52 5d 0a 20 20 66 63 6f 6e 66 69 67 75  RDWR].  fconfigu
0a70: 72 65 20 24 66 20 2d 65 6e 63 6f 64 69 6e 67 20  re $f -encoding 
0a80: 62 69 6e 61 72 79 0a 20 20 73 65 65 6b 20 24 66  binary.  seek $f
0a90: 20 31 30 31 20 73 74 61 72 74 0a 20 20 70 75 74   101 start.  put
0aa0: 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 24 66 20  s -nonewline $f 
0ab0: 22 5c 78 30 30 5c 78 43 38 22 0a 20 20 73 65 65  "\x00\xC8".  see
0ac0: 6b 20 24 66 20 32 30 30 20 73 74 61 72 74 0a 20  k $f 200 start. 
0ad0: 20 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65   puts -nonewline
0ae0: 20 24 66 20 22 5c 78 30 30 5c 78 30 30 22 0a 20   $f "\x00\x00". 
0af0: 20 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65   puts -nonewline
0b00: 20 24 66 20 22 5c 78 31 30 5c 78 30 30 22 0a 20   $f "\x10\x00". 
0b10: 20 63 6c 6f 73 65 20 24 66 0a 0a 20 20 73 71 6c   close $f..  sql
0b20: 69 74 65 33 20 64 62 32 20 63 6f 72 72 75 70 74  ite3 db2 corrupt
0b30: 2e 64 62 0a 20 20 63 61 74 63 68 73 71 6c 20 22  .db.  catchsql "
0b40: 0a 20 20 20 20 24 3a 3a 70 72 65 73 71 6c 0a 20  .    $::presql. 
0b50: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
0b60: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 3b 0a   sqlite_master;.
0b70: 20 20 22 20 64 62 32 0a 7d 20 7b 31 20 7b 64 61    " db2.} {1 {da
0b80: 74 61 62 61 73 65 20 64 69 73 6b 20 69 6d 61 67  tabase disk imag
0b90: 65 20 69 73 20 6d 61 6c 66 6f 72 6d 65 64 7d 7d  e is malformed}}
0ba0: 0a 64 62 32 20 63 6c 6f 73 65 0a 0a 23 20 43 6f  .db2 close..# Co
0bb0: 72 72 75 70 74 20 61 20 64 61 74 61 62 61 73 65  rrupt a database
0bc0: 20 62 79 20 68 61 76 69 6e 67 20 32 20 69 6e 64   by having 2 ind
0bd0: 69 63 65 73 20 6f 66 20 74 68 65 20 73 61 6d 65  ices of the same
0be0: 20 6e 61 6d 65 3a 0a 64 6f 5f 74 65 73 74 20 63   name:.do_test c
0bf0: 6f 72 72 75 70 74 32 2d 32 2e 31 20 7b 0a 0a 20  orrupt2-2.1 {.. 
0c00: 20 66 6f 72 63 65 64 65 6c 65 74 65 20 63 6f 72   forcedelete cor
0c10: 72 75 70 74 2e 64 62 0a 20 20 66 6f 72 63 65 64  rupt.db.  forced
0c20: 65 6c 65 74 65 20 63 6f 72 72 75 70 74 2e 64 62  elete corrupt.db
0c30: 2d 6a 6f 75 72 6e 61 6c 0a 20 20 66 6f 72 63 65  -journal.  force
0c40: 63 6f 70 79 20 74 65 73 74 2e 64 62 20 63 6f 72  copy test.db cor
0c50: 72 75 70 74 2e 64 62 0a 0a 20 20 73 71 6c 69 74  rupt.db..  sqlit
0c60: 65 33 20 64 62 32 20 63 6f 72 72 75 70 74 2e 64  e3 db2 corrupt.d
0c70: 62 20 0a 20 20 65 78 65 63 73 71 6c 20 22 0a 20  b .  execsql ". 
0c80: 20 20 20 24 3a 3a 70 72 65 73 71 6c 0a 20 20 20     $::presql.   
0c90: 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 61 31   CREATE INDEX a1
0ca0: 20 4f 4e 20 61 62 63 28 61 29 3b 0a 20 20 20 20   ON abc(a);.    
0cb0: 43 52 45 41 54 45 20 49 4e 44 45 58 20 61 32 20  CREATE INDEX a2 
0cc0: 4f 4e 20 61 62 63 28 62 29 3b 0a 20 20 20 20 50  ON abc(b);.    P
0cd0: 52 41 47 4d 41 20 77 72 69 74 61 62 6c 65 5f 73  RAGMA writable_s
0ce0: 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20 55  chema = 1;.    U
0cf0: 50 44 41 54 45 20 73 71 6c 69 74 65 5f 6d 61 73  PDATE sqlite_mas
0d00: 74 65 72 20 0a 20 20 20 20 20 20 53 45 54 20 6e  ter .      SET n
0d10: 61 6d 65 20 3d 20 27 61 33 27 2c 20 73 71 6c 20  ame = 'a3', sql 
0d20: 3d 20 27 43 52 45 41 54 45 20 49 4e 44 45 58 20  = 'CREATE INDEX 
0d30: 61 33 27 20 7c 7c 20 73 75 62 73 74 72 28 73 71  a3' || substr(sq
0d40: 6c 2c 20 31 36 2c 20 31 30 30 30 30 29 0a 20 20  l, 16, 10000).  
0d50: 20 20 20 20 57 48 45 52 45 20 74 79 70 65 20 3d      WHERE type =
0d60: 20 27 69 6e 64 65 78 27 3b 0a 20 20 20 20 50 52   'index';.    PR
0d70: 41 47 4d 41 20 77 72 69 74 61 62 6c 65 5f 73 63  AGMA writable_sc
0d80: 68 65 6d 61 20 3d 20 30 3b 0a 20 20 22 20 64 62  hema = 0;.  " db
0d90: 32 0a 0a 20 20 64 62 32 20 63 6c 6f 73 65 0a 20  2..  db2 close. 
0da0: 20 73 71 6c 69 74 65 33 20 64 62 32 20 63 6f 72   sqlite3 db2 cor
0db0: 72 75 70 74 2e 64 62 20 0a 20 20 63 61 74 63 68  rupt.db .  catch
0dc0: 73 71 6c 20 22 0a 20 20 20 20 24 3a 3a 70 72 65  sql ".    $::pre
0dd0: 73 71 6c 0a 20 20 20 20 53 45 4c 45 43 54 20 2a  sql.    SELECT *
0de0: 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73   FROM sqlite_mas
0df0: 74 65 72 3b 0a 20 20 22 20 64 62 32 0a 7d 20 7b  ter;.  " db2.} {
0e00: 31 20 7b 6d 61 6c 66 6f 72 6d 65 64 20 64 61 74  1 {malformed dat
0e10: 61 62 61 73 65 20 73 63 68 65 6d 61 20 28 61 33  abase schema (a3
0e20: 29 20 2d 20 69 6e 64 65 78 20 61 33 20 61 6c 72  ) - index a3 alr
0e30: 65 61 64 79 20 65 78 69 73 74 73 7d 7d 0a 0a 64  eady exists}}..d
0e40: 62 32 20 63 6c 6f 73 65 0a 0a 64 6f 5f 74 65 73  b2 close..do_tes
0e50: 74 20 63 6f 72 72 75 70 74 32 2d 33 2e 31 20 7b  t corrupt2-3.1 {
0e60: 0a 20 20 66 6f 72 63 65 64 65 6c 65 74 65 20 63  .  forcedelete c
0e70: 6f 72 72 75 70 74 2e 64 62 0a 20 20 66 6f 72 63  orrupt.db.  forc
0e80: 65 64 65 6c 65 74 65 20 63 6f 72 72 75 70 74 2e  edelete corrupt.
0e90: 64 62 2d 6a 6f 75 72 6e 61 6c 0a 20 20 73 71 6c  db-journal.  sql
0ea0: 69 74 65 33 20 64 62 32 20 63 6f 72 72 75 70 74  ite3 db2 corrupt
0eb0: 2e 64 62 20 0a 0a 20 20 65 78 65 63 73 71 6c 20  .db ..  execsql 
0ec0: 22 0a 20 20 20 20 24 3a 3a 70 72 65 73 71 6c 0a  ".    $::presql.
0ed0: 20 20 20 20 50 52 41 47 4d 41 20 61 75 74 6f 5f      PRAGMA auto_
0ee0: 76 61 63 75 75 6d 20 3d 20 31 3b 0a 20 20 20 20  vacuum = 1;.    
0ef0: 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65  PRAGMA page_size
0f00: 20 3d 20 31 30 32 34 3b 0a 20 20 20 20 43 52 45   = 1024;.    CRE
0f10: 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20  ATE TABLE t1(a, 
0f20: 62 2c 20 63 29 3b 0a 20 20 20 20 43 52 45 41 54  b, c);.    CREAT
0f30: 45 20 54 41 42 4c 45 20 74 32 28 61 2c 20 62 2c  E TABLE t2(a, b,
0f40: 20 63 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   c);.    INSERT 
0f50: 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 72  INTO t2 VALUES(r
0f60: 61 6e 64 6f 6d 62 6c 6f 62 28 31 30 30 29 2c 20  andomblob(100), 
0f70: 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 30 30 29 2c  randomblob(100),
0f80: 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 30 30 29   randomblob(100)
0f90: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
0fa0: 54 4f 20 74 32 20 53 45 4c 45 43 54 20 2a 20 46  TO t2 SELECT * F
0fb0: 52 4f 4d 20 74 32 3b 0a 20 20 20 20 49 4e 53 45  ROM t2;.    INSE
0fc0: 52 54 20 49 4e 54 4f 20 74 32 20 53 45 4c 45 43  RT INTO t2 SELEC
0fd0: 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 20 20 20  T * FROM t2;.   
0fe0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20   INSERT INTO t2 
0ff0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32  SELECT * FROM t2
1000: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
1010: 4f 20 74 32 20 53 45 4c 45 43 54 20 2a 20 46 52  O t2 SELECT * FR
1020: 4f 4d 20 74 32 3b 0a 20 20 22 20 64 62 32 0a 0a  OM t2;.  " db2..
1030: 20 20 64 62 32 20 63 6c 6f 73 65 0a 0a 20 20 23    db2 close..  #
1040: 20 4f 6e 20 74 68 65 20 72 6f 6f 74 20 70 61 67   On the root pag
1050: 65 20 6f 66 20 74 61 62 6c 65 20 74 32 20 28 70  e of table t2 (p
1060: 61 67 65 20 34 29 2c 20 73 65 74 20 6f 6e 65 20  age 4), set one 
1070: 6f 66 20 74 68 65 20 63 68 69 6c 64 20 70 61 67  of the child pag
1080: 65 2d 6e 75 6d 62 65 72 73 0a 20 20 23 20 74 6f  e-numbers.  # to
1090: 20 30 2e 20 54 68 69 73 20 63 6f 72 72 75 70 74   0. This corrupt
10a0: 69 6f 6e 20 77 69 6c 6c 20 62 65 20 64 65 74 65  ion will be dete
10b0: 63 74 65 64 20 77 68 65 6e 20 53 51 4c 69 74 65  cted when SQLite
10c0: 20 61 74 74 65 6d 70 74 73 20 74 6f 20 75 70 64   attempts to upd
10d0: 61 74 65 0a 20 20 23 20 74 68 65 20 70 6f 69 6e  ate.  # the poin
10e0: 74 65 72 2d 6d 61 70 20 61 66 74 65 72 20 6d 6f  ter-map after mo
10f0: 76 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74  ving the content
1100: 20 6f 66 20 70 61 67 65 20 34 20 74 6f 20 70 61   of page 4 to pa
1110: 67 65 20 33 20 61 73 20 70 61 72 74 0a 20 20 23  ge 3 as part.  #
1120: 20 6f 66 20 74 68 65 20 44 52 4f 50 20 54 41 42   of the DROP TAB
1130: 4c 45 20 6f 70 65 72 61 74 69 6f 6e 20 62 65 6c  LE operation bel
1140: 6f 77 2e 0a 20 20 23 0a 20 20 73 65 74 20 66 64  ow..  #.  set fd
1150: 20 5b 6f 70 65 6e 20 63 6f 72 72 75 70 74 2e 64   [open corrupt.d
1160: 62 20 72 2b 5d 0a 20 20 66 63 6f 6e 66 69 67 75  b r+].  fconfigu
1170: 72 65 20 24 66 64 20 2d 65 6e 63 6f 64 69 6e 67  re $fd -encoding
1180: 20 62 69 6e 61 72 79 20 2d 74 72 61 6e 73 6c 61   binary -transla
1190: 74 69 6f 6e 20 62 69 6e 61 72 79 0a 20 20 73 65  tion binary.  se
11a0: 65 6b 20 24 66 64 20 5b 65 78 70 72 20 31 30 32  ek $fd [expr 102
11b0: 34 2a 33 20 2b 20 31 32 5d 0a 20 20 73 65 74 20  4*3 + 12].  set 
11c0: 7a 43 65 6c 6c 6f 66 66 73 65 74 20 5b 72 65 61  zCelloffset [rea
11d0: 64 20 24 66 64 20 32 5d 0a 20 20 62 69 6e 61 72  d $fd 2].  binar
11e0: 79 20 73 63 61 6e 20 24 7a 43 65 6c 6c 6f 66 66  y scan $zCelloff
11f0: 73 65 74 20 53 20 69 43 65 6c 6c 6f 66 66 73 65  set S iCelloffse
1200: 74 0a 20 20 73 65 65 6b 20 24 66 64 20 5b 65 78  t.  seek $fd [ex
1210: 70 72 20 31 30 32 34 2a 33 20 2b 20 24 69 43 65  pr 1024*3 + $iCe
1220: 6c 6c 6f 66 66 73 65 74 5d 0a 20 20 70 75 74 73  lloffset].  puts
1230: 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 24 66 64 20   -nonewline $fd 
1240: 22 5c 30 30 5c 30 30 5c 30 30 5c 30 30 22 20 0a  "\00\00\00\00" .
1250: 20 20 63 6c 6f 73 65 20 24 66 64 0a 0a 20 20 73    close $fd..  s
1260: 71 6c 69 74 65 33 20 64 62 32 20 63 6f 72 72 75  qlite3 db2 corru
1270: 70 74 2e 64 62 20 0a 20 20 63 61 74 63 68 73 71  pt.db .  catchsq
1280: 6c 20 22 0a 20 20 20 20 24 3a 3a 70 72 65 73 71  l ".    $::presq
1290: 6c 0a 20 20 20 20 44 52 4f 50 20 54 41 42 4c 45  l.    DROP TABLE
12a0: 20 74 31 3b 0a 20 20 22 20 64 62 32 0a 7d 20 7b   t1;.  " db2.} {
12b0: 31 20 7b 64 61 74 61 62 61 73 65 20 64 69 73 6b  1 {database disk
12c0: 20 69 6d 61 67 65 20 69 73 20 6d 61 6c 66 6f 72   image is malfor
12d0: 6d 65 64 7d 7d 0a 0a 64 6f 5f 74 65 73 74 20 63  med}}..do_test c
12e0: 6f 72 72 75 70 74 32 2d 34 2e 31 20 7b 0a 20 20  orrupt2-4.1 {.  
12f0: 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 53  catchsql {.    S
1300: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b  ELECT * FROM t2;
1310: 0a 20 20 7d 20 64 62 32 0a 7d 20 7b 31 20 7b 64  .  } db2.} {1 {d
1320: 61 74 61 62 61 73 65 20 64 69 73 6b 20 69 6d 61  atabase disk ima
1330: 67 65 20 69 73 20 6d 61 6c 66 6f 72 6d 65 64 7d  ge is malformed}
1340: 7d 0a 0a 64 62 32 20 63 6c 6f 73 65 0a 0a 75 6e  }..db2 close..un
1350: 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20  set -nocomplain 
1360: 72 65 73 75 6c 74 0a 64 6f 5f 74 65 73 74 20 63  result.do_test c
1370: 6f 72 72 75 70 74 32 2d 35 2e 31 20 7b 0a 20 20  orrupt2-5.1 {.  
1380: 66 6f 72 63 65 64 65 6c 65 74 65 20 63 6f 72 72  forcedelete corr
1390: 75 70 74 2e 64 62 0a 20 20 66 6f 72 63 65 64 65  upt.db.  forcede
13a0: 6c 65 74 65 20 63 6f 72 72 75 70 74 2e 64 62 2d  lete corrupt.db-
13b0: 6a 6f 75 72 6e 61 6c 0a 20 20 73 71 6c 69 74 65  journal.  sqlite
13c0: 33 20 64 62 32 20 63 6f 72 72 75 70 74 2e 64 62  3 db2 corrupt.db
13d0: 20 0a 0a 20 20 65 78 65 63 73 71 6c 20 22 0a 20   ..  execsql ". 
13e0: 20 20 20 24 3a 3a 70 72 65 73 71 6c 0a 20 20 20     $::presql.   
13f0: 20 50 52 41 47 4d 41 20 61 75 74 6f 5f 76 61 63   PRAGMA auto_vac
1400: 75 75 6d 20 3d 20 30 3b 0a 20 20 20 20 50 52 41  uum = 0;.    PRA
1410: 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20  GMA page_size = 
1420: 31 30 32 34 3b 0a 20 20 20 20 43 52 45 41 54 45  1024;.    CREATE
1430: 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 2c 20   TABLE t1(a, b, 
1440: 63 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  c);.    CREATE T
1450: 41 42 4c 45 20 74 32 28 61 2c 20 62 2c 20 63 29  ABLE t2(a, b, c)
1460: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
1470: 4f 20 74 32 20 56 41 4c 55 45 53 28 72 61 6e 64  O t2 VALUES(rand
1480: 6f 6d 62 6c 6f 62 28 31 30 30 29 2c 20 72 61 6e  omblob(100), ran
1490: 64 6f 6d 62 6c 6f 62 28 31 30 30 29 2c 20 72 61  domblob(100), ra
14a0: 6e 64 6f 6d 62 6c 6f 62 28 31 30 30 29 29 3b 0a  ndomblob(100));.
14b0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
14c0: 74 32 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  t2 SELECT * FROM
14d0: 20 74 32 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   t2;.    INSERT 
14e0: 49 4e 54 4f 20 74 32 20 53 45 4c 45 43 54 20 2a  INTO t2 SELECT *
14f0: 20 46 52 4f 4d 20 74 32 3b 0a 20 20 20 20 49 4e   FROM t2;.    IN
1500: 53 45 52 54 20 49 4e 54 4f 20 74 32 20 53 45 4c  SERT INTO t2 SEL
1510: 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 20  ECT * FROM t2;. 
1520: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
1530: 32 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  2 SELECT * FROM 
1540: 74 32 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  t2;.    INSERT I
1550: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 2a 20  NTO t1 SELECT * 
1560: 46 52 4f 4d 20 74 32 3b 0a 20 20 22 20 64 62 32  FROM t2;.  " db2
1570: 0a 0a 20 20 64 62 32 20 63 6c 6f 73 65 0a 0a 20  ..  db2 close.. 
1580: 20 23 20 54 68 69 73 20 62 6c 6f 63 6b 20 6c 69   # This block li
1590: 6e 6b 73 20 61 20 70 61 67 65 20 66 72 6f 6d 20  nks a page from 
15a0: 74 61 62 6c 65 20 74 32 20 69 6e 74 6f 20 74 68  table t2 into th
15b0: 65 20 74 31 20 74 61 62 6c 65 20 73 74 72 75 63  e t1 table struc
15c0: 74 75 72 65 2e 0a 20 20 23 0a 20 20 73 65 74 20  ture..  #.  set 
15d0: 66 64 20 5b 6f 70 65 6e 20 63 6f 72 72 75 70 74  fd [open corrupt
15e0: 2e 64 62 20 72 2b 5d 0a 20 20 66 63 6f 6e 66 69  .db r+].  fconfi
15f0: 67 75 72 65 20 24 66 64 20 2d 65 6e 63 6f 64 69  gure $fd -encodi
1600: 6e 67 20 62 69 6e 61 72 79 20 2d 74 72 61 6e 73  ng binary -trans
1610: 6c 61 74 69 6f 6e 20 62 69 6e 61 72 79 0a 20 20  lation binary.  
1620: 73 65 65 6b 20 24 66 64 20 5b 65 78 70 72 20 31  seek $fd [expr 1
1630: 30 32 34 20 2b 20 31 32 5d 0a 20 20 73 65 74 20  024 + 12].  set 
1640: 7a 43 65 6c 6c 6f 66 66 73 65 74 20 5b 72 65 61  zCelloffset [rea
1650: 64 20 24 66 64 20 32 5d 0a 20 20 62 69 6e 61 72  d $fd 2].  binar
1660: 79 20 73 63 61 6e 20 24 7a 43 65 6c 6c 6f 66 66  y scan $zCelloff
1670: 73 65 74 20 53 20 69 43 65 6c 6c 6f 66 66 73 65  set S iCelloffse
1680: 74 0a 20 20 73 65 65 6b 20 24 66 64 20 5b 65 78  t.  seek $fd [ex
1690: 70 72 20 31 30 32 34 20 2b 20 24 69 43 65 6c 6c  pr 1024 + $iCell
16a0: 6f 66 66 73 65 74 5d 0a 20 20 73 65 74 20 7a 43  offset].  set zC
16b0: 68 69 6c 64 50 61 67 65 20 5b 72 65 61 64 20 24  hildPage [read $
16c0: 66 64 20 34 5d 0a 20 20 73 65 65 6b 20 24 66 64  fd 4].  seek $fd
16d0: 20 5b 65 78 70 72 20 32 2a 31 30 32 34 20 2b 20   [expr 2*1024 + 
16e0: 31 32 5d 0a 20 20 73 65 74 20 7a 43 65 6c 6c 6f  12].  set zCello
16f0: 66 66 73 65 74 20 5b 72 65 61 64 20 24 66 64 20  ffset [read $fd 
1700: 32 5d 0a 20 20 62 69 6e 61 72 79 20 73 63 61 6e  2].  binary scan
1710: 20 24 7a 43 65 6c 6c 6f 66 66 73 65 74 20 53 20   $zCelloffset S 
1720: 69 43 65 6c 6c 6f 66 66 73 65 74 0a 20 20 73 65  iCelloffset.  se
1730: 65 6b 20 24 66 64 20 5b 65 78 70 72 20 32 2a 31  ek $fd [expr 2*1
1740: 30 32 34 20 2b 20 24 69 43 65 6c 6c 6f 66 66 73  024 + $iCelloffs
1750: 65 74 5d 0a 20 20 70 75 74 73 20 2d 6e 6f 6e 65  et].  puts -none
1760: 77 6c 69 6e 65 20 24 66 64 20 24 7a 43 68 69 6c  wline $fd $zChil
1770: 64 50 61 67 65 0a 20 20 63 6c 6f 73 65 20 24 66  dPage.  close $f
1780: 64 0a 0a 20 20 73 71 6c 69 74 65 33 20 64 62 32  d..  sqlite3 db2
1790: 20 63 6f 72 72 75 70 74 2e 64 62 20 0a 20 20 64   corrupt.db .  d
17a0: 62 32 20 65 76 61 6c 20 24 3a 3a 70 72 65 73 71  b2 eval $::presq
17b0: 6c 0a 20 20 64 62 32 20 65 76 61 6c 20 7b 53 45  l.  db2 eval {SE
17c0: 4c 45 43 54 20 72 6f 77 69 64 20 46 52 4f 4d 20  LECT rowid FROM 
17d0: 74 31 7d 20 7b 0a 20 20 20 20 73 65 74 20 72 65  t1} {.    set re
17e0: 73 75 6c 74 20 5b 64 62 32 20 65 76 61 6c 20 7b  sult [db2 eval {
17f0: 70 72 61 67 6d 61 20 69 6e 74 65 67 72 69 74 79  pragma integrity
1800: 5f 63 68 65 63 6b 7d 5d 0a 20 20 20 20 62 72 65  _check}].    bre
1810: 61 6b 0a 20 20 7d 0a 20 20 73 65 74 20 72 65 73  ak.  }.  set res
1820: 75 6c 74 0a 7d 20 7b 7b 2a 2a 2a 20 69 6e 20 64  ult.} {{*** in d
1830: 61 74 61 62 61 73 65 20 6d 61 69 6e 20 2a 2a 2a  atabase main ***
1840: 0a 4f 6e 20 74 72 65 65 20 70 61 67 65 20 32 20  .On tree page 2 
1850: 63 65 6c 6c 20 30 3a 20 32 6e 64 20 72 65 66 65  cell 0: 2nd refe
1860: 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20 31 30  rence to page 10
1870: 0a 4f 6e 20 74 72 65 65 20 70 61 67 65 20 32 20  .On tree page 2 
1880: 63 65 6c 6c 20 31 3a 20 43 68 69 6c 64 20 70 61  cell 1: Child pa
1890: 67 65 20 64 65 70 74 68 20 64 69 66 66 65 72 73  ge depth differs
18a0: 0a 50 61 67 65 20 34 20 69 73 20 6e 65 76 65 72  .Page 4 is never
18b0: 20 75 73 65 64 7d 7d 0a 0a 64 62 32 20 63 6c 6f   used}}..db2 clo
18c0: 73 65 0a 0a 70 72 6f 63 20 63 6f 72 72 75 70 74  se..proc corrupt
18d0: 69 6f 6e 5f 74 65 73 74 20 7b 61 72 67 73 7d 20  ion_test {args} 
18e0: 7b 0a 20 20 73 65 74 20 41 28 2d 63 6f 72 72 75  {.  set A(-corru
18f0: 70 74 29 20 7b 7d 0a 20 20 73 65 74 20 41 28 2d  pt) {}.  set A(-
1900: 73 71 6c 70 72 65 70 29 20 7b 7d 0a 20 20 73 65  sqlprep) {}.  se
1910: 74 20 41 28 2d 74 63 6c 70 72 65 70 29 20 7b 7d  t A(-tclprep) {}
1920: 0a 20 20 61 72 72 61 79 20 73 65 74 20 41 20 24  .  array set A $
1930: 61 72 67 73 0a 0a 20 20 63 61 74 63 68 20 7b 64  args..  catch {d
1940: 62 20 63 6c 6f 73 65 7d 0a 20 20 66 6f 72 63 65  b close}.  force
1950: 64 65 6c 65 74 65 20 63 6f 72 72 75 70 74 2e 64  delete corrupt.d
1960: 62 0a 20 20 66 6f 72 63 65 64 65 6c 65 74 65 20  b.  forcedelete 
1970: 63 6f 72 72 75 70 74 2e 64 62 2d 6a 6f 75 72 6e  corrupt.db-journ
1980: 61 6c 0a 0a 20 20 73 71 6c 69 74 65 33 20 64 62  al..  sqlite3 db
1990: 20 63 6f 72 72 75 70 74 2e 64 62 20 0a 20 20 64   corrupt.db .  d
19a0: 62 20 65 76 61 6c 20 24 3a 3a 70 72 65 73 71 6c  b eval $::presql
19b0: 0a 20 20 65 76 61 6c 20 24 41 28 2d 74 63 6c 70  .  eval $A(-tclp
19c0: 72 65 70 29 0a 20 20 64 62 20 65 76 61 6c 20 24  rep).  db eval $
19d0: 41 28 2d 73 71 6c 70 72 65 70 29 0a 20 20 64 62  A(-sqlprep).  db
19e0: 20 63 6c 6f 73 65 0a 0a 20 20 65 76 61 6c 20 24   close..  eval $
19f0: 41 28 2d 63 6f 72 72 75 70 74 29 0a 0a 20 20 73  A(-corrupt)..  s
1a00: 71 6c 69 74 65 33 20 64 62 20 63 6f 72 72 75 70  qlite3 db corrup
1a10: 74 2e 64 62 0a 20 20 65 76 61 6c 20 24 41 28 2d  t.db.  eval $A(-
1a20: 74 65 73 74 29 0a 7d 0a 0a 69 66 63 61 70 61 62  test).}..ifcapab
1a30: 6c 65 20 61 75 74 6f 76 61 63 75 75 6d 20 7b 0a  le autovacuum {.
1a40: 20 20 23 20 54 68 65 20 74 65 73 74 73 20 77 69    # The tests wi
1a50: 74 68 69 6e 20 74 68 69 73 20 62 6c 6f 63 6b 20  thin this block 
1a60: 2d 20 63 6f 72 72 75 70 74 32 2d 36 2e 2a 20 2d  - corrupt2-6.* -
1a70: 20 61 69 6d 20 74 6f 20 74 65 73 74 20 63 6f 72   aim to test cor
1a80: 72 75 70 74 69 6f 6e 0a 20 20 23 20 64 65 74 65  ruption.  # dete
1a90: 63 74 69 6f 6e 20 77 69 74 68 69 6e 20 61 6e 20  ction within an 
1aa0: 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75  incremental-vacu
1ab0: 75 6d 2e 20 57 68 65 6e 20 61 6e 20 69 6e 63 72  um. When an incr
1ac0: 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d 0a 20  emental-vacuum. 
1ad0: 20 23 20 73 74 65 70 20 69 73 20 65 78 65 63 75   # step is execu
1ae0: 74 65 64 2c 20 74 68 65 20 6c 61 73 74 20 6e 6f  ted, the last no
1af0: 6e 2d 66 72 65 65 20 70 61 67 65 20 6f 66 20 74  n-free page of t
1b00: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1b10: 20 69 73 20 0a 20 20 23 20 6d 6f 76 65 64 20 69   is .  # moved i
1b20: 6e 74 6f 20 61 20 66 72 65 65 20 73 70 61 63 65  nto a free space
1b30: 20 69 6e 20 74 68 65 20 62 6f 64 79 20 6f 66 20   in the body of 
1b40: 74 68 65 20 66 69 6c 65 2e 20 41 66 74 65 72 20  the file. After 
1b50: 64 6f 69 6e 67 20 73 6f 2c 0a 20 20 23 20 74 68  doing so,.  # th
1b60: 65 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65  e page reference
1b70: 20 69 6e 20 74 68 65 20 70 61 72 65 6e 74 20 70   in the parent p
1b80: 61 67 65 20 6d 75 73 74 20 62 65 20 75 70 64 61  age must be upda
1b90: 74 65 64 20 74 6f 20 72 65 66 65 72 0a 20 20 23  ted to refer.  #
1ba0: 20 74 6f 20 74 68 65 20 6e 65 77 20 6c 6f 63 61   to the new loca
1bb0: 74 69 6f 6e 2e 20 54 68 65 73 65 20 74 65 73 74  tion. These test
1bc0: 73 20 74 65 73 74 20 74 68 65 20 6f 75 74 63 6f  s test the outco
1bd0: 6d 65 20 6f 66 20 63 6f 72 72 75 70 74 69 6e 67  me of corrupting
1be0: 0a 20 20 23 20 74 68 61 74 20 70 61 67 65 20 72  .  # that page r
1bf0: 65 66 65 72 65 6e 63 65 20 62 65 66 6f 72 65 20  eference before 
1c00: 70 65 72 66 6f 72 6d 69 6e 67 20 74 68 65 20 69  performing the i
1c10: 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75  ncremental vacuu
1c20: 6d 2e 0a 20 20 23 0a 0a 20 20 23 20 54 68 65 20  m..  #..  # The 
1c30: 6c 61 73 74 20 70 61 67 65 20 69 6e 20 74 68 65  last page in the
1c40: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 69   database page i
1c50: 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61 67  s the second pag
1c60: 65 20 0a 20 20 23 20 69 6e 20 61 6e 20 6f 76 65  e .  # in an ove
1c70: 72 66 6c 6f 77 20 63 68 61 69 6e 2e 0a 20 20 23  rflow chain..  #
1c80: 0a 20 20 63 6f 72 72 75 70 74 69 6f 6e 5f 74 65  .  corruption_te
1c90: 73 74 20 2d 73 71 6c 70 72 65 70 20 7b 0a 20 20  st -sqlprep {.  
1ca0: 20 20 50 52 41 47 4d 41 20 61 75 74 6f 5f 76 61    PRAGMA auto_va
1cb0: 63 75 75 6d 20 3d 20 69 6e 63 72 65 6d 65 6e 74  cuum = increment
1cc0: 61 6c 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 70  al;.    PRAGMA p
1cd0: 61 67 65 5f 73 69 7a 65 20 3d 20 31 30 32 34 3b  age_size = 1024;
1ce0: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
1cf0: 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20  E t1(a, b);.    
1d00: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
1d10: 41 4c 55 45 53 28 31 2c 20 72 61 6e 64 6f 6d 62  ALUES(1, randomb
1d20: 6c 6f 62 28 32 35 30 30 29 29 3b 0a 20 20 20 20  lob(2500));.    
1d30: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
1d40: 41 4c 55 45 53 28 32 2c 20 72 61 6e 64 6f 6d 62  ALUES(2, randomb
1d50: 6c 6f 62 28 32 35 30 30 29 29 3b 0a 20 20 20 20  lob(2500));.    
1d60: 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 20 57  DELETE FROM t1 W
1d70: 48 45 52 45 20 61 20 3d 20 31 3b 0a 20 20 7d 20  HERE a = 1;.  } 
1d80: 2d 63 6f 72 72 75 70 74 20 7b 0a 20 20 20 20 68  -corrupt {.    h
1d90: 65 78 69 6f 5f 77 72 69 74 65 20 63 6f 72 72 75  exio_write corru
1da0: 70 74 2e 64 62 20 5b 65 78 70 72 20 31 30 32 34  pt.db [expr 1024
1db0: 2a 35 5d 20 30 30 30 30 30 30 30 38 0a 20 20 7d  *5] 00000008.  }
1dc0: 20 2d 74 65 73 74 20 7b 0a 20 20 20 20 64 6f 5f   -test {.    do_
1dd0: 74 65 73 74 20 63 6f 72 72 75 70 74 32 2d 36 2e  test corrupt2-6.
1de0: 31 20 7b 0a 20 20 20 20 20 20 63 61 74 63 68 73  1 {.      catchs
1df0: 71 6c 20 22 20 24 3a 3a 70 72 65 73 71 6c 20 70  ql " $::presql p
1e00: 72 61 67 6d 61 20 69 6e 63 72 65 6d 65 6e 74 61  ragma incrementa
1e10: 6c 5f 76 61 63 75 75 6d 20 3d 20 31 20 22 0a 20  l_vacuum = 1 ". 
1e20: 20 20 20 7d 20 7b 31 20 7b 64 61 74 61 62 61 73     } {1 {databas
1e30: 65 20 64 69 73 6b 20 69 6d 61 67 65 20 69 73 20  e disk image is 
1e40: 6d 61 6c 66 6f 72 6d 65 64 7d 7d 0a 20 20 7d 0a  malformed}}.  }.
1e50: 0a 20 20 23 20 54 68 65 20 6c 61 73 74 20 70 61  .  # The last pa
1e60: 67 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ge in the databa
1e70: 73 65 20 70 61 67 65 20 69 73 20 61 20 6e 6f 6e  se page is a non
1e80: 2d 72 6f 6f 74 20 62 2d 74 72 65 65 20 70 61 67  -root b-tree pag
1e90: 65 2e 0a 20 20 23 0a 20 20 63 6f 72 72 75 70 74  e..  #.  corrupt
1ea0: 69 6f 6e 5f 74 65 73 74 20 2d 73 71 6c 70 72 65  ion_test -sqlpre
1eb0: 70 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 61  p {.    PRAGMA a
1ec0: 75 74 6f 5f 76 61 63 75 75 6d 20 3d 20 69 6e 63  uto_vacuum = inc
1ed0: 72 65 6d 65 6e 74 61 6c 3b 0a 20 20 20 20 50 52  remental;.    PR
1ee0: 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d  AGMA page_size =
1ef0: 20 31 30 32 34 3b 0a 20 20 20 20 43 52 45 41 54   1024;.    CREAT
1f00: 45 20 54 41 42 4c 45 20 74 31 28 61 20 49 4e 54  E TABLE t1(a INT
1f10: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
1f20: 2c 20 62 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  , b);.    INSERT
1f30: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
1f40: 31 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 32 35  1, randomblob(25
1f50: 30 30 29 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  00));.    INSERT
1f60: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
1f70: 32 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 35 30  2, randomblob(50
1f80: 29 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ));.    INSERT I
1f90: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 4e 55  NTO t1 SELECT NU
1fa0: 4c 4c 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 35  LL, randomblob(5
1fb0: 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20  0) FROM t1;.    
1fc0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
1fd0: 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 72 61 6e 64  ELECT NULL, rand
1fe0: 6f 6d 62 6c 6f 62 28 35 30 29 20 46 52 4f 4d 20  omblob(50) FROM 
1ff0: 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  t1;.    INSERT I
2000: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 4e 55  NTO t1 SELECT NU
2010: 4c 4c 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 35  LL, randomblob(5
2020: 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20  0) FROM t1;.    
2030: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
2040: 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 72 61 6e 64  ELECT NULL, rand
2050: 6f 6d 62 6c 6f 62 28 35 30 29 20 46 52 4f 4d 20  omblob(50) FROM 
2060: 74 31 3b 0a 20 20 20 20 44 45 4c 45 54 45 20 46  t1;.    DELETE F
2070: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 20 3d  ROM t1 WHERE a =
2080: 20 31 3b 0a 20 20 7d 20 2d 63 6f 72 72 75 70 74   1;.  } -corrupt
2090: 20 7b 0a 20 20 20 20 68 65 78 69 6f 5f 77 72 69   {.    hexio_wri
20a0: 74 65 20 63 6f 72 72 75 70 74 2e 64 62 20 5b 65  te corrupt.db [e
20b0: 78 70 72 20 31 30 32 34 2a 32 20 2b 20 38 5d 20  xpr 1024*2 + 8] 
20c0: 30 30 30 30 30 30 30 39 0a 20 20 7d 20 2d 74 65  00000009.  } -te
20d0: 73 74 20 7b 0a 20 20 20 20 64 6f 5f 74 65 73 74  st {.    do_test
20e0: 20 63 6f 72 72 75 70 74 32 2d 36 2e 32 20 7b 0a   corrupt2-6.2 {.
20f0: 20 20 20 20 20 20 63 61 74 63 68 73 71 6c 20 22        catchsql "
2100: 20 24 3a 3a 70 72 65 73 71 6c 20 70 72 61 67 6d   $::presql pragm
2110: 61 20 69 6e 63 72 65 6d 65 6e 74 61 6c 5f 76 61  a incremental_va
2120: 63 75 75 6d 20 3d 20 31 20 22 0a 20 20 20 20 7d  cuum = 1 ".    }
2130: 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20 64 69   {1 {database di
2140: 73 6b 20 69 6d 61 67 65 20 69 73 20 6d 61 6c 66  sk image is malf
2150: 6f 72 6d 65 64 7d 7d 0a 20 20 7d 0a 0a 20 20 23  ormed}}.  }..  #
2160: 20 53 65 74 20 75 70 20 61 20 70 6f 69 6e 74 65   Set up a pointe
2170: 72 2d 6d 61 70 20 65 6e 74 72 79 20 73 6f 20 74  r-map entry so t
2180: 68 61 74 20 74 68 65 20 6c 61 73 74 20 70 61 67  hat the last pag
2190: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
21a0: 65 0a 20 20 23 20 66 69 6c 65 20 61 70 70 65 61  e.  # file appea
21b0: 72 73 20 74 6f 20 62 65 20 61 20 62 2d 74 72 65  rs to be a b-tre
21c0: 65 20 72 6f 6f 74 20 70 61 67 65 2e 20 54 68 69  e root page. Thi
21d0: 73 20 73 68 6f 75 6c 64 20 62 65 20 64 65 74 65  s should be dete
21e0: 63 74 65 64 0a 20 20 23 20 61 73 20 63 6f 72 72  cted.  # as corr
21f0: 75 70 74 69 6f 6e 2e 0a 20 20 23 0a 20 20 63 6f  uption..  #.  co
2200: 72 72 75 70 74 69 6f 6e 5f 74 65 73 74 20 2d 73  rruption_test -s
2210: 71 6c 70 72 65 70 20 7b 0a 20 20 20 20 50 52 41  qlprep {.    PRA
2220: 47 4d 41 20 61 75 74 6f 5f 76 61 63 75 75 6d 20  GMA auto_vacuum 
2230: 3d 20 69 6e 63 72 65 6d 65 6e 74 61 6c 3b 0a 20  = incremental;. 
2240: 20 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73     PRAGMA page_s
2250: 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20 20 20  ize = 1024;.    
2260: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
2270: 61 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  a INTEGER PRIMAR
2280: 59 20 4b 45 59 2c 20 62 29 3b 0a 20 20 20 20 49  Y KEY, b);.    I
2290: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
22a0: 4c 55 45 53 28 31 2c 20 72 61 6e 64 6f 6d 62 6c  LUES(1, randombl
22b0: 6f 62 28 32 35 30 30 29 29 3b 0a 20 20 20 20 49  ob(2500));.    I
22c0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
22d0: 4c 55 45 53 28 32 2c 20 72 61 6e 64 6f 6d 62 6c  LUES(2, randombl
22e0: 6f 62 28 32 35 30 30 29 29 3b 0a 20 20 20 20 49  ob(2500));.    I
22f0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
2300: 4c 55 45 53 28 33 2c 20 72 61 6e 64 6f 6d 62 6c  LUES(3, randombl
2310: 6f 62 28 32 35 30 30 29 29 3b 0a 20 20 20 20 44  ob(2500));.    D
2320: 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 20 57 48  ELETE FROM t1 WH
2330: 45 52 45 20 61 20 3d 20 31 3b 0a 20 20 7d 20 2d  ERE a = 1;.  } -
2340: 63 6f 72 72 75 70 74 20 7b 0a 20 20 20 20 73 65  corrupt {.    se
2350: 74 20 6e 50 61 67 65 20 5b 65 78 70 72 20 5b 66  t nPage [expr [f
2360: 69 6c 65 20 73 69 7a 65 20 63 6f 72 72 75 70 74  ile size corrupt
2370: 2e 64 62 5d 20 2f 20 31 30 32 34 5d 0a 20 20 20  .db] / 1024].   
2380: 20 68 65 78 69 6f 5f 77 72 69 74 65 20 63 6f 72   hexio_write cor
2390: 72 75 70 74 2e 64 62 20 5b 65 78 70 72 20 31 30  rupt.db [expr 10
23a0: 32 34 20 2b 20 28 24 6e 50 61 67 65 2d 33 29 2a  24 + ($nPage-3)*
23b0: 35 5d 20 30 31 30 30 30 30 30 30 30 0a 20 20 7d  5] 010000000.  }
23c0: 20 2d 74 65 73 74 20 7b 0a 20 20 20 20 64 6f 5f   -test {.    do_
23d0: 74 65 73 74 20 63 6f 72 72 75 70 74 32 2d 36 2e  test corrupt2-6.
23e0: 33 20 7b 0a 20 20 20 20 20 20 63 61 74 63 68 73  3 {.      catchs
23f0: 71 6c 20 22 20 24 3a 3a 70 72 65 73 71 6c 20 70  ql " $::presql p
2400: 72 61 67 6d 61 20 69 6e 63 72 65 6d 65 6e 74 61  ragma incrementa
2410: 6c 5f 76 61 63 75 75 6d 20 3d 20 31 20 22 0a 20  l_vacuum = 1 ". 
2420: 20 20 20 7d 20 7b 31 20 7b 64 61 74 61 62 61 73     } {1 {databas
2430: 65 20 64 69 73 6b 20 69 6d 61 67 65 20 69 73 20  e disk image is 
2440: 6d 61 6c 66 6f 72 6d 65 64 7d 7d 0a 20 20 7d 0a  malformed}}.  }.
2450: 0a 20 20 63 6f 72 72 75 70 74 69 6f 6e 5f 74 65  .  corruption_te
2460: 73 74 20 2d 73 71 6c 70 72 65 70 20 7b 0a 20 20  st -sqlprep {.  
2470: 20 20 50 52 41 47 4d 41 20 61 75 74 6f 5f 76 61    PRAGMA auto_va
2480: 63 75 75 6d 20 3d 20 31 3b 0a 20 20 20 20 50 52  cuum = 1;.    PR
2490: 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d  AGMA page_size =
24a0: 20 31 30 32 34 3b 0a 20 20 20 20 43 52 45 41 54   1024;.    CREAT
24b0: 45 20 54 41 42 4c 45 20 74 31 28 61 20 49 4e 54  E TABLE t1(a INT
24c0: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
24d0: 2c 20 62 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  , b);.    INSERT
24e0: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
24f0: 31 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 32 35  1, randomblob(25
2500: 30 30 29 29 3b 0a 20 20 20 20 44 45 4c 45 54 45  00));.    DELETE
2510: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61   FROM t1 WHERE a
2520: 20 3d 20 31 3b 0a 20 20 7d 20 2d 63 6f 72 72 75   = 1;.  } -corru
2530: 70 74 20 7b 0a 20 20 20 20 73 65 74 20 6e 41 70  pt {.    set nAp
2540: 70 65 6e 64 20 5b 65 78 70 72 20 31 30 32 34 2a  pend [expr 1024*
2550: 32 30 37 20 2d 20 5b 66 69 6c 65 20 73 69 7a 65  207 - [file size
2560: 20 63 6f 72 72 75 70 74 2e 64 62 5d 5d 0a 20 20   corrupt.db]].  
2570: 20 20 73 65 74 20 66 64 20 5b 6f 70 65 6e 20 63    set fd [open c
2580: 6f 72 72 75 70 74 2e 64 62 20 72 2b 5d 0a 20 20  orrupt.db r+].  
2590: 20 20 73 65 65 6b 20 24 66 64 20 30 20 65 6e 64    seek $fd 0 end
25a0: 0a 20 20 20 20 70 75 74 73 20 2d 6e 6f 6e 65 77  .    puts -nonew
25b0: 6c 69 6e 65 20 24 66 64 20 5b 73 74 72 69 6e 67  line $fd [string
25c0: 20 72 65 70 65 61 74 20 78 20 24 6e 41 70 70 65   repeat x $nAppe
25d0: 6e 64 5d 0a 20 20 20 20 63 6c 6f 73 65 20 24 66  nd].    close $f
25e0: 64 0a 20 20 20 20 68 65 78 69 6f 5f 77 72 69 74  d.    hexio_writ
25f0: 65 20 63 6f 72 72 75 70 74 2e 64 62 20 32 38 20  e corrupt.db 28 
2600: 30 30 30 30 30 30 30 30 0a 20 20 7d 20 2d 74 65  00000000.  } -te
2610: 73 74 20 7b 0a 20 20 20 20 64 6f 5f 74 65 73 74  st {.    do_test
2620: 20 63 6f 72 72 75 70 74 32 2d 36 2e 34 20 7b 0a   corrupt2-6.4 {.
2630: 20 20 20 20 20 20 63 61 74 63 68 73 71 6c 20 22        catchsql "
2640: 20 0a 20 20 20 20 20 20 20 20 24 3a 3a 70 72 65   .        $::pre
2650: 73 71 6c 20 0a 20 20 20 20 20 20 20 20 42 45 47  sql .        BEG
2660: 49 4e 20 45 58 43 4c 55 53 49 56 45 3b 0a 20 20  IN EXCLUSIVE;.  
2670: 20 20 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20        COMMIT;.  
2680: 20 20 20 20 22 0a 20 20 20 20 7d 20 7b 31 20 7b      ".    } {1 {
2690: 64 61 74 61 62 61 73 65 20 64 69 73 6b 20 69 6d  database disk im
26a0: 61 67 65 20 69 73 20 6d 61 6c 66 6f 72 6d 65 64  age is malformed
26b0: 7d 7d 0a 20 20 7d 0a 7d 0a 0a 0a 73 65 74 20 73  }}.  }.}...set s
26c0: 71 6c 70 72 65 70 20 7b 0a 20 20 50 52 41 47 4d  qlprep {.  PRAGM
26d0: 41 20 61 75 74 6f 5f 76 61 63 75 75 6d 20 3d 20  A auto_vacuum = 
26e0: 30 3b 0a 20 20 50 52 41 47 4d 41 20 70 61 67 65  0;.  PRAGMA page
26f0: 5f 73 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20  _size = 1024;.  
2700: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
2710: 61 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  a INTEGER PRIMAR
2720: 59 20 4b 45 59 2c 20 62 29 3b 0a 20 20 43 52 45  Y KEY, b);.  CRE
2730: 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20  ATE INDEX i1 ON 
2740: 74 31 28 62 29 3b 0a 20 20 49 4e 53 45 52 54 20  t1(b);.  INSERT 
2750: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31  INTO t1 VALUES(1
2760: 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 35 30 29  , randomblob(50)
2770: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
2780: 20 74 31 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c   t1 SELECT NULL,
2790: 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 35 30 29 20   randomblob(50) 
27a0: 46 52 4f 4d 20 74 31 3b 0a 20 20 49 4e 53 45 52  FROM t1;.  INSER
27b0: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
27c0: 20 4e 55 4c 4c 2c 20 72 61 6e 64 6f 6d 62 6c 6f   NULL, randomblo
27d0: 62 28 35 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20  b(50) FROM t1;. 
27e0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
27f0: 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 72 61 6e  SELECT NULL, ran
2800: 64 6f 6d 62 6c 6f 62 28 35 30 29 20 46 52 4f 4d  domblob(50) FROM
2810: 20 74 31 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e   t1;.  INSERT IN
2820: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 4e 55 4c  TO t1 SELECT NUL
2830: 4c 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 35 30  L, randomblob(50
2840: 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 49 4e 53  ) FROM t1;.  INS
2850: 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
2860: 43 54 20 4e 55 4c 4c 2c 20 72 61 6e 64 6f 6d 62  CT NULL, randomb
2870: 6c 6f 62 28 35 30 29 20 46 52 4f 4d 20 74 31 3b  lob(50) FROM t1;
2880: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  .  INSERT INTO t
2890: 31 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 72  1 SELECT NULL, r
28a0: 61 6e 64 6f 6d 62 6c 6f 62 28 35 30 29 20 46 52  andomblob(50) FR
28b0: 4f 4d 20 74 31 3b 0a 7d 0a 0a 63 6f 72 72 75 70  OM t1;.}..corrup
28c0: 74 69 6f 6e 5f 74 65 73 74 20 2d 73 71 6c 70 72  tion_test -sqlpr
28d0: 65 70 20 24 73 71 6c 70 72 65 70 20 2d 63 6f 72  ep $sqlprep -cor
28e0: 72 75 70 74 20 7b 0a 20 20 23 20 53 65 74 20 74  rupt {.  # Set t
28f0: 68 65 20 70 61 67 65 2d 66 6c 61 67 73 20 6f 66  he page-flags of
2900: 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 65 61 66   one of the leaf
2910: 20 70 61 67 65 73 20 6f 66 20 74 68 65 20 69 6e   pages of the in
2920: 64 65 78 20 42 2d 54 72 65 65 20 74 6f 0a 20 20  dex B-Tree to.  
2930: 23 20 30 78 30 44 20 28 69 6e 74 65 72 70 72 65  # 0x0D (interpre
2940: 74 65 64 20 62 79 20 53 51 4c 69 74 65 20 61 73  ted by SQLite as
2950: 20 22 6c 65 61 66 20 70 61 67 65 20 6f 66 20 61   "leaf page of a
2960: 20 74 61 62 6c 65 20 42 2d 54 72 65 65 22 29 2e   table B-Tree").
2970: 0a 20 20 23 0a 20 20 73 65 74 20 66 64 20 5b 6f  .  #.  set fd [o
2980: 70 65 6e 20 63 6f 72 72 75 70 74 2e 64 62 20 72  pen corrupt.db r
2990: 2b 5d 0a 20 20 66 63 6f 6e 66 69 67 75 72 65 20  +].  fconfigure 
29a0: 24 66 64 20 2d 74 72 61 6e 73 6c 61 74 69 6f 6e  $fd -translation
29b0: 20 62 69 6e 61 72 79 20 2d 65 6e 63 6f 64 69 6e   binary -encodin
29c0: 67 20 62 69 6e 61 72 79 0a 20 20 73 65 65 6b 20  g binary.  seek 
29d0: 24 66 64 20 5b 65 78 70 72 20 31 30 32 34 2a 32  $fd [expr 1024*2
29e0: 20 2b 20 38 5d 20 0a 20 20 73 65 74 20 7a 52 69   + 8] .  set zRi
29f0: 67 68 74 43 68 69 6c 64 20 5b 72 65 61 64 20 24  ghtChild [read $
2a00: 66 64 20 34 5d 0a 20 20 62 69 6e 61 72 79 20 73  fd 4].  binary s
2a10: 63 61 6e 20 24 7a 52 69 67 68 74 43 68 69 6c 64  can $zRightChild
2a20: 20 49 20 69 52 69 67 68 74 43 68 69 6c 64 0a 20   I iRightChild. 
2a30: 20 73 65 65 6b 20 24 66 64 20 5b 65 78 70 72 20   seek $fd [expr 
2a40: 31 30 32 34 2a 28 24 69 52 69 67 68 74 43 68 69  1024*($iRightChi
2a50: 6c 64 2d 31 29 5d 0a 20 20 70 75 74 73 20 2d 6e  ld-1)].  puts -n
2a60: 6f 6e 65 77 6c 69 6e 65 20 24 66 64 20 22 5c 78  onewline $fd "\x
2a70: 30 44 22 0a 20 20 63 6c 6f 73 65 20 24 66 64 0a  0D".  close $fd.
2a80: 7d 20 2d 74 65 73 74 20 7b 0a 20 20 64 6f 5f 74  } -test {.  do_t
2a90: 65 73 74 20 63 6f 72 72 75 70 74 32 2d 37 2e 31  est corrupt2-7.1
2aa0: 20 7b 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20   {.    catchsql 
2ab0: 22 20 24 3a 3a 70 72 65 73 71 6c 20 53 45 4c 45  " $::presql SELE
2ac0: 43 54 20 62 20 46 52 4f 4d 20 74 31 20 4f 52 44  CT b FROM t1 ORD
2ad0: 45 52 20 42 59 20 62 20 41 53 43 20 22 0a 20 20  ER BY b ASC ".  
2ae0: 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20 64  } {1 {database d
2af0: 69 73 6b 20 69 6d 61 67 65 20 69 73 20 6d 61 6c  isk image is mal
2b00: 66 6f 72 6d 65 64 7d 7d 0a 7d 0a 0a 63 6f 72 72  formed}}.}..corr
2b10: 75 70 74 69 6f 6e 5f 74 65 73 74 20 2d 73 71 6c  uption_test -sql
2b20: 70 72 65 70 20 24 73 71 6c 70 72 65 70 20 2d 63  prep $sqlprep -c
2b30: 6f 72 72 75 70 74 20 7b 0a 20 20 23 20 4d 65 73  orrupt {.  # Mes
2b40: 73 20 75 70 20 74 68 65 20 70 61 67 65 2d 68 65  s up the page-he
2b50: 61 64 65 72 20 6f 66 20 6f 6e 65 20 6f 66 20 74  ader of one of t
2b60: 68 65 20 6c 65 61 66 20 70 61 67 65 73 20 6f 66  he leaf pages of
2b70: 20 74 68 65 20 69 6e 64 65 78 20 42 2d 54 72 65   the index B-Tre
2b80: 65 2e 0a 20 20 23 20 54 68 65 20 63 6f 72 72 75  e..  # The corru
2b90: 70 74 69 6f 6e 20 69 73 20 64 65 74 65 63 74 65  ption is detecte
2ba0: 64 20 61 73 20 70 61 72 74 20 6f 66 20 61 6e 20  d as part of an 
2bb0: 4f 50 5f 50 72 65 76 20 6f 70 63 6f 64 65 2e 0a  OP_Prev opcode..
2bc0: 20 20 23 0a 20 20 73 65 74 20 66 64 20 5b 6f 70    #.  set fd [op
2bd0: 65 6e 20 63 6f 72 72 75 70 74 2e 64 62 20 72 2b  en corrupt.db r+
2be0: 5d 0a 20 20 66 63 6f 6e 66 69 67 75 72 65 20 24  ].  fconfigure $
2bf0: 66 64 20 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 20  fd -translation 
2c00: 62 69 6e 61 72 79 20 2d 65 6e 63 6f 64 69 6e 67  binary -encoding
2c10: 20 62 69 6e 61 72 79 0a 20 20 73 65 65 6b 20 24   binary.  seek $
2c20: 66 64 20 5b 65 78 70 72 20 31 30 32 34 2a 32 20  fd [expr 1024*2 
2c30: 2b 20 31 32 5d 20 0a 20 20 73 65 74 20 7a 43 65  + 12] .  set zCe
2c40: 6c 6c 4f 66 66 73 65 74 20 5b 72 65 61 64 20 24  llOffset [read $
2c50: 66 64 20 32 5d 0a 20 20 62 69 6e 61 72 79 20 73  fd 2].  binary s
2c60: 63 61 6e 20 24 7a 43 65 6c 6c 4f 66 66 73 65 74  can $zCellOffset
2c70: 20 53 20 69 43 65 6c 6c 4f 66 66 73 65 74 0a 20   S iCellOffset. 
2c80: 20 73 65 65 6b 20 24 66 64 20 5b 65 78 70 72 20   seek $fd [expr 
2c90: 31 30 32 34 2a 32 20 2b 20 24 69 43 65 6c 6c 4f  1024*2 + $iCellO
2ca0: 66 66 73 65 74 5d 0a 20 20 73 65 74 20 7a 43 68  ffset].  set zCh
2cb0: 69 6c 64 20 5b 72 65 61 64 20 24 66 64 20 34 5d  ild [read $fd 4]
2cc0: 0a 20 20 62 69 6e 61 72 79 20 73 63 61 6e 20 24  .  binary scan $
2cd0: 7a 43 68 69 6c 64 20 49 20 69 43 68 69 6c 64 0a  zChild I iChild.
2ce0: 20 20 73 65 65 6b 20 24 66 64 20 5b 65 78 70 72    seek $fd [expr
2cf0: 20 31 30 32 34 2a 28 24 69 43 68 69 6c 64 2d 31   1024*($iChild-1
2d00: 29 2b 33 5d 0a 20 20 70 75 74 73 20 2d 6e 6f 6e  )+3].  puts -non
2d10: 65 77 6c 69 6e 65 20 24 66 64 20 22 5c 78 46 46  ewline $fd "\xFF
2d20: 46 46 22 0a 20 20 63 6c 6f 73 65 20 24 66 64 0a  FF".  close $fd.
2d30: 7d 20 2d 74 65 73 74 20 7b 0a 20 20 64 6f 5f 74  } -test {.  do_t
2d40: 65 73 74 20 63 6f 72 72 75 70 74 32 2d 37 2e 31  est corrupt2-7.1
2d50: 20 7b 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20   {.    catchsql 
2d60: 22 20 24 3a 3a 70 72 65 73 71 6c 20 53 45 4c 45  " $::presql SELE
2d70: 43 54 20 62 20 46 52 4f 4d 20 74 31 20 4f 52 44  CT b FROM t1 ORD
2d80: 45 52 20 42 59 20 62 20 44 45 53 43 20 22 0a 20  ER BY b DESC ". 
2d90: 20 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20   } {1 {database 
2da0: 64 69 73 6b 20 69 6d 61 67 65 20 69 73 20 6d 61  disk image is ma
2db0: 6c 66 6f 72 6d 65 64 7d 7d 0a 7d 0a 0a 63 6f 72  lformed}}.}..cor
2dc0: 72 75 70 74 69 6f 6e 5f 74 65 73 74 20 2d 73 71  ruption_test -sq
2dd0: 6c 70 72 65 70 20 24 73 71 6c 70 72 65 70 20 2d  lprep $sqlprep -
2de0: 63 6f 72 72 75 70 74 20 7b 0a 20 20 23 20 53 65  corrupt {.  # Se
2df0: 74 20 74 68 65 20 70 61 67 65 2d 66 6c 61 67 73  t the page-flags
2e00: 20 6f 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c   of one of the l
2e10: 65 61 66 20 70 61 67 65 73 20 6f 66 20 74 68 65  eaf pages of the
2e20: 20 74 61 62 6c 65 20 42 2d 54 72 65 65 20 74 6f   table B-Tree to
2e30: 0a 20 20 23 20 30 78 30 41 20 28 69 6e 74 65 72  .  # 0x0A (inter
2e40: 70 72 65 74 65 64 20 62 79 20 53 51 4c 69 74 65  preted by SQLite
2e50: 20 61 73 20 22 6c 65 61 66 20 70 61 67 65 20 6f   as "leaf page o
2e60: 66 20 61 6e 20 69 6e 64 65 78 20 42 2d 54 72 65  f an index B-Tre
2e70: 65 22 29 2e 0a 20 20 23 0a 20 20 73 65 74 20 66  e")..  #.  set f
2e80: 64 20 5b 6f 70 65 6e 20 63 6f 72 72 75 70 74 2e  d [open corrupt.
2e90: 64 62 20 72 2b 5d 0a 20 20 66 63 6f 6e 66 69 67  db r+].  fconfig
2ea0: 75 72 65 20 24 66 64 20 2d 74 72 61 6e 73 6c 61  ure $fd -transla
2eb0: 74 69 6f 6e 20 62 69 6e 61 72 79 20 2d 65 6e 63  tion binary -enc
2ec0: 6f 64 69 6e 67 20 62 69 6e 61 72 79 0a 20 20 73  oding binary.  s
2ed0: 65 65 6b 20 24 66 64 20 5b 65 78 70 72 20 31 30  eek $fd [expr 10
2ee0: 32 34 2a 31 20 2b 20 38 5d 20 0a 20 20 73 65 74  24*1 + 8] .  set
2ef0: 20 7a 52 69 67 68 74 43 68 69 6c 64 20 5b 72 65   zRightChild [re
2f00: 61 64 20 24 66 64 20 34 5d 0a 20 20 62 69 6e 61  ad $fd 4].  bina
2f10: 72 79 20 73 63 61 6e 20 24 7a 52 69 67 68 74 43  ry scan $zRightC
2f20: 68 69 6c 64 20 49 20 69 52 69 67 68 74 43 68 69  hild I iRightChi
2f30: 6c 64 0a 20 20 73 65 65 6b 20 24 66 64 20 5b 65  ld.  seek $fd [e
2f40: 78 70 72 20 31 30 32 34 2a 28 24 69 52 69 67 68  xpr 1024*($iRigh
2f50: 74 43 68 69 6c 64 2d 31 29 5d 0a 20 20 70 75 74  tChild-1)].  put
2f60: 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 24 66 64  s -nonewline $fd
2f70: 20 22 5c 78 30 41 22 0a 20 20 63 6c 6f 73 65 20   "\x0A".  close 
2f80: 24 66 64 0a 7d 20 2d 74 65 73 74 20 7b 0a 20 20  $fd.} -test {.  
2f90: 64 6f 5f 74 65 73 74 20 63 6f 72 72 75 70 74 32  do_test corrupt2
2fa0: 2d 38 2e 31 20 7b 0a 20 20 20 20 63 61 74 63 68  -8.1 {.    catch
2fb0: 73 71 6c 20 22 20 24 3a 3a 70 72 65 73 71 6c 20  sql " $::presql 
2fc0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
2fd0: 20 57 48 45 52 45 20 72 6f 77 69 64 3d 31 30 30   WHERE rowid=100
2fe0: 30 20 22 0a 20 20 7d 20 7b 31 20 7b 64 61 74 61  0 ".  } {1 {data
2ff0: 62 61 73 65 20 64 69 73 6b 20 69 6d 61 67 65 20  base disk image 
3000: 69 73 20 6d 61 6c 66 6f 72 6d 65 64 7d 7d 0a 7d  is malformed}}.}
3010: 0a 0a 63 6f 72 72 75 70 74 69 6f 6e 5f 74 65 73  ..corruption_tes
3020: 74 20 2d 73 71 6c 70 72 65 70 20 7b 0a 20 20 43  t -sqlprep {.  C
3030: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61  REATE TABLE t1(a
3040: 2c 20 62 2c 20 63 29 3b 20 43 52 45 41 54 45 20  , b, c); CREATE 
3050: 54 41 42 4c 45 20 74 38 28 61 2c 20 62 2c 20 63  TABLE t8(a, b, c
3060: 29 3b 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  ); CREATE TABLE 
3070: 74 45 28 61 2c 20 62 2c 20 63 29 3b 0a 20 20 43  tE(a, b, c);.  C
3080: 52 45 41 54 45 20 54 41 42 4c 45 20 74 32 28 61  REATE TABLE t2(a
3090: 2c 20 62 2c 20 63 29 3b 20 43 52 45 41 54 45 20  , b, c); CREATE 
30a0: 54 41 42 4c 45 20 74 39 28 61 2c 20 62 2c 20 63  TABLE t9(a, b, c
30b0: 29 3b 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  ); CREATE TABLE 
30c0: 74 46 28 61 2c 20 62 2c 20 63 29 3b 0a 20 20 43  tF(a, b, c);.  C
30d0: 52 45 41 54 45 20 54 41 42 4c 45 20 74 33 28 61  REATE TABLE t3(a
30e0: 2c 20 62 2c 20 63 29 3b 20 43 52 45 41 54 45 20  , b, c); CREATE 
30f0: 54 41 42 4c 45 20 74 41 28 61 2c 20 62 2c 20 63  TABLE tA(a, b, c
3100: 29 3b 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  ); CREATE TABLE 
3110: 74 47 28 61 2c 20 62 2c 20 63 29 3b 0a 20 20 43  tG(a, b, c);.  C
3120: 52 45 41 54 45 20 54 41 42 4c 45 20 74 34 28 61  REATE TABLE t4(a
3130: 2c 20 62 2c 20 63 29 3b 20 43 52 45 41 54 45 20  , b, c); CREATE 
3140: 54 41 42 4c 45 20 74 42 28 61 2c 20 62 2c 20 63  TABLE tB(a, b, c
3150: 29 3b 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  ); CREATE TABLE 
3160: 74 48 28 61 2c 20 62 2c 20 63 29 3b 0a 20 20 43  tH(a, b, c);.  C
3170: 52 45 41 54 45 20 54 41 42 4c 45 20 74 35 28 61  REATE TABLE t5(a
3180: 2c 20 62 2c 20 63 29 3b 20 43 52 45 41 54 45 20  , b, c); CREATE 
3190: 54 41 42 4c 45 20 74 43 28 61 2c 20 62 2c 20 63  TABLE tC(a, b, c
31a0: 29 3b 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  ); CREATE TABLE 
31b0: 74 49 28 61 2c 20 62 2c 20 63 29 3b 0a 20 20 43  tI(a, b, c);.  C
31c0: 52 45 41 54 45 20 54 41 42 4c 45 20 74 36 28 61  REATE TABLE t6(a
31d0: 2c 20 62 2c 20 63 29 3b 20 43 52 45 41 54 45 20  , b, c); CREATE 
31e0: 54 41 42 4c 45 20 74 44 28 61 2c 20 62 2c 20 63  TABLE tD(a, b, c
31f0: 29 3b 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  ); CREATE TABLE 
3200: 74 4a 28 61 2c 20 62 2c 20 63 29 3b 0a 20 20 43  tJ(a, b, c);.  C
3210: 52 45 41 54 45 20 54 41 42 4c 45 20 78 31 28 61  REATE TABLE x1(a
3220: 2c 20 62 2c 20 63 29 3b 20 43 52 45 41 54 45 20  , b, c); CREATE 
3230: 54 41 42 4c 45 20 78 38 28 61 2c 20 62 2c 20 63  TABLE x8(a, b, c
3240: 29 3b 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  ); CREATE TABLE 
3250: 78 45 28 61 2c 20 62 2c 20 63 29 3b 0a 20 20 43  xE(a, b, c);.  C
3260: 52 45 41 54 45 20 54 41 42 4c 45 20 78 32 28 61  REATE TABLE x2(a
3270: 2c 20 62 2c 20 63 29 3b 20 43 52 45 41 54 45 20  , b, c); CREATE 
3280: 54 41 42 4c 45 20 78 39 28 61 2c 20 62 2c 20 63  TABLE x9(a, b, c
3290: 29 3b 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  ); CREATE TABLE 
32a0: 78 46 28 61 2c 20 62 2c 20 63 29 3b 0a 20 20 43  xF(a, b, c);.  C
32b0: 52 45 41 54 45 20 54 41 42 4c 45 20 78 33 28 61  REATE TABLE x3(a
32c0: 2c 20 62 2c 20 63 29 3b 20 43 52 45 41 54 45 20  , b, c); CREATE 
32d0: 54 41 42 4c 45 20 78 41 28 61 2c 20 62 2c 20 63  TABLE xA(a, b, c
32e0: 29 3b 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  ); CREATE TABLE 
32f0: 78 47 28 61 2c 20 62 2c 20 63 29 3b 0a 20 20 43  xG(a, b, c);.  C
3300: 52 45 41 54 45 20 54 41 42 4c 45 20 78 34 28 61  REATE TABLE x4(a
3310: 2c 20 62 2c 20 63 29 3b 20 43 52 45 41 54 45 20  , b, c); CREATE 
3320: 54 41 42 4c 45 20 78 42 28 61 2c 20 62 2c 20 63  TABLE xB(a, b, c
3330: 29 3b 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  ); CREATE TABLE 
3340: 78 48 28 61 2c 20 62 2c 20 63 29 3b 0a 20 20 43  xH(a, b, c);.  C
3350: 52 45 41 54 45 20 54 41 42 4c 45 20 78 35 28 61  REATE TABLE x5(a
3360: 2c 20 62 2c 20 63 29 3b 20 43 52 45 41 54 45 20  , b, c); CREATE 
3370: 54 41 42 4c 45 20 78 43 28 61 2c 20 62 2c 20 63  TABLE xC(a, b, c
3380: 29 3b 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  ); CREATE TABLE 
3390: 78 49 28 61 2c 20 62 2c 20 63 29 3b 0a 20 20 43  xI(a, b, c);.  C
33a0: 52 45 41 54 45 20 54 41 42 4c 45 20 78 36 28 61  REATE TABLE x6(a
33b0: 2c 20 62 2c 20 63 29 3b 20 43 52 45 41 54 45 20  , b, c); CREATE 
33c0: 54 41 42 4c 45 20 78 44 28 61 2c 20 62 2c 20 63  TABLE xD(a, b, c
33d0: 29 3b 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  ); CREATE TABLE 
33e0: 78 4a 28 61 2c 20 62 2c 20 63 29 3b 0a 7d 20 2d  xJ(a, b, c);.} -
33f0: 63 6f 72 72 75 70 74 20 7b 0a 20 20 73 65 74 20  corrupt {.  set 
3400: 66 64 20 5b 6f 70 65 6e 20 63 6f 72 72 75 70 74  fd [open corrupt
3410: 2e 64 62 20 72 2b 5d 0a 20 20 66 63 6f 6e 66 69  .db r+].  fconfi
3420: 67 75 72 65 20 24 66 64 20 2d 74 72 61 6e 73 6c  gure $fd -transl
3430: 61 74 69 6f 6e 20 62 69 6e 61 72 79 20 2d 65 6e  ation binary -en
3440: 63 6f 64 69 6e 67 20 62 69 6e 61 72 79 0a 20 20  coding binary.  
3450: 73 65 65 6b 20 24 66 64 20 31 30 38 0a 20 20 73  seek $fd 108.  s
3460: 65 74 20 7a 52 69 67 68 74 43 68 69 6c 64 20 5b  et zRightChild [
3470: 72 65 61 64 20 24 66 64 20 34 5d 0a 20 20 62 69  read $fd 4].  bi
3480: 6e 61 72 79 20 73 63 61 6e 20 24 7a 52 69 67 68  nary scan $zRigh
3490: 74 43 68 69 6c 64 20 49 20 69 52 69 67 68 74 43  tChild I iRightC
34a0: 68 69 6c 64 0a 20 20 73 65 65 6b 20 24 66 64 20  hild.  seek $fd 
34b0: 5b 65 78 70 72 20 31 30 32 34 2a 28 24 69 52 69  [expr 1024*($iRi
34c0: 67 68 74 43 68 69 6c 64 2d 31 29 2b 33 5d 0a 20  ghtChild-1)+3]. 
34d0: 20 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65   puts -nonewline
34e0: 20 24 66 64 20 22 5c 78 30 30 5c 78 30 30 22 0a   $fd "\x00\x00".
34f0: 20 20 63 6c 6f 73 65 20 24 66 64 0a 7d 20 2d 74    close $fd.} -t
3500: 65 73 74 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20  est {.  do_test 
3510: 63 6f 72 72 75 70 74 32 2d 39 2e 31 20 7b 0a 20  corrupt2-9.1 {. 
3520: 20 20 20 63 61 74 63 68 73 71 6c 20 22 20 24 3a     catchsql " $:
3530: 3a 70 72 65 73 71 6c 20 53 45 4c 45 43 54 20 73  :presql SELECT s
3540: 71 6c 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d  ql FROM sqlite_m
3550: 61 73 74 65 72 20 22 0a 20 20 7d 20 7b 31 20 7b  aster ".  } {1 {
3560: 64 61 74 61 62 61 73 65 20 64 69 73 6b 20 69 6d  database disk im
3570: 61 67 65 20 69 73 20 6d 61 6c 66 6f 72 6d 65 64  age is malformed
3580: 7d 7d 0a 7d 0a 0a 63 6f 72 72 75 70 74 69 6f 6e  }}.}..corruption
3590: 5f 74 65 73 74 20 2d 73 71 6c 70 72 65 70 20 7b  _test -sqlprep {
35a0: 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  .  CREATE TABLE 
35b0: 74 31 28 61 2c 20 62 2c 20 63 29 3b 0a 20 20 43  t1(a, b, c);.  C
35c0: 52 45 41 54 45 20 54 41 42 4c 45 20 74 32 28 61  REATE TABLE t2(a
35d0: 2c 20 62 2c 20 63 29 3b 0a 20 20 50 52 41 47 4d  , b, c);.  PRAGM
35e0: 41 20 77 72 69 74 61 62 6c 65 5f 73 63 68 65 6d  A writable_schem
35f0: 61 20 3d 20 31 3b 0a 20 20 55 50 44 41 54 45 20  a = 1;.  UPDATE 
3600: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 53 45  sqlite_master SE
3610: 54 20 72 6f 6f 74 70 61 67 65 20 3d 20 4e 55 4c  T rootpage = NUL
3620: 4c 20 57 48 45 52 45 20 6e 61 6d 65 20 3d 20 27  L WHERE name = '
3630: 74 32 27 3b 0a 7d 20 2d 74 65 73 74 20 7b 0a 20  t2';.} -test {. 
3640: 20 64 6f 5f 74 65 73 74 20 63 6f 72 72 75 70 74   do_test corrupt
3650: 32 2d 31 30 2e 31 20 7b 0a 20 20 20 20 63 61 74  2-10.1 {.    cat
3660: 63 68 73 71 6c 20 22 20 24 3a 3a 70 72 65 73 71  chsql " $::presq
3670: 6c 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  l SELECT * FROM 
3680: 74 32 20 22 0a 20 20 7d 20 7b 31 20 7b 6d 61 6c  t2 ".  } {1 {mal
3690: 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65 20  formed database 
36a0: 73 63 68 65 6d 61 20 28 74 32 29 7d 7d 0a 20 20  schema (t2)}}.  
36b0: 64 6f 5f 74 65 73 74 20 63 6f 72 72 75 70 74 32  do_test corrupt2
36c0: 2d 31 30 2e 32 20 7b 0a 20 20 20 20 73 71 6c 69  -10.2 {.    sqli
36d0: 74 65 33 5f 65 72 72 63 6f 64 65 20 64 62 0a 20  te3_errcode db. 
36e0: 20 7d 20 7b 53 51 4c 49 54 45 5f 43 4f 52 52 55   } {SQLITE_CORRU
36f0: 50 54 7d 0a 7d 0a 0a 63 6f 72 72 75 70 74 69 6f  PT}.}..corruptio
3700: 6e 5f 74 65 73 74 20 2d 73 71 6c 70 72 65 70 20  n_test -sqlprep 
3710: 7b 0a 20 20 50 52 41 47 4d 41 20 61 75 74 6f 5f  {.  PRAGMA auto_
3720: 76 61 63 75 75 6d 20 3d 20 69 6e 63 72 65 6d 65  vacuum = increme
3730: 6e 74 61 6c 3b 0a 20 20 43 52 45 41 54 45 20 54  ntal;.  CREATE T
3740: 41 42 4c 45 20 74 31 28 61 20 49 4e 54 45 47 45  ABLE t1(a INTEGE
3750: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62  R PRIMARY KEY, b
3760: 29 3b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c  );.  CREATE TABL
3770: 45 20 74 32 28 61 20 49 4e 54 45 47 45 52 20 50  E t2(a INTEGER P
3780: 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 29 3b 0a  RIMARY KEY, b);.
3790: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
37a0: 20 56 41 4c 55 45 53 28 31 2c 20 72 61 6e 64 73   VALUES(1, rands
37b0: 74 72 28 31 30 30 2c 31 30 30 29 29 3b 0a 20 20  tr(100,100));.  
37c0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
37d0: 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 72 61 6e 64  ELECT NULL, rand
37e0: 73 74 72 28 31 30 30 2c 31 30 30 29 20 46 52 4f  str(100,100) FRO
37f0: 4d 20 74 31 3b 0a 20 20 49 4e 53 45 52 54 20 49  M t1;.  INSERT I
3800: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 4e 55  NTO t1 SELECT NU
3810: 4c 4c 2c 20 72 61 6e 64 73 74 72 28 31 30 30 2c  LL, randstr(100,
3820: 31 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20  100) FROM t1;.  
3830: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
3840: 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 72 61 6e 64  ELECT NULL, rand
3850: 73 74 72 28 31 30 30 2c 31 30 30 29 20 46 52 4f  str(100,100) FRO
3860: 4d 20 74 31 3b 0a 20 20 49 4e 53 45 52 54 20 49  M t1;.  INSERT I
3870: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 4e 55  NTO t1 SELECT NU
3880: 4c 4c 2c 20 72 61 6e 64 73 74 72 28 31 30 30 2c  LL, randstr(100,
3890: 31 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20  100) FROM t1;.  
38a0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
38b0: 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 72 61 6e 64  ELECT NULL, rand
38c0: 73 74 72 28 31 30 30 2c 31 30 30 29 20 46 52 4f  str(100,100) FRO
38d0: 4d 20 74 31 3b 0a 20 20 49 4e 53 45 52 54 20 49  M t1;.  INSERT I
38e0: 4e 54 4f 20 74 32 20 53 45 4c 45 43 54 20 2a 20  NTO t2 SELECT * 
38f0: 46 52 4f 4d 20 74 31 3b 0a 20 20 44 45 4c 45 54  FROM t1;.  DELET
3900: 45 20 46 52 4f 4d 20 74 31 3b 0a 7d 20 2d 63 6f  E FROM t1;.} -co
3910: 72 72 75 70 74 20 7b 0a 20 20 73 65 74 20 6f 66  rrupt {.  set of
3920: 66 73 65 74 20 5b 65 78 70 72 20 5b 66 69 6c 65  fset [expr [file
3930: 20 73 69 7a 65 20 63 6f 72 72 75 70 74 2e 64 62   size corrupt.db
3940: 5d 20 2d 20 31 30 32 34 5d 0a 20 20 68 65 78 69  ] - 1024].  hexi
3950: 6f 5f 77 72 69 74 65 20 63 6f 72 72 75 70 74 2e  o_write corrupt.
3960: 64 62 20 24 6f 66 66 73 65 74 20 46 46 20 0a 20  db $offset FF . 
3970: 20 68 65 78 69 6f 5f 77 72 69 74 65 20 63 6f 72   hexio_write cor
3980: 72 75 70 74 2e 64 62 20 32 34 20 20 20 31 32 33  rupt.db 24   123
3990: 34 35 36 37 38 0a 7d 20 2d 74 65 73 74 20 7b 0a  45678.} -test {.
39a0: 20 20 64 6f 5f 74 65 73 74 20 63 6f 72 72 75 70    do_test corrup
39b0: 74 32 2d 31 31 2e 31 20 7b 0a 20 20 20 20 63 61  t2-11.1 {.    ca
39c0: 74 63 68 73 71 6c 20 22 20 24 3a 3a 70 72 65 73  tchsql " $::pres
39d0: 71 6c 20 50 52 41 47 4d 41 20 69 6e 63 72 65 6d  ql PRAGMA increm
39e0: 65 6e 74 61 6c 5f 76 61 63 75 75 6d 20 22 0a 20  ental_vacuum ". 
39f0: 20 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20   } {1 {database 
3a00: 64 69 73 6b 20 69 6d 61 67 65 20 69 73 20 6d 61  disk image is ma
3a10: 6c 66 6f 72 6d 65 64 7d 7d 0a 7d 0a 63 6f 72 72  lformed}}.}.corr
3a20: 75 70 74 69 6f 6e 5f 74 65 73 74 20 2d 73 71 6c  uption_test -sql
3a30: 70 72 65 70 20 7b 0a 20 20 50 52 41 47 4d 41 20  prep {.  PRAGMA 
3a40: 61 75 74 6f 5f 76 61 63 75 75 6d 20 3d 20 69 6e  auto_vacuum = in
3a50: 63 72 65 6d 65 6e 74 61 6c 3b 0a 20 20 43 52 45  cremental;.  CRE
3a60: 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 20 49  ATE TABLE t1(a I
3a70: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
3a80: 45 59 2c 20 62 29 3b 0a 20 20 43 52 45 41 54 45  EY, b);.  CREATE
3a90: 20 54 41 42 4c 45 20 74 32 28 61 20 49 4e 54 45   TABLE t2(a INTE
3aa0: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  GER PRIMARY KEY,
3ab0: 20 62 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e   b);.  INSERT IN
3ac0: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20  TO t1 VALUES(1, 
3ad0: 72 61 6e 64 73 74 72 28 31 30 30 2c 31 30 30 29  randstr(100,100)
3ae0: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
3af0: 20 74 31 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c   t1 SELECT NULL,
3b00: 20 72 61 6e 64 73 74 72 28 31 30 30 2c 31 30 30   randstr(100,100
3b10: 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 49 4e 53  ) FROM t1;.  INS
3b20: 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
3b30: 43 54 20 4e 55 4c 4c 2c 20 72 61 6e 64 73 74 72  CT NULL, randstr
3b40: 28 31 30 30 2c 31 30 30 29 20 46 52 4f 4d 20 74  (100,100) FROM t
3b50: 31 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  1;.  INSERT INTO
3b60: 20 74 31 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c   t1 SELECT NULL,
3b70: 20 72 61 6e 64 73 74 72 28 31 30 30 2c 31 30 30   randstr(100,100
3b80: 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 49 4e 53  ) FROM t1;.  INS
3b90: 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
3ba0: 43 54 20 4e 55 4c 4c 2c 20 72 61 6e 64 73 74 72  CT NULL, randstr
3bb0: 28 31 30 30 2c 31 30 30 29 20 46 52 4f 4d 20 74  (100,100) FROM t
3bc0: 31 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  1;.  INSERT INTO
3bd0: 20 74 31 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c   t1 SELECT NULL,
3be0: 20 72 61 6e 64 73 74 72 28 31 30 30 2c 31 30 30   randstr(100,100
3bf0: 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 49 4e 53  ) FROM t1;.  INS
3c00: 45 52 54 20 49 4e 54 4f 20 74 32 20 53 45 4c 45  ERT INTO t2 SELE
3c10: 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20  CT * FROM t1;.  
3c20: 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 3b 0a  DELETE FROM t1;.
3c30: 7d 20 2d 63 6f 72 72 75 70 74 20 7b 0a 20 20 73  } -corrupt {.  s
3c40: 65 74 20 70 67 6e 6f 20 5b 65 78 70 72 20 5b 66  et pgno [expr [f
3c50: 69 6c 65 20 73 69 7a 65 20 63 6f 72 72 75 70 74  ile size corrupt
3c60: 2e 64 62 5d 20 2f 20 31 30 32 34 5d 0a 20 20 68  .db] / 1024].  h
3c70: 65 78 69 6f 5f 77 72 69 74 65 20 63 6f 72 72 75  exio_write corru
3c80: 70 74 2e 64 62 20 5b 65 78 70 72 20 31 30 32 34  pt.db [expr 1024
3c90: 2b 35 2a 28 24 70 67 6e 6f 2d 33 29 5d 20 30 33  +5*($pgno-3)] 03
3ca0: 20 0a 20 20 68 65 78 69 6f 5f 77 72 69 74 65 20   .  hexio_write 
3cb0: 63 6f 72 72 75 70 74 2e 64 62 20 32 34 20 20 20  corrupt.db 24   
3cc0: 31 32 33 34 35 36 37 38 0a 7d 20 2d 74 65 73 74  12345678.} -test
3cd0: 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 63 6f 72   {.  do_test cor
3ce0: 72 75 70 74 32 2d 31 32 2e 31 20 7b 0a 20 20 20  rupt2-12.1 {.   
3cf0: 20 63 61 74 63 68 73 71 6c 20 22 20 24 3a 3a 70   catchsql " $::p
3d00: 72 65 73 71 6c 20 50 52 41 47 4d 41 20 69 6e 63  resql PRAGMA inc
3d10: 72 65 6d 65 6e 74 61 6c 5f 76 61 63 75 75 6d 20  remental_vacuum 
3d20: 22 0a 20 20 7d 20 7b 31 20 7b 64 61 74 61 62 61  ".  } {1 {databa
3d30: 73 65 20 64 69 73 6b 20 69 6d 61 67 65 20 69 73  se disk image is
3d40: 20 6d 61 6c 66 6f 72 6d 65 64 7d 7d 0a 7d 0a 0a   malformed}}.}..
3d50: 69 66 63 61 70 61 62 6c 65 20 61 75 74 6f 76 61  ifcapable autova
3d60: 63 75 75 6d 20 7b 0a 20 20 23 20 49 74 20 69 73  cuum {.  # It is
3d70: 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f   not possible fo
3d80: 72 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20  r the last page 
3d90: 69 6e 20 61 20 64 61 74 61 62 61 73 65 20 66 69  in a database fi
3da0: 6c 65 20 74 6f 20 62 65 20 74 68 65 0a 20 20 23  le to be the.  #
3db0: 20 70 65 6e 64 69 6e 67 2d 62 79 74 65 20 70 61   pending-byte pa
3dc0: 67 65 20 28 41 4b 41 20 74 68 65 20 6c 6f 63 6b  ge (AKA the lock
3dd0: 69 6e 67 20 70 61 67 65 29 2e 20 54 68 69 73 20  ing page). This 
3de0: 74 65 73 74 20 76 65 72 69 66 69 65 73 20 74 68  test verifies th
3df0: 61 74 20 69 66 0a 20 20 23 20 61 6e 20 61 74 74  at if.  # an att
3e00: 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20  empt is made to 
3e10: 63 6f 6d 6d 69 74 20 61 20 74 72 61 6e 73 61 63  commit a transac
3e20: 74 69 6f 6e 20 74 6f 20 73 75 63 68 20 61 6e 20  tion to such an 
3e30: 61 75 74 6f 2d 76 61 63 75 75 6d 20 0a 20 20 23  auto-vacuum .  #
3e40: 20 64 61 74 61 62 61 73 65 20 53 51 4c 49 54 45   database SQLITE
3e50: 5f 43 4f 52 52 55 50 54 20 69 73 20 72 65 74 75  _CORRUPT is retu
3e60: 72 6e 65 64 2e 0a 20 20 23 0a 20 20 63 6f 72 72  rned..  #.  corr
3e70: 75 70 74 69 6f 6e 5f 74 65 73 74 20 2d 74 63 6c  uption_test -tcl
3e80: 70 72 65 70 20 7b 0a 20 20 20 20 64 62 20 65 76  prep {.    db ev
3e90: 61 6c 20 7b 20 0a 20 20 20 20 20 20 50 52 41 47  al { .      PRAG
3ea0: 4d 41 20 61 75 74 6f 5f 76 61 63 75 75 6d 20 3d  MA auto_vacuum =
3eb0: 20 66 75 6c 6c 3b 0a 20 20 20 20 20 20 50 52 41   full;.      PRA
3ec0: 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20  GMA page_size = 
3ed0: 31 30 32 34 3b 0a 20 20 20 20 20 20 43 52 45 41  1024;.      CREA
3ee0: 54 45 20 54 41 42 4c 45 20 74 31 28 61 20 49 4e  TE TABLE t1(a IN
3ef0: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
3f00: 59 2c 20 62 29 3b 0a 20 20 20 20 20 20 49 4e 53  Y, b);.      INS
3f10: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
3f20: 45 53 28 4e 55 4c 4c 2c 20 72 61 6e 64 73 74 72  ES(NULL, randstr
3f30: 28 35 30 2c 35 30 29 29 3b 0a 20 20 20 20 7d 0a  (50,50));.    }.
3f40: 20 20 20 20 66 6f 72 20 7b 73 65 74 20 69 69 20      for {set ii 
3f50: 30 7d 20 7b 24 69 69 20 3c 20 31 30 7d 20 7b 69  0} {$ii < 10} {i
3f60: 6e 63 72 20 69 69 7d 20 7b 0a 20 20 20 20 20 20  ncr ii} {.      
3f70: 64 62 20 65 76 61 6c 20 22 20 24 3a 3a 70 72 65  db eval " $::pre
3f80: 73 71 6c 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  sql INSERT INTO 
3f90: 74 31 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20  t1 SELECT NULL, 
3fa0: 72 61 6e 64 73 74 72 28 35 30 2c 35 30 29 20 46  randstr(50,50) F
3fb0: 52 4f 4d 20 74 31 20 22 0a 20 20 20 20 7d 0a 20  ROM t1 ".    }. 
3fc0: 20 7d 20 2d 63 6f 72 72 75 70 74 20 7b 0a 20 20   } -corrupt {.  
3fd0: 20 20 64 6f 5f 74 65 73 74 20 63 6f 72 72 75 70    do_test corrup
3fe0: 74 32 2d 31 33 2e 31 20 7b 0a 20 20 20 20 20 20  t2-13.1 {.      
3ff0: 66 69 6c 65 20 73 69 7a 65 20 63 6f 72 72 75 70  file size corrup
4000: 74 2e 64 62 0a 20 20 20 20 7d 20 24 3a 3a 73 71  t.db.    } $::sq
4010: 6c 69 74 65 5f 70 65 6e 64 69 6e 67 5f 62 79 74  lite_pending_byt
4020: 65 0a 20 20 20 20 68 65 78 69 6f 5f 77 72 69 74  e.    hexio_writ
4030: 65 20 63 6f 72 72 75 70 74 2e 64 62 20 5b 65 78  e corrupt.db [ex
4040: 70 72 20 24 3a 3a 73 71 6c 69 74 65 5f 70 65 6e  pr $::sqlite_pen
4050: 64 69 6e 67 5f 62 79 74 65 2b 31 30 32 33 5d 20  ding_byte+1023] 
4060: 30 30 0a 20 20 20 20 68 65 78 69 6f 5f 77 72 69  00.    hexio_wri
4070: 74 65 20 63 6f 72 72 75 70 74 2e 64 62 20 32 38  te corrupt.db 28
4080: 20 30 30 30 30 30 30 30 30 0a 20 20 7d 20 2d 74   00000000.  } -t
4090: 65 73 74 20 7b 0a 20 20 20 20 64 6f 5f 74 65 73  est {.    do_tes
40a0: 74 20 63 6f 72 72 75 70 74 32 2d 31 33 2e 32 20  t corrupt2-13.2 
40b0: 7b 0a 20 20 20 20 20 20 66 69 6c 65 20 73 69 7a  {.      file siz
40c0: 65 20 63 6f 72 72 75 70 74 2e 64 62 0a 20 20 20  e corrupt.db.   
40d0: 20 7d 20 5b 65 78 70 72 20 24 3a 3a 73 71 6c 69   } [expr $::sqli
40e0: 74 65 5f 70 65 6e 64 69 6e 67 5f 62 79 74 65 20  te_pending_byte 
40f0: 2b 20 31 30 32 34 5d 0a 20 20 20 20 64 6f 5f 74  + 1024].    do_t
4100: 65 73 74 20 63 6f 72 72 75 70 74 32 2d 31 33 2e  est corrupt2-13.
4110: 33 20 7b 0a 20 20 20 20 20 20 63 61 74 63 68 73  3 {.      catchs
4120: 71 6c 20 7b 20 44 45 4c 45 54 45 20 46 52 4f 4d  ql { DELETE FROM
4130: 20 74 31 20 57 48 45 52 45 20 72 6f 77 69 64 20   t1 WHERE rowid 
4140: 3c 20 33 30 3b 20 7d 0a 20 20 20 20 7d 20 7b 31  < 30; }.    } {1
4150: 20 7b 64 61 74 61 62 61 73 65 20 64 69 73 6b 20   {database disk 
4160: 69 6d 61 67 65 20 69 73 20 6d 61 6c 66 6f 72 6d  image is malform
4170: 65 64 7d 7d 0a 20 20 7d 0a 7d 0a 0a 66 69 6e 69  ed}}.  }.}..fini
4180: 73 68 5f 74 65 73 74 0a                          sh_test.