/ Hex Artifact Content
Login

Artifact b8790ec170a8dc1942a15aef3db926a5f3061b1ff171013003d8297203a20ad6:


0000: 23 20 32 30 31 34 20 44 65 63 20 32 30 0a 23 0a  # 2014 Dec 20.#.
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 65 73 74 73 20 6f 66  ***.#.# Tests of
0170: 20 74 68 65 20 73 63 61 6c 61 72 20 66 74 73 35   the scalar fts5
0180: 5f 72 6f 77 69 64 28 29 20 61 6e 64 20 66 74 73  _rowid() and fts
0190: 35 5f 64 65 63 6f 64 65 28 29 20 66 75 6e 63 74  5_decode() funct
01a0: 69 6f 6e 73 2e 0a 23 0a 0a 73 6f 75 72 63 65 20  ions..#..source 
01b0: 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 66 69 6c 65  [file join [file
01c0: 20 64 69 72 6e 61 6d 65 20 5b 69 6e 66 6f 20 73   dirname [info s
01d0: 63 72 69 70 74 5d 5d 20 66 74 73 35 5f 63 6f 6d  cript]] fts5_com
01e0: 6d 6f 6e 2e 74 63 6c 5d 0a 73 65 74 20 74 65 73  mon.tcl].set tes
01f0: 74 70 72 65 66 69 78 20 66 74 73 35 72 6f 77 69  tprefix fts5rowi
0200: 64 0a 0a 23 20 49 66 20 53 51 4c 49 54 45 5f 45  d..# If SQLITE_E
0210: 4e 41 42 4c 45 5f 46 54 53 35 20 69 73 20 64 65  NABLE_FTS5 is de
0220: 66 69 6e 65 64 2c 20 6f 6d 69 74 20 74 68 69 73  fined, omit this
0230: 20 66 69 6c 65 2e 0a 69 66 63 61 70 61 62 6c 65   file..ifcapable
0240: 20 21 66 74 73 35 20 7b 0a 20 20 66 69 6e 69 73   !fts5 {.  finis
0250: 68 5f 74 65 73 74 0a 20 20 72 65 74 75 72 6e 0a  h_test.  return.
0260: 7d 0a 0a 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74  }..do_catchsql_t
0270: 65 73 74 20 31 2e 31 20 7b 0a 20 20 53 45 4c 45  est 1.1 {.  SELE
0280: 43 54 20 66 74 73 35 5f 72 6f 77 69 64 28 29 0a  CT fts5_rowid().
0290: 7d 20 7b 31 20 7b 73 68 6f 75 6c 64 20 62 65 3a  } {1 {should be:
02a0: 20 66 74 73 35 5f 72 6f 77 69 64 28 73 75 62 6a   fts5_rowid(subj
02b0: 65 63 74 2c 20 2e 2e 2e 2e 29 7d 7d 0a 0a 64 6f  ect, ....)}}..do
02c0: 5f 63 61 74 63 68 73 71 6c 5f 74 65 73 74 20 31  _catchsql_test 1
02d0: 2e 32 20 7b 0a 20 20 53 45 4c 45 43 54 20 66 74  .2 {.  SELECT ft
02e0: 73 35 5f 72 6f 77 69 64 28 27 73 65 67 6d 65 6e  s5_rowid('segmen
02f0: 74 27 29 0a 7d 20 7b 31 20 7b 73 68 6f 75 6c 64  t').} {1 {should
0300: 20 62 65 3a 20 66 74 73 35 5f 72 6f 77 69 64 28   be: fts5_rowid(
0310: 27 73 65 67 6d 65 6e 74 27 2c 20 73 65 67 69 64  'segment', segid
0320: 2c 20 70 67 6e 6f 29 29 7d 7d 0a 0a 64 6f 5f 65  , pgno))}}..do_e
0330: 78 65 63 73 71 6c 5f 74 65 73 74 20 31 2e 33 20  xecsql_test 1.3 
0340: 7b 0a 20 20 53 45 4c 45 43 54 20 66 74 73 35 5f  {.  SELECT fts5_
0350: 72 6f 77 69 64 28 27 73 65 67 6d 65 6e 74 27 2c  rowid('segment',
0360: 20 31 2c 20 31 29 0a 7d 20 7b 31 33 37 34 33 38   1, 1).} {137438
0370: 39 35 33 34 37 33 7d 0a 0a 64 6f 5f 63 61 74 63  953473}..do_catc
0380: 68 73 71 6c 5f 74 65 73 74 20 31 2e 34 20 7b 0a  hsql_test 1.4 {.
0390: 20 20 53 45 4c 45 43 54 20 66 74 73 35 5f 72 6f    SELECT fts5_ro
03a0: 77 69 64 28 27 6e 6f 73 75 63 68 61 72 67 27 29  wid('nosucharg')
03b0: 3b 0a 7d 20 7b 31 20 7b 66 69 72 73 74 20 61 72  ;.} {1 {first ar
03c0: 67 20 74 6f 20 66 74 73 35 5f 72 6f 77 69 64 28  g to fts5_rowid(
03d0: 29 20 6d 75 73 74 20 62 65 20 27 73 65 67 6d 65  ) must be 'segme
03e0: 6e 74 27 7d 7d 20 0a 0a 0a 23 2d 2d 2d 2d 2d 2d  nt'}} ...#------
03f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0430: 2d 2d 2d 0a 23 20 54 65 73 74 73 20 6f 66 20 74  ---.# Tests of t
0440: 68 65 20 66 74 73 35 5f 64 65 63 6f 64 65 28 29  he fts5_decode()
0450: 20 66 75 6e 63 74 69 6f 6e 2e 0a 23 0a 72 65 73   function..#.res
0460: 65 74 5f 64 62 0a 64 6f 5f 65 78 65 63 73 71 6c  et_db.do_execsql
0470: 5f 74 65 73 74 20 32 2e 31 20 7b 20 0a 20 20 43  _test 2.1 { .  C
0480: 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41  REATE VIRTUAL TA
0490: 42 4c 45 20 78 31 20 55 53 49 4e 47 20 66 74 73  BLE x1 USING fts
04a0: 35 28 61 2c 20 62 29 3b 0a 20 20 49 4e 53 45 52  5(a, b);.  INSER
04b0: 54 20 49 4e 54 4f 20 78 31 28 78 31 2c 20 72 61  T INTO x1(x1, ra
04c0: 6e 6b 29 20 56 41 4c 55 45 53 28 27 70 67 73 7a  nk) VALUES('pgsz
04d0: 27 2c 20 33 32 29 3b 0a 7d 20 7b 7d 0a 0a 70 72  ', 32);.} {}..pr
04e0: 6f 63 20 72 6e 64 64 6f 63 20 7b 6e 7d 20 7b 0a  oc rnddoc {n} {.
04f0: 20 20 73 65 74 20 6d 61 70 20 5b 6c 69 73 74 20    set map [list 
0500: 30 20 61 20 20 31 20 62 20 20 32 20 63 20 20 33  0 a  1 b  2 c  3
0510: 20 64 20 20 34 20 65 20 20 35 20 66 20 20 36 20   d  4 e  5 f  6 
0520: 67 20 20 37 20 68 20 20 38 20 69 20 20 39 20 6a  g  7 h  8 i  9 j
0530: 5d 0a 20 20 73 65 74 20 64 6f 63 20 5b 6c 69 73  ].  set doc [lis
0540: 74 5d 0a 20 20 66 6f 72 20 7b 73 65 74 20 69 20  t].  for {set i 
0550: 30 7d 20 7b 24 69 20 3c 20 24 6e 7d 20 7b 69 6e  0} {$i < $n} {in
0560: 63 72 20 69 7d 20 7b 0a 20 20 20 20 6c 61 70 70  cr i} {.    lapp
0570: 65 6e 64 20 64 6f 63 20 5b 73 74 72 69 6e 67 20  end doc [string 
0580: 6d 61 70 20 24 6d 61 70 20 5b 66 6f 72 6d 61 74  map $map [format
0590: 20 25 2e 33 64 20 5b 65 78 70 72 20 69 6e 74 28   %.3d [expr int(
05a0: 72 61 6e 64 28 29 2a 31 30 30 29 5d 5d 5d 0a 20  rand()*100)]]]. 
05b0: 20 7d 0a 20 20 73 65 74 20 64 6f 63 0a 7d 0a 64   }.  set doc.}.d
05c0: 62 20 66 75 6e 63 20 72 6e 64 64 6f 63 20 72 6e  b func rnddoc rn
05d0: 64 64 6f 63 0a 0a 64 6f 5f 65 78 65 63 73 71 6c  ddoc..do_execsql
05e0: 5f 74 65 73 74 20 32 2e 32 20 7b 0a 20 20 57 49  _test 2.2 {.  WI
05f0: 54 48 20 72 28 61 2c 20 62 29 20 41 53 20 28 0a  TH r(a, b) AS (.
0600: 20 20 20 20 53 45 4c 45 43 54 20 72 6e 64 64 6f      SELECT rnddo
0610: 63 28 36 29 2c 20 72 6e 64 64 6f 63 28 36 29 20  c(6), rnddoc(6) 
0620: 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 20 20 53 45  UNION ALL.    SE
0630: 4c 45 43 54 20 72 6e 64 64 6f 63 28 36 29 2c 20  LECT rnddoc(6), 
0640: 72 6e 64 64 6f 63 28 36 29 20 46 52 4f 4d 20 72  rnddoc(6) FROM r
0650: 0a 20 20 29 0a 20 20 49 4e 53 45 52 54 20 49 4e  .  ).  INSERT IN
0660: 54 4f 20 78 31 20 53 45 4c 45 43 54 20 2a 20 46  TO x1 SELECT * F
0670: 52 4f 4d 20 72 20 4c 49 4d 49 54 20 31 30 30 30  ROM r LIMIT 1000
0680: 30 3b 0a 20 20 44 45 4c 45 54 45 20 46 52 4f 4d  0;.  DELETE FROM
0690: 20 78 31 20 57 48 45 52 45 20 28 72 6f 77 69 64   x1 WHERE (rowid
06a0: 25 32 29 3b 0a 7d 0a 0a 73 65 74 20 72 65 73 20  %2);.}..set res 
06b0: 5b 64 62 20 6f 6e 65 20 7b 53 45 4c 45 43 54 20  [db one {SELECT 
06c0: 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 78 31  count(*) FROM x1
06d0: 5f 64 61 74 61 7d 5d 0a 64 6f 5f 65 78 65 63 73  _data}].do_execs
06e0: 71 6c 5f 74 65 73 74 20 32 2e 33 20 7b 0a 20 20  ql_test 2.3 {.  
06f0: 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 66 74 73  SELECT count(fts
0700: 35 5f 64 65 63 6f 64 65 28 72 6f 77 69 64 2c 20  5_decode(rowid, 
0710: 62 6c 6f 63 6b 29 29 20 46 52 4f 4d 20 78 31 5f  block)) FROM x1_
0720: 64 61 74 61 3b 0a 7d 20 24 72 65 73 0a 73 71 6c  data;.} $res.sql
0730: 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67 20 64  ite3_db_config d
0740: 62 20 44 45 46 45 4e 53 49 56 45 20 30 0a 64 6f  b DEFENSIVE 0.do
0750: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 32 2e  _execsql_test 2.
0760: 34 20 7b 0a 20 20 55 50 44 41 54 45 20 78 31 5f  4 {.  UPDATE x1_
0770: 64 61 74 61 20 53 45 54 20 62 6c 6f 63 6b 20 3d  data SET block =
0780: 20 58 27 27 3b 0a 20 20 53 45 4c 45 43 54 20 63   X'';.  SELECT c
0790: 6f 75 6e 74 28 66 74 73 35 5f 64 65 63 6f 64 65  ount(fts5_decode
07a0: 28 72 6f 77 69 64 2c 20 62 6c 6f 63 6b 29 29 20  (rowid, block)) 
07b0: 46 52 4f 4d 20 78 31 5f 64 61 74 61 3b 0a 7d 20  FROM x1_data;.} 
07c0: 24 72 65 73 0a 0a 64 6f 5f 65 78 65 63 73 71 6c  $res..do_execsql
07d0: 5f 74 65 73 74 20 32 2e 35 20 7b 0a 20 20 49 4e  _test 2.5 {.  IN
07e0: 53 45 52 54 20 49 4e 54 4f 20 78 31 28 78 31 2c  SERT INTO x1(x1,
07f0: 20 72 61 6e 6b 29 20 56 41 4c 55 45 53 28 27 70   rank) VALUES('p
0800: 67 73 7a 27 2c 20 31 30 32 34 29 3b 0a 20 20 49  gsz', 1024);.  I
0810: 4e 53 45 52 54 20 49 4e 54 4f 20 78 31 28 78 31  NSERT INTO x1(x1
0820: 29 20 56 41 4c 55 45 53 28 27 72 65 62 75 69 6c  ) VALUES('rebuil
0830: 64 27 29 3b 0a 7d 0a 0a 73 65 74 20 72 65 73 20  d');.}..set res 
0840: 5b 64 62 20 6f 6e 65 20 7b 53 45 4c 45 43 54 20  [db one {SELECT 
0850: 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 78 31  count(*) FROM x1
0860: 5f 64 61 74 61 7d 5d 0a 64 6f 5f 65 78 65 63 73  _data}].do_execs
0870: 71 6c 5f 74 65 73 74 20 32 2e 36 20 7b 0a 20 20  ql_test 2.6 {.  
0880: 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 66 74 73  SELECT count(fts
0890: 35 5f 64 65 63 6f 64 65 28 72 6f 77 69 64 2c 20  5_decode(rowid, 
08a0: 62 6c 6f 63 6b 29 29 20 46 52 4f 4d 20 78 31 5f  block)) FROM x1_
08b0: 64 61 74 61 3b 0a 7d 20 24 72 65 73 0a 0a 23 20  data;.} $res..# 
08c0: 54 68 69 73 20 69 73 20 72 65 61 6c 6c 79 20 61  This is really a
08d0: 20 63 6f 72 72 75 70 74 69 6f 6e 20 74 65 73 74   corruption test
08e0: 2e 2e 2e 0a 23 64 6f 5f 65 78 65 63 73 71 6c 5f  ....#do_execsql_
08f0: 74 65 73 74 20 32 2e 37 20 7b 0a 23 20 20 55 50  test 2.7 {.#  UP
0900: 44 41 54 45 20 78 31 5f 64 61 74 61 20 53 45 54  DATE x1_data SET
0910: 20 62 6c 6f 63 6b 20 3d 20 58 27 27 3b 0a 23 20   block = X'';.# 
0920: 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 66 74   SELECT count(ft
0930: 73 35 5f 64 65 63 6f 64 65 28 72 6f 77 69 64 2c  s5_decode(rowid,
0940: 20 62 6c 6f 63 6b 29 29 20 46 52 4f 4d 20 78 31   block)) FROM x1
0950: 5f 64 61 74 61 3b 0a 23 7d 20 24 72 65 73 0a 0a  _data;.#} $res..
0960: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
0970: 32 2e 38 20 7b 0a 20 20 53 45 4c 45 43 54 20 66  2.8 {.  SELECT f
0980: 74 73 35 5f 64 65 63 6f 64 65 28 66 74 73 35 5f  ts5_decode(fts5_
0990: 72 6f 77 69 64 28 27 73 65 67 6d 65 6e 74 27 2c  rowid('segment',
09a0: 20 31 30 30 30 2c 20 31 29 2c 20 58 27 41 42 27   1000, 1), X'AB'
09b0: 29 0a 7d 20 7b 63 6f 72 72 75 70 74 7d 0a 0a 23  ).} {corrupt}..#
09c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
09d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
09e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
09f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74  ---------.# Test
0a10: 73 20 77 69 74 68 20 76 65 72 79 20 6c 61 72 67  s with very larg
0a20: 65 20 74 6f 6b 65 6e 73 2e 0a 23 0a 73 65 74 20  e tokens..#.set 
0a30: 73 74 72 6c 69 73 74 20 5b 6c 69 73 74 20 5c 0a  strlist [list \.
0a40: 20 20 22 5b 73 74 72 69 6e 67 20 72 65 70 65 61    "[string repea
0a50: 74 20 78 20 34 30 30 5d 22 20 20 20 20 20 20 20  t x 400]"       
0a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a70: 5c 0a 20 20 22 5b 73 74 72 69 6e 67 20 72 65 70  \.  "[string rep
0a80: 65 61 74 20 78 20 33 30 30 5d 5b 73 74 72 69 6e  eat x 300][strin
0a90: 67 20 72 65 70 65 61 74 20 77 20 31 30 30 5d 22  g repeat w 100]"
0aa0: 20 20 5c 0a 20 20 22 5b 73 74 72 69 6e 67 20 72    \.  "[string r
0ab0: 65 70 65 61 74 20 78 20 33 30 30 5d 5b 73 74 72  epeat x 300][str
0ac0: 69 6e 67 20 72 65 70 65 61 74 20 79 20 31 30 30  ing repeat y 100
0ad0: 5d 22 20 20 5c 0a 20 20 22 5b 73 74 72 69 6e 67  ]"  \.  "[string
0ae0: 20 72 65 70 65 61 74 20 78 20 33 30 30 5d 5b 73   repeat x 300][s
0af0: 74 72 69 6e 67 20 72 65 70 65 61 74 20 7a 20 36  tring repeat z 6
0b00: 30 30 5d 22 20 20 5c 0a 5d 0a 64 6f 5f 74 65 73  00]"  \.].do_tes
0b10: 74 20 33 2e 30 20 7b 0a 20 20 65 78 65 63 73 71  t 3.0 {.  execsq
0b20: 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20  l {.    BEGIN;. 
0b30: 20 20 20 43 52 45 41 54 45 20 56 49 52 54 55 41     CREATE VIRTUA
0b40: 4c 20 54 41 42 4c 45 20 78 32 20 55 53 49 4e 47  L TABLE x2 USING
0b50: 20 66 74 73 35 28 61 29 3b 0a 20 20 7d 0a 20 20   fts5(a);.  }.  
0b60: 66 6f 72 65 61 63 68 20 73 74 72 20 24 73 74 72  foreach str $str
0b70: 6c 69 73 74 20 7b 20 65 78 65 63 73 71 6c 20 7b  list { execsql {
0b80: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 32 20   INSERT INTO x2 
0b90: 56 41 4c 55 45 53 28 24 73 74 72 29 20 7d 20 7d  VALUES($str) } }
0ba0: 0a 20 20 65 78 65 63 73 71 6c 20 43 4f 4d 4d 49  .  execsql COMMI
0bb0: 54 0a 7d 20 7b 7d 0a 0a 66 6f 72 20 7b 73 65 74  T.} {}..for {set
0bc0: 20 74 6e 20 30 7d 20 7b 24 74 6e 3c 5b 6c 6c 65   tn 0} {$tn<[lle
0bd0: 6e 67 74 68 20 24 73 74 72 6c 69 73 74 5d 7d 20  ngth $strlist]} 
0be0: 7b 69 6e 63 72 20 74 6e 7d 20 7b 0a 20 20 73 65  {incr tn} {.  se
0bf0: 74 20 73 74 72 20 5b 6c 69 6e 64 65 78 20 24 73  t str [lindex $s
0c00: 74 72 6c 69 73 74 20 24 74 6e 5d 0a 20 20 64 6f  trlist $tn].  do
0c10: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 33 2e  _execsql_test 3.
0c20: 31 2e 24 74 6e 20 7b 0a 20 20 20 20 53 45 4c 45  1.$tn {.    SELE
0c30: 43 54 20 72 6f 77 69 64 20 46 52 4f 4d 20 78 32  CT rowid FROM x2
0c40: 20 57 48 45 52 45 20 78 32 20 4d 41 54 43 48 20   WHERE x2 MATCH 
0c50: 24 73 74 72 0a 20 20 7d 20 5b 65 78 70 72 20 24  $str.  } [expr $
0c60: 74 6e 2b 31 5d 0a 7d 0a 0a 73 65 74 20 72 65 73  tn+1].}..set res
0c70: 20 5b 64 62 20 6f 6e 65 20 7b 53 45 4c 45 43 54   [db one {SELECT
0c80: 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 78   count(*) FROM x
0c90: 32 5f 64 61 74 61 7d 5d 0a 64 6f 5f 65 78 65 63  2_data}].do_exec
0ca0: 73 71 6c 5f 74 65 73 74 20 33 2e 32 20 7b 0a 20  sql_test 3.2 {. 
0cb0: 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 66 74   SELECT count(ft
0cc0: 73 35 5f 64 65 63 6f 64 65 28 72 6f 77 69 64 2c  s5_decode(rowid,
0cd0: 20 62 6c 6f 63 6b 29 29 20 46 52 4f 4d 20 78 32   block)) FROM x2
0ce0: 5f 64 61 74 61 3b 0a 7d 20 24 72 65 73 0a 0a 23  _data;.} $res..#
0cf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0d00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0d20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 4c 65 61 66  ---------.# Leaf
0d40: 20 70 61 67 65 73 20 77 69 74 68 20 6e 6f 20 74   pages with no t
0d50: 65 72 6d 73 20 6f 72 20 72 6f 77 69 64 73 20 61  erms or rowids a
0d60: 74 20 61 6c 6c 2e 0a 23 0a 73 65 74 20 73 74 72  t all..#.set str
0d70: 6c 69 73 74 20 5b 6c 69 73 74 20 5c 0a 20 20 22  list [list \.  "
0d80: 5b 73 74 72 69 6e 67 20 72 65 70 65 61 74 20 7b  [string repeat {
0d90: 77 20 7d 20 34 30 30 5d 22 20 20 5c 0a 20 20 22  w } 400]"  \.  "
0da0: 5b 73 74 72 69 6e 67 20 72 65 70 65 61 74 20 7b  [string repeat {
0db0: 78 20 7d 20 34 30 30 5d 22 20 20 5c 0a 20 20 22  x } 400]"  \.  "
0dc0: 5b 73 74 72 69 6e 67 20 72 65 70 65 61 74 20 7b  [string repeat {
0dd0: 79 20 7d 20 34 30 30 5d 22 20 20 5c 0a 20 20 22  y } 400]"  \.  "
0de0: 5b 73 74 72 69 6e 67 20 72 65 70 65 61 74 20 7b  [string repeat {
0df0: 7a 20 7d 20 34 30 30 5d 22 20 20 5c 0a 5d 0a 64  z } 400]"  \.].d
0e00: 6f 5f 74 65 73 74 20 34 2e 30 20 7b 0a 20 20 65  o_test 4.0 {.  e
0e10: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42 45 47  xecsql {.    BEG
0e20: 49 4e 3b 0a 20 20 20 20 43 52 45 41 54 45 20 56  IN;.    CREATE V
0e30: 49 52 54 55 41 4c 20 54 41 42 4c 45 20 78 33 20  IRTUAL TABLE x3 
0e40: 55 53 49 4e 47 20 66 74 73 35 28 61 29 3b 0a 20  USING fts5(a);. 
0e50: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78     INSERT INTO x
0e60: 33 28 78 33 2c 20 72 61 6e 6b 29 20 56 41 4c 55  3(x3, rank) VALU
0e70: 45 53 28 27 70 67 73 7a 27 2c 20 33 32 29 3b 0a  ES('pgsz', 32);.
0e80: 20 20 7d 0a 20 20 66 6f 72 65 61 63 68 20 73 74    }.  foreach st
0e90: 72 20 24 73 74 72 6c 69 73 74 20 7b 20 65 78 65  r $strlist { exe
0ea0: 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e  csql { INSERT IN
0eb0: 54 4f 20 78 33 20 56 41 4c 55 45 53 28 24 73 74  TO x3 VALUES($st
0ec0: 72 29 20 7d 20 7d 0a 20 20 65 78 65 63 73 71 6c  r) } }.  execsql
0ed0: 20 43 4f 4d 4d 49 54 0a 7d 20 7b 7d 0a 0a 66 6f   COMMIT.} {}..fo
0ee0: 72 20 7b 73 65 74 20 74 6e 20 30 7d 20 7b 24 74  r {set tn 0} {$t
0ef0: 6e 3c 5b 6c 6c 65 6e 67 74 68 20 24 73 74 72 6c  n<[llength $strl
0f00: 69 73 74 5d 7d 20 7b 69 6e 63 72 20 74 6e 7d 20  ist]} {incr tn} 
0f10: 7b 0a 20 20 73 65 74 20 73 74 72 20 5b 6c 69 6e  {.  set str [lin
0f20: 64 65 78 20 24 73 74 72 6c 69 73 74 20 24 74 6e  dex $strlist $tn
0f30: 5d 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74  ].  do_execsql_t
0f40: 65 73 74 20 34 2e 31 2e 24 74 6e 20 7b 0a 20 20  est 4.1.$tn {.  
0f50: 20 20 53 45 4c 45 43 54 20 72 6f 77 69 64 20 46    SELECT rowid F
0f60: 52 4f 4d 20 78 33 20 57 48 45 52 45 20 78 33 20  ROM x3 WHERE x3 
0f70: 4d 41 54 43 48 20 24 73 74 72 0a 20 20 7d 20 5b  MATCH $str.  } [
0f80: 65 78 70 72 20 24 74 6e 2b 31 5d 0a 7d 0a 0a 73  expr $tn+1].}..s
0f90: 65 74 20 72 65 73 20 5b 64 62 20 6f 6e 65 20 7b  et res [db one {
0fa0: 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
0fb0: 46 52 4f 4d 20 78 33 5f 64 61 74 61 7d 5d 0a 64  FROM x3_data}].d
0fc0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 34  o_execsql_test 4
0fd0: 2e 32 20 7b 0a 20 20 53 45 4c 45 43 54 20 63 6f  .2 {.  SELECT co
0fe0: 75 6e 74 28 66 74 73 35 5f 64 65 63 6f 64 65 28  unt(fts5_decode(
0ff0: 72 6f 77 69 64 2c 20 62 6c 6f 63 6b 29 29 20 46  rowid, block)) F
1000: 52 4f 4d 20 78 33 5f 64 61 74 61 3b 0a 7d 20 24  ROM x3_data;.} $
1010: 72 65 73 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  res..#----------
1020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
1060: 23 20 50 6f 73 69 74 69 6f 6e 20 6c 69 73 74 73  # Position lists
1070: 20 77 69 74 68 20 6c 61 72 67 65 20 76 61 6c 75   with large valu
1080: 65 73 2e 0a 23 0a 73 65 74 20 73 74 72 6c 69 73  es..#.set strlis
1090: 74 20 5b 6c 69 73 74 20 5c 0a 20 20 22 5b 73 74  t [list \.  "[st
10a0: 72 69 6e 67 20 72 65 70 65 61 74 20 7b 77 20 7d  ring repeat {w }
10b0: 20 34 30 30 5d 61 22 20 20 5c 0a 20 20 22 5b 73   400]a"  \.  "[s
10c0: 74 72 69 6e 67 20 72 65 70 65 61 74 20 7b 78 20  tring repeat {x 
10d0: 7d 20 34 30 30 5d 61 22 20 20 5c 0a 20 20 22 5b  } 400]a"  \.  "[
10e0: 73 74 72 69 6e 67 20 72 65 70 65 61 74 20 7b 79  string repeat {y
10f0: 20 7d 20 34 30 30 5d 61 22 20 20 5c 0a 20 20 22   } 400]a"  \.  "
1100: 5b 73 74 72 69 6e 67 20 72 65 70 65 61 74 20 7b  [string repeat {
1110: 7a 20 7d 20 34 30 30 5d 61 22 20 20 5c 0a 5d 0a  z } 400]a"  \.].
1120: 64 6f 5f 74 65 73 74 20 35 2e 30 20 7b 0a 20 20  do_test 5.0 {.  
1130: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42 45  execsql {.    BE
1140: 47 49 4e 3b 0a 20 20 20 20 43 52 45 41 54 45 20  GIN;.    CREATE 
1150: 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 78 34  VIRTUAL TABLE x4
1160: 20 55 53 49 4e 47 20 66 74 73 35 28 61 29 3b 0a   USING fts5(a);.
1170: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
1180: 78 34 28 78 34 2c 20 72 61 6e 6b 29 20 56 41 4c  x4(x4, rank) VAL
1190: 55 45 53 28 27 70 67 73 7a 27 2c 20 33 32 29 3b  UES('pgsz', 32);
11a0: 0a 20 20 7d 0a 20 20 66 6f 72 65 61 63 68 20 73  .  }.  foreach s
11b0: 74 72 20 24 73 74 72 6c 69 73 74 20 7b 20 65 78  tr $strlist { ex
11c0: 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49  ecsql { INSERT I
11d0: 4e 54 4f 20 78 34 20 56 41 4c 55 45 53 28 24 73  NTO x4 VALUES($s
11e0: 74 72 29 20 7d 20 7d 0a 20 20 65 78 65 63 73 71  tr) } }.  execsq
11f0: 6c 20 43 4f 4d 4d 49 54 0a 7d 20 7b 7d 0a 0a 64  l COMMIT.} {}..d
1200: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 35  o_execsql_test 5
1210: 2e 31 20 7b 0a 20 20 53 45 4c 45 43 54 20 72 6f  .1 {.  SELECT ro
1220: 77 69 64 20 46 52 4f 4d 20 78 34 20 57 48 45 52  wid FROM x4 WHER
1230: 45 20 78 34 20 4d 41 54 43 48 20 27 61 27 0a 7d  E x4 MATCH 'a'.}
1240: 20 7b 31 20 32 20 33 20 34 7d 0a 0a 73 65 74 20   {1 2 3 4}..set 
1250: 72 65 73 20 5b 64 62 20 6f 6e 65 20 7b 53 45 4c  res [db one {SEL
1260: 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
1270: 4d 20 78 34 5f 64 61 74 61 7d 5d 0a 64 6f 5f 65  M x4_data}].do_e
1280: 78 65 63 73 71 6c 5f 74 65 73 74 20 35 2e 32 20  xecsql_test 5.2 
1290: 7b 0a 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74  {.  SELECT count
12a0: 28 66 74 73 35 5f 64 65 63 6f 64 65 28 72 6f 77  (fts5_decode(row
12b0: 69 64 2c 20 62 6c 6f 63 6b 29 29 20 46 52 4f 4d  id, block)) FROM
12c0: 20 78 34 5f 64 61 74 61 3b 0a 7d 20 24 72 65 73   x4_data;.} $res
12d0: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
12e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 0a 0a  ------------.#..
1320: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
1330: 36 2e 30 20 7b 0a 20 20 43 52 45 41 54 45 20 56  6.0 {.  CREATE V
1340: 49 52 54 55 41 4c 20 54 41 42 4c 45 20 78 35 20  IRTUAL TABLE x5 
1350: 55 53 49 4e 47 20 66 74 73 35 28 78 2c 20 64 65  USING fts5(x, de
1360: 74 61 69 6c 3d 6e 6f 6e 65 29 3b 0a 20 20 49 4e  tail=none);.  IN
1370: 53 45 52 54 20 49 4e 54 4f 20 78 35 28 78 35 2c  SERT INTO x5(x5,
1380: 20 72 61 6e 6b 29 20 56 41 4c 55 45 53 28 27 70   rank) VALUES('p
1390: 67 73 7a 27 2c 20 33 32 29 3b 0a 20 20 49 4e 53  gsz', 32);.  INS
13a0: 45 52 54 20 49 4e 54 4f 20 78 35 20 56 41 4c 55  ERT INTO x5 VALU
13b0: 45 53 28 27 61 20 62 20 63 20 64 20 65 20 66 27  ES('a b c d e f'
13c0: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
13d0: 20 78 35 20 56 41 4c 55 45 53 28 27 61 20 62 20   x5 VALUES('a b 
13e0: 63 20 64 20 65 20 66 27 29 3b 0a 20 20 49 4e 53  c d e f');.  INS
13f0: 45 52 54 20 49 4e 54 4f 20 78 35 20 56 41 4c 55  ERT INTO x5 VALU
1400: 45 53 28 27 61 20 62 20 63 20 64 20 65 20 66 27  ES('a b c d e f'
1410: 29 3b 0a 20 20 42 45 47 49 4e 3b 0a 20 20 20 20  );.  BEGIN;.    
1420: 57 49 54 48 20 73 28 69 29 20 41 53 20 28 0a 20  WITH s(i) AS (. 
1430: 20 20 20 20 20 53 45 4c 45 43 54 20 31 20 55 4e       SELECT 1 UN
1440: 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 69  ION ALL SELECT i
1450: 2b 31 20 46 52 4f 4d 20 73 20 57 48 45 52 45 20  +1 FROM s WHERE 
1460: 69 3c 31 30 30 0a 20 20 20 20 29 20 49 4e 53 45  i<100.    ) INSE
1470: 52 54 20 49 4e 54 4f 20 78 35 20 53 45 4c 45 43  RT INTO x5 SELEC
1480: 54 20 27 61 20 62 20 63 20 64 20 65 20 66 27 20  T 'a b c d e f' 
1490: 46 52 4f 4d 20 73 3b 0a 20 20 43 4f 4d 4d 49 54  FROM s;.  COMMIT
14a0: 3b 0a 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74  ;.  SELECT count
14b0: 28 66 74 73 35 5f 64 65 63 6f 64 65 5f 6e 6f 6e  (fts5_decode_non
14c0: 65 28 72 6f 77 69 64 2c 20 62 6c 6f 63 6b 29 29  e(rowid, block))
14d0: 20 46 52 4f 4d 20 78 35 5f 64 61 74 61 3b 0a 7d   FROM x5_data;.}
14e0: 20 7b 33 32 7d 0a 0a 64 6f 5f 65 78 65 63 73 71   {32}..do_execsq
14f0: 6c 5f 74 65 73 74 20 36 2e 31 20 7b 0a 20 20 44  l_test 6.1 {.  D
1500: 45 4c 45 54 45 20 46 52 4f 4d 20 78 35 20 57 48  ELETE FROM x5 WH
1510: 45 52 45 20 72 6f 77 69 64 20 3c 3d 20 32 3b 0a  ERE rowid <= 2;.
1520: 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 66    SELECT count(f
1530: 74 73 35 5f 64 65 63 6f 64 65 5f 6e 6f 6e 65 28  ts5_decode_none(
1540: 72 6f 77 69 64 2c 20 62 6c 6f 63 6b 29 29 20 46  rowid, block)) F
1550: 52 4f 4d 20 78 35 5f 64 61 74 61 3b 0a 7d 20 7b  ROM x5_data;.} {
1560: 33 34 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  34}..do_execsql_
1570: 74 65 73 74 20 36 2e 32 20 7b 0a 20 20 55 50 44  test 6.2 {.  UPD
1580: 41 54 45 20 78 35 20 53 45 54 20 78 3d 27 61 20  ATE x5 SET x='a 
1590: 62 20 63 20 64 20 65 20 66 27 20 57 48 45 52 45  b c d e f' WHERE
15a0: 20 72 6f 77 69 64 3d 33 3b 0a 20 20 53 45 4c 45   rowid=3;.  SELE
15b0: 43 54 20 63 6f 75 6e 74 28 66 74 73 35 5f 64 65  CT count(fts5_de
15c0: 63 6f 64 65 5f 6e 6f 6e 65 28 72 6f 77 69 64 2c  code_none(rowid,
15d0: 20 62 6c 6f 63 6b 29 29 20 46 52 4f 4d 20 78 35   block)) FROM x5
15e0: 5f 64 61 74 61 3b 0a 7d 20 7b 33 36 7d 0a 0a 23  _data;.} {36}..#
15f0: 64 62 20 65 76 61 6c 20 7b 53 45 4c 45 43 54 20  db eval {SELECT 
1600: 72 6f 77 69 64 2c 20 66 74 73 35 5f 64 65 63 6f  rowid, fts5_deco
1610: 64 65 5f 6e 6f 6e 65 28 72 6f 77 69 64 2c 20 62  de_none(rowid, b
1620: 6c 6f 63 6b 29 20 61 53 20 72 20 46 52 4f 4d 20  lock) aS r FROM 
1630: 78 35 5f 64 61 74 61 7d 20 7b 70 75 74 73 20 24  x5_data} {puts $
1640: 72 7d 0a 0a 0a 0a 66 69 6e 69 73 68 5f 74 65 73  r}....finish_tes
1650: 74 0a                                            t.