/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact b47377143f0c80f91ed29d722861077ff34415d5:


0000: 23 20 32 30 30 37 20 4d 61 79 20 31 30 0a 23 0a  # 2007 May 10.#.
0010: 23 20 54 68 65 20 61 75 74 68 6f 72 20 64 69 73  # The author dis
0020: 63 6c 61 69 6d 73 20 63 6f 70 79 72 69 67 68 74  claims copyright
0030: 20 74 6f 20 74 68 69 73 20 73 6f 75 72 63 65 20   to this source 
0040: 63 6f 64 65 2e 20 20 49 6e 20 70 6c 61 63 65 20  code.  In place 
0050: 6f 66 0a 23 20 61 20 6c 65 67 61 6c 20 6e 6f 74  of.# a legal not
0060: 69 63 65 2c 20 68 65 72 65 20 69 73 20 61 20 62  ice, here is a b
0070: 6c 65 73 73 69 6e 67 3a 0a 23 0a 23 20 20 20 20  lessing:.#.#    
0080: 4d 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20  May you do good 
0090: 61 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 23 20  and not evil..# 
00a0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00b0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00c0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00d0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 23 20 20  give others..#  
00e0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20    May you share 
00f0: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61  freely, never ta
0100: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79  king more than y
0110: 6f 75 20 67 69 76 65 2e 0a 23 0a 23 2a 2a 2a 2a  ou 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 0a 23 20 54 68 69 73 20 66 69 6c 65 20  ***.# This file 
0170: 69 6d 70 6c 65 6d 65 6e 74 73 20 72 65 67 72 65  implements regre
0180: 73 73 69 6f 6e 20 74 65 73 74 73 20 66 6f 72 20  ssion tests for 
0190: 53 51 4c 69 74 65 20 6c 69 62 72 61 72 79 2e 20  SQLite library. 
01a0: 20 54 68 65 20 66 6f 63 75 73 0a 23 20 6f 66 20   The focus.# of 
01b0: 74 68 69 73 20 66 69 6c 65 20 69 73 20 63 68 65  this file is che
01c0: 63 6b 69 6e 67 20 74 68 65 20 6c 69 62 72 61 72  cking the librar
01d0: 69 65 73 20 72 65 73 70 6f 6e 73 65 20 74 6f 20  ies response to 
01e0: 73 75 62 74 6c 79 20 63 6f 72 72 75 70 74 69 6e  subtly corruptin
01f0: 67 0a 23 20 74 68 65 20 64 61 74 61 62 61 73 65  g.# the database
0200: 20 66 69 6c 65 20 62 79 20 63 68 61 6e 67 69 6e   file by changin
0210: 67 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20  g the values of 
0220: 70 73 65 75 64 6f 2d 72 61 6e 64 6f 6d 6c 79 20  pseudo-randomly 
0230: 73 65 6c 65 63 74 65 64 0a 23 20 62 79 74 65 73  selected.# bytes
0240: 2e 0a 23 0a 23 20 24 49 64 3a 20 66 75 7a 7a 33  ..#.# $Id: fuzz3
0250: 2e 74 65 73 74 2c 76 20 31 2e 33 20 32 30 30 39  .test,v 1.3 2009
0260: 2f 30 31 2f 30 35 20 31 37 3a 31 39 3a 30 33 20  /01/05 17:19:03 
0270: 64 72 68 20 45 78 70 20 24 0a 0a 73 65 74 20 74  drh Exp $..set t
0280: 65 73 74 64 69 72 20 5b 66 69 6c 65 20 64 69 72  estdir [file dir
0290: 6e 61 6d 65 20 24 61 72 67 76 30 5d 0a 73 6f 75  name $argv0].sou
02a0: 72 63 65 20 24 74 65 73 74 64 69 72 2f 74 65 73  rce $testdir/tes
02b0: 74 65 72 2e 74 63 6c 0a 0a 23 20 54 68 65 73 65  ter.tcl..# These
02c0: 20 74 65 73 74 73 20 64 65 61 6c 20 77 69 74 68   tests deal with
02d0: 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73   corrupt databas
02e0: 65 20 66 69 6c 65 73 0a 23 0a 64 61 74 61 62 61  e files.#.databa
02f0: 73 65 5f 6d 61 79 5f 62 65 5f 63 6f 72 72 75 70  se_may_be_corrup
0300: 74 0a 74 65 73 74 5f 73 65 74 5f 63 6f 6e 66 69  t.test_set_confi
0310: 67 5f 70 61 67 65 63 61 63 68 65 20 30 20 30 0a  g_pagecache 0 0.
0320: 0a 0a 65 78 70 72 20 73 72 61 6e 64 28 31 32 33  ..expr srand(123
0330: 29 0a 0a 70 72 6f 63 20 72 73 74 72 69 6e 67 20  )..proc rstring 
0340: 7b 6e 7d 20 7b 0a 20 20 73 65 74 20 73 74 72 20  {n} {.  set str 
0350: 73 0a 20 20 77 68 69 6c 65 20 7b 5b 73 74 72 69  s.  while {[stri
0360: 6e 67 20 6c 65 6e 67 74 68 20 24 73 74 72 5d 20  ng length $str] 
0370: 3c 20 24 6e 7d 20 7b 0a 20 20 20 20 61 70 70 65  < $n} {.    appe
0380: 6e 64 20 73 74 72 20 5b 65 78 70 72 20 72 61 6e  nd str [expr ran
0390: 64 28 29 5d 0a 20 20 7d 0a 20 20 72 65 74 75 72  d()].  }.  retur
03a0: 6e 20 5b 73 74 72 69 6e 67 20 72 61 6e 67 65 20  n [string range 
03b0: 24 73 74 72 20 30 20 24 6e 5d 0a 7d 0a 0a 23 20  $str 0 $n].}..# 
03c0: 52 65 74 75 72 6e 20 61 20 72 61 6e 64 6f 6d 6c  Return a randoml
03d0: 79 20 67 65 6e 65 72 61 74 65 64 20 53 51 4c 20  y generated SQL 
03e0: 6c 69 74 65 72 61 6c 2e 0a 23 0a 70 72 6f 63 20  literal..#.proc 
03f0: 72 76 61 6c 75 65 20 7b 7d 20 7b 0a 20 20 73 77  rvalue {} {.  sw
0400: 69 74 63 68 20 2d 2d 20 5b 65 78 70 72 20 69 6e  itch -- [expr in
0410: 74 28 72 61 6e 64 28 29 2a 35 29 5d 20 7b 0a 20  t(rand()*5)] {. 
0420: 20 20 20 30 20 7b 20 23 20 53 51 4c 20 4e 55 4c     0 { # SQL NUL
0430: 4c 20 76 61 6c 75 65 2e 0a 20 20 20 20 20 20 72  L value..      r
0440: 65 74 75 72 6e 20 4e 55 4c 4c 20 0a 20 20 20 20  eturn NULL .    
0450: 7d 0a 20 20 20 20 31 20 7b 20 23 20 49 6e 74 65  }.    1 { # Inte
0460: 67 65 72 20 76 61 6c 75 65 2e 0a 20 20 20 20 20  ger value..     
0470: 20 72 65 74 75 72 6e 20 5b 65 78 70 72 20 69 6e   return [expr in
0480: 74 28 72 61 6e 64 28 29 2a 31 30 32 34 29 5d 20  t(rand()*1024)] 
0490: 0a 20 20 20 20 7d 0a 20 20 20 20 32 20 7b 20 23  .    }.    2 { #
04a0: 20 52 65 61 6c 20 76 61 6c 75 65 2e 0a 20 20 20   Real value..   
04b0: 20 20 20 72 65 74 75 72 6e 20 5b 65 78 70 72 20     return [expr 
04c0: 72 61 6e 64 28 29 5d 20 0a 20 20 20 20 7d 0a 20  rand()] .    }. 
04d0: 20 20 20 33 20 7b 20 23 20 53 74 72 69 6e 67 20     3 { # String 
04e0: 76 61 6c 75 65 2e 0a 20 20 20 20 20 20 73 65 74  value..      set
04f0: 20 6e 20 5b 65 78 70 72 20 69 6e 74 28 72 61 6e   n [expr int(ran
0500: 64 28 29 2a 32 35 30 30 29 5d 0a 20 20 20 20 20  d()*2500)].     
0510: 20 72 65 74 75 72 6e 20 22 27 5b 72 73 74 72 69   return "'[rstri
0520: 6e 67 20 24 6e 5d 27 22 0a 20 20 20 20 7d 0a 20  ng $n]'".    }. 
0530: 20 20 20 34 20 7b 20 23 20 42 6c 6f 62 20 76 61     4 { # Blob va
0540: 6c 75 65 2e 0a 20 20 20 20 20 20 73 65 74 20 6e  lue..      set n
0550: 20 5b 65 78 70 72 20 69 6e 74 28 72 61 6e 64 28   [expr int(rand(
0560: 29 2a 32 35 30 30 29 5d 0a 20 20 20 20 20 20 72  )*2500)].      r
0570: 65 74 75 72 6e 20 22 43 41 53 54 28 27 5b 72 73  eturn "CAST('[rs
0580: 74 72 69 6e 67 20 24 6e 5d 27 20 41 53 20 42 4c  tring $n]' AS BL
0590: 4f 42 29 22 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  OB)".    }.  }.}
05a0: 0a 0a 70 72 6f 63 20 64 62 5f 63 68 65 63 6b 73  ..proc db_checks
05b0: 75 6d 20 7b 7d 20 7b 0a 20 20 73 65 74 20 20 20  um {} {.  set   
05c0: 20 63 6b 73 75 6d 20 5b 65 78 65 63 73 71 6c 20   cksum [execsql 
05d0: 7b 20 53 45 4c 45 43 54 20 6d 64 35 73 75 6d 28  { SELECT md5sum(
05e0: 61 2c 20 62 2c 20 63 29 20 46 52 4f 4d 20 74 31  a, b, c) FROM t1
05f0: 20 7d 5d 0a 20 20 61 70 70 65 6e 64 20 63 6b 73   }].  append cks
0600: 75 6d 20 5b 65 78 65 63 73 71 6c 20 7b 20 53 45  um [execsql { SE
0610: 4c 45 43 54 20 6d 64 35 73 75 6d 28 64 2c 20 65  LECT md5sum(d, e
0620: 2c 20 66 29 20 46 52 4f 4d 20 74 32 20 7d 5d 0a  , f) FROM t2 }].
0630: 20 20 73 65 74 20 63 6b 73 75 6d 0a 7d 0a 0a 23    set cksum.}..#
0640: 20 4d 6f 64 69 66 79 20 61 20 73 69 6e 67 6c 65   Modify a single
0650: 20 62 79 74 65 20 69 6e 20 74 68 65 20 66 69 6c   byte in the fil
0660: 65 20 27 74 65 73 74 2e 64 62 27 20 75 73 69 6e  e 'test.db' usin
0670: 67 20 74 63 6c 20 49 4f 20 63 6f 6d 6d 61 6e 64  g tcl IO command
0680: 73 2e 20 54 68 65 0a 23 20 61 72 67 75 6d 65 6e  s. The.# argumen
0690: 74 20 76 61 6c 75 65 2c 20 77 68 69 63 68 20 6d  t value, which m
06a0: 75 73 74 20 62 65 20 61 6e 20 69 6e 74 65 67 65  ust be an intege
06b0: 72 2c 20 64 65 74 65 72 6d 69 6e 65 73 20 62 6f  r, determines bo
06c0: 74 68 20 74 68 65 20 6f 66 66 73 65 74 20 6f 66  th the offset of
06d0: 0a 23 20 74 68 65 20 62 79 74 65 20 74 68 61 74  .# the byte that
06e0: 20 69 73 20 6d 6f 64 69 66 69 65 64 2c 20 61 6e   is modified, an
06f0: 64 20 74 68 65 20 76 61 6c 75 65 20 74 68 61 74  d the value that
0700: 20 69 74 20 69 73 20 73 65 74 20 74 6f 2e 20 54   it is set to. T
0710: 68 65 20 6c 6f 77 65 72 0a 23 20 38 20 62 69 74  he lower.# 8 bit
0720: 73 20 6f 66 20 69 4d 6f 64 20 64 65 74 65 72 6d  s of iMod determ
0730: 69 6e 65 20 74 68 65 20 6e 65 77 20 62 79 74 65  ine the new byte
0740: 20 76 61 6c 75 65 2e 20 54 68 65 20 6f 66 66 73   value. The offs
0750: 65 74 20 6f 66 20 74 68 65 20 62 79 74 65 0a 23  et of the byte.#
0760: 20 6d 6f 64 69 66 69 65 64 20 69 73 20 74 68 65   modified is the
0770: 20 76 61 6c 75 65 20 6f 66 20 28 24 69 4d 6f 64   value of ($iMod
0780: 20 3e 3e 20 38 29 2e 0a 23 0a 23 20 54 68 65 20   >> 8)..#.# The 
0790: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
07a0: 74 68 65 20 69 4d 6f 64 20 76 61 6c 75 65 20 72  the iMod value r
07b0: 65 71 75 69 72 65 64 20 74 6f 20 72 65 73 74 6f  equired to resto
07c0: 72 65 20 74 68 65 20 66 69 6c 65 0a 23 20 74 6f  re the file.# to
07d0: 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74   its original st
07e0: 61 74 65 2e 20 54 68 65 20 63 6f 6d 6d 61 6e 64  ate. The command
07f0: 3a 0a 23 0a 23 20 20 20 6d 6f 64 69 66 79 5f 64  :.#.#   modify_d
0800: 61 74 61 62 61 73 65 20 5b 6d 6f 64 69 66 79 5f  atabase [modify_
0810: 64 61 74 61 62 61 73 65 20 24 78 5d 0a 23 0a 23  database $x].#.#
0820: 20 6c 65 61 76 65 73 20 74 68 65 20 66 69 6c 65   leaves the file
0830: 20 69 6e 20 74 68 65 20 73 61 6d 65 20 73 74 61   in the same sta
0840: 74 65 20 61 73 20 69 74 20 77 61 73 20 69 6e 20  te as it was in 
0850: 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
0860: 74 68 65 0a 23 20 63 6f 6d 6d 61 6e 64 20 28 61  the.# command (a
0870: 73 73 75 6d 69 6e 67 20 74 68 61 74 20 74 68 65  ssuming that the
0880: 20 66 69 6c 65 20 69 73 20 61 74 20 6c 65 61 73   file is at leas
0890: 74 20 28 24 78 3e 3e 38 29 20 62 79 74 65 73 20  t ($x>>8) bytes 
08a0: 69 6e 20 73 69 7a 65 29 2e 0a 23 0a 70 72 6f 63  in size)..#.proc
08b0: 20 6d 6f 64 69 66 79 5f 64 61 74 61 62 61 73 65   modify_database
08c0: 20 7b 69 4d 6f 64 7d 20 7b 0a 20 20 73 65 74 20   {iMod} {.  set 
08d0: 62 6c 6f 62 20 5b 62 69 6e 61 72 79 20 66 6f 72  blob [binary for
08e0: 6d 61 74 20 63 20 5b 65 78 70 72 20 7b 24 69 4d  mat c [expr {$iM
08f0: 6f 64 26 30 78 46 46 7d 5d 5d 0a 20 20 73 65 74  od&0xFF}]].  set
0900: 20 6f 66 66 73 65 74 20 5b 65 78 70 72 20 7b 24   offset [expr {$
0910: 69 4d 6f 64 3e 3e 38 7d 5d 0a 0a 20 20 73 65 74  iMod>>8}]..  set
0920: 20 66 64 20 5b 6f 70 65 6e 20 74 65 73 74 2e 64   fd [open test.d
0930: 62 20 72 2b 5d 0a 20 20 66 63 6f 6e 66 69 67 75  b r+].  fconfigu
0940: 72 65 20 24 66 64 20 2d 65 6e 63 6f 64 69 6e 67  re $fd -encoding
0950: 20 62 69 6e 61 72 79 20 2d 74 72 61 6e 73 6c 61   binary -transla
0960: 74 69 6f 6e 20 62 69 6e 61 72 79 0a 20 20 73 65  tion binary.  se
0970: 65 6b 20 24 66 64 20 24 6f 66 66 73 65 74 0a 20  ek $fd $offset. 
0980: 20 73 65 74 20 6f 6c 64 5f 62 6c 6f 62 20 5b 72   set old_blob [r
0990: 65 61 64 20 24 66 64 20 31 5d 0a 20 20 73 65 65  ead $fd 1].  see
09a0: 6b 20 24 66 64 20 24 6f 66 66 73 65 74 0a 20 20  k $fd $offset.  
09b0: 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20  puts -nonewline 
09c0: 24 66 64 20 24 62 6c 6f 62 0a 20 20 63 6c 6f 73  $fd $blob.  clos
09d0: 65 20 24 66 64 0a 0a 20 20 62 69 6e 61 72 79 20  e $fd..  binary 
09e0: 73 63 61 6e 20 24 6f 6c 64 5f 62 6c 6f 62 20 63  scan $old_blob c
09f0: 20 69 4f 6c 64 0a 20 20 72 65 74 75 72 6e 20 5b   iOld.  return [
0a00: 65 78 70 72 20 7b 28 24 6f 66 66 73 65 74 3c 3c  expr {($offset<<
0a10: 38 29 20 2b 20 28 24 69 4f 6c 64 26 30 78 46 46  8) + ($iOld&0xFF
0a20: 29 7d 5d 0a 7d 0a 0a 70 72 6f 63 20 70 75 72 67  )}].}..proc purg
0a30: 65 5f 70 63 61 63 68 65 20 7b 7d 20 7b 0a 20 20  e_pcache {} {.  
0a40: 69 66 63 61 70 61 62 6c 65 20 21 6d 65 6d 6f 72  ifcapable !memor
0a50: 79 6d 61 6e 61 67 65 20 7b 0a 20 20 20 20 64 62  ymanage {.    db
0a60: 20 63 6c 6f 73 65 0a 20 20 20 20 73 71 6c 69 74   close.    sqlit
0a70: 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20  e3 db test.db.  
0a80: 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 73 71 6c  } else {.    sql
0a90: 69 74 65 33 5f 72 65 6c 65 61 73 65 5f 6d 65 6d  ite3_release_mem
0aa0: 6f 72 79 20 31 30 30 30 30 30 30 30 0a 20 20 7d  ory 10000000.  }
0ab0: 0a 20 20 69 66 20 7b 5b 6c 69 6e 64 65 78 20 5b  .  if {[lindex [
0ac0: 70 63 61 63 68 65 5f 73 74 61 74 73 5d 20 31 5d  pcache_stats] 1]
0ad0: 20 21 3d 20 30 7d 20 7b 0a 20 20 20 20 65 72 72   != 0} {.    err
0ae0: 6f 72 20 22 70 75 72 67 65 5f 70 63 61 63 68 65  or "purge_pcache
0af0: 20 66 61 69 6c 65 64 3a 20 5b 70 63 61 63 68 65   failed: [pcache
0b00: 5f 73 74 61 74 73 5d 22 0a 20 20 7d 0a 7d 0a 0a  _stats]".  }.}..
0b10: 23 20 54 68 69 73 20 62 6c 6f 63 6b 20 63 72 65  # This block cre
0b20: 61 74 65 73 20 61 20 64 61 74 61 62 61 73 65 20  ates a database 
0b30: 74 6f 20 77 6f 72 6b 20 77 69 74 68 2e 20 0a 23  to work with. .#
0b40: 0a 64 6f 5f 74 65 73 74 20 66 75 7a 7a 33 2d 31  .do_test fuzz3-1
0b50: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
0b60: 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 43 52     BEGIN;.    CR
0b70: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c  EATE TABLE t1(a,
0b80: 20 62 2c 20 63 29 3b 0a 20 20 20 20 43 52 45 41   b, c);.    CREA
0b90: 54 45 20 54 41 42 4c 45 20 74 32 28 64 2c 20 65  TE TABLE t2(d, e
0ba0: 2c 20 66 29 3b 0a 20 20 20 20 43 52 45 41 54 45  , f);.    CREATE
0bb0: 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28   INDEX i1 ON t1(
0bc0: 61 2c 20 62 2c 20 63 29 3b 0a 20 20 20 20 43 52  a, b, c);.    CR
0bd0: 45 41 54 45 20 49 4e 44 45 58 20 69 32 20 4f 4e  EATE INDEX i2 ON
0be0: 20 74 32 28 64 2c 20 65 2c 20 66 29 3b 0a 20 20   t2(d, e, f);.  
0bf0: 7d 0a 20 20 66 6f 72 20 7b 73 65 74 20 69 20 30  }.  for {set i 0
0c00: 7d 20 7b 24 69 20 3c 20 35 30 7d 20 7b 69 6e 63  } {$i < 50} {inc
0c10: 72 20 69 7d 20 7b 0a 20 20 20 20 65 78 65 63 73  r i} {.    execs
0c20: 71 6c 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20  ql "INSERT INTO 
0c30: 74 31 20 56 41 4c 55 45 53 28 5b 72 76 61 6c 75  t1 VALUES([rvalu
0c40: 65 5d 2c 20 5b 72 76 61 6c 75 65 5d 2c 20 5b 72  e], [rvalue], [r
0c50: 76 61 6c 75 65 5d 29 22 0a 20 20 20 20 65 78 65  value])".    exe
0c60: 63 73 71 6c 20 22 49 4e 53 45 52 54 20 49 4e 54  csql "INSERT INT
0c70: 4f 20 74 32 20 56 41 4c 55 45 53 28 5b 72 76 61  O t2 VALUES([rva
0c80: 6c 75 65 5d 2c 20 5b 72 76 61 6c 75 65 5d 2c 20  lue], [rvalue], 
0c90: 5b 72 76 61 6c 75 65 5d 29 22 0a 20 20 7d 0a 20  [rvalue])".  }. 
0ca0: 20 65 78 65 63 73 71 6c 20 43 4f 4d 4d 49 54 0a   execsql COMMIT.
0cb0: 7d 20 7b 7d 0a 0a 73 65 74 20 3a 3a 63 6b 73 75  } {}..set ::cksu
0cc0: 6d 20 5b 64 62 5f 63 68 65 63 6b 73 75 6d 5d 0a  m [db_checksum].
0cd0: 64 6f 5f 74 65 73 74 20 66 75 7a 7a 33 2d 32 20  do_test fuzz3-2 
0ce0: 7b 0a 20 20 64 62 5f 63 68 65 63 6b 73 75 6d 0a  {.  db_checksum.
0cf0: 7d 20 24 3a 3a 63 6b 73 75 6d 0a 0a 66 6f 72 20  } $::cksum..for 
0d00: 7b 73 65 74 20 69 69 20 30 7d 20 7b 24 69 69 20  {set ii 0} {$ii 
0d10: 3c 20 35 30 30 30 7d 20 7b 69 6e 63 72 20 69 69  < 5000} {incr ii
0d20: 7d 20 7b 0a 20 20 70 75 72 67 65 5f 70 63 61 63  } {.  purge_pcac
0d30: 68 65 0a 0a 20 20 23 20 52 61 6e 64 6f 6d 6c 79  he..  # Randomly
0d40: 20 6d 6f 64 69 66 79 20 61 20 73 69 6e 67 6c 65   modify a single
0d50: 20 62 79 74 65 20 6f 66 20 74 68 65 20 64 61 74   byte of the dat
0d60: 61 62 61 73 65 20 66 69 6c 65 20 73 6f 6d 65 77  abase file somew
0d70: 68 65 72 65 20 77 69 74 68 69 6e 0a 20 20 23 20  here within.  # 
0d80: 74 68 65 20 66 69 72 73 74 20 31 30 30 4b 42 20  the first 100KB 
0d90: 6f 66 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 73  of the file..  s
0da0: 65 74 20 69 4e 65 77 20 5b 65 78 70 72 20 69 6e  et iNew [expr in
0db0: 74 28 72 61 6e 64 28 29 2a 35 2a 31 30 32 34 2a  t(rand()*5*1024*
0dc0: 32 35 36 29 5d 0a 20 20 73 65 74 20 69 4f 6c 64  256)].  set iOld
0dd0: 20 5b 6d 6f 64 69 66 79 5f 64 61 74 61 62 61 73   [modify_databas
0de0: 65 20 24 69 4e 65 77 5d 0a 0a 20 20 73 65 74 20  e $iNew]..  set 
0df0: 69 54 65 73 74 20 30 0a 20 20 66 6f 72 65 61 63  iTest 0.  foreac
0e00: 68 20 73 71 6c 20 7b 0a 20 20 20 20 7b 53 45 4c  h sql {.    {SEL
0e10: 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 20 4f 52  ECT * FROM t2 OR
0e20: 44 45 52 20 42 59 20 64 7d 20 20 20 20 20 20 0a  DER BY d}      .
0e30: 20 20 20 20 7b 53 45 4c 45 43 54 20 2a 20 46 52      {SELECT * FR
0e40: 4f 4d 20 74 31 7d 20 20 20 20 20 20 20 20 20 20  OM t1}          
0e50: 20 20 20 20 20 20 20 0a 20 20 20 20 7b 53 45 4c         .    {SEL
0e60: 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 7d 20 20  ECT * FROM t2}  
0e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a                 .
0e80: 20 20 20 20 7b 53 45 4c 45 43 54 20 2a 20 46 52      {SELECT * FR
0e90: 4f 4d 20 74 31 20 4f 52 44 45 52 20 42 59 20 61  OM t1 ORDER BY a
0ea0: 7d 20 20 20 20 20 20 0a 20 20 20 20 7b 53 45 4c  }      .    {SEL
0eb0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48  ECT * FROM t1 WH
0ec0: 45 52 45 20 61 20 3d 20 28 53 45 4c 45 43 54 20  ERE a = (SELECT 
0ed0: 61 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  a FROM t1 WHERE 
0ee0: 72 6f 77 69 64 3d 32 35 29 7d 20 0a 20 20 20 20  rowid=25)} .    
0ef0: 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74  {SELECT * FROM t
0f00: 32 20 57 48 45 52 45 20 64 20 3d 20 28 53 45 4c  2 WHERE d = (SEL
0f10: 45 43 54 20 64 20 46 52 4f 4d 20 74 32 20 57 48  ECT d FROM t2 WH
0f20: 45 52 45 20 72 6f 77 69 64 3d 31 29 7d 20 20 0a  ERE rowid=1)}  .
0f30: 20 20 20 20 7b 53 45 4c 45 43 54 20 2a 20 46 52      {SELECT * FR
0f40: 4f 4d 20 74 32 20 57 48 45 52 45 20 64 20 3d 20  OM t2 WHERE d = 
0f50: 28 53 45 4c 45 43 54 20 64 20 46 52 4f 4d 20 74  (SELECT d FROM t
0f60: 32 20 57 48 45 52 45 20 72 6f 77 69 64 3d 35 30  2 WHERE rowid=50
0f70: 29 7d 20 0a 20 20 20 20 7b 50 52 41 47 4d 41 20  )} .    {PRAGMA 
0f80: 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 7d  integrity_check}
0f90: 20 20 20 20 20 20 20 20 20 20 20 0a 20 20 7d 20             .  } 
0fa0: 7b 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 66 75  {.    do_test fu
0fb0: 7a 7a 33 2d 24 69 69 2e 24 69 4e 65 77 2e 5b 69  zz3-$ii.$iNew.[i
0fc0: 6e 63 72 20 69 54 65 73 74 5d 20 7b 0a 20 20 20  ncr iTest] {.   
0fd0: 20 20 20 66 6f 72 65 61 63 68 20 7b 72 63 20 6d     foreach {rc m
0fe0: 73 67 7d 20 5b 63 61 74 63 68 73 71 6c 20 24 73  sg} [catchsql $s
0ff0: 71 6c 5d 20 7b 7d 0a 20 20 20 20 20 20 69 66 20  ql] {}.      if 
1000: 7b 24 72 63 20 3d 3d 20 30 20 0a 20 20 20 20 20  {$rc == 0 .     
1010: 20 20 7c 7c 20 24 6d 73 67 20 65 71 20 22 64 61    || $msg eq "da
1020: 74 61 62 61 73 65 20 6f 72 20 64 69 73 6b 20 69  tabase or disk i
1030: 73 20 66 75 6c 6c 22 0a 20 20 20 20 20 20 20 7c  s full".       |
1040: 7c 20 24 6d 73 67 20 65 71 20 22 64 61 74 61 62  | $msg eq "datab
1050: 61 73 65 20 64 69 73 6b 20 69 6d 61 67 65 20 69  ase disk image i
1060: 73 20 6d 61 6c 66 6f 72 6d 65 64 22 0a 20 20 20  s malformed".   
1070: 20 20 20 20 7c 7c 20 24 6d 73 67 20 65 71 20 22      || $msg eq "
1080: 66 69 6c 65 20 69 73 20 65 6e 63 72 79 70 74 65  file is encrypte
1090: 64 20 6f 72 20 69 73 20 6e 6f 74 20 61 20 64 61  d or is not a da
10a0: 74 61 62 61 73 65 22 0a 20 20 20 20 20 20 20 7c  tabase".       |
10b0: 7c 20 5b 73 74 72 69 6e 67 20 6d 61 74 63 68 20  | [string match 
10c0: 22 6d 61 6c 66 6f 72 6d 65 64 20 64 61 74 61 62  "malformed datab
10d0: 61 73 65 20 73 63 68 65 6d 61 2a 22 20 24 6d 73  ase schema*" $ms
10e0: 67 5d 0a 20 20 20 20 20 20 7d 20 7b 0a 20 20 20  g].      } {.   
10f0: 20 20 20 20 20 73 65 74 20 6d 73 67 20 6f 6b 0a       set msg ok.
1100: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 65        }.      se
1110: 74 20 6d 73 67 0a 20 20 20 20 7d 20 7b 6f 6b 7d  t msg.    } {ok}
1120: 0a 20 20 7d 0a 0a 20 20 23 20 52 65 73 74 6f 72  .  }..  # Restor
1130: 65 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  e the original d
1140: 61 74 61 62 61 73 65 20 66 69 6c 65 20 63 6f 6e  atabase file con
1150: 74 65 6e 74 2e 20 54 65 73 74 20 74 68 61 74 20  tent. Test that 
1160: 74 68 65 20 63 6f 72 72 65 63 74 20 0a 20 20 23  the correct .  #
1170: 20 63 68 65 63 6b 73 75 6d 20 69 73 20 6e 6f 77   checksum is now
1180: 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 23 0a 20   returned..  #. 
1190: 20 70 75 72 67 65 5f 70 63 61 63 68 65 0a 20 20   purge_pcache.  
11a0: 6d 6f 64 69 66 79 5f 64 61 74 61 62 61 73 65 20  modify_database 
11b0: 24 69 4f 6c 64 0a 20 20 64 6f 5f 74 65 73 74 20  $iOld.  do_test 
11c0: 66 75 7a 7a 33 2d 24 69 69 2e 24 69 4e 65 77 2e  fuzz3-$ii.$iNew.
11d0: 5b 69 6e 63 72 20 69 54 65 73 74 5d 20 7b 0a 20  [incr iTest] {. 
11e0: 20 20 20 64 62 5f 63 68 65 63 6b 73 75 6d 0a 20     db_checksum. 
11f0: 20 7d 20 24 3a 3a 63 6b 73 75 6d 0a 7d 0a 0a 74   } $::cksum.}..t
1200: 65 73 74 5f 72 65 73 74 6f 72 65 5f 63 6f 6e 66  est_restore_conf
1210: 69 67 5f 70 61 67 65 63 61 63 68 65 0a 66 69 6e  ig_pagecache.fin
1220: 69 73 68 5f 74 65 73 74 0a                       ish_test.