/ Hex Artifact Content
Login

Artifact 138ecb02188ed1a719b533d4a139568204039f72f00e07a8d30d920bd83122db:


0000: 23 20 32 30 30 34 20 41 75 67 75 73 74 20 33 30  # 2004 August 30
0010: 0a 23 0a 23 20 54 68 65 20 61 75 74 68 6f 72 20  .#.# The author 
0020: 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79 72 69  disclaims copyri
0030: 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f 75 72  ght to this sour
0040: 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70 6c 61  ce code.  In pla
0050: 63 65 20 6f 66 0a 23 20 61 20 6c 65 67 61 6c 20  ce of.# a legal 
0060: 6e 6f 74 69 63 65 2c 20 68 65 72 65 20 69 73 20  notice, here is 
0070: 61 20 62 6c 65 73 73 69 6e 67 3a 0a 23 0a 23 20  a blessing:.#.# 
0080: 20 20 20 4d 61 79 20 79 6f 75 20 64 6f 20 67 6f     May you do go
0090: 6f 64 20 61 6e 64 20 6e 6f 74 20 65 76 69 6c 2e  od and not evil.
00a0: 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 20 66 69  .#    May you fi
00b0: 6e 64 20 66 6f 72 67 69 76 65 6e 65 73 73 20 66  nd forgiveness f
00c0: 6f 72 20 79 6f 75 72 73 65 6c 66 20 61 6e 64 20  or yourself and 
00d0: 66 6f 72 67 69 76 65 20 6f 74 68 65 72 73 2e 0a  forgive others..
00e0: 23 20 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61  #    May you sha
00f0: 72 65 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72  re freely, never
0100: 20 74 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61   taking more tha
0110: 6e 20 79 6f 75 20 67 69 76 65 2e 0a 23 0a 23 2a  n you give..#.#*
0120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 0a 23 20 54 68 69 73 20 66 69  ******.# This fi
0170: 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 72 65  le implements re
0180: 67 72 65 73 73 69 6f 6e 20 74 65 73 74 73 20 66  gression tests f
0190: 6f 72 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72  or SQLite librar
01a0: 79 2e 0a 23 0a 23 20 54 68 69 73 20 66 69 6c 65  y..#.# This file
01b0: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 65 73 74   implements test
01c0: 73 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 53  s to make sure S
01d0: 51 4c 69 74 65 20 64 6f 65 73 20 6e 6f 74 20 63  QLite does not c
01e0: 72 61 73 68 20 6f 72 0a 23 20 73 65 67 66 61 75  rash or.# segfau
01f0: 6c 74 20 69 66 20 69 74 20 73 65 65 73 20 61 20  lt if it sees a 
0200: 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65  corrupt database
0210: 20 66 69 6c 65 2e 20 20 49 74 20 63 72 65 61 74   file.  It creat
0220: 65 73 20 61 20 62 61 73 65 0a 23 20 64 61 74 61  es a base.# data
0230: 20 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e   base file, then
0240: 20 74 65 73 74 73 20 74 68 61 74 20 73 69 6e 67   tests that sing
0250: 6c 65 20 62 79 74 65 20 63 6f 72 72 75 70 74 69  le byte corrupti
0260: 6f 6e 73 20 69 6e 20 0a 23 20 69 6e 63 72 65 61  ons in .# increa
0270: 73 69 6e 67 6c 79 20 6c 61 72 67 65 72 20 71 75  singly larger qu
0280: 61 6e 74 69 74 69 65 73 20 61 72 65 20 68 61 6e  antities are han
0290: 64 6c 65 64 20 67 72 61 63 65 66 75 6c 6c 79 2e  dled gracefully.
02a0: 0a 23 0a 23 20 24 49 64 3a 20 63 6f 72 72 75 70  .#.# $Id: corrup
02b0: 74 43 2e 74 65 73 74 2c 76 20 31 2e 31 34 20 32  tC.test,v 1.14 2
02c0: 30 30 39 2f 30 37 2f 31 31 20 30 36 3a 35 35 3a  009/07/11 06:55:
02d0: 33 34 20 64 61 6e 69 65 6c 6b 31 39 37 37 20 45  34 danielk1977 E
02e0: 78 70 20 24 0a 0a 63 61 74 63 68 20 7b 66 6f 72  xp $..catch {for
02f0: 63 65 64 65 6c 65 74 65 20 74 65 73 74 2e 64 62  cedelete test.db
0300: 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c   test.db-journal
0310: 20 74 65 73 74 2e 62 75 7d 0a 0a 73 65 74 20 74   test.bu}..set t
0320: 65 73 74 64 69 72 20 5b 66 69 6c 65 20 64 69 72  estdir [file dir
0330: 6e 61 6d 65 20 24 61 72 67 76 30 5d 0a 73 6f 75  name $argv0].sou
0340: 72 63 65 20 24 74 65 73 74 64 69 72 2f 74 65 73  rce $testdir/tes
0350: 74 65 72 2e 74 63 6c 0a 0a 23 20 44 6f 20 6e 6f  ter.tcl..# Do no
0360: 74 20 75 73 65 20 61 20 63 6f 64 65 63 20 66 6f  t use a codec fo
0370: 72 20 74 65 73 74 73 20 69 6e 20 74 68 69 73 20  r tests in this 
0380: 66 69 6c 65 2c 20 61 73 20 74 68 65 20 64 61 74  file, as the dat
0390: 61 62 61 73 65 20 66 69 6c 65 20 69 73 0a 23 20  abase file is.# 
03a0: 6d 61 6e 69 70 75 6c 61 74 65 64 20 64 69 72 65  manipulated dire
03b0: 63 74 6c 79 20 75 73 69 6e 67 20 74 63 6c 20 73  ctly using tcl s
03c0: 63 72 69 70 74 73 20 28 75 73 69 6e 67 20 74 68  cripts (using th
03d0: 65 20 5b 68 65 78 69 6f 5f 77 72 69 74 65 5d 20  e [hexio_write] 
03e0: 63 6f 6d 6d 61 6e 64 29 2e 0a 23 0a 64 6f 5f 6e  command)..#.do_n
03f0: 6f 74 5f 75 73 65 5f 63 6f 64 65 63 0a 0a 23 20  ot_use_codec..# 
0400: 54 68 65 73 65 20 74 65 73 74 73 20 64 65 61 6c  These tests deal
0410: 20 77 69 74 68 20 63 6f 72 72 75 70 74 20 64 61   with corrupt da
0420: 74 61 62 61 73 65 20 66 69 6c 65 73 0a 23 0a 64  tabase files.#.d
0430: 61 74 61 62 61 73 65 5f 6d 61 79 5f 62 65 5f 63  atabase_may_be_c
0440: 6f 72 72 75 70 74 0a 0a 23 20 43 6f 6e 73 74 72  orrupt..# Constr
0450: 75 63 74 20 61 20 63 6f 6d 70 61 63 74 2c 20 64  uct a compact, d
0460: 65 6e 73 65 20 64 61 74 61 62 61 73 65 20 66 6f  ense database fo
0470: 72 20 74 65 73 74 69 6e 67 2e 0a 23 0a 64 6f 5f  r testing..#.do_
0480: 74 65 73 74 20 63 6f 72 72 75 70 74 43 2d 31 2e  test corruptC-1.
0490: 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  1 {.  execsql {.
04a0: 20 20 20 20 50 52 41 47 4d 41 20 61 75 74 6f 5f      PRAGMA auto_
04b0: 76 61 63 75 75 6d 20 3d 20 30 3b 0a 20 20 20 20  vacuum = 0;.    
04c0: 50 52 41 47 4d 41 20 6c 65 67 61 63 79 5f 66 69  PRAGMA legacy_fi
04d0: 6c 65 5f 66 6f 72 6d 61 74 3d 31 3b 0a 20 20 20  le_format=1;.   
04e0: 20 42 45 47 49 4e 3b 0a 20 20 20 20 43 52 45 41   BEGIN;.    CREA
04f0: 54 45 20 54 41 42 4c 45 20 74 31 28 78 2c 79 29  TE TABLE t1(x,y)
0500: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
0510: 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c 31 29  O t1 VALUES(1,1)
0520: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 4f 52 20  ;.    INSERT OR 
0530: 49 47 4e 4f 52 45 20 49 4e 54 4f 20 74 31 20 53  IGNORE INTO t1 S
0540: 45 4c 45 43 54 20 78 2a 32 2c 79 20 46 52 4f 4d  ELECT x*2,y FROM
0550: 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   t1;.    INSERT 
0560: 4f 52 20 49 47 4e 4f 52 45 20 49 4e 54 4f 20 74  OR IGNORE INTO t
0570: 31 20 53 45 4c 45 43 54 20 78 2a 33 2c 79 20 46  1 SELECT x*3,y F
0580: 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45  ROM t1;.    INSE
0590: 52 54 20 4f 52 20 49 47 4e 4f 52 45 20 49 4e 54  RT OR IGNORE INT
05a0: 4f 20 74 31 20 53 45 4c 45 43 54 20 78 2a 35 2c  O t1 SELECT x*5,
05b0: 79 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49  y FROM t1;.    I
05c0: 4e 53 45 52 54 20 4f 52 20 49 47 4e 4f 52 45 20  NSERT OR IGNORE 
05d0: 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 78  INTO t1 SELECT x
05e0: 2a 37 2c 79 20 46 52 4f 4d 20 74 31 3b 0a 20 20  *7,y FROM t1;.  
05f0: 20 20 49 4e 53 45 52 54 20 4f 52 20 49 47 4e 4f    INSERT OR IGNO
0600: 52 45 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RE INTO t1 SELEC
0610: 54 20 78 2a 31 31 2c 79 20 46 52 4f 4d 20 74 31  T x*11,y FROM t1
0620: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 4f 52 20  ;.    INSERT OR 
0630: 49 47 4e 4f 52 45 20 49 4e 54 4f 20 74 31 20 53  IGNORE INTO t1 S
0640: 45 4c 45 43 54 20 78 2a 31 33 2c 79 20 46 52 4f  ELECT x*13,y FRO
0650: 4d 20 74 31 3b 0a 20 20 20 20 43 52 45 41 54 45  M t1;.    CREATE
0660: 20 49 4e 44 45 58 20 74 31 69 31 20 4f 4e 20 74   INDEX t1i1 ON t
0670: 31 28 78 29 3b 0a 20 20 20 20 43 52 45 41 54 45  1(x);.    CREATE
0680: 20 54 41 42 4c 45 20 74 32 20 41 53 20 53 45 4c   TABLE t2 AS SEL
0690: 45 43 54 20 78 2c 32 20 61 73 20 79 20 46 52 4f  ECT x,2 as y FRO
06a0: 4d 20 74 31 20 57 48 45 52 45 20 72 6f 77 69 64  M t1 WHERE rowid
06b0: 25 35 21 3d 30 3b 0a 20 20 20 20 43 4f 4d 4d 49  %5!=0;.    COMMI
06c0: 54 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 69 66 63  T;.  }.} {}..ifc
06d0: 61 70 61 62 6c 65 20 7b 69 6e 74 65 67 72 69 74  apable {integrit
06e0: 79 63 6b 7d 20 7b 0a 20 20 69 6e 74 65 67 72 69  yck} {.  integri
06f0: 74 79 5f 63 68 65 63 6b 20 63 6f 72 72 75 70 74  ty_check corrupt
0700: 43 2d 31 2e 32 0a 7d 0a 0a 23 20 47 65 6e 65 72  C-1.2.}..# Gener
0710: 61 74 65 20 72 61 6e 64 6f 6d 20 69 6e 74 65 67  ate random integ
0720: 65 72 0a 23 0a 70 72 6f 63 20 72 61 6e 64 6f 6d  er.#.proc random
0730: 20 7b 72 61 6e 67 65 7d 20 7b 0a 20 20 72 65 74   {range} {.  ret
0740: 75 72 6e 20 5b 65 78 70 72 20 7b 72 6f 75 6e 64  urn [expr {round
0750: 28 72 61 6e 64 28 29 2a 24 72 61 6e 67 65 29 7d  (rand()*$range)}
0760: 5d 0a 7d 0a 0a 23 20 53 65 74 75 70 20 66 6f 72  ].}..# Setup for
0770: 20 74 68 65 20 74 65 73 74 73 2e 20 20 4d 61 6b   the tests.  Mak
0780: 65 20 61 20 62 61 63 6b 75 70 20 63 6f 70 79 20  e a backup copy 
0790: 6f 66 20 74 68 65 20 67 6f 6f 64 20 64 61 74 61  of the good data
07a0: 62 61 73 65 20 69 6e 20 74 65 73 74 2e 62 75 2e  base in test.bu.
07b0: 0a 23 0a 64 62 20 63 6c 6f 73 65 0a 66 6f 72 63  .#.db close.forc
07c0: 65 63 6f 70 79 20 74 65 73 74 2e 64 62 20 74 65  ecopy test.db te
07d0: 73 74 2e 62 75 0a 73 71 6c 69 74 65 33 20 64 62  st.bu.sqlite3 db
07e0: 20 74 65 73 74 2e 64 62 0a 73 65 74 20 66 73 69   test.db.set fsi
07f0: 7a 65 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65  ze [file size te
0800: 73 74 2e 64 62 5d 0a 0a 23 20 53 65 74 20 61 20  st.db]..# Set a 
0810: 71 75 61 73 69 2d 72 61 6e 64 6f 6d 20 72 61 6e  quasi-random ran
0820: 64 6f 6d 20 73 65 65 64 2e 20 0a 69 66 20 7b 5b  dom seed. .if {[
0830: 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 47 28  info exists ::G(
0840: 69 73 73 6f 61 6b 29 5d 7d 20 7b 0a 20 20 23 20  issoak)]} {.  # 
0850: 49 66 20 77 65 20 61 72 65 20 64 6f 69 6e 67 20  If we are doing 
0860: 53 4f 41 4b 20 74 65 73 74 73 2c 20 77 65 20 77  SOAK tests, we w
0870: 61 6e 74 20 61 20 64 69 66 66 65 72 65 6e 74 0a  ant a different.
0880: 20 20 23 20 72 61 6e 64 6f 6d 20 73 65 65 64 20    # random seed 
0890: 66 6f 72 20 65 61 63 68 20 72 75 6e 2e 20 20 49  for each run.  I
08a0: 64 65 61 6c 6c 79 20 77 65 20 77 6f 75 6c 64 20  deally we would 
08b0: 6c 69 6b 65 20 0a 20 20 23 20 74 6f 20 75 73 65  like .  # to use
08c0: 20 5b 63 6c 6f 63 6b 20 63 6c 69 63 6b 73 5d 20   [clock clicks] 
08d0: 6f 72 20 73 6f 6d 65 74 68 69 6e 67 20 6c 69 6b  or something lik
08e0: 65 20 74 68 61 74 20 68 65 72 65 2e 0a 20 20 73  e that here..  s
08f0: 65 74 20 71 73 65 65 64 20 5b 66 69 6c 65 20 6d  et qseed [file m
0900: 74 69 6d 65 20 74 65 73 74 2e 64 62 5d 0a 7d 20  time test.db].} 
0910: 65 6c 73 65 20 7b 0a 20 20 23 20 49 66 20 77 65  else {.  # If we
0920: 20 61 72 65 20 6e 6f 74 20 64 6f 69 6e 67 20 73   are not doing s
0930: 6f 61 6b 20 74 65 73 74 73 2c 0a 20 20 23 20 6d  oak tests,.  # m
0940: 61 6b 65 20 69 74 20 72 65 70 65 61 74 61 62 6c  ake it repeatabl
0950: 65 2e 0a 20 20 73 65 74 20 71 73 65 65 64 20 30  e..  set qseed 0
0960: 0a 7d 0a 65 78 70 72 20 73 72 61 6e 64 28 24 71  .}.expr srand($q
0970: 73 65 65 64 29 0a 0a 23 0a 23 20 46 69 72 73 74  seed)..#.# First
0980: 20 74 65 73 74 20 73 6f 6d 65 20 73 70 65 63 69   test some speci
0990: 66 69 63 20 63 6f 72 72 75 70 74 69 6f 6e 20 74  fic corruption t
09a0: 65 73 74 73 20 66 6f 75 6e 64 20 66 72 6f 6d 20  ests found from 
09b0: 65 61 72 6c 69 65 72 20 72 75 6e 73 0a 23 20 77  earlier runs.# w
09c0: 69 74 68 20 73 70 65 63 69 66 69 63 20 73 65 65  ith specific see
09d0: 64 73 2e 0a 23 0a 0a 23 20 74 65 73 74 20 74 68  ds..#..# test th
09e0: 61 74 20 61 20 63 6f 72 72 75 70 74 20 63 6f 6e  at a corrupt con
09f0: 74 65 6e 74 20 6f 66 66 73 65 74 20 73 69 7a 65  tent offset size
0a00: 20 69 73 20 68 61 6e 64 6c 65 64 20 28 73 65 65   is handled (see
0a10: 64 20 35 35 37 37 29 0a 64 6f 5f 74 65 73 74 20  d 5577).do_test 
0a20: 63 6f 72 72 75 70 74 43 2d 32 2e 31 20 7b 0a 20  corruptC-2.1 {. 
0a30: 20 64 62 20 63 6c 6f 73 65 0a 20 20 66 6f 72 63   db close.  forc
0a40: 65 63 6f 70 79 20 74 65 73 74 2e 62 75 20 74 65  ecopy test.bu te
0a50: 73 74 2e 64 62 0a 0a 20 20 23 20 69 6e 73 65 72  st.db..  # inser
0a60: 74 20 63 6f 72 72 75 70 74 20 62 79 74 65 28 73  t corrupt byte(s
0a70: 29 0a 20 20 68 65 78 69 6f 5f 77 72 69 74 65 20  ).  hexio_write 
0a80: 74 65 73 74 2e 64 62 20 32 30 35 33 20 5b 66 6f  test.db 2053 [fo
0a90: 72 6d 61 74 20 25 30 32 78 20 30 78 30 34 5d 0a  rmat %02x 0x04].
0aa0: 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 74 65  .  sqlite3 db te
0ab0: 73 74 2e 64 62 0a 20 20 63 61 74 63 68 73 71 6c  st.db.  catchsql
0ac0: 20 7b 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69   {PRAGMA integri
0ad0: 74 79 5f 63 68 65 63 6b 7d 0a 7d 20 7b 31 20 7b  ty_check}.} {1 {
0ae0: 64 61 74 61 62 61 73 65 20 64 69 73 6b 20 69 6d  database disk im
0af0: 61 67 65 20 69 73 20 6d 61 6c 66 6f 72 6d 65 64  age is malformed
0b00: 7d 7d 0a 0a 23 20 74 65 73 74 20 74 68 61 74 20  }}..# test that 
0b10: 61 20 63 6f 72 72 75 70 74 20 63 6f 6e 74 65 6e  a corrupt conten
0b20: 74 20 6f 66 66 73 65 74 20 73 69 7a 65 20 69 73  t offset size is
0b30: 20 68 61 6e 64 6c 65 64 20 28 73 65 65 64 20 35   handled (seed 5
0b40: 36 34 39 29 0a 23 0a 23 20 55 70 64 61 74 65 20  649).#.# Update 
0b50: 32 30 31 36 2d 31 32 2d 32 37 3a 20 20 41 73 20  2016-12-27:  As 
0b60: 6f 66 20 63 68 65 63 6b 2d 69 6e 20 5b 30 62 38  of check-in [0b8
0b70: 36 66 62 63 61 36 36 5d 20 22 49 6e 20 73 71 6c  6fbca66] "In sql
0b80: 69 74 65 33 42 74 72 65 65 49 6e 73 65 72 74 28  ite3BtreeInsert(
0b90: 29 20 77 68 65 6e 0a 23 20 72 65 70 6c 61 63 69  ) when.# replaci
0ba0: 6e 67 20 61 20 72 65 2d 65 78 69 73 74 69 6e 67  ng a re-existing
0bb0: 20 72 6f 77 2c 20 74 72 79 20 74 6f 20 6f 76 65   row, try to ove
0bc0: 72 77 72 69 74 65 20 74 68 65 20 63 65 6c 6c 20  rwrite the cell 
0bd0: 64 69 72 65 63 74 6c 79 20 72 61 74 68 65 72 20  directly rather 
0be0: 74 68 61 6e 0a 23 20 64 65 61 6c 6c 6f 63 61 74  than.# deallocat
0bf0: 65 20 61 6e 64 20 72 65 61 6c 6c 6f 63 61 74 65  e and reallocate
0c00: 20 74 68 65 20 63 65 6c 6c 22 20 6f 6e 20 32 30   the cell" on 20
0c10: 31 36 2d 31 32 2d 30 39 2c 20 74 68 69 73 20 74  16-12-09, this t
0c20: 65 73 74 20 63 61 73 65 20 6e 6f 20 6c 6f 6e 67  est case no long
0c30: 65 72 0a 23 20 64 65 74 65 63 74 73 20 74 68 65  er.# detects the
0c40: 20 6f 66 66 73 65 74 20 73 69 7a 65 20 70 72 6f   offset size pro
0c50: 62 6c 65 6d 20 64 75 72 69 6e 67 20 74 68 65 20  blem during the 
0c60: 55 50 44 41 54 45 2e 20 20 57 65 20 68 61 76 65  UPDATE.  We have
0c70: 20 74 6f 20 72 75 6e 20 61 20 73 75 62 73 65 71   to run a subseq
0c80: 75 65 6e 74 0a 23 20 69 6e 74 65 67 72 69 74 79  uent.# integrity
0c90: 5f 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69 74  _check to see it
0ca0: 2e 0a 64 6f 5f 74 65 73 74 20 63 6f 72 72 75 70  ..do_test corrup
0cb0: 74 43 2d 32 2e 32 20 7b 0a 20 20 64 62 20 63 6c  tC-2.2 {.  db cl
0cc0: 6f 73 65 0a 20 20 66 6f 72 63 65 63 6f 70 79 20  ose.  forcecopy 
0cd0: 74 65 73 74 2e 62 75 20 74 65 73 74 2e 64 62 0a  test.bu test.db.
0ce0: 0a 20 20 23 20 69 6e 73 65 72 74 20 63 6f 72 72  .  # insert corr
0cf0: 75 70 74 20 62 79 74 65 28 73 29 0a 20 20 68 65  upt byte(s).  he
0d00: 78 69 6f 5f 77 72 69 74 65 20 74 65 73 74 2e 64  xio_write test.d
0d10: 62 20 32 37 20 20 20 5b 66 6f 72 6d 61 74 20 25  b 27   [format %
0d20: 30 32 78 20 30 78 30 38 5d 0a 20 20 68 65 78 69  02x 0x08].  hexi
0d30: 6f 5f 77 72 69 74 65 20 74 65 73 74 2e 64 62 20  o_write test.db 
0d40: 32 33 33 20 20 5b 66 6f 72 6d 61 74 20 25 30 32  233  [format %02
0d50: 78 20 30 78 36 61 5d 0a 20 20 68 65 78 69 6f 5f  x 0x6a].  hexio_
0d60: 77 72 69 74 65 20 74 65 73 74 2e 64 62 20 33 32  write test.db 32
0d70: 38 20 20 5b 66 6f 72 6d 61 74 20 25 30 32 78 20  8  [format %02x 
0d80: 30 78 36 37 5d 0a 20 20 68 65 78 69 6f 5f 77 72  0x67].  hexio_wr
0d90: 69 74 65 20 74 65 73 74 2e 64 62 20 37 35 30 20  ite test.db 750 
0da0: 20 5b 66 6f 72 6d 61 74 20 25 30 32 78 20 30 78   [format %02x 0x
0db0: 31 66 5d 0a 20 20 68 65 78 69 6f 5f 77 72 69 74  1f].  hexio_writ
0dc0: 65 20 74 65 73 74 2e 64 62 20 31 31 33 32 20 5b  e test.db 1132 [
0dd0: 66 6f 72 6d 61 74 20 25 30 32 78 20 30 78 35 32  format %02x 0x52
0de0: 5d 0a 20 20 68 65 78 69 6f 5f 77 72 69 74 65 20  ].  hexio_write 
0df0: 74 65 73 74 2e 64 62 20 31 31 33 33 20 5b 66 6f  test.db 1133 [fo
0e00: 72 6d 61 74 20 25 30 32 78 20 30 78 38 34 5d 0a  rmat %02x 0x84].
0e10: 20 20 68 65 78 69 6f 5f 77 72 69 74 65 20 74 65    hexio_write te
0e20: 73 74 2e 64 62 20 31 32 32 30 20 5b 66 6f 72 6d  st.db 1220 [form
0e30: 61 74 20 25 30 32 78 20 30 78 30 31 5d 0a 20 20  at %02x 0x01].  
0e40: 68 65 78 69 6f 5f 77 72 69 74 65 20 74 65 73 74  hexio_write test
0e50: 2e 64 62 20 33 36 38 38 20 5b 66 6f 72 6d 61 74  .db 3688 [format
0e60: 20 25 30 32 78 20 30 78 63 31 5d 0a 20 20 68 65   %02x 0xc1].  he
0e70: 78 69 6f 5f 77 72 69 74 65 20 74 65 73 74 2e 64  xio_write test.d
0e80: 62 20 33 37 31 34 20 5b 66 6f 72 6d 61 74 20 25  b 3714 [format %
0e90: 30 32 78 20 30 78 35 38 5d 0a 20 20 68 65 78 69  02x 0x58].  hexi
0ea0: 6f 5f 77 72 69 74 65 20 74 65 73 74 2e 64 62 20  o_write test.db 
0eb0: 33 37 34 36 20 5b 66 6f 72 6d 61 74 20 25 30 32  3746 [format %02
0ec0: 78 20 30 78 39 61 5d 0a 0a 20 20 73 71 6c 69 74  x 0x9a]..  sqlit
0ed0: 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20  e3 db test.db.  
0ee0: 64 62 20 65 76 61 6c 20 7b 55 50 44 41 54 45 20  db eval {UPDATE 
0ef0: 74 31 20 53 45 54 20 79 3d 31 7d 0a 20 20 64 62  t1 SET y=1}.  db
0f00: 20 65 76 61 6c 20 7b 50 52 41 47 4d 41 20 69 6e   eval {PRAGMA in
0f10: 74 65 67 72 69 74 79 5f 63 68 65 63 6b 7d 0a 7d  tegrity_check}.}
0f20: 20 7b 2f 4f 66 66 73 65 74 20 2e 2a 20 6f 75 74   {/Offset .* out
0f30: 20 6f 66 20 72 61 6e 67 65 2f 7d 0a 0a 23 20 74   of range/}..# t
0f40: 65 73 74 20 74 68 61 74 20 61 20 63 6f 72 72 75  est that a corru
0f50: 70 74 20 66 72 65 65 20 63 65 6c 6c 20 73 69 7a  pt free cell siz
0f60: 65 20 69 73 20 68 61 6e 64 6c 65 64 20 28 73 65  e is handled (se
0f70: 65 64 20 31 33 33 32 39 29 0a 64 6f 5f 74 65 73  ed 13329).do_tes
0f80: 74 20 63 6f 72 72 75 70 74 43 2d 32 2e 33 20 7b  t corruptC-2.3 {
0f90: 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 66 6f  .  db close.  fo
0fa0: 72 63 65 63 6f 70 79 20 74 65 73 74 2e 62 75 20  rcecopy test.bu 
0fb0: 74 65 73 74 2e 64 62 0a 0a 20 20 23 20 69 6e 73  test.db..  # ins
0fc0: 65 72 74 20 63 6f 72 72 75 70 74 20 62 79 74 65  ert corrupt byte
0fd0: 28 73 29 0a 20 20 68 65 78 69 6f 5f 77 72 69 74  (s).  hexio_writ
0fe0: 65 20 74 65 73 74 2e 64 62 20 31 30 39 34 20 5b  e test.db 1094 [
0ff0: 66 6f 72 6d 61 74 20 25 30 32 78 20 30 78 37 36  format %02x 0x76
1000: 5d 0a 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20  ]..  sqlite3 db 
1010: 74 65 73 74 2e 64 62 0a 20 20 63 61 74 63 68 73  test.db.  catchs
1020: 71 6c 20 7b 55 50 44 41 54 45 20 74 31 20 53 45  ql {UPDATE t1 SE
1030: 54 20 79 3d 31 7d 0a 7d 20 7b 31 20 7b 64 61 74  T y=1}.} {1 {dat
1040: 61 62 61 73 65 20 64 69 73 6b 20 69 6d 61 67 65  abase disk image
1050: 20 69 73 20 6d 61 6c 66 6f 72 6d 65 64 7d 7d 0a   is malformed}}.
1060: 0a 23 20 74 65 73 74 20 74 68 61 74 20 61 20 63  .# test that a c
1070: 6f 72 72 75 70 74 20 66 72 65 65 20 63 65 6c 6c  orrupt free cell
1080: 20 73 69 7a 65 20 69 73 20 68 61 6e 64 6c 65 64   size is handled
1090: 20 28 73 65 65 64 20 31 36 39 35 37 31 29 0a 64   (seed 169571).d
10a0: 6f 5f 74 65 73 74 20 63 6f 72 72 75 70 74 43 2d  o_test corruptC-
10b0: 32 2e 34 20 7b 0a 20 20 64 62 20 63 6c 6f 73 65  2.4 {.  db close
10c0: 0a 20 20 66 6f 72 63 65 63 6f 70 79 20 74 65 73  .  forcecopy tes
10d0: 74 2e 62 75 20 74 65 73 74 2e 64 62 0a 0a 20 20  t.bu test.db..  
10e0: 23 20 69 6e 73 65 72 74 20 63 6f 72 72 75 70 74  # insert corrupt
10f0: 20 62 79 74 65 28 73 29 0a 20 20 68 65 78 69 6f   byte(s).  hexio
1100: 5f 77 72 69 74 65 20 74 65 73 74 2e 64 62 20 33  _write test.db 3
1110: 31 31 39 20 5b 66 6f 72 6d 61 74 20 25 30 32 78  119 [format %02x
1120: 20 30 78 64 66 5d 0a 0a 20 20 73 71 6c 69 74 65   0xdf]..  sqlite
1130: 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20 63  3 db test.db.  c
1140: 61 74 63 68 73 71 6c 20 7b 55 50 44 41 54 45 20  atchsql {UPDATE 
1150: 74 32 20 53 45 54 20 79 3d 27 61 62 63 64 65 66  t2 SET y='abcdef
1160: 2d 75 76 77 78 79 7a 27 7d 0a 7d 20 7b 31 20 7b  -uvwxyz'}.} {1 {
1170: 64 61 74 61 62 61 73 65 20 64 69 73 6b 20 69 6d  database disk im
1180: 61 67 65 20 69 73 20 6d 61 6c 66 6f 72 6d 65 64  age is malformed
1190: 7d 7d 0a 0a 23 20 74 65 73 74 20 74 68 61 74 20  }}..# test that 
11a0: 61 20 63 6f 72 72 75 70 74 20 66 72 65 65 20 63  a corrupt free c
11b0: 65 6c 6c 20 73 69 7a 65 20 69 73 20 68 61 6e 64  ell size is hand
11c0: 6c 65 64 20 28 73 65 65 64 20 31 36 39 35 37 31  led (seed 169571
11d0: 29 0a 64 6f 5f 74 65 73 74 20 63 6f 72 72 75 70  ).do_test corrup
11e0: 74 43 2d 32 2e 35 20 7b 0a 20 20 64 62 20 63 6c  tC-2.5 {.  db cl
11f0: 6f 73 65 0a 20 20 66 6f 72 63 65 63 6f 70 79 20  ose.  forcecopy 
1200: 74 65 73 74 2e 62 75 20 74 65 73 74 2e 64 62 0a  test.bu test.db.
1210: 0a 20 20 23 20 69 6e 73 65 72 74 20 63 6f 72 72  .  # insert corr
1220: 75 70 74 20 62 79 74 65 28 73 29 0a 20 20 68 65  upt byte(s).  he
1230: 78 69 6f 5f 77 72 69 74 65 20 74 65 73 74 2e 64  xio_write test.d
1240: 62 20 33 31 31 39 20 5b 66 6f 72 6d 61 74 20 25  b 3119 [format %
1250: 30 32 78 20 30 78 64 66 5d 0a 20 20 68 65 78 69  02x 0xdf].  hexi
1260: 6f 5f 77 72 69 74 65 20 74 65 73 74 2e 64 62 20  o_write test.db 
1270: 34 30 37 33 20 5b 66 6f 72 6d 61 74 20 25 30 32  4073 [format %02
1280: 78 20 30 78 62 66 5d 0a 0a 20 20 73 71 6c 69 74  x 0xbf]..  sqlit
1290: 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20  e3 db test.db.  
12a0: 63 61 74 63 68 73 71 6c 20 7b 42 45 47 49 4e 3b  catchsql {BEGIN;
12b0: 20 55 50 44 41 54 45 20 74 32 20 53 45 54 20 79   UPDATE t2 SET y
12c0: 3d 27 61 62 63 64 65 66 2d 75 76 77 78 79 7a 27  ='abcdef-uvwxyz'
12d0: 3b 20 52 4f 4c 4c 42 41 43 4b 3b 7d 0a 20 20 63  ; ROLLBACK;}.  c
12e0: 61 74 63 68 73 71 6c 20 7b 50 52 41 47 4d 41 20  atchsql {PRAGMA 
12f0: 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 7d  integrity_check}
1300: 0a 7d 20 7b 30 20 7b 7b 2a 2a 2a 20 69 6e 20 64  .} {0 {{*** in d
1310: 61 74 61 62 61 73 65 20 6d 61 69 6e 20 2a 2a 2a  atabase main ***
1320: 0a 4f 6e 20 74 72 65 65 20 70 61 67 65 20 34 20  .On tree page 4 
1330: 63 65 6c 6c 20 31 39 3a 20 45 78 74 65 6e 64 73  cell 19: Extends
1340: 20 6f 66 66 20 65 6e 64 20 6f 66 20 70 61 67 65   off end of page
1350: 7d 20 7b 64 61 74 61 62 61 73 65 20 64 69 73 6b  } {database disk
1360: 20 69 6d 61 67 65 20 69 73 20 6d 61 6c 66 6f 72   image is malfor
1370: 6d 65 64 7d 7d 7d 0a 0a 23 20 7b 30 20 7b 7b 2a  med}}}..# {0 {{*
1380: 2a 2a 20 69 6e 20 64 61 74 61 62 61 73 65 20 6d  ** in database m
1390: 61 69 6e 20 2a 2a 2a 0a 23 20 43 6f 72 72 75 70  ain ***.# Corrup
13a0: 74 69 6f 6e 20 64 65 74 65 63 74 65 64 20 69 6e  tion detected in
13b0: 20 63 65 6c 6c 20 37 31 30 20 6f 6e 20 70 61 67   cell 710 on pag
13c0: 65 20 34 0a 23 20 4d 75 6c 74 69 70 6c 65 20 75  e 4.# Multiple u
13d0: 73 65 73 20 66 6f 72 20 62 79 74 65 20 36 36 31  ses for byte 661
13e0: 20 6f 66 20 70 61 67 65 20 34 0a 23 20 46 72 61   of page 4.# Fra
13f0: 67 6d 65 6e 74 65 64 20 73 70 61 63 65 20 69 73  gmented space is
1400: 20 32 34 39 20 62 79 74 65 20 72 65 70 6f 72 74   249 byte report
1410: 65 64 20 61 73 20 32 31 20 6f 6e 20 70 61 67 65  ed as 21 on page
1420: 20 34 7d 7d 7d 0a 0a 23 20 74 65 73 74 20 74 68   4}}}..# test th
1430: 61 74 20 61 20 63 6f 72 72 75 70 74 20 66 72 65  at a corrupt fre
1440: 65 20 63 65 6c 6c 20 73 69 7a 65 20 69 73 20 68  e cell size is h
1450: 61 6e 64 6c 65 64 20 28 73 65 65 64 20 31 36 39  andled (seed 169
1460: 35 39 35 29 0a 64 6f 5f 74 65 73 74 20 63 6f 72  595).do_test cor
1470: 72 75 70 74 43 2d 32 2e 36 20 7b 0a 20 20 64 62  ruptC-2.6 {.  db
1480: 20 63 6c 6f 73 65 0a 20 20 66 6f 72 63 65 63 6f   close.  forceco
1490: 70 79 20 74 65 73 74 2e 62 75 20 74 65 73 74 2e  py test.bu test.
14a0: 64 62 0a 0a 20 20 23 20 69 6e 73 65 72 74 20 63  db..  # insert c
14b0: 6f 72 72 75 70 74 20 62 79 74 65 28 73 29 0a 20  orrupt byte(s). 
14c0: 20 68 65 78 69 6f 5f 77 72 69 74 65 20 74 65 73   hexio_write tes
14d0: 74 2e 64 62 20 36 31 39 20 5b 66 6f 72 6d 61 74  t.db 619 [format
14e0: 20 25 30 32 78 20 30 78 65 32 5d 0a 20 20 68 65   %02x 0xe2].  he
14f0: 78 69 6f 5f 77 72 69 74 65 20 74 65 73 74 2e 64  xio_write test.d
1500: 62 20 33 31 35 30 20 5b 66 6f 72 6d 61 74 20 25  b 3150 [format %
1510: 30 32 78 20 30 78 61 38 5d 0a 0a 20 20 73 71 6c  02x 0xa8]..  sql
1520: 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a  ite3 db test.db.
1530: 20 20 63 61 74 63 68 73 71 6c 20 7b 42 45 47 49    catchsql {BEGI
1540: 4e 3b 20 55 50 44 41 54 45 20 74 32 20 53 45 54  N; UPDATE t2 SET
1550: 20 79 3d 27 61 62 63 64 65 66 2d 75 76 77 78 79   y='abcdef-uvwxy
1560: 7a 27 3b 20 52 4f 4c 4c 42 41 43 4b 3b 7d 0a 7d  z'; ROLLBACK;}.}
1570: 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20 64 69   {1 {database di
1580: 73 6b 20 69 6d 61 67 65 20 69 73 20 6d 61 6c 66  sk image is malf
1590: 6f 72 6d 65 64 7d 7d 0a 0a 23 20 63 6f 72 72 75  ormed}}..# corru
15a0: 70 74 69 6f 6e 20 28 73 65 65 64 20 31 37 38 36  ption (seed 1786
15b0: 39 32 29 0a 64 6f 5f 74 65 73 74 20 63 6f 72 72  92).do_test corr
15c0: 75 70 74 43 2d 32 2e 37 20 7b 0a 20 20 64 62 20  uptC-2.7 {.  db 
15d0: 63 6c 6f 73 65 0a 20 20 66 6f 72 63 65 63 6f 70  close.  forcecop
15e0: 79 20 74 65 73 74 2e 62 75 20 74 65 73 74 2e 64  y test.bu test.d
15f0: 62 0a 0a 20 20 23 20 69 6e 73 65 72 74 20 63 6f  b..  # insert co
1600: 72 72 75 70 74 20 62 79 74 65 28 73 29 0a 20 20  rrupt byte(s).  
1610: 68 65 78 69 6f 5f 77 72 69 74 65 20 74 65 73 74  hexio_write test
1620: 2e 64 62 20 33 30 37 34 20 5b 66 6f 72 6d 61 74  .db 3074 [format
1630: 20 25 30 32 78 20 30 78 61 30 5d 0a 0a 20 20 73   %02x 0xa0]..  s
1640: 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64  qlite3 db test.d
1650: 62 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 42 45  b.  catchsql {BE
1660: 47 49 4e 3b 20 55 50 44 41 54 45 20 74 32 20 53  GIN; UPDATE t2 S
1670: 45 54 20 79 3d 27 61 62 63 64 65 66 2d 75 76 77  ET y='abcdef-uvw
1680: 78 79 7a 27 3b 20 52 4f 4c 4c 42 41 43 4b 3b 7d  xyz'; ROLLBACK;}
1690: 0a 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20  .} {1 {database 
16a0: 64 69 73 6b 20 69 6d 61 67 65 20 69 73 20 6d 61  disk image is ma
16b0: 6c 66 6f 72 6d 65 64 7d 7d 0a 0a 0a 23 20 63 6f  lformed}}...# co
16c0: 72 72 75 70 74 69 6f 6e 20 28 73 65 65 64 20 31  rruption (seed 1
16d0: 37 39 30 36 39 29 0a 23 20 4f 62 73 6f 6c 65 74  79069).# Obsolet
16e0: 65 2e 20 20 57 69 74 68 20 73 69 6e 67 6c 65 2d  e.  With single-
16f0: 70 61 73 73 20 44 45 4c 45 54 45 20 74 68 65 20  pass DELETE the 
1700: 63 6f 72 72 75 70 74 69 6f 6e 20 69 6e 20 74 68  corruption in th
1710: 65 0a 23 20 6d 61 69 6e 20 64 61 74 61 62 61 73  e.# main databas
1720: 65 20 69 73 20 6e 6f 74 20 64 65 74 65 63 74 65  e is not detecte
1730: 64 2e 0a 69 66 20 30 20 7b 0a 64 6f 5f 74 65 73  d..if 0 {.do_tes
1740: 74 20 63 6f 72 72 75 70 74 43 2d 32 2e 38 20 7b  t corruptC-2.8 {
1750: 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 66 6f  .  db close.  fo
1760: 72 63 65 63 6f 70 79 20 74 65 73 74 2e 62 75 20  rcecopy test.bu 
1770: 74 65 73 74 2e 64 62 0a 0a 20 20 23 20 69 6e 73  test.db..  # ins
1780: 65 72 74 20 63 6f 72 72 75 70 74 20 62 79 74 65  ert corrupt byte
1790: 28 73 29 0a 20 20 68 65 78 69 6f 5f 77 72 69 74  (s).  hexio_writ
17a0: 65 20 74 65 73 74 2e 64 62 20 31 33 39 33 20 5b  e test.db 1393 [
17b0: 66 6f 72 6d 61 74 20 25 30 32 78 20 30 78 37 64  format %02x 0x7d
17c0: 5d 0a 20 20 68 65 78 69 6f 5f 77 72 69 74 65 20  ].  hexio_write 
17d0: 74 65 73 74 2e 64 62 20 38 34 20 5b 66 6f 72 6d  test.db 84 [form
17e0: 61 74 20 25 30 32 78 20 30 78 31 39 5d 0a 20 20  at %02x 0x19].  
17f0: 68 65 78 69 6f 5f 77 72 69 74 65 20 74 65 73 74  hexio_write test
1800: 2e 64 62 20 33 32 38 37 20 5b 66 6f 72 6d 61 74  .db 3287 [format
1810: 20 25 30 32 78 20 30 78 33 62 5d 0a 20 20 68 65   %02x 0x3b].  he
1820: 78 69 6f 5f 77 72 69 74 65 20 74 65 73 74 2e 64  xio_write test.d
1830: 62 20 32 35 36 34 20 5b 66 6f 72 6d 61 74 20 25  b 2564 [format %
1840: 30 32 78 20 30 78 65 64 5d 0a 20 20 68 65 78 69  02x 0xed].  hexi
1850: 6f 5f 77 72 69 74 65 20 74 65 73 74 2e 64 62 20  o_write test.db 
1860: 32 31 33 39 20 5b 66 6f 72 6d 61 74 20 25 30 32  2139 [format %02
1870: 78 20 30 78 35 35 5d 0a 0a 20 20 73 71 6c 69 74  x 0x55]..  sqlit
1880: 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20  e3 db test.db.  
1890: 63 61 74 63 68 73 71 6c 20 7b 42 45 47 49 4e 3b  catchsql {BEGIN;
18a0: 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 20   DELETE FROM t1 
18b0: 57 48 45 52 45 20 78 3e 31 33 3b 20 52 4f 4c 4c  WHERE x>13; ROLL
18c0: 42 41 43 4b 3b 7d 0a 7d 20 7b 31 20 7b 64 61 74  BACK;}.} {1 {dat
18d0: 61 62 61 73 65 20 64 69 73 6b 20 69 6d 61 67 65  abase disk image
18e0: 20 69 73 20 6d 61 6c 66 6f 72 6d 65 64 7d 7d 0a   is malformed}}.
18f0: 7d 0a 0a 23 20 63 6f 72 72 75 70 74 69 6f 6e 20  }..# corruption 
1900: 28 73 65 65 64 20 31 37 30 34 33 34 29 0a 23 0a  (seed 170434).#.
1910: 23 20 55 50 44 41 54 45 3a 20 50 72 69 6f 72 20  # UPDATE: Prior 
1920: 74 6f 20 33 2e 38 2e 32 2c 20 74 68 69 73 20 75  to 3.8.2, this u
1930: 73 65 64 20 74 6f 20 72 65 74 75 72 6e 20 53 51  sed to return SQ
1940: 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 20 49 74  LITE_CORRUPT. It
1950: 20 6e 6f 20 6c 6f 6e 67 65 72 0a 23 20 64 6f 65   no longer.# doe
1960: 73 2e 20 54 68 61 74 20 69 73 20 4f 6b 2c 20 74  s. That is Ok, t
1970: 68 65 20 70 6f 69 6e 74 20 6f 66 20 74 68 65 73  he point of thes
1980: 65 20 74 65 73 74 73 20 69 73 20 74 6f 20 76 65  e tests is to ve
1990: 72 69 66 79 20 74 68 61 74 20 6e 6f 20 62 75 66  rify that no buf
19a0: 66 65 72 0a 23 20 6f 76 65 72 72 75 6e 73 20 6f  fer.# overruns o
19b0: 72 20 6f 76 65 72 72 65 61 64 73 20 63 61 6e 20  r overreads can 
19c0: 62 65 20 63 61 75 73 65 64 20 62 79 20 63 6f 72  be caused by cor
19d0: 72 75 70 74 20 64 61 74 61 62 61 73 65 73 2e 0a  rupt databases..
19e0: 64 6f 5f 74 65 73 74 20 63 6f 72 72 75 70 74 43  do_test corruptC
19f0: 2d 32 2e 39 20 7b 0a 20 20 64 62 20 63 6c 6f 73  -2.9 {.  db clos
1a00: 65 0a 20 20 66 6f 72 63 65 63 6f 70 79 20 74 65  e.  forcecopy te
1a10: 73 74 2e 62 75 20 74 65 73 74 2e 64 62 0a 0a 20  st.bu test.db.. 
1a20: 20 23 20 69 6e 73 65 72 74 20 63 6f 72 72 75 70   # insert corrup
1a30: 74 20 62 79 74 65 28 73 29 0a 20 20 68 65 78 69  t byte(s).  hexi
1a40: 6f 5f 77 72 69 74 65 20 74 65 73 74 2e 64 62 20  o_write test.db 
1a50: 32 30 39 35 20 5b 66 6f 72 6d 61 74 20 25 30 32  2095 [format %02
1a60: 78 20 30 78 64 36 5d 0a 0a 20 20 73 71 6c 69 74  x 0xd6]..  sqlit
1a70: 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20  e3 db test.db.  
1a80: 63 61 74 63 68 73 71 6c 20 7b 42 45 47 49 4e 3b  catchsql {BEGIN;
1a90: 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 20   DELETE FROM t1 
1aa0: 57 48 45 52 45 20 78 3e 31 33 3b 20 52 4f 4c 4c  WHERE x>13; ROLL
1ab0: 42 41 43 4b 3b 7d 0a 7d 20 7b 30 20 7b 7d 7d 0a  BACK;}.} {0 {}}.
1ac0: 0a 23 20 63 6f 72 72 75 70 74 69 6f 6e 20 28 73  .# corruption (s
1ad0: 65 65 64 20 31 38 36 35 30 34 29 0a 64 6f 5f 74  eed 186504).do_t
1ae0: 65 73 74 20 63 6f 72 72 75 70 74 43 2d 32 2e 31  est corruptC-2.1
1af0: 30 20 7b 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20  0 {.  db close. 
1b00: 20 66 6f 72 63 65 63 6f 70 79 20 74 65 73 74 2e   forcecopy test.
1b10: 62 75 20 74 65 73 74 2e 64 62 0a 0a 20 20 23 20  bu test.db..  # 
1b20: 69 6e 73 65 72 74 20 63 6f 72 72 75 70 74 20 62  insert corrupt b
1b30: 79 74 65 28 73 29 0a 20 20 68 65 78 69 6f 5f 77  yte(s).  hexio_w
1b40: 72 69 74 65 20 74 65 73 74 2e 64 62 20 33 31 33  rite test.db 313
1b50: 30 20 5b 66 6f 72 6d 61 74 20 25 30 32 78 20 30  0 [format %02x 0
1b60: 78 30 32 5d 0a 20 20 0a 20 20 73 71 6c 69 74 65  x02].  .  sqlite
1b70: 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20 63  3 db test.db.  c
1b80: 61 74 63 68 73 71 6c 20 7b 42 45 47 49 4e 3b 20  atchsql {BEGIN; 
1b90: 55 50 44 41 54 45 20 74 32 20 53 45 54 20 79 3d  UPDATE t2 SET y=
1ba0: 27 61 62 63 64 65 66 2d 75 76 77 78 79 7a 27 3b  'abcdef-uvwxyz';
1bb0: 20 52 4f 4c 4c 42 41 43 4b 3b 7d 0a 7d 20 7b 31   ROLLBACK;}.} {1
1bc0: 20 7b 64 61 74 61 62 61 73 65 20 64 69 73 6b 20   {database disk 
1bd0: 69 6d 61 67 65 20 69 73 20 6d 61 6c 66 6f 72 6d  image is malform
1be0: 65 64 7d 7d 0a 0a 23 20 63 6f 72 72 75 70 74 69  ed}}..# corrupti
1bf0: 6f 6e 20 28 73 65 65 64 20 31 35 38 39 29 0a 64  on (seed 1589).d
1c00: 6f 5f 74 65 73 74 20 63 6f 72 72 75 70 74 43 2d  o_test corruptC-
1c10: 32 2e 31 31 20 7b 0a 20 20 64 62 20 63 6c 6f 73  2.11 {.  db clos
1c20: 65 0a 20 20 66 6f 72 63 65 63 6f 70 79 20 74 65  e.  forcecopy te
1c30: 73 74 2e 62 75 20 74 65 73 74 2e 64 62 0a 0a 20  st.bu test.db.. 
1c40: 20 23 20 69 6e 73 65 72 74 20 63 6f 72 72 75 70   # insert corrup
1c50: 74 20 62 79 74 65 28 73 29 0a 20 20 68 65 78 69  t byte(s).  hexi
1c60: 6f 5f 77 72 69 74 65 20 74 65 73 74 2e 64 62 20  o_write test.db 
1c70: 35 35 20 5b 66 6f 72 6d 61 74 20 25 30 32 78 20  55 [format %02x 
1c80: 30 78 61 37 5d 0a 20 20 0a 20 20 73 71 6c 69 74  0xa7].  .  sqlit
1c90: 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20  e3 db test.db.  
1ca0: 63 61 74 63 68 73 71 6c 20 7b 42 45 47 49 4e 3b  catchsql {BEGIN;
1cb0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 33   CREATE TABLE t3
1cc0: 20 41 53 20 53 45 4c 45 43 54 20 78 2c 33 20 61   AS SELECT x,3 a
1cd0: 73 20 79 20 46 52 4f 4d 20 74 32 20 57 48 45 52  s y FROM t2 WHER
1ce0: 45 20 72 6f 77 69 64 25 35 21 3d 30 3b 20 52 4f  E rowid%5!=0; RO
1cf0: 4c 4c 42 41 43 4b 3b 7d 0a 7d 20 7b 31 20 7b 64  LLBACK;}.} {1 {d
1d00: 61 74 61 62 61 73 65 20 64 69 73 6b 20 69 6d 61  atabase disk ima
1d10: 67 65 20 69 73 20 6d 61 6c 66 6f 72 6d 65 64 7d  ge is malformed}
1d20: 7d 0a 0a 23 20 63 6f 72 72 75 70 74 69 6f 6e 20  }..# corruption 
1d30: 28 73 65 65 64 20 31 34 31 36 36 29 0a 64 6f 5f  (seed 14166).do_
1d40: 74 65 73 74 20 63 6f 72 72 75 70 74 43 2d 32 2e  test corruptC-2.
1d50: 31 32 20 7b 0a 20 20 64 62 20 63 6c 6f 73 65 0a  12 {.  db close.
1d60: 20 20 66 6f 72 63 65 63 6f 70 79 20 74 65 73 74    forcecopy test
1d70: 2e 62 75 20 74 65 73 74 2e 64 62 0a 0a 20 20 23  .bu test.db..  #
1d80: 20 69 6e 73 65 72 74 20 63 6f 72 72 75 70 74 20   insert corrupt 
1d90: 62 79 74 65 28 73 29 0a 20 20 68 65 78 69 6f 5f  byte(s).  hexio_
1da0: 77 72 69 74 65 20 74 65 73 74 2e 64 62 20 39 37  write test.db 97
1db0: 34 20 5b 66 6f 72 6d 61 74 20 25 30 32 78 20 30  4 [format %02x 0
1dc0: 78 32 65 5d 0a 20 20 0a 20 20 73 71 6c 69 74 65  x2e].  .  sqlite
1dd0: 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20 63  3 db test.db.  c
1de0: 61 74 63 68 73 71 6c 20 7b 53 45 4c 45 43 54 20  atchsql {SELECT 
1df0: 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 73 71  count(*) FROM sq
1e00: 6c 69 74 65 5f 6d 61 73 74 65 72 3b 7d 0a 7d 20  lite_master;}.} 
1e10: 7b 31 20 7b 6d 61 6c 66 6f 72 6d 65 64 20 64 61  {1 {malformed da
1e20: 74 61 62 61 73 65 20 73 63 68 65 6d 61 20 28 74  tabase schema (t
1e30: 31 69 31 29 20 2d 20 63 6f 72 72 75 70 74 20 64  1i1) - corrupt d
1e40: 61 74 61 62 61 73 65 7d 7d 0a 0a 23 20 63 6f 72  atabase}}..# cor
1e50: 72 75 70 74 69 6f 6e 20 28 73 65 65 64 20 32 31  ruption (seed 21
1e60: 38 38 30 33 29 0a 64 6f 5f 74 65 73 74 20 63 6f  8803).do_test co
1e70: 72 72 75 70 74 43 2d 32 2e 31 33 20 7b 0a 20 20  rruptC-2.13 {.  
1e80: 64 62 20 63 6c 6f 73 65 0a 20 20 66 6f 72 63 65  db close.  force
1e90: 63 6f 70 79 20 74 65 73 74 2e 62 75 20 74 65 73  copy test.bu tes
1ea0: 74 2e 64 62 0a 0a 20 20 23 20 69 6e 73 65 72 74  t.db..  # insert
1eb0: 20 63 6f 72 72 75 70 74 20 62 79 74 65 28 73 29   corrupt byte(s)
1ec0: 0a 20 20 68 65 78 69 6f 5f 77 72 69 74 65 20 74  .  hexio_write t
1ed0: 65 73 74 2e 64 62 20 31 30 32 20 5b 66 6f 72 6d  est.db 102 [form
1ee0: 61 74 20 25 30 32 78 20 30 78 31 32 5d 0a 20 20  at %02x 0x12].  
1ef0: 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 74 65  .  sqlite3 db te
1f00: 73 74 2e 64 62 0a 20 20 63 61 74 63 68 73 71 6c  st.db.  catchsql
1f10: 20 7b 42 45 47 49 4e 3b 20 43 52 45 41 54 45 20   {BEGIN; CREATE 
1f20: 54 41 42 4c 45 20 74 33 20 41 53 20 53 45 4c 45  TABLE t3 AS SELE
1f30: 43 54 20 78 2c 33 20 61 73 20 79 20 46 52 4f 4d  CT x,3 as y FROM
1f40: 20 74 32 20 57 48 45 52 45 20 72 6f 77 69 64 25   t2 WHERE rowid%
1f50: 35 21 3d 30 3b 20 52 4f 4c 4c 42 41 43 4b 3b 7d  5!=0; ROLLBACK;}
1f60: 0a 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20  .} {1 {database 
1f70: 64 69 73 6b 20 69 6d 61 67 65 20 69 73 20 6d 61  disk image is ma
1f80: 6c 66 6f 72 6d 65 64 7d 7d 0a 0a 64 6f 5f 74 65  lformed}}..do_te
1f90: 73 74 20 63 6f 72 72 75 70 74 43 2d 32 2e 31 34  st corruptC-2.14
1fa0: 20 7b 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20   {.  db close.  
1fb0: 66 6f 72 63 65 63 6f 70 79 20 74 65 73 74 2e 62  forcecopy test.b
1fc0: 75 20 74 65 73 74 2e 64 62 0a 0a 20 20 73 71 6c  u test.db..  sql
1fd0: 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a  ite3 db test.db.
1fe0: 20 20 73 65 74 20 62 6c 6f 62 20 5b 73 74 72 69    set blob [stri
1ff0: 6e 67 20 72 65 70 65 61 74 20 61 62 63 64 65 66  ng repeat abcdef
2000: 67 68 69 6a 20 31 30 30 30 30 5d 0a 20 20 65 78  ghij 10000].  ex
2010: 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49  ecsql { INSERT I
2020: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 20 28 31  NTO t1 VALUES (1
2030: 2c 20 24 62 6c 6f 62 29 20 7d 0a 0a 20 20 73 71  , $blob) }..  sq
2040: 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62  lite3 db test.db
2050: 0a 20 20 73 65 74 20 66 69 6c 65 73 69 7a 65 20  .  set filesize 
2060: 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e  [file size test.
2070: 64 62 5d 0a 20 20 68 65 78 69 6f 5f 77 72 69 74  db].  hexio_writ
2080: 65 20 74 65 73 74 2e 64 62 20 5b 65 78 70 72 20  e test.db [expr 
2090: 24 66 69 6c 65 73 69 7a 65 2d 32 30 34 38 5d 20  $filesize-2048] 
20a0: 30 30 30 30 30 30 30 31 0a 20 20 63 61 74 63 68  00000001.  catch
20b0: 73 71 6c 20 7b 44 45 4c 45 54 45 20 46 52 4f 4d  sql {DELETE FROM
20c0: 20 74 31 20 57 48 45 52 45 20 72 6f 77 69 64 20   t1 WHERE rowid 
20d0: 3d 20 28 53 45 4c 45 43 54 20 6d 61 78 28 72 6f  = (SELECT max(ro
20e0: 77 69 64 29 20 46 52 4f 4d 20 74 31 29 7d 0a 7d  wid) FROM t1)}.}
20f0: 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20 64 69   {1 {database di
2100: 73 6b 20 69 6d 61 67 65 20 69 73 20 6d 61 6c 66  sk image is malf
2110: 6f 72 6d 65 64 7d 7d 0a 0a 23 20 41 74 20 6f 6e  ormed}}..# At on
2120: 65 20 70 6f 69 6e 74 20 74 68 69 73 20 70 61 72  e point this par
2130: 74 69 63 75 6c 61 72 20 63 6f 72 72 75 70 74 20  ticular corrupt 
2140: 64 61 74 61 62 61 73 65 20 77 61 73 20 63 61 75  database was cau
2150: 73 69 6e 67 20 61 20 62 75 66 66 65 72 0a 23 20  sing a buffer.# 
2160: 6f 76 65 72 72 65 61 64 2e 20 57 68 69 63 68 20  overread. Which 
2170: 63 61 75 73 65 64 20 61 20 63 72 61 73 68 20 69  caused a crash i
2180: 6e 20 61 20 72 75 6e 20 6f 66 20 61 6c 6c 2e 74  n a run of all.t
2190: 65 73 74 20 6f 6e 63 65 2e 0a 23 0a 64 6f 5f 74  est once..#.do_t
21a0: 65 73 74 20 63 6f 72 72 75 70 74 43 2d 32 2e 31  est corruptC-2.1
21b0: 35 20 7b 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20  5 {.  db close. 
21c0: 20 66 6f 72 63 65 63 6f 70 79 20 74 65 73 74 2e   forcecopy test.
21d0: 62 75 20 74 65 73 74 2e 64 62 0a 20 20 68 65 78  bu test.db.  hex
21e0: 69 6f 5f 77 72 69 74 65 20 74 65 73 74 2e 64 62  io_write test.db
21f0: 20 39 38 36 20 62 39 0a 20 20 73 71 6c 69 74 65   986 b9.  sqlite
2200: 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20 63  3 db test.db.  c
2210: 61 74 63 68 73 71 6c 20 7b 53 45 4c 45 43 54 20  atchsql {SELECT 
2220: 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 73 71  count(*) FROM sq
2230: 6c 69 74 65 5f 6d 61 73 74 65 72 3b 7d 0a 7d 20  lite_master;}.} 
2240: 7b 31 20 7b 64 61 74 61 62 61 73 65 20 64 69 73  {1 {database dis
2250: 6b 20 69 6d 61 67 65 20 69 73 20 6d 61 6c 66 6f  k image is malfo
2260: 72 6d 65 64 7d 7d 0a 0a 23 0a 23 20 4e 6f 77 20  rmed}}..#.# Now 
2270: 74 65 73 74 20 66 6f 72 20 61 20 73 65 72 69 65  test for a serie
2280: 73 20 6f 66 20 71 75 61 73 69 2d 72 61 6e 64 6f  s of quasi-rando
2290: 6d 20 73 65 65 64 73 2e 0a 23 20 57 65 20 6c 6f  m seeds..# We lo
22a0: 6f 70 20 6f 76 65 72 20 74 68 65 20 65 6e 74 69  op over the enti
22b0: 72 65 20 66 69 6c 65 20 73 69 7a 65 20 61 6e 64  re file size and
22c0: 20 74 6f 75 63 68 0a 23 20 65 61 63 68 20 62 79   touch.# each by
22d0: 74 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 63 65  te at least once
22e0: 2e 0a 66 6f 72 20 7b 73 65 74 20 74 6e 20 30 7d  ..for {set tn 0}
22f0: 20 7b 24 74 6e 3c 24 66 73 69 7a 65 7d 20 7b 69   {$tn<$fsize} {i
2300: 6e 63 72 20 74 6e 20 31 7d 20 7b 0a 0a 20 20 23  ncr tn 1} {..  #
2310: 20 73 65 74 75 70 20 66 6f 72 20 74 65 73 74 0a   setup for test.
2320: 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 66 6f 72    db close.  for
2330: 63 65 63 6f 70 79 20 74 65 73 74 2e 62 75 20 74  cecopy test.bu t
2340: 65 73 74 2e 64 62 0a 20 20 73 71 6c 69 74 65 33  est.db.  sqlite3
2350: 20 64 62 20 74 65 73 74 2e 64 62 0a 0a 20 20 23   db test.db..  #
2360: 20 53 65 65 6b 20 74 6f 20 61 20 72 61 6e 64 6f   Seek to a rando
2370: 6d 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68  m location in th
2380: 65 20 66 69 6c 65 2c 20 61 6e 64 20 77 72 69 74  e file, and writ
2390: 65 20 61 20 72 61 6e 64 6f 6d 20 73 69 6e 67 6c  e a random singl
23a0: 65 20 62 79 74 65 0a 20 20 23 20 76 61 6c 75 65  e byte.  # value
23b0: 2e 20 20 54 68 65 6e 20 64 6f 20 76 61 72 69 6f  .  Then do vario
23c0: 75 73 20 6f 70 65 72 61 74 69 6f 6e 73 20 6f 6e  us operations on
23d0: 20 74 68 65 20 66 69 6c 65 20 74 6f 20 6d 61 6b   the file to mak
23e0: 65 20 73 75 72 65 20 74 68 61 74 0a 20 20 23 20  e sure that.  # 
23f0: 74 68 65 20 64 61 74 61 62 61 73 65 20 65 6e 67  the database eng
2400: 69 6e 65 20 63 61 6e 20 68 61 6e 64 6c 65 20 74  ine can handle t
2410: 68 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 67 72  he corruption gr
2420: 61 63 65 66 75 6c 6c 79 2e 0a 20 20 23 0a 20 20  acefully..  #.  
2430: 73 65 74 20 6c 61 73 74 20 30 0a 20 20 66 6f 72  set last 0.  for
2440: 20 7b 73 65 74 20 69 20 31 7d 20 7b 24 69 3c 3d   {set i 1} {$i<=
2450: 35 31 32 20 26 26 20 21 24 6c 61 73 74 7d 20 7b  512 && !$last} {
2460: 69 6e 63 72 20 69 20 31 7d 20 7b 0a 0a 20 20 20  incr i 1} {..   
2470: 20 64 62 20 63 6c 6f 73 65 0a 20 20 20 20 69 66   db close.    if
2480: 20 7b 24 69 3d 3d 31 7d 20 7b 0a 20 20 20 20 20   {$i==1} {.     
2490: 20 23 20 6f 6e 20 74 68 65 20 66 69 72 73 74 20   # on the first 
24a0: 63 6f 72 72 75 70 74 20 76 61 6c 75 65 2c 20 75  corrupt value, u
24b0: 73 65 20 6c 6f 63 61 74 69 6f 6e 20 24 74 6e 0a  se location $tn.
24c0: 20 20 20 20 20 20 23 20 74 68 69 73 20 65 6e 73        # this ens
24d0: 75 72 65 73 20 74 68 61 74 20 77 65 20 74 6f 75  ures that we tou
24e0: 63 68 20 65 61 63 68 20 6c 6f 63 61 74 69 6f 6e  ch each location
24f0: 20 69 6e 20 74 68 65 20 0a 20 20 20 20 20 20 23   in the .      #
2500: 20 66 69 6c 65 20 61 74 20 6c 65 61 73 74 20 6f   file at least o
2510: 6e 63 65 2e 0a 20 20 20 20 20 20 73 65 74 20 72  nce..      set r
2520: 6f 66 66 73 65 74 20 24 74 6e 0a 20 20 20 20 7d  offset $tn.    }
2530: 20 65 6c 73 65 20 7b 20 0a 20 20 20 20 20 20 23   else { .      #
2540: 20 69 6e 73 65 72 74 20 72 61 6e 64 6f 6d 20 62   insert random b
2550: 79 74 65 20 61 74 20 72 61 6e 64 6f 6d 20 6c 6f  yte at random lo
2560: 63 61 74 69 6f 6e 0a 20 20 20 20 20 20 73 65 74  cation.      set
2570: 20 72 6f 66 66 73 65 74 20 5b 72 61 6e 64 6f 6d   roffset [random
2580: 20 24 66 73 69 7a 65 5d 0a 20 20 20 20 7d 0a 20   $fsize].    }. 
2590: 20 20 20 73 65 74 20 72 62 79 74 65 20 5b 66 6f     set rbyte [fo
25a0: 72 6d 61 74 20 25 30 32 78 20 5b 72 61 6e 64 6f  rmat %02x [rando
25b0: 6d 20 32 35 35 5d 5d 0a 0a 20 20 20 20 23 20 59  m 255]]..    # Y
25c0: 6f 75 20 63 61 6e 20 75 6e 63 6f 6d 6d 65 6e 74  ou can uncomment
25d0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   the following t
25e0: 6f 20 68 61 76 65 20 69 74 20 74 72 61 63 65 0a  o have it trace.
25f0: 20 20 20 20 23 20 65 78 61 63 74 6c 79 20 68 6f      # exactly ho
2600: 77 20 69 74 27 73 20 63 6f 72 72 75 70 74 69 6e  w it's corruptin
2610: 67 20 74 68 65 20 66 69 6c 65 2e 20 20 54 68 69  g the file.  Thi
2620: 73 20 69 73 20 0a 20 20 20 20 23 20 75 73 65 66  s is .    # usef
2630: 75 6c 20 66 6f 72 20 67 65 6e 65 72 61 74 69 6e  ul for generatin
2640: 67 20 74 68 65 20 22 73 65 65 64 20 73 70 65 63  g the "seed spec
2650: 69 66 69 63 22 20 74 65 73 74 73 0a 20 20 20 20  ific" tests.    
2660: 23 20 61 62 6f 76 65 2e 0a 20 20 20 20 23 20 73  # above..    # s
2670: 65 74 20 72 6c 69 6e 65 20 22 24 72 6f 66 66 73  et rline "$roffs
2680: 65 74 20 24 72 62 79 74 65 22 0a 20 20 20 20 23  et $rbyte".    #
2690: 20 70 75 74 73 20 73 74 64 6f 75 74 20 24 72 6c   puts stdout $rl
26a0: 69 6e 65 0a 0a 20 20 20 20 68 65 78 69 6f 5f 77  ine..    hexio_w
26b0: 72 69 74 65 20 74 65 73 74 2e 64 62 20 24 72 6f  rite test.db $ro
26c0: 66 66 73 65 74 20 24 72 62 79 74 65 0a 20 20 20  ffset $rbyte.   
26d0: 20 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74   sqlite3 db test
26e0: 2e 64 62 0a 0a 20 20 20 20 23 20 64 6f 20 61 20  .db..    # do a 
26f0: 66 65 77 20 72 61 6e 64 6f 6d 20 6f 70 65 72 61  few random opera
2700: 74 69 6f 6e 73 20 74 6f 20 6d 61 6b 65 20 73 75  tions to make su
2710: 72 65 20 74 68 61 74 20 69 66 20 0a 20 20 20 20  re that if .    
2720: 23 20 74 68 65 79 20 65 72 72 6f 72 2c 20 74 68  # they error, th
2730: 65 79 20 65 72 72 6f 72 20 67 72 61 63 65 66 75  ey error gracefu
2740: 6c 6c 79 20 69 6e 73 74 65 61 64 20 6f 66 20 63  lly instead of c
2750: 72 61 73 68 69 6e 67 2e 0a 20 20 20 20 64 6f 5f  rashing..    do_
2760: 74 65 73 74 20 63 6f 72 72 75 70 74 43 2d 33 2e  test corruptC-3.
2770: 24 74 6e 2e 28 24 71 73 65 65 64 29 2e 24 69 2e  $tn.($qseed).$i.
2780: 31 20 7b 0a 20 20 20 20 20 20 63 61 74 63 68 73  1 {.      catchs
2790: 71 6c 20 7b 53 45 4c 45 43 54 20 63 6f 75 6e 74  ql {SELECT count
27a0: 28 2a 29 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  (*) FROM sqlite_
27b0: 6d 61 73 74 65 72 7d 0a 20 20 20 20 20 20 73 65  master}.      se
27c0: 74 20 78 20 7b 7d 0a 20 20 20 20 7d 20 7b 7d 0a  t x {}.    } {}.
27d0: 20 20 20 20 64 6f 5f 74 65 73 74 20 63 6f 72 72      do_test corr
27e0: 75 70 74 43 2d 33 2e 24 74 6e 2e 28 24 71 73 65  uptC-3.$tn.($qse
27f0: 65 64 29 2e 24 69 2e 32 20 7b 0a 20 20 20 20 20  ed).$i.2 {.     
2800: 20 63 61 74 63 68 73 71 6c 20 7b 53 45 4c 45 43   catchsql {SELEC
2810: 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
2820: 74 31 7d 0a 20 20 20 20 20 20 73 65 74 20 78 20  t1}.      set x 
2830: 7b 7d 0a 20 20 20 20 7d 20 7b 7d 0a 20 20 20 20  {}.    } {}.    
2840: 64 6f 5f 74 65 73 74 20 63 6f 72 72 75 70 74 43  do_test corruptC
2850: 2d 33 2e 24 74 6e 2e 28 24 71 73 65 65 64 29 2e  -3.$tn.($qseed).
2860: 24 69 2e 33 20 7b 0a 20 20 20 20 20 20 63 61 74  $i.3 {.      cat
2870: 63 68 73 71 6c 20 7b 53 45 4c 45 43 54 20 63 6f  chsql {SELECT co
2880: 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31 20 57  unt(*) FROM t1 W
2890: 48 45 52 45 20 78 3e 31 33 7d 0a 20 20 20 20 20  HERE x>13}.     
28a0: 20 73 65 74 20 78 20 7b 7d 0a 20 20 20 20 7d 20   set x {}.    } 
28b0: 7b 7d 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 63  {}.    do_test c
28c0: 6f 72 72 75 70 74 43 2d 33 2e 24 74 6e 2e 28 24  orruptC-3.$tn.($
28d0: 71 73 65 65 64 29 2e 24 69 2e 34 20 7b 0a 20 20  qseed).$i.4 {.  
28e0: 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b 53 45      catchsql {SE
28f0: 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
2900: 4f 4d 20 74 32 7d 0a 20 20 20 20 20 20 73 65 74  OM t2}.      set
2910: 20 78 20 7b 7d 0a 20 20 20 20 7d 20 7b 7d 0a 20   x {}.    } {}. 
2920: 20 20 20 64 6f 5f 74 65 73 74 20 63 6f 72 72 75     do_test corru
2930: 70 74 43 2d 33 2e 24 74 6e 2e 28 24 71 73 65 65  ptC-3.$tn.($qsee
2940: 64 29 2e 24 69 2e 35 20 7b 0a 20 20 20 20 20 20  d).$i.5 {.      
2950: 63 61 74 63 68 73 71 6c 20 7b 53 45 4c 45 43 54  catchsql {SELECT
2960: 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74   count(*) FROM t
2970: 32 20 57 48 45 52 45 20 78 3c 31 33 7d 0a 20 20  2 WHERE x<13}.  
2980: 20 20 20 20 73 65 74 20 78 20 7b 7d 0a 20 20 20      set x {}.   
2990: 20 7d 20 7b 7d 0a 20 20 20 20 64 6f 5f 74 65 73   } {}.    do_tes
29a0: 74 20 63 6f 72 72 75 70 74 43 2d 33 2e 24 74 6e  t corruptC-3.$tn
29b0: 2e 28 24 71 73 65 65 64 29 2e 24 69 2e 36 20 7b  .($qseed).$i.6 {
29c0: 0a 20 20 20 20 20 20 63 61 74 63 68 73 71 6c 20  .      catchsql 
29d0: 7b 42 45 47 49 4e 3b 20 55 50 44 41 54 45 20 74  {BEGIN; UPDATE t
29e0: 31 20 53 45 54 20 79 3d 31 3b 20 52 4f 4c 4c 42  1 SET y=1; ROLLB
29f0: 41 43 4b 3b 7d 0a 20 20 20 20 20 20 73 65 74 20  ACK;}.      set 
2a00: 78 20 7b 7d 0a 20 20 20 20 7d 20 7b 7d 0a 20 20  x {}.    } {}.  
2a10: 20 20 64 6f 5f 74 65 73 74 20 63 6f 72 72 75 70    do_test corrup
2a20: 74 43 2d 33 2e 24 74 6e 2e 28 24 71 73 65 65 64  tC-3.$tn.($qseed
2a30: 29 2e 24 69 2e 37 20 7b 0a 20 20 20 20 20 20 63  ).$i.7 {.      c
2a40: 61 74 63 68 73 71 6c 20 7b 42 45 47 49 4e 3b 20  atchsql {BEGIN; 
2a50: 55 50 44 41 54 45 20 74 32 20 53 45 54 20 79 3d  UPDATE t2 SET y=
2a60: 27 61 62 63 64 65 66 2d 75 76 77 78 79 7a 27 3b  'abcdef-uvwxyz';
2a70: 20 52 4f 4c 4c 42 41 43 4b 3b 7d 0a 20 20 20 20   ROLLBACK;}.    
2a80: 20 20 73 65 74 20 78 20 7b 7d 0a 20 20 20 20 7d    set x {}.    }
2a90: 20 7b 7d 0a 20 20 20 20 64 6f 5f 74 65 73 74 20   {}.    do_test 
2aa0: 63 6f 72 72 75 70 74 43 2d 33 2e 24 74 6e 2e 28  corruptC-3.$tn.(
2ab0: 24 71 73 65 65 64 29 2e 24 69 2e 38 20 7b 0a 20  $qseed).$i.8 {. 
2ac0: 20 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b 42       catchsql {B
2ad0: 45 47 49 4e 3b 20 44 45 4c 45 54 45 20 46 52 4f  EGIN; DELETE FRO
2ae0: 4d 20 74 31 20 57 48 45 52 45 20 78 3e 31 33 3b  M t1 WHERE x>13;
2af0: 20 52 4f 4c 4c 42 41 43 4b 3b 7d 0a 20 20 20 20   ROLLBACK;}.    
2b00: 20 20 73 65 74 20 78 20 7b 7d 0a 20 20 20 20 7d    set x {}.    }
2b10: 20 7b 7d 0a 20 20 20 20 64 6f 5f 74 65 73 74 20   {}.    do_test 
2b20: 63 6f 72 72 75 70 74 43 2d 33 2e 24 74 6e 2e 28  corruptC-3.$tn.(
2b30: 24 71 73 65 65 64 29 2e 24 69 2e 39 20 7b 0a 20  $qseed).$i.9 {. 
2b40: 20 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b 42       catchsql {B
2b50: 45 47 49 4e 3b 20 44 45 4c 45 54 45 20 46 52 4f  EGIN; DELETE FRO
2b60: 4d 20 74 32 20 57 48 45 52 45 20 78 3c 31 33 3b  M t2 WHERE x<13;
2b70: 20 52 4f 4c 4c 42 41 43 4b 3b 7d 0a 20 20 20 20   ROLLBACK;}.    
2b80: 20 20 73 65 74 20 78 20 7b 7d 0a 20 20 20 20 7d    set x {}.    }
2b90: 20 7b 7d 0a 20 20 20 20 64 6f 5f 74 65 73 74 20   {}.    do_test 
2ba0: 63 6f 72 72 75 70 74 43 2d 33 2e 24 74 6e 2e 28  corruptC-3.$tn.(
2bb0: 24 71 73 65 65 64 29 2e 24 69 2e 31 30 20 7b 0a  $qseed).$i.10 {.
2bc0: 20 20 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b        catchsql {
2bd0: 42 45 47 49 4e 3b 20 43 52 45 41 54 45 20 54 41  BEGIN; CREATE TA
2be0: 42 4c 45 20 74 33 20 41 53 20 53 45 4c 45 43 54  BLE t3 AS SELECT
2bf0: 20 78 2c 33 20 61 73 20 79 20 46 52 4f 4d 20 74   x,3 as y FROM t
2c00: 32 20 57 48 45 52 45 20 72 6f 77 69 64 25 35 21  2 WHERE rowid%5!
2c10: 3d 30 3b 20 52 4f 4c 4c 42 41 43 4b 3b 7d 0a 20  =0; ROLLBACK;}. 
2c20: 20 20 20 20 20 73 65 74 20 78 20 7b 7d 0a 20 20       set x {}.  
2c30: 20 20 7d 20 7b 7d 0a 0a 20 20 20 20 23 20 63 68    } {}..    # ch
2c40: 65 63 6b 20 74 68 65 20 69 6e 74 65 67 72 69 74  eck the integrit
2c50: 79 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  y of the databas
2c60: 65 2e 0a 20 20 20 20 23 20 6f 6e 63 65 20 74 68  e..    # once th
2c70: 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20  e corruption is 
2c80: 64 65 74 65 63 74 65 64 2c 20 77 65 20 63 61 6e  detected, we can
2c90: 20 73 74 6f 70 2e 0a 20 20 20 20 69 66 63 61 70   stop..    ifcap
2ca0: 61 62 6c 65 20 7b 69 6e 74 65 67 72 69 74 79 63  able {integrityc
2cb0: 6b 7d 20 7b 0a 20 20 20 20 20 20 73 65 74 20 72  k} {.      set r
2cc0: 65 73 20 5b 20 63 61 74 63 68 73 71 6c 20 7b 50  es [ catchsql {P
2cd0: 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f  RAGMA integrity_
2ce0: 63 68 65 63 6b 7d 20 5d 0a 20 20 20 20 20 20 73  check} ].      s
2cf0: 65 74 20 61 6e 73 20 5b 6c 69 6e 64 65 78 20 24  et ans [lindex $
2d00: 72 65 73 20 31 5d 0a 20 20 20 20 20 20 69 66 20  res 1].      if 
2d10: 7b 20 5b 20 73 74 72 69 6e 67 20 63 6f 6d 70 61  { [ string compa
2d20: 72 65 20 24 61 6e 73 20 22 6f 6b 22 20 5d 20 21  re $ans "ok" ] !
2d30: 3d 20 30 20 7d 20 7b 0a 20 20 20 20 20 20 20 20  = 0 } {.        
2d40: 73 65 74 20 6c 61 73 74 20 2d 31 0a 20 20 20 20  set last -1.    
2d50: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 23 20    }.    }.    # 
2d60: 69 66 20 77 65 20 61 72 65 20 6e 6f 74 20 63 61  if we are not ca
2d70: 70 61 62 6c 65 20 6f 66 20 64 6f 69 6e 67 20 61  pable of doing a
2d80: 6e 20 69 6e 74 65 67 72 69 74 79 20 63 68 65 63  n integrity chec
2d90: 6b 2c 0a 20 20 20 20 23 20 73 74 6f 70 20 61 66  k,.    # stop af
2da0: 74 65 72 20 63 6f 72 72 75 70 74 69 6e 67 20 35  ter corrupting 5
2db0: 20 62 79 74 65 73 2e 0a 20 20 20 20 69 66 63 61   bytes..    ifca
2dc0: 70 61 62 6c 65 20 7b 21 69 6e 74 65 67 72 69 74  pable {!integrit
2dd0: 79 63 6b 7d 20 7b 0a 20 20 20 20 20 20 69 66 20  yck} {.      if 
2de0: 7b 20 24 69 20 3e 20 35 20 7d 20 7b 0a 20 20 20  { $i > 5 } {.   
2df0: 20 20 20 20 20 73 65 74 20 6c 61 73 74 20 2d 31       set last -1
2e00: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
2e10: 20 20 20 20 23 20 43 68 65 63 6b 20 74 68 61 74      # Check that
2e20: 20 6e 6f 20 70 61 67 65 20 72 65 66 65 72 65 6e   no page referen
2e30: 63 65 73 20 77 65 72 65 20 6c 65 61 6b 65 64 2e  ces were leaked.
2e40: 0a 20 20 20 20 23 20 54 42 44 3a 20 20 6e 65 65  .    # TBD:  nee
2e50: 64 20 74 6f 20 66 69 67 75 72 65 20 6f 75 74 20  d to figure out 
2e60: 77 68 79 20 74 68 69 73 20 64 6f 65 73 6e 27 74  why this doesn't
2e70: 20 77 6f 72 6b 0a 20 20 20 20 23 20 77 6f 72 6b   work.    # work
2e80: 20 77 69 74 68 20 52 4f 4c 4c 42 41 43 4b 73 2e   with ROLLBACKs.
2e90: 2e 2e 0a 20 20 20 20 69 66 20 7b 30 7d 20 7b 0a  ...    if {0} {.
2ea0: 20 20 20 20 20 20 64 6f 5f 74 65 73 74 20 63 6f        do_test co
2eb0: 72 72 75 70 74 43 2d 33 2e 24 74 6e 2e 28 24 71  rruptC-3.$tn.($q
2ec0: 73 65 65 64 29 2e 24 69 2e 31 31 20 7b 0a 20 20  seed).$i.11 {.  
2ed0: 20 20 20 20 20 20 73 65 74 20 62 74 20 5b 62 74        set bt [bt
2ee0: 72 65 65 5f 66 72 6f 6d 5f 64 62 20 64 62 5d 0a  ree_from_db db].
2ef0: 20 20 20 20 20 20 20 20 64 62 5f 65 6e 74 65 72          db_enter
2f00: 20 64 62 0a 20 20 20 20 20 20 20 20 61 72 72 61   db.        arra
2f10: 79 20 73 65 74 20 73 74 61 74 73 20 5b 62 74 72  y set stats [btr
2f20: 65 65 5f 70 61 67 65 72 5f 73 74 61 74 73 20 24  ee_pager_stats $
2f30: 62 74 5d 0a 20 20 20 20 20 20 20 20 64 62 5f 6c  bt].        db_l
2f40: 65 61 76 65 20 64 62 0a 20 20 20 20 20 20 20 20  eave db.        
2f50: 73 65 74 20 73 74 61 74 73 28 72 65 66 29 0a 20  set stats(ref). 
2f60: 20 20 20 20 20 7d 20 7b 30 7d 0a 20 20 20 20 7d       } {0}.    }
2f70: 0a 20 20 7d 0a 20 20 23 20 65 6e 64 20 66 6f 72  .  }.  # end for
2f80: 20 69 0a 0a 7d 0a 23 20 65 6e 64 20 66 6f 72 20   i..}.# end for 
2f90: 74 6e 0a 0a 66 69 6e 69 73 68 5f 74 65 73 74 0a  tn..finish_test.