/ Hex Artifact Content
Login

Artifact 7453752ba12ce91690c469a6449d412561cc604b1dec994e16ab132952e7805f:


0000: 23 20 32 30 31 35 20 41 70 72 20 32 34 0a 23 0a  # 2015 Apr 24.#.
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 0a 23 20 54 68 69 73 20 66 69 6c  ***.#.# This fil
0170: 65 20 74 65 73 74 73 20 74 68 61 74 20 46 54 53  e tests that FTS
0180: 35 20 68 61 6e 64 6c 65 73 20 63 6f 72 72 75 70  5 handles corrup
0190: 74 20 64 61 74 61 62 61 73 65 73 20 28 69 2e 65  t databases (i.e
01a0: 2e 20 69 6e 74 65 72 6e 61 6c 0a 23 20 69 6e 63  . internal.# inc
01b0: 6f 6e 73 69 73 74 65 6e 63 69 65 73 20 69 6e 20  onsistencies in 
01c0: 74 68 65 20 62 61 63 6b 69 6e 67 20 74 61 62 6c  the backing tabl
01d0: 65 73 29 20 63 6f 72 72 65 63 74 6c 79 2e 20 49  es) correctly. I
01e0: 6e 20 74 68 69 73 20 63 61 73 65 20 0a 23 20 22  n this case .# "
01f0: 63 6f 72 72 65 63 74 6c 79 22 20 6d 65 61 6e 73  correctly" means
0200: 20 77 69 74 68 6f 75 74 20 63 72 61 73 68 69 6e   without crashin
0210: 67 2e 0a 23 0a 0a 73 6f 75 72 63 65 20 5b 66 69  g..#..source [fi
0220: 6c 65 20 6a 6f 69 6e 20 5b 66 69 6c 65 20 64 69  le join [file di
0230: 72 6e 61 6d 65 20 5b 69 6e 66 6f 20 73 63 72 69  rname [info scri
0240: 70 74 5d 5d 20 66 74 73 35 5f 63 6f 6d 6d 6f 6e  pt]] fts5_common
0250: 2e 74 63 6c 5d 0a 73 65 74 20 74 65 73 74 70 72  .tcl].set testpr
0260: 65 66 69 78 20 66 74 73 35 63 6f 72 72 75 70 74  efix fts5corrupt
0270: 32 0a 0a 23 20 49 66 20 53 51 4c 49 54 45 5f 45  2..# If SQLITE_E
0280: 4e 41 42 4c 45 5f 46 54 53 35 20 69 73 20 64 65  NABLE_FTS5 is de
0290: 66 69 6e 65 64 2c 20 6f 6d 69 74 20 74 68 69 73  fined, omit this
02a0: 20 66 69 6c 65 2e 0a 69 66 63 61 70 61 62 6c 65   file..ifcapable
02b0: 20 21 66 74 73 35 20 7b 0a 20 20 66 69 6e 69 73   !fts5 {.  finis
02c0: 68 5f 74 65 73 74 0a 20 20 72 65 74 75 72 6e 0a  h_test.  return.
02d0: 7d 0a 73 71 6c 69 74 65 33 5f 66 74 73 35 5f 6d  }.sqlite3_fts5_m
02e0: 61 79 5f 62 65 5f 63 6f 72 72 75 70 74 20 31 0a  ay_be_corrupt 1.
02f0: 0a 23 20 43 72 65 61 74 65 20 61 20 73 69 6d 70  .# Create a simp
0300: 6c 65 20 46 54 53 35 20 74 61 62 6c 65 20 63 6f  le FTS5 table co
0310: 6e 74 61 69 6e 69 6e 67 20 31 30 30 20 64 6f 63  ntaining 100 doc
0320: 75 6d 65 6e 74 73 2e 20 45 61 63 68 20 64 6f 63  uments. Each doc
0330: 75 6d 65 6e 74 20 0a 23 20 63 6f 6e 74 61 69 6e  ument .# contain
0340: 73 20 31 30 20 74 65 72 6d 73 2c 20 65 61 63 68  s 10 terms, each
0350: 20 6f 66 20 77 68 69 63 68 20 73 74 61 72 74 20   of which start 
0360: 77 69 74 68 20 74 68 65 20 63 68 61 72 61 63 74  with the charact
0370: 65 72 20 22 78 22 2e 0a 23 0a 65 78 70 72 20 73  er "x"..#.expr s
0380: 72 61 6e 64 28 30 29 0a 64 62 20 66 75 6e 63 20  rand(0).db func 
0390: 72 6e 64 64 6f 63 20 66 74 73 35 5f 72 6e 64 64  rnddoc fts5_rndd
03a0: 6f 63 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  oc.do_execsql_te
03b0: 73 74 20 31 2e 30 20 7b 0a 20 20 43 52 45 41 54  st 1.0 {.  CREAT
03c0: 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20  E VIRTUAL TABLE 
03d0: 74 31 20 55 53 49 4e 47 20 66 74 73 35 28 78 29  t1 USING fts5(x)
03e0: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
03f0: 74 31 28 74 31 2c 20 72 61 6e 6b 29 20 56 41 4c  t1(t1, rank) VAL
0400: 55 45 53 28 27 70 67 73 7a 27 2c 20 33 32 29 3b  UES('pgsz', 32);
0410: 0a 20 20 57 49 54 48 20 69 69 28 69 29 20 41 53  .  WITH ii(i) AS
0420: 20 28 53 45 4c 45 43 54 20 31 20 55 4e 49 4f 4e   (SELECT 1 UNION
0430: 20 53 45 4c 45 43 54 20 69 2b 31 20 46 52 4f 4d   SELECT i+1 FROM
0440: 20 69 69 20 57 48 45 52 45 20 69 3c 31 30 30 29   ii WHERE i<100)
0450: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  .  INSERT INTO t
0460: 31 20 53 45 4c 45 43 54 20 72 6e 64 64 6f 63 28  1 SELECT rnddoc(
0470: 31 30 29 20 46 52 4f 4d 20 69 69 3b 0a 7d 0a 73  10) FROM ii;.}.s
0480: 65 74 20 6d 61 73 6b 20 5b 65 78 70 72 20 33 31  et mask [expr 31
0490: 20 3c 3c 20 33 31 5d 0a 0a 69 66 20 30 20 7b 0a   << 31]..if 0 {.
04a0: 0a 23 20 54 65 73 74 20 31 3a 0a 23 0a 23 20 20  .# Test 1:.#.#  
04b0: 20 46 6f 72 20 65 61 63 68 20 70 61 67 65 20 69   For each page i
04c0: 6e 20 74 68 65 20 74 31 5f 64 61 74 61 20 74 61  n the t1_data ta
04d0: 62 6c 65 2c 20 6f 70 65 6e 20 61 20 74 72 61 6e  ble, open a tran
04e0: 73 61 63 74 69 6f 6e 20 61 6e 64 20 44 45 4c 45  saction and DELE
04f0: 54 45 0a 23 20 20 20 74 68 65 20 74 31 5f 64 61  TE.#   the t1_da
0500: 74 61 20 65 6e 74 72 79 2e 20 54 68 65 6e 20 72  ta entry. Then r
0510: 75 6e 3a 0a 23 0a 23 20 20 20 20 20 2a 20 61 6e  un:.#.#     * an
0520: 20 69 6e 74 65 67 72 69 74 79 2d 63 68 65 63 6b   integrity-check
0530: 2c 20 61 6e 64 0a 23 20 20 20 20 20 2a 20 75 6e  , and.#     * un
0540: 6c 65 73 73 20 74 68 65 20 64 65 6c 65 74 65 64  less the deleted
0550: 20 62 6c 6f 63 6b 20 77 61 73 20 61 20 62 2d 74   block was a b-t
0560: 72 65 65 20 6e 6f 64 65 2c 20 61 20 71 75 65 72  ree node, a quer
0570: 79 20 66 6f 72 20 22 74 31 20 4d 41 54 43 48 20  y for "t1 MATCH 
0580: 27 78 2a 27 22 0a 23 0a 23 20 20 20 61 6e 64 20  'x*'".#.#   and 
0590: 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 63  check that the c
05a0: 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 64 65 74  orruption is det
05b0: 65 63 74 65 64 20 69 6e 20 62 6f 74 68 20 63 61  ected in both ca
05c0: 73 65 73 2e 20 54 68 65 20 0a 23 20 20 20 72 6f  ses. The .#   ro
05d0: 6c 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73  llback the trans
05e0: 61 63 74 69 6f 6e 2e 0a 23 0a 23 20 54 65 73 74  action..#.# Test
05f0: 20 32 3a 0a 23 0a 23 20 20 20 53 61 6d 65 20 74   2:.#.#   Same t
0600: 68 69 6e 67 2c 20 65 78 63 65 70 74 20 69 6e 73  hing, except ins
0610: 74 65 61 64 20 6f 66 20 64 65 6c 65 74 69 6e 67  tead of deleting
0620: 20 61 20 72 6f 77 20 66 72 6f 6d 20 74 31 5f 64   a row from t1_d
0630: 61 74 61 2c 20 72 65 70 6c 61 63 65 20 69 74 73  ata, replace its
0640: 0a 23 20 20 20 62 6c 6f 62 20 63 6f 6e 74 65 6e  .#   blob conten
0650: 74 20 77 69 74 68 20 69 6e 74 65 67 65 72 20 76  t with integer v
0660: 61 6c 75 65 20 31 34 2e 0a 23 0a 66 6f 72 65 61  alue 14..#.forea
0670: 63 68 20 7b 74 6e 6f 20 73 74 6d 74 7d 20 7b 0a  ch {tno stmt} {.
0680: 20 20 31 20 7b 20 44 45 4c 45 54 45 20 46 52 4f    1 { DELETE FRO
0690: 4d 20 74 31 5f 64 61 74 61 20 57 48 45 52 45 20  M t1_data WHERE 
06a0: 72 6f 77 69 64 3d 24 72 6f 77 69 64 20 7d 0a 20  rowid=$rowid }. 
06b0: 20 32 20 7b 20 55 50 44 41 54 45 20 74 31 5f 64   2 { UPDATE t1_d
06c0: 61 74 61 20 53 45 54 20 62 6c 6f 63 6b 3d 31 34  ata SET block=14
06d0: 20 57 48 45 52 45 20 72 6f 77 69 64 3d 24 72 6f   WHERE rowid=$ro
06e0: 77 69 64 20 7d 0a 7d 20 7b 0a 20 20 73 65 74 20  wid }.} {.  set 
06f0: 74 6e 20 30 0a 20 20 66 6f 72 65 61 63 68 20 72  tn 0.  foreach r
0700: 6f 77 69 64 20 5b 64 62 20 65 76 61 6c 20 7b 53  owid [db eval {S
0710: 45 4c 45 43 54 20 72 6f 77 69 64 20 46 52 4f 4d  ELECT rowid FROM
0720: 20 74 31 5f 64 61 74 61 20 57 48 45 52 45 20 72   t1_data WHERE r
0730: 6f 77 69 64 3e 31 30 7d 5d 20 7b 0a 20 20 20 20  owid>10}] {.    
0740: 69 6e 63 72 20 74 6e 0a 20 20 20 20 23 69 66 20  incr tn.    #if 
0750: 7b 24 74 6e 21 3d 32 32 34 7d 20 63 6f 6e 74 69  {$tn!=224} conti
0760: 6e 75 65 0a 20 20 0a 20 20 20 20 64 6f 5f 74 65  nue.  .    do_te
0770: 73 74 20 31 2e 24 74 6e 6f 2e 24 74 6e 2e 31 2e  st 1.$tno.$tn.1.
0780: 24 72 6f 77 69 64 20 7b 0a 20 20 20 20 20 20 65  $rowid {.      e
0790: 78 65 63 73 71 6c 20 7b 20 42 45 47 49 4e 20 7d  xecsql { BEGIN }
07a0: 0a 20 20 20 20 20 20 65 78 65 63 73 71 6c 20 24  .      execsql $
07b0: 73 74 6d 74 0a 20 20 20 20 20 20 63 61 74 63 68  stmt.      catch
07c0: 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54  sql { INSERT INT
07d0: 4f 20 74 31 28 74 31 29 20 56 41 4c 55 45 53 28  O t1(t1) VALUES(
07e0: 27 69 6e 74 65 67 72 69 74 79 2d 63 68 65 63 6b  'integrity-check
07f0: 27 29 20 7d 0a 20 20 20 20 7d 20 7b 31 20 7b 64  ') }.    } {1 {d
0800: 61 74 61 62 61 73 65 20 64 69 73 6b 20 69 6d 61  atabase disk ima
0810: 67 65 20 69 73 20 6d 61 6c 66 6f 72 6d 65 64 7d  ge is malformed}
0820: 7d 0a 20 20 0a 20 20 20 20 69 66 20 7b 28 24 72  }.  .    if {($r
0830: 6f 77 69 64 20 26 20 24 6d 61 73 6b 29 3d 3d 30  owid & $mask)==0
0840: 7d 20 7b 0a 20 20 20 20 20 20 23 20 4e 6f 64 65  } {.      # Node
0850: 20 69 73 20 61 20 6c 65 61 66 20 6e 6f 64 65 2c   is a leaf node,
0860: 20 6e 6f 74 20 61 20 62 2d 74 72 65 65 20 6e 6f   not a b-tree no
0870: 64 65 2e 0a 20 20 20 20 20 20 64 6f 5f 63 61 74  de..      do_cat
0880: 63 68 73 71 6c 5f 74 65 73 74 20 31 2e 24 74 6e  chsql_test 1.$tn
0890: 6f 2e 24 74 6e 2e 32 2e 24 72 6f 77 69 64 20 7b  o.$tn.2.$rowid {
08a0: 0a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20  .        SELECT 
08b0: 72 6f 77 69 64 20 46 52 4f 4d 20 74 31 20 57 48  rowid FROM t1 WH
08c0: 45 52 45 20 74 31 20 4d 41 54 43 48 20 27 78 2a  ERE t1 MATCH 'x*
08d0: 27 0a 20 20 20 20 20 20 7d 20 7b 31 20 7b 64 61  '.      } {1 {da
08e0: 74 61 62 61 73 65 20 64 69 73 6b 20 69 6d 61 67  tabase disk imag
08f0: 65 20 69 73 20 6d 61 6c 66 6f 72 6d 65 64 7d 7d  e is malformed}}
0900: 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 64 6f  .    }.  .    do
0910: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 31 2e  _execsql_test 1.
0920: 24 74 6e 6f 2e 24 74 6e 2e 33 2e 24 72 6f 77 69  $tno.$tn.3.$rowi
0930: 64 20 7b 0a 20 20 20 20 20 20 52 4f 4c 4c 42 41  d {.      ROLLBA
0940: 43 4b 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  CK;.      INSERT
0950: 20 49 4e 54 4f 20 74 31 28 74 31 29 20 56 41 4c   INTO t1(t1) VAL
0960: 55 45 53 28 27 69 6e 74 65 67 72 69 74 79 2d 63  UES('integrity-c
0970: 68 65 63 6b 27 29 3b 0a 20 20 20 20 7d 20 7b 7d  heck');.    } {}
0980: 0a 20 20 7d 0a 7d 0a 0a 7d 0a 0a 23 20 55 73 69  .  }.}..}..# Usi
0990: 6e 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  ng the same data
09a0: 62 61 73 65 20 61 73 20 74 68 65 20 31 2e 2a 20  base as the 1.* 
09b0: 74 65 73 74 73 2e 0a 23 0a 23 20 52 75 6e 20 4e  tests..#.# Run N
09c0: 2d 31 20 74 65 73 74 73 2c 20 77 68 65 72 65 20  -1 tests, where 
09d0: 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  N is the number 
09e0: 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  of bytes in the 
09f0: 72 69 67 68 74 6d 6f 73 74 20 6c 65 61 66 20 70  rightmost leaf p
0a00: 61 67 65 0a 23 20 6f 66 20 74 68 65 20 66 74 73  age.# of the fts
0a10: 20 69 6e 64 65 78 2e 20 46 6f 72 20 74 65 73 74   index. For test
0a20: 20 24 69 2c 20 74 72 75 6e 63 61 74 65 20 74 68   $i, truncate th
0a30: 65 20 72 69 67 68 74 6d 6f 73 74 20 6c 65 61 66  e rightmost leaf
0a40: 70 61 67 65 20 74 6f 20 24 69 0a 23 20 62 79 74  page to $i.# byt
0a50: 65 73 2e 20 54 68 65 6e 20 74 65 73 74 20 62 6f  es. Then test bo
0a60: 74 68 20 74 68 65 20 69 6e 74 65 67 72 69 74 79  th the integrity
0a70: 2d 63 68 65 63 6b 20 64 65 74 65 63 74 73 20 74  -check detects t
0a80: 68 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 23  he corruption..#
0a90: 0a 23 20 41 6c 73 6f 20 74 65 73 74 65 64 20 69  .# Also tested i
0aa0: 73 20 74 68 61 74 20 22 4d 41 54 43 48 20 27 78  s that "MATCH 'x
0ab0: 2a 27 22 20 64 6f 65 73 20 6e 6f 74 20 63 72 61  *'" does not cra
0ac0: 73 68 20 61 6e 64 20 73 6f 6d 65 74 69 6d 65 73  sh and sometimes
0ad0: 20 72 65 70 6f 72 74 73 0a 23 20 63 6f 72 72 75   reports.# corru
0ae0: 70 74 69 6f 6e 2e 20 49 74 20 6d 61 79 20 6e 6f  ption. It may no
0af0: 74 20 72 65 70 6f 72 74 20 74 68 65 20 64 62 20  t report the db 
0b00: 61 73 20 63 6f 72 72 75 70 74 20 62 65 63 61 75  as corrupt becau
0b10: 73 65 20 74 72 75 6e 63 61 74 69 6e 67 20 74 68  se truncating th
0b20: 65 0a 23 20 66 69 6e 61 6c 20 6c 65 61 66 20 74  e.# final leaf t
0b30: 6f 20 73 6f 6d 65 20 73 69 7a 65 73 20 6d 61 79  o some sizes may
0b40: 20 63 72 65 61 74 65 20 61 20 76 61 6c 69 64 20   create a valid 
0b50: 6c 65 61 66 20 70 61 67 65 2e 0a 23 0a 73 65 74  leaf page..#.set
0b60: 20 6c 72 6f 77 69 64 20 5b 64 62 20 6f 6e 65 20   lrowid [db one 
0b70: 7b 53 45 4c 45 43 54 20 6d 61 78 28 72 6f 77 69  {SELECT max(rowi
0b80: 64 29 20 46 52 4f 4d 20 74 31 5f 64 61 74 61 20  d) FROM t1_data 
0b90: 57 48 45 52 45 20 28 72 6f 77 69 64 20 26 20 24  WHERE (rowid & $
0ba0: 6d 61 73 6b 29 3d 30 7d 5d 20 0a 73 65 74 20 6e  mask)=0}] .set n
0bb0: 62 79 74 65 20 5b 64 62 20 6f 6e 65 20 7b 53 45  byte [db one {SE
0bc0: 4c 45 43 54 20 6c 65 6e 67 74 68 28 62 6c 6f 63  LECT length(bloc
0bd0: 6b 29 20 46 52 4f 4d 20 74 31 5f 64 61 74 61 20  k) FROM t1_data 
0be0: 57 48 45 52 45 20 72 6f 77 69 64 3d 24 6c 72 6f  WHERE rowid=$lro
0bf0: 77 69 64 7d 5d 0a 73 65 74 20 61 6c 6c 20 5b 64  wid}].set all [d
0c00: 62 20 65 76 61 6c 20 7b 53 45 4c 45 43 54 20 72  b eval {SELECT r
0c10: 6f 77 69 64 20 46 52 4f 4d 20 74 31 7d 5d 0a 73  owid FROM t1}].s
0c20: 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67  qlite3_db_config
0c30: 20 64 62 20 44 45 46 45 4e 53 49 56 45 20 30 0a   db DEFENSIVE 0.
0c40: 66 6f 72 20 7b 73 65 74 20 69 20 5b 65 78 70 72  for {set i [expr
0c50: 20 24 6e 62 79 74 65 2d 32 5d 7d 20 7b 24 69 3e   $nbyte-2]} {$i>
0c60: 3d 30 7d 20 7b 69 6e 63 72 20 69 20 2d 31 7d 20  =0} {incr i -1} 
0c70: 7b 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74  {.  do_execsql_t
0c80: 65 73 74 20 32 2e 24 69 2e 31 20 7b 0a 20 20 20  est 2.$i.1 {.   
0c90: 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 55 50   BEGIN;.      UP
0ca0: 44 41 54 45 20 74 31 5f 64 61 74 61 20 53 45 54  DATE t1_data SET
0cb0: 20 62 6c 6f 63 6b 20 3d 20 73 75 62 73 74 72 28   block = substr(
0cc0: 62 6c 6f 63 6b 2c 20 31 2c 20 24 69 29 20 57 48  block, 1, $i) WH
0cd0: 45 52 45 20 72 6f 77 69 64 3d 24 6c 72 6f 77 69  ERE rowid=$lrowi
0ce0: 64 3b 0a 20 20 7d 0a 0a 20 20 64 6f 5f 63 61 74  d;.  }..  do_cat
0cf0: 63 68 73 71 6c 5f 74 65 73 74 20 32 2e 24 69 2e  chsql_test 2.$i.
0d00: 32 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  2 {.    INSERT I
0d10: 4e 54 4f 20 74 31 28 74 31 29 20 56 41 4c 55 45  NTO t1(t1) VALUE
0d20: 53 28 27 69 6e 74 65 67 72 69 74 79 2d 63 68 65  S('integrity-che
0d30: 63 6b 27 29 3b 0a 20 20 7d 20 7b 31 20 7b 64 61  ck');.  } {1 {da
0d40: 74 61 62 61 73 65 20 64 69 73 6b 20 69 6d 61 67  tabase disk imag
0d50: 65 20 69 73 20 6d 61 6c 66 6f 72 6d 65 64 7d 7d  e is malformed}}
0d60: 0a 0a 20 20 64 6f 5f 74 65 73 74 20 32 2e 24 69  ..  do_test 2.$i
0d70: 2e 33 20 7b 0a 20 20 20 20 73 65 74 20 72 65 73  .3 {.    set res
0d80: 20 5b 63 61 74 63 68 73 71 6c 20 7b 53 45 4c 45   [catchsql {SELE
0d90: 43 54 20 72 6f 77 69 64 20 46 52 4f 4d 20 74 31  CT rowid FROM t1
0da0: 20 57 48 45 52 45 20 74 31 20 4d 41 54 43 48 20   WHERE t1 MATCH 
0db0: 27 78 2a 27 7d 5d 0a 20 20 20 20 65 78 70 72 20  'x*'}].    expr 
0dc0: 7b 0a 20 20 20 20 20 20 20 20 24 72 65 73 3d 3d  {.        $res==
0dd0: 22 31 20 7b 64 61 74 61 62 61 73 65 20 64 69 73  "1 {database dis
0de0: 6b 20 69 6d 61 67 65 20 69 73 20 6d 61 6c 66 6f  k image is malfo
0df0: 72 6d 65 64 7d 22 20 0a 20 20 20 20 20 7c 7c 20  rmed}" .     || 
0e00: 24 72 65 73 3d 3d 22 30 20 7b 24 61 6c 6c 7d 22  $res=="0 {$all}"
0e10: 20 0a 20 20 20 20 7d 0a 20 20 7d 20 31 0a 0a 20   .    }.  } 1.. 
0e20: 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74   do_execsql_test
0e30: 20 32 2e 24 69 2e 34 20 7b 0a 20 20 20 20 52 4f   2.$i.4 {.    RO
0e40: 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 49 4e 53 45  LLBACK;.    INSE
0e50: 52 54 20 49 4e 54 4f 20 74 31 28 74 31 29 20 56  RT INTO t1(t1) V
0e60: 41 4c 55 45 53 28 27 69 6e 74 65 67 72 69 74 79  ALUES('integrity
0e70: 2d 63 68 65 63 6b 27 29 3b 0a 20 20 7d 20 7b 7d  -check');.  } {}
0e80: 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .}..#-----------
0e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
0ed0: 20 54 65 73 74 20 74 68 61 74 20 63 6f 72 72 75   Test that corru
0ee0: 70 74 69 6f 6e 20 69 6e 20 6c 65 61 66 20 70 61  ption in leaf pa
0ef0: 67 65 20 68 65 61 64 65 72 73 20 69 73 20 64 65  ge headers is de
0f00: 74 65 63 74 65 64 20 62 79 20 71 75 65 72 69 65  tected by querie
0f10: 73 20 74 68 61 74 20 75 73 65 0a 23 20 64 6f 63  s that use.# doc
0f20: 6c 69 73 74 2d 69 6e 64 65 78 65 73 2e 0a 23 0a  list-indexes..#.
0f30: 73 65 74 20 64 6f 63 20 22 41 20 42 20 43 20 44  set doc "A B C D
0f40: 20 45 20 46 20 47 20 48 20 49 20 4a 20 22 0a 64   E F G H I J ".d
0f50: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 33  o_execsql_test 3
0f60: 2e 30 20 7b 0a 20 20 43 52 45 41 54 45 20 56 49  .0 {.  CREATE VI
0f70: 52 54 55 41 4c 20 54 41 42 4c 45 20 78 33 20 55  RTUAL TABLE x3 U
0f80: 53 49 4e 47 20 66 74 73 35 28 74 74 29 3b 0a 20  SING fts5(tt);. 
0f90: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 33 28   INSERT INTO x3(
0fa0: 78 33 2c 20 72 61 6e 6b 29 20 56 41 4c 55 45 53  x3, rank) VALUES
0fb0: 28 27 70 67 73 7a 27 2c 20 33 32 29 3b 0a 20 20  ('pgsz', 32);.  
0fc0: 57 49 54 48 20 69 69 28 69 29 20 41 53 20 28 53  WITH ii(i) AS (S
0fd0: 45 4c 45 43 54 20 31 20 55 4e 49 4f 4e 20 41 4c  ELECT 1 UNION AL
0fe0: 4c 20 53 45 4c 45 43 54 20 69 2b 31 20 46 52 4f  L SELECT i+1 FRO
0ff0: 4d 20 69 69 20 57 48 45 52 45 20 69 3c 31 30 30  M ii WHERE i<100
1000: 30 29 20 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  0) .  INSERT INT
1010: 4f 20 78 33 20 0a 20 20 53 45 4c 45 43 54 20 28  O x3 .  SELECT (
1020: 24 64 6f 63 20 7c 7c 20 43 41 53 45 20 57 48 45  $doc || CASE WHE
1030: 4e 20 28 69 25 35 30 29 3d 3d 30 20 54 48 45 4e  N (i%50)==0 THEN
1040: 20 27 58 27 20 45 4c 53 45 20 27 59 27 20 45 4e   'X' ELSE 'Y' EN
1050: 44 29 20 46 52 4f 4d 20 69 69 3b 0a 7d 0a 0a 66  D) FROM ii;.}..f
1060: 6f 72 65 61 63 68 20 7b 74 6e 20 68 64 72 7d 20  oreach {tn hdr} 
1070: 7b 0a 20 20 31 20 22 5c 78 30 30 5c 78 30 30 5c  {.  1 "\x00\x00\
1080: 78 30 30 5c 78 30 30 22 0a 20 20 32 20 22 5c 78  x00\x00".  2 "\x
1090: 46 46 5c 78 46 46 5c 78 46 46 5c 78 46 46 22 0a  FF\xFF\xFF\xFF".
10a0: 20 20 33 20 22 5c 78 34 34 5c 78 34 35 22 0a 7d    3 "\x44\x45".}
10b0: 20 7b 0a 20 20 73 65 74 20 74 6e 32 20 30 0a 20   {.  set tn2 0. 
10c0: 20 73 65 74 20 6e 43 6f 72 72 75 70 74 20 30 0a   set nCorrupt 0.
10d0: 20 20 73 65 74 20 6e 43 6f 72 72 75 70 74 32 20    set nCorrupt2 
10e0: 30 0a 20 20 66 6f 72 65 61 63 68 20 72 6f 77 69  0.  foreach rowi
10f0: 64 20 5b 64 62 20 65 76 61 6c 20 7b 53 45 4c 45  d [db eval {SELE
1100: 43 54 20 72 6f 77 69 64 20 46 52 4f 4d 20 78 33  CT rowid FROM x3
1110: 5f 64 61 74 61 20 57 48 45 52 45 20 72 6f 77 69  _data WHERE rowi
1120: 64 3e 31 30 7d 5d 20 7b 0a 20 20 20 20 69 66 20  d>10}] {.    if 
1130: 7b 24 72 6f 77 69 64 20 26 20 24 6d 61 73 6b 7d  {$rowid & $mask}
1140: 20 63 6f 6e 74 69 6e 75 65 0a 20 20 20 20 69 6e   continue.    in
1150: 63 72 20 74 6e 32 0a 20 20 20 20 64 6f 5f 74 65  cr tn2.    do_te
1160: 73 74 20 33 2e 24 74 6e 2e 24 74 6e 32 2e 31 20  st 3.$tn.$tn2.1 
1170: 7b 0a 20 20 20 20 20 20 65 78 65 63 73 71 6c 20  {.      execsql 
1180: 42 45 47 49 4e 0a 0a 20 20 20 20 20 20 73 65 74  BEGIN..      set
1190: 20 66 64 20 5b 64 62 20 69 6e 63 72 62 6c 6f 62   fd [db incrblob
11a0: 20 6d 61 69 6e 20 78 33 5f 64 61 74 61 20 62 6c   main x3_data bl
11b0: 6f 63 6b 20 24 72 6f 77 69 64 5d 0a 20 20 20 20  ock $rowid].    
11c0: 20 20 66 63 6f 6e 66 69 67 75 72 65 20 24 66 64    fconfigure $fd
11d0: 20 2d 65 6e 63 6f 64 69 6e 67 20 62 69 6e 61 72   -encoding binar
11e0: 79 20 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 20 62  y -translation b
11f0: 69 6e 61 72 79 0a 20 20 20 20 20 20 73 65 74 20  inary.      set 
1200: 65 78 69 73 74 69 6e 67 20 5b 72 65 61 64 20 24  existing [read $
1210: 66 64 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74  fd [string lengt
1220: 68 20 24 68 64 72 5d 5d 0a 20 20 20 20 20 20 73  h $hdr]].      s
1230: 65 65 6b 20 24 66 64 20 30 0a 20 20 20 20 20 20  eek $fd 0.      
1240: 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20  puts -nonewline 
1250: 24 66 64 20 24 68 64 72 0a 20 20 20 20 20 20 63  $fd $hdr.      c
1260: 6c 6f 73 65 20 24 66 64 0a 0a 20 20 20 20 20 20  lose $fd..      
1270: 73 65 74 20 72 65 73 20 5b 63 61 74 63 68 73 71  set res [catchsq
1280: 6c 20 7b 53 45 4c 45 43 54 20 72 6f 77 69 64 20  l {SELECT rowid 
1290: 46 52 4f 4d 20 78 33 20 57 48 45 52 45 20 78 33  FROM x3 WHERE x3
12a0: 20 4d 41 54 43 48 20 27 78 20 41 4e 44 20 61 27   MATCH 'x AND a'
12b0: 7d 5d 0a 20 20 20 20 20 20 69 66 20 7b 24 72 65  }].      if {$re
12c0: 73 20 3d 3d 20 22 31 20 7b 64 61 74 61 62 61 73  s == "1 {databas
12d0: 65 20 64 69 73 6b 20 69 6d 61 67 65 20 69 73 20  e disk image is 
12e0: 6d 61 6c 66 6f 72 6d 65 64 7d 22 7d 20 7b 69 6e  malformed}"} {in
12f0: 63 72 20 6e 43 6f 72 72 75 70 74 7d 0a 20 20 20  cr nCorrupt}.   
1300: 20 20 20 73 65 74 20 7b 7d 20 31 0a 20 20 20 20     set {} 1.    
1310: 7d 20 7b 31 7d 0a 0a 20 20 20 20 69 66 20 7b 28  } {1}..    if {(
1320: 24 74 6e 32 20 25 20 31 30 29 3d 3d 30 20 26 26  $tn2 % 10)==0 &&
1330: 20 24 65 78 69 73 74 69 6e 67 20 21 3d 20 24 68   $existing != $h
1340: 64 72 7d 20 7b 0a 20 20 20 20 20 20 64 6f 5f 74  dr} {.      do_t
1350: 65 73 74 20 33 2e 24 74 6e 2e 24 74 6e 32 2e 32  est 3.$tn.$tn2.2
1360: 20 7b 0a 20 20 20 20 20 20 20 20 63 61 74 63 68   {.        catch
1370: 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54  sql { INSERT INT
1380: 4f 20 78 33 28 78 33 29 20 56 41 4c 55 45 53 28  O x3(x3) VALUES(
1390: 27 69 6e 74 65 67 72 69 74 79 2d 63 68 65 63 6b  'integrity-check
13a0: 27 29 20 7d 0a 20 20 20 20 20 20 7d 20 7b 31 20  ') }.      } {1 
13b0: 7b 64 61 74 61 62 61 73 65 20 64 69 73 6b 20 69  {database disk i
13c0: 6d 61 67 65 20 69 73 20 6d 61 6c 66 6f 72 6d 65  mage is malforme
13d0: 64 7d 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 65  d}}.    }..    e
13e0: 78 65 63 73 71 6c 20 52 4f 4c 4c 42 41 43 4b 0a  xecsql ROLLBACK.
13f0: 20 20 7d 0a 0a 20 20 64 6f 5f 74 65 73 74 20 33    }..  do_test 3
1400: 2e 24 74 6e 2e 78 20 7b 20 65 78 70 72 20 24 6e  .$tn.x { expr $n
1410: 43 6f 72 72 75 70 74 3e 30 20 7d 20 31 0a 7d 0a  Corrupt>0 } 1.}.
1420: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
1430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1460: 2d 2d 2d 2d 2d 2d 0a 23 0a 73 65 74 20 64 6f 63  ------.#.set doc
1470: 20 22 41 20 42 20 43 20 44 20 45 20 46 20 47 20   "A B C D E F G 
1480: 48 20 49 20 4a 20 22 0a 64 6f 5f 65 78 65 63 73  H I J ".do_execs
1490: 71 6c 5f 74 65 73 74 20 34 2e 30 20 7b 0a 20 20  ql_test 4.0 {.  
14a0: 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54  CREATE VIRTUAL T
14b0: 41 42 4c 45 20 78 34 20 55 53 49 4e 47 20 66 74  ABLE x4 USING ft
14c0: 73 35 28 74 74 29 3b 0a 20 20 49 4e 53 45 52 54  s5(tt);.  INSERT
14d0: 20 49 4e 54 4f 20 78 34 28 78 34 2c 20 72 61 6e   INTO x4(x4, ran
14e0: 6b 29 20 56 41 4c 55 45 53 28 27 70 67 73 7a 27  k) VALUES('pgsz'
14f0: 2c 20 33 32 29 3b 0a 20 20 57 49 54 48 20 69 69  , 32);.  WITH ii
1500: 28 69 29 20 41 53 20 28 53 45 4c 45 43 54 20 31  (i) AS (SELECT 1
1510: 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43   UNION ALL SELEC
1520: 54 20 69 2b 31 20 46 52 4f 4d 20 69 69 20 57 48  T i+1 FROM ii WH
1530: 45 52 45 20 69 3c 31 30 29 20 0a 20 20 49 4e 53  ERE i<10) .  INS
1540: 45 52 54 20 49 4e 54 4f 20 78 34 20 0a 20 20 53  ERT INTO x4 .  S
1550: 45 4c 45 43 54 20 28 24 64 6f 63 20 7c 7c 20 43  ELECT ($doc || C
1560: 41 53 45 20 57 48 45 4e 20 28 69 25 35 30 29 3d  ASE WHEN (i%50)=
1570: 3d 30 20 54 48 45 4e 20 27 58 27 20 45 4c 53 45  =0 THEN 'X' ELSE
1580: 20 27 59 27 20 45 4e 44 29 20 46 52 4f 4d 20 69   'Y' END) FROM i
1590: 69 3b 0a 7d 0a 0a 66 6f 72 65 61 63 68 20 7b 74  i;.}..foreach {t
15a0: 6e 20 6e 43 75 74 7d 20 7b 0a 20 20 31 20 31 0a  n nCut} {.  1 1.
15b0: 20 20 32 20 31 30 0a 7d 20 7b 0a 20 20 73 65 74    2 10.} {.  set
15c0: 20 74 6e 32 20 30 0a 20 20 73 65 74 20 6e 43 6f   tn2 0.  set nCo
15d0: 72 72 75 70 74 20 30 0a 20 20 66 6f 72 65 61 63  rrupt 0.  foreac
15e0: 68 20 72 6f 77 69 64 20 5b 64 62 20 65 76 61 6c  h rowid [db eval
15f0: 20 7b 53 45 4c 45 43 54 20 72 6f 77 69 64 20 46   {SELECT rowid F
1600: 52 4f 4d 20 78 34 5f 64 61 74 61 20 57 48 45 52  ROM x4_data WHER
1610: 45 20 72 6f 77 69 64 3e 31 30 7d 5d 20 7b 0a 20  E rowid>10}] {. 
1620: 20 20 20 69 66 20 7b 24 72 6f 77 69 64 20 26 20     if {$rowid & 
1630: 24 6d 61 73 6b 7d 20 63 6f 6e 74 69 6e 75 65 0a  $mask} continue.
1640: 20 20 20 20 69 6e 63 72 20 74 6e 32 0a 20 20 20      incr tn2.   
1650: 20 64 6f 5f 74 65 73 74 20 34 2e 24 74 6e 2e 24   do_test 4.$tn.$
1660: 74 6e 32 20 7b 0a 20 20 20 20 20 20 65 78 65 63  tn2 {.      exec
1670: 73 71 6c 20 7b 0a 20 20 20 20 20 20 20 20 42 45  sql {.        BE
1680: 47 49 4e 3b 0a 20 20 20 20 20 20 20 20 20 20 55  GIN;.          U
1690: 50 44 41 54 45 20 78 34 5f 64 61 74 61 20 53 45  PDATE x4_data SE
16a0: 54 20 62 6c 6f 63 6b 20 3d 20 73 75 62 73 74 72  T block = substr
16b0: 28 62 6c 6f 63 6b 2c 20 31 2c 20 6c 65 6e 67 74  (block, 1, lengt
16c0: 68 28 62 6c 6f 63 6b 29 2d 24 6e 43 75 74 29 20  h(block)-$nCut) 
16d0: 0a 20 20 20 20 20 20 20 20 20 20 57 48 45 52 45  .          WHERE
16e0: 20 69 64 20 3d 20 24 72 6f 77 69 64 3b 0a 20 20   id = $rowid;.  
16f0: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 73 65 74      }..      set
1700: 20 72 65 73 20 5b 63 61 74 63 68 73 71 6c 20 7b   res [catchsql {
1710: 0a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20  .        SELECT 
1720: 72 6f 77 69 64 20 46 52 4f 4d 20 78 34 20 57 48  rowid FROM x4 WH
1730: 45 52 45 20 78 34 20 4d 41 54 43 48 20 27 61 27  ERE x4 MATCH 'a'
1740: 20 4f 52 44 45 52 20 42 59 20 31 20 44 45 53 43   ORDER BY 1 DESC
1750: 0a 20 20 20 20 20 20 7d 5d 0a 20 20 20 20 20 20  .      }].      
1760: 69 66 20 7b 24 72 65 73 20 3d 3d 20 22 31 20 7b  if {$res == "1 {
1770: 64 61 74 61 62 61 73 65 20 64 69 73 6b 20 69 6d  database disk im
1780: 61 67 65 20 69 73 20 6d 61 6c 66 6f 72 6d 65 64  age is malformed
1790: 7d 22 7d 20 7b 69 6e 63 72 20 6e 43 6f 72 72 75  }"} {incr nCorru
17a0: 70 74 7d 0a 20 20 20 20 20 20 73 65 74 20 7b 7d  pt}.      set {}
17b0: 20 31 0a 20 20 20 20 7d 20 7b 31 7d 0a 0a 20 20   1.    } {1}..  
17c0: 20 20 65 78 65 63 73 71 6c 20 52 4f 4c 4c 42 41    execsql ROLLBA
17d0: 43 4b 0a 20 20 7d 0a 0a 20 20 23 20 64 6f 5f 74  CK.  }..  # do_t
17e0: 65 73 74 20 34 2e 24 74 6e 2e 78 20 7b 20 65 78  est 4.$tn.x { ex
17f0: 70 72 20 24 6e 43 6f 72 72 75 70 74 3e 30 20 7d  pr $nCorrupt>0 }
1800: 20 31 0a 7d 0a 0a 73 65 74 20 64 6f 63 20 5b 73   1.}..set doc [s
1810: 74 72 69 6e 67 20 72 65 70 65 61 74 20 22 41 20  tring repeat "A 
1820: 42 20 43 20 22 20 31 30 30 30 5d 0a 64 6f 5f 65  B C " 1000].do_e
1830: 78 65 63 73 71 6c 5f 74 65 73 74 20 35 2e 30 20  xecsql_test 5.0 
1840: 7b 0a 20 20 43 52 45 41 54 45 20 56 49 52 54 55  {.  CREATE VIRTU
1850: 41 4c 20 54 41 42 4c 45 20 78 35 20 55 53 49 4e  AL TABLE x5 USIN
1860: 47 20 66 74 73 35 28 74 74 29 3b 0a 20 20 49 4e  G fts5(tt);.  IN
1870: 53 45 52 54 20 49 4e 54 4f 20 78 35 28 78 35 2c  SERT INTO x5(x5,
1880: 20 72 61 6e 6b 29 20 56 41 4c 55 45 53 28 27 70   rank) VALUES('p
1890: 67 73 7a 27 2c 20 33 32 29 3b 0a 20 20 57 49 54  gsz', 32);.  WIT
18a0: 48 20 69 69 28 69 29 20 41 53 20 28 53 45 4c 45  H ii(i) AS (SELE
18b0: 43 54 20 31 20 55 4e 49 4f 4e 20 41 4c 4c 20 53  CT 1 UNION ALL S
18c0: 45 4c 45 43 54 20 69 2b 31 20 46 52 4f 4d 20 69  ELECT i+1 FROM i
18d0: 69 20 57 48 45 52 45 20 69 3c 31 30 29 20 0a 20  i WHERE i<10) . 
18e0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 35 20   INSERT INTO x5 
18f0: 53 45 4c 45 43 54 20 24 64 6f 63 20 46 52 4f 4d  SELECT $doc FROM
1900: 20 69 69 3b 0a 7d 0a 0a 66 6f 72 65 61 63 68 20   ii;.}..foreach 
1910: 7b 74 6e 20 68 64 72 7d 20 7b 0a 20 20 31 20 22  {tn hdr} {.  1 "
1920: 5c 78 30 30 5c 78 30 31 22 0a 7d 20 7b 0a 20 20  \x00\x01".} {.  
1930: 73 65 74 20 74 6e 32 20 30 0a 20 20 73 65 74 20  set tn2 0.  set 
1940: 6e 43 6f 72 72 75 70 74 20 30 0a 20 20 66 6f 72  nCorrupt 0.  for
1950: 65 61 63 68 20 72 6f 77 69 64 20 5b 64 62 20 65  each rowid [db e
1960: 76 61 6c 20 7b 53 45 4c 45 43 54 20 72 6f 77 69  val {SELECT rowi
1970: 64 20 46 52 4f 4d 20 78 35 5f 64 61 74 61 20 57  d FROM x5_data W
1980: 48 45 52 45 20 72 6f 77 69 64 3e 31 30 7d 5d 20  HERE rowid>10}] 
1990: 7b 0a 20 20 20 20 69 66 20 7b 24 72 6f 77 69 64  {.    if {$rowid
19a0: 20 26 20 24 6d 61 73 6b 7d 20 63 6f 6e 74 69 6e   & $mask} contin
19b0: 75 65 0a 20 20 20 20 69 6e 63 72 20 74 6e 32 0a  ue.    incr tn2.
19c0: 20 20 20 20 64 6f 5f 74 65 73 74 20 35 2e 24 74      do_test 5.$t
19d0: 6e 2e 24 74 6e 32 20 7b 0a 20 20 20 20 20 20 65  n.$tn2 {.      e
19e0: 78 65 63 73 71 6c 20 42 45 47 49 4e 0a 0a 20 20  xecsql BEGIN..  
19f0: 20 20 20 20 73 65 74 20 66 64 20 5b 64 62 20 69      set fd [db i
1a00: 6e 63 72 62 6c 6f 62 20 6d 61 69 6e 20 78 35 5f  ncrblob main x5_
1a10: 64 61 74 61 20 62 6c 6f 63 6b 20 24 72 6f 77 69  data block $rowi
1a20: 64 5d 0a 20 20 20 20 20 20 66 63 6f 6e 66 69 67  d].      fconfig
1a30: 75 72 65 20 24 66 64 20 2d 65 6e 63 6f 64 69 6e  ure $fd -encodin
1a40: 67 20 62 69 6e 61 72 79 20 2d 74 72 61 6e 73 6c  g binary -transl
1a50: 61 74 69 6f 6e 20 62 69 6e 61 72 79 0a 20 20 20  ation binary.   
1a60: 20 20 20 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69     puts -nonewli
1a70: 6e 65 20 24 66 64 20 24 68 64 72 0a 20 20 20 20  ne $fd $hdr.    
1a80: 20 20 63 6c 6f 73 65 20 24 66 64 0a 0a 20 20 20    close $fd..   
1a90: 20 20 20 63 61 74 63 68 73 71 6c 20 7b 20 49 4e     catchsql { IN
1aa0: 53 45 52 54 20 49 4e 54 4f 20 78 35 28 78 35 29  SERT INTO x5(x5)
1ab0: 20 56 41 4c 55 45 53 28 27 69 6e 74 65 67 72 69   VALUES('integri
1ac0: 74 79 2d 63 68 65 63 6b 27 29 20 7d 0a 20 20 20  ty-check') }.   
1ad0: 20 20 20 73 65 74 20 7b 7d 20 7b 7d 0a 20 20 20     set {} {}.   
1ae0: 20 7d 20 7b 7d 0a 0a 20 20 20 20 65 78 65 63 73   } {}..    execs
1af0: 71 6c 20 52 4f 4c 4c 42 41 43 4b 0a 20 20 7d 0a  ql ROLLBACK.  }.
1b00: 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }..#------------
1b10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1b40: 2d 2d 2d 2d 2d 2d 2d 2d 0a 72 65 73 65 74 5f 64  --------.reset_d
1b50: 62 0a 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e  b.sqlite3_db_con
1b60: 66 69 67 20 64 62 20 44 45 46 45 4e 53 49 56 45  fig db DEFENSIVE
1b70: 20 30 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65   0.do_execsql_te
1b80: 73 74 20 36 2e 31 20 7b 0a 20 20 43 52 45 41 54  st 6.1 {.  CREAT
1b90: 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20  E VIRTUAL TABLE 
1ba0: 78 35 20 55 53 49 4e 47 20 66 74 73 35 28 74 74  x5 USING fts5(tt
1bb0: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
1bc0: 20 78 35 20 56 41 4c 55 45 53 28 27 61 27 29 3b   x5 VALUES('a');
1bd0: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78  .  INSERT INTO x
1be0: 35 20 56 41 4c 55 45 53 28 27 61 20 61 27 29 3b  5 VALUES('a a');
1bf0: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78  .  INSERT INTO x
1c00: 35 20 56 41 4c 55 45 53 28 27 61 20 61 20 61 27  5 VALUES('a a a'
1c10: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
1c20: 20 78 35 20 56 41 4c 55 45 53 28 27 61 20 61 20   x5 VALUES('a a 
1c30: 61 20 61 27 29 3b 0a 0a 20 20 55 50 44 41 54 45  a a');..  UPDATE
1c40: 20 78 35 5f 64 6f 63 73 69 7a 65 20 53 45 54 20   x5_docsize SET 
1c50: 73 7a 20 3d 20 58 27 27 20 57 48 45 52 45 20 69  sz = X'' WHERE i
1c60: 64 3d 33 3b 0a 7d 0a 70 72 6f 63 20 63 6f 6c 73  d=3;.}.proc cols
1c70: 69 7a 65 20 7b 63 6d 64 20 69 7d 20 7b 20 0a 20  ize {cmd i} { . 
1c80: 20 24 63 6d 64 20 78 43 6f 6c 75 6d 6e 53 69 7a   $cmd xColumnSiz
1c90: 65 20 24 69 0a 7d 0a 73 71 6c 69 74 65 33 5f 66  e $i.}.sqlite3_f
1ca0: 74 73 35 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  ts5_create_funct
1cb0: 69 6f 6e 20 64 62 20 63 6f 6c 73 69 7a 65 20 63  ion db colsize c
1cc0: 6f 6c 73 69 7a 65 0a 0a 64 6f 5f 63 61 74 63 68  olsize..do_catch
1cd0: 73 71 6c 5f 74 65 73 74 20 36 2e 32 20 7b 0a 20  sql_test 6.2 {. 
1ce0: 20 53 45 4c 45 43 54 20 63 6f 6c 73 69 7a 65 28   SELECT colsize(
1cf0: 78 35 2c 20 30 29 20 46 52 4f 4d 20 78 35 20 57  x5, 0) FROM x5 W
1d00: 48 45 52 45 20 78 35 20 4d 41 54 43 48 20 27 61  HERE x5 MATCH 'a
1d10: 27 0a 7d 20 7b 31 20 53 51 4c 49 54 45 5f 43 4f  '.} {1 SQLITE_CO
1d20: 52 52 55 50 54 5f 56 54 41 42 7d 0a 0a 0a 73 71  RRUPT_VTAB}...sq
1d30: 6c 69 74 65 33 5f 66 74 73 35 5f 6d 61 79 5f 62  lite3_fts5_may_b
1d40: 65 5f 63 6f 72 72 75 70 74 20 30 0a 66 69 6e 69  e_corrupt 0.fini
1d50: 73 68 5f 74 65 73 74 0a                          sh_test.