/ Hex Artifact Content
Login

Artifact 12b9c5352128cebd1c6b8395e43788d4b09087c2:


0000: 23 20 32 30 30 37 20 41 70 72 69 6c 20 32 36 0a  # 2007 April 26.
0010: 23 0a 23 20 54 68 65 20 61 75 74 68 6f 72 20 64  #.# The author d
0020: 69 73 63 6c 61 69 6d 73 20 63 6f 70 79 72 69 67  isclaims copyrig
0030: 68 74 20 74 6f 20 74 68 69 73 20 73 6f 75 72 63  ht to this sourc
0040: 65 20 63 6f 64 65 2e 0a 23 0a 23 2a 2a 2a 2a 2a  e code..#.#*****
0050: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0060: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0070: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0080: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0090: 2a 2a 2a 2a 0a 23 20 54 68 69 73 20 66 69 6c 65  ****.# This file
00a0: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 65 73 74   implements test
00b0: 73 20 66 6f 72 20 70 72 65 66 69 78 2d 73 65 61  s for prefix-sea
00c0: 72 63 68 69 6e 67 20 69 6e 20 74 68 65 20 66 74  rching in the ft
00d0: 73 32 0a 23 20 63 6f 6d 70 6f 6e 65 6e 74 20 6f  s2.# component o
00e0: 66 20 74 68 65 20 53 51 4c 69 74 65 20 6c 69 62  f the SQLite lib
00f0: 72 61 72 79 2e 0a 23 0a 23 20 24 49 64 3a 20 66  rary..#.# $Id: f
0100: 74 73 32 6e 2e 74 65 73 74 2c 76 20 31 2e 32 20  ts2n.test,v 1.2 
0110: 32 30 30 37 2f 31 32 2f 31 33 20 32 31 3a 35 34  2007/12/13 21:54
0120: 3a 31 31 20 64 72 68 20 45 78 70 20 24 0a 23 0a  :11 drh Exp $.#.
0130: 0a 73 65 74 20 74 65 73 74 64 69 72 20 5b 66 69  .set testdir [fi
0140: 6c 65 20 64 69 72 6e 61 6d 65 20 24 61 72 67 76  le dirname $argv
0150: 30 5d 0a 73 6f 75 72 63 65 20 24 74 65 73 74 64  0].source $testd
0160: 69 72 2f 74 65 73 74 65 72 2e 74 63 6c 0a 0a 23  ir/tester.tcl..#
0170: 20 49 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   If SQLITE_ENABL
0180: 45 5f 46 54 53 32 20 69 73 20 64 65 66 69 6e 65  E_FTS2 is define
0190: 64 2c 20 6f 6d 69 74 20 74 68 69 73 20 66 69 6c  d, omit this fil
01a0: 65 2e 0a 69 66 63 61 70 61 62 6c 65 20 21 66 74  e..ifcapable !ft
01b0: 73 32 20 7b 0a 20 20 66 69 6e 69 73 68 5f 74 65  s2 {.  finish_te
01c0: 73 74 0a 20 20 72 65 74 75 72 6e 0a 7d 0a 0a 23  st.  return.}..#
01d0: 20 41 20 6c 61 72 67 65 20 73 74 72 69 6e 67 20   A large string 
01e0: 74 6f 20 70 72 69 6d 65 20 74 68 65 20 70 75 6d  to prime the pum
01f0: 70 20 77 69 74 68 2e 0a 73 65 74 20 74 65 78 74  p with..set text
0200: 20 7b 0a 20 20 4c 6f 72 65 6d 20 69 70 73 75 6d   {.  Lorem ipsum
0210: 20 64 6f 6c 6f 72 20 73 69 74 20 61 6d 65 74 2c   dolor sit amet,
0220: 20 63 6f 6e 73 65 63 74 65 74 75 65 72 20 61 64   consectetuer ad
0230: 69 70 69 73 63 69 6e 67 20 65 6c 69 74 2e 20 4d  ipiscing elit. M
0240: 61 65 63 65 6e 61 73 0a 20 20 69 61 63 75 6c 69  aecenas.  iaculi
0250: 73 20 6d 6f 6c 6c 69 73 20 69 70 73 75 6d 2e 20  s mollis ipsum. 
0260: 50 72 61 65 73 65 6e 74 20 72 68 6f 6e 63 75 73  Praesent rhoncus
0270: 20 70 6c 61 63 65 72 61 74 20 6a 75 73 74 6f 2e   placerat justo.
0280: 20 44 75 69 73 20 6e 6f 6e 20 71 75 61 6d 0a 20   Duis non quam. 
0290: 20 73 65 64 20 74 75 72 70 69 73 20 70 6f 73 75   sed turpis posu
02a0: 65 72 65 20 70 6c 61 63 65 72 61 74 2e 20 43 75  ere placerat. Cu
02b0: 72 61 62 69 74 75 72 20 65 74 20 6c 6f 72 65 6d  rabitur et lorem
02c0: 20 69 6e 20 6c 6f 72 65 6d 20 70 6f 72 74 74 69   in lorem portti
02d0: 74 6f 72 0a 20 20 61 6c 69 71 75 65 74 2e 20 50  tor.  aliquet. P
02e0: 65 6c 6c 65 6e 74 65 73 71 75 65 20 62 69 62 65  ellentesque bibe
02f0: 6e 64 75 6d 20 74 69 6e 63 69 64 75 6e 74 20 64  ndum tincidunt d
0300: 69 61 6d 2e 20 56 65 73 74 69 62 75 6c 75 6d 20  iam. Vestibulum 
0310: 62 6c 61 6e 64 69 74 0a 20 20 61 6e 74 65 20 6e  blandit.  ante n
0320: 65 63 20 65 6c 69 74 2e 20 49 6e 20 73 61 70 69  ec elit. In sapi
0330: 65 6e 20 64 69 61 6d 2c 20 66 61 63 69 6c 69 73  en diam, facilis
0340: 69 73 20 65 67 65 74 2c 20 64 69 63 74 75 6d 20  is eget, dictum 
0350: 73 65 64 2c 20 76 69 76 65 72 72 61 0a 20 20 61  sed, viverra.  a
0360: 74 2c 20 66 65 6c 69 73 2e 20 56 65 73 74 69 62  t, felis. Vestib
0370: 75 6c 75 6d 20 6d 61 67 6e 61 2e 20 53 65 64 20  ulum magna. Sed 
0380: 6d 61 67 6e 61 20 64 6f 6c 6f 72 2c 20 76 65 73  magna dolor, ves
0390: 74 69 62 75 6c 75 6d 20 72 68 6f 6e 63 75 73 2c  tibulum rhoncus,
03a0: 0a 20 20 6f 72 6e 61 72 65 20 76 65 6c 2c 20 76  .  ornare vel, v
03b0: 75 6c 70 75 74 61 74 65 20 73 69 74 20 61 6d 65  ulputate sit ame
03c0: 74 2c 20 66 65 6c 69 73 2e 20 49 6e 74 65 67 65  t, felis. Intege
03d0: 72 20 6d 61 6c 65 73 75 61 64 61 2c 20 74 65 6c  r malesuada, tel
03e0: 6c 75 73 20 61 74 0a 20 20 6c 75 63 74 75 73 20  lus at.  luctus 
03f0: 67 72 61 76 69 64 61 2c 20 64 69 61 6d 20 6e 75  gravida, diam nu
0400: 6e 63 20 70 6f 72 74 61 20 6e 69 62 68 2c 20 6e  nc porta nibh, n
0410: 65 63 20 69 6d 70 65 72 64 69 65 74 20 6d 61 73  ec imperdiet mas
0420: 73 61 20 6d 65 74 75 73 20 65 75 0a 20 20 6c 65  sa metus eu.  le
0430: 63 74 75 73 2e 20 41 6c 69 71 75 61 6d 20 6e 69  ctus. Aliquam ni
0440: 73 69 2e 20 4e 75 6e 63 20 66 72 69 6e 67 69 6c  si. Nunc fringil
0450: 6c 61 20 6e 75 6c 6c 61 20 61 74 20 6c 65 63 74  la nulla at lect
0460: 75 73 2e 20 53 75 73 70 65 6e 64 69 73 73 65 0a  us. Suspendisse.
0470: 20 20 70 6f 74 65 6e 74 69 2e 20 43 75 6d 20 73    potenti. Cum s
0480: 6f 63 69 69 73 20 6e 61 74 6f 71 75 65 20 70 65  ociis natoque pe
0490: 6e 61 74 69 62 75 73 20 65 74 20 6d 61 67 6e 69  natibus et magni
04a0: 73 20 64 69 73 20 70 61 72 74 75 72 69 65 6e 74  s dis parturient
04b0: 0a 20 20 6d 6f 6e 74 65 73 2c 20 6e 61 73 63 65  .  montes, nasce
04c0: 74 75 72 20 72 69 64 69 63 75 6c 75 73 20 6d 75  tur ridiculus mu
04d0: 73 2e 20 50 65 6c 6c 65 6e 74 65 73 71 75 65 20  s. Pellentesque 
04e0: 6f 64 69 6f 20 6e 75 6c 6c 61 2c 20 66 65 75 67  odio nulla, feug
04f0: 69 61 74 20 65 75 2c 0a 20 20 73 75 73 63 69 70  iat eu,.  suscip
0500: 69 74 20 6e 65 63 2c 20 63 6f 6e 73 65 71 75 61  it nec, consequa
0510: 74 20 71 75 69 73 2c 20 72 69 73 75 73 2e 0a 7d  t quis, risus..}
0520: 0a 0a 64 62 20 65 76 61 6c 20 7b 0a 20 20 43 52  ..db eval {.  CR
0530: 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42  EATE VIRTUAL TAB
0540: 4c 45 20 74 31 20 55 53 49 4e 47 20 66 74 73 32  LE t1 USING fts2
0550: 28 63 29 3b 0a 0a 20 20 49 4e 53 45 52 54 20 49  (c);..  INSERT I
0560: 4e 54 4f 20 74 31 28 72 6f 77 69 64 2c 20 63 29  NTO t1(rowid, c)
0570: 20 56 41 4c 55 45 53 28 31 2c 20 24 74 65 78 74   VALUES(1, $text
0580: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
0590: 20 74 31 28 72 6f 77 69 64 2c 20 63 29 20 56 41   t1(rowid, c) VA
05a0: 4c 55 45 53 28 32 2c 20 27 41 6e 6f 74 68 65 72  LUES(2, 'Another
05b0: 20 6c 6f 76 65 6c 79 20 72 6f 77 27 29 3b 0a 7d   lovely row');.}
05c0: 0a 0a 23 20 45 78 61 63 74 20 6d 61 74 63 68 0a  ..# Exact match.
05d0: 64 6f 5f 74 65 73 74 20 66 74 73 32 6e 2d 31 2e  do_test fts2n-1.
05e0: 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 22 53  1 {.  execsql "S
05f0: 45 4c 45 43 54 20 72 6f 77 69 64 20 46 52 4f 4d  ELECT rowid FROM
0600: 20 74 31 20 57 48 45 52 45 20 74 31 20 4d 41 54   t1 WHERE t1 MAT
0610: 43 48 20 27 6c 6f 72 65 6d 27 22 0a 7d 20 7b 31  CH 'lorem'".} {1
0620: 7d 0a 0a 23 20 41 6e 64 20 61 20 70 72 65 66 69  }..# And a prefi
0630: 78 0a 64 6f 5f 74 65 73 74 20 66 74 73 32 6e 2d  x.do_test fts2n-
0640: 31 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  1.2 {.  execsql 
0650: 22 53 45 4c 45 43 54 20 72 6f 77 69 64 20 46 52  "SELECT rowid FR
0660: 4f 4d 20 74 31 20 57 48 45 52 45 20 74 31 20 4d  OM t1 WHERE t1 M
0670: 41 54 43 48 20 27 6c 6f 72 65 2a 27 22 0a 7d 20  ATCH 'lore*'".} 
0680: 7b 31 7d 0a 0a 23 20 50 72 65 66 69 78 20 69 6e  {1}..# Prefix in
0690: 63 6c 75 64 65 73 20 65 78 61 63 74 20 6d 61 74  cludes exact mat
06a0: 63 68 0a 64 6f 5f 74 65 73 74 20 66 74 73 32 6e  ch.do_test fts2n
06b0: 2d 31 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c  -1.3 {.  execsql
06c0: 20 22 53 45 4c 45 43 54 20 72 6f 77 69 64 20 46   "SELECT rowid F
06d0: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 74 31 20  ROM t1 WHERE t1 
06e0: 4d 41 54 43 48 20 27 6c 6f 72 65 6d 2a 27 22 0a  MATCH 'lorem*'".
06f0: 7d 20 7b 31 7d 0a 0a 23 20 4d 61 6b 65 20 63 65  } {1}..# Make ce
0700: 72 74 61 69 6e 20 65 76 65 72 79 74 68 69 6e 67  rtain everything
0710: 20 69 73 6e 27 74 20 63 6f 6e 73 69 64 65 72 65   isn't considere
0720: 64 20 61 20 70 72 65 66 69 78 21 0a 64 6f 5f 74  d a prefix!.do_t
0730: 65 73 74 20 66 74 73 32 6e 2d 31 2e 34 20 7b 0a  est fts2n-1.4 {.
0740: 20 20 65 78 65 63 73 71 6c 20 22 53 45 4c 45 43    execsql "SELEC
0750: 54 20 72 6f 77 69 64 20 46 52 4f 4d 20 74 31 20  T rowid FROM t1 
0760: 57 48 45 52 45 20 74 31 20 4d 41 54 43 48 20 27  WHERE t1 MATCH '
0770: 6c 6f 72 65 27 22 0a 7d 20 7b 7d 0a 0a 23 20 50  lore'".} {}..# P
0780: 72 65 66 69 78 20 61 63 72 6f 73 73 20 6d 75 6c  refix across mul
0790: 74 69 70 6c 65 20 72 6f 77 73 2e 0a 64 6f 5f 74  tiple rows..do_t
07a0: 65 73 74 20 66 74 73 32 6e 2d 31 2e 35 20 7b 0a  est fts2n-1.5 {.
07b0: 20 20 65 78 65 63 73 71 6c 20 22 53 45 4c 45 43    execsql "SELEC
07c0: 54 20 72 6f 77 69 64 20 46 52 4f 4d 20 74 31 20  T rowid FROM t1 
07d0: 57 48 45 52 45 20 74 31 20 4d 41 54 43 48 20 27  WHERE t1 MATCH '
07e0: 6c 6f 2a 27 22 0a 7d 20 7b 31 20 32 7d 0a 0a 23  lo*'".} {1 2}..#
07f0: 20 4c 69 6b 65 77 69 73 65 2c 20 77 69 74 68 20   Likewise, with 
0800: 6d 75 6c 74 69 70 6c 65 20 68 69 74 73 20 69 6e  multiple hits in
0810: 20 6f 6e 65 20 64 6f 63 75 6d 65 6e 74 2e 0a 64   one document..d
0820: 6f 5f 74 65 73 74 20 66 74 73 32 6e 2d 31 2e 36  o_test fts2n-1.6
0830: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 22 53 45   {.  execsql "SE
0840: 4c 45 43 54 20 72 6f 77 69 64 20 46 52 4f 4d 20  LECT rowid FROM 
0850: 74 31 20 57 48 45 52 45 20 74 31 20 4d 41 54 43  t1 WHERE t1 MATC
0860: 48 20 27 6c 2a 27 22 0a 7d 20 7b 31 20 32 7d 0a  H 'l*'".} {1 2}.
0870: 0a 23 20 50 72 65 66 69 78 20 77 68 69 63 68 20  .# Prefix which 
0880: 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 68 69 74 20  should only hit 
0890: 6f 6e 65 20 64 6f 63 75 6d 65 6e 74 2e 0a 64 6f  one document..do
08a0: 5f 74 65 73 74 20 66 74 73 32 6e 2d 31 2e 37 20  _test fts2n-1.7 
08b0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 22 53 45 4c  {.  execsql "SEL
08c0: 45 43 54 20 72 6f 77 69 64 20 46 52 4f 4d 20 74  ECT rowid FROM t
08d0: 31 20 57 48 45 52 45 20 74 31 20 4d 41 54 43 48  1 WHERE t1 MATCH
08e0: 20 27 6c 6f 76 2a 27 22 0a 7d 20 7b 32 7d 0a 0a   'lov*'".} {2}..
08f0: 23 20 2a 20 6e 6f 74 20 61 74 20 65 6e 64 20 69  # * not at end i
0900: 73 20 64 72 6f 70 70 65 64 2e 0a 64 6f 5f 74 65  s dropped..do_te
0910: 73 74 20 66 74 73 32 6e 2d 31 2e 38 20 7b 0a 20  st fts2n-1.8 {. 
0920: 20 65 78 65 63 73 71 6c 20 22 53 45 4c 45 43 54   execsql "SELECT
0930: 20 72 6f 77 69 64 20 46 52 4f 4d 20 74 31 20 57   rowid FROM t1 W
0940: 48 45 52 45 20 74 31 20 4d 41 54 43 48 20 27 6c  HERE t1 MATCH 'l
0950: 6f 20 2a 27 22 0a 7d 20 7b 7d 0a 0a 23 20 53 74  o *'".} {}..# St
0960: 61 6e 64 2d 61 6c 6f 6e 65 20 2a 20 69 73 20 64  and-alone * is d
0970: 72 6f 70 70 65 64 2e 0a 64 6f 5f 74 65 73 74 20  ropped..do_test 
0980: 66 74 73 32 6e 2d 31 2e 39 20 7b 0a 20 20 65 78  fts2n-1.9 {.  ex
0990: 65 63 73 71 6c 20 22 53 45 4c 45 43 54 20 72 6f  ecsql "SELECT ro
09a0: 77 69 64 20 46 52 4f 4d 20 74 31 20 57 48 45 52  wid FROM t1 WHER
09b0: 45 20 74 31 20 4d 41 54 43 48 20 27 2a 27 22 0a  E t1 MATCH '*'".
09c0: 7d 20 7b 7d 0a 0a 23 20 50 68 72 61 73 65 2d 71  } {}..# Phrase-q
09d0: 75 65 72 79 20 70 72 65 66 69 78 2e 0a 64 6f 5f  uery prefix..do_
09e0: 74 65 73 74 20 66 74 73 32 6e 2d 31 2e 31 30 20  test fts2n-1.10 
09f0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 22 53 45 4c  {.  execsql "SEL
0a00: 45 43 54 20 72 6f 77 69 64 20 46 52 4f 4d 20 74  ECT rowid FROM t
0a10: 31 20 57 48 45 52 45 20 74 31 20 4d 41 54 43 48  1 WHERE t1 MATCH
0a20: 20 27 5c 22 6c 6f 76 65 6c 79 20 72 2a 5c 22 27   '\"lovely r*\"'
0a30: 22 0a 7d 20 7b 32 7d 0a 64 6f 5f 74 65 73 74 20  ".} {2}.do_test 
0a40: 66 74 73 32 6e 2d 31 2e 31 31 20 7b 0a 20 20 65  fts2n-1.11 {.  e
0a50: 78 65 63 73 71 6c 20 22 53 45 4c 45 43 54 20 72  xecsql "SELECT r
0a60: 6f 77 69 64 20 46 52 4f 4d 20 74 31 20 57 48 45  owid FROM t1 WHE
0a70: 52 45 20 74 31 20 4d 41 54 43 48 20 27 5c 22 6c  RE t1 MATCH '\"l
0a80: 6f 76 65 6c 79 20 72 5c 22 27 22 0a 7d 20 7b 7d  ovely r\"'".} {}
0a90: 0a 0a 23 20 50 68 72 61 73 65 20 71 75 65 72 79  ..# Phrase query
0aa0: 20 77 69 74 68 20 6d 75 6c 74 69 70 6c 65 20 70   with multiple p
0ab0: 72 65 66 69 78 20 6d 61 74 63 68 65 73 2e 0a 64  refix matches..d
0ac0: 6f 5f 74 65 73 74 20 66 74 73 32 6e 2d 31 2e 31  o_test fts2n-1.1
0ad0: 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 22 53  2 {.  execsql "S
0ae0: 45 4c 45 43 54 20 72 6f 77 69 64 20 46 52 4f 4d  ELECT rowid FROM
0af0: 20 74 31 20 57 48 45 52 45 20 74 31 20 4d 41 54   t1 WHERE t1 MAT
0b00: 43 48 20 27 5c 22 61 2a 20 6c 2a 5c 22 27 22 0a  CH '\"a* l*\"'".
0b10: 7d 20 7b 31 20 32 7d 0a 0a 23 20 50 68 72 61 73  } {1 2}..# Phras
0b20: 65 20 71 75 65 72 79 20 77 69 74 68 20 6d 75 6c  e query with mul
0b30: 74 69 70 6c 65 20 70 72 65 66 69 78 20 6d 61 74  tiple prefix mat
0b40: 63 68 65 73 2e 0a 64 6f 5f 74 65 73 74 20 66 74  ches..do_test ft
0b50: 73 32 6e 2d 31 2e 31 33 20 7b 0a 20 20 65 78 65  s2n-1.13 {.  exe
0b60: 63 73 71 6c 20 22 53 45 4c 45 43 54 20 72 6f 77  csql "SELECT row
0b70: 69 64 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45  id FROM t1 WHERE
0b80: 20 74 31 20 4d 41 54 43 48 20 27 5c 22 61 2a 20   t1 MATCH '\"a* 
0b90: 6c 2a 20 72 6f 77 5c 22 27 22 0a 7d 20 7b 32 7d  l* row\"'".} {2}
0ba0: 0a 0a 0a 0a 0a 23 20 54 65 73 74 20 61 63 72 6f  .....# Test acro
0bb0: 73 73 20 75 70 64 61 74 65 73 20 28 61 6e 64 2c  ss updates (and,
0bc0: 20 62 79 20 69 6d 70 6c 69 63 61 74 69 6f 6e 2c   by implication,
0bd0: 20 64 65 6c 65 74 65 73 29 2e 0a 0a 23 20 56 65   deletes)...# Ve
0be0: 72 73 69 6f 6e 20 6f 66 20 74 65 78 74 20 77 69  rsion of text wi
0bf0: 74 68 6f 75 74 20 22 6c 6f 72 65 6d 22 2e 0a 72  thout "lorem"..r
0c00: 65 67 73 75 62 20 2d 61 6c 6c 20 7b 5b 4c 6c 5d  egsub -all {[Ll]
0c10: 6f 72 65 6d 7d 20 24 74 65 78 74 20 27 27 20 6e  orem} $text '' n
0c20: 74 65 78 74 0a 0a 64 62 20 65 76 61 6c 20 7b 0a  text..db eval {.
0c30: 20 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c    CREATE VIRTUAL
0c40: 20 54 41 42 4c 45 20 74 32 20 55 53 49 4e 47 20   TABLE t2 USING 
0c50: 66 74 73 32 28 63 29 3b 0a 0a 20 20 49 4e 53 45  fts2(c);..  INSE
0c60: 52 54 20 49 4e 54 4f 20 74 32 28 72 6f 77 69 64  RT INTO t2(rowid
0c70: 2c 20 63 29 20 56 41 4c 55 45 53 28 31 2c 20 24  , c) VALUES(1, $
0c80: 74 65 78 74 29 3b 0a 20 20 49 4e 53 45 52 54 20  text);.  INSERT 
0c90: 49 4e 54 4f 20 74 32 28 72 6f 77 69 64 2c 20 63  INTO t2(rowid, c
0ca0: 29 20 56 41 4c 55 45 53 28 32 2c 20 27 41 6e 6f  ) VALUES(2, 'Ano
0cb0: 74 68 65 72 20 6c 6f 76 65 6c 79 20 72 6f 77 27  ther lovely row'
0cc0: 29 3b 0a 20 20 55 50 44 41 54 45 20 74 32 20 53  );.  UPDATE t2 S
0cd0: 45 54 20 63 20 3d 20 24 6e 74 65 78 74 20 57 48  ET c = $ntext WH
0ce0: 45 52 45 20 72 6f 77 69 64 20 3d 20 31 3b 0a 7d  ERE rowid = 1;.}
0cf0: 0a 0a 23 20 43 61 6e 27 74 20 73 65 65 20 6c 6f  ..# Can't see lo
0d00: 72 65 6d 20 61 73 20 61 6e 20 65 78 61 63 74 20  rem as an exact 
0d10: 6d 61 74 63 68 2e 0a 64 6f 5f 74 65 73 74 20 66  match..do_test f
0d20: 74 73 32 6e 2d 32 2e 31 20 7b 0a 20 20 65 78 65  ts2n-2.1 {.  exe
0d30: 63 73 71 6c 20 22 53 45 4c 45 43 54 20 72 6f 77  csql "SELECT row
0d40: 69 64 20 46 52 4f 4d 20 74 32 20 57 48 45 52 45  id FROM t2 WHERE
0d50: 20 74 32 20 4d 41 54 43 48 20 27 6c 6f 72 65 6d   t2 MATCH 'lorem
0d60: 27 22 0a 7d 20 7b 7d 0a 0a 23 20 43 61 6e 27 74  '".} {}..# Can't
0d70: 20 73 65 65 20 61 20 70 72 65 66 69 78 20 6f 66   see a prefix of
0d80: 20 6c 6f 72 65 6d 2c 20 65 69 74 68 65 72 2e 0a   lorem, either..
0d90: 64 6f 5f 74 65 73 74 20 66 74 73 32 6e 2d 32 2e  do_test fts2n-2.
0da0: 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 22 53  2 {.  execsql "S
0db0: 45 4c 45 43 54 20 72 6f 77 69 64 20 46 52 4f 4d  ELECT rowid FROM
0dc0: 20 74 32 20 57 48 45 52 45 20 74 32 20 4d 41 54   t2 WHERE t2 MAT
0dd0: 43 48 20 27 6c 6f 72 65 2a 27 22 0a 7d 20 7b 7d  CH 'lore*'".} {}
0de0: 0a 0a 23 20 43 61 6e 20 73 65 65 20 6c 6f 76 65  ..# Can see love
0df0: 6c 79 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20  ly in the other 
0e00: 64 6f 63 75 6d 65 6e 74 2e 0a 64 6f 5f 74 65 73  document..do_tes
0e10: 74 20 66 74 73 32 6e 2d 32 2e 33 20 7b 0a 20 20  t fts2n-2.3 {.  
0e20: 65 78 65 63 73 71 6c 20 22 53 45 4c 45 43 54 20  execsql "SELECT 
0e30: 72 6f 77 69 64 20 46 52 4f 4d 20 74 32 20 57 48  rowid FROM t2 WH
0e40: 45 52 45 20 74 32 20 4d 41 54 43 48 20 27 6c 6f  ERE t2 MATCH 'lo
0e50: 2a 27 22 0a 7d 20 7b 32 7d 0a 0a 23 20 43 61 6e  *'".} {2}..# Can
0e60: 20 73 74 69 6c 6c 20 73 65 65 20 6f 74 68 65 72   still see other
0e70: 20 68 69 74 73 2e 0a 64 6f 5f 74 65 73 74 20 66   hits..do_test f
0e80: 74 73 32 6e 2d 32 2e 34 20 7b 0a 20 20 65 78 65  ts2n-2.4 {.  exe
0e90: 63 73 71 6c 20 22 53 45 4c 45 43 54 20 72 6f 77  csql "SELECT row
0ea0: 69 64 20 46 52 4f 4d 20 74 32 20 57 48 45 52 45  id FROM t2 WHERE
0eb0: 20 74 32 20 4d 41 54 43 48 20 27 6c 2a 27 22 0a   t2 MATCH 'l*'".
0ec0: 7d 20 7b 31 20 32 7d 0a 0a 23 20 50 72 65 66 69  } {1 2}..# Prefi
0ed0: 78 20 77 68 69 63 68 20 73 68 6f 75 6c 64 20 6f  x which should o
0ee0: 6e 6c 79 20 68 69 74 20 6f 6e 65 20 64 6f 63 75  nly hit one docu
0ef0: 6d 65 6e 74 2e 0a 64 6f 5f 74 65 73 74 20 66 74  ment..do_test ft
0f00: 73 32 6e 2d 32 2e 35 20 7b 0a 20 20 65 78 65 63  s2n-2.5 {.  exec
0f10: 73 71 6c 20 22 53 45 4c 45 43 54 20 72 6f 77 69  sql "SELECT rowi
0f20: 64 20 46 52 4f 4d 20 74 32 20 57 48 45 52 45 20  d FROM t2 WHERE 
0f30: 74 32 20 4d 41 54 43 48 20 27 6c 6f 76 2a 27 22  t2 MATCH 'lov*'"
0f40: 0a 7d 20 7b 32 7d 0a 0a 0a 0a 23 20 54 65 73 74  .} {2}....# Test
0f50: 20 77 69 74 68 20 61 20 73 65 67 6d 65 6e 74 20   with a segment 
0f60: 77 68 69 63 68 20 77 69 6c 6c 20 68 61 76 65 20  which will have 
0f70: 6d 75 6c 74 69 70 6c 65 20 6c 65 76 65 6c 73 20  multiple levels 
0f80: 69 6e 20 74 68 65 20 74 72 65 65 2e 0a 0a 23 20  in the tree...# 
0f90: 42 75 69 6c 64 20 61 20 62 69 67 20 64 6f 63 75  Build a big docu
0fa0: 6d 65 6e 74 20 77 69 74 68 20 6c 6f 74 73 20 6f  ment with lots o
0fb0: 66 20 75 6e 69 71 75 65 20 74 65 72 6d 73 2e 0a  f unique terms..
0fc0: 73 65 74 20 62 69 67 74 65 78 74 20 24 74 65 78  set bigtext $tex
0fd0: 74 0a 66 6f 72 65 61 63 68 20 63 20 7b 61 20 62  t.foreach c {a b
0fe0: 20 63 20 64 20 65 7d 20 7b 0a 20 20 72 65 67 73   c d e} {.  regs
0ff0: 75 62 20 2d 61 6c 6c 20 7b 5b 41 2d 5a 61 2d 7a  ub -all {[A-Za-z
1000: 5d 2b 7d 20 24 62 69 67 74 65 78 74 20 22 26 24  ]+} $bigtext "&$
1010: 63 22 20 74 0a 20 20 61 70 70 65 6e 64 20 62 69  c" t.  append bi
1020: 67 74 65 78 74 20 24 74 0a 7d 0a 0a 23 20 50 6f  gtext $t.}..# Po
1030: 70 75 6c 61 74 65 20 61 20 74 61 62 6c 65 20 77  pulate a table w
1040: 69 74 68 20 6d 61 6e 79 20 63 6f 70 69 65 73 20  ith many copies 
1050: 6f 66 20 74 68 65 20 62 69 67 20 64 6f 63 75 6d  of the big docum
1060: 65 6e 74 2c 20 73 6f 20 74 68 61 74 20 77 65 0a  ent, so that we.
1070: 23 20 63 61 6e 20 74 65 73 74 20 74 68 65 20 6e  # can test the n
1080: 75 6d 62 65 72 20 6f 66 20 68 69 74 73 20 66 6f  umber of hits fo
1090: 75 6e 64 2e 20 20 50 6f 70 75 6c 61 74 65 20 24  und.  Populate $
10a0: 72 65 74 20 77 69 74 68 20 74 68 65 20 65 78 70  ret with the exp
10b0: 65 63 74 65 64 0a 23 20 68 69 74 20 63 6f 75 6e  ected.# hit coun
10c0: 74 73 20 66 6f 72 20 65 61 63 68 20 72 6f 77 2e  ts for each row.
10d0: 20 20 6f 66 66 73 65 74 73 28 29 20 72 65 74 75    offsets() retu
10e0: 72 6e 73 20 34 20 65 6c 65 6d 65 6e 74 73 20 66  rns 4 elements f
10f0: 6f 72 20 65 76 65 72 79 0a 23 20 68 69 74 2e 20  or every.# hit. 
1100: 20 57 65 27 6c 6c 20 68 61 76 65 20 36 20 68 69   We'll have 6 hi
1110: 74 73 20 66 6f 72 20 72 6f 77 20 31 2c 20 31 20  ts for row 1, 1 
1120: 66 6f 72 20 72 6f 77 20 32 2c 20 61 6e 64 20 36  for row 2, and 6
1130: 2a 28 32 5e 35 29 3d 3d 31 39 32 20 66 6f 72 0a  *(2^5)==192 for.
1140: 23 20 24 62 69 67 74 65 78 74 2e 0a 73 65 74 20  # $bigtext..set 
1150: 72 65 74 20 7b 36 20 31 7d 0a 64 62 20 65 76 61  ret {6 1}.db eva
1160: 6c 20 7b 0a 20 20 42 45 47 49 4e 3b 0a 20 20 43  l {.  BEGIN;.  C
1170: 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41  REATE VIRTUAL TA
1180: 42 4c 45 20 74 33 20 55 53 49 4e 47 20 66 74 73  BLE t3 USING fts
1190: 32 28 63 29 3b 0a 0a 20 20 49 4e 53 45 52 54 20  2(c);..  INSERT 
11a0: 49 4e 54 4f 20 74 33 28 72 6f 77 69 64 2c 20 63  INTO t3(rowid, c
11b0: 29 20 56 41 4c 55 45 53 28 31 2c 20 24 74 65 78  ) VALUES(1, $tex
11c0: 74 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  t);.  INSERT INT
11d0: 4f 20 74 33 28 72 6f 77 69 64 2c 20 63 29 20 56  O t3(rowid, c) V
11e0: 41 4c 55 45 53 28 32 2c 20 27 41 6e 6f 74 68 65  ALUES(2, 'Anothe
11f0: 72 20 6c 6f 76 65 6c 79 20 72 6f 77 27 29 3b 0a  r lovely row');.
1200: 7d 0a 66 6f 72 20 7b 73 65 74 20 69 20 30 7d 20  }.for {set i 0} 
1210: 7b 24 69 3c 31 30 30 7d 20 7b 69 6e 63 72 20 69  {$i<100} {incr i
1220: 7d 20 7b 0a 20 20 64 62 20 65 76 61 6c 20 7b 49  } {.  db eval {I
1230: 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 28 72 6f  NSERT INTO t3(ro
1240: 77 69 64 2c 20 63 29 20 56 41 4c 55 45 53 28 33  wid, c) VALUES(3
1250: 2b 24 69 2c 20 24 62 69 67 74 65 78 74 29 7d 0a  +$i, $bigtext)}.
1260: 20 20 6c 61 70 70 65 6e 64 20 72 65 74 20 31 39    lappend ret 19
1270: 32 0a 7d 0a 64 62 20 65 76 61 6c 20 7b 43 4f 4d  2.}.db eval {COM
1280: 4d 49 54 3b 7d 0a 0a 23 20 54 65 73 74 20 74 68  MIT;}..# Test th
1290: 61 74 20 77 65 20 67 65 74 20 74 68 65 20 65 78  at we get the ex
12a0: 70 65 63 74 65 64 20 6e 75 6d 62 65 72 20 6f 66  pected number of
12b0: 20 68 69 74 73 2e 0a 64 6f 5f 74 65 73 74 20 66   hits..do_test f
12c0: 74 73 32 6e 2d 33 2e 31 20 7b 0a 20 20 73 65 74  ts2n-3.1 {.  set
12d0: 20 74 20 7b 7d 0a 20 20 64 62 20 65 76 61 6c 20   t {}.  db eval 
12e0: 7b 53 45 4c 45 43 54 20 6f 66 66 73 65 74 73 28  {SELECT offsets(
12f0: 74 33 29 20 61 73 20 6f 20 46 52 4f 4d 20 74 33  t3) as o FROM t3
1300: 20 57 48 45 52 45 20 74 33 20 4d 41 54 43 48 20   WHERE t3 MATCH 
1310: 27 6c 2a 27 7d 20 7b 0a 20 20 20 20 73 65 74 20  'l*'} {.    set 
1320: 6c 20 5b 6c 6c 65 6e 67 74 68 20 24 6f 5d 0a 20  l [llength $o]. 
1330: 20 20 20 6c 61 70 70 65 6e 64 20 74 20 5b 65 78     lappend t [ex
1340: 70 72 20 7b 24 6c 2f 34 7d 5d 0a 20 20 7d 0a 20  pr {$l/4}].  }. 
1350: 20 73 65 74 20 74 0a 7d 20 24 72 65 74 0a 0a 23   set t.} $ret..#
1360: 20 54 4f 44 4f 28 73 68 65 73 73 29 20 49 74 20   TODO(shess) It 
1370: 77 6f 75 6c 64 20 62 65 20 75 73 65 66 75 6c 20  would be useful 
1380: 74 6f 20 74 65 73 74 20 61 20 63 6f 75 70 6c 65  to test a couple
1390: 20 65 64 67 65 20 63 61 73 65 73 2c 20 62 75 74   edge cases, but
13a0: 20 49 0a 23 20 64 6f 6e 27 74 20 6b 6e 6f 77 20   I.# don't know 
13b0: 69 66 20 77 65 20 68 61 76 65 20 74 68 65 20 70  if we have the p
13c0: 72 65 63 69 73 69 6f 6e 20 74 6f 20 6d 61 6e 61  recision to mana
13d0: 67 65 20 69 74 20 66 72 6f 6d 20 68 65 72 65 20  ge it from here 
13e0: 61 74 20 74 68 69 73 0a 23 20 74 69 6d 65 2e 20  at this.# time. 
13f0: 20 50 72 65 66 69 78 20 68 69 74 73 20 63 61 6e   Prefix hits can
1400: 20 63 72 6f 73 73 20 6c 65 61 76 65 73 2c 20 77   cross leaves, w
1410: 68 69 63 68 20 74 68 65 20 63 6f 64 65 20 61 62  hich the code ab
1420: 6f 76 65 20 5f 73 68 6f 75 6c 64 5f 0a 23 20 68  ove _should_.# h
1430: 69 74 20 62 79 20 76 69 72 74 75 65 20 6f 66 20  it by virtue of 
1440: 73 69 7a 65 2e 20 20 54 68 65 72 65 20 61 72 65  size.  There are
1450: 20 74 77 6f 20 76 61 72 69 61 74 69 6f 6e 73 20   two variations 
1460: 6f 6e 20 74 68 69 73 2e 20 20 49 66 20 74 68 65  on this.  If the
1470: 0a 23 20 74 72 65 65 20 69 73 20 32 20 6c 65 76  .# tree is 2 lev
1480: 65 6c 73 20 68 69 67 68 2c 20 74 68 65 20 63 6f  els high, the co
1490: 64 65 20 77 69 6c 6c 20 66 69 6e 64 20 74 68 65  de will find the
14a0: 20 6c 65 61 66 2d 6e 6f 64 65 20 65 78 74 65 6e   leaf-node exten
14b0: 74 0a 23 20 64 69 72 65 63 74 6c 79 2c 20 62 75  t.# directly, bu
14c0: 74 20 69 66 20 69 74 73 20 68 69 67 68 65 72 2c  t if its higher,
14d0: 20 74 68 65 20 63 6f 64 65 20 77 69 6c 6c 20 68   the code will h
14e0: 61 76 65 20 74 6f 20 66 6f 6c 6c 6f 77 20 74 77  ave to follow tw
14f0: 6f 0a 23 20 73 65 70 61 72 61 74 65 20 69 6e 74  o.# separate int
1500: 65 72 69 6f 72 20 62 72 61 6e 63 68 65 73 20 64  erior branches d
1510: 6f 77 6e 20 74 68 65 20 74 72 65 65 2e 20 20 42  own the tree.  B
1520: 6f 74 68 20 73 68 6f 75 6c 64 20 62 65 20 74 65  oth should be te
1530: 73 74 65 64 2e 0a 0a 66 69 6e 69 73 68 5f 74 65  sted...finish_te
1540: 73 74 0a                                         st.