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

Artifact 128eb6e2d26b09f4da339e581f424b3321e0fdaa:


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 66  owid FROM t1}].f
0c20: 6f 72 20 7b 73 65 74 20 69 20 5b 65 78 70 72 20  or {set i [expr 
0c30: 24 6e 62 79 74 65 2d 32 5d 7d 20 7b 24 69 3e 3d  $nbyte-2]} {$i>=
0c40: 30 7d 20 7b 69 6e 63 72 20 69 20 2d 31 7d 20 7b  0} {incr i -1} {
0c50: 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  .  do_execsql_te
0c60: 73 74 20 32 2e 24 69 2e 31 20 7b 0a 20 20 20 20  st 2.$i.1 {.    
0c70: 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 55 50 44  BEGIN;.      UPD
0c80: 41 54 45 20 74 31 5f 64 61 74 61 20 53 45 54 20  ATE t1_data SET 
0c90: 62 6c 6f 63 6b 20 3d 20 73 75 62 73 74 72 28 62  block = substr(b
0ca0: 6c 6f 63 6b 2c 20 31 2c 20 24 69 29 20 57 48 45  lock, 1, $i) WHE
0cb0: 52 45 20 72 6f 77 69 64 3d 24 6c 72 6f 77 69 64  RE rowid=$lrowid
0cc0: 3b 0a 20 20 7d 0a 0a 20 20 64 6f 5f 63 61 74 63  ;.  }..  do_catc
0cd0: 68 73 71 6c 5f 74 65 73 74 20 32 2e 24 69 2e 32  hsql_test 2.$i.2
0ce0: 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e   {.    INSERT IN
0cf0: 54 4f 20 74 31 28 74 31 29 20 56 41 4c 55 45 53  TO t1(t1) VALUES
0d00: 28 27 69 6e 74 65 67 72 69 74 79 2d 63 68 65 63  ('integrity-chec
0d10: 6b 27 29 3b 0a 20 20 7d 20 7b 31 20 7b 64 61 74  k');.  } {1 {dat
0d20: 61 62 61 73 65 20 64 69 73 6b 20 69 6d 61 67 65  abase disk image
0d30: 20 69 73 20 6d 61 6c 66 6f 72 6d 65 64 7d 7d 0a   is malformed}}.
0d40: 0a 20 20 64 6f 5f 74 65 73 74 20 32 2e 24 69 2e  .  do_test 2.$i.
0d50: 33 20 7b 0a 20 20 20 20 73 65 74 20 72 65 73 20  3 {.    set res 
0d60: 5b 63 61 74 63 68 73 71 6c 20 7b 53 45 4c 45 43  [catchsql {SELEC
0d70: 54 20 72 6f 77 69 64 20 46 52 4f 4d 20 74 31 20  T rowid FROM t1 
0d80: 57 48 45 52 45 20 74 31 20 4d 41 54 43 48 20 27  WHERE t1 MATCH '
0d90: 78 2a 27 7d 5d 0a 20 20 20 20 65 78 70 72 20 7b  x*'}].    expr {
0da0: 0a 20 20 20 20 20 20 20 20 24 72 65 73 3d 3d 22  .        $res=="
0db0: 31 20 7b 64 61 74 61 62 61 73 65 20 64 69 73 6b  1 {database disk
0dc0: 20 69 6d 61 67 65 20 69 73 20 6d 61 6c 66 6f 72   image is malfor
0dd0: 6d 65 64 7d 22 20 0a 20 20 20 20 20 7c 7c 20 24  med}" .     || $
0de0: 72 65 73 3d 3d 22 30 20 7b 24 61 6c 6c 7d 22 20  res=="0 {$all}" 
0df0: 0a 20 20 20 20 7d 0a 20 20 7d 20 31 0a 0a 20 20  .    }.  } 1..  
0e00: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
0e10: 32 2e 24 69 2e 34 20 7b 0a 20 20 20 20 52 4f 4c  2.$i.4 {.    ROL
0e20: 4c 42 41 43 4b 3b 0a 20 20 20 20 49 4e 53 45 52  LBACK;.    INSER
0e30: 54 20 49 4e 54 4f 20 74 31 28 74 31 29 20 56 41  T INTO t1(t1) VA
0e40: 4c 55 45 53 28 27 69 6e 74 65 67 72 69 74 79 2d  LUES('integrity-
0e50: 63 68 65 63 6b 27 29 3b 0a 20 20 7d 20 7b 7d 0a  check');.  } {}.
0e60: 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }..#------------
0e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0e80: 2d 2d 2d 2d 2d 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 0a 23 20  -------------.# 
0eb0: 54 65 73 74 20 74 68 61 74 20 63 6f 72 72 75 70  Test that corrup
0ec0: 74 69 6f 6e 20 69 6e 20 6c 65 61 66 20 70 61 67  tion in leaf pag
0ed0: 65 20 68 65 61 64 65 72 73 20 69 73 20 64 65 74  e headers is det
0ee0: 65 63 74 65 64 20 62 79 20 71 75 65 72 69 65 73  ected by queries
0ef0: 20 74 68 61 74 20 75 73 65 0a 23 20 64 6f 63 6c   that use.# docl
0f00: 69 73 74 2d 69 6e 64 65 78 65 73 2e 0a 23 0a 73  ist-indexes..#.s
0f10: 65 74 20 64 6f 63 20 22 41 20 42 20 43 20 44 20  et doc "A B C D 
0f20: 45 20 46 20 47 20 48 20 49 20 4a 20 22 0a 64 6f  E F G H I J ".do
0f30: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 33 2e  _execsql_test 3.
0f40: 30 20 7b 0a 20 20 43 52 45 41 54 45 20 56 49 52  0 {.  CREATE VIR
0f50: 54 55 41 4c 20 54 41 42 4c 45 20 78 33 20 55 53  TUAL TABLE x3 US
0f60: 49 4e 47 20 66 74 73 35 28 74 74 29 3b 0a 20 20  ING fts5(tt);.  
0f70: 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 33 28 78  INSERT INTO x3(x
0f80: 33 2c 20 72 61 6e 6b 29 20 56 41 4c 55 45 53 28  3, rank) VALUES(
0f90: 27 70 67 73 7a 27 2c 20 33 32 29 3b 0a 20 20 57  'pgsz', 32);.  W
0fa0: 49 54 48 20 69 69 28 69 29 20 41 53 20 28 53 45  ITH ii(i) AS (SE
0fb0: 4c 45 43 54 20 31 20 55 4e 49 4f 4e 20 41 4c 4c  LECT 1 UNION ALL
0fc0: 20 53 45 4c 45 43 54 20 69 2b 31 20 46 52 4f 4d   SELECT i+1 FROM
0fd0: 20 69 69 20 57 48 45 52 45 20 69 3c 31 30 30 30   ii WHERE i<1000
0fe0: 29 20 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  ) .  INSERT INTO
0ff0: 20 78 33 20 0a 20 20 53 45 4c 45 43 54 20 28 24   x3 .  SELECT ($
1000: 64 6f 63 20 7c 7c 20 43 41 53 45 20 57 48 45 4e  doc || CASE WHEN
1010: 20 28 69 25 35 30 29 3d 3d 30 20 54 48 45 4e 20   (i%50)==0 THEN 
1020: 27 58 27 20 45 4c 53 45 20 27 59 27 20 45 4e 44  'X' ELSE 'Y' END
1030: 29 20 46 52 4f 4d 20 69 69 3b 0a 7d 0a 0a 66 6f  ) FROM ii;.}..fo
1040: 72 65 61 63 68 20 7b 74 6e 20 68 64 72 7d 20 7b  reach {tn hdr} {
1050: 0a 20 20 31 20 22 5c 78 30 30 5c 78 30 30 5c 78  .  1 "\x00\x00\x
1060: 30 30 5c 78 30 30 22 0a 20 20 32 20 22 5c 78 46  00\x00".  2 "\xF
1070: 46 5c 78 46 46 5c 78 46 46 5c 78 46 46 22 0a 20  F\xFF\xFF\xFF". 
1080: 20 33 20 22 5c 78 34 34 5c 78 34 35 22 0a 7d 20   3 "\x44\x45".} 
1090: 7b 0a 20 20 73 65 74 20 74 6e 32 20 30 0a 20 20  {.  set tn2 0.  
10a0: 73 65 74 20 6e 43 6f 72 72 75 70 74 20 30 0a 20  set nCorrupt 0. 
10b0: 20 73 65 74 20 6e 43 6f 72 72 75 70 74 32 20 30   set nCorrupt2 0
10c0: 0a 20 20 66 6f 72 65 61 63 68 20 72 6f 77 69 64  .  foreach rowid
10d0: 20 5b 64 62 20 65 76 61 6c 20 7b 53 45 4c 45 43   [db eval {SELEC
10e0: 54 20 72 6f 77 69 64 20 46 52 4f 4d 20 78 33 5f  T rowid FROM x3_
10f0: 64 61 74 61 20 57 48 45 52 45 20 72 6f 77 69 64  data WHERE rowid
1100: 3e 31 30 7d 5d 20 7b 0a 20 20 20 20 69 66 20 7b  >10}] {.    if {
1110: 24 72 6f 77 69 64 20 26 20 24 6d 61 73 6b 7d 20  $rowid & $mask} 
1120: 63 6f 6e 74 69 6e 75 65 0a 20 20 20 20 69 6e 63  continue.    inc
1130: 72 20 74 6e 32 0a 20 20 20 20 64 6f 5f 74 65 73  r tn2.    do_tes
1140: 74 20 33 2e 24 74 6e 2e 24 74 6e 32 2e 31 20 7b  t 3.$tn.$tn2.1 {
1150: 0a 20 20 20 20 20 20 65 78 65 63 73 71 6c 20 42  .      execsql B
1160: 45 47 49 4e 0a 0a 20 20 20 20 20 20 73 65 74 20  EGIN..      set 
1170: 66 64 20 5b 64 62 20 69 6e 63 72 62 6c 6f 62 20  fd [db incrblob 
1180: 6d 61 69 6e 20 78 33 5f 64 61 74 61 20 62 6c 6f  main x3_data blo
1190: 63 6b 20 24 72 6f 77 69 64 5d 0a 20 20 20 20 20  ck $rowid].     
11a0: 20 66 63 6f 6e 66 69 67 75 72 65 20 24 66 64 20   fconfigure $fd 
11b0: 2d 65 6e 63 6f 64 69 6e 67 20 62 69 6e 61 72 79  -encoding binary
11c0: 20 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 20 62 69   -translation bi
11d0: 6e 61 72 79 0a 20 20 20 20 20 20 73 65 74 20 65  nary.      set e
11e0: 78 69 73 74 69 6e 67 20 5b 72 65 61 64 20 24 66  xisting [read $f
11f0: 64 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68  d [string length
1200: 20 24 68 64 72 5d 5d 0a 20 20 20 20 20 20 73 65   $hdr]].      se
1210: 65 6b 20 24 66 64 20 30 0a 20 20 20 20 20 20 70  ek $fd 0.      p
1220: 75 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 24  uts -nonewline $
1230: 66 64 20 24 68 64 72 0a 20 20 20 20 20 20 63 6c  fd $hdr.      cl
1240: 6f 73 65 20 24 66 64 0a 0a 20 20 20 20 20 20 73  ose $fd..      s
1250: 65 74 20 72 65 73 20 5b 63 61 74 63 68 73 71 6c  et res [catchsql
1260: 20 7b 53 45 4c 45 43 54 20 72 6f 77 69 64 20 46   {SELECT rowid F
1270: 52 4f 4d 20 78 33 20 57 48 45 52 45 20 78 33 20  ROM x3 WHERE x3 
1280: 4d 41 54 43 48 20 27 78 20 41 4e 44 20 61 27 7d  MATCH 'x AND a'}
1290: 5d 0a 20 20 20 20 20 20 69 66 20 7b 24 72 65 73  ].      if {$res
12a0: 20 3d 3d 20 22 31 20 7b 64 61 74 61 62 61 73 65   == "1 {database
12b0: 20 64 69 73 6b 20 69 6d 61 67 65 20 69 73 20 6d   disk image is m
12c0: 61 6c 66 6f 72 6d 65 64 7d 22 7d 20 7b 69 6e 63  alformed}"} {inc
12d0: 72 20 6e 43 6f 72 72 75 70 74 7d 0a 20 20 20 20  r nCorrupt}.    
12e0: 20 20 73 65 74 20 7b 7d 20 31 0a 20 20 20 20 7d    set {} 1.    }
12f0: 20 7b 31 7d 0a 0a 20 20 20 20 69 66 20 7b 28 24   {1}..    if {($
1300: 74 6e 32 20 25 20 31 30 29 3d 3d 30 20 26 26 20  tn2 % 10)==0 && 
1310: 24 65 78 69 73 74 69 6e 67 20 21 3d 20 24 68 64  $existing != $hd
1320: 72 7d 20 7b 0a 20 20 20 20 20 20 64 6f 5f 74 65  r} {.      do_te
1330: 73 74 20 33 2e 24 74 6e 2e 24 74 6e 32 2e 32 20  st 3.$tn.$tn2.2 
1340: 7b 0a 20 20 20 20 20 20 20 20 63 61 74 63 68 73  {.        catchs
1350: 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f  ql { INSERT INTO
1360: 20 78 33 28 78 33 29 20 56 41 4c 55 45 53 28 27   x3(x3) VALUES('
1370: 69 6e 74 65 67 72 69 74 79 2d 63 68 65 63 6b 27  integrity-check'
1380: 29 20 7d 0a 20 20 20 20 20 20 7d 20 7b 31 20 7b  ) }.      } {1 {
1390: 64 61 74 61 62 61 73 65 20 64 69 73 6b 20 69 6d  database disk im
13a0: 61 67 65 20 69 73 20 6d 61 6c 66 6f 72 6d 65 64  age is malformed
13b0: 7d 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 65 78  }}.    }..    ex
13c0: 65 63 73 71 6c 20 52 4f 4c 4c 42 41 43 4b 0a 20  ecsql ROLLBACK. 
13d0: 20 7d 0a 0a 20 20 64 6f 5f 74 65 73 74 20 33 2e   }..  do_test 3.
13e0: 24 74 6e 2e 78 20 7b 20 65 78 70 72 20 24 6e 43  $tn.x { expr $nC
13f0: 6f 72 72 75 70 74 3e 30 20 7d 20 31 0a 7d 0a 0a  orrupt>0 } 1.}..
1400: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
1410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1420: 2d 2d 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 0a 23 0a 73 65 74 20 64 6f 63 20  -----.#.set doc 
1450: 22 41 20 42 20 43 20 44 20 45 20 46 20 47 20 48  "A B C D E F G H
1460: 20 49 20 4a 20 22 0a 64 6f 5f 65 78 65 63 73 71   I J ".do_execsq
1470: 6c 5f 74 65 73 74 20 34 2e 30 20 7b 0a 20 20 43  l_test 4.0 {.  C
1480: 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41  REATE VIRTUAL TA
1490: 42 4c 45 20 78 34 20 55 53 49 4e 47 20 66 74 73  BLE x4 USING fts
14a0: 35 28 74 74 29 3b 0a 20 20 49 4e 53 45 52 54 20  5(tt);.  INSERT 
14b0: 49 4e 54 4f 20 78 34 28 78 34 2c 20 72 61 6e 6b  INTO x4(x4, rank
14c0: 29 20 56 41 4c 55 45 53 28 27 70 67 73 7a 27 2c  ) VALUES('pgsz',
14d0: 20 33 32 29 3b 0a 20 20 57 49 54 48 20 69 69 28   32);.  WITH ii(
14e0: 69 29 20 41 53 20 28 53 45 4c 45 43 54 20 31 20  i) AS (SELECT 1 
14f0: 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54  UNION ALL SELECT
1500: 20 69 2b 31 20 46 52 4f 4d 20 69 69 20 57 48 45   i+1 FROM ii WHE
1510: 52 45 20 69 3c 31 30 29 20 0a 20 20 49 4e 53 45  RE i<10) .  INSE
1520: 52 54 20 49 4e 54 4f 20 78 34 20 0a 20 20 53 45  RT INTO x4 .  SE
1530: 4c 45 43 54 20 28 24 64 6f 63 20 7c 7c 20 43 41  LECT ($doc || CA
1540: 53 45 20 57 48 45 4e 20 28 69 25 35 30 29 3d 3d  SE WHEN (i%50)==
1550: 30 20 54 48 45 4e 20 27 58 27 20 45 4c 53 45 20  0 THEN 'X' ELSE 
1560: 27 59 27 20 45 4e 44 29 20 46 52 4f 4d 20 69 69  'Y' END) FROM ii
1570: 3b 0a 7d 0a 0a 66 6f 72 65 61 63 68 20 7b 74 6e  ;.}..foreach {tn
1580: 20 6e 43 75 74 7d 20 7b 0a 20 20 31 20 31 0a 20   nCut} {.  1 1. 
1590: 20 32 20 31 30 0a 7d 20 7b 0a 20 20 73 65 74 20   2 10.} {.  set 
15a0: 74 6e 32 20 30 0a 20 20 73 65 74 20 6e 43 6f 72  tn2 0.  set nCor
15b0: 72 75 70 74 20 30 0a 20 20 66 6f 72 65 61 63 68  rupt 0.  foreach
15c0: 20 72 6f 77 69 64 20 5b 64 62 20 65 76 61 6c 20   rowid [db eval 
15d0: 7b 53 45 4c 45 43 54 20 72 6f 77 69 64 20 46 52  {SELECT rowid FR
15e0: 4f 4d 20 78 34 5f 64 61 74 61 20 57 48 45 52 45  OM x4_data WHERE
15f0: 20 72 6f 77 69 64 3e 31 30 7d 5d 20 7b 0a 20 20   rowid>10}] {.  
1600: 20 20 69 66 20 7b 24 72 6f 77 69 64 20 26 20 24    if {$rowid & $
1610: 6d 61 73 6b 7d 20 63 6f 6e 74 69 6e 75 65 0a 20  mask} continue. 
1620: 20 20 20 69 6e 63 72 20 74 6e 32 0a 20 20 20 20     incr tn2.    
1630: 64 6f 5f 74 65 73 74 20 34 2e 24 74 6e 2e 24 74  do_test 4.$tn.$t
1640: 6e 32 20 7b 0a 20 20 20 20 20 20 65 78 65 63 73  n2 {.      execs
1650: 71 6c 20 7b 0a 20 20 20 20 20 20 20 20 42 45 47  ql {.        BEG
1660: 49 4e 3b 0a 20 20 20 20 20 20 20 20 20 20 55 50  IN;.          UP
1670: 44 41 54 45 20 78 34 5f 64 61 74 61 20 53 45 54  DATE x4_data SET
1680: 20 62 6c 6f 63 6b 20 3d 20 73 75 62 73 74 72 28   block = substr(
1690: 62 6c 6f 63 6b 2c 20 31 2c 20 6c 65 6e 67 74 68  block, 1, length
16a0: 28 62 6c 6f 63 6b 29 2d 24 6e 43 75 74 29 20 0a  (block)-$nCut) .
16b0: 20 20 20 20 20 20 20 20 20 20 57 48 45 52 45 20            WHERE 
16c0: 69 64 20 3d 20 24 72 6f 77 69 64 3b 0a 20 20 20  id = $rowid;.   
16d0: 20 20 20 7d 0a 0a 20 20 20 20 20 20 73 65 74 20     }..      set 
16e0: 72 65 73 20 5b 63 61 74 63 68 73 71 6c 20 7b 0a  res [catchsql {.
16f0: 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 72          SELECT r
1700: 6f 77 69 64 20 46 52 4f 4d 20 78 34 20 57 48 45  owid FROM x4 WHE
1710: 52 45 20 78 34 20 4d 41 54 43 48 20 27 61 27 20  RE x4 MATCH 'a' 
1720: 4f 52 44 45 52 20 42 59 20 31 20 44 45 53 43 0a  ORDER BY 1 DESC.
1730: 20 20 20 20 20 20 7d 5d 0a 20 20 20 20 20 20 69        }].      i
1740: 66 20 7b 24 72 65 73 20 3d 3d 20 22 31 20 7b 64  f {$res == "1 {d
1750: 61 74 61 62 61 73 65 20 64 69 73 6b 20 69 6d 61  atabase disk ima
1760: 67 65 20 69 73 20 6d 61 6c 66 6f 72 6d 65 64 7d  ge is malformed}
1770: 22 7d 20 7b 69 6e 63 72 20 6e 43 6f 72 72 75 70  "} {incr nCorrup
1780: 74 7d 0a 20 20 20 20 20 20 73 65 74 20 7b 7d 20  t}.      set {} 
1790: 31 0a 20 20 20 20 7d 20 7b 31 7d 0a 0a 20 20 20  1.    } {1}..   
17a0: 20 65 78 65 63 73 71 6c 20 52 4f 4c 4c 42 41 43   execsql ROLLBAC
17b0: 4b 0a 20 20 7d 0a 0a 20 20 23 20 64 6f 5f 74 65  K.  }..  # do_te
17c0: 73 74 20 34 2e 24 74 6e 2e 78 20 7b 20 65 78 70  st 4.$tn.x { exp
17d0: 72 20 24 6e 43 6f 72 72 75 70 74 3e 30 20 7d 20  r $nCorrupt>0 } 
17e0: 31 0a 7d 0a 0a 73 65 74 20 64 6f 63 20 5b 73 74  1.}..set doc [st
17f0: 72 69 6e 67 20 72 65 70 65 61 74 20 22 41 20 42  ring repeat "A B
1800: 20 43 20 22 20 31 30 30 30 5d 0a 64 6f 5f 65 78   C " 1000].do_ex
1810: 65 63 73 71 6c 5f 74 65 73 74 20 35 2e 30 20 7b  ecsql_test 5.0 {
1820: 0a 20 20 43 52 45 41 54 45 20 56 49 52 54 55 41  .  CREATE VIRTUA
1830: 4c 20 54 41 42 4c 45 20 78 35 20 55 53 49 4e 47  L TABLE x5 USING
1840: 20 66 74 73 35 28 74 74 29 3b 0a 20 20 49 4e 53   fts5(tt);.  INS
1850: 45 52 54 20 49 4e 54 4f 20 78 35 28 78 35 2c 20  ERT INTO x5(x5, 
1860: 72 61 6e 6b 29 20 56 41 4c 55 45 53 28 27 70 67  rank) VALUES('pg
1870: 73 7a 27 2c 20 33 32 29 3b 0a 20 20 57 49 54 48  sz', 32);.  WITH
1880: 20 69 69 28 69 29 20 41 53 20 28 53 45 4c 45 43   ii(i) AS (SELEC
1890: 54 20 31 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45  T 1 UNION ALL SE
18a0: 4c 45 43 54 20 69 2b 31 20 46 52 4f 4d 20 69 69  LECT i+1 FROM ii
18b0: 20 57 48 45 52 45 20 69 3c 31 30 29 20 0a 20 20   WHERE i<10) .  
18c0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 35 20 53  INSERT INTO x5 S
18d0: 45 4c 45 43 54 20 24 64 6f 63 20 46 52 4f 4d 20  ELECT $doc FROM 
18e0: 69 69 3b 0a 7d 0a 0a 66 6f 72 65 61 63 68 20 7b  ii;.}..foreach {
18f0: 74 6e 20 68 64 72 7d 20 7b 0a 20 20 31 20 22 5c  tn hdr} {.  1 "\
1900: 78 30 30 5c 78 30 31 22 0a 7d 20 7b 0a 20 20 73  x00\x01".} {.  s
1910: 65 74 20 74 6e 32 20 30 0a 20 20 73 65 74 20 6e  et tn2 0.  set n
1920: 43 6f 72 72 75 70 74 20 30 0a 20 20 66 6f 72 65  Corrupt 0.  fore
1930: 61 63 68 20 72 6f 77 69 64 20 5b 64 62 20 65 76  ach rowid [db ev
1940: 61 6c 20 7b 53 45 4c 45 43 54 20 72 6f 77 69 64  al {SELECT rowid
1950: 20 46 52 4f 4d 20 78 35 5f 64 61 74 61 20 57 48   FROM x5_data WH
1960: 45 52 45 20 72 6f 77 69 64 3e 31 30 7d 5d 20 7b  ERE rowid>10}] {
1970: 0a 20 20 20 20 69 66 20 7b 24 72 6f 77 69 64 20  .    if {$rowid 
1980: 26 20 24 6d 61 73 6b 7d 20 63 6f 6e 74 69 6e 75  & $mask} continu
1990: 65 0a 20 20 20 20 69 6e 63 72 20 74 6e 32 0a 20  e.    incr tn2. 
19a0: 20 20 20 64 6f 5f 74 65 73 74 20 35 2e 24 74 6e     do_test 5.$tn
19b0: 2e 24 74 6e 32 20 7b 0a 20 20 20 20 20 20 65 78  .$tn2 {.      ex
19c0: 65 63 73 71 6c 20 42 45 47 49 4e 0a 0a 20 20 20  ecsql BEGIN..   
19d0: 20 20 20 73 65 74 20 66 64 20 5b 64 62 20 69 6e     set fd [db in
19e0: 63 72 62 6c 6f 62 20 6d 61 69 6e 20 78 35 5f 64  crblob main x5_d
19f0: 61 74 61 20 62 6c 6f 63 6b 20 24 72 6f 77 69 64  ata block $rowid
1a00: 5d 0a 20 20 20 20 20 20 66 63 6f 6e 66 69 67 75  ].      fconfigu
1a10: 72 65 20 24 66 64 20 2d 65 6e 63 6f 64 69 6e 67  re $fd -encoding
1a20: 20 62 69 6e 61 72 79 20 2d 74 72 61 6e 73 6c 61   binary -transla
1a30: 74 69 6f 6e 20 62 69 6e 61 72 79 0a 20 20 20 20  tion binary.    
1a40: 20 20 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e    puts -nonewlin
1a50: 65 20 24 66 64 20 24 68 64 72 0a 20 20 20 20 20  e $fd $hdr.     
1a60: 20 63 6c 6f 73 65 20 24 66 64 0a 0a 20 20 20 20   close $fd..    
1a70: 20 20 63 61 74 63 68 73 71 6c 20 7b 20 49 4e 53    catchsql { INS
1a80: 45 52 54 20 49 4e 54 4f 20 78 35 28 78 35 29 20  ERT INTO x5(x5) 
1a90: 56 41 4c 55 45 53 28 27 69 6e 74 65 67 72 69 74  VALUES('integrit
1aa0: 79 2d 63 68 65 63 6b 27 29 20 7d 0a 20 20 20 20  y-check') }.    
1ab0: 20 20 73 65 74 20 7b 7d 20 7b 7d 0a 20 20 20 20    set {} {}.    
1ac0: 7d 20 7b 7d 0a 0a 20 20 20 20 65 78 65 63 73 71  } {}..    execsq
1ad0: 6c 20 52 4f 4c 4c 42 41 43 4b 0a 20 20 7d 0a 7d  l ROLLBACK.  }.}
1ae0: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
1af0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1b00: 2d 2d 2d 2d 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 0a 72 65 73 65 74 5f 64 62  -------.reset_db
1b30: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
1b40: 20 36 2e 31 20 7b 0a 20 20 43 52 45 41 54 45 20   6.1 {.  CREATE 
1b50: 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 78 35  VIRTUAL TABLE x5
1b60: 20 55 53 49 4e 47 20 66 74 73 35 28 74 74 29 3b   USING fts5(tt);
1b70: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78  .  INSERT INTO x
1b80: 35 20 56 41 4c 55 45 53 28 27 61 27 29 3b 0a 20  5 VALUES('a');. 
1b90: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 35 20   INSERT INTO x5 
1ba0: 56 41 4c 55 45 53 28 27 61 20 61 27 29 3b 0a 20  VALUES('a a');. 
1bb0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 35 20   INSERT INTO x5 
1bc0: 56 41 4c 55 45 53 28 27 61 20 61 20 61 27 29 3b  VALUES('a a 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 20 61 20  5 VALUES('a a a 
1bf0: 61 27 29 3b 0a 0a 20 20 55 50 44 41 54 45 20 78  a');..  UPDATE x
1c00: 35 5f 64 6f 63 73 69 7a 65 20 53 45 54 20 73 7a  5_docsize SET sz
1c10: 20 3d 20 58 27 27 20 57 48 45 52 45 20 69 64 3d   = X'' WHERE id=
1c20: 33 3b 0a 7d 0a 70 72 6f 63 20 63 6f 6c 73 69 7a  3;.}.proc colsiz
1c30: 65 20 7b 63 6d 64 20 69 7d 20 7b 20 0a 20 20 24  e {cmd i} { .  $
1c40: 63 6d 64 20 78 43 6f 6c 75 6d 6e 53 69 7a 65 20  cmd xColumnSize 
1c50: 24 69 0a 7d 0a 73 71 6c 69 74 65 33 5f 66 74 73  $i.}.sqlite3_fts
1c60: 35 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  5_create_functio
1c70: 6e 20 64 62 20 63 6f 6c 73 69 7a 65 20 63 6f 6c  n db colsize col
1c80: 73 69 7a 65 0a 0a 64 6f 5f 63 61 74 63 68 73 71  size..do_catchsq
1c90: 6c 5f 74 65 73 74 20 36 2e 32 20 7b 0a 20 20 53  l_test 6.2 {.  S
1ca0: 45 4c 45 43 54 20 63 6f 6c 73 69 7a 65 28 78 35  ELECT colsize(x5
1cb0: 2c 20 30 29 20 46 52 4f 4d 20 78 35 20 57 48 45  , 0) FROM x5 WHE
1cc0: 52 45 20 78 35 20 4d 41 54 43 48 20 27 61 27 0a  RE x5 MATCH 'a'.
1cd0: 7d 20 7b 31 20 53 51 4c 49 54 45 5f 43 4f 52 52  } {1 SQLITE_CORR
1ce0: 55 50 54 5f 56 54 41 42 7d 0a 0a 0a 73 71 6c 69  UPT_VTAB}...sqli
1cf0: 74 65 33 5f 66 74 73 35 5f 6d 61 79 5f 62 65 5f  te3_fts5_may_be_
1d00: 63 6f 72 72 75 70 74 20 30 0a 66 69 6e 69 73 68  corrupt 0.finish
1d10: 5f 74 65 73 74 0a 0a                             _test..