Documentation Source Text

Hex Artifact Content
Login

Artifact fee1d3a6625a6b35ed5e90fb60c45cbe937e1e13:


0000: 0a 3c 74 63 6c 3e 68 64 5f 6b 65 79 77 6f 72 64  .<tcl>hd_keyword
0010: 73 20 2a 66 74 73 33 20 46 54 53 33 20 7b 66 75  s *fts3 FTS3 {fu
0020: 6c 6c 2d 74 65 78 74 20 73 65 61 72 63 68 7d 3c  ll-text search}<
0030: 2f 74 63 6c 3e 0a 3c 74 69 74 6c 65 3e 53 51 4c  /tcl>.<title>SQL
0040: 69 74 65 20 46 54 53 33 20 61 6e 64 20 46 54 53  ite FTS3 and FTS
0050: 34 20 45 78 74 65 6e 73 69 6f 6e 73 3c 2f 74 69  4 Extensions</ti
0060: 74 6c 65 3e 0a 0a 3c 74 61 62 6c 65 5f 6f 66 5f  tle>..<table_of_
0070: 63 6f 6e 74 65 6e 74 73 3e 0a 0a 3c 68 32 20 73  contents>..<h2 s
0080: 74 79 6c 65 3d 22 6d 61 72 67 69 6e 2d 6c 65 66  tyle="margin-lef
0090: 74 3a 31 2e 30 65 6d 22 20 6e 6f 74 6f 63 3e 20  t:1.0em" notoc> 
00a0: 4f 76 65 72 76 69 65 77 3c 2f 68 32 3e 0a 0a 3c  Overview</h2>..<
00b0: 70 3e 0a 20 20 46 54 53 33 20 61 6e 64 20 46 54  p>.  FTS3 and FT
00c0: 53 34 20 61 72 65 20 53 51 4c 69 74 65 20 76 69  S4 are SQLite vi
00d0: 72 74 75 61 6c 20 74 61 62 6c 65 20 6d 6f 64 75  rtual table modu
00e0: 6c 65 73 20 74 68 61 74 20 61 6c 6c 6f 77 73 20  les that allows 
00f0: 75 73 65 72 73 20 74 6f 20 70 65 72 66 6f 72 6d  users to perform
0100: 20 0a 20 20 66 75 6c 6c 2d 74 65 78 74 20 73 65   .  full-text se
0110: 61 72 63 68 65 73 20 6f 6e 20 61 20 73 65 74 20  arches on a set 
0120: 6f 66 20 64 6f 63 75 6d 65 6e 74 73 2e 20 54 68  of documents. Th
0130: 65 20 6d 6f 73 74 20 63 6f 6d 6d 6f 6e 20 28 61  e most common (a
0140: 6e 64 20 65 66 66 65 63 74 69 76 65 29 20 0a 20  nd effective) . 
0150: 20 77 61 79 20 74 6f 20 64 65 73 63 72 69 62 65   way to describe
0160: 20 66 75 6c 6c 2d 74 65 78 74 20 73 65 61 72 63   full-text searc
0170: 68 65 73 20 69 73 20 22 77 68 61 74 20 47 6f 6f  hes is "what Goo
0180: 67 6c 65 2c 20 59 61 68 6f 6f 2c 20 61 6e 64 20  gle, Yahoo, and 
0190: 42 69 6e 67 20 64 6f 0a 20 20 77 69 74 68 20 64  Bing do.  with d
01a0: 6f 63 75 6d 65 6e 74 73 20 70 6c 61 63 65 64 20  ocuments placed 
01b0: 6f 6e 20 74 68 65 20 57 6f 72 6c 64 20 57 69 64  on the World Wid
01c0: 65 20 57 65 62 22 2e 20 55 73 65 72 73 20 69 6e  e Web". Users in
01d0: 70 75 74 20 61 20 74 65 72 6d 2c 20 6f 72 20 73  put a term, or s
01e0: 65 72 69 65 73 20 0a 20 20 6f 66 20 74 65 72 6d  eries .  of term
01f0: 73 2c 20 70 65 72 68 61 70 73 20 63 6f 6e 6e 65  s, perhaps conne
0200: 63 74 65 64 20 62 79 20 61 20 62 69 6e 61 72 79  cted by a binary
0210: 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 67 72 6f   operator or gro
0220: 75 70 65 64 20 74 6f 67 65 74 68 65 72 20 69 6e  uped together in
0230: 74 6f 20 61 20 0a 20 20 70 68 72 61 73 65 2c 20  to a .  phrase, 
0240: 61 6e 64 20 74 68 65 20 66 75 6c 6c 2d 74 65 78  and the full-tex
0250: 74 20 71 75 65 72 79 20 73 79 73 74 65 6d 20 66  t query system f
0260: 69 6e 64 73 20 74 68 65 20 73 65 74 20 6f 66 20  inds the set of 
0270: 64 6f 63 75 6d 65 6e 74 73 20 74 68 61 74 20 62  documents that b
0280: 65 73 74 20 0a 20 20 6d 61 74 63 68 65 73 20 74  est .  matches t
0290: 68 6f 73 65 20 74 65 72 6d 73 20 63 6f 6e 73 69  hose terms consi
02a0: 64 65 72 69 6e 67 20 74 68 65 20 6f 70 65 72 61  dering the opera
02b0: 74 6f 72 73 20 61 6e 64 20 67 72 6f 75 70 69 6e  tors and groupin
02c0: 67 73 20 74 68 65 20 75 73 65 72 20 68 61 73 20  gs the user has 
02d0: 0a 20 20 73 70 65 63 69 66 69 65 64 2e 20 54 68  .  specified. Th
02e0: 69 73 20 61 72 74 69 63 6c 65 20 64 65 73 63 72  is article descr
02f0: 69 62 65 73 20 74 68 65 20 64 65 70 6c 6f 79 6d  ibes the deploym
0300: 65 6e 74 20 61 6e 64 20 75 73 61 67 65 20 6f 66  ent and usage of
0310: 20 46 54 53 33 20 61 6e 64 20 46 54 53 34 2e 0a   FTS3 and FTS4..
0320: 0a 3c 70 3e 0a 20 20 46 54 53 31 20 61 6e 64 20  .<p>.  FTS1 and 
0330: 46 54 53 32 20 61 72 65 20 6f 62 73 6f 6c 65 74  FTS2 are obsolet
0340: 65 20 66 75 6c 6c 2d 74 65 78 74 20 73 65 61 72  e full-text sear
0350: 63 68 20 6d 6f 64 75 6c 65 73 20 66 6f 72 20 53  ch modules for S
0360: 51 4c 69 74 65 2e 20 20 54 68 65 72 65 20 61 72  QLite.  There ar
0370: 65 20 6b 6e 6f 77 6e 0a 20 20 69 73 73 75 65 73  e known.  issues
0380: 20 77 69 74 68 20 74 68 65 73 65 20 6f 6c 64 65   with these olde
0390: 72 20 6d 6f 64 75 6c 65 73 20 61 6e 64 20 74 68  r modules and th
03a0: 65 69 72 20 75 73 65 20 73 68 6f 75 6c 64 20 62  eir use should b
03b0: 65 20 61 76 6f 69 64 65 64 2e 0a 20 20 50 6f 72  e avoided..  Por
03c0: 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 6f 72 69  tions of the ori
03d0: 67 69 6e 61 6c 20 46 54 53 33 20 63 6f 64 65 20  ginal FTS3 code 
03e0: 77 65 72 65 20 63 6f 6e 74 72 69 62 75 74 65 64  were contributed
03f0: 20 74 6f 20 74 68 65 20 53 51 4c 69 74 65 20 70   to the SQLite p
0400: 72 6f 6a 65 63 74 20 0a 20 20 62 79 20 53 63 6f  roject .  by Sco
0410: 74 74 20 48 65 73 73 20 6f 66 20 3c 61 20 68 72  tt Hess of <a hr
0420: 65 66 3d 22 68 74 74 70 3a 2f 2f 77 77 77 2e 67  ef="http://www.g
0430: 6f 6f 67 6c 65 2e 63 6f 6d 22 3e 47 6f 6f 67 6c  oogle.com">Googl
0440: 65 3c 2f 61 3e 2e 20 49 74 20 69 73 20 6e 6f 77  e</a>. It is now
0450: 20 0a 20 20 64 65 76 65 6c 6f 70 65 64 20 61 6e   .  developed an
0460: 64 20 6d 61 69 6e 74 61 69 6e 65 64 20 61 73 20  d maintained as 
0470: 70 61 72 74 20 6f 66 20 53 51 4c 69 74 65 2e 0a  part of SQLite..
0480: 0a 3c 68 31 3e 49 6e 74 72 6f 64 75 63 74 69 6f  .<h1>Introductio
0490: 6e 20 74 6f 20 46 54 53 33 20 61 6e 64 20 46 54  n to FTS3 and FT
04a0: 53 34 3c 2f 68 31 3e 0a 0a 3c 70 3e 0a 20 20 54  S4</h1>..<p>.  T
04b0: 68 65 20 46 54 53 33 20 61 6e 64 20 46 54 53 34  he FTS3 and FTS4
04c0: 20 65 78 74 65 6e 73 69 6f 6e 20 6d 6f 64 75 6c   extension modul
04d0: 65 73 20 61 6c 6c 6f 77 73 20 75 73 65 72 73 20  es allows users 
04e0: 74 6f 20 63 72 65 61 74 65 20 73 70 65 63 69 61  to create specia
04f0: 6c 20 74 61 62 6c 65 73 20 77 69 74 68 20 61 20  l tables with a 
0500: 0a 20 20 62 75 69 6c 74 2d 69 6e 20 66 75 6c 6c  .  built-in full
0510: 2d 74 65 78 74 20 69 6e 64 65 78 20 28 68 65 72  -text index (her
0520: 65 61 66 74 65 72 20 22 46 54 53 20 74 61 62 6c  eafter "FTS tabl
0530: 65 73 22 29 2e 20 54 68 65 20 66 75 6c 6c 2d 74  es"). The full-t
0540: 65 78 74 20 69 6e 64 65 78 0a 20 20 61 6c 6c 6f  ext index.  allo
0550: 77 73 20 74 68 65 20 75 73 65 72 20 74 6f 20 65  ws the user to e
0560: 66 66 69 63 69 65 6e 74 6c 79 20 71 75 65 72 79  fficiently query
0570: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 6f   the database fo
0580: 72 20 61 6c 6c 20 72 6f 77 73 20 74 68 61 74 20  r all rows that 
0590: 63 6f 6e 74 61 69 6e 0a 20 20 6f 6e 65 20 6f 72  contain.  one or
05a0: 20 6d 6f 72 65 20 77 6f 72 64 73 20 28 68 65 72   more words (her
05b0: 65 61 66 74 65 72 20 22 74 6f 6b 65 6e 73 22 29  eafter "tokens")
05c0: 2c 20 65 76 65 6e 20 69 66 20 74 68 65 20 74 61  , even if the ta
05d0: 62 6c 65 0a 20 20 63 6f 6e 74 61 69 6e 73 20 6d  ble.  contains m
05e0: 61 6e 79 20 6c 61 72 67 65 20 64 6f 63 75 6d 65  any large docume
05f0: 6e 74 73 2e 0a 0a 3c 70 3e 0a 20 20 46 6f 72 20  nts...<p>.  For 
0600: 65 78 61 6d 70 6c 65 2c 20 69 66 20 65 61 63 68  example, if each
0610: 20 6f 66 20 74 68 65 20 35 31 37 34 33 30 20 64   of the 517430 d
0620: 6f 63 75 6d 65 6e 74 73 20 69 6e 20 74 68 65 20  ocuments in the 
0630: 0a 20 20 22 3c 61 20 68 72 65 66 3d 22 68 74 74  .  "<a href="htt
0640: 70 3a 2f 2f 77 77 77 2e 63 73 2e 63 6d 75 2e 65  p://www.cs.cmu.e
0650: 64 75 2f 7e 65 6e 72 6f 6e 2f 22 3e 45 6e 72 6f  du/~enron/">Enro
0660: 6e 20 45 2d 4d 61 69 6c 20 44 61 74 61 73 65 74  n E-Mail Dataset
0670: 3c 2f 61 3e 22 0a 20 20 69 73 20 69 6e 73 65 72  </a>".  is inser
0680: 74 65 64 20 69 6e 74 6f 20 62 6f 74 68 20 61 6e  ted into both an
0690: 20 46 54 53 20 74 61 62 6c 65 20 61 6e 64 20 61   FTS table and a
06a0: 6e 20 6f 72 64 69 6e 61 72 79 20 53 51 4c 69 74  n ordinary SQLit
06b0: 65 20 74 61 62 6c 65 0a 20 20 63 72 65 61 74 65  e table.  create
06c0: 64 20 75 73 69 6e 67 20 74 68 65 20 66 6f 6c 6c  d using the foll
06d0: 6f 77 69 6e 67 20 53 51 4c 20 73 63 72 69 70 74  owing SQL script
06e0: 3a 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20  :..<codeblock>. 
06f0: 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20   CREATE VIRTUAL 
0700: 54 41 42 4c 45 20 65 6e 72 6f 6e 64 61 74 61 31  TABLE enrondata1
0710: 20 55 53 49 4e 47 20 66 74 73 33 28 63 6f 6e 74   USING fts3(cont
0720: 65 6e 74 20 54 45 58 54 29 3b 20 20 20 20 20 2f  ent TEXT);     /
0730: 2a 20 46 54 53 33 20 74 61 62 6c 65 20 2a 2f 0a  * FTS3 table */.
0740: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 65    CREATE TABLE e
0750: 6e 72 6f 6e 64 61 74 61 32 28 63 6f 6e 74 65 6e  nrondata2(conten
0760: 74 20 54 45 58 54 29 3b 20 20 20 20 20 20 20 20  t TEXT);        
0770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0780: 2f 2a 20 4f 72 64 69 6e 61 72 79 20 74 61 62 6c  /* Ordinary tabl
0790: 65 20 2a 2f 0a 3c 2f 63 6f 64 65 62 6c 6f 63 6b  e */.</codeblock
07a0: 3e 0a 0a 3c 70 3e 0a 20 20 54 68 65 6e 20 65 69  >..<p>.  Then ei
07b0: 74 68 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20  ther of the two 
07c0: 71 75 65 72 69 65 73 20 62 65 6c 6f 77 20 6d 61  queries below ma
07d0: 79 20 62 65 20 65 78 65 63 75 74 65 64 20 74 6f  y be executed to
07e0: 20 66 69 6e 64 20 74 68 65 20 6e 75 6d 62 65 72   find the number
07f0: 20 6f 66 0a 20 20 64 6f 63 75 6d 65 6e 74 73 20   of.  documents 
0800: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
0810: 74 68 61 74 20 63 6f 6e 74 61 69 6e 20 74 68 65  that contain the
0820: 20 77 6f 72 64 20 22 6c 69 6e 75 78 22 20 28 33   word "linux" (3
0830: 35 31 29 2e 20 55 73 69 6e 67 20 6f 6e 65 0a 20  51). Using one. 
0840: 20 64 65 73 6b 74 6f 70 20 50 43 20 68 61 72 64   desktop PC hard
0850: 77 61 72 65 20 63 6f 6e 66 69 67 75 72 61 74 69  ware configurati
0860: 6f 6e 2c 20 74 68 65 20 71 75 65 72 79 20 6f 6e  on, the query on
0870: 20 74 68 65 20 46 54 53 33 20 74 61 62 6c 65 20   the FTS3 table 
0880: 72 65 74 75 72 6e 73 20 69 6e 0a 20 20 61 70 70  returns in.  app
0890: 72 6f 78 69 6d 61 74 65 6c 79 20 30 2e 30 33 20  roximately 0.03 
08a0: 73 65 63 6f 6e 64 73 2c 20 76 65 72 73 75 73 20  seconds, versus 
08b0: 32 32 2e 35 20 66 6f 72 20 71 75 65 72 79 69 6e  22.5 for queryin
08c0: 67 20 74 68 65 20 6f 72 64 69 6e 61 72 79 20 74  g the ordinary t
08d0: 61 62 6c 65 2e 0a 0a 3c 63 6f 64 65 62 6c 6f 63  able...<codebloc
08e0: 6b 3e 0a 20 20 53 45 4c 45 43 54 20 63 6f 75 6e  k>.  SELECT coun
08f0: 74 28 2a 29 20 46 52 4f 4d 20 65 6e 72 6f 6e 64  t(*) FROM enrond
0900: 61 74 61 31 20 57 48 45 52 45 20 63 6f 6e 74 65  ata1 WHERE conte
0910: 6e 74 20 4d 41 54 43 48 20 27 6c 69 6e 75 78 27  nt MATCH 'linux'
0920: 3b 20 20 2f 2a 20 30 2e 30 33 20 73 65 63 6f 6e  ;  /* 0.03 secon
0930: 64 73 20 2a 2f 0a 20 20 53 45 4c 45 43 54 20 63  ds */.  SELECT c
0940: 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 65 6e 72  ount(*) FROM enr
0950: 6f 6e 64 61 74 61 32 20 57 48 45 52 45 20 63 6f  ondata2 WHERE co
0960: 6e 74 65 6e 74 20 4c 49 4b 45 20 27 25 6c 69 6e  ntent LIKE '%lin
0970: 75 78 25 27 3b 20 2f 2a 20 32 32 2e 35 20 73 65  ux%'; /* 22.5 se
0980: 63 6f 6e 64 73 20 2a 2f 0a 3c 2f 63 6f 64 65 62  conds */.</codeb
0990: 6c 6f 63 6b 3e 0a 0a 3c 70 3e 0a 20 20 4f 66 20  lock>..<p>.  Of 
09a0: 63 6f 75 72 73 65 2c 20 74 68 65 20 74 77 6f 20  course, the two 
09b0: 71 75 65 72 69 65 73 20 61 62 6f 76 65 20 61 72  queries above ar
09c0: 65 20 6e 6f 74 20 65 6e 74 69 72 65 6c 79 20 65  e not entirely e
09d0: 71 75 69 76 61 6c 65 6e 74 2e 20 46 6f 72 20 65  quivalent. For e
09e0: 78 61 6d 70 6c 65 0a 20 20 74 68 65 20 4c 49 4b  xample.  the LIK
09f0: 45 20 71 75 65 72 79 20 6d 61 74 63 68 65 73 20  E query matches 
0a00: 72 6f 77 73 20 74 68 61 74 20 63 6f 6e 74 61 69  rows that contai
0a10: 6e 20 74 65 72 6d 73 20 73 75 63 68 20 61 73 20  n terms such as 
0a20: 22 6c 69 6e 75 78 6f 70 68 6f 62 65 22 0a 20 20  "linuxophobe".  
0a30: 6f 72 20 22 45 6e 74 65 72 70 72 69 73 65 4c 69  or "EnterpriseLi
0a40: 6e 75 78 22 20 28 61 73 20 69 74 20 68 61 70 70  nux" (as it happ
0a50: 65 6e 73 2c 20 74 68 65 20 45 6e 72 6f 6e 20 45  ens, the Enron E
0a60: 2d 4d 61 69 6c 20 44 61 74 61 73 65 74 20 64 6f  -Mail Dataset do
0a70: 65 73 20 6e 6f 74 0a 20 20 61 63 74 75 61 6c 6c  es not.  actuall
0a80: 79 20 63 6f 6e 74 61 69 6e 20 61 6e 79 20 73 75  y contain any su
0a90: 63 68 20 74 65 72 6d 73 29 2c 20 77 68 65 72 65  ch terms), where
0aa0: 61 73 20 74 68 65 20 4d 41 54 43 48 20 71 75 65  as the MATCH que
0ab0: 72 79 20 6f 6e 20 74 68 65 20 46 54 53 33 20 74  ry on the FTS3 t
0ac0: 61 62 6c 65 0a 20 20 73 65 6c 65 63 74 73 20 6f  able.  selects o
0ad0: 6e 6c 79 20 74 68 6f 73 65 20 72 6f 77 73 20 74  nly those rows t
0ae0: 68 61 74 20 63 6f 6e 74 61 69 6e 20 22 6c 69 6e  hat contain "lin
0af0: 75 78 22 20 61 73 20 61 20 64 69 73 63 72 65 74  ux" as a discret
0b00: 65 20 74 6f 6b 65 6e 2e 20 42 6f 74 68 20 0a 20  e token. Both . 
0b10: 20 73 65 61 72 63 68 65 73 20 61 72 65 20 63 61   searches are ca
0b20: 73 65 2d 69 6e 73 65 6e 73 69 74 69 76 65 2e 20  se-insensitive. 
0b30: 54 68 65 20 46 54 53 33 20 74 61 62 6c 65 20 63  The FTS3 table c
0b40: 6f 6e 73 75 6d 65 73 20 61 72 6f 75 6e 64 20 32  onsumes around 2
0b50: 30 30 36 20 4d 42 20 6f 6e 0a 20 20 64 69 73 6b  006 MB on.  disk
0b60: 20 63 6f 6d 70 61 72 65 64 20 74 6f 20 6a 75 73   compared to jus
0b70: 74 20 31 34 35 33 20 4d 42 20 66 6f 72 20 74 68  t 1453 MB for th
0b80: 65 20 6f 72 64 69 6e 61 72 79 20 74 61 62 6c 65  e ordinary table
0b90: 2e 20 55 73 69 6e 67 20 74 68 65 20 73 61 6d 65  . Using the same
0ba0: 0a 20 20 68 61 72 64 77 61 72 65 20 63 6f 6e 66  .  hardware conf
0bb0: 69 67 75 72 61 74 69 6f 6e 20 75 73 65 64 20 74  iguration used t
0bc0: 6f 20 70 65 72 66 6f 72 6d 20 74 68 65 20 53 45  o perform the SE
0bd0: 4c 45 43 54 20 71 75 65 72 69 65 73 20 61 62 6f  LECT queries abo
0be0: 76 65 2c 20 74 68 65 20 46 54 53 33 0a 20 20 74  ve, the FTS3.  t
0bf0: 61 62 6c 65 20 74 6f 6f 6b 20 6a 75 73 74 20 75  able took just u
0c00: 6e 64 65 72 20 33 31 20 6d 69 6e 75 74 65 73 20  nder 31 minutes 
0c10: 74 6f 20 70 6f 70 75 6c 61 74 65 2c 20 76 65 72  to populate, ver
0c20: 73 75 73 20 32 35 20 66 6f 72 20 74 68 65 20 6f  sus 25 for the o
0c30: 72 64 69 6e 61 72 79 0a 20 20 74 61 62 6c 65 2e  rdinary.  table.
0c40: 0a 0a 3c 68 32 3e 44 69 66 66 65 72 65 6e 63 65  ..<h2>Difference
0c50: 73 20 62 65 74 77 65 65 6e 20 46 54 53 33 20 61  s between FTS3 a
0c60: 6e 64 20 46 54 53 34 3c 2f 68 32 3e 0a 3c 74 63  nd FTS4</h2>.<tc
0c70: 6c 3e 68 64 5f 66 72 61 67 6d 65 6e 74 20 66 74  l>hd_fragment ft
0c80: 73 34 20 46 54 53 34 3c 2f 74 63 6c 3e 0a 0a 3c  s4 FTS4</tcl>..<
0c90: 70 3e 0a 20 20 46 54 53 33 20 61 6e 64 20 46 54  p>.  FTS3 and FT
0ca0: 53 34 20 61 72 65 20 6e 65 61 72 6c 79 20 69 64  S4 are nearly id
0cb0: 65 6e 74 69 63 61 6c 2e 20 54 68 65 79 20 73 68  entical. They sh
0cc0: 61 72 65 20 6d 6f 73 74 20 6f 66 20 74 68 65 69  are most of thei
0cd0: 72 20 63 6f 64 65 20 69 6e 20 63 6f 6d 6d 6f 6e  r code in common
0ce0: 2c 0a 20 20 61 6e 64 20 74 68 65 69 72 20 69 6e  ,.  and their in
0cf0: 74 65 72 66 61 63 65 73 20 61 72 65 20 74 68 65  terfaces are the
0d00: 20 73 61 6d 65 2e 20 54 68 65 20 64 69 66 66 65   same. The diffe
0d10: 72 65 6e 63 65 73 20 61 72 65 3a 0a 0a 3c 75 6c  rences are:..<ul
0d20: 3e 0a 20 20 3c 6c 69 3e 20 3c 70 3e 46 54 53 34  >.  <li> <p>FTS4
0d30: 20 63 6f 6e 74 61 69 6e 73 20 71 75 65 72 79 20   contains query 
0d40: 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 70 74 69  performance opti
0d50: 6d 69 7a 61 74 69 6f 6e 73 20 74 68 61 74 20 6d  mizations that m
0d60: 61 79 20 73 69 67 6e 69 66 69 63 61 6e 74 6c 79  ay significantly
0d70: 0a 20 20 20 20 20 20 20 69 6d 70 72 6f 76 65 20  .       improve 
0d80: 74 68 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  the performance 
0d90: 6f 66 20 66 75 6c 6c 2d 74 65 78 74 20 71 75 65  of full-text que
0da0: 72 69 65 73 20 74 68 61 74 20 63 6f 6e 74 61 69  ries that contai
0db0: 6e 20 74 65 72 6d 73 20 74 68 61 74 20 61 72 65  n terms that are
0dc0: 0a 20 20 20 20 20 20 20 76 65 72 79 20 63 6f 6d  .       very com
0dd0: 6d 6f 6e 20 28 70 72 65 73 65 6e 74 20 69 6e 20  mon (present in 
0de0: 61 20 6c 61 72 67 65 20 70 65 72 63 65 6e 74 61  a large percenta
0df0: 67 65 20 6f 66 20 74 61 62 6c 65 20 72 6f 77 73  ge of table rows
0e00: 29 2e 0a 0a 20 20 3c 6c 69 3e 20 3c 70 3e 46 54  )...  <li> <p>FT
0e10: 53 34 20 73 75 70 70 6f 72 74 73 20 73 6f 6d 65  S4 supports some
0e20: 20 61 64 64 69 74 69 6f 6e 61 6c 20 6f 70 74 69   additional opti
0e30: 6f 6e 73 20 74 68 61 74 20 6d 61 79 20 75 73 65  ons that may use
0e40: 64 20 77 69 74 68 20 74 68 65 20 5b 6d 61 74 63  d with the [matc
0e50: 68 69 6e 66 6f 28 29 5d 0a 20 20 20 20 20 20 20  hinfo()].       
0e60: 66 75 6e 63 74 69 6f 6e 2e 20 0a 0a 20 20 3c 6c  function. ..  <l
0e70: 69 3e 20 3c 70 3e 42 65 63 61 75 73 65 20 69 74  i> <p>Because it
0e80: 20 73 74 6f 72 65 73 20 65 78 74 72 61 20 69 6e   stores extra in
0e90: 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 64 69 73  formation on dis
0ea0: 6b 20 69 6e 20 74 77 6f 20 6e 65 77 20 0a 20 20  k in two new .  
0eb0: 20 20 20 20 20 5b 46 54 53 20 73 68 61 64 6f 77       [FTS shadow
0ec0: 20 74 61 62 6c 65 73 7c 73 68 61 64 6f 77 20 74   tables|shadow t
0ed0: 61 62 6c 65 73 5d 20 69 6e 20 6f 72 64 65 72 20  ables] in order 
0ee0: 74 6f 20 73 75 70 70 6f 72 74 20 74 68 65 20 70  to support the p
0ef0: 65 72 66 6f 72 6d 61 6e 63 65 0a 20 20 20 20 20  erformance.     
0f00: 20 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20    optimizations 
0f10: 61 6e 64 20 65 78 74 72 61 20 6d 61 74 63 68 69  and extra matchi
0f20: 6e 66 6f 28 29 20 6f 70 74 69 6f 6e 73 2c 20 46  nfo() options, F
0f30: 54 53 34 20 74 61 62 6c 65 73 20 6d 61 79 20 63  TS4 tables may c
0f40: 6f 6e 73 75 6d 65 20 6d 6f 72 65 0a 20 20 20 20  onsume more.    
0f50: 20 20 20 64 69 73 6b 20 73 70 61 63 65 20 74 68     disk space th
0f60: 61 6e 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e  an the equivalen
0f70: 74 20 74 61 62 6c 65 20 63 72 65 61 74 65 64 20  t table created 
0f80: 75 73 69 6e 67 20 46 54 53 33 2e 20 55 73 75 61  using FTS3. Usua
0f90: 6c 6c 79 20 74 68 65 20 6f 76 65 72 68 65 61 64  lly the overhead
0fa0: 0a 20 20 20 20 20 20 20 69 73 20 31 2d 32 25 20  .       is 1-2% 
0fb0: 6f 72 20 6c 65 73 73 2c 20 62 75 74 20 6d 61 79  or less, but may
0fc0: 20 62 65 20 61 73 20 68 69 67 68 20 61 73 20 31   be as high as 1
0fd0: 30 25 20 69 66 20 74 68 65 20 64 6f 63 75 6d 65  0% if the docume
0fe0: 6e 74 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68  nts stored in th
0ff0: 65 0a 20 20 20 20 20 20 20 46 54 53 20 74 61 62  e.       FTS tab
1000: 6c 65 20 61 72 65 20 76 65 72 79 20 73 6d 61 6c  le are very smal
1010: 6c 2e 20 54 68 65 20 6f 76 65 72 68 65 61 64 20  l. The overhead 
1020: 6d 61 79 20 62 65 20 72 65 64 75 63 65 64 20 62  may be reduced b
1030: 79 20 73 70 65 63 69 66 79 69 6e 67 20 74 68 65  y specifying the
1040: 0a 20 20 20 20 20 20 20 64 69 72 65 63 74 69 76  .       directiv
1050: 65 20 5b 46 54 53 34 20 6d 61 74 63 68 69 6e 66  e [FTS4 matchinf
1060: 6f 20 6f 70 74 69 6f 6e 7c 22 6d 61 74 63 68 69  o option|"matchi
1070: 6e 66 6f 3d 66 74 73 33 22 5d 20 61 73 20 70 61  nfo=fts3"] as pa
1080: 72 74 20 6f 66 20 74 68 65 20 46 54 53 34 20 74  rt of the FTS4 t
1090: 61 62 6c 65 0a 20 20 20 20 20 20 20 64 65 63 6c  able.       decl
10a0: 61 72 61 74 69 6f 6e 2c 20 62 75 74 20 74 68 69  aration, but thi
10b0: 73 20 63 6f 6d 65 73 20 61 74 20 74 68 65 20 65  s comes at the e
10c0: 78 70 65 6e 73 65 20 6f 66 20 73 61 63 72 69 66  xpense of sacrif
10d0: 69 63 69 6e 67 20 73 6f 6d 65 20 6f 66 20 74 68  icing some of th
10e0: 65 0a 20 20 20 20 20 20 20 65 78 74 72 61 20 73  e.       extra s
10f0: 75 70 70 6f 72 74 65 64 20 6d 61 74 63 68 69 6e  upported matchin
1100: 66 6f 28 29 20 6f 70 74 69 6f 6e 73 2e 0a 0a 20  fo() options... 
1110: 20 3c 6c 69 3e 20 3c 70 3e 46 54 53 34 20 70 72   <li> <p>FTS4 pr
1120: 6f 76 69 64 65 73 20 68 6f 6f 6b 73 20 28 74 68  ovides hooks (th
1130: 65 20 63 6f 6d 70 72 65 73 73 20 61 6e 64 20 75  e compress and u
1140: 6e 63 6f 6d 70 72 65 73 73 20 0a 20 20 20 20 20  ncompress .     
1150: 20 20 5b 46 54 53 34 20 6f 70 74 69 6f 6e 73 7c    [FTS4 options|
1160: 6f 70 74 69 6f 6e 73 5d 29 20 61 6c 6c 6f 77 69  options]) allowi
1170: 6e 67 20 64 61 74 61 20 74 6f 20 62 65 20 73 74  ng data to be st
1180: 6f 72 65 64 20 69 6e 20 61 20 63 6f 6d 70 72 65  ored in a compre
1190: 73 73 65 64 20 0a 20 20 20 20 20 20 20 66 6f 72  ssed .       for
11a0: 6d 2c 20 72 65 64 75 63 69 6e 67 20 64 69 73 6b  m, reducing disk
11b0: 20 75 73 61 67 65 20 61 6e 64 20 49 4f 2e 0a 3c   usage and IO..<
11c0: 2f 75 6c 3e 0a 0a 3c 70 3e 0a 20 20 46 54 53 34  /ul>..<p>.  FTS4
11d0: 20 69 73 20 61 6e 20 65 6e 68 61 6e 63 65 6d 65   is an enhanceme
11e0: 6e 74 20 74 6f 20 46 54 53 33 2e 20 20 46 54 53  nt to FTS3.  FTS
11f0: 33 20 68 61 73 20 62 65 65 6e 20 61 76 61 69 6c  3 has been avail
1200: 61 62 6c 65 20 73 69 6e 63 65 20 53 51 4c 69 74  able since SQLit
1210: 65 20 5b 76 65 72 73 69 6f 6e 20 33 2e 35 2e 30  e [version 3.5.0
1220: 5d 20 69 6e 0a 20 20 32 30 30 37 2d 30 39 2d 30  ] in.  2007-09-0
1230: 34 2e 20 20 54 68 65 20 65 6e 68 61 6e 63 65 6d  4.  The enhancem
1240: 65 6e 74 73 20 66 6f 72 20 46 54 53 34 20 77 65  ents for FTS4 we
1250: 72 65 20 61 64 64 65 64 20 77 69 74 68 20 53 51  re added with SQ
1260: 4c 69 74 65 20 5b 76 65 72 73 69 6f 6e 20 33 2e  Lite [version 3.
1270: 37 2e 34 5d 20 6f 6e 20 32 30 31 30 2d 31 32 2d  7.4] on 2010-12-
1280: 30 38 2e 0a 0a 3c 70 3e 0a 20 20 57 68 69 63 68  08...<p>.  Which
1290: 20 6d 6f 64 75 6c 65 2c 20 46 54 53 33 20 6f 72   module, FTS3 or
12a0: 20 46 54 53 34 2c 20 73 68 6f 75 6c 64 20 79 6f   FTS4, should yo
12b0: 75 20 75 73 65 20 69 6e 20 79 6f 75 72 20 61 70  u use in your ap
12c0: 70 6c 69 63 61 74 69 6f 6e 3f 20 20 46 54 53 34  plication?  FTS4
12d0: 20 69 73 0a 20 20 73 6f 6d 65 74 69 6d 65 73 20   is.  sometimes 
12e0: 73 69 67 6e 69 66 69 63 61 6e 74 6c 79 20 66 61  significantly fa
12f0: 73 74 65 72 20 74 68 61 6e 20 46 54 53 33 2c 20  ster than FTS3, 
1300: 65 76 65 6e 20 6f 72 64 65 72 73 20 6f 66 20 6d  even orders of m
1310: 61 67 6e 69 74 75 64 65 20 66 61 73 74 65 72 0a  agnitude faster.
1320: 20 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74    depending on t
1330: 68 65 20 71 75 65 72 79 2c 20 74 68 6f 75 67 68  he query, though
1340: 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63   in the common c
1350: 61 73 65 20 74 68 65 20 70 65 72 66 6f 72 6d 61  ase the performa
1360: 6e 63 65 20 6f 66 20 74 68 65 20 74 77 6f 0a 20  nce of the two. 
1370: 20 6d 6f 64 75 6c 65 73 20 69 73 20 73 69 6d 69   modules is simi
1380: 6c 61 72 2e 20 46 54 53 34 20 61 6c 73 6f 20 6f  lar. FTS4 also o
1390: 66 66 65 72 73 20 74 68 65 20 65 6e 68 61 6e 63  ffers the enhanc
13a0: 65 64 20 5b 6d 61 74 63 68 69 6e 66 6f 28 29 5d  ed [matchinfo()]
13b0: 20 6f 75 74 70 75 74 73 20 77 68 69 63 68 0a 20   outputs which. 
13c0: 20 63 61 6e 20 62 65 20 75 73 65 66 75 6c 20 69   can be useful i
13d0: 6e 20 72 61 6e 6b 69 6e 67 20 74 68 65 20 72 65  n ranking the re
13e0: 73 75 6c 74 73 20 6f 66 20 61 20 5b 46 54 53 20  sults of a [FTS 
13f0: 4d 41 54 43 48 7c 4d 41 54 43 48 5d 20 6f 70 65  MATCH|MATCH] ope
1400: 72 61 74 69 6f 6e 2e 20 20 4f 6e 20 74 68 65 0a  ration.  On the.
1410: 20 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 6e    other hand, in
1420: 20 74 68 65 20 61 62 73 65 6e 63 65 20 6f 66 20   the absence of 
1430: 61 20 5b 46 54 53 34 20 6d 61 74 63 68 69 6e 66  a [FTS4 matchinf
1440: 6f 20 6f 70 74 69 6f 6e 7c 6d 61 74 63 68 69 6e  o option|matchin
1450: 66 6f 3d 66 74 73 33 5d 20 64 69 72 65 63 74 69  fo=fts3] directi
1460: 76 65 20 46 54 53 34 20 72 65 71 75 69 72 65 73  ve FTS4 requires
1470: 20 61 20 6c 69 74 74 6c 65 0a 20 20 6d 6f 72 65   a little.  more
1480: 20 64 69 73 6b 20 73 70 61 63 65 20 74 68 61 6e   disk space than
1490: 20 46 54 53 33 2c 20 74 68 6f 75 67 68 20 6f 6e   FTS3, though on
14a0: 6c 79 20 61 20 70 65 72 63 65 6e 74 20 6f 66 20  ly a percent of 
14b0: 74 77 6f 20 69 6e 20 6d 6f 73 74 20 63 61 73 65  two in most case
14c0: 73 2e 0a 0a 3c 70 3e 0a 20 20 46 6f 72 20 6e 65  s...<p>.  For ne
14d0: 77 65 72 20 61 70 70 6c 69 63 61 74 69 6f 6e 73  wer applications
14e0: 2c 20 46 54 53 34 20 69 73 20 72 65 63 6f 6d 6d  , FTS4 is recomm
14f0: 65 6e 64 65 64 3b 20 74 68 6f 75 67 68 20 69 66  ended; though if
1500: 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 77   compatibility w
1510: 69 74 68 20 6f 6c 64 65 72 20 0a 20 20 76 65 72  ith older .  ver
1520: 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20  sions of SQLite 
1530: 69 73 20 69 6d 70 6f 72 74 61 6e 74 2c 20 74 68  is important, th
1540: 65 6e 20 46 54 53 33 20 77 69 6c 6c 20 75 73 75  en FTS3 will usu
1550: 61 6c 6c 79 20 73 65 72 76 65 20 6a 75 73 74 20  ally serve just 
1560: 61 73 20 77 65 6c 6c 2e 20 20 0a 0a 3c 68 32 3e  as well.  ..<h2>
1570: 43 72 65 61 74 69 6e 67 20 61 6e 64 20 44 65 73  Creating and Des
1580: 74 72 6f 79 69 6e 67 20 46 54 53 20 54 61 62 6c  troying FTS Tabl
1590: 65 73 3c 2f 68 32 3e 0a 0a 3c 70 3e 0a 20 20 4c  es</h2>..<p>.  L
15a0: 69 6b 65 20 6f 74 68 65 72 20 76 69 72 74 75 61  ike other virtua
15b0: 6c 20 74 61 62 6c 65 20 74 79 70 65 73 2c 20 6e  l table types, n
15c0: 65 77 20 46 54 53 20 74 61 62 6c 65 73 20 61 72  ew FTS tables ar
15d0: 65 20 63 72 65 61 74 65 64 20 75 73 69 6e 67 20  e created using 
15e0: 61 20 0a 20 20 5b 43 52 45 41 54 45 20 56 49 52  a .  [CREATE VIR
15f0: 54 55 41 4c 20 54 41 42 4c 45 5d 20 73 74 61 74  TUAL TABLE] stat
1600: 65 6d 65 6e 74 2e 20 54 68 65 20 6d 6f 64 75 6c  ement. The modul
1610: 65 20 6e 61 6d 65 2c 20 77 68 69 63 68 20 66 6f  e name, which fo
1620: 6c 6c 6f 77 73 0a 20 20 74 68 65 20 55 53 49 4e  llows.  the USIN
1630: 47 20 6b 65 79 77 6f 72 64 2c 20 69 73 20 65 69  G keyword, is ei
1640: 74 68 65 72 20 22 66 74 73 33 22 20 6f 72 20 22  ther "fts3" or "
1650: 66 74 73 34 22 2e 20 54 68 65 20 76 69 72 74 75  fts4". The virtu
1660: 61 6c 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65 20  al table module 
1670: 61 72 67 75 6d 65 6e 74 73 20 6d 61 79 0a 20 20  arguments may.  
1680: 62 65 20 6c 65 66 74 20 65 6d 70 74 79 2c 20 69  be left empty, i
1690: 6e 20 77 68 69 63 68 20 63 61 73 65 20 61 6e 20  n which case an 
16a0: 46 54 53 20 74 61 62 6c 65 20 77 69 74 68 20 61  FTS table with a
16b0: 20 73 69 6e 67 6c 65 20 75 73 65 72 2d 64 65 66   single user-def
16c0: 69 6e 65 64 20 0a 20 20 63 6f 6c 75 6d 6e 20 6e  ined .  column n
16d0: 61 6d 65 64 20 22 63 6f 6e 74 65 6e 74 22 20 69  amed "content" i
16e0: 73 20 63 72 65 61 74 65 64 2e 20 41 6c 74 65 72  s created. Alter
16f0: 6e 61 74 69 76 65 6c 79 2c 20 74 68 65 20 6d 6f  natively, the mo
1700: 64 75 6c 65 20 61 72 67 75 6d 65 6e 74 73 0a 20  dule arguments. 
1710: 20 6d 61 79 20 62 65 20 70 61 73 73 65 64 20 61   may be passed a
1720: 20 6c 69 73 74 20 6f 66 20 63 6f 6d 6d 61 20 73   list of comma s
1730: 65 70 61 72 61 74 65 64 20 63 6f 6c 75 6d 6e 20  eparated column 
1740: 6e 61 6d 65 73 2e 20 0a 0a 3c 70 3e 0a 20 20 49  names. ..<p>.  I
1750: 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61  f column names a
1760: 72 65 20 65 78 70 6c 69 63 69 74 6c 79 20 70 72  re explicitly pr
1770: 6f 76 69 64 65 64 20 66 6f 72 20 74 68 65 20 46  ovided for the F
1780: 54 53 20 74 61 62 6c 65 20 61 73 20 70 61 72 74  TS table as part
1790: 20 6f 66 0a 20 20 74 68 65 20 43 52 45 41 54 45   of.  the CREATE
17a0: 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 73   VIRTUAL TABLE s
17b0: 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 61  tatement, then a
17c0: 20 64 61 74 61 74 79 70 65 20 6e 61 6d 65 20 6d   datatype name m
17d0: 61 79 20 62 65 20 6f 70 74 69 6f 6e 61 6c 6c 79  ay be optionally
17e0: 20 0a 20 20 73 70 65 63 69 66 69 65 64 20 66 6f   .  specified fo
17f0: 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 2e 20 54  r each column. T
1800: 68 69 73 20 69 73 20 70 75 72 65 20 73 79 6e 74  his is pure synt
1810: 61 63 74 69 63 20 73 75 67 61 72 2c 20 74 68 65  actic sugar, the
1820: 0a 20 20 73 75 70 70 6c 69 65 64 20 74 79 70 65  .  supplied type
1830: 6e 61 6d 65 73 20 61 72 65 20 6e 6f 74 20 75 73  names are not us
1840: 65 64 20 62 79 20 46 54 53 20 6f 72 20 74 68 65  ed by FTS or the
1850: 20 53 51 4c 69 74 65 20 63 6f 72 65 20 66 6f 72   SQLite core for
1860: 20 61 6e 79 0a 20 20 70 75 72 70 6f 73 65 2e 20   any.  purpose. 
1870: 54 68 65 20 73 61 6d 65 20 61 70 70 6c 69 65 73  The same applies
1880: 20 74 6f 20 61 6e 79 20 63 6f 6e 73 74 72 61 69   to any constrai
1890: 6e 74 73 20 73 70 65 63 69 66 69 65 64 20 61 6c  nts specified al
18a0: 6f 6e 67 20 77 69 74 68 20 61 6e 0a 20 20 46 54  ong with an.  FT
18b0: 53 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2d 20  S column name - 
18c0: 74 68 65 79 20 61 72 65 20 70 61 72 73 65 64 20  they are parsed 
18d0: 62 75 74 20 6e 6f 74 20 75 73 65 64 20 6f 72 20  but not used or 
18e0: 72 65 63 6f 72 64 65 64 20 62 79 20 74 68 65 20  recorded by the 
18f0: 73 79 73 74 65 6d 0a 20 20 69 6e 20 61 6e 79 20  system.  in any 
1900: 77 61 79 2e 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b  way...<codeblock
1910: 3e 0a 20 20 3c 69 3e 2d 2d 20 43 72 65 61 74 65  >.  <i>-- Create
1920: 20 61 6e 20 46 54 53 20 74 61 62 6c 65 20 6e 61   an FTS table na
1930: 6d 65 64 20 22 64 61 74 61 22 20 77 69 74 68 20  med "data" with 
1940: 6f 6e 65 20 63 6f 6c 75 6d 6e 20 2d 20 22 63 6f  one column - "co
1950: 6e 74 65 6e 74 22 3a 3c 2f 69 3e 0a 20 20 43 52  ntent":</i>.  CR
1960: 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42  EATE VIRTUAL TAB
1970: 4c 45 20 64 61 74 61 20 55 53 49 4e 47 20 66 74  LE data USING ft
1980: 73 33 28 29 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 43  s3();..  <i>-- C
1990: 72 65 61 74 65 20 61 6e 20 46 54 53 20 74 61 62  reate an FTS tab
19a0: 6c 65 20 6e 61 6d 65 64 20 22 70 61 67 65 73 22  le named "pages"
19b0: 20 77 69 74 68 20 74 68 72 65 65 20 63 6f 6c 75   with three colu
19c0: 6d 6e 73 3a 3c 2f 69 3e 0a 20 20 43 52 45 41 54  mns:</i>.  CREAT
19d0: 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20  E VIRTUAL TABLE 
19e0: 70 61 67 65 73 20 55 53 49 4e 47 20 66 74 73 34  pages USING fts4
19f0: 28 74 69 74 6c 65 2c 20 6b 65 79 77 6f 72 64 73  (title, keywords
1a00: 2c 20 62 6f 64 79 29 3b 0a 0a 20 20 3c 69 3e 2d  , body);..  <i>-
1a10: 2d 20 43 72 65 61 74 65 20 61 6e 20 46 54 53 20  - Create an FTS 
1a20: 74 61 62 6c 65 20 6e 61 6d 65 64 20 22 6d 61 69  table named "mai
1a30: 6c 22 20 77 69 74 68 20 74 77 6f 20 63 6f 6c 75  l" with two colu
1a40: 6d 6e 73 2e 20 44 61 74 61 74 79 70 65 73 0a 20  mns. Datatypes. 
1a50: 20 2d 2d 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 63   -- and column c
1a60: 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65 20 73  onstraints are s
1a70: 70 65 63 69 66 69 65 64 20 61 6c 6f 6e 67 20 77  pecified along w
1a80: 69 74 68 20 65 61 63 68 20 63 6f 6c 75 6d 6e 2e  ith each column.
1a90: 20 54 68 65 73 65 0a 20 20 2d 2d 20 61 72 65 20   These.  -- are 
1aa0: 63 6f 6d 70 6c 65 74 65 6c 79 20 69 67 6e 6f 72  completely ignor
1ab0: 65 64 20 62 79 20 46 54 53 20 61 6e 64 20 53 51  ed by FTS and SQ
1ac0: 4c 69 74 65 2e 20 3c 2f 69 3e 0a 20 20 43 52 45  Lite. </i>.  CRE
1ad0: 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c  ATE VIRTUAL TABL
1ae0: 45 20 6d 61 69 6c 20 55 53 49 4e 47 20 66 74 73  E mail USING fts
1af0: 33 28 0a 20 20 20 20 73 75 62 6a 65 63 74 20 56  3(.    subject V
1b00: 41 52 43 48 41 52 28 32 35 36 29 20 4e 4f 54 20  ARCHAR(256) NOT 
1b10: 4e 55 4c 4c 2c 0a 20 20 20 20 62 6f 64 79 20 54  NULL,.    body T
1b20: 45 58 54 20 43 48 45 43 4b 28 6c 65 6e 67 74 68  EXT CHECK(length
1b30: 28 62 6f 64 79 29 26 6c 74 3b 31 30 32 34 30 29  (body)&lt;10240)
1b40: 0a 20 20 29 3b 0a 3c 2f 63 6f 64 65 62 6c 6f 63  .  );.</codebloc
1b50: 6b 3e 0a 0a 3c 70 3e 0a 20 20 41 73 20 77 65 6c  k>..<p>.  As wel
1b60: 6c 20 61 73 20 61 20 6c 69 73 74 20 6f 66 20 63  l as a list of c
1b70: 6f 6c 75 6d 6e 73 2c 20 74 68 65 20 6d 6f 64 75  olumns, the modu
1b80: 6c 65 20 61 72 67 75 6d 65 6e 74 73 20 70 61 73  le arguments pas
1b90: 73 65 64 20 74 6f 20 61 20 43 52 45 41 54 45 0a  sed to a CREATE.
1ba0: 20 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20    VIRTUAL TABLE 
1bb0: 73 74 61 74 65 6d 65 6e 74 20 75 73 65 64 20 74  statement used t
1bc0: 6f 20 63 72 65 61 74 65 20 61 6e 20 46 54 53 20  o create an FTS 
1bd0: 74 61 62 6c 65 20 6d 61 79 20 62 65 20 75 73 65  table may be use
1be0: 64 20 74 6f 20 73 70 65 63 69 66 79 0a 20 20 61  d to specify.  a
1bf0: 20 5b 74 6f 6b 65 6e 69 7a 65 72 5d 2e 20 54 68   [tokenizer]. Th
1c00: 69 73 20 69 73 20 64 6f 6e 65 20 62 79 20 73 70  is is done by sp
1c10: 65 63 69 66 79 69 6e 67 20 61 20 73 74 72 69 6e  ecifying a strin
1c20: 67 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 20 20  g of the form.  
1c30: 22 74 6f 6b 65 6e 69 7a 65 3d 26 6c 74 3b 74 6f  "tokenize=&lt;to
1c40: 6b 65 6e 69 7a 65 72 20 6e 61 6d 65 26 67 74 3b  kenizer name&gt;
1c50: 20 26 6c 74 3b 74 6f 6b 65 6e 69 7a 65 72 20 61   &lt;tokenizer a
1c60: 72 67 73 26 67 74 3b 22 20 69 6e 20 70 6c 61 63  rgs&gt;" in plac
1c70: 65 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 0a 20 20  e of a column.  
1c80: 6e 61 6d 65 2c 20 77 68 65 72 65 20 26 6c 74 3b  name, where &lt;
1c90: 74 6f 6b 65 6e 69 7a 65 72 20 6e 61 6d 65 26 67  tokenizer name&g
1ca0: 74 3b 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  t; is the name o
1cb0: 66 20 74 68 65 20 74 6f 6b 65 6e 69 7a 65 72 20  f the tokenizer 
1cc0: 74 6f 20 75 73 65 20 61 6e 64 0a 20 20 26 6c 74  to use and.  &lt
1cd0: 3b 74 6f 6b 65 6e 69 7a 65 72 20 61 72 67 73 26  ;tokenizer args&
1ce0: 67 74 3b 20 69 73 20 61 6e 20 6f 70 74 69 6f 6e  gt; is an option
1cf0: 61 6c 20 6c 69 73 74 20 6f 66 20 77 68 69 74 65  al list of white
1d00: 73 70 61 63 65 20 73 65 70 61 72 61 74 65 64 20  space separated 
1d10: 71 75 61 6c 69 66 69 65 72 73 0a 20 20 74 6f 20  qualifiers.  to 
1d20: 70 61 73 73 20 74 6f 20 74 68 65 20 74 6f 6b 65  pass to the toke
1d30: 6e 69 7a 65 72 20 69 6d 70 6c 65 6d 65 6e 74 61  nizer implementa
1d40: 74 69 6f 6e 2e 20 41 20 74 6f 6b 65 6e 69 7a 65  tion. A tokenize
1d50: 72 20 73 70 65 63 69 66 69 63 61 74 69 6f 6e 20  r specification 
1d60: 6d 61 79 20 62 65 0a 20 20 70 6c 61 63 65 64 20  may be.  placed 
1d70: 61 6e 79 77 68 65 72 65 20 69 6e 20 74 68 65 20  anywhere in the 
1d80: 63 6f 6c 75 6d 6e 20 6c 69 73 74 2c 20 62 75 74  column list, but
1d90: 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 74 6f 6b   at most one tok
1da0: 65 6e 69 7a 65 72 20 64 65 63 6c 61 72 61 74 69  enizer declarati
1db0: 6f 6e 20 69 73 0a 20 20 61 6c 6c 6f 77 65 64 20  on is.  allowed 
1dc0: 66 6f 72 20 65 61 63 68 20 43 52 45 41 54 45 20  for each CREATE 
1dd0: 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 73 74  VIRTUAL TABLE st
1de0: 61 74 65 6d 65 6e 74 2e 20 5b 74 6f 6b 65 6e 69  atement. [tokeni
1df0: 7a 65 72 7c 53 65 65 20 62 65 6c 6f 77 5d 20 66  zer|See below] f
1e00: 6f 72 20 61 20 0a 20 20 64 65 74 61 69 6c 65 64  or a .  detailed
1e10: 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20   description of 
1e20: 75 73 69 6e 67 20 28 61 6e 64 2c 20 69 66 20 6e  using (and, if n
1e30: 65 63 65 73 73 61 72 79 2c 20 69 6d 70 6c 65 6d  ecessary, implem
1e40: 65 6e 74 69 6e 67 29 20 61 20 74 6f 6b 65 6e 69  enting) a tokeni
1e50: 7a 65 72 2e 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b  zer...<codeblock
1e60: 3e 0a 20 20 3c 69 3e 2d 2d 20 43 72 65 61 74 65  >.  <i>-- Create
1e70: 20 61 6e 20 46 54 53 20 74 61 62 6c 65 20 6e 61   an FTS table na
1e80: 6d 65 64 20 22 70 61 70 65 72 73 22 20 77 69 74  med "papers" wit
1e90: 68 20 74 77 6f 20 63 6f 6c 75 6d 6e 73 20 74 68  h two columns th
1ea0: 61 74 20 75 73 65 73 3c 2f 69 3e 0a 20 20 3c 69  at uses</i>.  <i
1eb0: 3e 2d 2d 20 74 68 65 20 74 6f 6b 65 6e 69 7a 65  >-- the tokenize
1ec0: 72 20 22 70 6f 72 74 65 72 22 2e 3c 2f 69 3e 0a  r "porter".</i>.
1ed0: 20 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c    CREATE VIRTUAL
1ee0: 20 54 41 42 4c 45 20 70 61 70 65 72 73 20 55 53   TABLE papers US
1ef0: 49 4e 47 20 66 74 73 33 28 61 75 74 68 6f 72 2c  ING fts3(author,
1f00: 20 64 6f 63 75 6d 65 6e 74 2c 20 74 6f 6b 65 6e   document, token
1f10: 69 7a 65 3d 70 6f 72 74 65 72 29 3b 0a 0a 20 20  ize=porter);..  
1f20: 3c 69 3e 2d 2d 20 43 72 65 61 74 65 20 61 6e 20  <i>-- Create an 
1f30: 46 54 53 20 74 61 62 6c 65 20 77 69 74 68 20 61  FTS table with a
1f40: 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 2d   single column -
1f50: 20 22 63 6f 6e 74 65 6e 74 22 20 2d 20 74 68 61   "content" - tha
1f60: 74 20 75 73 65 73 3c 2f 69 3e 0a 20 20 3c 69 3e  t uses</i>.  <i>
1f70: 2d 2d 20 74 68 65 20 22 73 69 6d 70 6c 65 22 20  -- the "simple" 
1f80: 74 6f 6b 65 6e 69 7a 65 72 2e 3c 2f 69 3e 0a 20  tokenizer.</i>. 
1f90: 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20   CREATE VIRTUAL 
1fa0: 54 41 42 4c 45 20 64 61 74 61 20 55 53 49 4e 47  TABLE data USING
1fb0: 20 66 74 73 34 28 74 6f 6b 65 6e 69 7a 65 3d 73   fts4(tokenize=s
1fc0: 69 6d 70 6c 65 29 3b 0a 0a 20 20 3c 69 3e 2d 2d  imple);..  <i>--
1fd0: 20 43 72 65 61 74 65 20 61 6e 20 46 54 53 20 74   Create an FTS t
1fe0: 61 62 6c 65 20 77 69 74 68 20 74 77 6f 20 63 6f  able with two co
1ff0: 6c 75 6d 6e 73 20 74 68 61 74 20 75 73 65 73 20  lumns that uses 
2000: 74 68 65 20 22 69 63 75 22 20 74 6f 6b 65 6e 69  the "icu" tokeni
2010: 7a 65 72 2e 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d  zer.</i>.  <i>--
2020: 20 54 68 65 20 71 75 61 6c 69 66 69 65 72 20 22   The qualifier "
2030: 65 6e 5f 41 55 22 20 69 73 20 70 61 73 73 65 64  en_AU" is passed
2040: 20 74 6f 20 74 68 65 20 74 6f 6b 65 6e 69 7a 65   to the tokenize
2050: 72 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  r implementation
2060: 3c 2f 69 3e 0a 20 20 43 52 45 41 54 45 20 56 49  </i>.  CREATE VI
2070: 52 54 55 41 4c 20 54 41 42 4c 45 20 6e 61 6d 65  RTUAL TABLE name
2080: 73 20 55 53 49 4e 47 20 66 74 73 33 28 61 2c 20  s USING fts3(a, 
2090: 62 2c 20 74 6f 6b 65 6e 69 7a 65 3d 69 63 75 20  b, tokenize=icu 
20a0: 65 6e 5f 41 55 29 3b 0a 3c 2f 63 6f 64 65 62 6c  en_AU);.</codebl
20b0: 6f 63 6b 3e 0a 0a 3c 70 3e 0a 20 20 46 54 53 20  ock>..<p>.  FTS 
20c0: 74 61 62 6c 65 73 20 6d 61 79 20 62 65 20 64 72  tables may be dr
20d0: 6f 70 70 65 64 20 66 72 6f 6d 20 74 68 65 20 64  opped from the d
20e0: 61 74 61 62 61 73 65 20 75 73 69 6e 67 20 61 6e  atabase using an
20f0: 20 6f 72 64 69 6e 61 72 79 20 5b 44 52 4f 50 20   ordinary [DROP 
2100: 54 41 42 4c 45 5d 0a 20 20 73 74 61 74 65 6d 65  TABLE].  stateme
2110: 6e 74 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a  nt. For example:
2120: 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20 20  ..<codeblock>.  
2130: 3c 69 3e 2d 2d 20 43 72 65 61 74 65 2c 20 74 68  <i>-- Create, th
2140: 65 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 64  en immediately d
2150: 72 6f 70 2c 20 61 6e 20 46 54 53 34 20 74 61 62  rop, an FTS4 tab
2160: 6c 65 2e 3c 2f 69 3e 0a 20 20 43 52 45 41 54 45  le.</i>.  CREATE
2170: 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 64   VIRTUAL TABLE d
2180: 61 74 61 20 55 53 49 4e 47 20 66 74 73 34 28 29  ata USING fts4()
2190: 3b 0a 20 20 44 52 4f 50 20 54 41 42 4c 45 20 64  ;.  DROP TABLE d
21a0: 61 74 61 3b 0a 3c 2f 63 6f 64 65 62 6c 6f 63 6b  ata;.</codeblock
21b0: 3e 0a 0a 3c 68 32 3e 50 6f 70 75 6c 61 74 69 6e  >..<h2>Populatin
21c0: 67 20 46 54 53 20 54 61 62 6c 65 73 3c 2f 68 32  g FTS Tables</h2
21d0: 3e 0a 0a 20 20 3c 70 3e 0a 20 20 20 20 46 54 53  >..  <p>.    FTS
21e0: 20 74 61 62 6c 65 73 20 61 72 65 20 70 6f 70 75   tables are popu
21f0: 6c 61 74 65 64 20 75 73 69 6e 67 20 5b 49 4e 53  lated using [INS
2200: 45 52 54 5d 2c 20 5b 55 50 44 41 54 45 5d 20 61  ERT], [UPDATE] a
2210: 6e 64 20 5b 44 45 4c 45 54 45 5d 0a 20 20 20 20  nd [DELETE].    
2220: 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 74 68  statements in th
2230: 65 20 73 61 6d 65 20 77 61 79 20 61 73 20 6f 72  e same way as or
2240: 64 69 6e 61 72 79 20 53 51 4c 69 74 65 20 74 61  dinary SQLite ta
2250: 62 6c 65 73 20 61 72 65 2e 0a 0a 20 20 3c 70 3e  bles are...  <p>
2260: 0a 20 20 20 20 41 73 20 77 65 6c 6c 20 61 73 20  .    As well as 
2270: 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6e 61 6d 65  the columns name
2280: 64 20 62 79 20 74 68 65 20 75 73 65 72 20 28 6f  d by the user (o
2290: 72 20 74 68 65 20 22 63 6f 6e 74 65 6e 74 22 20  r the "content" 
22a0: 63 6f 6c 75 6d 6e 20 69 66 20 6e 6f 0a 20 20 20  column if no.   
22b0: 20 6d 6f 64 75 6c 65 20 61 72 67 75 6d 65 6e 74   module argument
22c0: 73 20 77 65 72 65 20 73 70 65 63 69 66 69 65 64  s were specified
22d0: 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   as part of the 
22e0: 5b 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20  [CREATE VIRTUAL 
22f0: 54 41 42 4c 45 5d 20 0a 20 20 20 20 73 74 61 74  TABLE] .    stat
2300: 65 6d 65 6e 74 29 2c 20 65 61 63 68 20 46 54 53  ement), each FTS
2310: 20 74 61 62 6c 65 20 68 61 73 20 61 20 22 72 6f   table has a "ro
2320: 77 69 64 22 20 63 6f 6c 75 6d 6e 2e 20 54 68 65  wid" column. The
2330: 20 72 6f 77 69 64 20 6f 66 20 61 6e 20 46 54 53   rowid of an FTS
2340: 0a 20 20 20 20 74 61 62 6c 65 20 62 65 68 61 76  .    table behav
2350: 65 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 77  es in the same w
2360: 61 79 20 61 73 20 74 68 65 20 72 6f 77 69 64 20  ay as the rowid 
2370: 63 6f 6c 75 6d 6e 20 6f 66 20 61 6e 20 6f 72 64  column of an ord
2380: 69 6e 61 72 79 20 53 51 4c 69 74 65 20 0a 20 20  inary SQLite .  
2390: 20 20 74 61 62 6c 65 2c 20 65 78 63 65 70 74 20    table, except 
23a0: 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 73 20  that the values 
23b0: 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 72 6f  stored in the ro
23c0: 77 69 64 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 6e  wid column of an
23d0: 20 46 54 53 20 74 61 62 6c 65 20 0a 20 20 20 20   FTS table .    
23e0: 72 65 6d 61 69 6e 20 75 6e 63 68 61 6e 67 65 64  remain unchanged
23f0: 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
2400: 20 69 73 20 72 65 62 75 69 6c 74 20 75 73 69 6e   is rebuilt usin
2410: 67 20 74 68 65 20 5b 56 41 43 55 55 4d 5d 20 63  g the [VACUUM] c
2420: 6f 6d 6d 61 6e 64 2e 20 0a 20 20 20 20 46 6f 72  ommand. .    For
2430: 20 46 54 53 20 74 61 62 6c 65 73 2c 20 22 64 6f   FTS tables, "do
2440: 63 69 64 22 20 69 73 20 61 6c 6c 6f 77 65 64 20  cid" is allowed 
2450: 61 73 20 61 6e 20 61 6c 69 61 73 20 61 6c 6f 6e  as an alias alon
2460: 67 20 77 69 74 68 20 74 68 65 20 75 73 75 61 6c  g with the usual
2470: 20 22 72 6f 77 69 64 22 2c 0a 20 20 20 20 22 6f   "rowid",.    "o
2480: 69 64 22 20 61 6e 64 20 22 5f 6f 69 64 5f 22 20  id" and "_oid_" 
2490: 69 64 65 6e 74 69 66 69 65 72 73 2e 20 41 74 74  identifiers. Att
24a0: 65 6d 70 74 69 6e 67 20 74 6f 20 69 6e 73 65 72  empting to inser
24b0: 74 20 6f 72 20 75 70 64 61 74 65 20 61 20 72 6f  t or update a ro
24c0: 77 20 77 69 74 68 20 61 20 0a 20 20 20 20 64 6f  w with a .    do
24d0: 63 69 64 20 76 61 6c 75 65 20 74 68 61 74 20 61  cid value that a
24e0: 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 69 6e  lready exists in
24f0: 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 61 6e   the table is an
2500: 20 65 72 72 6f 72 2c 20 6a 75 73 74 20 61 73 20   error, just as 
2510: 69 74 20 77 6f 75 6c 64 20 0a 20 20 20 20 62 65  it would .    be
2520: 20 77 69 74 68 20 61 6e 20 6f 72 64 69 6e 61 72   with an ordinar
2530: 79 20 53 51 4c 69 74 65 20 74 61 62 6c 65 2e 0a  y SQLite table..
2540: 0a 20 20 3c 70 3e 0a 20 20 20 20 54 68 65 72 65  .  <p>.    There
2550: 20 69 73 20 6f 6e 65 20 6f 74 68 65 72 20 73 75   is one other su
2560: 62 74 6c 65 20 64 69 66 66 65 72 65 6e 63 65 20  btle difference 
2570: 62 65 74 77 65 65 6e 20 22 64 6f 63 69 64 22 20  between "docid" 
2580: 61 6e 64 20 74 68 65 20 6e 6f 72 6d 61 6c 20 53  and the normal S
2590: 51 4c 69 74 65 0a 20 20 20 20 61 6c 69 61 73 65  QLite.    aliase
25a0: 73 20 66 6f 72 20 74 68 65 20 72 6f 77 69 64 20  s for the rowid 
25b0: 63 6f 6c 75 6d 6e 2e 20 4e 6f 72 6d 61 6c 6c 79  column. Normally
25c0: 2c 20 69 66 20 61 6e 20 49 4e 53 45 52 54 20 6f  , if an INSERT o
25d0: 72 20 55 50 44 41 54 45 20 73 74 61 74 65 6d 65  r UPDATE stateme
25e0: 6e 74 20 0a 20 20 20 20 61 73 73 69 67 6e 73 20  nt .    assigns 
25f0: 64 69 73 63 72 65 74 65 20 76 61 6c 75 65 73 20  discrete values 
2600: 74 6f 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 61  to two or more a
2610: 6c 69 61 73 65 73 20 6f 66 20 74 68 65 20 72 6f  liases of the ro
2620: 77 69 64 20 63 6f 6c 75 6d 6e 2c 20 53 51 4c 69  wid column, SQLi
2630: 74 65 20 0a 20 20 20 20 77 72 69 74 65 73 20 74  te .    writes t
2640: 68 65 20 72 69 67 68 74 6d 6f 73 74 20 6f 66 20  he rightmost of 
2650: 73 75 63 68 20 76 61 6c 75 65 73 20 73 70 65 63  such values spec
2660: 69 66 69 65 64 20 69 6e 20 74 68 65 20 49 4e 53  ified in the INS
2670: 45 52 54 20 6f 72 20 55 50 44 41 54 45 0a 20 20  ERT or UPDATE.  
2680: 20 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 74    statement to t
2690: 68 65 20 64 61 74 61 62 61 73 65 2e 20 48 6f 77  he database. How
26a0: 65 76 65 72 2c 20 61 73 73 69 67 6e 69 6e 67 20  ever, assigning 
26b0: 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65  a non-NULL value
26c0: 20 74 6f 20 62 6f 74 68 0a 20 20 20 20 74 68 65   to both.    the
26d0: 20 22 64 6f 63 69 64 22 20 61 6e 64 20 6f 6e 65   "docid" and one
26e0: 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 20   or more of the 
26f0: 53 51 4c 69 74 65 20 72 6f 77 69 64 20 61 6c 69  SQLite rowid ali
2700: 61 73 65 73 20 77 68 65 6e 20 69 6e 73 65 72 74  ases when insert
2710: 69 6e 67 20 6f 72 0a 20 20 20 20 75 70 64 61 74  ing or.    updat
2720: 69 6e 67 20 61 6e 20 46 54 53 20 74 61 62 6c 65  ing an FTS table
2730: 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61   is considered a
2740: 6e 20 65 72 72 6f 72 2e 20 53 65 65 20 62 65 6c  n error. See bel
2750: 6f 77 20 66 6f 72 20 61 6e 20 65 78 61 6d 70 6c  ow for an exampl
2760: 65 2e 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a  e...<codeblock>.
2770: 20 20 3c 69 3e 2d 2d 20 43 72 65 61 74 65 20 61    <i>-- Create a
2780: 6e 20 46 54 53 20 74 61 62 6c 65 3c 2f 69 3e 0a  n FTS table</i>.
2790: 20 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c    CREATE VIRTUAL
27a0: 20 54 41 42 4c 45 20 70 61 67 65 73 20 55 53 49   TABLE pages USI
27b0: 4e 47 20 66 74 73 34 28 74 69 74 6c 65 2c 20 62  NG fts4(title, b
27c0: 6f 64 79 29 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 49  ody);..  <i>-- I
27d0: 6e 73 65 72 74 20 61 20 72 6f 77 20 77 69 74 68  nsert a row with
27e0: 20 61 20 73 70 65 63 69 66 69 63 20 64 6f 63 69   a specific doci
27f0: 64 20 76 61 6c 75 65 2e 3c 2f 69 3e 0a 20 20 49  d value.</i>.  I
2800: 4e 53 45 52 54 20 49 4e 54 4f 20 70 61 67 65 73  NSERT INTO pages
2810: 28 64 6f 63 69 64 2c 20 74 69 74 6c 65 2c 20 62  (docid, title, b
2820: 6f 64 79 29 20 56 41 4c 55 45 53 28 35 33 2c 20  ody) VALUES(53, 
2830: 27 48 6f 6d 65 20 50 61 67 65 27 2c 20 27 53 51  'Home Page', 'SQ
2840: 4c 69 74 65 20 69 73 20 61 20 73 6f 66 74 77 61  Lite is a softwa
2850: 72 65 2e 2e 2e 27 29 3b 0a 0a 20 20 3c 69 3e 2d  re...');..  <i>-
2860: 2d 20 49 6e 73 65 72 74 20 61 20 72 6f 77 20 61  - Insert a row a
2870: 6e 64 20 61 6c 6c 6f 77 20 46 54 53 20 74 6f 20  nd allow FTS to 
2880: 61 73 73 69 67 6e 20 61 20 64 6f 63 69 64 20 76  assign a docid v
2890: 61 6c 75 65 20 75 73 69 6e 67 20 74 68 65 20 73  alue using the s
28a0: 61 6d 65 20 61 6c 67 6f 72 69 74 68 6d 20 61 73  ame algorithm as
28b0: 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 53 51 4c  </i>.  <i>-- SQL
28c0: 69 74 65 20 75 73 65 73 20 66 6f 72 20 6f 72 64  ite uses for ord
28d0: 69 6e 61 72 79 20 74 61 62 6c 65 73 2e 20 49 6e  inary tables. In
28e0: 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 6e   this case the n
28f0: 65 77 20 64 6f 63 69 64 20 77 69 6c 6c 20 62 65  ew docid will be
2900: 20 35 34 2c 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d   54,</i>.  <i>--
2910: 20 6f 6e 65 20 67 72 65 61 74 65 72 20 74 68 61   one greater tha
2920: 6e 20 74 68 65 20 6c 61 72 67 65 73 74 20 64 6f  n the largest do
2930: 63 69 64 20 63 75 72 72 65 6e 74 6c 79 20 70 72  cid currently pr
2940: 65 73 65 6e 74 20 69 6e 20 74 68 65 20 74 61 62  esent in the tab
2950: 6c 65 2e 3c 2f 69 3e 0a 20 20 49 4e 53 45 52 54  le.</i>.  INSERT
2960: 20 49 4e 54 4f 20 70 61 67 65 73 28 74 69 74 6c   INTO pages(titl
2970: 65 2c 20 62 6f 64 79 29 20 56 41 4c 55 45 53 28  e, body) VALUES(
2980: 27 44 6f 77 6e 6c 6f 61 64 27 2c 20 27 41 6c 6c  'Download', 'All
2990: 20 53 51 4c 69 74 65 20 73 6f 75 72 63 65 20 63   SQLite source c
29a0: 6f 64 65 2e 2e 2e 27 29 3b 0a 0a 20 20 3c 69 3e  ode...');..  <i>
29b0: 2d 2d 20 43 68 61 6e 67 65 20 74 68 65 20 74 69  -- Change the ti
29c0: 74 6c 65 20 6f 66 20 74 68 65 20 72 6f 77 20 6a  tle of the row j
29d0: 75 73 74 20 69 6e 73 65 72 74 65 64 2e 3c 2f 69  ust inserted.</i
29e0: 3e 0a 20 20 55 50 44 41 54 45 20 70 61 67 65 73  >.  UPDATE pages
29f0: 20 53 45 54 20 74 69 74 6c 65 20 3d 20 27 44 6f   SET title = 'Do
2a00: 77 6e 6c 6f 61 64 20 53 51 4c 69 74 65 27 20 57  wnload SQLite' W
2a10: 48 45 52 45 20 72 6f 77 69 64 20 3d 20 35 34 3b  HERE rowid = 54;
2a20: 0a 0a 20 20 3c 69 3e 2d 2d 20 44 65 6c 65 74 65  ..  <i>-- Delete
2a30: 20 74 68 65 20 65 6e 74 69 72 65 20 74 61 62 6c   the entire tabl
2a40: 65 20 63 6f 6e 74 65 6e 74 73 2e 3c 2f 69 3e 0a  e contents.</i>.
2a50: 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 70 61    DELETE FROM pa
2a60: 67 65 73 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 54 68  ges;..  <i>-- Th
2a70: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61  e following is a
2a80: 6e 20 65 72 72 6f 72 2e 20 49 74 20 69 73 20 6e  n error. It is n
2a90: 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 61  ot possible to a
2aa0: 73 73 69 67 6e 20 6e 6f 6e 2d 4e 55 4c 4c 20 76  ssign non-NULL v
2ab0: 61 6c 75 65 73 20 74 6f 20 62 6f 74 68 3c 2f 69  alues to both</i
2ac0: 3e 0a 20 20 3c 69 3e 2d 2d 20 74 68 65 20 72 6f  >.  <i>-- the ro
2ad0: 77 69 64 20 61 6e 64 20 64 6f 63 69 64 20 63 6f  wid and docid co
2ae0: 6c 75 6d 6e 73 20 6f 66 20 61 6e 20 46 54 53 20  lumns of an FTS 
2af0: 74 61 62 6c 65 2e 3c 2f 69 3e 0a 20 20 49 4e 53  table.</i>.  INS
2b00: 45 52 54 20 49 4e 54 4f 20 70 61 67 65 73 28 72  ERT INTO pages(r
2b10: 6f 77 69 64 2c 20 64 6f 63 69 64 2c 20 74 69 74  owid, docid, tit
2b20: 6c 65 2c 20 62 6f 64 79 29 20 56 41 4c 55 45 53  le, body) VALUES
2b30: 28 31 2c 20 32 2c 20 27 41 20 74 69 74 6c 65 27  (1, 2, 'A title'
2b40: 2c 20 27 41 20 64 6f 63 75 6d 65 6e 74 20 62 6f  , 'A document bo
2b50: 64 79 27 29 3b 0a 3c 2f 63 6f 64 65 62 6c 6f 63  dy');.</codebloc
2b60: 6b 3e 0a 0a 20 20 3c 70 3e 0a 20 20 20 20 54 6f  k>..  <p>.    To
2b70: 20 73 75 70 70 6f 72 74 20 66 75 6c 6c 2d 74 65   support full-te
2b80: 78 74 20 71 75 65 72 69 65 73 2c 20 46 54 53 20  xt queries, FTS 
2b90: 6d 61 69 6e 74 61 69 6e 73 20 61 6e 20 69 6e 76  maintains an inv
2ba0: 65 72 74 65 64 20 69 6e 64 65 78 20 74 68 61 74  erted index that
2bb0: 20 6d 61 70 73 0a 20 20 20 20 66 72 6f 6d 20 65   maps.    from e
2bc0: 61 63 68 20 75 6e 69 71 75 65 20 74 65 72 6d 20  ach unique term 
2bd0: 6f 72 20 77 6f 72 64 20 74 68 61 74 20 61 70 70  or word that app
2be0: 65 61 72 73 20 69 6e 20 74 68 65 20 64 61 74 61  ears in the data
2bf0: 73 65 74 20 74 6f 20 74 68 65 20 6c 6f 63 61 74  set to the locat
2c00: 69 6f 6e 73 0a 20 20 20 20 69 6e 20 77 68 69 63  ions.    in whic
2c10: 68 20 69 74 20 61 70 70 65 61 72 73 20 77 69 74  h it appears wit
2c20: 68 69 6e 20 74 68 65 20 74 61 62 6c 65 20 63 6f  hin the table co
2c30: 6e 74 65 6e 74 73 2e 20 46 6f 72 20 74 68 65 20  ntents. For the 
2c40: 63 75 72 69 6f 75 73 2c 20 61 20 0a 20 20 20 20  curious, a .    
2c50: 63 6f 6d 70 6c 65 74 65 20 64 65 73 63 72 69 70  complete descrip
2c60: 74 69 6f 6e 20 6f 66 20 74 68 65 20 5b 73 65 67  tion of the [seg
2c70: 6d 65 6e 74 20 62 74 72 65 65 7c 64 61 74 61 20  ment btree|data 
2c80: 73 74 72 75 63 74 75 72 65 5d 20 75 73 65 64 20  structure] used 
2c90: 74 6f 20 73 74 6f 72 65 0a 20 20 20 20 74 68 69  to store.    thi
2ca0: 73 20 69 6e 64 65 78 20 77 69 74 68 69 6e 20 74  s index within t
2cb0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2cc0: 20 61 70 70 65 61 72 73 20 62 65 6c 6f 77 2e 20   appears below. 
2cd0: 41 20 66 65 61 74 75 72 65 20 6f 66 0a 20 20 20  A feature of.   
2ce0: 20 74 68 69 73 20 64 61 74 61 20 73 74 72 75 63   this data struc
2cf0: 74 75 72 65 20 69 73 20 74 68 61 74 20 61 74 20  ture is that at 
2d00: 61 6e 79 20 74 69 6d 65 20 74 68 65 20 64 61 74  any time the dat
2d10: 61 62 61 73 65 20 6d 61 79 20 63 6f 6e 74 61 69  abase may contai
2d20: 6e 20 6e 6f 74 0a 20 20 20 20 6f 6e 65 20 69 6e  n not.    one in
2d30: 64 65 78 20 62 2d 74 72 65 65 2c 20 62 75 74 20  dex b-tree, but 
2d40: 73 65 76 65 72 61 6c 20 64 69 66 66 65 72 65 6e  several differen
2d50: 74 20 62 2d 74 72 65 65 73 20 74 68 61 74 20 61  t b-trees that a
2d60: 72 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 6c 79  re incrementally
2d70: 0a 20 20 20 20 6d 65 72 67 65 64 20 61 73 20 72  .    merged as r
2d80: 6f 77 73 20 61 72 65 20 69 6e 73 65 72 74 65 64  ows are inserted
2d90: 2c 20 75 70 64 61 74 65 64 20 61 6e 64 20 64 65  , updated and de
2da0: 6c 65 74 65 64 2e 20 54 68 69 73 20 74 65 63 68  leted. This tech
2db0: 6e 69 71 75 65 20 69 6d 70 72 6f 76 65 73 20 0a  nique improves .
2dc0: 20 20 20 20 70 65 72 66 6f 72 6d 61 6e 63 65 20      performance 
2dd0: 77 68 65 6e 20 77 72 69 74 69 6e 67 20 74 6f 20  when writing to 
2de0: 61 6e 20 46 54 53 20 74 61 62 6c 65 2c 20 62 75  an FTS table, bu
2df0: 74 20 63 61 75 73 65 73 20 73 6f 6d 65 20 6f 76  t causes some ov
2e00: 65 72 68 65 61 64 20 66 6f 72 0a 20 20 20 20 66  erhead for.    f
2e10: 75 6c 6c 2d 74 65 78 74 20 71 75 65 72 69 65 73  ull-text queries
2e20: 20 74 68 61 74 20 75 73 65 20 74 68 65 20 69 6e   that use the in
2e30: 64 65 78 2e 20 45 76 61 6c 75 61 74 69 6e 67 20  dex. Evaluating 
2e40: 74 68 65 20 73 70 65 63 69 61 6c 20 5b 22 6f 70  the special ["op
2e50: 74 69 6d 69 7a 65 22 20 63 6f 6d 6d 61 6e 64 5d  timize" command]
2e60: 2c 20 0a 20 20 20 20 61 6e 20 53 51 4c 20 73 74  , .    an SQL st
2e70: 61 74 65 6d 65 6e 74 20 6f 66 20 74 68 65 0a 20  atement of the. 
2e80: 20 20 20 66 6f 72 6d 20 22 49 4e 53 45 52 54 20     form "INSERT 
2e90: 49 4e 54 4f 20 26 6c 74 3b 66 74 73 2d 74 61 62  INTO &lt;fts-tab
2ea0: 6c 65 26 67 74 3b 28 26 6c 74 3b 66 74 73 2d 74  le&gt;(&lt;fts-t
2eb0: 61 62 6c 65 26 67 74 3b 29 20 56 41 4c 55 45 53  able&gt;) VALUES
2ec0: 28 27 6f 70 74 69 6d 69 7a 65 27 29 22 2c 0a 20  ('optimize')",. 
2ed0: 20 20 20 63 61 75 73 65 73 20 46 54 53 20 74 6f     causes FTS to
2ee0: 20 6d 65 72 67 65 20 61 6c 6c 20 65 78 69 73 74   merge all exist
2ef0: 69 6e 67 20 69 6e 64 65 78 20 62 2d 74 72 65 65  ing index b-tree
2f00: 73 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20  s into a single 
2f10: 6c 61 72 67 65 0a 20 20 20 20 62 2d 74 72 65 65  large.    b-tree
2f20: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
2f30: 65 6e 74 69 72 65 20 69 6e 64 65 78 2e 20 54 68  entire index. Th
2f40: 69 73 20 63 61 6e 20 62 65 20 61 6e 20 65 78 70  is can be an exp
2f50: 65 6e 73 69 76 65 20 6f 70 65 72 61 74 69 6f 6e  ensive operation
2f60: 2c 0a 20 20 20 20 62 75 74 20 6d 61 79 20 73 70  ,.    but may sp
2f70: 65 65 64 20 75 70 20 66 75 74 75 72 65 20 71 75  eed up future qu
2f80: 65 72 69 65 73 2e 20 0a 0a 20 20 3c 70 3e 0a 20  eries. ..  <p>. 
2f90: 20 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20     For example, 
2fa0: 74 6f 20 6f 70 74 69 6d 69 7a 65 20 74 68 65 20  to optimize the 
2fb0: 66 75 6c 6c 2d 74 65 78 74 20 69 6e 64 65 78 20  full-text index 
2fc0: 66 6f 72 20 61 6e 20 46 54 53 20 74 61 62 6c 65  for an FTS table
2fd0: 20 6e 61 6d 65 64 0a 20 20 20 20 22 64 6f 63 73   named.    "docs
2fe0: 22 3a 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a  ":..<codeblock>.
2ff0: 20 20 3c 69 3e 2d 2d 20 4f 70 74 69 6d 69 7a 65    <i>-- Optimize
3000: 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 74   the internal st
3010: 72 75 63 74 75 72 65 20 6f 66 20 46 54 53 20 74  ructure of FTS t
3020: 61 62 6c 65 20 22 64 6f 63 73 22 2e 3c 2f 69 3e  able "docs".</i>
3030: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 64  .  INSERT INTO d
3040: 6f 63 73 28 64 6f 63 73 29 20 56 41 4c 55 45 53  ocs(docs) VALUES
3050: 28 27 6f 70 74 69 6d 69 7a 65 27 29 3b 0a 3c 2f  ('optimize');.</
3060: 63 6f 64 65 62 6c 6f 63 6b 3e 0a 0a 20 20 3c 70  codeblock>..  <p
3070: 3e 0a 20 20 20 20 54 68 65 20 73 74 61 74 65 6d  >.    The statem
3080: 65 6e 74 20 61 62 6f 76 65 20 6d 61 79 20 61 70  ent above may ap
3090: 70 65 61 72 20 73 79 6e 74 61 63 74 69 63 61 6c  pear syntactical
30a0: 6c 79 20 69 6e 63 6f 72 72 65 63 74 20 74 6f 20  ly incorrect to 
30b0: 73 6f 6d 65 2e 20 52 65 66 65 72 20 74 6f 0a 20  some. Refer to. 
30c0: 20 20 20 74 68 65 20 73 65 63 74 69 6f 6e 20 64     the section d
30d0: 65 73 63 72 69 62 69 6e 67 20 74 68 65 20 5b 73  escribing the [s
30e0: 69 6d 70 6c 65 20 66 74 73 20 71 75 65 72 69 65  imple fts querie
30f0: 73 5d 20 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e  s] for an explan
3100: 61 74 69 6f 6e 2e 0a 0a 20 20 3c 70 3e 0a 20 20  ation...  <p>.  
3110: 20 20 54 68 65 72 65 20 69 73 20 61 6e 6f 74 68    There is anoth
3120: 65 72 2c 20 64 65 70 72 65 63 61 74 65 64 2c 20  er, deprecated, 
3130: 6d 65 74 68 6f 64 20 66 6f 72 20 69 6e 76 6f 6b  method for invok
3140: 69 6e 67 20 74 68 65 20 6f 70 74 69 6d 69 7a 65  ing the optimize
3150: 20 0a 20 20 20 20 6f 70 65 72 61 74 69 6f 6e 20   .    operation 
3160: 75 73 69 6e 67 20 61 20 53 45 4c 45 43 54 20 73  using a SELECT s
3170: 74 61 74 65 6d 65 6e 74 2e 20 4e 65 77 20 63 6f  tatement. New co
3180: 64 65 20 73 68 6f 75 6c 64 20 75 73 65 20 73 74  de should use st
3190: 61 74 65 6d 65 6e 74 73 0a 20 20 20 20 73 69 6d  atements.    sim
31a0: 69 6c 61 72 20 74 6f 20 74 68 65 20 49 4e 53 45  ilar to the INSE
31b0: 52 54 20 61 62 6f 76 65 20 74 6f 20 6f 70 74 69  RT above to opti
31c0: 6d 69 7a 65 20 46 54 53 20 73 74 72 75 63 74 75  mize FTS structu
31d0: 72 65 73 2e 0a 0a 3c 68 32 20 74 61 67 73 3d 22  res...<h2 tags="
31e0: 73 69 6d 70 6c 65 20 66 74 73 20 71 75 65 72 69  simple fts queri
31f0: 65 73 22 3e 53 69 6d 70 6c 65 20 46 54 53 20 51  es">Simple FTS Q
3200: 75 65 72 69 65 73 3c 2f 68 32 3e 0a 0a 3c 70 3e  ueries</h2>..<p>
3210: 0a 20 20 41 73 20 66 6f 72 20 61 6c 6c 20 6f 74  .  As for all ot
3220: 68 65 72 20 53 51 4c 69 74 65 20 74 61 62 6c 65  her SQLite table
3230: 73 2c 20 76 69 72 74 75 61 6c 20 6f 72 20 6f 74  s, virtual or ot
3240: 68 65 72 77 69 73 65 2c 20 64 61 74 61 20 69 73  herwise, data is
3250: 20 72 65 74 72 69 65 76 65 64 0a 20 20 66 72 6f   retrieved.  fro
3260: 6d 20 46 54 53 20 74 61 62 6c 65 73 20 75 73 69  m FTS tables usi
3270: 6e 67 20 61 20 5b 53 45 4c 45 43 54 5d 20 73 74  ng a [SELECT] st
3280: 61 74 65 6d 65 6e 74 2e 0a 0a 3c 70 3e 0a 20 20  atement...<p>.  
3290: 46 54 53 20 74 61 62 6c 65 73 20 63 61 6e 20 62  FTS tables can b
32a0: 65 20 71 75 65 72 69 65 64 20 65 66 66 69 63 69  e queried effici
32b0: 65 6e 74 6c 79 20 75 73 69 6e 67 20 53 45 4c 45  ently using SELE
32c0: 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 66  CT statements of
32d0: 20 74 77 6f 0a 20 20 64 69 66 66 65 72 65 6e 74   two.  different
32e0: 20 66 6f 72 6d 73 3a 0a 0a 3c 75 6c 3e 0a 20 20   forms:..<ul>.  
32f0: 3c 6c 69 3e 3c 70 3e 0a 20 20 20 20 3c 62 3e 51  <li><p>.    <b>Q
3300: 75 65 72 79 20 62 79 20 72 6f 77 69 64 3c 2f 62  uery by rowid</b
3310: 3e 2e 20 49 66 20 74 68 65 20 57 48 45 52 45 20  >. If the WHERE 
3320: 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 53 45  clause of the SE
3330: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 20  LECT statement. 
3340: 20 20 20 63 6f 6e 74 61 69 6e 73 20 61 20 73 75     contains a su
3350: 62 2d 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  b-clause of the 
3360: 66 6f 72 6d 20 22 72 6f 77 69 64 20 3d 20 3f 22  form "rowid = ?"
3370: 2c 20 77 68 65 72 65 20 3f 20 69 73 20 61 6e 20  , where ? is an 
3380: 53 51 4c 20 65 78 70 72 65 73 73 69 6f 6e 2c 0a  SQL expression,.
3390: 20 20 20 20 46 54 53 20 69 73 20 61 62 6c 65 20      FTS is able 
33a0: 74 6f 20 72 65 74 72 69 65 76 65 20 74 68 65 20  to retrieve the 
33b0: 72 65 71 75 65 73 74 65 64 20 72 6f 77 20 64 69  requested row di
33c0: 72 65 63 74 6c 79 20 75 73 69 6e 67 20 74 68 65  rectly using the
33d0: 20 65 71 75 69 76 61 6c 65 6e 74 20 0a 20 20 20   equivalent .   
33e0: 20 6f 66 20 61 6e 20 53 51 4c 69 74 65 20 5b 49   of an SQLite [I
33f0: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
3400: 45 59 5d 20 69 6e 64 65 78 2e 0a 0a 20 20 3c 6c  EY] index...  <l
3410: 69 3e 3c 70 3e 0a 20 20 20 20 3c 62 3e 46 75 6c  i><p>.    <b>Ful
3420: 6c 2d 74 65 78 74 20 71 75 65 72 79 3c 2f 62 3e  l-text query</b>
3430: 2e 20 49 66 20 74 68 65 20 57 48 45 52 45 20 63  . If the WHERE c
3440: 6c 61 75 73 65 20 6f 66 20 74 68 65 20 53 45 4c  lause of the SEL
3450: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 63 6f  ECT statement co
3460: 6e 74 61 69 6e 73 0a 20 20 20 20 61 20 73 75 62  ntains.    a sub
3470: 2d 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 66  -clause of the f
3480: 6f 72 6d 20 22 26 6c 74 3b 63 6f 6c 75 6d 6e 26  orm "&lt;column&
3490: 67 74 3b 20 4d 41 54 43 48 20 3f 22 2c 20 46 54  gt; MATCH ?", FT
34a0: 53 20 69 73 20 61 62 6c 65 20 74 6f 20 75 73 65  S is able to use
34b0: 20 0a 20 20 20 20 74 68 65 20 62 75 69 6c 74 2d   .    the built-
34c0: 69 6e 20 66 75 6c 6c 2d 74 65 78 74 20 69 6e 64  in full-text ind
34d0: 65 78 20 74 6f 20 72 65 73 74 72 69 63 74 20 74  ex to restrict t
34e0: 68 65 20 73 65 61 72 63 68 20 74 6f 20 74 68 6f  he search to tho
34f0: 73 65 20 64 6f 63 75 6d 65 6e 74 73 20 0a 20 20  se documents .  
3500: 20 20 74 68 61 74 20 6d 61 74 63 68 20 74 68 65    that match the
3510: 20 66 75 6c 6c 2d 74 65 78 74 20 71 75 65 72 79   full-text query
3520: 20 73 74 72 69 6e 67 20 73 70 65 63 69 66 69 65   string specifie
3530: 64 20 61 73 20 74 68 65 20 72 69 67 68 74 2d 68  d as the right-h
3540: 61 6e 64 20 6f 70 65 72 61 6e 64 0a 20 20 20 20  and operand.    
3550: 6f 66 20 74 68 65 20 4d 41 54 43 48 20 63 6c 61  of the MATCH cla
3560: 75 73 65 2e 0a 3c 2f 75 6c 3e 0a 0a 3c 70 3e 0a  use..</ul>..<p>.
3570: 20 20 49 66 20 6e 65 69 74 68 65 72 20 6f 66 20    If neither of 
3580: 74 68 65 73 65 20 74 77 6f 20 71 75 65 72 79 20  these two query 
3590: 73 74 72 61 74 65 67 69 65 73 20 63 61 6e 20 62  strategies can b
35a0: 65 20 75 73 65 64 2c 20 61 6c 6c 0a 20 20 71 75  e used, all.  qu
35b0: 65 72 69 65 73 20 6f 6e 20 46 54 53 20 74 61 62  eries on FTS tab
35c0: 6c 65 73 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e  les are implemen
35d0: 74 65 64 20 75 73 69 6e 67 20 61 20 6c 69 6e 65  ted using a line
35e0: 61 72 20 73 63 61 6e 20 6f 66 20 74 68 65 20 65  ar scan of the e
35f0: 6e 74 69 72 65 0a 20 20 74 61 62 6c 65 2e 20 49  ntire.  table. I
3600: 66 20 74 68 65 20 74 61 62 6c 65 20 63 6f 6e 74  f the table cont
3610: 61 69 6e 73 20 6c 61 72 67 65 20 61 6d 6f 75 6e  ains large amoun
3620: 74 73 20 6f 66 20 64 61 74 61 2c 20 74 68 69 73  ts of data, this
3630: 20 6d 61 79 20 62 65 20 61 6e 20 0a 20 20 69 6d   may be an .  im
3640: 70 72 61 63 74 69 63 61 6c 20 61 70 70 72 6f 61  practical approa
3650: 63 68 20 28 74 68 65 20 66 69 72 73 74 20 65 78  ch (the first ex
3660: 61 6d 70 6c 65 20 6f 6e 20 74 68 69 73 20 70 61  ample on this pa
3670: 67 65 20 73 68 6f 77 73 20 74 68 61 74 20 61 20  ge shows that a 
3680: 6c 69 6e 65 61 72 0a 20 20 73 63 61 6e 20 6f 66  linear.  scan of
3690: 20 31 2e 35 20 47 42 20 6f 66 20 64 61 74 61 20   1.5 GB of data 
36a0: 74 61 6b 65 73 20 61 72 6f 75 6e 64 20 33 30 20  takes around 30 
36b0: 73 65 63 6f 6e 64 73 20 75 73 69 6e 67 20 61 20  seconds using a 
36c0: 6d 6f 64 65 72 6e 20 50 43 29 2e 0a 0a 3c 63 6f  modern PC)...<co
36d0: 64 65 62 6c 6f 63 6b 3e 0a 20 20 3c 69 3e 2d 2d  deblock>.  <i>--
36e0: 20 54 68 65 20 65 78 61 6d 70 6c 65 73 20 69 6e   The examples in
36f0: 20 74 68 69 73 20 62 6c 6f 63 6b 20 61 73 73 75   this block assu
3700: 6d 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  me the following
3710: 20 46 54 53 20 74 61 62 6c 65 3a 3c 2f 69 3e 0a   FTS table:</i>.
3720: 20 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c    CREATE VIRTUAL
3730: 20 54 41 42 4c 45 20 6d 61 69 6c 20 55 53 49 4e   TABLE mail USIN
3740: 47 20 66 74 73 33 28 73 75 62 6a 65 63 74 2c 20  G fts3(subject, 
3750: 62 6f 64 79 29 3b 0a 0a 20 20 53 45 4c 45 43 54  body);..  SELECT
3760: 20 2a 20 46 52 4f 4d 20 6d 61 69 6c 20 57 48 45   * FROM mail WHE
3770: 52 45 20 72 6f 77 69 64 20 3d 20 31 35 3b 20 20  RE rowid = 15;  
3780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3c 69                <i
3790: 3e 2d 2d 20 46 61 73 74 2e 20 52 6f 77 69 64 20  >-- Fast. Rowid 
37a0: 6c 6f 6f 6b 75 70 2e 3c 2f 69 3e 0a 20 20 53 45  lookup.</i>.  SE
37b0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6d 61 69 6c  LECT * FROM mail
37c0: 20 57 48 45 52 45 20 62 6f 64 79 20 4d 41 54 43   WHERE body MATC
37d0: 48 20 27 73 71 6c 69 74 65 27 3b 20 20 20 20 20  H 'sqlite';     
37e0: 20 20 3c 69 3e 2d 2d 20 46 61 73 74 2e 20 46 75    <i>-- Fast. Fu
37f0: 6c 6c 2d 74 65 78 74 20 71 75 65 72 79 2e 3c 2f  ll-text query.</
3800: 69 3e 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52  i>.  SELECT * FR
3810: 4f 4d 20 6d 61 69 6c 20 57 48 45 52 45 20 6d 61  OM mail WHERE ma
3820: 69 6c 20 4d 41 54 43 48 20 27 73 65 61 72 63 68  il MATCH 'search
3830: 27 3b 20 20 20 20 20 20 20 3c 69 3e 2d 2d 20 46  ';       <i>-- F
3840: 61 73 74 2e 20 46 75 6c 6c 2d 74 65 78 74 20 71  ast. Full-text q
3850: 75 65 72 79 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45  uery.</i>.  SELE
3860: 43 54 20 2a 20 46 52 4f 4d 20 6d 61 69 6c 20 57  CT * FROM mail W
3870: 48 45 52 45 20 72 6f 77 69 64 20 42 45 54 57 45  HERE rowid BETWE
3880: 45 4e 20 31 35 20 41 4e 44 20 32 30 3b 20 20 20  EN 15 AND 20;   
3890: 3c 69 3e 2d 2d 20 53 6c 6f 77 2e 20 4c 69 6e 65  <i>-- Slow. Line
38a0: 61 72 20 73 63 61 6e 2e 3c 2f 69 3e 0a 20 20 53  ar scan.</i>.  S
38b0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6d 61 69  ELECT * FROM mai
38c0: 6c 20 57 48 45 52 45 20 73 75 62 6a 65 63 74 20  l WHERE subject 
38d0: 3d 20 27 64 61 74 61 62 61 73 65 27 3b 20 20 20  = 'database';   
38e0: 20 20 20 3c 69 3e 2d 2d 20 53 6c 6f 77 2e 20 4c     <i>-- Slow. L
38f0: 69 6e 65 61 72 20 73 63 61 6e 2e 3c 2f 69 3e 0a  inear scan.</i>.
3900: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
3910: 6d 61 69 6c 20 57 48 45 52 45 20 73 75 62 6a 65  mail WHERE subje
3920: 63 74 20 4d 41 54 43 48 20 27 64 61 74 61 62 61  ct MATCH 'databa
3930: 73 65 27 3b 20 20 3c 69 3e 2d 2d 20 46 61 73 74  se';  <i>-- Fast
3940: 2e 20 46 75 6c 6c 2d 74 65 78 74 20 71 75 65 72  . Full-text quer
3950: 79 2e 3c 2f 69 3e 0a 3c 2f 63 6f 64 65 62 6c 6f  y.</i>.</codeblo
3960: 63 6b 3e 0a 0a 3c 70 3e 0a 20 20 49 6e 20 61 6c  ck>..<p>.  In al
3970: 6c 20 6f 66 20 74 68 65 20 66 75 6c 6c 2d 74 65  l of the full-te
3980: 78 74 20 71 75 65 72 69 65 73 20 61 62 6f 76 65  xt queries above
3990: 2c 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64  , the right-hand
39a0: 20 6f 70 65 72 61 6e 64 20 6f 66 20 74 68 65 20   operand of the 
39b0: 4d 41 54 43 48 0a 20 20 6f 70 65 72 61 74 6f 72  MATCH.  operator
39c0: 20 69 73 20 61 20 73 74 72 69 6e 67 20 63 6f 6e   is a string con
39d0: 73 69 73 74 69 6e 67 20 6f 66 20 61 20 73 69 6e  sisting of a sin
39e0: 67 6c 65 20 74 65 72 6d 2e 20 49 6e 20 74 68 69  gle term. In thi
39f0: 73 20 63 61 73 65 2c 20 74 68 65 20 4d 41 54 43  s case, the MATC
3a00: 48 0a 20 20 65 78 70 72 65 73 73 69 6f 6e 20 65  H.  expression e
3a10: 76 61 6c 75 61 74 65 73 20 74 6f 20 74 72 75 65  valuates to true
3a20: 20 66 6f 72 20 61 6c 6c 20 64 6f 63 75 6d 65 6e   for all documen
3a30: 74 73 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 20  ts that contain 
3a40: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 0a 20 20 69  one or more .  i
3a50: 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68 65 20  nstances of the 
3a60: 73 70 65 63 69 66 69 65 64 20 77 6f 72 64 20 28  specified word (
3a70: 22 73 71 6c 69 74 65 22 2c 20 22 73 65 61 72 63  "sqlite", "searc
3a80: 68 22 20 6f 72 20 22 64 61 74 61 62 61 73 65 22  h" or "database"
3a90: 2c 20 64 65 70 65 6e 64 69 6e 67 20 0a 20 20 6f  , depending .  o
3aa0: 6e 20 77 68 69 63 68 20 65 78 61 6d 70 6c 65 20  n which example 
3ab0: 79 6f 75 20 6c 6f 6f 6b 20 61 74 29 2e 20 53 70  you look at). Sp
3ac0: 65 63 69 66 79 69 6e 67 20 61 20 73 69 6e 67 6c  ecifying a singl
3ad0: 65 20 74 65 72 6d 20 61 73 20 74 68 65 20 72 69  e term as the ri
3ae0: 67 68 74 2d 68 61 6e 64 0a 20 20 6f 70 65 72 61  ght-hand.  opera
3af0: 6e 64 20 6f 66 20 74 68 65 20 4d 41 54 43 48 20  nd of the MATCH 
3b00: 6f 70 65 72 61 74 6f 72 20 72 65 73 75 6c 74 73  operator results
3b10: 20 69 6e 20 74 68 65 20 73 69 6d 70 6c 65 73 74   in the simplest
3b20: 20 61 6e 64 20 6d 6f 73 74 20 63 6f 6d 6d 6f 6e   and most common
3b30: 20 74 79 70 65 20 0a 20 20 6f 66 20 66 75 6c 6c   type .  of full
3b40: 2d 74 65 78 74 20 71 75 65 72 79 20 70 6f 73 73  -text query poss
3b50: 69 62 6c 65 2e 20 48 6f 77 65 76 65 72 20 6d 6f  ible. However mo
3b60: 72 65 20 63 6f 6d 70 6c 69 63 61 74 65 64 20 71  re complicated q
3b70: 75 65 72 69 65 73 20 61 72 65 20 70 6f 73 73 69  ueries are possi
3b80: 62 6c 65 2c 0a 20 20 69 6e 63 6c 75 64 69 6e 67  ble,.  including
3b90: 20 70 68 72 61 73 65 20 73 65 61 72 63 68 65 73   phrase searches
3ba0: 2c 20 74 65 72 6d 2d 70 72 65 66 69 78 20 73 65  , term-prefix se
3bb0: 61 72 63 68 65 73 20 61 6e 64 20 73 65 61 72 63  arches and searc
3bc0: 68 65 73 20 66 6f 72 20 64 6f 63 75 6d 65 6e 74  hes for document
3bd0: 73 20 0a 20 20 63 6f 6e 74 61 69 6e 69 6e 67 20  s .  containing 
3be0: 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66 20  combinations of 
3bf0: 74 65 72 6d 73 20 6f 63 63 75 72 72 69 6e 67 20  terms occurring 
3c00: 77 69 74 68 69 6e 20 61 20 64 65 66 69 6e 65 64  within a defined
3c10: 20 70 72 6f 78 69 6d 69 74 79 20 6f 66 20 65 61   proximity of ea
3c20: 63 68 0a 20 20 6f 74 68 65 72 2e 20 54 68 65 20  ch.  other. The 
3c30: 76 61 72 69 6f 75 73 20 77 61 79 73 20 69 6e 20  various ways in 
3c40: 77 68 69 63 68 20 74 68 65 20 66 75 6c 6c 2d 74  which the full-t
3c50: 65 78 74 20 69 6e 64 65 78 20 6d 61 79 20 62 65  ext index may be
3c60: 20 71 75 65 72 69 65 64 20 61 72 65 0a 20 20 5b   queried are.  [
3c70: 46 54 53 20 4d 41 54 43 48 7c 64 65 73 63 72 69  FTS MATCH|descri
3c80: 62 65 64 20 62 65 6c 6f 77 5d 2e 0a 0a 3c 70 3e  bed below]...<p>
3c90: 0a 20 20 4e 6f 72 6d 61 6c 6c 79 2c 20 66 75 6c  .  Normally, ful
3ca0: 6c 2d 74 65 78 74 20 71 75 65 72 69 65 73 20 61  l-text queries a
3cb0: 72 65 20 63 61 73 65 2d 69 6e 73 65 6e 73 69 74  re case-insensit
3cc0: 69 76 65 2e 20 48 6f 77 65 76 65 72 2c 20 74 68  ive. However, th
3cd0: 69 73 0a 20 20 69 73 20 64 65 70 65 6e 64 65 6e  is.  is dependen
3ce0: 74 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69  t on the specifi
3cf0: 63 20 5b 74 6f 6b 65 6e 69 7a 65 72 5d 20 75 73  c [tokenizer] us
3d00: 65 64 20 62 79 20 74 68 65 20 46 54 53 20 74 61  ed by the FTS ta
3d10: 62 6c 65 0a 20 20 62 65 69 6e 67 20 71 75 65 72  ble.  being quer
3d20: 69 65 64 2e 20 52 65 66 65 72 20 74 6f 20 74 68  ied. Refer to th
3d30: 65 20 73 65 63 74 69 6f 6e 20 6f 6e 20 5b 74 6f  e section on [to
3d40: 6b 65 6e 69 7a 65 72 7c 74 6f 6b 65 6e 69 7a 65  kenizer|tokenize
3d50: 72 73 5d 20 66 6f 72 20 64 65 74 61 69 6c 73 2e  rs] for details.
3d60: 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 70 61 72 61  ..<p>.  The para
3d70: 67 72 61 70 68 20 61 62 6f 76 65 20 6e 6f 74 65  graph above note
3d80: 73 20 74 68 61 74 20 61 20 4d 41 54 43 48 20 6f  s that a MATCH o
3d90: 70 65 72 61 74 6f 72 20 77 69 74 68 20 61 20 73  perator with a s
3da0: 69 6d 70 6c 65 20 74 65 72 6d 20 61 73 20 74 68  imple term as th
3db0: 65 0a 20 20 72 69 67 68 74 2d 68 61 6e 64 20 6f  e.  right-hand o
3dc0: 70 65 72 61 6e 64 20 65 76 61 6c 75 61 74 65 73  perand evaluates
3dd0: 20 74 6f 20 74 72 75 65 20 66 6f 72 20 61 6c 6c   to true for all
3de0: 20 64 6f 63 75 6d 65 6e 74 73 20 74 68 61 74 20   documents that 
3df0: 63 6f 6e 74 61 69 6e 20 74 68 65 0a 20 20 73 70  contain the.  sp
3e00: 65 63 69 66 69 65 64 20 74 65 72 6d 2e 20 49 6e  ecified term. In
3e10: 20 74 68 69 73 20 63 6f 6e 74 65 78 74 2c 20 74   this context, t
3e20: 68 65 20 22 64 6f 63 75 6d 65 6e 74 22 20 6d 61  he "document" ma
3e30: 79 20 72 65 66 65 72 20 74 6f 20 65 69 74 68 65  y refer to eithe
3e40: 72 20 74 68 65 20 0a 20 20 64 61 74 61 20 73 74  r the .  data st
3e50: 6f 72 65 64 20 69 6e 20 61 20 73 69 6e 67 6c 65  ored in a single
3e60: 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20 72 6f 77   column of a row
3e70: 20 6f 66 20 61 6e 20 46 54 53 20 74 61 62 6c 65   of an FTS table
3e80: 2c 20 6f 72 20 74 6f 20 74 68 65 20 63 6f 6e 74  , or to the cont
3e90: 65 6e 74 73 0a 20 20 6f 66 20 61 6c 6c 20 63 6f  ents.  of all co
3ea0: 6c 75 6d 6e 73 20 69 6e 20 61 20 73 69 6e 67 6c  lumns in a singl
3eb0: 65 20 72 6f 77 2c 20 64 65 70 65 6e 64 69 6e 67  e row, depending
3ec0: 20 6f 6e 20 74 68 65 20 69 64 65 6e 74 69 66 69   on the identifi
3ed0: 65 72 20 75 73 65 64 20 61 73 20 74 68 65 0a 20  er used as the. 
3ee0: 20 6c 65 66 74 2d 68 61 6e 64 20 6f 70 65 72 61   left-hand opera
3ef0: 6e 64 20 74 6f 20 74 68 65 20 4d 41 54 43 48 20  nd to the MATCH 
3f00: 6f 70 65 72 61 74 6f 72 2e 20 49 66 20 74 68 65  operator. If the
3f10: 20 69 64 65 6e 74 69 66 69 65 72 20 73 70 65 63   identifier spec
3f20: 69 66 69 65 64 20 61 73 0a 20 20 74 68 65 20 6c  ified as.  the l
3f30: 65 66 74 2d 68 61 6e 64 20 6f 70 65 72 61 6e 64  eft-hand operand
3f40: 20 6f 66 20 74 68 65 20 4d 41 54 43 48 20 6f 70   of the MATCH op
3f50: 65 72 61 74 6f 72 20 69 73 20 61 6e 20 46 54 53  erator is an FTS
3f60: 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 6e 61   table column na
3f70: 6d 65 2c 0a 20 20 74 68 65 6e 20 74 68 65 20 64  me,.  then the d
3f80: 6f 63 75 6d 65 6e 74 20 74 68 61 74 20 74 68 65  ocument that the
3f90: 20 73 65 61 72 63 68 20 74 65 72 6d 20 6d 75 73   search term mus
3fa0: 74 20 62 65 20 63 6f 6e 74 61 69 6e 65 64 20 69  t be contained i
3fb0: 6e 20 69 73 20 74 68 65 20 76 61 6c 75 65 0a 20  n is the value. 
3fc0: 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 73   stored in the s
3fd0: 70 65 63 69 66 69 65 64 20 63 6f 6c 75 6d 6e 2e  pecified column.
3fe0: 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65   However, if the
3ff0: 20 69 64 65 6e 74 69 66 69 65 72 20 69 73 20 74   identifier is t
4000: 68 65 20 6e 61 6d 65 0a 20 20 6f 66 20 74 68 65  he name.  of the
4010: 20 46 54 53 20 3c 69 3e 74 61 62 6c 65 3c 2f 69   FTS <i>table</i
4020: 3e 20 69 74 73 65 6c 66 2c 20 74 68 65 6e 20 74  > itself, then t
4030: 68 65 20 4d 41 54 43 48 20 6f 70 65 72 61 74 6f  he MATCH operato
4040: 72 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 74  r evaluates to t
4050: 72 75 65 0a 20 20 66 6f 72 20 65 61 63 68 20 72  rue.  for each r
4060: 6f 77 20 6f 66 20 74 68 65 20 46 54 53 20 74 61  ow of the FTS ta
4070: 62 6c 65 20 66 6f 72 20 77 68 69 63 68 20 61 6e  ble for which an
4080: 79 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e  y column contain
4090: 73 20 74 68 65 20 73 65 61 72 63 68 20 0a 20 20  s the search .  
40a0: 74 65 72 6d 2e 20 54 68 65 20 66 6f 6c 6c 6f 77  term. The follow
40b0: 69 6e 67 20 65 78 61 6d 70 6c 65 20 64 65 6d 6f  ing example demo
40c0: 6e 73 74 72 61 74 65 73 20 74 68 69 73 3a 0a 0a  nstrates this:..
40d0: 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20 20 3c 69  <codeblock>.  <i
40e0: 3e 2d 2d 20 45 78 61 6d 70 6c 65 20 73 63 68 65  >-- Example sche
40f0: 6d 61 3c 2f 69 3e 0a 20 20 43 52 45 41 54 45 20  ma</i>.  CREATE 
4100: 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 6d 61  VIRTUAL TABLE ma
4110: 69 6c 20 55 53 49 4e 47 20 66 74 73 33 28 73 75  il USING fts3(su
4120: 62 6a 65 63 74 2c 20 62 6f 64 79 29 3b 0a 0a 20  bject, body);.. 
4130: 20 3c 69 3e 2d 2d 20 45 78 61 6d 70 6c 65 20 74   <i>-- Example t
4140: 61 62 6c 65 20 70 6f 70 75 6c 61 74 69 6f 6e 3c  able population<
4150: 2f 69 3e 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  /i>.  INSERT INT
4160: 4f 20 6d 61 69 6c 28 64 6f 63 69 64 2c 20 73 75  O mail(docid, su
4170: 62 6a 65 63 74 2c 20 62 6f 64 79 29 20 56 41 4c  bject, body) VAL
4180: 55 45 53 28 31 2c 20 27 73 6f 66 74 77 61 72 65  UES(1, 'software
4190: 20 66 65 65 64 62 61 63 6b 27 2c 20 27 66 6f 75   feedback', 'fou
41a0: 6e 64 20 69 74 20 74 6f 6f 20 73 6c 6f 77 27 29  nd it too slow')
41b0: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
41c0: 6d 61 69 6c 28 64 6f 63 69 64 2c 20 73 75 62 6a  mail(docid, subj
41d0: 65 63 74 2c 20 62 6f 64 79 29 20 56 41 4c 55 45  ect, body) VALUE
41e0: 53 28 32 2c 20 27 73 6f 66 74 77 61 72 65 20 66  S(2, 'software f
41f0: 65 65 64 62 61 63 6b 27 2c 20 27 6e 6f 20 66 65  eedback', 'no fe
4200: 65 64 62 61 63 6b 27 29 3b 0a 20 20 49 4e 53 45  edback');.  INSE
4210: 52 54 20 49 4e 54 4f 20 6d 61 69 6c 28 64 6f 63  RT INTO mail(doc
4220: 69 64 2c 20 73 75 62 6a 65 63 74 2c 20 62 6f 64  id, subject, bod
4230: 79 29 20 56 41 4c 55 45 53 28 33 2c 20 27 73 6c  y) VALUES(3, 'sl
4240: 6f 77 20 6c 75 6e 63 68 20 6f 72 64 65 72 27 2c  ow lunch order',
4250: 20 20 27 77 61 73 20 61 20 73 6f 66 74 77 61 72    'was a softwar
4260: 65 20 70 72 6f 62 6c 65 6d 27 29 3b 0a 0a 20 20  e problem');..  
4270: 3c 69 3e 2d 2d 20 45 78 61 6d 70 6c 65 20 71 75  <i>-- Example qu
4280: 65 72 69 65 73 3c 2f 69 3e 0a 20 20 53 45 4c 45  eries</i>.  SELE
4290: 43 54 20 2a 20 46 52 4f 4d 20 6d 61 69 6c 20 57  CT * FROM mail W
42a0: 48 45 52 45 20 73 75 62 6a 65 63 74 20 4d 41 54  HERE subject MAT
42b0: 43 48 20 27 73 6f 66 74 77 61 72 65 27 3b 20 20  CH 'software';  
42c0: 20 20 3c 69 3e 2d 2d 20 53 65 6c 65 63 74 73 20    <i>-- Selects 
42d0: 72 6f 77 73 20 31 20 61 6e 64 20 32 3c 2f 69 3e  rows 1 and 2</i>
42e0: 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  .  SELECT * FROM
42f0: 20 6d 61 69 6c 20 57 48 45 52 45 20 62 6f 64 79   mail WHERE body
4300: 20 20 20 20 4d 41 54 43 48 20 27 66 65 65 64 62      MATCH 'feedb
4310: 61 63 6b 27 3b 20 20 20 20 3c 69 3e 2d 2d 20 53  ack';    <i>-- S
4320: 65 6c 65 63 74 73 20 72 6f 77 20 32 3c 2f 69 3e  elects row 2</i>
4330: 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  .  SELECT * FROM
4340: 20 6d 61 69 6c 20 57 48 45 52 45 20 6d 61 69 6c   mail WHERE mail
4350: 20 20 20 20 4d 41 54 43 48 20 27 73 6f 66 74 77      MATCH 'softw
4360: 61 72 65 27 3b 20 20 20 20 3c 69 3e 2d 2d 20 53  are';    <i>-- S
4370: 65 6c 65 63 74 73 20 72 6f 77 73 20 31 2c 20 32  elects rows 1, 2
4380: 20 61 6e 64 20 33 3c 2f 69 3e 0a 20 20 53 45 4c   and 3</i>.  SEL
4390: 45 43 54 20 2a 20 46 52 4f 4d 20 6d 61 69 6c 20  ECT * FROM mail 
43a0: 57 48 45 52 45 20 6d 61 69 6c 20 20 20 20 4d 41  WHERE mail    MA
43b0: 54 43 48 20 27 73 6c 6f 77 27 3b 20 20 20 20 20  TCH 'slow';     
43c0: 20 20 20 3c 69 3e 2d 2d 20 53 65 6c 65 63 74 73     <i>-- Selects
43d0: 20 72 6f 77 73 20 31 20 61 6e 64 20 33 3c 2f 69   rows 1 and 3</i
43e0: 3e 0a 3c 2f 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20  >.</codeblock>. 
43f0: 20 0a 3c 70 3e 0a 20 20 41 74 20 66 69 72 73 74   .<p>.  At first
4400: 20 67 6c 61 6e 63 65 2c 20 74 68 65 20 66 69 6e   glance, the fin
4410: 61 6c 20 74 77 6f 20 66 75 6c 6c 2d 74 65 78 74  al two full-text
4420: 20 71 75 65 72 69 65 73 20 69 6e 20 74 68 65 20   queries in the 
4430: 65 78 61 6d 70 6c 65 20 61 62 6f 76 65 20 73 65  example above se
4440: 65 6d 0a 20 20 74 6f 20 62 65 20 73 79 6e 74 61  em.  to be synta
4450: 63 74 69 63 61 6c 6c 79 20 69 6e 63 6f 72 72 65  ctically incorre
4460: 63 74 2c 20 61 73 20 74 68 65 72 65 20 69 73 20  ct, as there is 
4470: 61 20 74 61 62 6c 65 20 6e 61 6d 65 20 28 22 6d  a table name ("m
4480: 61 69 6c 22 29 20 75 73 65 64 20 61 73 0a 20 20  ail") used as.  
4490: 61 6e 20 53 51 4c 20 65 78 70 72 65 73 73 69 6f  an SQL expressio
44a0: 6e 2e 20 54 68 65 20 72 65 61 73 6f 6e 20 74 68  n. The reason th
44b0: 69 73 20 69 73 20 61 63 63 65 70 74 61 62 6c 65  is is acceptable
44c0: 20 69 73 20 74 68 61 74 20 65 61 63 68 20 46 54   is that each FT
44d0: 53 20 74 61 62 6c 65 0a 20 20 61 63 74 75 61 6c  S table.  actual
44e0: 6c 79 20 68 61 73 20 61 20 5b 73 71 6c 69 74 65  ly has a [sqlite
44f0: 33 5f 64 65 63 6c 61 72 65 5f 76 74 61 62 7c 48  3_declare_vtab|H
4500: 49 44 44 45 4e 5d 20 63 6f 6c 75 6d 6e 20 77 69  IDDEN] column wi
4510: 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65  th the same name
4520: 0a 20 20 61 73 20 74 68 65 20 74 61 62 6c 65 20  .  as the table 
4530: 69 74 73 65 6c 66 20 28 69 6e 20 74 68 69 73 20  itself (in this 
4540: 63 61 73 65 2c 20 22 6d 61 69 6c 22 29 2e 20 54  case, "mail"). T
4550: 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20  he value stored 
4560: 69 6e 20 74 68 69 73 0a 20 20 63 6f 6c 75 6d 6e  in this.  column
4570: 20 69 73 20 6e 6f 74 20 6d 65 61 6e 69 6e 67 66   is not meaningf
4580: 75 6c 20 74 6f 20 74 68 65 20 61 70 70 6c 69 63  ul to the applic
4590: 61 74 69 6f 6e 2c 20 62 75 74 20 63 61 6e 20 62  ation, but can b
45a0: 65 20 75 73 65 64 20 61 73 20 74 68 65 20 0a 20  e used as the . 
45b0: 20 6c 65 66 74 2d 68 61 6e 64 20 6f 70 65 72 61   left-hand opera
45c0: 6e 64 20 74 6f 20 61 20 4d 41 54 43 48 20 6f 70  nd to a MATCH op
45d0: 65 72 61 74 6f 72 2e 20 54 68 69 73 20 73 70 65  erator. This spe
45e0: 63 69 61 6c 20 63 6f 6c 75 6d 6e 20 6d 61 79 20  cial column may 
45f0: 61 6c 73 6f 20 62 65 0a 20 20 70 61 73 73 65 64  also be.  passed
4600: 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20   as an argument 
4610: 74 6f 20 74 68 65 20 5b 73 6e 69 70 70 65 74 28  to the [snippet(
4620: 29 7c 46 54 53 20 61 75 78 69 6c 69 61 72 79 20  )|FTS auxiliary 
4630: 66 75 6e 63 74 69 6f 6e 73 5d 2e 0a 0a 3c 70 3e  functions]...<p>
4640: 0a 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
4650: 20 65 78 61 6d 70 6c 65 20 69 6c 6c 75 73 74 72   example illustr
4660: 61 74 65 73 20 74 68 65 20 61 62 6f 76 65 2e 20  ates the above. 
4670: 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20  The expressions 
4680: 22 64 6f 63 73 22 2c 20 0a 20 20 22 64 6f 63 73  "docs", .  "docs
4690: 2e 64 6f 63 73 22 20 61 6e 64 20 22 6d 61 69 6e  .docs" and "main
46a0: 2e 64 6f 63 73 2e 64 6f 63 73 22 20 61 6c 6c 20  .docs.docs" all 
46b0: 72 65 66 65 72 20 74 6f 20 63 6f 6c 75 6d 6e 20  refer to column 
46c0: 22 64 6f 63 73 22 2e 20 48 6f 77 65 76 65 72 2c  "docs". However,
46d0: 20 74 68 65 20 0a 20 20 65 78 70 72 65 73 73 69   the .  expressi
46e0: 6f 6e 20 22 6d 61 69 6e 2e 64 6f 63 73 22 20 64  on "main.docs" d
46f0: 6f 65 73 20 6e 6f 74 20 72 65 66 65 72 20 74 6f  oes not refer to
4700: 20 61 6e 79 20 63 6f 6c 75 6d 6e 2e 20 49 74 20   any column. It 
4710: 63 6f 75 6c 64 20 62 65 20 75 73 65 64 20 74 6f  could be used to
4720: 20 0a 20 20 72 65 66 65 72 20 74 6f 20 61 20 74   .  refer to a t
4730: 61 62 6c 65 2c 20 62 75 74 20 61 20 74 61 62 6c  able, but a tabl
4740: 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 61 6c  e name is not al
4750: 6c 6f 77 65 64 20 69 6e 20 74 68 65 20 63 6f 6e  lowed in the con
4760: 74 65 78 74 20 69 6e 20 77 68 69 63 68 0a 20 20  text in which.  
4770: 69 74 20 69 73 20 75 73 65 64 20 62 65 6c 6f 77  it is used below
4780: 2e 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20  ...<codeblock>. 
4790: 20 3c 69 3e 2d 2d 20 45 78 61 6d 70 6c 65 20 73   <i>-- Example s
47a0: 63 68 65 6d 61 3c 2f 69 3e 0a 20 20 43 52 45 41  chema</i>.  CREA
47b0: 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45  TE VIRTUAL TABLE
47c0: 20 64 6f 63 73 20 55 53 49 4e 47 20 66 74 73 34   docs USING fts4
47d0: 28 63 6f 6e 74 65 6e 74 29 3b 0a 0a 20 20 3c 69  (content);..  <i
47e0: 3e 2d 2d 20 45 78 61 6d 70 6c 65 20 71 75 65 72  >-- Example quer
47f0: 69 65 73 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54  ies</i>.  SELECT
4800: 20 2a 20 46 52 4f 4d 20 64 6f 63 73 20 57 48 45   * FROM docs WHE
4810: 52 45 20 64 6f 63 73 20 4d 41 54 43 48 20 27 73  RE docs MATCH 's
4820: 71 6c 69 74 65 27 3b 20 20 20 20 20 20 20 20 20  qlite';         
4830: 20 20 20 20 20 3c 69 3e 2d 2d 20 4f 4b 2e 3c 2f       <i>-- OK.</
4840: 69 3e 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52  i>.  SELECT * FR
4850: 4f 4d 20 64 6f 63 73 20 57 48 45 52 45 20 64 6f  OM docs WHERE do
4860: 63 73 2e 64 6f 63 73 20 4d 41 54 43 48 20 27 73  cs.docs MATCH 's
4870: 71 6c 69 74 65 27 3b 20 20 20 20 20 20 20 20 20  qlite';         
4880: 3c 69 3e 2d 2d 20 4f 4b 2e 3c 2f 69 3e 0a 20 20  <i>-- OK.</i>.  
4890: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 64 6f  SELECT * FROM do
48a0: 63 73 20 57 48 45 52 45 20 6d 61 69 6e 2e 64 6f  cs WHERE main.do
48b0: 63 73 2e 64 6f 63 73 20 4d 41 54 43 48 20 27 73  cs.docs MATCH 's
48c0: 71 6c 69 74 65 27 3b 20 20 20 20 3c 69 3e 2d 2d  qlite';    <i>--
48d0: 20 4f 4b 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45 43   OK.</i>.  SELEC
48e0: 54 20 2a 20 46 52 4f 4d 20 64 6f 63 73 20 57 48  T * FROM docs WH
48f0: 45 52 45 20 6d 61 69 6e 2e 64 6f 63 73 20 4d 41  ERE main.docs MA
4900: 54 43 48 20 27 73 71 6c 69 74 65 27 3b 20 20 20  TCH 'sqlite';   
4910: 20 20 20 20 20 20 3c 69 3e 2d 2d 20 45 72 72 6f        <i>-- Erro
4920: 72 2e 3c 2f 69 3e 0a 3c 2f 63 6f 64 65 62 6c 6f  r.</i>.</codeblo
4930: 63 6b 3e 0a 20 0a 3c 68 32 3e 53 75 6d 6d 61 72  ck>. .<h2>Summar
4940: 79 3c 2f 68 32 3e 0a 0a 3c 70 3e 0a 20 20 46 72  y</h2>..<p>.  Fr
4950: 6f 6d 20 74 68 65 20 75 73 65 72 73 20 70 6f 69  om the users poi
4960: 6e 74 20 6f 66 20 76 69 65 77 2c 20 46 54 53 20  nt of view, FTS 
4970: 74 61 62 6c 65 73 20 61 72 65 20 73 69 6d 69 6c  tables are simil
4980: 61 72 20 74 6f 20 6f 72 64 69 6e 61 72 79 20 53  ar to ordinary S
4990: 51 4c 69 74 65 0a 20 20 74 61 62 6c 65 73 20 69  QLite.  tables i
49a0: 6e 20 6d 61 6e 79 20 77 61 79 73 2e 20 44 61 74  n many ways. Dat
49b0: 61 20 6d 61 79 20 62 65 20 61 64 64 65 64 20 74  a may be added t
49c0: 6f 2c 20 6d 6f 64 69 66 69 65 64 20 77 69 74 68  o, modified with
49d0: 69 6e 20 61 6e 64 20 72 65 6d 6f 76 65 64 20 0a  in and removed .
49e0: 20 20 66 72 6f 6d 20 46 54 53 20 74 61 62 6c 65    from FTS table
49f0: 73 20 75 73 69 6e 67 20 74 68 65 20 49 4e 53 45  s using the INSE
4a00: 52 54 2c 20 55 50 44 41 54 45 20 61 6e 64 20 44  RT, UPDATE and D
4a10: 45 4c 45 54 45 20 63 6f 6d 6d 61 6e 64 73 20 6a  ELETE commands j
4a20: 75 73 74 20 61 73 20 0a 20 20 69 74 20 6d 61 79  ust as .  it may
4a30: 20 62 65 20 77 69 74 68 20 6f 72 64 69 6e 61 72   be with ordinar
4a40: 79 20 74 61 62 6c 65 73 2e 20 53 69 6d 69 6c 61  y tables. Simila
4a50: 72 6c 79 2c 20 74 68 65 20 53 45 4c 45 43 54 20  rly, the SELECT 
4a60: 63 6f 6d 6d 61 6e 64 20 6d 61 79 20 62 65 20 75  command may be u
4a70: 73 65 64 20 0a 20 20 74 6f 20 71 75 65 72 79 20  sed .  to query 
4a80: 64 61 74 61 2e 20 54 68 65 20 66 6f 6c 6c 6f 77  data. The follow
4a90: 69 6e 67 20 6c 69 73 74 20 73 75 6d 6d 61 72 69  ing list summari
4aa0: 7a 65 73 20 74 68 65 20 64 69 66 66 65 72 65 6e  zes the differen
4ab0: 63 65 73 20 62 65 74 77 65 65 6e 20 46 54 53 0a  ces between FTS.
4ac0: 20 20 61 6e 64 20 6f 72 64 69 6e 61 72 79 20 74    and ordinary t
4ad0: 61 62 6c 65 73 3a 0a 0a 3c 6f 6c 3e 0a 20 20 3c  ables:..<ol>.  <
4ae0: 6c 69 3e 3c 70 3e 20 0a 20 20 20 20 41 73 20 77  li><p> .    As w
4af0: 69 74 68 20 61 6c 6c 20 76 69 72 74 75 61 6c 20  ith all virtual 
4b00: 74 61 62 6c 65 20 74 79 70 65 73 2c 20 69 74 20  table types, it 
4b10: 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
4b20: 74 6f 20 63 72 65 61 74 65 20 69 6e 64 69 63 65  to create indice
4b30: 73 20 6f 72 0a 20 20 20 20 74 72 69 67 67 65 72  s or.    trigger
4b40: 73 20 61 74 74 61 63 68 65 64 20 74 6f 20 46 54  s attached to FT
4b50: 53 20 74 61 62 6c 65 73 2e 20 4e 6f 72 20 69 73  S tables. Nor is
4b60: 20 69 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   it possible to 
4b70: 75 73 65 20 74 68 65 20 41 4c 54 45 52 20 54 41  use the ALTER TA
4b80: 42 4c 45 0a 20 20 20 20 63 6f 6d 6d 61 6e 64 20  BLE.    command 
4b90: 74 6f 20 61 64 64 20 65 78 74 72 61 20 63 6f 6c  to add extra col
4ba0: 75 6d 6e 73 20 74 6f 20 46 54 53 20 74 61 62 6c  umns to FTS tabl
4bb0: 65 73 20 28 61 6c 74 68 6f 75 67 68 20 69 74 20  es (although it 
4bc0: 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 75  is possible to u
4bd0: 73 65 0a 20 20 20 20 41 4c 54 45 52 20 54 41 42  se.    ALTER TAB
4be0: 4c 45 20 74 6f 20 72 65 6e 61 6d 65 20 61 6e 20  LE to rename an 
4bf0: 46 54 53 20 74 61 62 6c 65 29 2e 0a 0a 20 20 3c  FTS table)...  <
4c00: 6c 69 3e 3c 70 3e 20 0a 20 20 20 20 44 61 74 61  li><p> .    Data
4c10: 2d 74 79 70 65 73 20 73 70 65 63 69 66 69 65 64  -types specified
4c20: 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   as part of the 
4c30: 22 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20  "CREATE VIRTUAL 
4c40: 54 41 42 4c 45 22 20 73 74 61 74 65 6d 65 6e 74  TABLE" statement
4c50: 0a 20 20 20 20 75 73 65 64 20 74 6f 20 63 72 65  .    used to cre
4c60: 61 74 65 20 61 6e 20 46 54 53 20 74 61 62 6c 65  ate an FTS table
4c70: 20 61 72 65 20 69 67 6e 6f 72 65 64 20 63 6f 6d   are ignored com
4c80: 70 6c 65 74 65 6c 79 2e 20 49 6e 73 74 65 61 64  pletely. Instead
4c90: 20 6f 66 20 74 68 65 0a 20 20 20 20 6e 6f 72 6d   of the.    norm
4ca0: 61 6c 20 72 75 6c 65 73 20 66 6f 72 20 61 70 70  al rules for app
4cb0: 6c 79 69 6e 67 20 74 79 70 65 20 5b 61 66 66 69  lying type [affi
4cc0: 6e 69 74 79 5d 20 74 6f 20 69 6e 73 65 72 74 65  nity] to inserte
4cd0: 64 20 76 61 6c 75 65 73 2c 20 61 6c 6c 0a 20 20  d values, all.  
4ce0: 20 20 76 61 6c 75 65 73 20 69 6e 73 65 72 74 65    values inserte
4cf0: 64 20 69 6e 74 6f 20 46 54 53 20 74 61 62 6c 65  d into FTS table
4d00: 20 63 6f 6c 75 6d 6e 73 20 28 65 78 63 65 70 74   columns (except
4d10: 20 74 68 65 20 73 70 65 63 69 61 6c 20 72 6f 77   the special row
4d20: 69 64 0a 20 20 20 20 63 6f 6c 75 6d 6e 29 20 61  id.    column) a
4d30: 72 65 20 63 6f 6e 76 65 72 74 65 64 20 74 6f 20  re converted to 
4d40: 74 79 70 65 20 54 45 58 54 20 62 65 66 6f 72 65  type TEXT before
4d50: 20 62 65 69 6e 67 20 73 74 6f 72 65 64 2e 0a 0a   being stored...
4d60: 20 20 3c 6c 69 3e 3c 70 3e 20 0a 20 20 20 20 46    <li><p> .    F
4d70: 54 53 20 74 61 62 6c 65 73 20 70 65 72 6d 69 74  TS tables permit
4d80: 20 74 68 65 20 73 70 65 63 69 61 6c 20 61 6c 69   the special ali
4d90: 61 73 20 22 64 6f 63 69 64 22 20 74 6f 20 62 65  as "docid" to be
4da0: 20 75 73 65 64 20 74 6f 20 72 65 66 65 72 20 74   used to refer t
4db0: 6f 20 74 68 65 0a 20 20 20 20 72 6f 77 69 64 20  o the.    rowid 
4dc0: 63 6f 6c 75 6d 6e 20 73 75 70 70 6f 72 74 65 64  column supported
4dd0: 20 62 79 20 61 6c 6c 20 5b 76 69 72 74 75 61 6c   by all [virtual
4de0: 20 74 61 62 6c 65 73 5d 2e 0a 0a 20 20 3c 6c 69   tables]...  <li
4df0: 3e 3c 70 3e 20 0a 20 20 20 20 54 68 65 20 5b 46  ><p> .    The [F
4e00: 54 53 20 4d 41 54 43 48 5d 20 6f 70 65 72 61 74  TS MATCH] operat
4e10: 6f 72 20 69 73 20 73 75 70 70 6f 72 74 65 64 20  or is supported 
4e20: 66 6f 72 20 71 75 65 72 69 65 73 20 62 61 73 65  for queries base
4e30: 64 20 6f 6e 20 74 68 65 20 62 75 69 6c 74 2d 69  d on the built-i
4e40: 6e 0a 20 20 20 20 66 75 6c 6c 2d 74 65 78 74 20  n.    full-text 
4e50: 69 6e 64 65 78 2e 20 0a 0a 20 20 3c 6c 69 3e 3c  index. ..  <li><
4e60: 70 3e 20 0a 20 20 20 20 54 68 65 20 5b 46 54 53  p> .    The [FTS
4e70: 20 61 75 78 69 6c 69 61 72 79 20 66 75 6e 63 74   auxiliary funct
4e80: 69 6f 6e 73 5d 2c 20 5b 73 6e 69 70 70 65 74 28  ions], [snippet(
4e90: 29 5d 2c 20 5b 6f 66 66 73 65 74 73 28 29 5d 2c  )], [offsets()],
4ea0: 20 61 6e 64 20 5b 6d 61 74 63 68 69 6e 66 6f 28   and [matchinfo(
4eb0: 29 5d 20 61 72 65 20 0a 20 20 20 20 61 76 61 69  )] are .    avai
4ec0: 6c 61 62 6c 65 20 74 6f 20 73 75 70 70 6f 72 74  lable to support
4ed0: 20 66 75 6c 6c 2d 74 65 78 74 20 71 75 65 72 69   full-text queri
4ee0: 65 73 2e 0a 0a 20 20 3c 6c 69 3e 3c 70 3e 0a 20  es...  <li><p>. 
4ef0: 20 20 20 3c 74 63 6c 3e 68 64 5f 66 72 61 67 6d     <tcl>hd_fragm
4f00: 65 6e 74 20 68 69 64 64 65 6e 63 6f 6c 20 7b 46  ent hiddencol {F
4f10: 54 53 20 68 69 64 64 65 6e 20 63 6f 6c 75 6d 6e  TS hidden column
4f20: 7d 3c 2f 74 63 6c 3e 0a 20 20 20 20 45 76 65 72  }</tcl>.    Ever
4f30: 79 20 46 54 53 20 74 61 62 6c 65 20 68 61 73 20  y FTS table has 
4f40: 61 20 5b 68 69 64 64 65 6e 20 63 6f 6c 75 6d 6e  a [hidden column
4f50: 5d 20 77 69 74 68 20 74 68 65 20 0a 20 20 20 20  ] with the .    
4f60: 73 61 6d 65 20 6e 61 6d 65 20 61 73 20 74 68 65  same name as the
4f70: 20 74 61 62 6c 65 20 69 74 73 65 6c 66 2e 20 54   table itself. T
4f80: 68 65 20 76 61 6c 75 65 20 63 6f 6e 74 61 69 6e  he value contain
4f90: 65 64 20 69 6e 20 65 61 63 68 20 72 6f 77 20 66  ed in each row f
4fa0: 6f 72 20 74 68 65 0a 20 20 20 20 68 69 64 64 65  or the.    hidde
4fb0: 6e 20 63 6f 6c 75 6d 6e 20 69 73 20 61 20 62 6c  n column is a bl
4fc0: 6f 62 20 74 68 61 74 20 69 73 20 6f 6e 6c 79 20  ob that is only 
4fd0: 75 73 65 66 75 6c 20 61 73 20 74 68 65 20 6c 65  useful as the le
4fe0: 66 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 0a  ft operand of a.
4ff0: 20 20 20 20 5b 46 54 53 20 4d 41 54 43 48 7c 4d      [FTS MATCH|M
5000: 41 54 43 48 5d 20 6f 70 65 72 61 74 6f 72 2c 20  ATCH] operator, 
5010: 6f 72 20 61 73 20 74 68 65 20 6c 65 66 74 2d 6d  or as the left-m
5020: 6f 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ost argument to 
5030: 6f 6e 65 0a 20 20 20 20 6f 66 20 74 68 65 20 5b  one.    of the [
5040: 46 54 53 20 61 75 78 69 6c 69 61 72 79 20 66 75  FTS auxiliary fu
5050: 6e 63 74 69 6f 6e 73 5d 2e 0a 20 20 20 20 0a 0a  nctions]..    ..
5060: 3c 2f 6f 6c 3e 0a 0a 0a 3c 68 31 20 74 61 67 73  </ol>...<h1 tags
5070: 3d 22 63 6f 6d 70 69 6c 65 20 66 74 73 22 3e 43  ="compile fts">C
5080: 6f 6d 70 69 6c 69 6e 67 20 61 6e 64 20 45 6e 61  ompiling and Ena
5090: 62 6c 69 6e 67 20 46 54 53 33 20 61 6e 64 20 46  bling FTS3 and F
50a0: 54 53 34 3c 2f 68 31 3e 0a 0a 3c 70 3e 0a 20 20  TS4</h1>..<p>.  
50b0: 41 6c 74 68 6f 75 67 68 20 46 54 53 33 20 61 6e  Although FTS3 an
50c0: 64 20 46 54 53 34 20 61 72 65 20 69 6e 63 6c 75  d FTS4 are inclu
50d0: 64 65 64 20 77 69 74 68 20 74 68 65 20 53 51 4c  ded with the SQL
50e0: 69 74 65 20 63 6f 72 65 20 73 6f 75 72 63 65 20  ite core source 
50f0: 63 6f 64 65 2c 20 74 68 65 79 20 61 72 65 20 6e  code, they are n
5100: 6f 74 0a 20 20 65 6e 61 62 6c 65 64 20 62 79 20  ot.  enabled by 
5110: 64 65 66 61 75 6c 74 2e 20 54 6f 20 62 75 69 6c  default. To buil
5120: 64 20 53 51 4c 69 74 65 20 77 69 74 68 20 46 54  d SQLite with FT
5130: 53 20 66 75 6e 63 74 69 6f 6e 61 6c 69 74 79 20  S functionality 
5140: 65 6e 61 62 6c 65 64 2c 20 64 65 66 69 6e 65 0a  enabled, define.
5150: 20 20 74 68 65 20 70 72 65 70 72 6f 63 65 73 73    the preprocess
5160: 6f 72 20 6d 61 63 72 6f 20 5b 53 51 4c 49 54 45  or macro [SQLITE
5170: 5f 45 4e 41 42 4c 45 5f 46 54 53 33 5d 20 77 68  _ENABLE_FTS3] wh
5180: 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 2e 20 4e 65  en compiling. Ne
5190: 77 20 61 70 70 6c 69 63 61 74 69 6f 6e 73 0a 20  w applications. 
51a0: 20 73 68 6f 75 6c 64 20 61 6c 73 6f 20 64 65 66   should also def
51b0: 69 6e 65 20 74 68 65 20 5b 53 51 4c 49 54 45 5f  ine the [SQLITE_
51c0: 45 4e 41 42 4c 45 5f 46 54 53 33 5f 50 41 52 45  ENABLE_FTS3_PARE
51d0: 4e 54 48 45 53 49 53 5d 20 6d 61 63 72 6f 20 74  NTHESIS] macro t
51e0: 6f 20 65 6e 61 62 6c 65 20 74 68 65 0a 20 20 5b  o enable the.  [
51f0: 65 6e 68 61 6e 63 65 64 20 71 75 65 72 79 20 73  enhanced query s
5200: 79 6e 74 61 78 5d 20 28 73 65 65 20 62 65 6c 6f  yntax] (see belo
5210: 77 29 2e 20 55 73 75 61 6c 6c 79 2c 20 74 68 69  w). Usually, thi
5220: 73 20 69 73 20 64 6f 6e 65 20 62 79 20 61 64 64  s is done by add
5230: 69 6e 67 20 74 68 65 20 0a 20 20 66 6f 6c 6c 6f  ing the .  follo
5240: 77 69 6e 67 20 74 77 6f 20 73 77 69 74 63 68 65  wing two switche
5250: 73 20 74 6f 20 74 68 65 20 63 6f 6d 70 69 6c 65  s to the compile
5260: 72 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 3a 0a  r command line:.
5270: 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20 20 2d  .<codeblock>.  -
5280: 44 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46  DSQLITE_ENABLE_F
5290: 54 53 33 0a 20 20 2d 44 53 51 4c 49 54 45 5f 45  TS3.  -DSQLITE_E
52a0: 4e 41 42 4c 45 5f 46 54 53 33 5f 50 41 52 45 4e  NABLE_FTS3_PAREN
52b0: 54 48 45 53 49 53 0a 3c 2f 63 6f 64 65 62 6c 6f  THESIS.</codeblo
52c0: 63 6b 3e 0a 0a 3c 70 3e 0a 20 20 4e 6f 74 65 20  ck>..<p>.  Note 
52d0: 74 68 61 74 20 65 6e 61 62 6c 69 6e 67 20 46 54  that enabling FT
52e0: 53 33 20 61 6c 73 6f 20 6d 61 6b 65 73 20 46 54  S3 also makes FT
52f0: 53 34 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 54  S4 available.  T
5300: 68 65 72 65 20 69 73 20 6e 6f 74 20 61 20 73 65  here is not a se
5310: 70 61 72 61 74 65 0a 20 20 53 51 4c 49 54 45 5f  parate.  SQLITE_
5320: 45 4e 41 42 4c 45 5f 46 54 53 34 20 63 6f 6d 70  ENABLE_FTS4 comp
5330: 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 2e  ile-time option.
5340: 20 20 41 20 62 75 69 6c 64 20 6f 66 20 53 51 4c    A build of SQL
5350: 69 74 65 20 65 69 74 68 65 72 20 73 75 70 70 6f  ite either suppo
5360: 72 74 73 0a 20 20 62 6f 74 68 20 46 54 53 33 20  rts.  both FTS3 
5370: 61 6e 64 20 46 54 53 34 20 6f 72 20 69 74 20 73  and FTS4 or it s
5380: 75 70 70 6f 72 74 73 20 6e 65 69 74 68 65 72 2e  upports neither.
5390: 0a 0a 3c 70 3e 0a 20 20 49 66 20 75 73 69 6e 67  ..<p>.  If using
53a0: 20 74 68 65 20 61 6d 61 6c 67 61 6d 61 74 69 6f   the amalgamatio
53b0: 6e 20 61 75 74 6f 63 6f 6e 66 20 62 61 73 65 64  n autoconf based
53c0: 20 62 75 69 6c 64 20 73 79 73 74 65 6d 2c 20 73   build system, s
53d0: 65 74 74 69 6e 67 20 74 68 65 20 43 50 50 46 4c  etting the CPPFL
53e0: 41 47 53 0a 20 20 65 6e 76 69 72 6f 6e 6d 65 6e  AGS.  environmen
53f0: 74 20 76 61 72 69 61 62 6c 65 20 77 68 69 6c 65  t variable while
5400: 20 72 75 6e 6e 69 6e 67 20 74 68 65 20 27 63 6f   running the 'co
5410: 6e 66 69 67 75 72 65 27 20 73 63 72 69 70 74 20  nfigure' script 
5420: 69 73 20 61 6e 20 65 61 73 79 0a 20 20 77 61 79  is an easy.  way
5430: 20 74 6f 20 73 65 74 20 74 68 65 73 65 20 6d 61   to set these ma
5440: 63 72 6f 73 2e 20 46 6f 72 20 65 78 61 6d 70 6c  cros. For exampl
5450: 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  e, the following
5460: 20 63 6f 6d 6d 61 6e 64 3a 0a 0a 3c 63 6f 64 65   command:..<code
5470: 62 6c 6f 63 6b 3e 0a 20 20 43 50 50 46 4c 41 47  block>.  CPPFLAG
5480: 53 3d 22 2d 44 53 51 4c 49 54 45 5f 45 4e 41 42  S="-DSQLITE_ENAB
5490: 4c 45 5f 46 54 53 33 20 2d 44 53 51 4c 49 54 45  LE_FTS3 -DSQLITE
54a0: 5f 45 4e 41 42 4c 45 5f 46 54 53 33 5f 50 41 52  _ENABLE_FTS3_PAR
54b0: 45 4e 54 48 45 53 49 53 22 20 2e 2f 63 6f 6e 66  ENTHESIS" ./conf
54c0: 69 67 75 72 65 20 26 6c 74 3b 63 6f 6e 66 69 67  igure &lt;config
54d0: 75 72 65 20 6f 70 74 69 6f 6e 73 26 67 74 3b 0a  ure options&gt;.
54e0: 3c 2f 63 6f 64 65 62 6c 6f 63 6b 3e 0a 0a 3c 70  </codeblock>..<p
54f0: 3e 0a 20 20 77 68 65 72 65 20 3c 69 3e 26 6c 74  >.  where <i>&lt
5500: 3b 63 6f 6e 66 69 67 75 72 65 20 6f 70 74 69 6f  ;configure optio
5510: 6e 73 26 67 74 3b 3c 2f 69 3e 20 61 72 65 20 74  ns&gt;</i> are t
5520: 68 6f 73 65 20 6f 70 74 69 6f 6e 73 20 6e 6f 72  hose options nor
5530: 6d 61 6c 6c 79 20 70 61 73 73 65 64 20 74 6f 0a  mally passed to.
5540: 20 20 74 68 65 20 63 6f 6e 66 69 67 75 72 65 20    the configure 
5550: 73 63 72 69 70 74 2c 20 69 66 20 61 6e 79 2e 0a  script, if any..
5560: 0a 3c 70 3e 0a 20 20 42 65 63 61 75 73 65 20 46  .<p>.  Because F
5570: 54 53 33 20 61 6e 64 20 46 54 53 34 20 61 72 65  TS3 and FTS4 are
5580: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 2c   virtual tables,
5590: 20 54 68 65 20 5b 53 51 4c 49 54 45 5f 45 4e 41   The [SQLITE_ENA
55a0: 42 4c 45 5f 46 54 53 33 5d 20 63 6f 6d 70 69 6c  BLE_FTS3] compil
55b0: 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 0a 20 20  e-time option.  
55c0: 69 73 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20  is incompatible 
55d0: 77 69 74 68 20 74 68 65 20 5b 53 51 4c 49 54 45  with the [SQLITE
55e0: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
55f0: 4c 45 5d 20 6f 70 74 69 6f 6e 2e 0a 0a 3c 70 3e  LE] option...<p>
5600: 0a 20 20 49 66 20 61 20 62 75 69 6c 64 20 6f 66  .  If a build of
5610: 20 53 51 4c 69 74 65 20 64 6f 65 73 20 6e 6f 74   SQLite does not
5620: 20 69 6e 63 6c 75 64 65 20 74 68 65 20 46 54 53   include the FTS
5630: 20 6d 6f 64 75 6c 65 73 2c 20 74 68 65 6e 20 61   modules, then a
5640: 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20 70 72  ny attempt to pr
5650: 65 70 61 72 65 20 61 6e 0a 20 20 53 51 4c 20 73  epare an.  SQL s
5660: 74 61 74 65 6d 65 6e 74 20 74 6f 20 63 72 65 61  tatement to crea
5670: 74 65 20 61 6e 20 46 54 53 33 20 6f 72 20 46 54  te an FTS3 or FT
5680: 53 34 20 74 61 62 6c 65 20 6f 72 20 74 6f 20 64  S4 table or to d
5690: 72 6f 70 20 6f 72 20 61 63 63 65 73 73 20 61 6e  rop or access an
56a0: 20 65 78 69 73 74 69 6e 67 20 0a 20 20 46 54 53   existing .  FTS
56b0: 20 74 61 62 6c 65 20 69 6e 20 61 6e 79 20 77 61   table in any wa
56c0: 79 20 77 69 6c 6c 20 66 61 69 6c 2e 20 54 68 65  y will fail. The
56d0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 72   error message r
56e0: 65 74 75 72 6e 65 64 20 77 69 6c 6c 20 62 65 20  eturned will be 
56f0: 73 69 6d 69 6c 61 72 20 0a 20 20 74 6f 20 22 6e  similar .  to "n
5700: 6f 20 73 75 63 68 20 6d 6f 64 75 6c 65 3a 20 66  o such module: f
5710: 74 73 4e 22 20 28 77 68 65 72 65 20 4e 20 69 73  tsN" (where N is
5720: 20 65 69 74 68 65 72 20 33 20 6f 72 20 34 29 2e   either 3 or 4).
5730: 0a 0a 3c 70 3e 0a 20 20 49 66 20 74 68 65 20 43  ..<p>.  If the C
5740: 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20   version of the 
5750: 3c 61 20 68 72 65 66 3d 68 74 74 70 3a 2f 2f 73  <a href=http://s
5760: 69 74 65 2e 69 63 75 2d 70 72 6f 6a 65 63 74 2e  ite.icu-project.
5770: 6f 72 67 2f 3e 49 43 55 20 6c 69 62 72 61 72 79  org/>ICU library
5780: 3c 2f 61 3e 0a 20 20 69 73 20 61 76 61 69 6c 61  </a>.  is availa
5790: 62 6c 65 2c 20 74 68 65 6e 20 46 54 53 20 6d 61  ble, then FTS ma
57a0: 79 20 61 6c 73 6f 20 62 65 20 63 6f 6d 70 69 6c  y also be compil
57b0: 65 64 20 77 69 74 68 20 74 68 65 20 53 51 4c 49  ed with the SQLI
57c0: 54 45 5f 45 4e 41 42 4c 45 5f 49 43 55 0a 20 20  TE_ENABLE_ICU.  
57d0: 70 72 65 2d 70 72 6f 63 65 73 73 6f 72 20 6d 61  pre-processor ma
57e0: 63 72 6f 20 64 65 66 69 6e 65 64 2e 20 43 6f 6d  cro defined. Com
57f0: 70 69 6c 69 6e 67 20 77 69 74 68 20 74 68 69 73  piling with this
5800: 20 6d 61 63 72 6f 20 65 6e 61 62 6c 65 73 20 61   macro enables a
5810: 6e 20 46 54 53 0a 20 20 5b 74 6f 6b 65 6e 69 7a  n FTS.  [tokeniz
5820: 65 72 5d 20 74 68 61 74 20 75 73 65 73 20 74 68  er] that uses th
5830: 65 20 49 43 55 20 6c 69 62 72 61 72 79 20 74 6f  e ICU library to
5840: 20 73 70 6c 69 74 20 61 20 64 6f 63 75 6d 65 6e   split a documen
5850: 74 20 69 6e 74 6f 20 74 65 72 6d 73 0a 20 20 28  t into terms.  (
5860: 77 6f 72 64 73 29 20 75 73 69 6e 67 20 74 68 65  words) using the
5870: 20 63 6f 6e 76 65 6e 74 69 6f 6e 73 20 66 6f 72   conventions for
5880: 20 61 20 73 70 65 63 69 66 69 65 64 20 6c 61 6e   a specified lan
5890: 67 75 61 67 65 20 61 6e 64 20 6c 6f 63 61 6c 65  guage and locale
58a0: 2e 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20  ...<codeblock>. 
58b0: 20 2d 44 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45   -DSQLITE_ENABLE
58c0: 5f 49 43 55 0a 3c 2f 63 6f 64 65 62 6c 6f 63 6b  _ICU.</codeblock
58d0: 3e 0a 20 20 0a 0a 3c 68 31 20 74 61 67 73 3d 22  >.  ..<h1 tags="
58e0: 46 54 53 20 4d 41 54 43 48 22 3e 46 75 6c 6c 2d  FTS MATCH">Full-
58f0: 74 65 78 74 20 49 6e 64 65 78 20 51 75 65 72 69  text Index Queri
5900: 65 73 3c 2f 68 31 3e 0a 0a 3c 70 3e 0a 20 20 54  es</h1>..<p>.  T
5910: 68 65 20 6d 6f 73 74 20 75 73 65 66 75 6c 20 74  he most useful t
5920: 68 69 6e 67 20 61 62 6f 75 74 20 46 54 53 20 74  hing about FTS t
5930: 61 62 6c 65 73 20 69 73 20 74 68 65 20 71 75 65  ables is the que
5940: 72 69 65 73 20 74 68 61 74 20 6d 61 79 20 62 65  ries that may be
5950: 20 0a 20 20 70 65 72 66 6f 72 6d 65 64 20 75 73   .  performed us
5960: 69 6e 67 20 74 68 65 20 62 75 69 6c 74 2d 69 6e  ing the built-in
5970: 20 66 75 6c 6c 2d 74 65 78 74 20 69 6e 64 65 78   full-text index
5980: 2e 20 46 75 6c 6c 2d 74 65 78 74 20 71 75 65 72  . Full-text quer
5990: 69 65 73 20 61 72 65 20 0a 20 20 70 65 72 66 6f  ies are .  perfo
59a0: 72 6d 65 64 20 62 79 20 73 70 65 63 69 66 79 69  rmed by specifyi
59b0: 6e 67 20 61 20 63 6c 61 75 73 65 20 6f 66 20 74  ng a clause of t
59c0: 68 65 20 66 6f 72 6d 20 0a 20 20 22 26 6c 74 3b  he form .  "&lt;
59d0: 63 6f 6c 75 6d 6e 26 67 74 3b 20 4d 41 54 43 48  column&gt; MATCH
59e0: 20 26 6c 74 3b 66 75 6c 6c 2d 74 65 78 74 20 71   &lt;full-text q
59f0: 75 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 26  uery expression&
5a00: 67 74 3b 22 20 61 73 20 70 61 72 74 20 6f 66 20  gt;" as part of 
5a10: 74 68 65 20 57 48 45 52 45 20 0a 20 20 63 6c 61  the WHERE .  cla
5a20: 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20  use of a SELECT 
5a30: 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 72  statement that r
5a40: 65 61 64 73 20 64 61 74 61 20 66 72 6f 6d 20 61  eads data from a
5a50: 6e 20 46 54 53 20 74 61 62 6c 65 2e 20 0a 20 20  n FTS table. .  
5a60: 5b 73 69 6d 70 6c 65 20 66 74 73 20 71 75 65 72  [simple fts quer
5a70: 69 65 73 7c 53 69 6d 70 6c 65 20 46 54 53 20 71  ies|Simple FTS q
5a80: 75 65 72 69 65 73 5d 20 74 68 61 74 20 72 65 74  ueries] that ret
5a90: 75 72 6e 20 61 6c 6c 20 64 6f 63 75 6d 65 6e 74  urn all document
5aa0: 73 20 74 68 61 74 20 0a 20 20 63 6f 6e 74 61 69  s that .  contai
5ab0: 6e 20 61 20 67 69 76 65 6e 20 74 65 72 6d 20 61  n a given term a
5ac0: 72 65 20 64 65 73 63 72 69 62 65 64 20 61 62 6f  re described abo
5ad0: 76 65 2e 20 49 6e 20 74 68 61 74 20 64 69 73 63  ve. In that disc
5ae0: 75 73 73 69 6f 6e 20 74 68 65 20 72 69 67 68 74  ussion the right
5af0: 2d 68 61 6e 64 0a 20 20 6f 70 65 72 61 6e 64 20  -hand.  operand 
5b00: 6f 66 20 74 68 65 20 4d 41 54 43 48 20 6f 70 65  of the MATCH ope
5b10: 72 61 74 6f 72 20 77 61 73 20 61 73 73 75 6d 65  rator was assume
5b20: 64 20 74 6f 20 62 65 20 61 20 73 74 72 69 6e 67  d to be a string
5b30: 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20 61   consisting of a
5b40: 0a 20 20 73 69 6e 67 6c 65 20 74 65 72 6d 2e 20  .  single term. 
5b50: 54 68 69 73 20 73 65 63 74 69 6f 6e 20 64 65 73  This section des
5b60: 63 72 69 62 65 73 20 74 68 65 20 6d 6f 72 65 20  cribes the more 
5b70: 63 6f 6d 70 6c 65 78 20 71 75 65 72 79 20 74 79  complex query ty
5b80: 70 65 73 20 73 75 70 70 6f 72 74 65 64 20 0a 20  pes supported . 
5b90: 20 62 79 20 46 54 53 20 74 61 62 6c 65 73 2c 20   by FTS tables, 
5ba0: 61 6e 64 20 68 6f 77 20 74 68 65 79 20 6d 61 79  and how they may
5bb0: 20 62 65 20 75 74 69 6c 69 7a 65 64 20 62 79 20   be utilized by 
5bc0: 73 70 65 63 69 66 79 69 6e 67 20 61 20 6d 6f 72  specifying a mor
5bd0: 65 0a 20 20 63 6f 6d 70 6c 65 78 20 71 75 65 72  e.  complex quer
5be0: 79 20 65 78 70 72 65 73 73 69 6f 6e 20 61 73 20  y expression as 
5bf0: 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 6f  the right-hand o
5c00: 70 65 72 61 6e 64 20 6f 66 20 61 20 4d 41 54 43  perand of a MATC
5c10: 48 20 6f 70 65 72 61 74 6f 72 2e 0a 0a 3c 70 3e  H operator...<p>
5c20: 0a 20 20 46 54 53 20 74 61 62 6c 65 73 20 73 75  .  FTS tables su
5c30: 70 70 6f 72 74 20 74 68 72 65 65 20 62 61 73 69  pport three basi
5c40: 63 20 71 75 65 72 79 20 74 79 70 65 73 3a 0a 0a  c query types:..
5c50: 3c 75 6c 3e 0a 20 20 3c 74 63 6c 3e 68 64 5f 66  <ul>.  <tcl>hd_f
5c60: 72 61 67 6d 65 6e 74 20 74 65 72 6d 70 72 65 66  ragment termpref
5c70: 69 78 20 7b 70 72 65 66 69 78 20 71 75 65 72 79  ix {prefix query
5c80: 7d 20 7b 70 72 65 66 69 78 20 71 75 65 72 69 65  } {prefix querie
5c90: 73 7d 3c 2f 74 63 6c 3e 0a 20 20 3c 6c 69 3e 3c  s}</tcl>.  <li><
5ca0: 70 3e 3c 62 3e 54 6f 6b 65 6e 20 6f 72 20 74 6f  p><b>Token or to
5cb0: 6b 65 6e 20 70 72 65 66 69 78 20 71 75 65 72 69  ken prefix queri
5cc0: 65 73 3c 2f 62 3e 2e 20 0a 20 20 20 20 41 6e 20  es</b>. .    An 
5cd0: 46 54 53 20 74 61 62 6c 65 20 6d 61 79 20 62 65  FTS table may be
5ce0: 20 71 75 65 72 69 65 64 20 66 6f 72 20 61 6c 6c   queried for all
5cf0: 20 64 6f 63 75 6d 65 6e 74 73 20 74 68 61 74 20   documents that 
5d00: 63 6f 6e 74 61 69 6e 20 61 20 73 70 65 63 69 66  contain a specif
5d10: 69 65 64 0a 20 20 20 20 74 65 72 6d 20 28 74 68  ied.    term (th
5d20: 65 20 5b 73 69 6d 70 6c 65 20 66 74 73 20 71 75  e [simple fts qu
5d30: 65 72 69 65 73 7c 73 69 6d 70 6c 65 20 63 61 73  eries|simple cas
5d40: 65 5d 20 64 65 73 63 72 69 62 65 64 20 61 62 6f  e] described abo
5d50: 76 65 29 2c 20 6f 72 20 66 6f 72 0a 20 20 20 20  ve), or for.    
5d60: 61 6c 6c 20 64 6f 63 75 6d 65 6e 74 73 20 74 68  all documents th
5d70: 61 74 20 63 6f 6e 74 61 69 6e 20 61 20 74 65 72  at contain a ter
5d80: 6d 20 77 69 74 68 20 61 20 73 70 65 63 69 66 69  m with a specifi
5d90: 65 64 20 70 72 65 66 69 78 2e 20 41 73 20 77 65  ed prefix. As we
5da0: 20 68 61 76 65 0a 20 20 20 20 73 65 65 6e 2c 20   have.    seen, 
5db0: 74 68 65 20 71 75 65 72 79 20 65 78 70 72 65 73  the query expres
5dc0: 73 69 6f 6e 20 66 6f 72 20 61 20 73 70 65 63 69  sion for a speci
5dd0: 66 69 63 20 74 65 72 6d 20 69 73 20 73 69 6d 70  fic term is simp
5de0: 6c 79 20 74 68 65 20 74 65 72 6d 20 69 74 73 65  ly the term itse
5df0: 6c 66 2e 0a 20 20 20 20 54 68 65 20 71 75 65 72  lf..    The quer
5e00: 79 20 65 78 70 72 65 73 73 69 6f 6e 20 75 73 65  y expression use
5e10: 64 20 74 6f 20 73 65 61 72 63 68 20 66 6f 72 20  d to search for 
5e20: 61 20 74 65 72 6d 20 70 72 65 66 69 78 20 69 73  a term prefix is
5e30: 20 74 68 65 20 70 72 65 66 69 78 0a 20 20 20 20   the prefix.    
5e40: 69 74 73 65 6c 66 20 77 69 74 68 20 61 20 27 2a  itself with a '*
5e50: 27 20 63 68 61 72 61 63 74 65 72 20 61 70 70 65  ' character appe
5e60: 6e 64 65 64 20 74 6f 20 69 74 2e 20 46 6f 72 20  nded to it. For 
5e70: 65 78 61 6d 70 6c 65 3a 0a 3c 2f 75 6c 3e 0a 0a  example:.</ul>..
5e80: 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20 20 3c 69  <codeblock>.  <i
5e90: 3e 2d 2d 20 56 69 72 74 75 61 6c 20 74 61 62 6c  >-- Virtual tabl
5ea0: 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 3c 2f 69  e declaration</i
5eb0: 3e 0a 20 20 43 52 45 41 54 45 20 56 49 52 54 55  >.  CREATE VIRTU
5ec0: 41 4c 20 54 41 42 4c 45 20 64 6f 63 73 20 55 53  AL TABLE docs US
5ed0: 49 4e 47 20 66 74 73 33 28 74 69 74 6c 65 2c 20  ING fts3(title, 
5ee0: 62 6f 64 79 29 3b 0a 0a 20 20 3c 69 3e 2d 2d 20  body);..  <i>-- 
5ef0: 51 75 65 72 79 20 66 6f 72 20 61 6c 6c 20 64 6f  Query for all do
5f00: 63 75 6d 65 6e 74 73 20 63 6f 6e 74 61 69 6e 69  cuments containi
5f10: 6e 67 20 74 68 65 20 74 65 72 6d 20 22 6c 69 6e  ng the term "lin
5f20: 75 78 22 3a 3c 2f 69 3e 0a 20 20 53 45 4c 45 43  ux":</i>.  SELEC
5f30: 54 20 2a 20 46 52 4f 4d 20 64 6f 63 73 20 57 48  T * FROM docs WH
5f40: 45 52 45 20 64 6f 63 73 20 4d 41 54 43 48 20 27  ERE docs MATCH '
5f50: 6c 69 6e 75 78 27 3b 0a 0a 20 20 3c 69 3e 2d 2d  linux';..  <i>--
5f60: 20 51 75 65 72 79 20 66 6f 72 20 61 6c 6c 20 64   Query for all d
5f70: 6f 63 75 6d 65 6e 74 73 20 63 6f 6e 74 61 69 6e  ocuments contain
5f80: 69 6e 67 20 61 20 74 65 72 6d 20 77 69 74 68 20  ing a term with 
5f90: 74 68 65 20 70 72 65 66 69 78 20 22 6c 69 6e 22  the prefix "lin"
5fa0: 2e 20 54 68 69 73 20 77 69 6c 6c 20 6d 61 74 63  . This will matc
5fb0: 68 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 61 6c  h</i>.  <i>-- al
5fc0: 6c 20 64 6f 63 75 6d 65 6e 74 73 20 74 68 61 74  l documents that
5fd0: 20 63 6f 6e 74 61 69 6e 20 22 6c 69 6e 75 78 22   contain "linux"
5fe0: 2c 20 62 75 74 20 61 6c 73 6f 20 74 68 6f 73 65  , but also those
5ff0: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 20 74 65   that contain te
6000: 72 6d 73 20 22 6c 69 6e 65 61 72 22 2c 3c 2f 69  rms "linear",</i
6010: 3e 0a 20 20 3c 69 3e 2d 2d 22 6c 69 6e 6b 65 72  >.  <i>--"linker
6020: 22 2c 20 22 6c 69 6e 67 75 69 73 74 69 63 22 20  ", "linguistic" 
6030: 61 6e 64 20 73 6f 20 6f 6e 2e 3c 2f 69 3e 0a 20  and so on.</i>. 
6040: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 64   SELECT * FROM d
6050: 6f 63 73 20 57 48 45 52 45 20 64 6f 63 73 20 4d  ocs WHERE docs M
6060: 41 54 43 48 20 27 6c 69 6e 2a 27 3b 0a 3c 2f 63  ATCH 'lin*';.</c
6070: 6f 64 65 62 6c 6f 63 6b 3e 0a 0a 3c 75 6c 3e 0a  odeblock>..<ul>.
6080: 20 20 3c 6c 69 20 73 74 79 6c 65 3d 22 6c 69 73    <li style="lis
6090: 74 2d 73 74 79 6c 65 3a 6e 6f 6e 65 22 3e 3c 70  t-style:none"><p
60a0: 3e 0a 20 20 20 20 4e 6f 72 6d 61 6c 6c 79 2c 20  >.    Normally, 
60b0: 61 20 74 6f 6b 65 6e 20 6f 72 20 74 6f 6b 65 6e  a token or token
60c0: 20 70 72 65 66 69 78 20 71 75 65 72 79 20 69 73   prefix query is
60d0: 20 6d 61 74 63 68 65 64 20 61 67 61 69 6e 73 74   matched against
60e0: 20 74 68 65 20 46 54 53 20 74 61 62 6c 65 20 0a   the FTS table .
60f0: 20 20 20 20 63 6f 6c 75 6d 6e 20 73 70 65 63 69      column speci
6100: 66 69 65 64 20 61 73 20 74 68 65 20 72 69 67 68  fied as the righ
6110: 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74  t-hand side of t
6120: 68 65 20 4d 41 54 43 48 20 6f 70 65 72 61 74 6f  he MATCH operato
6130: 72 2e 20 4f 72 2c 20 69 66 20 74 68 65 0a 20 20  r. Or, if the.  
6140: 20 20 73 70 65 63 69 61 6c 20 63 6f 6c 75 6d 6e    special column
6150: 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e   with the same n
6160: 61 6d 65 20 61 73 20 74 68 65 20 46 54 53 20 74  ame as the FTS t
6170: 61 62 6c 65 20 69 74 73 65 6c 66 20 69 73 20 73  able itself is s
6180: 70 65 63 69 66 69 65 64 2c 0a 20 20 20 20 61 67  pecified,.    ag
6190: 61 69 6e 73 74 20 61 6c 6c 20 63 6f 6c 75 6d 6e  ainst all column
61a0: 73 2e 20 54 68 69 73 20 6d 61 79 20 62 65 20 6f  s. This may be o
61b0: 76 65 72 72 69 64 64 65 6e 20 62 79 20 73 70 65  verridden by spe
61c0: 63 69 66 79 69 6e 67 20 61 20 63 6f 6c 75 6d 6e  cifying a column
61d0: 2d 6e 61 6d 65 0a 20 20 20 20 66 6f 6c 6c 6f 77  -name.    follow
61e0: 65 64 20 62 79 20 61 20 22 3a 22 20 63 68 61 72  ed by a ":" char
61f0: 61 63 74 65 72 20 62 65 66 6f 72 65 20 61 20 62  acter before a b
6200: 61 73 69 63 20 74 65 72 6d 20 71 75 65 72 79 2e  asic term query.
6210: 20 54 68 65 72 65 20 6d 61 79 20 62 65 20 73 70   There may be sp
6220: 61 63 65 0a 20 20 20 20 62 65 74 77 65 65 6e 20  ace.    between 
6230: 74 68 65 20 22 3a 22 20 61 6e 64 20 74 68 65 20  the ":" and the 
6240: 74 65 72 6d 20 74 6f 20 71 75 65 72 79 20 66 6f  term to query fo
6250: 72 2c 20 62 75 74 20 6e 6f 74 20 62 65 74 77 65  r, but not betwe
6260: 65 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 2d 6e 61  en the column-na
6270: 6d 65 0a 20 20 20 20 61 6e 64 20 74 68 65 20 22  me.    and the "
6280: 3a 22 20 63 68 61 72 61 63 74 65 72 2e 20 46 6f  :" character. Fo
6290: 72 20 65 78 61 6d 70 6c 65 3a 0a 3c 2f 75 6c 3e  r example:.</ul>
62a0: 0a 20 20 20 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e  .   .<codeblock>
62b0: 0a 20 20 3c 69 3e 2d 2d 20 51 75 65 72 79 20 74  .  <i>-- Query t
62c0: 68 65 20 64 61 74 61 62 61 73 65 20 66 6f 72 20  he database for 
62d0: 64 6f 63 75 6d 65 6e 74 73 20 66 6f 72 20 77 68  documents for wh
62e0: 69 63 68 20 74 68 65 20 74 65 72 6d 20 22 6c 69  ich the term "li
62f0: 6e 75 78 22 20 61 70 70 65 61 72 73 20 69 6e 3c  nux" appears in<
6300: 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 74 68 65 20  /i>.  <i>-- the 
6310: 64 6f 63 75 6d 65 6e 74 20 74 69 74 6c 65 2c 20  document title, 
6320: 61 6e 64 20 74 68 65 20 74 65 72 6d 20 22 70 72  and the term "pr
6330: 6f 62 6c 65 6d 73 22 20 61 70 70 65 61 72 73 20  oblems" appears 
6340: 69 6e 20 65 69 74 68 65 72 20 74 68 65 20 74 69  in either the ti
6350: 74 6c 65 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20  tle</i>.  <i>-- 
6360: 6f 72 20 62 6f 64 79 20 6f 66 20 74 68 65 20 64  or body of the d
6370: 6f 63 75 6d 65 6e 74 2e 3c 2f 69 3e 0a 20 20 53  ocument.</i>.  S
6380: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 64 6f 63  ELECT * FROM doc
6390: 73 20 57 48 45 52 45 20 64 6f 63 73 20 4d 41 54  s WHERE docs MAT
63a0: 43 48 20 27 74 69 74 6c 65 3a 6c 69 6e 75 78 20  CH 'title:linux 
63b0: 70 72 6f 62 6c 65 6d 73 27 3b 0a 0a 20 20 3c 69  problems';..  <i
63c0: 3e 2d 2d 20 51 75 65 72 79 20 74 68 65 20 64 61  >-- Query the da
63d0: 74 61 62 61 73 65 20 66 6f 72 20 64 6f 63 75 6d  tabase for docum
63e0: 65 6e 74 73 20 66 6f 72 20 77 68 69 63 68 20 74  ents for which t
63f0: 68 65 20 74 65 72 6d 20 22 6c 69 6e 75 78 22 20  he term "linux" 
6400: 61 70 70 65 61 72 73 20 69 6e 3c 2f 69 3e 0a 20  appears in</i>. 
6410: 20 3c 69 3e 2d 2d 20 74 68 65 20 64 6f 63 75 6d   <i>-- the docum
6420: 65 6e 74 20 74 69 74 6c 65 2c 20 61 6e 64 20 74  ent title, and t
6430: 68 65 20 74 65 72 6d 20 22 64 72 69 76 65 72 22  he term "driver"
6440: 20 61 70 70 65 61 72 73 20 69 6e 20 74 68 65 20   appears in the 
6450: 62 6f 64 79 20 6f 66 20 74 68 65 20 64 6f 63 75  body of the docu
6460: 6d 65 6e 74 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d  ment</i>.  <i>--
6470: 20 28 22 64 72 69 76 65 72 22 20 6d 61 79 20 61   ("driver" may a
6480: 6c 73 6f 20 61 70 70 65 61 72 20 69 6e 20 74 68  lso appear in th
6490: 65 20 74 69 74 6c 65 2c 20 62 75 74 20 74 68 69  e title, but thi
64a0: 73 20 61 6c 6f 6e 65 20 77 69 6c 6c 20 6e 6f 74  s alone will not
64b0: 20 73 61 74 69 73 66 79 20 74 68 65 3c 2f 69 3e   satisfy the</i>
64c0: 2e 0a 20 20 3c 69 3e 2d 2d 20 71 75 65 72 79 20  ..  <i>-- query 
64d0: 63 72 69 74 65 72 69 61 29 2e 3c 2f 69 3e 0a 20  criteria).</i>. 
64e0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 64   SELECT * FROM d
64f0: 6f 63 73 20 57 48 45 52 45 20 62 6f 64 79 20 4d  ocs WHERE body M
6500: 41 54 43 48 20 27 74 69 74 6c 65 3a 6c 69 6e 75  ATCH 'title:linu
6510: 78 20 64 72 69 76 65 72 27 3b 0a 3c 2f 63 6f 64  x driver';.</cod
6520: 65 62 6c 6f 63 6b 3e 0a 0a 3c 75 6c 3e 0a 20 20  eblock>..<ul>.  
6530: 3c 6c 69 20 73 74 79 6c 65 3d 22 6c 69 73 74 2d  <li style="list-
6540: 73 74 79 6c 65 3a 6e 6f 6e 65 22 3e 3c 70 3e 0a  style:none"><p>.
6550: 20 20 20 20 49 66 20 74 68 65 20 46 54 53 20 74      If the FTS t
6560: 61 62 6c 65 20 69 73 20 61 6e 20 46 54 53 34 20  able is an FTS4 
6570: 74 61 62 6c 65 20 28 6e 6f 74 20 46 54 53 33 29  table (not FTS3)
6580: 2c 20 61 20 74 6f 6b 65 6e 20 6d 61 79 20 61 6c  , a token may al
6590: 73 6f 20 62 65 20 70 72 65 66 69 78 65 64 0a 20  so be prefixed. 
65a0: 20 20 20 77 69 74 68 20 61 20 22 26 23 39 34 3b     with a "&#94;
65b0: 22 20 63 68 61 72 61 63 74 65 72 2e 20 49 6e 20  " character. In 
65c0: 74 68 69 73 20 63 61 73 65 2c 20 69 6e 20 6f 72  this case, in or
65d0: 64 65 72 20 74 6f 20 6d 61 74 63 68 20 74 68 65  der to match the
65e0: 20 74 6f 6b 65 6e 20 6d 75 73 74 0a 20 20 20 20   token must.    
65f0: 61 70 70 65 61 72 20 61 73 20 74 68 65 20 76 65  appear as the ve
6600: 72 79 20 66 69 72 73 74 20 74 6f 6b 65 6e 20 69  ry first token i
6610: 6e 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 6f 66 20  n any column of 
6620: 74 68 65 20 6d 61 74 63 68 69 6e 67 20 72 6f 77  the matching row
6630: 2e 20 45 78 61 6d 70 6c 65 73 3a 0a 3c 2f 75 6c  . Examples:.</ul
6640: 3e 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20  >..<codeblock>. 
6650: 20 3c 69 3e 2d 2d 20 41 6c 6c 20 64 6f 63 75 6d   <i>-- All docum
6660: 65 6e 74 73 20 66 6f 72 20 77 68 69 63 68 20 22  ents for which "
6670: 6c 69 6e 75 78 22 20 69 73 20 74 68 65 20 66 69  linux" is the fi
6680: 72 73 74 20 74 6f 6b 65 6e 20 6f 66 20 61 74 20  rst token of at 
6690: 6c 65 61 73 74 20 6f 6e 65 3c 2f 69 3e 0a 20 20  least one</i>.  
66a0: 3c 69 3e 2d 2d 20 63 6f 6c 75 6d 6e 2e 3c 2f 69  <i>-- column.</i
66b0: 3e 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  >.  SELECT * FRO
66c0: 4d 20 64 6f 63 73 20 57 48 45 52 45 20 64 6f 63  M docs WHERE doc
66d0: 73 20 4d 41 54 43 48 20 27 26 23 39 34 3b 6c 69  s MATCH '&#94;li
66e0: 6e 75 78 27 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 41  nux';..  <i>-- A
66f0: 6c 6c 20 64 6f 63 75 6d 65 6e 74 73 20 66 6f 72  ll documents for
6700: 20 77 68 69 63 68 20 74 68 65 20 66 69 72 73 74   which the first
6710: 20 74 6f 6b 65 6e 20 69 6e 20 63 6f 6c 75 6d 6e   token in column
6720: 20 22 74 69 74 6c 65 22 20 62 65 67 69 6e 73 20   "title" begins 
6730: 77 69 74 68 20 22 6c 69 6e 22 2e 3c 2f 69 3e 0a  with "lin".</i>.
6740: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
6750: 64 6f 63 73 20 57 48 45 52 45 20 62 6f 64 79 20  docs WHERE body 
6760: 4d 41 54 43 48 20 27 74 69 74 6c 65 3a 20 26 23  MATCH 'title: &#
6770: 39 34 3b 6c 69 6e 2a 27 3b 0a 3c 2f 63 6f 64 65  94;lin*';.</code
6780: 62 6c 6f 63 6b 3e 0a 0a 3c 74 63 6c 3e 68 64 5f  block>..<tcl>hd_
6790: 66 72 61 67 6d 65 6e 74 20 70 68 72 61 73 65 20  fragment phrase 
67a0: 7b 70 68 72 61 73 65 20 71 75 65 72 69 65 73 7d  {phrase queries}
67b0: 3c 2f 74 63 6c 3e 0a 3c 75 6c 3e 0a 20 20 3c 6c  </tcl>.<ul>.  <l
67c0: 69 3e 3c 70 3e 3c 62 3e 50 68 72 61 73 65 20 71  i><p><b>Phrase q
67d0: 75 65 72 69 65 73 3c 2f 62 3e 2e 0a 20 20 20 20  ueries</b>..    
67e0: 41 20 70 68 72 61 73 65 20 71 75 65 72 79 20 69  A phrase query i
67f0: 73 20 61 20 71 75 65 72 79 20 74 68 61 74 20 72  s a query that r
6800: 65 74 72 69 65 76 65 73 20 61 6c 6c 20 64 6f 63  etrieves all doc
6810: 75 6d 65 6e 74 73 20 74 68 61 74 20 63 6f 6e 74  uments that cont
6820: 61 69 6e 20 61 0a 20 20 20 20 6e 6f 6d 69 6e 61  ain a.    nomina
6830: 74 65 64 20 73 65 74 20 6f 66 20 74 65 72 6d 73  ted set of terms
6840: 20 6f 72 20 74 65 72 6d 20 70 72 65 66 69 78 65   or term prefixe
6850: 73 20 69 6e 20 61 20 73 70 65 63 69 66 69 65 64  s in a specified
6860: 20 6f 72 64 65 72 20 77 69 74 68 20 6e 6f 0a 20   order with no. 
6870: 20 20 20 69 6e 74 65 72 76 65 6e 69 6e 67 20 74     intervening t
6880: 6f 6b 65 6e 73 2e 20 50 68 72 61 73 65 20 71 75  okens. Phrase qu
6890: 65 72 69 65 73 20 61 72 65 20 73 70 65 63 69 66  eries are specif
68a0: 69 65 64 20 62 79 20 65 6e 63 6c 6f 73 69 6e 67  ied by enclosing
68b0: 20 61 20 73 70 61 63 65 0a 20 20 20 20 73 65 70   a space.    sep
68c0: 61 72 61 74 65 64 20 73 65 71 75 65 6e 63 65 20  arated sequence 
68d0: 6f 66 20 74 65 72 6d 73 20 6f 72 20 74 65 72 6d  of terms or term
68e0: 20 70 72 65 66 69 78 65 73 20 69 6e 20 64 6f 75   prefixes in dou
68f0: 62 6c 65 20 71 75 6f 74 65 73 20 28 22 29 2e 0a  ble quotes (")..
6900: 20 20 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a      For example:
6910: 0a 3c 2f 75 6c 3e 0a 0a 3c 63 6f 64 65 62 6c 6f  .</ul>..<codeblo
6920: 63 6b 3e 0a 20 20 3c 69 3e 2d 2d 20 51 75 65 72  ck>.  <i>-- Quer
6930: 79 20 66 6f 72 20 61 6c 6c 20 64 6f 63 75 6d 65  y for all docume
6940: 6e 74 73 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  nts that contain
6950: 20 74 68 65 20 70 68 72 61 73 65 20 22 6c 69 6e   the phrase "lin
6960: 75 78 20 61 70 70 6c 69 63 61 74 69 6f 6e 73 22  ux applications"
6970: 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20 2a  .</i>.  SELECT *
6980: 20 46 52 4f 4d 20 64 6f 63 73 20 57 48 45 52 45   FROM docs WHERE
6990: 20 64 6f 63 73 20 4d 41 54 43 48 20 27 22 6c 69   docs MATCH '"li
69a0: 6e 75 78 20 61 70 70 6c 69 63 61 74 69 6f 6e 73  nux applications
69b0: 22 27 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 51 75 65  "';..  <i>-- Que
69c0: 72 79 20 66 6f 72 20 61 6c 6c 20 64 6f 63 75 6d  ry for all docum
69d0: 65 6e 74 73 20 74 68 61 74 20 63 6f 6e 74 61 69  ents that contai
69e0: 6e 20 61 20 70 68 72 61 73 65 20 74 68 61 74 20  n a phrase that 
69f0: 6d 61 74 63 68 65 73 20 22 6c 69 6e 2a 20 61 70  matches "lin* ap
6a00: 70 2a 22 2e 20 41 73 20 77 65 6c 6c 20 61 73 3c  p*". As well as<
6a10: 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 22 6c 69 6e  /i>.  <i>-- "lin
6a20: 75 78 20 61 70 70 6c 69 63 61 74 69 6f 6e 73 22  ux applications"
6a30: 2c 20 74 68 69 73 20 77 69 6c 6c 20 6d 61 74 63  , this will matc
6a40: 68 20 63 6f 6d 6d 6f 6e 20 70 68 72 61 73 65 73  h common phrases
6a50: 20 73 75 63 68 20 61 73 20 22 6c 69 6e 6f 6c 65   such as "linole
6a60: 75 6d 20 61 70 70 6c 69 61 6e 63 65 73 22 3c 2f  um appliances"</
6a70: 69 3e 0a 20 20 3c 69 3e 2d 2d 20 6f 72 20 22 6c  i>.  <i>-- or "l
6a80: 69 6e 6b 20 61 70 70 72 65 6e 74 69 63 65 22 2e  ink apprentice".
6a90: 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20 2a 20  </i>.  SELECT * 
6aa0: 46 52 4f 4d 20 64 6f 63 73 20 57 48 45 52 45 20  FROM docs WHERE 
6ab0: 64 6f 63 73 20 4d 41 54 43 48 20 27 22 6c 69 6e  docs MATCH '"lin
6ac0: 2a 20 61 70 70 2a 22 27 3b 0a 3c 2f 63 6f 64 65  * app*"';.</code
6ad0: 62 6c 6f 63 6b 3e 0a 0a 3c 74 63 6c 3e 68 64 5f  block>..<tcl>hd_
6ae0: 66 72 61 67 6d 65 6e 74 20 6e 65 61 72 20 7b 4e  fragment near {N
6af0: 45 41 52 20 71 75 65 72 69 65 73 7d 3c 2f 74 63  EAR queries}</tc
6b00: 6c 3e 0a 3c 75 6c 3e 0a 20 20 3c 6c 69 3e 3c 70  l>.<ul>.  <li><p
6b10: 3e 3c 62 3e 4e 45 41 52 20 71 75 65 72 69 65 73  ><b>NEAR queries
6b20: 3c 2f 62 3e 2e 20 0a 20 20 20 20 41 20 4e 45 41  </b>. .    A NEA
6b30: 52 20 71 75 65 72 79 20 69 73 20 61 20 71 75 65  R query is a que
6b40: 72 79 20 74 68 61 74 20 72 65 74 75 72 6e 73 20  ry that returns 
6b50: 64 6f 63 75 6d 65 6e 74 73 20 74 68 61 74 20 63  documents that c
6b60: 6f 6e 74 61 69 6e 20 61 20 74 77 6f 20 6f 72 0a  ontain a two or.
6b70: 20 20 20 20 6d 6f 72 65 20 6e 6f 6d 69 6e 61 74      more nominat
6b80: 65 64 20 74 65 72 6d 73 20 6f 72 20 70 68 72 61  ed terms or phra
6b90: 73 65 73 20 77 69 74 68 69 6e 20 61 20 73 70 65  ses within a spe
6ba0: 63 69 66 69 65 64 20 70 72 6f 78 69 6d 69 74 79  cified proximity
6bb0: 20 6f 66 20 65 61 63 68 20 0a 20 20 20 20 6f 74   of each .    ot
6bc0: 68 65 72 20 28 62 79 20 64 65 66 61 75 6c 74 20  her (by default 
6bd0: 77 69 74 68 20 31 30 20 6f 72 20 6c 65 73 73 20  with 10 or less 
6be0: 69 6e 74 65 72 76 65 6e 69 6e 67 20 74 65 72 6d  intervening term
6bf0: 73 29 2e 20 41 20 4e 45 41 52 20 71 75 65 72 79  s). A NEAR query
6c00: 20 69 73 20 0a 20 20 20 20 73 70 65 63 69 66 69   is .    specifi
6c10: 65 64 20 62 79 20 70 75 74 74 69 6e 67 20 74 68  ed by putting th
6c20: 65 20 6b 65 79 77 6f 72 64 20 22 4e 45 41 52 22  e keyword "NEAR"
6c30: 20 62 65 74 77 65 65 6e 20 74 77 6f 20 70 68 72   between two phr
6c40: 61 73 65 2c 20 74 65 72 6d 20 6f 72 20 0a 20 20  ase, term or .  
6c50: 20 20 5b 70 72 65 66 69 78 20 71 75 65 72 69 65    [prefix querie
6c60: 73 5d 2e 20 54 6f 20 73 70 65 63 69 66 79 20 61  s]. To specify a
6c70: 20 70 72 6f 78 69 6d 69 74 79 20 6f 74 68 65 72   proximity other
6c80: 20 74 68 61 6e 20 74 68 65 20 64 65 66 61 75 6c   than the defaul
6c90: 74 2c 0a 20 20 20 20 61 6e 20 6f 70 65 72 61 74  t,.    an operat
6ca0: 6f 72 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  or of the form "
6cb0: 4e 45 41 52 2f 3c 69 3e 26 6c 74 3b 4e 26 67 74  NEAR/<i>&lt;N&gt
6cc0: 3b 3c 2f 69 3e 22 20 6d 61 79 20 62 65 20 75 73  ;</i>" may be us
6cd0: 65 64 2c 20 77 68 65 72 65 0a 20 20 20 20 3c 69  ed, where.    <i
6ce0: 3e 26 6c 74 3b 4e 26 67 74 3b 3c 2f 69 3e 20 69  >&lt;N&gt;</i> i
6cf0: 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75  s the maximum nu
6d00: 6d 62 65 72 20 6f 66 20 69 6e 74 65 72 76 65 6e  mber of interven
6d10: 69 6e 67 20 74 65 72 6d 73 20 61 6c 6c 6f 77 65  ing terms allowe
6d20: 64 2e 0a 20 20 20 20 46 6f 72 20 65 78 61 6d 70  d..    For examp
6d30: 6c 65 3a 0a 3c 2f 75 6c 3e 0a 0a 3c 63 6f 64 65  le:.</ul>..<code
6d40: 62 6c 6f 63 6b 3e 0a 20 20 3c 69 3e 2d 2d 20 56  block>.  <i>-- V
6d50: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 64 65 63  irtual table dec
6d60: 6c 61 72 61 74 69 6f 6e 2e 3c 2f 69 3e 0a 20 20  laration.</i>.  
6d70: 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54  CREATE VIRTUAL T
6d80: 41 42 4c 45 20 64 6f 63 73 20 55 53 49 4e 47 20  ABLE docs USING 
6d90: 66 74 73 34 28 29 3b 0a 0a 20 20 3c 69 3e 2d 2d  fts4();..  <i>--
6da0: 20 56 69 72 74 75 61 6c 20 74 61 62 6c 65 20 64   Virtual table d
6db0: 61 74 61 2e 3c 2f 69 3e 0a 20 20 49 4e 53 45 52  ata.</i>.  INSER
6dc0: 54 20 49 4e 54 4f 20 64 6f 63 73 20 56 41 4c 55  T INTO docs VALU
6dd0: 45 53 28 27 53 51 4c 69 74 65 20 69 73 20 61 6e  ES('SQLite is an
6de0: 20 41 43 49 44 20 63 6f 6d 70 6c 69 61 6e 74 20   ACID compliant 
6df0: 65 6d 62 65 64 64 65 64 20 72 65 6c 61 74 69 6f  embedded relatio
6e00: 6e 61 6c 20 64 61 74 61 62 61 73 65 20 6d 61 6e  nal database man
6e10: 61 67 65 6d 65 6e 74 20 73 79 73 74 65 6d 27 29  agement system')
6e20: 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 53 65 61 72 63  ;..  <i>-- Searc
6e30: 68 20 66 6f 72 20 61 20 64 6f 63 75 6d 65 6e 74  h for a document
6e40: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
6e50: 68 65 20 74 65 72 6d 73 20 22 73 71 6c 69 74 65  he terms "sqlite
6e60: 22 20 61 6e 64 20 22 64 61 74 61 62 61 73 65 22  " and "database"
6e70: 20 77 69 74 68 3c 2f 69 3e 0a 20 20 3c 69 3e 2d   with</i>.  <i>-
6e80: 2d 20 6e 6f 74 20 6d 6f 72 65 20 74 68 61 6e 20  - not more than 
6e90: 31 30 20 69 6e 74 65 72 76 65 6e 69 6e 67 20 74  10 intervening t
6ea0: 65 72 6d 73 2e 20 54 68 69 73 20 6d 61 74 63 68  erms. This match
6eb0: 65 73 20 74 68 65 20 6f 6e 6c 79 20 64 6f 63 75  es the only docu
6ec0: 6d 65 6e 74 20 69 6e 3c 2f 69 3e 0a 20 20 3c 69  ment in</i>.  <i
6ed0: 3e 2d 2d 20 74 61 62 6c 65 20 64 6f 63 73 20 28  >-- table docs (
6ee0: 73 69 6e 63 65 20 74 68 65 72 65 20 61 72 65 20  since there are 
6ef0: 6f 6e 6c 79 20 73 69 78 20 74 65 72 6d 73 20 62  only six terms b
6f00: 65 74 77 65 65 6e 20 22 53 51 4c 69 74 65 22 20  etween "SQLite" 
6f10: 61 6e 64 20 22 64 61 74 61 62 61 73 65 22 3c 2f  and "database"</
6f20: 69 3e 20 0a 20 20 3c 69 3e 2d 2d 20 69 6e 20 74  i> .  <i>-- in t
6f30: 68 65 20 64 6f 63 75 6d 65 6e 74 29 3c 2f 69 3e  he document)</i>
6f40: 2e 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  ..  SELECT * FRO
6f50: 4d 20 64 6f 63 73 20 57 48 45 52 45 20 64 6f 63  M docs WHERE doc
6f60: 73 20 4d 41 54 43 48 20 27 73 71 6c 69 74 65 20  s MATCH 'sqlite 
6f70: 4e 45 41 52 20 64 61 74 61 62 61 73 65 27 3b 0a  NEAR database';.
6f80: 0a 20 20 3c 69 3e 2d 2d 20 53 65 61 72 63 68 20  .  <i>-- Search 
6f90: 66 6f 72 20 61 20 64 6f 63 75 6d 65 6e 74 20 74  for a document t
6fa0: 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
6fb0: 20 74 65 72 6d 73 20 22 73 71 6c 69 74 65 22 20   terms "sqlite" 
6fc0: 61 6e 64 20 22 64 61 74 61 62 61 73 65 22 20 77  and "database" w
6fd0: 69 74 68 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20  ith</i>.  <i>-- 
6fe0: 6e 6f 74 20 6d 6f 72 65 20 74 68 61 6e 20 36 20  not more than 6 
6ff0: 69 6e 74 65 72 76 65 6e 69 6e 67 20 74 65 72 6d  intervening term
7000: 73 2e 20 54 68 69 73 20 61 6c 73 6f 20 6d 61 74  s. This also mat
7010: 63 68 65 73 20 74 68 65 20 6f 6e 6c 79 20 64 6f  ches the only do
7020: 63 75 6d 65 6e 74 20 69 6e 3c 2f 69 3e 0a 20 20  cument in</i>.  
7030: 3c 69 3e 2d 2d 20 74 61 62 6c 65 20 64 6f 63 73  <i>-- table docs
7040: 2e 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20  . Note that the 
7050: 6f 72 64 65 72 20 69 6e 20 77 68 69 63 68 20 74  order in which t
7060: 68 65 20 74 65 72 6d 73 20 61 70 70 65 61 72 20  he terms appear 
7070: 69 6e 20 74 68 65 20 64 6f 63 75 6d 65 6e 74 3c  in the document<
7080: 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 64 6f 65 73  /i>.  <i>-- does
7090: 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 62 65 20   not have to be 
70a0: 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20  the same as the 
70b0: 6f 72 64 65 72 20 69 6e 20 77 68 69 63 68 20 74  order in which t
70c0: 68 65 79 20 61 70 70 65 61 72 20 69 6e 20 74 68  hey appear in th
70d0: 65 20 71 75 65 72 79 2e 3c 2f 69 3e 0a 20 20 53  e query.</i>.  S
70e0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 64 6f 63  ELECT * FROM doc
70f0: 73 20 57 48 45 52 45 20 64 6f 63 73 20 4d 41 54  s WHERE docs MAT
7100: 43 48 20 27 64 61 74 61 62 61 73 65 20 4e 45 41  CH 'database NEA
7110: 52 2f 36 20 73 71 6c 69 74 65 27 3b 0a 0a 20 20  R/6 sqlite';..  
7120: 3c 69 3e 2d 2d 20 53 65 61 72 63 68 20 66 6f 72  <i>-- Search for
7130: 20 61 20 64 6f 63 75 6d 65 6e 74 20 74 68 61 74   a document that
7140: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 74 65   contains the te
7150: 72 6d 73 20 22 73 71 6c 69 74 65 22 20 61 6e 64  rms "sqlite" and
7160: 20 22 64 61 74 61 62 61 73 65 22 20 77 69 74 68   "database" with
7170: 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 6e 6f 74  </i>.  <i>-- not
7180: 20 6d 6f 72 65 20 74 68 61 6e 20 35 20 69 6e 74   more than 5 int
7190: 65 72 76 65 6e 69 6e 67 20 74 65 72 6d 73 2e 20  ervening terms. 
71a0: 54 68 69 73 20 71 75 65 72 79 20 6d 61 74 63 68  This query match
71b0: 65 73 20 6e 6f 20 64 6f 63 75 6d 65 6e 74 73 2e  es no documents.
71c0: 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20 2a 20  </i>.  SELECT * 
71d0: 46 52 4f 4d 20 64 6f 63 73 20 57 48 45 52 45 20  FROM docs WHERE 
71e0: 64 6f 63 73 20 4d 41 54 43 48 20 27 64 61 74 61  docs MATCH 'data
71f0: 62 61 73 65 20 4e 45 41 52 2f 35 20 73 71 6c 69  base NEAR/5 sqli
7200: 74 65 27 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 53 65  te';..  <i>-- Se
7210: 61 72 63 68 20 66 6f 72 20 61 20 64 6f 63 75 6d  arch for a docum
7220: 65 6e 74 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  ent that contain
7230: 73 20 74 68 65 20 70 68 72 61 73 65 20 22 41 43  s the phrase "AC
7240: 49 44 20 63 6f 6d 70 6c 69 61 6e 74 22 20 61 6e  ID compliant" an
7250: 64 20 74 68 65 20 74 65 72 6d 3c 2f 69 3e 0a 20  d the term</i>. 
7260: 20 3c 69 3e 2d 2d 20 22 64 61 74 61 62 61 73 65   <i>-- "database
7270: 22 20 77 69 74 68 20 6e 6f 74 20 6d 6f 72 65 20  " with not more 
7280: 74 68 61 6e 20 32 20 74 65 72 6d 73 20 73 65 70  than 2 terms sep
7290: 61 72 61 74 69 6e 67 20 74 68 65 20 74 77 6f 2e  arating the two.
72a0: 20 54 68 69 73 20 6d 61 74 63 68 65 73 20 74 68   This matches th
72b0: 65 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 64 6f  e</i>.  <i>-- do
72c0: 63 75 6d 65 6e 74 20 73 74 6f 72 65 64 20 69 6e  cument stored in
72d0: 20 74 61 62 6c 65 20 64 6f 63 73 2e 3c 2f 69 3e   table docs.</i>
72e0: 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  .  SELECT * FROM
72f0: 20 64 6f 63 73 20 57 48 45 52 45 20 64 6f 63 73   docs WHERE docs
7300: 20 4d 41 54 43 48 20 27 64 61 74 61 62 61 73 65   MATCH 'database
7310: 20 4e 45 41 52 2f 32 20 22 41 43 49 44 20 63 6f   NEAR/2 "ACID co
7320: 6d 70 6c 69 61 6e 74 22 27 3b 0a 0a 20 20 3c 69  mpliant"';..  <i
7330: 3e 2d 2d 20 53 65 61 72 63 68 20 66 6f 72 20 61  >-- Search for a
7340: 20 64 6f 63 75 6d 65 6e 74 20 74 68 61 74 20 63   document that c
7350: 6f 6e 74 61 69 6e 73 20 74 68 65 20 70 68 72 61  ontains the phra
7360: 73 65 20 22 41 43 49 44 20 63 6f 6d 70 6c 69 61  se "ACID complia
7370: 6e 74 22 20 61 6e 64 20 74 68 65 20 74 65 72 6d  nt" and the term
7380: 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 22 73 71  </i>.  <i>-- "sq
7390: 6c 69 74 65 22 20 77 69 74 68 20 6e 6f 74 20 6d  lite" with not m
73a0: 6f 72 65 20 74 68 61 6e 20 32 20 74 65 72 6d 73  ore than 2 terms
73b0: 20 73 65 70 61 72 61 74 69 6e 67 20 74 68 65 20   separating the 
73c0: 74 77 6f 2e 20 54 68 69 73 20 61 6c 73 6f 20 6d  two. This also m
73d0: 61 74 63 68 65 73 3c 2f 69 3e 0a 20 20 3c 69 3e  atches</i>.  <i>
73e0: 2d 2d 20 74 68 65 20 6f 6e 6c 79 20 64 6f 63 75  -- the only docu
73f0: 6d 65 6e 74 20 73 74 6f 72 65 64 20 69 6e 20 74  ment stored in t
7400: 61 62 6c 65 20 64 6f 63 73 2e 3c 2f 69 3e 0a 20  able docs.</i>. 
7410: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 64   SELECT * FROM d
7420: 6f 63 73 20 57 48 45 52 45 20 64 6f 63 73 20 4d  ocs WHERE docs M
7430: 41 54 43 48 20 27 22 41 43 49 44 20 63 6f 6d 70  ATCH '"ACID comp
7440: 6c 69 61 6e 74 22 20 4e 45 41 52 2f 32 20 73 71  liant" NEAR/2 sq
7450: 6c 69 74 65 27 3b 0a 3c 2f 63 6f 64 65 62 6c 6f  lite';.</codeblo
7460: 63 6b 3e 0a 0a 3c 75 6c 3e 0a 20 20 3c 6c 69 20  ck>..<ul>.  <li 
7470: 73 74 79 6c 65 3d 22 6c 69 73 74 2d 73 74 79 6c  style="list-styl
7480: 65 3a 20 6e 6f 6e 65 22 3e 3c 70 3e 0a 20 20 20  e: none"><p>.   
7490: 20 4d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 4e   More than one N
74a0: 45 41 52 20 6f 70 65 72 61 74 6f 72 20 6d 61 79  EAR operator may
74b0: 20 61 70 70 65 61 72 20 69 6e 20 61 20 73 69 6e   appear in a sin
74c0: 67 6c 65 20 71 75 65 72 79 2e 20 49 6e 20 74 68  gle query. In th
74d0: 69 73 20 63 61 73 65 20 65 61 63 68 0a 20 20 20  is case each.   
74e0: 20 70 61 69 72 20 6f 66 20 74 65 72 6d 73 20 6f   pair of terms o
74f0: 72 20 70 68 72 61 73 65 73 20 73 65 70 61 72 61  r phrases separa
7500: 74 65 64 20 62 79 20 61 20 4e 45 41 52 20 6f 70  ted by a NEAR op
7510: 65 72 61 74 6f 72 20 6d 75 73 74 20 61 70 70 65  erator must appe
7520: 61 72 20 77 69 74 68 69 6e 20 74 68 65 0a 20 20  ar within the.  
7530: 20 20 73 70 65 63 69 66 69 65 64 20 70 72 6f 78    specified prox
7540: 69 6d 69 74 79 20 6f 66 20 65 61 63 68 20 6f 74  imity of each ot
7550: 68 65 72 20 69 6e 20 74 68 65 20 64 6f 63 75 6d  her in the docum
7560: 65 6e 74 2e 20 55 73 69 6e 67 20 74 68 65 20 73  ent. Using the s
7570: 61 6d 65 20 74 61 62 6c 65 20 61 6e 64 0a 20 20  ame table and.  
7580: 20 20 64 61 74 61 20 61 73 20 69 6e 20 74 68 65    data as in the
7590: 20 62 6c 6f 63 6b 20 6f 66 20 65 78 61 6d 70 6c   block of exampl
75a0: 65 73 20 61 62 6f 76 65 3a 0a 3c 2f 75 6c 3e 0a  es above:.</ul>.
75b0: 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e 20 0a 20 20  .<codeblock> .  
75c0: 3c 69 3e 2d 2d 20 54 68 65 20 66 6f 6c 6c 6f 77  <i>-- The follow
75d0: 69 6e 67 20 71 75 65 72 79 20 73 65 6c 65 63 74  ing query select
75e0: 73 20 64 6f 63 75 6d 65 6e 74 73 20 74 68 61 74  s documents that
75f0: 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 69 6e 73   contains an ins
7600: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 74 65 72  tance of the ter
7610: 6d 20 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 22  m </i>.  <i>-- "
7620: 73 71 6c 69 74 65 22 20 73 65 70 61 72 61 74 65  sqlite" separate
7630: 64 20 62 79 20 74 77 6f 20 6f 72 20 66 65 77 65  d by two or fewe
7640: 72 20 74 65 72 6d 73 20 66 72 6f 6d 20 61 6e 20  r terms from an 
7650: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
7660: 74 65 72 6d 20 22 61 63 69 64 22 2c 3c 2f 69 3e  term "acid",</i>
7670: 0a 20 20 3c 69 3e 2d 2d 20 77 68 69 63 68 20 69  .  <i>-- which i
7680: 73 20 69 6e 20 74 75 72 6e 20 73 65 70 61 72 61  s in turn separa
7690: 74 65 64 20 62 79 20 74 77 6f 20 6f 72 20 66 65  ted by two or fe
76a0: 77 65 72 20 74 65 72 6d 73 20 66 72 6f 6d 20 61  wer terms from a
76b0: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
76c0: 65 20 74 65 72 6d 3c 2f 69 3e 0a 20 20 3c 69 3e  e term</i>.  <i>
76d0: 2d 2d 20 22 72 65 6c 61 74 69 6f 6e 61 6c 22 2e  -- "relational".
76e0: 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20 2a 20  </i>.  SELECT * 
76f0: 46 52 4f 4d 20 64 6f 63 73 20 57 48 45 52 45 20  FROM docs WHERE 
7700: 64 6f 63 73 20 4d 41 54 43 48 20 27 73 71 6c 69  docs MATCH 'sqli
7710: 74 65 20 4e 45 41 52 2f 32 20 61 63 69 64 20 4e  te NEAR/2 acid N
7720: 45 41 52 2f 32 20 72 65 6c 61 74 69 6f 6e 61 6c  EAR/2 relational
7730: 27 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 54 68 69 73  ';..  <i>-- This
7740: 20 71 75 65 72 79 20 6d 61 74 63 68 65 73 20 6e   query matches n
7750: 6f 20 64 6f 63 75 6d 65 6e 74 73 2e 20 54 68 65  o documents. The
7760: 72 65 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63  re is an instanc
7770: 65 20 6f 66 20 74 68 65 20 74 65 72 6d 20 22 73  e of the term "s
7780: 71 6c 69 74 65 22 20 77 69 74 68 3c 2f 69 3e 0a  qlite" with</i>.
7790: 20 20 3c 69 3e 2d 2d 20 73 75 66 66 69 63 69 65    <i>-- sufficie
77a0: 6e 74 20 70 72 6f 78 69 6d 69 74 79 20 74 6f 20  nt proximity to 
77b0: 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 22  an instance of "
77c0: 61 63 69 64 22 20 62 75 74 20 69 74 20 69 73 20  acid" but it is 
77d0: 6e 6f 74 20 73 75 66 66 69 63 69 65 6e 74 6c 79  not sufficiently
77e0: 20 63 6c 6f 73 65 3c 2f 69 3e 0a 20 20 3c 69 3e   close</i>.  <i>
77f0: 2d 2d 20 74 6f 20 61 6e 20 69 6e 73 74 61 6e 63  -- to an instanc
7800: 65 20 6f 66 20 74 68 65 20 74 65 72 6d 20 22 72  e of the term "r
7810: 65 6c 61 74 69 6f 6e 61 6c 22 2e 3c 2f 69 3e 0a  elational".</i>.
7820: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
7830: 64 6f 63 73 20 57 48 45 52 45 20 64 6f 63 73 20  docs WHERE docs 
7840: 4d 41 54 43 48 20 27 61 63 69 64 20 4e 45 41 52  MATCH 'acid NEAR
7850: 2f 32 20 73 71 6c 69 74 65 20 4e 45 41 52 2f 32  /2 sqlite NEAR/2
7860: 20 72 65 6c 61 74 69 6f 6e 61 6c 27 3b 0a 3c 2f   relational';.</
7870: 63 6f 64 65 62 6c 6f 63 6b 3e 0a 0a 3c 70 3e 0a  codeblock>..<p>.
7880: 20 20 50 68 72 61 73 65 20 61 6e 64 20 4e 45 41    Phrase and NEA
7890: 52 20 71 75 65 72 69 65 73 20 6d 61 79 20 6e 6f  R queries may no
78a0: 74 20 73 70 61 6e 20 6d 75 6c 74 69 70 6c 65 20  t span multiple 
78b0: 63 6f 6c 75 6d 6e 73 20 77 69 74 68 69 6e 20 61  columns within a
78c0: 20 72 6f 77 2e 0a 0a 3c 70 3e 0a 20 20 54 68 65   row...<p>.  The
78d0: 20 74 68 72 65 65 20 62 61 73 69 63 20 71 75 65   three basic que
78e0: 72 79 20 74 79 70 65 73 20 64 65 73 63 72 69 62  ry types describ
78f0: 65 64 20 61 62 6f 76 65 20 6d 61 79 20 62 65 20  ed above may be 
7900: 75 73 65 64 20 74 6f 20 71 75 65 72 79 20 74 68  used to query th
7910: 65 20 66 75 6c 6c 2d 74 65 78 74 0a 20 20 69 6e  e full-text.  in
7920: 64 65 78 20 66 6f 72 20 74 68 65 20 73 65 74 20  dex for the set 
7930: 6f 66 20 64 6f 63 75 6d 65 6e 74 73 20 74 68 61  of documents tha
7940: 74 20 6d 61 74 63 68 20 74 68 65 20 73 70 65 63  t match the spec
7950: 69 66 69 65 64 20 63 72 69 74 65 72 69 61 2e 20  ified criteria. 
7960: 55 73 69 6e 67 20 74 68 65 0a 20 20 46 54 53 20  Using the.  FTS 
7970: 71 75 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e  query expression
7980: 20 6c 61 6e 67 75 61 67 65 20 69 74 20 69 73 20   language it is 
7990: 70 6f 73 73 69 62 6c 65 20 74 6f 20 70 65 72 66  possible to perf
79a0: 6f 72 6d 20 76 61 72 69 6f 75 73 20 73 65 74 20  orm various set 
79b0: 0a 20 20 6f 70 65 72 61 74 69 6f 6e 73 20 6f 6e  .  operations on
79c0: 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20   the results of 
79d0: 62 61 73 69 63 20 71 75 65 72 69 65 73 2e 20 54  basic queries. T
79e0: 68 65 72 65 20 61 72 65 20 63 75 72 72 65 6e 74  here are current
79f0: 6c 79 20 74 68 72 65 65 20 0a 20 20 73 75 70 70  ly three .  supp
7a00: 6f 72 74 65 64 20 6f 70 65 72 61 74 69 6f 6e 73  orted operations
7a10: 3a 0a 0a 3c 75 6c 3e 0a 20 20 3c 6c 69 3e 20 54  :..<ul>.  <li> T
7a20: 68 65 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 20  he AND operator 
7a30: 64 65 74 65 72 6d 69 6e 65 73 20 74 68 65 20 3c  determines the <
7a40: 62 3e 69 6e 74 65 72 73 65 63 74 69 6f 6e 3c 2f  b>intersection</
7a50: 62 3e 20 6f 66 20 74 77 6f 20 73 65 74 73 20 6f  b> of two sets o
7a60: 66 20 64 6f 63 75 6d 65 6e 74 73 2e 0a 0a 20 20  f documents...  
7a70: 3c 6c 69 3e 20 54 68 65 20 4f 52 20 6f 70 65 72  <li> The OR oper
7a80: 61 74 6f 72 20 63 61 6c 63 75 6c 61 74 65 73 20  ator calculates 
7a90: 74 68 65 20 3c 62 3e 75 6e 69 6f 6e 3c 2f 62 3e  the <b>union</b>
7aa0: 20 6f 66 20 74 77 6f 20 73 65 74 73 20 6f 66 20   of two sets of 
7ab0: 64 6f 63 75 6d 65 6e 74 73 2e 0a 0a 20 20 3c 6c  documents...  <l
7ac0: 69 3e 20 54 68 65 20 4e 4f 54 20 6f 70 65 72 61  i> The NOT opera
7ad0: 74 6f 72 20 28 6f 72 2c 20 69 66 20 75 73 69 6e  tor (or, if usin
7ae0: 67 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 73  g the standard s
7af0: 79 6e 74 61 78 2c 20 61 20 75 6e 61 72 79 20 22  yntax, a unary "
7b00: 2d 22 20 6f 70 65 72 61 74 6f 72 29 0a 20 20 20  -" operator).   
7b10: 20 20 20 20 6d 61 79 20 62 65 20 75 73 65 64 20      may be used 
7b20: 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20 3c  to compute the <
7b30: 62 3e 72 65 6c 61 74 69 76 65 20 63 6f 6d 70 6c  b>relative compl
7b40: 65 6d 65 6e 74 3c 2f 62 3e 20 6f 66 20 6f 6e 65  ement</b> of one
7b50: 20 73 65 74 20 6f 66 0a 20 20 20 20 20 20 20 64   set of.       d
7b60: 6f 63 75 6d 65 6e 74 73 20 77 69 74 68 20 72 65  ocuments with re
7b70: 73 70 65 63 74 20 74 6f 20 61 6e 6f 74 68 65 72  spect to another
7b80: 2e 0a 3c 2f 75 6c 3e 0a 0a 3c 70 3e 0a 20 20 54  ..</ul>..<p>.  T
7b90: 68 65 20 46 54 53 20 6d 6f 64 75 6c 65 73 20 6d  he FTS modules m
7ba0: 61 79 20 62 65 20 63 6f 6d 70 69 6c 65 64 20 74  ay be compiled t
7bb0: 6f 20 75 73 65 20 6f 6e 65 20 6f 66 20 74 77 6f  o use one of two
7bc0: 20 73 6c 69 67 68 74 6c 79 20 64 69 66 66 65 72   slightly differ
7bd0: 65 6e 74 20 76 65 72 73 69 6f 6e 73 0a 20 20 6f  ent versions.  o
7be0: 66 20 74 68 65 20 66 75 6c 6c 2d 74 65 78 74 20  f the full-text 
7bf0: 71 75 65 72 79 20 73 79 6e 74 61 78 2c 20 74 68  query syntax, th
7c00: 65 20 22 73 74 61 6e 64 61 72 64 22 20 71 75 65  e "standard" que
7c10: 72 79 20 73 79 6e 74 61 78 20 61 6e 64 20 74 68  ry syntax and th
7c20: 65 20 22 65 6e 68 61 6e 63 65 64 22 20 0a 20 20  e "enhanced" .  
7c30: 71 75 65 72 79 20 73 79 6e 74 61 78 2e 20 54 68  query syntax. Th
7c40: 65 20 62 61 73 69 63 20 74 65 72 6d 2c 20 74 65  e basic term, te
7c50: 72 6d 2d 70 72 65 66 69 78 2c 20 70 68 72 61 73  rm-prefix, phras
7c60: 65 20 61 6e 64 20 4e 45 41 52 20 71 75 65 72 69  e and NEAR queri
7c70: 65 73 20 64 65 73 63 72 69 62 65 64 20 0a 20 20  es described .  
7c80: 61 62 6f 76 65 20 61 72 65 20 74 68 65 20 73 61  above are the sa
7c90: 6d 65 20 69 6e 20 62 6f 74 68 20 76 65 72 73 69  me in both versi
7ca0: 6f 6e 73 20 6f 66 20 74 68 65 20 73 79 6e 74 61  ons of the synta
7cb0: 78 2e 20 54 68 65 20 77 61 79 20 69 6e 20 77 68  x. The way in wh
7cc0: 69 63 68 20 73 65 74 20 0a 20 20 6f 70 65 72 61  ich set .  opera
7cd0: 74 69 6f 6e 73 20 61 72 65 20 73 70 65 63 69 66  tions are specif
7ce0: 69 65 64 20 69 73 20 73 6c 69 67 68 74 6c 79 20  ied is slightly 
7cf0: 64 69 66 66 65 72 65 6e 74 2e 20 54 68 65 20 66  different. The f
7d00: 6f 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 73 75 62  ollowing two sub
7d10: 2d 73 65 63 74 69 6f 6e 73 20 0a 20 20 64 65 73  -sections .  des
7d20: 63 72 69 62 65 20 74 68 65 20 70 61 72 74 20 6f  cribe the part o
7d30: 66 20 74 68 65 20 74 77 6f 20 71 75 65 72 79 20  f the two query 
7d40: 73 79 6e 74 61 78 65 73 20 74 68 61 74 20 70 65  syntaxes that pe
7d50: 72 74 61 69 6e 73 20 74 6f 20 73 65 74 20 6f 70  rtains to set op
7d60: 65 72 61 74 69 6f 6e 73 2e 20 0a 20 20 52 65 66  erations. .  Ref
7d70: 65 72 20 74 6f 20 74 68 65 20 64 65 73 63 72 69  er to the descri
7d80: 70 74 69 6f 6e 20 6f 66 20 68 6f 77 20 74 6f 20  ption of how to 
7d90: 5b 63 6f 6d 70 69 6c 65 20 66 74 73 5d 20 66 6f  [compile fts] fo
7da0: 72 20 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 6e 6f  r compilation no
7db0: 74 65 73 2e 0a 0a 3c 68 32 20 74 61 67 73 3d 22  tes...<h2 tags="
7dc0: 65 6e 68 61 6e 63 65 64 20 71 75 65 72 79 20 73  enhanced query s
7dd0: 79 6e 74 61 78 22 3e 0a 20 20 53 65 74 20 4f 70  yntax">.  Set Op
7de0: 65 72 61 74 69 6f 6e 73 20 55 73 69 6e 67 20 54  erations Using T
7df0: 68 65 20 45 6e 68 61 6e 63 65 64 20 51 75 65 72  he Enhanced Quer
7e00: 79 20 53 79 6e 74 61 78 3c 2f 68 32 3e 0a 0a 3c  y Syntax</h2>..<
7e10: 70 3e 0a 20 20 54 68 65 20 65 6e 68 61 6e 63 65  p>.  The enhance
7e20: 64 20 71 75 65 72 79 20 73 79 6e 74 61 78 20 73  d query syntax s
7e30: 75 70 70 6f 72 74 73 20 74 68 65 20 41 4e 44 2c  upports the AND,
7e40: 20 4f 52 20 61 6e 64 20 4e 4f 54 20 62 69 6e 61   OR and NOT bina
7e50: 72 79 20 73 65 74 20 6f 70 65 72 61 74 6f 72 73  ry set operators
7e60: 2e 0a 20 20 45 61 63 68 20 6f 66 20 74 68 65 20  ..  Each of the 
7e70: 74 77 6f 20 6f 70 65 72 61 6e 64 73 20 74 6f 20  two operands to 
7e80: 61 6e 20 6f 70 65 72 61 74 6f 72 20 6d 61 79 20  an operator may 
7e90: 62 65 20 61 20 62 61 73 69 63 20 46 54 53 20 71  be a basic FTS q
7ea0: 75 65 72 79 2c 20 6f 72 20 74 68 65 0a 20 20 72  uery, or the.  r
7eb0: 65 73 75 6c 74 20 6f 66 20 61 6e 6f 74 68 65 72  esult of another
7ec0: 20 41 4e 44 2c 20 4f 52 20 6f 72 20 4e 4f 54 20   AND, OR or NOT 
7ed0: 73 65 74 20 6f 70 65 72 61 74 69 6f 6e 2e 20 4f  set operation. O
7ee0: 70 65 72 61 74 6f 72 73 20 6d 75 73 74 20 62 65  perators must be
7ef0: 20 65 6e 74 65 72 65 64 0a 20 20 75 73 69 6e 67   entered.  using
7f00: 20 63 61 70 69 74 61 6c 20 6c 65 74 74 65 72 73   capital letters
7f10: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65  . Otherwise, the
7f20: 79 20 61 72 65 20 69 6e 74 65 72 70 72 65 74 65  y are interprete
7f30: 64 20 61 73 20 62 61 73 69 63 20 74 65 72 6d 20  d as basic term 
7f40: 71 75 65 72 69 65 73 0a 20 20 69 6e 73 74 65 61  queries.  instea
7f50: 64 20 6f 66 20 73 65 74 20 6f 70 65 72 61 74 6f  d of set operato
7f60: 72 73 2e 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 41  rs...<p>.  The A
7f70: 4e 44 20 6f 70 65 72 61 74 6f 72 20 6d 61 79 20  ND operator may 
7f80: 62 65 20 69 6d 70 6c 69 63 69 74 6c 79 20 73 70  be implicitly sp
7f90: 65 63 69 66 69 65 64 2e 20 49 66 20 74 77 6f 20  ecified. If two 
7fa0: 62 61 73 69 63 20 71 75 65 72 69 65 73 20 61 70  basic queries ap
7fb0: 70 65 61 72 20 0a 20 20 77 69 74 68 20 6e 6f 20  pear .  with no 
7fc0: 6f 70 65 72 61 74 6f 72 20 73 65 70 61 72 61 74  operator separat
7fd0: 69 6e 67 20 74 68 65 6d 20 69 6e 20 61 6e 20 46  ing them in an F
7fe0: 54 53 20 71 75 65 72 79 20 73 74 72 69 6e 67 2c  TS query string,
7ff0: 20 74 68 65 20 72 65 73 75 6c 74 73 20 61 72 65   the results are
8000: 0a 20 20 74 68 65 20 73 61 6d 65 20 61 73 20 69  .  the same as i
8010: 66 20 74 68 65 20 74 77 6f 20 62 61 73 69 63 20  f the two basic 
8020: 71 75 65 72 69 65 73 20 77 65 72 65 20 73 65 70  queries were sep
8030: 61 72 61 74 65 64 20 62 79 20 61 6e 20 41 4e 44  arated by an AND
8040: 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 46 6f 72   operator..  For
8050: 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 71 75   example, the qu
8060: 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20 22  ery expression "
8070: 69 6d 70 6c 69 63 69 74 20 6f 70 65 72 61 74 6f  implicit operato
8080: 72 22 20 69 73 20 61 20 6d 6f 72 65 20 73 75 63  r" is a more suc
8090: 63 69 6e 63 74 0a 20 20 76 65 72 73 69 6f 6e 20  cinct.  version 
80a0: 6f 66 20 22 69 6d 70 6c 69 63 69 74 20 41 4e 44  of "implicit AND
80b0: 20 6f 70 65 72 61 74 6f 72 22 2e 0a 0a 3c 63 6f   operator"...<co
80c0: 64 65 62 6c 6f 63 6b 3e 0a 20 20 3c 69 3e 2d 2d  deblock>.  <i>--
80d0: 20 56 69 72 74 75 61 6c 20 74 61 62 6c 65 20 64   Virtual table d
80e0: 65 63 6c 61 72 61 74 69 6f 6e 3c 2f 69 3e 0a 20  eclaration</i>. 
80f0: 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20   CREATE VIRTUAL 
8100: 54 41 42 4c 45 20 64 6f 63 73 20 55 53 49 4e 47  TABLE docs USING
8110: 20 66 74 73 33 28 29 3b 0a 0a 20 20 3c 69 3e 2d   fts3();..  <i>-
8120: 2d 20 56 69 72 74 75 61 6c 20 74 61 62 6c 65 20  - Virtual table 
8130: 64 61 74 61 3c 2f 69 3e 0a 20 20 49 4e 53 45 52  data</i>.  INSER
8140: 54 20 49 4e 54 4f 20 64 6f 63 73 28 64 6f 63 69  T INTO docs(doci
8150: 64 2c 20 63 6f 6e 74 65 6e 74 29 20 56 41 4c 55  d, content) VALU
8160: 45 53 28 31 2c 20 27 61 20 64 61 74 61 62 61 73  ES(1, 'a databas
8170: 65 20 69 73 20 61 20 73 6f 66 74 77 61 72 65 20  e is a software 
8180: 73 79 73 74 65 6d 27 29 3b 0a 20 20 49 4e 53 45  system');.  INSE
8190: 52 54 20 49 4e 54 4f 20 64 6f 63 73 28 64 6f 63  RT INTO docs(doc
81a0: 69 64 2c 20 63 6f 6e 74 65 6e 74 29 20 56 41 4c  id, content) VAL
81b0: 55 45 53 28 32 2c 20 27 73 71 6c 69 74 65 20 69  UES(2, 'sqlite i
81c0: 73 20 61 20 73 6f 66 74 77 61 72 65 20 73 79 73  s a software sys
81d0: 74 65 6d 27 29 3b 0a 20 20 49 4e 53 45 52 54 20  tem');.  INSERT 
81e0: 49 4e 54 4f 20 64 6f 63 73 28 64 6f 63 69 64 2c  INTO docs(docid,
81f0: 20 63 6f 6e 74 65 6e 74 29 20 56 41 4c 55 45 53   content) VALUES
8200: 28 33 2c 20 27 73 71 6c 69 74 65 20 69 73 20 61  (3, 'sqlite is a
8210: 20 64 61 74 61 62 61 73 65 27 29 3b 0a 0a 20 20   database');..  
8220: 3c 69 3e 2d 2d 20 52 65 74 75 72 6e 20 74 68 65  <i>-- Return the
8230: 20 73 65 74 20 6f 66 20 64 6f 63 75 6d 65 6e 74   set of document
8240: 73 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 20 74  s that contain t
8250: 68 65 20 74 65 72 6d 20 22 73 71 6c 69 74 65 22  he term "sqlite"
8260: 2c 20 61 6e 64 20 74 68 65 3c 2f 69 3e 0a 20 20  , and the</i>.  
8270: 3c 69 3e 2d 2d 20 74 65 72 6d 20 22 64 61 74 61  <i>-- term "data
8280: 62 61 73 65 22 2e 20 54 68 69 73 20 71 75 65 72  base". This quer
8290: 79 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 74 68  y will return th
82a0: 65 20 64 6f 63 75 6d 65 6e 74 20 77 69 74 68 20  e document with 
82b0: 64 6f 63 69 64 20 33 20 6f 6e 6c 79 2e 3c 2f 69  docid 3 only.</i
82c0: 3e 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  >.  SELECT * FRO
82d0: 4d 20 64 6f 63 73 20 57 48 45 52 45 20 64 6f 63  M docs WHERE doc
82e0: 73 20 4d 41 54 43 48 20 27 73 71 6c 69 74 65 20  s MATCH 'sqlite 
82f0: 41 4e 44 20 64 61 74 61 62 61 73 65 27 3b 0a 0a  AND database';..
8300: 20 20 3c 69 3e 2d 2d 20 41 67 61 69 6e 2c 20 72    <i>-- Again, r
8310: 65 74 75 72 6e 20 74 68 65 20 73 65 74 20 6f 66  eturn the set of
8320: 20 64 6f 63 75 6d 65 6e 74 73 20 74 68 61 74 20   documents that 
8330: 63 6f 6e 74 61 69 6e 20 62 6f 74 68 20 22 73 71  contain both "sq
8340: 6c 69 74 65 22 20 61 6e 64 3c 2f 69 3e 0a 20 20  lite" and</i>.  
8350: 3c 69 3e 2d 2d 20 22 64 61 74 61 62 61 73 65 22  <i>-- "database"
8360: 2e 20 54 68 69 73 20 74 69 6d 65 2c 20 75 73 65  . This time, use
8370: 20 61 6e 20 69 6d 70 6c 69 63 69 74 20 41 4e 44   an implicit AND
8380: 20 6f 70 65 72 61 74 6f 72 2e 20 41 67 61 69 6e   operator. Again
8390: 2c 20 64 6f 63 75 6d 65 6e 74 3c 2f 69 3e 0a 20  , document</i>. 
83a0: 20 3c 69 3e 2d 2d 20 33 20 69 73 20 74 68 65 20   <i>-- 3 is the 
83b0: 6f 6e 6c 79 20 64 6f 63 75 6d 65 6e 74 20 6d 61  only document ma
83c0: 74 63 68 65 64 20 62 79 20 74 68 69 73 20 71 75  tched by this qu
83d0: 65 72 79 2e 20 3c 2f 69 3e 0a 20 20 53 45 4c 45  ery. </i>.  SELE
83e0: 43 54 20 2a 20 46 52 4f 4d 20 64 6f 63 73 20 57  CT * FROM docs W
83f0: 48 45 52 45 20 64 6f 63 73 20 4d 41 54 43 48 20  HERE docs MATCH 
8400: 27 64 61 74 61 62 61 73 65 20 73 71 6c 69 74 65  'database sqlite
8410: 27 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 51 75 65 72  ';..  <i>-- Quer
8420: 79 20 66 6f 72 20 74 68 65 20 73 65 74 20 6f 66  y for the set of
8430: 20 64 6f 63 75 6d 65 6e 74 73 20 74 68 61 74 20   documents that 
8440: 63 6f 6e 74 61 69 6e 73 20 65 69 74 68 65 72 20  contains either 
8450: 22 73 71 6c 69 74 65 22 20 6f 72 20 22 64 61 74  "sqlite" or "dat
8460: 61 62 61 73 65 22 2e 3c 2f 69 3e 0a 20 20 3c 69  abase".</i>.  <i
8470: 3e 2d 2d 20 41 6c 6c 20 74 68 72 65 65 20 64 6f  >-- All three do
8480: 63 75 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 64  cuments in the d
8490: 61 74 61 62 61 73 65 20 61 72 65 20 6d 61 74 63  atabase are matc
84a0: 68 65 64 20 62 79 20 74 68 69 73 20 71 75 65 72  hed by this quer
84b0: 79 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20  y.</i>.  SELECT 
84c0: 2a 20 46 52 4f 4d 20 64 6f 63 73 20 57 48 45 52  * FROM docs WHER
84d0: 45 20 64 6f 63 73 20 4d 41 54 43 48 20 27 73 71  E docs MATCH 'sq
84e0: 6c 69 74 65 20 4f 52 20 64 61 74 61 62 61 73 65  lite OR database
84f0: 27 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 51 75 65 72  ';..  <i>-- Quer
8500: 79 20 66 6f 72 20 61 6c 6c 20 64 6f 63 75 6d 65  y for all docume
8510: 6e 74 73 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  nts that contain
8520: 20 74 68 65 20 74 65 72 6d 20 22 64 61 74 61 62   the term "datab
8530: 61 73 65 22 2c 20 62 75 74 20 64 6f 20 6e 6f 74  ase", but do not
8540: 20 63 6f 6e 74 61 69 6e 3c 2f 69 3e 0a 20 20 3c   contain</i>.  <
8550: 69 3e 2d 2d 20 74 68 65 20 74 65 72 6d 20 22 73  i>-- the term "s
8560: 71 6c 69 74 65 22 2e 20 44 6f 63 75 6d 65 6e 74  qlite". Document
8570: 20 31 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 64   1 is the only d
8580: 6f 63 75 6d 65 6e 74 20 74 68 61 74 20 6d 61 74  ocument that mat
8590: 63 68 65 73 20 74 68 69 73 20 63 72 69 74 65 72  ches this criter
85a0: 69 61 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54  ia.</i>.  SELECT
85b0: 20 2a 20 46 52 4f 4d 20 64 6f 63 73 20 57 48 45   * FROM docs WHE
85c0: 52 45 20 64 6f 63 73 20 4d 41 54 43 48 20 27 64  RE docs MATCH 'd
85d0: 61 74 61 62 61 73 65 20 4e 4f 54 20 73 71 6c 69  atabase NOT sqli
85e0: 74 65 27 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 54 68  te';..  <i>-- Th
85f0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 71 75 65 72  e following quer
8600: 79 20 6d 61 74 63 68 65 73 20 6e 6f 20 64 6f 63  y matches no doc
8610: 75 6d 65 6e 74 73 2e 20 42 65 63 61 75 73 65 20  uments. Because 
8620: 22 61 6e 64 22 20 69 73 20 69 6e 20 6c 6f 77 65  "and" is in lowe
8630: 72 63 61 73 65 20 6c 65 74 74 65 72 73 2c 3c 2f  rcase letters,</
8640: 69 3e 0a 20 20 3c 69 3e 2d 2d 20 69 74 20 69 73  i>.  <i>-- it is
8650: 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20   interpreted as 
8660: 61 20 62 61 73 69 63 20 74 65 72 6d 20 71 75 65  a basic term que
8670: 72 79 20 69 6e 73 74 65 61 64 20 6f 66 20 61 6e  ry instead of an
8680: 20 6f 70 65 72 61 74 6f 72 2e 20 4f 70 65 72 61   operator. Opera
8690: 74 6f 72 73 20 6d 75 73 74 3c 2f 69 3e 0a 20 20  tors must</i>.  
86a0: 3c 69 3e 2d 2d 20 62 65 20 73 70 65 63 69 66 69  <i>-- be specifi
86b0: 65 64 20 75 73 69 6e 67 20 63 61 70 69 74 61 6c  ed using capital
86c0: 20 6c 65 74 74 65 72 73 2e 20 49 6e 20 70 72 61   letters. In pra
86d0: 63 74 69 63 65 2c 20 74 68 69 73 20 71 75 65 72  ctice, this quer
86e0: 79 20 77 69 6c 6c 20 6d 61 74 63 68 20 61 6e 79  y will match any
86f0: 20 64 6f 63 75 6d 65 6e 74 73 3c 2f 69 3e 0a 20   documents</i>. 
8700: 20 3c 69 3e 2d 2d 20 74 68 61 74 20 63 6f 6e 74   <i>-- that cont
8710: 61 69 6e 20 65 61 63 68 20 6f 66 20 74 68 65 20  ain each of the 
8720: 74 68 72 65 65 20 74 65 72 6d 73 20 22 64 61 74  three terms "dat
8730: 61 62 61 73 65 22 2c 20 22 61 6e 64 22 20 61 6e  abase", "and" an
8740: 64 20 22 73 71 6c 69 74 65 22 20 61 74 20 6c 65  d "sqlite" at le
8750: 61 73 74 20 6f 6e 63 65 2e 3c 2f 69 3e 0a 20 20  ast once.</i>.  
8760: 3c 69 3e 2d 2d 20 4e 6f 20 64 6f 63 75 6d 65 6e  <i>-- No documen
8770: 74 73 20 69 6e 20 74 68 65 20 65 78 61 6d 70 6c  ts in the exampl
8780: 65 20 64 61 74 61 20 61 62 6f 76 65 20 6d 61 74  e data above mat
8790: 63 68 20 74 68 69 73 20 63 72 69 74 65 72 69 61  ch this criteria
87a0: 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20 2a  .</i>.  SELECT *
87b0: 20 46 52 4f 4d 20 64 6f 63 73 20 57 48 45 52 45   FROM docs WHERE
87c0: 20 64 6f 63 73 20 4d 41 54 43 48 20 27 64 61 74   docs MATCH 'dat
87d0: 61 62 61 73 65 20 61 6e 64 20 73 71 6c 69 74 65  abase and sqlite
87e0: 27 3b 0a 3c 2f 63 6f 64 65 62 6c 6f 63 6b 3e 0a  ';.</codeblock>.
87f0: 0a 3c 70 3e 0a 20 20 54 68 65 20 65 78 61 6d 70  .<p>.  The examp
8800: 6c 65 73 20 61 62 6f 76 65 20 61 6c 6c 20 75 73  les above all us
8810: 65 20 62 61 73 69 63 20 66 75 6c 6c 2d 74 65 78  e basic full-tex
8820: 74 20 74 65 72 6d 20 71 75 65 72 69 65 73 20 61  t term queries a
8830: 73 20 62 6f 74 68 20 6f 70 65 72 61 6e 64 73 20  s both operands 
8840: 6f 66 20 0a 20 20 74 68 65 20 73 65 74 20 6f 70  of .  the set op
8850: 65 72 61 74 69 6f 6e 73 20 64 65 6d 6f 6e 73 74  erations demonst
8860: 72 61 74 65 64 2e 20 50 68 72 61 73 65 20 61 6e  rated. Phrase an
8870: 64 20 4e 45 41 52 20 71 75 65 72 69 65 73 20 6d  d NEAR queries m
8880: 61 79 20 61 6c 73 6f 20 62 65 20 75 73 65 64 2c  ay also be used,
8890: 0a 20 20 61 73 20 6d 61 79 20 74 68 65 20 72 65  .  as may the re
88a0: 73 75 6c 74 73 20 6f 66 20 6f 74 68 65 72 20 73  sults of other s
88b0: 65 74 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20 57  et operations. W
88c0: 68 65 6e 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  hen more than on
88d0: 65 20 73 65 74 20 6f 70 65 72 61 74 69 6f 6e 0a  e set operation.
88e0: 20 20 69 73 20 70 72 65 73 65 6e 74 20 69 6e 20    is present in 
88f0: 61 6e 20 46 54 53 20 71 75 65 72 79 2c 20 74 68  an FTS query, th
8900: 65 20 70 72 65 63 65 64 65 6e 63 65 20 6f 66 20  e precedence of 
8910: 6f 70 65 72 61 74 6f 72 73 20 69 73 20 61 73 20  operators is as 
8920: 66 6f 6c 6c 6f 77 73 3a 0a 0a 3c 74 61 62 6c 65  follows:..<table
8930: 20 73 74 72 69 70 65 64 3d 31 3e 0a 20 20 3c 74   striped=1>.  <t
8940: 72 3e 3c 74 68 3e 4f 70 65 72 61 74 6f 72 3c 74  r><th>Operator<t
8950: 68 3e 45 6e 68 61 6e 63 65 64 20 51 75 65 72 79  h>Enhanced Query
8960: 20 53 79 6e 74 61 78 20 50 72 65 63 65 64 65 6e   Syntax Preceden
8970: 63 65 0a 20 20 3c 74 72 3e 3c 74 64 3e 4e 4f 54  ce.  <tr><td>NOT
8980: 20 3c 74 64 3e 20 48 69 67 68 65 73 74 20 70 72   <td> Highest pr
8990: 65 63 65 64 65 6e 63 65 20 28 74 69 67 68 74 65  ecedence (tighte
89a0: 73 74 20 67 72 6f 75 70 69 6e 67 29 2e 0a 20 20  st grouping)..  
89b0: 3c 74 72 3e 3c 74 64 3e 41 4e 44 20 3c 74 64 3e  <tr><td>AND <td>
89c0: 0a 20 20 3c 74 72 3e 3c 74 64 3e 4f 52 20 20 3c  .  <tr><td>OR  <
89d0: 74 64 3e 20 4c 6f 77 65 73 74 20 70 72 65 63 65  td> Lowest prece
89e0: 64 65 6e 63 65 20 28 6c 6f 6f 73 65 73 74 20 67  dence (loosest g
89f0: 72 6f 75 70 69 6e 67 29 2e 0a 3c 2f 74 61 62 6c  rouping)..</tabl
8a00: 65 3e 0a 0a 3c 70 3e 0a 20 20 57 68 65 6e 20 75  e>..<p>.  When u
8a10: 73 69 6e 67 20 74 68 65 20 65 6e 68 61 6e 63 65  sing the enhance
8a20: 64 20 71 75 65 72 79 20 73 79 6e 74 61 78 2c 20  d query syntax, 
8a30: 70 61 72 65 6e 74 68 65 73 69 73 20 6d 61 79 20  parenthesis may 
8a40: 62 65 20 75 73 65 64 20 74 6f 20 6f 76 65 72 72  be used to overr
8a50: 69 64 65 0a 20 20 74 68 65 20 64 65 66 61 75 6c  ide.  the defaul
8a60: 74 20 70 72 65 63 65 64 65 6e 63 65 20 6f 66 20  t precedence of 
8a70: 74 68 65 20 76 61 72 69 6f 75 73 20 6f 70 65 72  the various oper
8a80: 61 74 6f 72 73 2e 20 46 6f 72 20 65 78 61 6d 70  ators. For examp
8a90: 6c 65 3a 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e  le:..<codeblock>
8aa0: 0a 0a 20 20 3c 69 3e 2d 2d 20 52 65 74 75 72 6e  ..  <i>-- Return
8ab0: 20 74 68 65 20 64 6f 63 69 64 20 76 61 6c 75 65   the docid value
8ac0: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
8ad0: 68 20 61 6c 6c 20 64 6f 63 75 6d 65 6e 74 73 20  h all documents 
8ae0: 74 68 61 74 20 63 6f 6e 74 61 69 6e 20 74 68 65  that contain the
8af0: 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 74 77 6f  </i>.  <i>-- two
8b00: 20 74 65 72 6d 73 20 22 73 71 6c 69 74 65 22 20   terms "sqlite" 
8b10: 61 6e 64 20 22 64 61 74 61 62 61 73 65 22 2c 20  and "database", 
8b20: 61 6e 64 2f 6f 72 20 63 6f 6e 74 61 69 6e 20 74  and/or contain t
8b30: 68 65 20 74 65 72 6d 20 22 6c 69 62 72 61 72 79  he term "library
8b40: 22 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20  ".</i>.  SELECT 
8b50: 64 6f 63 69 64 20 46 52 4f 4d 20 64 6f 63 73 20  docid FROM docs 
8b60: 57 48 45 52 45 20 64 6f 63 73 20 4d 41 54 43 48  WHERE docs MATCH
8b70: 20 27 73 71 6c 69 74 65 20 41 4e 44 20 64 61 74   'sqlite AND dat
8b80: 61 62 61 73 65 20 4f 52 20 6c 69 62 72 61 72 79  abase OR library
8b90: 27 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 54 68 69 73  ';..  <i>-- This
8ba0: 20 71 75 65 72 79 20 69 73 20 65 71 75 69 76 61   query is equiva
8bb0: 6c 65 6e 74 20 74 6f 20 74 68 65 20 61 62 6f 76  lent to the abov
8bc0: 65 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20  e.</i>.  SELECT 
8bd0: 64 6f 63 69 64 20 46 52 4f 4d 20 64 6f 63 73 20  docid FROM docs 
8be0: 57 48 45 52 45 20 64 6f 63 73 20 4d 41 54 43 48  WHERE docs MATCH
8bf0: 20 27 73 71 6c 69 74 65 20 41 4e 44 20 64 61 74   'sqlite AND dat
8c00: 61 62 61 73 65 27 0a 20 20 20 20 55 4e 49 4f 4e  abase'.    UNION
8c10: 0a 20 20 53 45 4c 45 43 54 20 64 6f 63 69 64 20  .  SELECT docid 
8c20: 46 52 4f 4d 20 64 6f 63 73 20 57 48 45 52 45 20  FROM docs WHERE 
8c30: 64 6f 63 73 20 4d 41 54 43 48 20 27 6c 69 62 72  docs MATCH 'libr
8c40: 61 72 79 27 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 51  ary';..  <i>-- Q
8c50: 75 65 72 79 20 66 6f 72 20 74 68 65 20 73 65 74  uery for the set
8c60: 20 6f 66 20 64 6f 63 75 6d 65 6e 74 73 20 74 68   of documents th
8c70: 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
8c80: 74 65 72 6d 20 22 6c 69 6e 75 78 22 2c 20 61 6e  term "linux", an
8c90: 64 20 61 74 20 6c 65 61 73 74 3c 2f 69 3e 0a 20  d at least</i>. 
8ca0: 20 3c 69 3e 2d 2d 20 6f 6e 65 20 6f 66 20 74 68   <i>-- one of th
8cb0: 65 20 70 68 72 61 73 65 73 20 22 73 71 6c 69 74  e phrases "sqlit
8cc0: 65 20 64 61 74 61 62 61 73 65 22 20 61 6e 64 20  e database" and 
8cd0: 22 73 71 6c 69 74 65 20 6c 69 62 72 61 72 79 22  "sqlite library"
8ce0: 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20 64  .</i>.  SELECT d
8cf0: 6f 63 69 64 20 46 52 4f 4d 20 64 6f 63 73 20 57  ocid FROM docs W
8d00: 48 45 52 45 20 64 6f 63 73 20 4d 41 54 43 48 20  HERE docs MATCH 
8d10: 27 28 22 73 71 6c 69 74 65 20 64 61 74 61 62 61  '("sqlite databa
8d20: 73 65 22 20 4f 52 20 22 73 71 6c 69 74 65 20 6c  se" OR "sqlite l
8d30: 69 62 72 61 72 79 22 29 20 41 4e 44 20 6c 69 6e  ibrary") AND lin
8d40: 75 78 27 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 54 68  ux';..  <i>-- Th
8d50: 69 73 20 71 75 65 72 79 20 69 73 20 65 71 75 69  is query is equi
8d60: 76 61 6c 65 6e 74 20 74 6f 20 74 68 65 20 61 62  valent to the ab
8d70: 6f 76 65 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45 43  ove.</i>.  SELEC
8d80: 54 20 64 6f 63 69 64 20 46 52 4f 4d 20 64 6f 63  T docid FROM doc
8d90: 73 20 57 48 45 52 45 20 64 6f 63 73 20 4d 41 54  s WHERE docs MAT
8da0: 43 48 20 27 6c 69 6e 75 78 27 0a 20 20 20 20 49  CH 'linux'.    I
8db0: 4e 54 45 52 53 45 43 54 0a 20 20 53 45 4c 45 43  NTERSECT.  SELEC
8dc0: 54 20 64 6f 63 69 64 20 46 52 4f 4d 20 28 0a 20  T docid FROM (. 
8dd0: 20 20 20 53 45 4c 45 43 54 20 64 6f 63 69 64 20     SELECT docid 
8de0: 46 52 4f 4d 20 64 6f 63 73 20 57 48 45 52 45 20  FROM docs WHERE 
8df0: 64 6f 63 73 20 4d 41 54 43 48 20 27 22 73 71 6c  docs MATCH '"sql
8e00: 69 74 65 20 6c 69 62 72 61 72 79 22 27 0a 20 20  ite library"'.  
8e10: 20 20 20 20 55 4e 49 4f 4e 0a 20 20 20 20 53 45      UNION.    SE
8e20: 4c 45 43 54 20 64 6f 63 69 64 20 46 52 4f 4d 20  LECT docid FROM 
8e30: 64 6f 63 73 20 57 48 45 52 45 20 64 6f 63 73 20  docs WHERE docs 
8e40: 4d 41 54 43 48 20 27 22 73 71 6c 69 74 65 20 64  MATCH '"sqlite d
8e50: 61 74 61 62 61 73 65 22 27 0a 20 20 29 3b 0a 3c  atabase"'.  );.<
8e60: 2f 63 6f 64 65 62 6c 6f 63 6b 3e 0a 0a 0a 3c 68  /codeblock>...<h
8e70: 32 3e 53 65 74 20 4f 70 65 72 61 74 69 6f 6e 73  2>Set Operations
8e80: 20 55 73 69 6e 67 20 54 68 65 20 53 74 61 6e 64   Using The Stand
8e90: 61 72 64 20 51 75 65 72 79 20 53 79 6e 74 61 78  ard Query Syntax
8ea0: 3c 2f 68 32 3e 0a 0a 3c 70 3e 0a 20 20 46 54 53  </h2>..<p>.  FTS
8eb0: 20 71 75 65 72 79 20 73 65 74 20 6f 70 65 72 61   query set opera
8ec0: 74 69 6f 6e 73 20 75 73 69 6e 67 20 74 68 65 20  tions using the 
8ed0: 73 74 61 6e 64 61 72 64 20 71 75 65 72 79 20 73  standard query s
8ee0: 79 6e 74 61 78 20 61 72 65 20 73 69 6d 69 6c 61  yntax are simila
8ef0: 72 2c 20 62 75 74 0a 20 20 6e 6f 74 20 69 64 65  r, but.  not ide
8f00: 6e 74 69 63 61 6c 2c 20 74 6f 20 73 65 74 20 6f  ntical, to set o
8f10: 70 65 72 61 74 69 6f 6e 73 20 77 69 74 68 20 74  perations with t
8f20: 68 65 20 65 6e 68 61 6e 63 65 64 20 71 75 65 72  he enhanced quer
8f30: 79 20 73 79 6e 74 61 78 2e 20 54 68 65 72 65 0a  y syntax. There.
8f40: 20 20 61 72 65 20 66 6f 75 72 20 64 69 66 66 65    are four diffe
8f50: 72 65 6e 63 65 73 2c 20 61 73 20 66 6f 6c 6c 6f  rences, as follo
8f60: 77 73 3a 0a 0a 3c 6f 6c 3e 0a 20 20 3c 6c 69 20  ws:..<ol>.  <li 
8f70: 76 61 6c 75 65 3d 31 3e 3c 70 3e 20 4f 6e 6c 79  value=1><p> Only
8f80: 20 74 68 65 20 69 6d 70 6c 69 63 69 74 20 76 65   the implicit ve
8f90: 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 41 4e 44  rsion of the AND
8fa0: 20 6f 70 65 72 61 74 6f 72 20 69 73 20 73 75 70   operator is sup
8fb0: 70 6f 72 74 65 64 2e 0a 20 20 20 20 53 70 65 63  ported..    Spec
8fc0: 69 66 79 69 6e 67 20 74 68 65 20 73 74 72 69 6e  ifying the strin
8fd0: 67 20 22 41 4e 44 22 20 61 73 20 70 61 72 74 20  g "AND" as part 
8fe0: 6f 66 20 61 20 73 74 61 6e 64 61 72 64 20 71 75  of a standard qu
8ff0: 65 72 79 20 73 79 6e 74 61 78 20 71 75 65 72 79  ery syntax query
9000: 20 69 73 0a 20 20 20 20 69 6e 74 65 72 70 72 65   is.    interpre
9010: 74 65 64 20 61 73 20 61 20 74 65 72 6d 20 71 75  ted as a term qu
9020: 65 72 79 20 66 6f 72 20 74 68 65 20 73 65 74 20  ery for the set 
9030: 6f 66 20 64 6f 63 75 6d 65 6e 74 73 20 63 6f 6e  of documents con
9040: 74 61 69 6e 69 6e 67 20 74 68 65 20 74 65 72 6d  taining the term
9050: 20 0a 20 20 20 20 22 61 6e 64 22 2e 0a 3c 2f 6f   .    "and"..</o
9060: 6c 3e 0a 0a 3c 6f 6c 3e 0a 20 20 3c 6c 69 20 76  l>..<ol>.  <li v
9070: 61 6c 75 65 3d 32 3e 3c 70 3e 20 50 61 72 65 6e  alue=2><p> Paren
9080: 74 68 65 73 69 73 20 61 72 65 20 6e 6f 74 20 73  thesis are not s
9090: 75 70 70 6f 72 74 65 64 2e 0a 3c 2f 6f 6c 3e 0a  upported..</ol>.
90a0: 0a 3c 6f 6c 3e 0a 20 20 3c 6c 69 20 76 61 6c 75  .<ol>.  <li valu
90b0: 65 3d 33 3e 3c 70 3e 20 54 68 65 20 4e 4f 54 20  e=3><p> The NOT 
90c0: 6f 70 65 72 61 74 6f 72 20 69 73 20 6e 6f 74 20  operator is not 
90d0: 73 75 70 70 6f 72 74 65 64 2e 20 49 6e 73 74 65  supported. Inste
90e0: 61 64 20 6f 66 20 74 68 65 20 4e 4f 54 20 0a 20  ad of the NOT . 
90f0: 20 20 20 6f 70 65 72 61 74 6f 72 2c 20 74 68 65     operator, the
9100: 20 73 74 61 6e 64 61 72 64 20 71 75 65 72 79 20   standard query 
9110: 73 79 6e 74 61 78 20 73 75 70 70 6f 72 74 73 20  syntax supports 
9120: 61 20 75 6e 61 72 79 20 22 2d 22 20 6f 70 65 72  a unary "-" oper
9130: 61 74 6f 72 20 74 68 61 74 0a 20 20 20 20 6d 61  ator that.    ma
9140: 79 20 62 65 20 61 70 70 6c 69 65 64 20 74 6f 20  y be applied to 
9150: 62 61 73 69 63 20 74 65 72 6d 20 61 6e 64 20 74  basic term and t
9160: 65 72 6d 2d 70 72 65 66 69 78 20 71 75 65 72 69  erm-prefix queri
9170: 65 73 20 28 62 75 74 20 6e 6f 74 20 74 6f 20 70  es (but not to p
9180: 68 72 61 73 65 0a 20 20 20 20 6f 72 20 4e 45 41  hrase.    or NEA
9190: 52 20 71 75 65 72 69 65 73 29 2e 20 41 20 74 65  R queries). A te
91a0: 72 6d 20 6f 72 20 74 65 72 6d 2d 70 72 65 66 69  rm or term-prefi
91b0: 78 20 74 68 61 74 20 68 61 73 20 61 20 75 6e 61  x that has a una
91c0: 72 79 20 22 2d 22 20 6f 70 65 72 61 74 6f 72 0a  ry "-" operator.
91d0: 20 20 20 20 61 74 74 61 63 68 65 64 20 74 6f 20      attached to 
91e0: 69 74 20 6d 61 79 20 6e 6f 74 20 61 70 70 65 61  it may not appea
91f0: 72 20 61 73 20 61 6e 20 6f 70 65 72 61 6e 64 20  r as an operand 
9200: 74 6f 20 61 6e 20 4f 52 20 6f 70 65 72 61 74 6f  to an OR operato
9210: 72 2e 20 41 6e 20 46 54 53 0a 20 20 20 20 71 75  r. An FTS.    qu
9220: 65 72 79 20 6d 61 79 20 6e 6f 74 20 63 6f 6e 73  ery may not cons
9230: 69 73 74 20 65 6e 74 69 72 65 6c 79 20 6f 66 20  ist entirely of 
9240: 74 65 72 6d 73 20 6f 72 20 74 65 72 6d 2d 70 72  terms or term-pr
9250: 65 66 69 78 20 71 75 65 72 69 65 73 20 77 69 74  efix queries wit
9260: 68 20 75 6e 61 72 79 0a 20 20 20 20 22 2d 22 20  h unary.    "-" 
9270: 6f 70 65 72 61 74 6f 72 73 20 61 74 74 61 63 68  operators attach
9280: 65 64 20 74 6f 20 74 68 65 6d 2e 0a 3c 2f 6f 6c  ed to them..</ol
9290: 3e 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20  >..<codeblock>. 
92a0: 20 3c 69 3e 2d 2d 20 53 65 61 72 63 68 20 66 6f   <i>-- Search fo
92b0: 72 20 74 68 65 20 73 65 74 20 6f 66 20 64 6f 63  r the set of doc
92c0: 75 6d 65 6e 74 73 20 74 68 61 74 20 63 6f 6e 74  uments that cont
92d0: 61 69 6e 20 74 68 65 20 74 65 72 6d 20 22 73 71  ain the term "sq
92e0: 6c 69 74 65 22 20 62 75 74 20 64 6f 3c 2f 69 3e  lite" but do</i>
92f0: 0a 20 20 3c 69 3e 2d 2d 20 6e 6f 74 20 63 6f 6e  .  <i>-- not con
9300: 74 61 69 6e 20 74 68 65 20 74 65 72 6d 20 22 64  tain the term "d
9310: 61 74 61 62 61 73 65 22 2e 3c 2f 69 3e 0a 20 20  atabase".</i>.  
9320: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 64 6f  SELECT * FROM do
9330: 63 73 20 57 48 45 52 45 20 64 6f 63 73 20 4d 41  cs WHERE docs MA
9340: 54 43 48 20 27 73 71 6c 69 74 65 20 2d 64 61 74  TCH 'sqlite -dat
9350: 61 62 61 73 65 27 3b 0a 3c 2f 63 6f 64 65 62 6c  abase';.</codebl
9360: 6f 63 6b 3e 0a 0a 3c 6f 6c 3e 0a 20 20 3c 6c 69  ock>..<ol>.  <li
9370: 20 76 61 6c 75 65 3d 34 3e 3c 70 3e 20 54 68 65   value=4><p> The
9380: 20 72 65 6c 61 74 69 76 65 20 70 72 65 63 65 64   relative preced
9390: 65 6e 63 65 20 6f 66 20 74 68 65 20 73 65 74 20  ence of the set 
93a0: 6f 70 65 72 61 74 69 6f 6e 73 20 69 73 20 64 69  operations is di
93b0: 66 66 65 72 65 6e 74 2e 20 0a 20 20 20 49 6e 20  fferent. .   In 
93c0: 70 61 72 74 69 63 75 6c 61 72 2c 20 75 73 69 6e  particular, usin
93d0: 67 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 71  g the standard q
93e0: 75 65 72 79 20 73 79 6e 74 61 78 20 74 68 65 20  uery syntax the 
93f0: 22 4f 52 22 20 6f 70 65 72 61 74 6f 72 20 68 61  "OR" operator ha
9400: 73 20 61 0a 20 20 20 68 69 67 68 65 72 20 70 72  s a.   higher pr
9410: 65 63 65 64 65 6e 63 65 20 74 68 61 6e 20 22 41  ecedence than "A
9420: 4e 44 22 2e 20 54 68 65 20 70 72 65 63 65 64 65  ND". The precede
9430: 6e 63 65 20 6f 66 20 6f 70 65 72 61 74 6f 72 73  nce of operators
9440: 20 77 68 65 6e 20 75 73 69 6e 67 20 74 68 65 0a   when using the.
9450: 20 20 20 73 74 61 6e 64 61 72 64 20 71 75 65 72     standard quer
9460: 79 20 73 79 6e 74 61 78 20 69 73 3a 20 0a 3c 2f  y syntax is: .</
9470: 6f 6c 3e 0a 0a 3c 74 61 62 6c 65 20 73 74 72 69  ol>..<table stri
9480: 70 65 64 3d 31 3e 0a 20 20 3c 74 72 3e 3c 74 68  ped=1>.  <tr><th
9490: 3e 4f 70 65 72 61 74 6f 72 3c 74 68 3e 53 74 61  >Operator<th>Sta
94a0: 6e 64 61 72 64 20 51 75 65 72 79 20 53 79 6e 74  ndard Query Synt
94b0: 61 78 20 50 72 65 63 65 64 65 6e 63 65 0a 20 20  ax Precedence.  
94c0: 3c 74 72 3e 3c 74 64 3e 55 6e 61 72 79 20 22 2d  <tr><td>Unary "-
94d0: 22 20 3c 74 64 3e 20 48 69 67 68 65 73 74 20 70  " <td> Highest p
94e0: 72 65 63 65 64 65 6e 63 65 20 28 74 69 67 68 74  recedence (tight
94f0: 65 73 74 20 67 72 6f 75 70 69 6e 67 29 2e 0a 20  est grouping).. 
9500: 20 3c 74 72 3e 3c 74 64 3e 4f 52 20 20 3c 74 64   <tr><td>OR  <td
9510: 3e 0a 20 20 3c 74 72 3e 3c 74 64 3e 41 4e 44 20  >.  <tr><td>AND 
9520: 3c 74 64 3e 20 4c 6f 77 65 73 74 20 70 72 65 63  <td> Lowest prec
9530: 65 64 65 6e 63 65 20 28 6c 6f 6f 73 65 73 74 20  edence (loosest 
9540: 67 72 6f 75 70 69 6e 67 29 2e 0a 3c 2f 74 61 62  grouping)..</tab
9550: 6c 65 3e 0a 0a 3c 6f 6c 3e 3c 6c 69 20 73 74 79  le>..<ol><li sty
9560: 6c 65 3d 22 6c 69 73 74 2d 73 74 79 6c 65 3a 6e  le="list-style:n
9570: 6f 6e 65 22 3e 0a 20 20 54 68 65 20 66 6f 6c 6c  one">.  The foll
9580: 6f 77 69 6e 67 20 65 78 61 6d 70 6c 65 20 69 6c  owing example il
9590: 6c 75 73 74 72 61 74 65 73 20 70 72 65 63 65 64  lustrates preced
95a0: 65 6e 63 65 20 6f 66 20 6f 70 65 72 61 74 6f 72  ence of operator
95b0: 73 20 75 73 69 6e 67 20 74 68 65 20 73 74 61 6e  s using the stan
95c0: 64 61 72 64 20 0a 20 20 71 75 65 72 79 20 73 79  dard .  query sy
95d0: 6e 74 61 78 3a 0a 3c 2f 6f 6c 3e 0a 0a 3c 63 6f  ntax:.</ol>..<co
95e0: 64 65 62 6c 6f 63 6b 3e 0a 20 20 3c 69 3e 2d 2d  deblock>.  <i>--
95f0: 20 53 65 61 72 63 68 20 66 6f 72 20 64 6f 63 75   Search for docu
9600: 6d 65 6e 74 73 20 74 68 61 74 20 63 6f 6e 74 61  ments that conta
9610: 69 6e 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  in at least one 
9620: 6f 66 20 74 68 65 20 74 65 72 6d 73 20 22 64 61  of the terms "da
9630: 74 61 62 61 73 65 22 3c 2f 69 3e 0a 20 20 3c 69  tabase"</i>.  <i
9640: 3e 2d 2d 20 61 6e 64 20 22 73 71 6c 69 74 65 22  >-- and "sqlite"
9650: 2c 20 61 6e 64 20 61 6c 73 6f 20 63 6f 6e 74 61  , and also conta
9660: 69 6e 20 74 68 65 20 74 65 72 6d 20 22 6c 69 62  in the term "lib
9670: 72 61 72 79 22 2e 20 42 65 63 61 75 73 65 20 6f  rary". Because o
9680: 66 20 74 68 65 20 64 69 66 66 65 72 65 6e 63 65  f the difference
9690: 73 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 69 6e  s</i>.  <i>-- in
96a0: 20 6f 70 65 72 61 74 6f 72 20 70 72 65 63 65 64   operator preced
96b0: 65 6e 63 65 73 2c 20 74 68 69 73 20 71 75 65 72  ences, this quer
96c0: 79 20 77 6f 75 6c 64 20 68 61 76 65 20 61 20 64  y would have a d
96d0: 69 66 66 65 72 65 6e 74 20 69 6e 74 65 72 70 72  ifferent interpr
96e0: 65 74 61 74 69 6f 6e 20 75 73 69 6e 67 3c 2f 69  etation using</i
96f0: 3e 0a 20 20 3c 69 3e 2d 2d 20 74 68 65 20 65 6e  >.  <i>-- the en
9700: 68 61 6e 63 65 64 20 71 75 65 72 79 20 73 79 6e  hanced query syn
9710: 74 61 78 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45 43  tax.</i>.  SELEC
9720: 54 20 2a 20 46 52 4f 4d 20 64 6f 63 73 20 57 48  T * FROM docs WH
9730: 45 52 45 20 64 6f 63 73 20 4d 41 54 43 48 20 27  ERE docs MATCH '
9740: 73 71 6c 69 74 65 20 4f 52 20 64 61 74 61 62 61  sqlite OR databa
9750: 73 65 20 6c 69 62 72 61 72 79 27 3b 0a 3c 2f 63  se library';.</c
9760: 6f 64 65 62 6c 6f 63 6b 3e 0a 0a 3c 74 63 6c 3e  odeblock>..<tcl>
9770: 68 64 5f 66 72 61 67 6d 65 6e 74 20 73 6e 69 70  hd_fragment snip
9780: 70 65 74 20 7b 46 54 53 20 61 75 78 69 6c 69 61  pet {FTS auxilia
9790: 72 79 20 66 75 6e 63 74 69 6f 6e 73 7d 3c 2f 74  ry functions}</t
97a0: 63 6c 3e 0a 3c 68 31 3e 41 75 78 69 6c 69 61 72  cl>.<h1>Auxiliar
97b0: 79 20 46 75 6e 63 74 69 6f 6e 73 20 2d 20 53 6e  y Functions - Sn
97c0: 69 70 70 65 74 2c 20 4f 66 66 73 65 74 73 20 61  ippet, Offsets a
97d0: 6e 64 20 4d 61 74 63 68 69 6e 66 6f 3c 2f 68 31  nd Matchinfo</h1
97e0: 3e 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 46 54 53  >..<p>.  The FTS
97f0: 33 20 61 6e 64 20 46 54 53 34 20 6d 6f 64 75 6c  3 and FTS4 modul
9800: 65 73 20 70 72 6f 76 69 64 65 20 74 68 72 65 65  es provide three
9810: 20 73 70 65 63 69 61 6c 20 53 51 4c 20 73 63 61   special SQL sca
9820: 6c 61 72 20 66 75 6e 63 74 69 6f 6e 73 20 74 68  lar functions th
9830: 61 74 20 6d 61 79 20 62 65 20 75 73 65 66 75 6c  at may be useful
9840: 0a 20 20 74 6f 20 74 68 65 20 64 65 76 65 6c 6f  .  to the develo
9850: 70 65 72 73 20 6f 66 20 66 75 6c 6c 2d 74 65 78  pers of full-tex
9860: 74 20 71 75 65 72 79 20 73 79 73 74 65 6d 73 3a  t query systems:
9870: 20 22 73 6e 69 70 70 65 74 22 2c 20 22 6f 66 66   "snippet", "off
9880: 73 65 74 73 22 20 61 6e 64 0a 20 20 22 6d 61 74  sets" and.  "mat
9890: 63 68 69 6e 66 6f 22 2e 20 54 68 65 20 70 75 72  chinfo". The pur
98a0: 70 6f 73 65 20 6f 66 20 74 68 65 20 22 73 6e 69  pose of the "sni
98b0: 70 70 65 74 22 20 61 6e 64 20 22 6f 66 66 73 65  ppet" and "offse
98c0: 74 73 22 20 66 75 6e 63 74 69 6f 6e 73 20 69 73  ts" functions is
98d0: 20 74 6f 20 61 6c 6c 6f 77 0a 20 20 74 68 65 20   to allow.  the 
98e0: 75 73 65 72 20 74 6f 20 69 64 65 6e 74 69 66 79  user to identify
98f0: 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66   the location of
9900: 20 71 75 65 72 69 65 64 20 74 65 72 6d 73 20 69   queried terms i
9910: 6e 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 64  n the returned d
9920: 6f 63 75 6d 65 6e 74 73 2e 0a 20 20 54 68 65 20  ocuments..  The 
9930: 22 6d 61 74 63 68 69 6e 66 6f 22 20 66 75 6e 63  "matchinfo" func
9940: 74 69 6f 6e 20 70 72 6f 76 69 64 65 73 20 74 68  tion provides th
9950: 65 20 75 73 65 72 20 77 69 74 68 20 6d 65 74 72  e user with metr
9960: 69 63 73 20 74 68 61 74 20 6d 61 79 20 62 65 20  ics that may be 
9970: 75 73 65 66 75 6c 0a 20 20 66 6f 72 20 66 69 6c  useful.  for fil
9980: 74 65 72 69 6e 67 20 6f 72 20 73 6f 72 74 69 6e  tering or sortin
9990: 67 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20  g query results 
99a0: 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 72 65 6c  according to rel
99b0: 65 76 61 6e 63 65 2e 0a 0a 3c 70 3e 0a 20 20 54  evance...<p>.  T
99c0: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
99d0: 74 20 74 6f 20 61 6c 6c 20 74 68 72 65 65 20 73  t to all three s
99e0: 70 65 63 69 61 6c 20 53 51 4c 20 73 63 61 6c 61  pecial SQL scala
99f0: 72 20 66 75 6e 63 74 69 6f 6e 73 0a 20 20 6d 75  r functions.  mu
9a00: 73 74 20 62 65 20 74 68 65 20 5b 46 54 53 20 68  st be the [FTS h
9a10: 69 64 64 65 6e 20 63 6f 6c 75 6d 6e 5d 20 6f 66  idden column] of
9a20: 20 74 68 65 20 46 54 53 20 74 61 62 6c 65 20 74   the FTS table t
9a30: 68 61 74 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  hat the function
9a40: 20 69 73 0a 20 20 61 70 70 6c 69 65 64 20 74 6f   is.  applied to
9a50: 2e 20 20 54 68 65 20 5b 46 54 53 20 68 69 64 64  .  The [FTS hidd
9a60: 65 6e 20 63 6f 6c 75 6d 6e 5d 20 69 73 20 61 6e  en column] is an
9a70: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2d 67   automatically-g
9a80: 65 6e 65 72 61 74 65 64 20 63 6f 6c 75 6d 6e 20  enerated column 
9a90: 66 6f 75 6e 64 20 6f 6e 0a 20 20 61 6c 6c 20 46  found on.  all F
9aa0: 54 53 20 74 61 62 6c 65 73 20 74 68 61 74 20 68  TS tables that h
9ab0: 61 73 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65  as the same name
9ac0: 20 61 73 20 74 68 65 20 46 54 53 20 74 61 62 6c   as the FTS tabl
9ad0: 65 20 69 74 73 65 6c 66 2e 0a 20 20 46 6f 72 20  e itself..  For 
9ae0: 65 78 61 6d 70 6c 65 2c 20 67 69 76 65 6e 20 61  example, given a
9af0: 6e 20 46 54 53 20 74 61 62 6c 65 20 6e 61 6d 65  n FTS table name
9b00: 64 20 22 6d 61 69 6c 22 3a 0a 0a 3c 63 6f 64 65  d "mail":..<code
9b10: 62 6c 6f 63 6b 3e 0a 20 20 53 45 4c 45 43 54 20  block>.  SELECT 
9b20: 6f 66 66 73 65 74 73 28 6d 61 69 6c 29 20 46 52  offsets(mail) FR
9b30: 4f 4d 20 6d 61 69 6c 20 57 48 45 52 45 20 6d 61  OM mail WHERE ma
9b40: 69 6c 20 4d 41 54 43 48 20 26 6c 74 3b 66 75 6c  il MATCH &lt;ful
9b50: 6c 2d 74 65 78 74 20 71 75 65 72 79 20 65 78 70  l-text query exp
9b60: 72 65 73 73 69 6f 6e 26 67 74 3b 3b 0a 20 20 53  ression&gt;;.  S
9b70: 45 4c 45 43 54 20 73 6e 69 70 70 65 74 28 6d 61  ELECT snippet(ma
9b80: 69 6c 29 20 46 52 4f 4d 20 6d 61 69 6c 20 57 48  il) FROM mail WH
9b90: 45 52 45 20 6d 61 69 6c 20 4d 41 54 43 48 20 26  ERE mail MATCH &
9ba0: 6c 74 3b 66 75 6c 6c 2d 74 65 78 74 20 71 75 65  lt;full-text que
9bb0: 72 79 20 65 78 70 72 65 73 73 69 6f 6e 26 67 74  ry expression&gt
9bc0: 3b 3b 0a 20 20 53 45 4c 45 43 54 20 6d 61 74 63  ;;.  SELECT matc
9bd0: 68 69 6e 66 6f 28 6d 61 69 6c 29 20 46 52 4f 4d  hinfo(mail) FROM
9be0: 20 6d 61 69 6c 20 57 48 45 52 45 20 6d 61 69 6c   mail WHERE mail
9bf0: 20 4d 41 54 43 48 20 26 6c 74 3b 66 75 6c 6c 2d   MATCH &lt;full-
9c00: 74 65 78 74 20 71 75 65 72 79 20 65 78 70 72 65  text query expre
9c10: 73 73 69 6f 6e 26 67 74 3b 3b 0a 3c 2f 63 6f 64  ssion&gt;;.</cod
9c20: 65 62 6c 6f 63 6b 3e 0a 0a 3c 70 3e 0a 20 20 54  eblock>..<p>.  T
9c30: 68 65 20 74 68 72 65 65 20 61 75 78 69 6c 69 61  he three auxilia
9c40: 72 79 20 66 75 6e 63 74 69 6f 6e 73 20 61 72 65  ry functions are
9c50: 20 6f 6e 6c 79 20 75 73 65 66 75 6c 20 77 69 74   only useful wit
9c60: 68 69 6e 20 61 20 53 45 4c 45 43 54 20 73 74 61  hin a SELECT sta
9c70: 74 65 6d 65 6e 74 20 74 68 61 74 0a 20 20 75 73  tement that.  us
9c80: 65 73 20 74 68 65 20 46 54 53 20 74 61 62 6c 65  es the FTS table
9c90: 27 73 20 66 75 6c 6c 2d 74 65 78 74 20 69 6e 64  's full-text ind
9ca0: 65 78 2e 20 5e 49 66 20 75 73 65 64 20 77 69 74  ex. ^If used wit
9cb0: 68 69 6e 20 61 20 53 45 4c 45 43 54 20 74 68 61  hin a SELECT tha
9cc0: 74 20 75 73 65 73 0a 20 20 74 68 65 20 22 71 75  t uses.  the "qu
9cd0: 65 72 79 20 62 79 20 72 6f 77 69 64 22 20 6f 72  ery by rowid" or
9ce0: 20 22 6c 69 6e 65 61 72 20 73 63 61 6e 22 20 73   "linear scan" s
9cf0: 74 72 61 74 65 67 69 65 73 2c 20 74 68 65 6e 20  trategies, then 
9d00: 74 68 65 20 73 6e 69 70 70 65 74 20 61 6e 64 0a  the snippet and.
9d10: 20 20 6f 66 66 73 65 74 73 20 62 6f 74 68 20 72    offsets both r
9d20: 65 74 75 72 6e 20 61 6e 20 65 6d 70 74 79 20 73  eturn an empty s
9d30: 74 72 69 6e 67 2c 20 61 6e 64 20 74 68 65 20 6d  tring, and the m
9d40: 61 74 63 68 69 6e 66 6f 20 66 75 6e 63 74 69 6f  atchinfo functio
9d50: 6e 20 72 65 74 75 72 6e 73 0a 20 20 61 20 62 6c  n returns.  a bl
9d60: 6f 62 20 76 61 6c 75 65 20 7a 65 72 6f 20 62 79  ob value zero by
9d70: 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 0a 3c 70  tes in size...<p
9d80: 20 69 64 3d 6d 61 74 63 68 61 62 6c 65 3e 0a 20   id=matchable>. 
9d90: 20 41 6c 6c 20 74 68 72 65 65 20 61 75 78 69 6c   All three auxil
9da0: 69 61 72 79 20 66 75 6e 63 74 69 6f 6e 73 20 65  iary functions e
9db0: 78 74 72 61 63 74 20 61 20 73 65 74 20 6f 66 20  xtract a set of 
9dc0: 22 6d 61 74 63 68 61 62 6c 65 20 70 68 72 61 73  "matchable phras
9dd0: 65 73 22 20 66 72 6f 6d 0a 20 20 74 68 65 20 46  es" from.  the F
9de0: 54 53 20 71 75 65 72 79 20 65 78 70 72 65 73 73  TS query express
9df0: 69 6f 6e 20 74 6f 20 77 6f 72 6b 20 77 69 74 68  ion to work with
9e00: 2e 20 54 68 65 20 73 65 74 20 6f 66 20 6d 61 74  . The set of mat
9e10: 63 68 61 62 6c 65 20 70 68 72 61 73 65 73 20 66  chable phrases f
9e20: 6f 72 0a 20 20 61 20 67 69 76 65 6e 20 71 75 65  or.  a given que
9e30: 72 79 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61  ry consists of a
9e40: 6c 6c 20 70 68 72 61 73 65 73 20 28 69 6e 63 6c  ll phrases (incl
9e50: 75 64 69 6e 67 20 75 6e 71 75 6f 74 65 64 20 74  uding unquoted t
9e60: 6f 6b 65 6e 73 20 61 6e 64 0a 20 20 74 6f 6b 65  okens and.  toke
9e70: 6e 20 70 72 65 66 69 78 65 73 29 20 69 6e 20 74  n prefixes) in t
9e80: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 65 78  he expression ex
9e90: 63 65 70 74 20 74 68 6f 73 65 20 74 68 61 74 20  cept those that 
9ea0: 61 72 65 20 70 72 65 66 69 78 65 64 20 77 69 74  are prefixed wit
9eb0: 68 0a 20 20 61 20 75 6e 61 72 79 20 22 2d 22 20  h.  a unary "-" 
9ec0: 6f 70 65 72 61 74 6f 72 20 28 73 74 61 6e 64 61  operator (standa
9ed0: 72 64 20 73 79 6e 74 61 78 29 20 6f 72 20 61 72  rd syntax) or ar
9ee0: 65 20 70 61 72 74 20 6f 66 20 61 20 73 75 62 2d  e part of a sub-
9ef0: 65 78 70 72 65 73 73 69 6f 6e 20 0a 20 20 74 68  expression .  th
9f00: 61 74 20 69 73 20 75 73 65 64 20 61 73 20 74 68  at is used as th
9f10: 65 20 72 69 67 68 74 2d 68 61 6e 64 20 6f 70 65  e right-hand ope
9f20: 72 61 6e 64 20 6f 66 20 61 20 4e 4f 54 20 6f 70  rand of a NOT op
9f30: 65 72 61 74 6f 72 2e 0a 0a 3c 70 3e 0a 20 20 57  erator...<p>.  W
9f40: 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ith the followin
9f50: 67 20 70 72 6f 76 69 73 6f 73 2c 20 65 61 63 68  g provisos, each
9f60: 20 73 65 72 69 65 73 20 6f 66 20 74 6f 6b 65 6e   series of token
9f70: 73 20 69 6e 20 74 68 65 20 46 54 53 20 74 61 62  s in the FTS tab
9f80: 6c 65 20 74 68 61 74 0a 20 20 6d 61 74 63 68 65  le that.  matche
9f90: 73 20 6f 6e 65 20 6f 66 20 74 68 65 20 6d 61 74  s one of the mat
9fa0: 63 68 61 62 6c 65 20 70 68 72 61 73 65 73 20 69  chable phrases i
9fb0: 6e 20 74 68 65 20 71 75 65 72 79 20 65 78 70 72  n the query expr
9fc0: 65 73 73 69 6f 6e 20 69 73 20 6b 6e 6f 77 6e 20  ession is known 
9fd0: 61 73 20 61 0a 20 20 22 70 68 72 61 73 65 20 6d  as a.  "phrase m
9fe0: 61 74 63 68 22 3a 0a 0a 3c 6f 6c 3e 0a 20 20 3c  atch":..<ol>.  <
9ff0: 6c 69 3e 20 49 66 20 61 20 6d 61 74 63 68 61 62  li> If a matchab
a000: 6c 65 20 70 68 72 61 73 65 20 69 73 20 70 61 72  le phrase is par
a010: 74 20 6f 66 20 61 20 73 65 72 69 65 73 20 6f 66  t of a series of
a020: 20 70 68 72 61 73 65 73 20 63 6f 6e 6e 65 63 74   phrases connect
a030: 65 64 20 62 79 0a 20 20 20 20 20 20 20 4e 45 41  ed by.       NEA
a040: 52 20 6f 70 65 72 61 74 6f 72 73 20 69 6e 20 74  R operators in t
a050: 68 65 20 46 54 53 20 71 75 65 72 79 20 65 78 70  he FTS query exp
a060: 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e 20 65 61  ression, then ea
a070: 63 68 20 70 68 72 61 73 65 20 6d 61 74 63 68 0a  ch phrase match.
a080: 20 20 20 20 20 20 20 6d 75 73 74 20 62 65 20 73         must be s
a090: 75 66 66 69 63 69 65 6e 74 6c 79 20 63 6c 6f 73  ufficiently clos
a0a0: 65 20 74 6f 20 6f 74 68 65 72 20 70 68 72 61 73  e to other phras
a0b0: 65 20 6d 61 74 63 68 65 73 20 6f 66 20 74 68 65  e matches of the
a0c0: 20 72 65 6c 65 76 61 6e 74 0a 20 20 20 20 20 20   relevant.      
a0d0: 20 74 79 70 65 73 20 74 6f 20 73 61 74 69 73 66   types to satisf
a0e0: 79 20 74 68 65 20 4e 45 41 52 20 63 6f 6e 64 69  y the NEAR condi
a0f0: 74 69 6f 6e 2e 0a 0a 20 20 3c 6c 69 3e 20 49 66  tion...  <li> If
a100: 20 74 68 65 20 6d 61 74 63 68 61 62 6c 65 20 70   the matchable p
a110: 68 72 61 73 65 20 69 6e 20 74 68 65 20 46 54 53  hrase in the FTS
a120: 20 71 75 65 72 79 20 69 73 20 72 65 73 74 72 69   query is restri
a130: 63 74 65 64 20 74 6f 20 6d 61 74 63 68 69 6e 67  cted to matching
a140: 0a 20 20 20 20 20 20 20 64 61 74 61 20 69 6e 20  .       data in 
a150: 61 20 73 70 65 63 69 66 69 65 64 20 46 54 53 20  a specified FTS 
a160: 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 2c 20 74 68  table column, th
a170: 65 6e 20 6f 6e 6c 79 20 70 68 72 61 73 65 20 6d  en only phrase m
a180: 61 74 63 68 65 73 20 74 68 61 74 20 0a 20 20 20  atches that .   
a190: 20 20 20 20 6f 63 63 75 72 20 77 69 74 68 69 6e      occur within
a1a0: 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 61 72 65   that column are
a1b0: 20 63 6f 6e 73 69 64 65 72 65 64 2e 0a 3c 2f 6f   considered..</o
a1c0: 6c 3e 0a 20 0a 3c 74 63 6c 3e 68 64 5f 66 72 61  l>. .<tcl>hd_fra
a1d0: 67 6d 65 6e 74 20 6f 66 66 73 65 74 73 20 6f 66  gment offsets of
a1e0: 66 73 65 74 73 3c 2f 74 63 6c 3e 0a 3c 68 32 3e  fsets</tcl>.<h2>
a1f0: 54 68 65 20 4f 66 66 73 65 74 73 20 46 75 6e 63  The Offsets Func
a200: 74 69 6f 6e 3c 2f 68 32 3e 0a 0a 3c 70 3e 0a 20  tion</h2>..<p>. 
a210: 20 46 6f 72 20 61 20 53 45 4c 45 43 54 20 71 75   For a SELECT qu
a220: 65 72 79 20 74 68 61 74 20 75 73 65 73 20 74 68  ery that uses th
a230: 65 20 66 75 6c 6c 2d 74 65 78 74 20 69 6e 64 65  e full-text inde
a240: 78 2c 20 74 68 65 20 6f 66 66 73 65 74 73 28 29  x, the offsets()
a250: 20 66 75 6e 63 74 69 6f 6e 20 0a 20 20 72 65 74   function .  ret
a260: 75 72 6e 73 20 61 20 74 65 78 74 20 76 61 6c 75  urns a text valu
a270: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 20 73  e containing a s
a280: 65 72 69 65 73 20 6f 66 20 73 70 61 63 65 2d 73  eries of space-s
a290: 65 70 61 72 61 74 65 64 20 69 6e 74 65 67 65 72  eparated integer
a2a0: 73 2e 20 46 6f 72 0a 20 20 65 61 63 68 20 74 65  s. For.  each te
a2b0: 72 6d 20 69 6e 20 65 61 63 68 20 3c 61 20 68 72  rm in each <a hr
a2c0: 65 66 3d 23 6d 61 74 63 68 61 62 6c 65 3e 70 68  ef=#matchable>ph
a2d0: 72 61 73 65 20 6d 61 74 63 68 3c 2f 61 3e 20 6f  rase match</a> o
a2e0: 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f  f the current ro
a2f0: 77 2c 20 0a 20 20 74 68 65 72 65 20 61 72 65 20  w, .  there are 
a300: 66 6f 75 72 20 69 6e 74 65 67 65 72 73 20 69 6e  four integers in
a310: 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 6c 69   the returned li
a320: 73 74 2e 20 45 61 63 68 20 73 65 74 20 6f 66 20  st. Each set of 
a330: 66 6f 75 72 20 69 6e 74 65 67 65 72 73 20 69 73  four integers is
a340: 20 0a 20 20 69 6e 74 65 72 70 72 65 74 65 64 20   .  interpreted 
a350: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 0a 3c 74 61  as follows:..<ta
a360: 62 6c 65 20 73 74 72 69 70 65 64 3d 31 3e 0a 20  ble striped=1>. 
a370: 20 3c 74 72 3e 3c 74 68 3e 49 6e 74 65 67 65 72   <tr><th>Integer
a380: 20 3c 74 68 3e 49 6e 74 65 72 70 72 65 74 61 74   <th>Interpretat
a390: 69 6f 6e 0a 20 20 3c 74 72 3e 3c 74 64 3e 30 20  ion.  <tr><td>0 
a3a0: 0a 20 20 20 20 20 20 3c 74 64 3e 54 68 65 20 63  .      <td>The c
a3b0: 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 74 68 61  olumn number tha
a3c0: 74 20 74 68 65 20 74 65 72 6d 20 69 6e 73 74 61  t the term insta
a3d0: 6e 63 65 20 6f 63 63 75 72 73 20 69 6e 20 28 30  nce occurs in (0
a3e0: 20 66 6f 72 20 74 68 65 0a 20 20 20 20 20 20 20   for the.       
a3f0: 20 20 20 6c 65 66 74 6d 6f 73 74 20 63 6f 6c 75     leftmost colu
a400: 6d 6e 20 6f 66 20 74 68 65 20 46 54 53 20 74 61  mn of the FTS ta
a410: 62 6c 65 2c 20 31 20 66 6f 72 20 74 68 65 20 6e  ble, 1 for the n
a420: 65 78 74 20 6c 65 66 74 6d 6f 73 74 2c 20 65 74  ext leftmost, et
a430: 63 2e 29 2e 0a 20 20 3c 74 72 3e 3c 74 64 3e 31  c.)..  <tr><td>1
a440: 0a 20 20 20 20 20 20 3c 74 64 3e 54 68 65 20 74  .      <td>The t
a450: 65 72 6d 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  erm number of th
a460: 65 20 6d 61 74 63 68 69 6e 67 20 74 65 72 6d 20  e matching term 
a470: 77 69 74 68 69 6e 20 74 68 65 20 66 75 6c 6c 2d  within the full-
a480: 74 65 78 74 20 71 75 65 72 79 0a 20 20 20 20 20  text query.     
a490: 20 20 20 20 20 65 78 70 72 65 73 73 69 6f 6e 2e       expression.
a4a0: 20 54 65 72 6d 73 20 77 69 74 68 69 6e 20 61 20   Terms within a 
a4b0: 71 75 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e  query expression
a4c0: 20 61 72 65 20 6e 75 6d 62 65 72 65 64 20 73 74   are numbered st
a4d0: 61 72 74 69 6e 67 0a 20 20 20 20 20 20 20 20 20  arting.         
a4e0: 20 66 72 6f 6d 20 30 20 69 6e 20 74 68 65 20 6f   from 0 in the o
a4f0: 72 64 65 72 20 74 68 61 74 20 74 68 65 79 20 6f  rder that they o
a500: 63 63 75 72 2e 0a 20 20 3c 74 72 3e 3c 74 64 3e  ccur..  <tr><td>
a510: 32 0a 20 20 20 20 20 20 3c 74 64 3e 54 68 65 20  2.      <td>The 
a520: 62 79 74 65 20 6f 66 66 73 65 74 20 6f 66 20 74  byte offset of t
a530: 68 65 20 6d 61 74 63 68 69 6e 67 20 74 65 72 6d  he matching term
a540: 20 77 69 74 68 69 6e 20 74 68 65 20 63 6f 6c 75   within the colu
a550: 6d 6e 2e 0a 20 20 3c 74 72 3e 3c 74 64 3e 33 0a  mn..  <tr><td>3.
a560: 20 20 20 20 20 20 3c 74 64 3e 54 68 65 20 73 69        <td>The si
a570: 7a 65 20 6f 66 20 74 68 65 20 6d 61 74 63 68 69  ze of the matchi
a580: 6e 67 20 74 65 72 6d 20 69 6e 20 62 79 74 65 73  ng term in bytes
a590: 2e 0a 3c 2f 74 61 62 6c 65 3e 0a 0a 3c 70 3e 0a  ..</table>..<p>.
a5a0: 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
a5b0: 62 6c 6f 63 6b 20 63 6f 6e 74 61 69 6e 73 20 65  block contains e
a5c0: 78 61 6d 70 6c 65 73 20 74 68 61 74 20 75 73 65  xamples that use
a5d0: 20 74 68 65 20 6f 66 66 73 65 74 73 20 66 75 6e   the offsets fun
a5e0: 63 74 69 6f 6e 2e 0a 0a 3c 63 6f 64 65 62 6c 6f  ction...<codeblo
a5f0: 63 6b 3e 0a 20 20 43 52 45 41 54 45 20 56 49 52  ck>.  CREATE VIR
a600: 54 55 41 4c 20 54 41 42 4c 45 20 6d 61 69 6c 20  TUAL TABLE mail 
a610: 55 53 49 4e 47 20 66 74 73 33 28 73 75 62 6a 65  USING fts3(subje
a620: 63 74 2c 20 62 6f 64 79 29 3b 0a 20 20 49 4e 53  ct, body);.  INS
a630: 45 52 54 20 49 4e 54 4f 20 6d 61 69 6c 20 56 41  ERT INTO mail VA
a640: 4c 55 45 53 28 27 68 65 6c 6c 6f 20 77 6f 72 6c  LUES('hello worl
a650: 64 27 2c 20 27 54 68 69 73 20 6d 65 73 73 61 67  d', 'This messag
a660: 65 20 69 73 20 61 20 68 65 6c 6c 6f 20 77 6f 72  e is a hello wor
a670: 6c 64 20 6d 65 73 73 61 67 65 2e 27 29 3b 0a 20  ld message.');. 
a680: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 6d 61 69   INSERT INTO mai
a690: 6c 20 56 41 4c 55 45 53 28 27 75 72 67 65 6e 74  l VALUES('urgent
a6a0: 3a 20 73 65 72 69 6f 75 73 27 2c 20 27 54 68 69  : serious', 'Thi
a6b0: 73 20 6d 61 69 6c 20 69 73 20 73 65 65 6e 20 61  s mail is seen a
a6c0: 73 20 61 20 6d 6f 72 65 20 73 65 72 69 6f 75 73  s a more serious
a6d0: 20 6d 61 69 6c 27 29 3b 0a 0a 20 20 3c 69 3e 2d   mail');..  <i>-
a6e0: 2d 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  - The following 
a6f0: 71 75 65 72 79 20 72 65 74 75 72 6e 73 20 61 20  query returns a 
a700: 73 69 6e 67 6c 65 20 72 6f 77 20 28 61 73 20 69  single row (as i
a710: 74 20 6d 61 74 63 68 65 73 20 6f 6e 6c 79 20 74  t matches only t
a720: 68 65 20 66 69 72 73 74 3c 2f 69 3e 0a 20 20 3c  he first</i>.  <
a730: 69 3e 2d 2d 20 65 6e 74 72 79 20 69 6e 20 74 61  i>-- entry in ta
a740: 62 6c 65 20 22 6d 61 69 6c 22 2e 20 54 68 65 20  ble "mail". The 
a750: 74 65 78 74 20 72 65 74 75 72 6e 65 64 20 62 79  text returned by
a760: 20 74 68 65 20 6f 66 66 73 65 74 73 20 66 75 6e   the offsets fun
a770: 63 74 69 6f 6e 20 69 73 3c 2f 69 3e 0a 20 20 3c  ction is</i>.  <
a780: 69 3e 2d 2d 20 22 30 20 30 20 36 20 35 20 31 20  i>-- "0 0 6 5 1 
a790: 30 20 32 34 20 35 22 2e 3c 2f 69 3e 0a 20 20 3c  0 24 5".</i>.  <
a7a0: 69 3e 2d 2d 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d  i>--</i>.  <i>--
a7b0: 20 54 68 65 20 66 69 72 73 74 20 73 65 74 20 6f   The first set o
a7c0: 66 20 66 6f 75 72 20 69 6e 74 65 67 65 72 73 20  f four integers 
a7d0: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e  in the result in
a7e0: 64 69 63 61 74 65 20 74 68 61 74 20 63 6f 6c 75  dicate that colu
a7f0: 6d 6e 20 30 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d  mn 0</i>.  <i>--
a800: 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 69 6e 73   contains an ins
a810: 74 61 6e 63 65 20 6f 66 20 74 65 72 6d 20 30 20  tance of term 0 
a820: 28 22 77 6f 72 6c 64 22 29 20 61 74 20 62 79 74  ("world") at byt
a830: 65 20 6f 66 66 73 65 74 20 36 2e 20 54 68 65 20  e offset 6. The 
a840: 74 65 72 6d 20 69 6e 73 74 61 6e 63 65 3c 2f 69  term instance</i
a850: 3e 0a 20 20 3c 69 3e 2d 2d 20 69 73 20 35 20 62  >.  <i>-- is 5 b
a860: 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20 54 68  ytes in size. Th
a870: 65 20 73 65 63 6f 6e 64 20 73 65 74 20 6f 66 20  e second set of 
a880: 66 6f 75 72 20 69 6e 74 65 67 65 72 73 20 73 68  four integers sh
a890: 6f 77 73 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20  ows that column 
a8a0: 31 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 6f 66  1</i>.  <i>-- of
a8b0: 20 74 68 65 20 6d 61 74 63 68 65 64 20 72 6f 77   the matched row
a8c0: 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 69 6e 73   contains an ins
a8d0: 74 61 6e 63 65 20 6f 66 20 74 65 72 6d 20 30 20  tance of term 0 
a8e0: 28 22 77 6f 72 6c 64 22 29 20 61 74 20 62 79 74  ("world") at byt
a8f0: 65 20 6f 66 66 73 65 74 3c 2f 69 3e 0a 20 20 3c  e offset</i>.  <
a900: 69 3e 2d 2d 20 32 34 2e 20 41 67 61 69 6e 2c 20  i>-- 24. Again, 
a910: 74 68 65 20 74 65 72 6d 20 69 6e 73 74 61 6e 63  the term instanc
a920: 65 20 69 73 20 35 20 62 79 74 65 73 20 69 6e 20  e is 5 bytes in 
a930: 73 69 7a 65 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45  size.</i>.  SELE
a940: 43 54 20 6f 66 66 73 65 74 73 28 6d 61 69 6c 29  CT offsets(mail)
a950: 20 46 52 4f 4d 20 6d 61 69 6c 20 57 48 45 52 45   FROM mail WHERE
a960: 20 6d 61 69 6c 20 4d 41 54 43 48 20 27 77 6f 72   mail MATCH 'wor
a970: 6c 64 27 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 54 68  ld';..  <i>-- Th
a980: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 71 75 65 72  e following quer
a990: 79 20 72 65 74 75 72 6e 73 20 61 6c 73 6f 20 6d  y returns also m
a9a0: 61 74 63 68 65 73 20 6f 6e 6c 79 20 74 68 65 20  atches only the 
a9b0: 66 69 72 73 74 20 72 6f 77 20 69 6e 20 74 61 62  first row in tab
a9c0: 6c 65 20 22 6d 61 69 6c 22 2e 3c 2f 69 3e 0a 20  le "mail".</i>. 
a9d0: 20 3c 69 3e 2d 2d 20 49 6e 20 74 68 69 73 20 63   <i>-- In this c
a9e0: 61 73 65 20 74 68 65 20 72 65 74 75 72 6e 65 64  ase the returned
a9f0: 20 74 65 78 74 20 69 73 20 22 31 20 30 20 35 20   text is "1 0 5 
aa00: 37 20 31 20 30 20 33 30 20 37 22 2e 3c 2f 69 3e  7 1 0 30 7".</i>
aa10: 0a 20 20 53 45 4c 45 43 54 20 6f 66 66 73 65 74  .  SELECT offset
aa20: 73 28 6d 61 69 6c 29 20 46 52 4f 4d 20 6d 61 69  s(mail) FROM mai
aa30: 6c 20 57 48 45 52 45 20 6d 61 69 6c 20 4d 41 54  l WHERE mail MAT
aa40: 43 48 20 27 6d 65 73 73 61 67 65 27 3b 0a 0a 20  CH 'message';.. 
aa50: 20 3c 69 3e 2d 2d 20 54 68 65 20 66 6f 6c 6c 6f   <i>-- The follo
aa60: 77 69 6e 67 20 71 75 65 72 79 20 6d 61 74 63 68  wing query match
aa70: 65 73 20 74 68 65 20 73 65 63 6f 6e 64 20 72 6f  es the second ro
aa80: 77 20 69 6e 20 74 61 62 6c 65 20 22 6d 61 69 6c  w in table "mail
aa90: 22 2e 20 49 74 20 72 65 74 75 72 6e 73 20 74 68  ". It returns th
aaa0: 65 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 74 65  e</i>.  <i>-- te
aab0: 78 74 20 22 31 20 30 20 32 38 20 37 20 31 20 31  xt "1 0 28 7 1 1
aac0: 20 33 36 20 34 22 2e 20 4f 6e 6c 79 20 74 68 6f   36 4". Only tho
aad0: 73 65 20 6f 63 63 75 72 72 65 6e 63 65 73 20 6f  se occurrences o
aae0: 66 20 74 65 72 6d 73 20 22 73 65 72 69 6f 75 73  f terms "serious
aaf0: 22 20 61 6e 64 20 22 6d 61 69 6c 22 3c 2f 69 3e  " and "mail"</i>
ab00: 0a 20 20 3c 69 3e 2d 2d 20 74 68 61 74 20 61 72  .  <i>-- that ar
ab10: 65 20 70 61 72 74 20 6f 66 20 61 6e 20 69 6e 73  e part of an ins
ab20: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 70 68 72  tance of the phr
ab30: 61 73 65 20 22 73 65 72 69 6f 75 73 20 6d 61 69  ase "serious mai
ab40: 6c 22 20 61 72 65 20 69 64 65 6e 74 69 66 69 65  l" are identifie
ab50: 64 3b 20 74 68 65 3c 2f 69 3e 0a 20 20 3c 69 3e  d; the</i>.  <i>
ab60: 2d 2d 20 6f 74 68 65 72 20 6f 63 63 75 72 72 65  -- other occurre
ab70: 6e 63 65 73 20 6f 66 20 22 73 65 72 69 6f 75 73  nces of "serious
ab80: 22 20 61 6e 64 20 22 6d 61 69 6c 22 20 61 72 65  " and "mail" are
ab90: 20 69 67 6e 6f 72 65 64 2e 3c 2f 69 3e 0a 20 20   ignored.</i>.  
aba0: 53 45 4c 45 43 54 20 6f 66 66 73 65 74 73 28 6d  SELECT offsets(m
abb0: 61 69 6c 29 20 46 52 4f 4d 20 6d 61 69 6c 20 57  ail) FROM mail W
abc0: 48 45 52 45 20 6d 61 69 6c 20 4d 41 54 43 48 20  HERE mail MATCH 
abd0: 27 22 73 65 72 69 6f 75 73 20 6d 61 69 6c 22 27  '"serious mail"'
abe0: 3b 0a 3c 2f 63 6f 64 65 62 6c 6f 63 6b 3e 0a 0a  ;.</codeblock>..
abf0: 3c 74 63 6c 3e 68 64 5f 66 72 61 67 6d 65 6e 74  <tcl>hd_fragment
ac00: 20 73 6e 69 70 70 65 74 20 73 6e 69 70 70 65 74   snippet snippet
ac10: 3c 2f 74 63 6c 3e 0a 3c 68 32 3e 54 68 65 20 53  </tcl>.<h2>The S
ac20: 6e 69 70 70 65 74 20 46 75 6e 63 74 69 6f 6e 3c  nippet Function<
ac30: 2f 68 32 3e 0a 0a 3c 70 3e 0a 20 20 54 68 65 20  /h2>..<p>.  The 
ac40: 73 6e 69 70 70 65 74 20 66 75 6e 63 74 69 6f 6e  snippet function
ac50: 20 69 73 20 75 73 65 64 20 74 6f 20 63 72 65 61   is used to crea
ac60: 74 65 20 66 6f 72 6d 61 74 74 65 64 20 66 72 61  te formatted fra
ac70: 67 6d 65 6e 74 73 20 6f 66 20 64 6f 63 75 6d 65  gments of docume
ac80: 6e 74 20 74 65 78 74 0a 20 20 66 6f 72 20 64 69  nt text.  for di
ac90: 73 70 6c 61 79 20 61 73 20 70 61 72 74 20 6f 66  splay as part of
aca0: 20 61 20 66 75 6c 6c 2d 74 65 78 74 20 71 75 65   a full-text que
acb0: 72 79 20 72 65 73 75 6c 74 73 20 72 65 70 6f 72  ry results repor
acc0: 74 2e 20 54 68 65 20 73 6e 69 70 70 65 74 20 66  t. The snippet f
acd0: 75 6e 63 74 69 6f 6e 20 0a 20 20 6d 61 79 20 62  unction .  may b
ace0: 65 20 70 61 73 73 65 64 20 62 65 74 77 65 65 6e  e passed between
acf0: 20 6f 6e 65 20 61 6e 64 20 73 69 78 20 61 72 67   one and six arg
ad00: 75 6d 65 6e 74 73 2c 20 61 73 20 66 6f 6c 6c 6f  uments, as follo
ad10: 77 73 3a 0a 0a 3c 74 61 62 6c 65 20 73 74 72 69  ws:..<table stri
ad20: 70 65 64 3d 31 3e 0a 20 20 3c 74 72 3e 3c 74 68  ped=1>.  <tr><th
ad30: 3e 41 72 67 75 6d 65 6e 74 20 3c 74 68 3e 44 65  >Argument <th>De
ad40: 66 61 75 6c 74 20 56 61 6c 75 65 20 3c 74 68 3e  fault Value <th>
ad50: 44 65 73 63 72 69 70 74 69 6f 6e 0a 20 20 3c 74  Description.  <t
ad60: 72 3e 3c 74 64 3e 30 20 3c 74 64 3e 4e 2f 41 0a  r><td>0 <td>N/A.
ad70: 20 20 20 20 20 20 3c 74 64 3e 20 54 68 65 20 66        <td> The f
ad80: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f  irst argument to
ad90: 20 74 68 65 20 73 6e 69 70 70 65 74 20 66 75 6e   the snippet fun
ada0: 63 74 69 6f 6e 20 6d 75 73 74 20 61 6c 77 61 79  ction must alway
adb0: 73 20 62 65 20 74 68 65 20 5b 46 54 53 20 68 69  s be the [FTS hi
adc0: 64 64 65 6e 20 63 6f 6c 75 6d 6e 5d 0a 20 20 20  dden column].   
add0: 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 46          of the F
ade0: 54 53 20 74 61 62 6c 65 20 62 65 69 6e 67 20 71  TS table being q
adf0: 75 65 72 69 65 64 20 61 6e 64 20 66 72 6f 6d 20  ueried and from 
ae00: 77 68 69 63 68 20 74 68 65 20 73 6e 69 70 70 65  which the snippe
ae10: 74 20 69 73 20 74 6f 20 62 65 20 74 61 6b 65 6e  t is to be taken
ae20: 2e 20 20 54 68 65 0a 20 20 20 20 20 20 20 20 20  .  The.         
ae30: 20 20 5b 46 54 53 20 68 69 64 64 65 6e 20 63 6f    [FTS hidden co
ae40: 6c 75 6d 6e 5d 20 69 73 20 61 6e 20 61 75 74 6f  lumn] is an auto
ae50: 6d 61 74 69 63 61 6c 6c 79 20 67 65 6e 65 72 61  matically genera
ae60: 74 65 64 20 63 6f 6c 75 6d 6e 20 77 69 74 68 20  ted column with 
ae70: 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 61 73  the same name as
ae80: 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 20   the.           
ae90: 46 54 53 20 74 61 62 6c 65 20 69 74 73 65 6c 66  FTS table itself
aea0: 2e 0a 20 20 3c 74 72 3e 3c 74 64 3e 31 20 3c 74  ..  <tr><td>1 <t
aeb0: 64 3e 22 26 6c 74 3b 62 26 67 74 3b 22 0a 20 20  d>"&lt;b&gt;".  
aec0: 20 20 20 20 3c 74 64 3e 20 54 68 65 20 22 73 74      <td> The "st
aed0: 61 72 74 20 6d 61 74 63 68 22 20 74 65 78 74 2e  art match" text.
aee0: 0a 20 20 3c 74 72 3e 3c 74 64 3e 32 20 3c 74 64  .  <tr><td>2 <td
aef0: 3e 22 26 6c 74 3b 2f 62 26 67 74 3b 22 0a 20 20  >"&lt;/b&gt;".  
af00: 20 20 20 20 3c 74 64 3e 20 54 68 65 20 22 65 6e      <td> The "en
af10: 64 20 6d 61 74 63 68 22 20 74 65 78 74 2e 0a 20  d match" text.. 
af20: 20 3c 74 72 3e 3c 74 64 3e 33 20 3c 74 64 3e 22   <tr><td>3 <td>"
af30: 26 6c 74 3b 62 26 67 74 3b 2e 2e 2e 26 6c 74 3b  &lt;b&gt;...&lt;
af40: 2f 62 26 67 74 3b 22 0a 20 20 20 20 20 20 3c 74  /b&gt;".      <t
af50: 64 3e 20 54 68 65 20 22 65 6c 6c 69 70 73 65 73  d> The "ellipses
af60: 22 20 74 65 78 74 2e 0a 20 20 3c 74 72 3e 3c 74  " text..  <tr><t
af70: 64 3e 34 20 3c 74 64 3e 2d 31 0a 20 20 20 20 20  d>4 <td>-1.     
af80: 20 3c 74 64 3e 20 54 68 65 20 46 54 53 20 74 61   <td> The FTS ta
af90: 62 6c 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65  ble column numbe
afa0: 72 20 74 6f 20 65 78 74 72 61 63 74 20 74 68 65  r to extract the
afb0: 20 72 65 74 75 72 6e 65 64 20 66 72 61 67 6d 65   returned fragme
afc0: 6e 74 73 20 6f 66 0a 20 20 20 20 20 20 20 20 20  nts of.         
afd0: 20 20 74 65 78 74 20 66 72 6f 6d 2e 20 43 6f 6c    text from. Col
afe0: 75 6d 6e 73 20 61 72 65 20 6e 75 6d 62 65 72 65  umns are numbere
aff0: 64 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72  d from left to r
b000: 69 67 68 74 20 73 74 61 72 74 69 6e 67 20 77 69  ight starting wi
b010: 74 68 0a 20 20 20 20 20 20 20 20 20 20 20 7a 65  th.           ze
b020: 72 6f 2e 20 41 20 6e 65 67 61 74 69 76 65 20 76  ro. A negative v
b030: 61 6c 75 65 20 69 6e 64 69 63 61 74 65 73 20 74  alue indicates t
b040: 68 61 74 20 74 68 65 20 74 65 78 74 20 6d 61 79  hat the text may
b050: 20 62 65 20 65 78 74 72 61 63 74 65 64 0a 20 20   be extracted.  
b060: 20 20 20 20 20 20 20 20 20 66 72 6f 6d 20 61 6e           from an
b070: 79 20 63 6f 6c 75 6d 6e 2e 0a 20 20 3c 74 72 3e  y column..  <tr>
b080: 3c 74 64 3e 35 20 3c 74 64 3e 2d 31 35 0a 20 20  <td>5 <td>-15.  
b090: 20 20 20 20 3c 74 64 3e 20 54 68 65 20 61 62 73      <td> The abs
b0a0: 6f 6c 75 74 65 20 76 61 6c 75 65 20 6f 66 20 74  olute value of t
b0b0: 68 69 73 20 69 6e 74 65 67 65 72 20 61 72 67 75  his integer argu
b0c0: 6d 65 6e 74 20 69 73 20 75 73 65 64 20 61 73 20  ment is used as 
b0d0: 74 68 65 20 0a 20 20 20 20 20 20 20 20 20 20 20  the .           
b0e0: 28 61 70 70 72 6f 78 69 6d 61 74 65 29 20 6e 75  (approximate) nu
b0f0: 6d 62 65 72 20 6f 66 20 74 6f 6b 65 6e 73 20 74  mber of tokens t
b100: 6f 20 69 6e 63 6c 75 64 65 20 69 6e 20 74 68 65  o include in the
b110: 20 72 65 74 75 72 6e 65 64 20 74 65 78 74 20 0a   returned text .
b120: 20 20 20 20 20 20 20 20 20 20 20 76 61 6c 75 65             value
b130: 2e 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 61 6c  . The maximum al
b140: 6c 6f 77 61 62 6c 65 20 61 62 73 6f 6c 75 74 65  lowable absolute
b150: 20 76 61 6c 75 65 20 69 73 20 36 34 2e 20 54 68   value is 64. Th
b160: 65 20 76 61 6c 75 65 20 6f 66 0a 20 20 20 20 20  e value of.     
b170: 20 20 20 20 20 20 74 68 69 73 20 61 72 67 75 6d        this argum
b180: 65 6e 74 20 69 73 20 72 65 66 65 72 72 65 64 20  ent is referred 
b190: 74 6f 20 61 73 20 3c 69 3e 4e 3c 2f 69 3e 20 69  to as <i>N</i> i
b1a0: 6e 20 74 68 65 20 64 69 73 63 75 73 73 69 6f 6e  n the discussion
b1b0: 20 62 65 6c 6f 77 2e 0a 3c 2f 74 61 62 6c 65 3e   below..</table>
b1c0: 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 73 6e 69 70  ..<p>.  The snip
b1d0: 70 65 74 20 66 75 6e 63 74 69 6f 6e 20 66 69 72  pet function fir
b1e0: 73 74 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66  st attempts to f
b1f0: 69 6e 64 20 61 20 66 72 61 67 6d 65 6e 74 20 6f  ind a fragment o
b200: 66 20 74 65 78 74 20 63 6f 6e 73 69 73 74 69 6e  f text consistin
b210: 67 0a 20 20 6f 66 20 3c 69 3e 7c 4e 7c 3c 2f 69  g.  of <i>|N|</i
b220: 3e 20 74 6f 6b 65 6e 73 20 77 69 74 68 69 6e 20  > tokens within 
b230: 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20  the current row 
b240: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 74  that contains at
b250: 20 6c 65 61 73 74 20 6f 6e 65 20 70 68 72 61 73   least one phras
b260: 65 20 0a 20 20 6d 61 74 63 68 20 66 6f 72 20 65  e .  match for e
b270: 61 63 68 20 6d 61 74 63 68 61 62 6c 65 20 70 68  ach matchable ph
b280: 72 61 73 65 20 6d 61 74 63 68 65 64 20 73 6f 6d  rase matched som
b290: 65 77 68 65 72 65 20 69 6e 20 74 68 65 20 63 75  ewhere in the cu
b2a0: 72 72 65 6e 74 20 72 6f 77 2c 20 0a 20 20 77 68  rrent row, .  wh
b2b0: 65 72 65 20 3c 69 3e 7c 4e 7c 3c 2f 69 3e 20 69  ere <i>|N|</i> i
b2c0: 73 20 74 68 65 20 61 62 73 6f 6c 75 74 65 20 76  s the absolute v
b2d0: 61 6c 75 65 20 6f 66 20 74 68 65 20 73 69 78 74  alue of the sixt
b2e0: 68 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65  h argument passe
b2f0: 64 20 74 6f 20 74 68 65 0a 20 20 73 6e 69 70 70  d to the.  snipp
b300: 65 74 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66 20  et function. If 
b310: 74 68 65 20 74 65 78 74 20 73 74 6f 72 65 64 20  the text stored 
b320: 69 6e 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75  in a single colu
b330: 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 6c 65 73 73  mn contains less
b340: 20 74 68 61 6e 0a 20 20 3c 69 3e 7c 4e 7c 3c 2f   than.  <i>|N|</
b350: 69 3e 20 74 6f 6b 65 6e 73 2c 20 74 68 65 6e 20  i> tokens, then 
b360: 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6c 75 6d  the entire colum
b370: 6e 20 76 61 6c 75 65 20 69 73 20 63 6f 6e 73 69  n value is consi
b380: 64 65 72 65 64 2e 20 54 65 78 74 20 66 72 61 67  dered. Text frag
b390: 6d 65 6e 74 73 20 0a 20 20 6d 61 79 20 6e 6f 74  ments .  may not
b3a0: 20 73 70 61 6e 20 6d 75 6c 74 69 70 6c 65 20 63   span multiple c
b3b0: 6f 6c 75 6d 6e 73 2e 0a 0a 3c 70 3e 0a 20 20 49  olumns...<p>.  I
b3c0: 66 20 73 75 63 68 20 61 20 74 65 78 74 20 66 72  f such a text fr
b3d0: 61 67 6d 65 6e 74 20 63 61 6e 20 62 65 20 66 6f  agment can be fo
b3e0: 75 6e 64 2c 20 69 74 20 69 73 20 72 65 74 75 72  und, it is retur
b3f0: 6e 65 64 20 77 69 74 68 20 74 68 65 20 66 6f 6c  ned with the fol
b400: 6c 6f 77 69 6e 67 0a 20 20 6d 6f 64 69 66 69 63  lowing.  modific
b410: 61 74 69 6f 6e 73 3a 0a 0a 3c 75 6c 3e 0a 20 20  ations:..<ul>.  
b420: 3c 6c 69 3e 20 49 66 20 74 68 65 20 74 65 78 74  <li> If the text
b430: 20 66 72 61 67 6d 65 6e 74 20 64 6f 65 73 20 6e   fragment does n
b440: 6f 74 20 62 65 67 69 6e 20 61 74 20 74 68 65 20  ot begin at the 
b450: 73 74 61 72 74 20 6f 66 20 61 20 63 6f 6c 75 6d  start of a colum
b460: 6e 20 76 61 6c 75 65 2c 0a 20 20 20 20 20 20 20  n value,.       
b470: 74 68 65 20 22 65 6c 6c 69 70 73 65 73 22 20 74  the "ellipses" t
b480: 65 78 74 20 69 73 20 70 72 65 70 65 6e 64 65 64  ext is prepended
b490: 20 74 6f 20 69 74 2e 0a 20 20 3c 6c 69 3e 20 49   to it..  <li> I
b4a0: 66 20 74 68 65 20 74 65 78 74 20 66 72 61 67 6d  f the text fragm
b4b0: 65 6e 74 20 64 6f 65 73 20 6e 6f 74 20 66 69 6e  ent does not fin
b4c0: 69 73 68 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ish at the end o
b4d0: 66 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65  f a column value
b4e0: 2c 0a 20 20 20 20 20 20 20 74 68 65 20 22 65 6c  ,.       the "el
b4f0: 6c 69 70 73 65 73 22 20 74 65 78 74 20 69 73 20  lipses" text is 
b500: 61 70 70 65 6e 64 65 64 20 74 6f 20 69 74 2e 0a  appended to it..
b510: 20 20 3c 6c 69 3e 20 46 6f 72 20 65 61 63 68 20    <li> For each 
b520: 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20 74 65 78  token in the tex
b530: 74 20 66 72 61 67 6d 65 6e 74 20 74 68 61 74 20  t fragment that 
b540: 69 73 20 70 61 72 74 20 6f 66 20 61 20 70 68 72  is part of a phr
b550: 61 73 65 20 6d 61 74 63 68 2c 0a 20 20 20 20 20  ase match,.     
b560: 20 20 74 68 65 20 22 73 74 61 72 74 20 6d 61 74    the "start mat
b570: 63 68 22 20 74 65 78 74 20 69 73 20 69 6e 73 65  ch" text is inse
b580: 72 74 65 64 20 69 6e 74 6f 20 74 68 65 20 66 72  rted into the fr
b590: 61 67 6d 65 6e 74 20 62 65 66 6f 72 65 20 74 68  agment before th
b5a0: 65 20 74 6f 6b 65 6e 2c 0a 20 20 20 20 20 20 20  e token,.       
b5b0: 61 6e 64 20 74 68 65 20 22 65 6e 64 20 6d 61 74  and the "end mat
b5c0: 63 68 22 20 74 65 78 74 20 69 73 20 69 6e 73 65  ch" text is inse
b5d0: 72 74 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79  rted immediately
b5e0: 20 61 66 74 65 72 20 69 74 2e 0a 3c 2f 75 6c 3e   after it..</ul>
b5f0: 0a 0a 3c 70 3e 0a 20 20 49 66 20 6d 6f 72 65 20  ..<p>.  If more 
b600: 74 68 61 6e 20 6f 6e 65 20 73 75 63 68 20 66 72  than one such fr
b610: 61 67 6d 65 6e 74 20 63 61 6e 20 62 65 20 66 6f  agment can be fo
b620: 75 6e 64 2c 20 74 68 65 6e 20 66 72 61 67 6d 65  und, then fragme
b630: 6e 74 73 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  nts that contain
b640: 0a 20 20 61 20 6c 61 72 67 65 72 20 6e 75 6d 62  .  a larger numb
b650: 65 72 20 6f 66 20 22 65 78 74 72 61 22 20 70 68  er of "extra" ph
b660: 72 61 73 65 20 6d 61 74 63 68 65 73 20 61 72 65  rase matches are
b670: 20 66 61 76 6f 72 65 64 2e 20 54 68 65 20 73 74   favored. The st
b680: 61 72 74 20 6f 66 0a 20 20 74 68 65 20 73 65 6c  art of.  the sel
b690: 65 63 74 65 64 20 74 65 78 74 20 66 72 61 67 6d  ected text fragm
b6a0: 65 6e 74 20 6d 61 79 20 62 65 20 6d 6f 76 65 64  ent may be moved
b6b0: 20 61 20 66 65 77 20 74 6f 6b 65 6e 73 20 66 6f   a few tokens fo
b6c0: 72 77 61 72 64 20 6f 72 20 62 61 63 6b 77 61 72  rward or backwar
b6d0: 64 0a 20 20 74 6f 20 61 74 74 65 6d 70 74 20 74  d.  to attempt t
b6e0: 6f 20 63 6f 6e 63 65 6e 74 72 61 74 65 20 74 68  o concentrate th
b6f0: 65 20 70 68 72 61 73 65 20 6d 61 74 63 68 65 73  e phrase matches
b700: 20 74 6f 77 61 72 64 20 74 68 65 20 63 65 6e 74   toward the cent
b710: 65 72 20 6f 66 20 74 68 65 0a 20 20 66 72 61 67  er of the.  frag
b720: 6d 65 6e 74 2e 0a 0a 3c 70 3e 0a 20 20 41 73 73  ment...<p>.  Ass
b730: 75 6d 69 6e 67 20 3c 69 3e 4e 3c 2f 69 3e 20 69  uming <i>N</i> i
b740: 73 20 61 20 70 6f 73 69 74 69 76 65 20 76 61 6c  s a positive val
b750: 75 65 2c 20 69 66 20 6e 6f 20 66 72 61 67 6d 65  ue, if no fragme
b760: 6e 74 73 20 63 61 6e 20 62 65 20 66 6f 75 6e 64  nts can be found
b770: 20 74 68 61 74 0a 20 20 63 6f 6e 74 61 69 6e 20   that.  contain 
b780: 61 20 70 68 72 61 73 65 20 6d 61 74 63 68 20 63  a phrase match c
b790: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
b7a0: 65 61 63 68 20 6d 61 74 63 68 61 62 6c 65 20 70  each matchable p
b7b0: 68 72 61 73 65 2c 20 74 68 65 20 73 6e 69 70 70  hrase, the snipp
b7c0: 65 74 0a 20 20 66 75 6e 63 74 69 6f 6e 20 61 74  et.  function at
b7d0: 74 65 6d 70 74 73 20 74 6f 20 66 69 6e 64 20 74  tempts to find t
b7e0: 77 6f 20 66 72 61 67 6d 65 6e 74 73 20 6f 66 20  wo fragments of 
b7f0: 61 70 70 72 6f 78 69 6d 61 74 65 6c 79 20 3c 69  approximately <i
b800: 3e 4e 3c 2f 69 3e 2f 32 20 74 6f 6b 65 6e 73 0a  >N</i>/2 tokens.
b810: 20 20 74 68 61 74 20 62 65 74 77 65 65 6e 20 74    that between t
b820: 68 65 6d 20 63 6f 6e 74 61 69 6e 20 61 74 20 6c  hem contain at l
b830: 65 61 73 74 20 6f 6e 65 20 70 68 72 61 73 65 20  east one phrase 
b840: 6d 61 74 63 68 20 66 6f 72 20 65 61 63 68 20 6d  match for each m
b850: 61 74 63 68 61 62 6c 65 20 70 68 72 61 73 65 0a  atchable phrase.
b860: 20 20 6d 61 74 63 68 65 64 20 62 79 20 74 68 65    matched by the
b870: 20 63 75 72 72 65 6e 74 20 72 6f 77 2e 20 49 66   current row. If
b880: 20 74 68 69 73 20 66 61 69 6c 73 2c 20 61 74 74   this fails, att
b890: 65 6d 70 74 73 20 61 72 65 20 6d 61 64 65 20 74  empts are made t
b8a0: 6f 20 66 69 6e 64 20 74 68 72 65 65 0a 20 20 66  o find three.  f
b8b0: 72 61 67 6d 65 6e 74 73 20 6f 66 20 3c 69 3e 4e  ragments of <i>N
b8c0: 3c 2f 69 3e 2f 33 20 74 6f 6b 65 6e 73 20 65 61  </i>/3 tokens ea
b8d0: 63 68 20 61 6e 64 20 66 69 6e 61 6c 6c 79 20 66  ch and finally f
b8e0: 6f 75 72 20 3c 69 3e 4e 3c 2f 69 3e 2f 34 20 74  our <i>N</i>/4 t
b8f0: 6f 6b 65 6e 0a 20 20 66 72 61 67 6d 65 6e 74 73  oken.  fragments
b900: 2e 20 49 66 20 61 20 73 65 74 20 6f 66 20 66 6f  . If a set of fo
b910: 75 72 20 66 72 61 67 6d 65 6e 74 73 20 63 61 6e  ur fragments can
b920: 6e 6f 74 20 62 65 20 66 6f 75 6e 64 20 74 68 61  not be found tha
b930: 74 20 65 6e 63 6f 6d 70 61 73 73 65 73 20 74 68  t encompasses th
b940: 65 0a 20 20 72 65 71 75 69 72 65 64 20 70 68 72  e.  required phr
b950: 61 73 65 20 6d 61 74 63 68 65 73 2c 20 74 68 65  ase matches, the
b960: 20 66 6f 75 72 20 66 72 61 67 6d 65 6e 74 73 20   four fragments 
b970: 6f 66 20 3c 69 3e 4e 3c 2f 69 3e 2f 34 20 74 6f  of <i>N</i>/4 to
b980: 6b 65 6e 73 20 74 68 61 74 20 70 72 6f 76 69 64  kens that provid
b990: 65 0a 20 20 74 68 65 20 62 65 73 74 20 63 6f 76  e.  the best cov
b9a0: 65 72 61 67 65 20 61 72 65 20 73 65 6c 65 63 74  erage are select
b9b0: 65 64 2e 0a 0a 3c 70 3e 0a 20 20 49 66 20 3c 69  ed...<p>.  If <i
b9c0: 3e 4e 3c 2f 69 3e 20 69 73 20 61 20 6e 65 67 61  >N</i> is a nega
b9d0: 74 69 76 65 20 76 61 6c 75 65 2c 20 61 6e 64 20  tive value, and 
b9e0: 6e 6f 20 73 69 6e 67 6c 65 20 66 72 61 67 6d 65  no single fragme
b9f0: 6e 74 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 20  nt can be found 
ba00: 0a 20 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  .  containing th
ba10: 65 20 72 65 71 75 69 72 65 64 20 70 68 72 61 73  e required phras
ba20: 65 20 6d 61 74 63 68 65 73 2c 20 74 68 65 20 73  e matches, the s
ba30: 6e 69 70 70 65 74 20 66 75 6e 63 74 69 6f 6e 20  nippet function 
ba40: 73 65 61 72 63 68 65 73 0a 20 20 66 6f 72 20 74  searches.  for t
ba50: 77 6f 20 66 72 61 67 6d 65 6e 74 73 20 6f 66 20  wo fragments of 
ba60: 3c 69 3e 7c 4e 7c 3c 2f 69 3e 20 74 6f 6b 65 6e  <i>|N|</i> token
ba70: 73 20 65 61 63 68 2c 20 74 68 65 6e 20 74 68 72  s each, then thr
ba80: 65 65 2c 20 74 68 65 6e 20 66 6f 75 72 2e 20 49  ee, then four. I
ba90: 6e 0a 20 20 6f 74 68 65 72 20 77 6f 72 64 73 2c  n.  other words,
baa0: 20 69 66 20 74 68 65 20 73 70 65 63 69 66 69 65   if the specifie
bab0: 64 20 76 61 6c 75 65 20 6f 66 20 3c 69 3e 4e 3c  d value of <i>N<
bac0: 2f 69 3e 20 69 73 20 6e 65 67 61 74 69 76 65 2c  /i> is negative,
bad0: 20 74 68 65 20 73 69 7a 65 73 0a 20 20 6f 66 20   the sizes.  of 
bae0: 74 68 65 20 66 72 61 67 6d 65 6e 74 73 20 69 73  the fragments is
baf0: 20 6e 6f 74 20 64 65 63 72 65 61 73 65 64 20 69   not decreased i
bb00: 66 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  f more than one 
bb10: 66 72 61 67 6d 65 6e 74 20 69 73 20 72 65 71 75  fragment is requ
bb20: 69 72 65 64 0a 20 20 74 6f 20 70 72 6f 76 69 64  ired.  to provid
bb30: 65 20 74 68 65 20 64 65 73 69 72 65 64 20 70 68  e the desired ph
bb40: 72 61 73 65 20 6d 61 74 63 68 20 63 6f 76 65 72  rase match cover
bb50: 61 67 65 2e 0a 0a 3c 70 3e 0a 20 20 41 66 74 65  age...<p>.  Afte
bb60: 72 20 74 68 65 20 3c 69 3e 4d 3c 2f 69 3e 20 66  r the <i>M</i> f
bb70: 72 61 67 6d 65 6e 74 73 20 68 61 76 65 20 62 65  ragments have be
bb80: 65 6e 20 6c 6f 63 61 74 65 64 2c 20 77 68 65 72  en located, wher
bb90: 65 20 3c 69 3e 4d 3c 2f 69 3e 20 69 73 20 62 65  e <i>M</i> is be
bba0: 74 77 65 65 6e 0a 20 20 74 77 6f 20 61 6e 64 20  tween.  two and 
bbb0: 66 6f 75 72 20 61 73 20 64 65 73 63 72 69 62 65  four as describe
bbc0: 64 20 69 6e 20 74 68 65 20 70 61 72 61 67 72 61  d in the paragra
bbd0: 70 68 73 20 61 62 6f 76 65 2c 20 74 68 65 79 20  phs above, they 
bbe0: 61 72 65 20 6a 6f 69 6e 65 64 20 74 6f 67 65 74  are joined toget
bbf0: 68 65 72 0a 20 20 69 6e 20 73 6f 72 74 65 64 20  her.  in sorted 
bc00: 6f 72 64 65 72 20 77 69 74 68 20 74 68 65 20 22  order with the "
bc10: 65 6c 6c 69 70 73 65 73 22 20 74 65 78 74 20 73  ellipses" text s
bc20: 65 70 61 72 61 74 69 6e 67 20 74 68 65 6d 2e 20  eparating them. 
bc30: 54 68 65 20 74 68 72 65 65 20 0a 20 20 6d 6f 64  The three .  mod
bc40: 69 66 69 63 61 74 69 6f 6e 73 20 65 6e 75 6d 65  ifications enume
bc50: 72 61 74 65 64 20 65 61 72 6c 69 65 72 20 61 72  rated earlier ar
bc60: 65 20 70 65 72 66 6f 72 6d 65 64 20 6f 6e 20 74  e performed on t
bc70: 68 65 20 74 65 78 74 20 62 65 66 6f 72 65 20 69  he text before i
bc80: 74 20 69 73 20 0a 20 20 72 65 74 75 72 6e 65 64  t is .  returned
bc90: 2e 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20  ...<codeblock>. 
bca0: 20 3c 62 3e 4e 6f 74 65 3a 20 49 6e 20 74 68 69   <b>Note: In thi
bcb0: 73 20 62 6c 6f 63 6b 20 6f 66 20 65 78 61 6d 70  s block of examp
bcc0: 6c 65 73 2c 20 6e 65 77 6c 69 6e 65 73 20 61 6e  les, newlines an
bcd0: 64 20 77 68 69 74 65 73 70 61 63 65 20 63 68 61  d whitespace cha
bce0: 72 61 63 74 65 72 73 20 68 61 76 65 0a 20 20 62  racters have.  b
bcf0: 65 65 6e 20 69 6e 73 65 72 74 65 64 20 69 6e 74  een inserted int
bd00: 6f 20 74 68 65 20 64 6f 63 75 6d 65 6e 74 20 69  o the document i
bd10: 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 74 68 65  nserted into the
bd20: 20 46 54 53 20 74 61 62 6c 65 2c 20 61 6e 64 20   FTS table, and 
bd30: 74 68 65 20 65 78 70 65 63 74 65 64 0a 20 20 72  the expected.  r
bd40: 65 73 75 6c 74 73 20 64 65 73 63 72 69 62 65 64  esults described
bd50: 20 69 6e 20 53 51 4c 20 63 6f 6d 6d 65 6e 74 73   in SQL comments
bd60: 2e 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20 74  . This is done t
bd70: 6f 20 65 6e 68 61 6e 63 65 20 72 65 61 64 61 62  o enhance readab
bd80: 69 6c 69 74 79 20 6f 6e 6c 79 2c 0a 20 20 74 68  ility only,.  th
bd90: 65 79 20 77 6f 75 6c 64 20 6e 6f 74 20 62 65 20  ey would not be 
bda0: 70 72 65 73 65 6e 74 20 69 6e 20 61 63 74 75 61  present in actua
bdb0: 6c 20 53 51 4c 69 74 65 20 63 6f 6d 6d 61 6e 64  l SQLite command
bdc0: 73 20 6f 72 20 6f 75 74 70 75 74 2e 3c 2f 62 3e  s or output.</b>
bdd0: 0a 0a 20 20 3c 69 3e 2d 2d 20 43 72 65 61 74 65  ..  <i>-- Create
bde0: 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 20 61 6e   and populate an
bdf0: 20 46 54 53 20 74 61 62 6c 65 2e 3c 2f 69 3e 0a   FTS table.</i>.
be00: 20 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c    CREATE VIRTUAL
be10: 20 54 41 42 4c 45 20 74 65 78 74 20 55 53 49 4e   TABLE text USIN
be20: 47 20 66 74 73 34 28 29 3b 0a 20 20 49 4e 53 45  G fts4();.  INSE
be30: 52 54 20 49 4e 54 4f 20 74 65 78 74 20 56 41 4c  RT INTO text VAL
be40: 55 45 53 28 27 0a 20 20 20 20 44 75 72 69 6e 67  UES('.    During
be50: 20 33 30 20 4e 6f 76 2d 31 20 44 65 63 2c 20 32   30 Nov-1 Dec, 2
be60: 2d 33 6f 43 20 64 72 6f 70 73 2e 20 43 6f 6f 6c  -3oC drops. Cool
be70: 20 69 6e 20 74 68 65 20 75 70 70 65 72 20 70 6f   in the upper po
be80: 72 74 69 6f 6e 2c 20 6d 69 6e 69 6d 75 6d 20 74  rtion, minimum t
be90: 65 6d 70 65 72 61 74 75 72 65 20 31 34 2d 31 36  emperature 14-16
bea0: 6f 43 20 0a 20 20 20 20 61 6e 64 20 63 6f 6f 6c  oC .    and cool
beb0: 20 65 6c 73 65 77 68 65 72 65 2c 20 6d 69 6e 69   elsewhere, mini
bec0: 6d 75 6d 20 74 65 6d 70 65 72 61 74 75 72 65 20  mum temperature 
bed0: 31 37 2d 32 30 6f 43 2e 20 43 6f 6c 64 20 74 6f  17-20oC. Cold to
bee0: 20 76 65 72 79 20 63 6f 6c 64 20 6f 6e 20 6d 6f   very cold on mo
bef0: 75 6e 74 61 69 6e 74 6f 70 73 2c 20 0a 20 20 20  untaintops, .   
bf00: 20 6d 69 6e 69 6d 75 6d 20 74 65 6d 70 65 72 61   minimum tempera
bf10: 74 75 72 65 20 36 2d 31 32 6f 43 2e 20 4e 6f 72  ture 6-12oC. Nor
bf20: 74 68 65 61 73 74 65 72 6c 79 20 77 69 6e 64 73  theasterly winds
bf30: 20 31 35 2d 33 30 20 6b 6d 2f 68 72 2e 20 41 66   15-30 km/hr. Af
bf40: 74 65 72 20 74 68 61 74 2c 20 74 65 6d 70 65 72  ter that, temper
bf50: 61 74 75 72 65 20 0a 20 20 20 20 69 6e 63 72 65  ature .    incre
bf60: 61 73 65 73 2e 20 4e 6f 72 74 68 65 61 73 74 65  ases. Northeaste
bf70: 72 6c 79 20 77 69 6e 64 73 20 31 35 2d 33 30 20  rly winds 15-30 
bf80: 6b 6d 2f 68 72 2e 20 20 20 20 20 0a 20 20 27 29  km/hr.     .  ')
bf90: 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 54 68 65 20 66  ;..  <i>-- The f
bfa0: 6f 6c 6c 6f 77 69 6e 67 20 71 75 65 72 79 20 72  ollowing query r
bfb0: 65 74 75 72 6e 73 20 74 68 65 20 74 65 78 74 20  eturns the text 
bfc0: 76 61 6c 75 65 3a 3c 2f 69 3e 0a 20 20 3c 69 3e  value:</i>.  <i>
bfd0: 2d 2d 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 20  --</i>.  <i>--  
bfe0: 20 22 26 6c 74 3b 62 26 67 74 3b 2e 2e 2e 26 6c   "&lt;b&gt;...&l
bff0: 74 3b 2f 62 26 67 74 3b 63 6f 6f 6c 20 65 6c 73  t;/b&gt;cool els
c000: 65 77 68 65 72 65 2c 20 6d 69 6e 69 6d 75 6d 20  ewhere, minimum 
c010: 74 65 6d 70 65 72 61 74 75 72 65 20 31 37 2d 32  temperature 17-2
c020: 30 6f 43 2e 20 26 6c 74 3b 62 26 67 74 3b 43 6f  0oC. &lt;b&gt;Co
c030: 6c 64 26 6c 74 3b 2f 62 26 67 74 3b 20 74 6f 20  ld&lt;/b&gt; to 
c040: 76 65 72 79 20 3c 2f 69 3e 0a 20 20 3c 69 3e 2d  very </i>.  <i>-
c050: 2d 20 20 20 20 26 6c 74 3b 62 26 67 74 3b 63 6f  -    &lt;b&gt;co
c060: 6c 64 26 6c 74 3b 2f 62 26 67 74 3b 20 6f 6e 20  ld&lt;/b&gt; on 
c070: 6d 6f 75 6e 74 61 69 6e 74 6f 70 73 2c 20 6d 69  mountaintops, mi
c080: 6e 69 6d 75 6d 20 74 65 6d 70 65 72 61 74 75 72  nimum temperatur
c090: 65 20 36 26 6c 74 3b 62 26 67 74 3b 2e 2e 2e 26  e 6&lt;b&gt;...&
c0a0: 6c 74 3b 2f 62 26 67 74 3b 22 2e 3c 2f 69 3e 0a  lt;/b&gt;".</i>.
c0b0: 20 20 3c 69 3e 2d 2d 3c 2f 69 3e 0a 20 20 53 45    <i>--</i>.  SE
c0c0: 4c 45 43 54 20 73 6e 69 70 70 65 74 28 74 65 78  LECT snippet(tex
c0d0: 74 29 20 46 52 4f 4d 20 74 65 78 74 20 57 48 45  t) FROM text WHE
c0e0: 52 45 20 74 65 78 74 20 4d 41 54 43 48 20 27 63  RE text MATCH 'c
c0f0: 6f 6c 64 27 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 54  old';..  <i>-- T
c100: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 71 75 65  he following que
c110: 72 79 20 72 65 74 75 72 6e 73 20 74 68 65 20 74  ry returns the t
c120: 65 78 74 20 76 61 6c 75 65 3a 3c 2f 69 3e 0a 20  ext value:</i>. 
c130: 20 3c 69 3e 2d 2d 3c 2f 69 3e 0a 20 20 3c 69 3e   <i>--</i>.  <i>
c140: 2d 2d 20 20 20 22 2e 2e 2e 74 68 65 20 75 70 70  --   "...the upp
c150: 65 72 20 70 6f 72 74 69 6f 6e 2c 20 26 23 39 31  er portion, &#91
c160: 3b 6d 69 6e 69 6d 75 6d 26 23 39 33 3b 20 26 23  ;minimum&#93; &#
c170: 39 31 3b 74 65 6d 70 65 72 61 74 75 72 65 26 23  91;temperature&#
c180: 39 33 3b 20 31 34 2d 31 36 6f 43 20 61 6e 64 20  93; 14-16oC and 
c190: 63 6f 6f 6c 20 65 6c 73 65 77 68 65 72 65 2c 3c  cool elsewhere,<
c1a0: 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 20 20 20 26  /i>.  <i>--    &
c1b0: 23 39 31 3b 6d 69 6e 69 6d 75 6d 26 23 39 33 3b  #91;minimum&#93;
c1c0: 20 26 23 39 31 3b 74 65 6d 70 65 72 61 74 75 72   &#91;temperatur
c1d0: 65 26 23 39 33 3b 20 31 37 2d 32 30 6f 43 2e 20  e&#93; 17-20oC. 
c1e0: 43 6f 6c 64 2e 2e 2e 22 3c 2f 69 3e 0a 20 20 3c  Cold..."</i>.  <
c1f0: 69 3e 2d 2d 3c 2f 69 3e 0a 20 20 53 45 4c 45 43  i>--</i>.  SELEC
c200: 54 20 73 6e 69 70 70 65 74 28 74 65 78 74 2c 20  T snippet(text, 
c210: 27 26 23 39 31 3b 20 27 26 23 39 33 3b 27 2c 20  '&#91; '&#93;', 
c220: 27 2e 2e 2e 27 29 20 46 52 4f 4d 20 74 65 78 74  '...') FROM text
c230: 20 57 48 45 52 45 20 74 65 78 74 20 4d 41 54 43   WHERE text MATC
c240: 48 20 27 22 6d 69 6e 2a 20 74 65 6d 2a 22 27 0a  H '"min* tem*"'.
c250: 3c 2f 63 6f 64 65 62 6c 6f 63 6b 3e 0a 0a 3c 68  </codeblock>..<h
c260: 32 20 69 64 3d 6d 61 74 63 68 69 6e 66 6f 20 74  2 id=matchinfo t
c270: 61 67 73 3d 6d 61 74 63 68 69 6e 66 6f 3e 54 68  ags=matchinfo>Th
c280: 65 20 4d 61 74 63 68 69 6e 66 6f 20 46 75 6e 63  e Matchinfo Func
c290: 74 69 6f 6e 3c 2f 68 32 3e 0a 0a 3c 70 3e 0a 20  tion</h2>..<p>. 
c2a0: 20 54 68 65 20 6d 61 74 63 68 69 6e 66 6f 20 66   The matchinfo f
c2b0: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
c2c0: 61 20 62 6c 6f 62 20 76 61 6c 75 65 2e 20 49 66  a blob value. If
c2d0: 20 69 74 20 69 73 20 75 73 65 64 20 77 69 74 68   it is used with
c2e0: 69 6e 20 61 20 71 75 65 72 79 0a 20 20 74 68 61  in a query.  tha
c2f0: 74 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 74  t does not use t
c300: 68 65 20 66 75 6c 6c 2d 74 65 78 74 20 69 6e 64  he full-text ind
c310: 65 78 20 28 61 20 22 71 75 65 72 79 20 62 79 20  ex (a "query by 
c320: 72 6f 77 69 64 22 20 6f 72 20 22 6c 69 6e 65 61  rowid" or "linea
c330: 72 20 73 63 61 6e 22 29 2c 0a 20 20 74 68 65 6e  r scan"),.  then
c340: 20 74 68 65 20 62 6c 6f 62 20 69 73 20 7a 65 72   the blob is zer
c350: 6f 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e  o bytes in size.
c360: 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20   Otherwise, the 
c370: 62 6c 6f 62 20 63 6f 6e 73 69 73 74 73 20 6f 66  blob consists of
c380: 20 7a 65 72 6f 0a 20 20 6f 72 20 6d 6f 72 65 20   zero.  or more 
c390: 33 32 2d 62 69 74 20 75 6e 73 69 67 6e 65 64 20  32-bit unsigned 
c3a0: 69 6e 74 65 67 65 72 73 20 69 6e 20 6d 61 63 68  integers in mach
c3b0: 69 6e 65 20 62 79 74 65 2d 6f 72 64 65 72 2e 20  ine byte-order. 
c3c0: 54 68 65 20 65 78 61 63 74 20 6e 75 6d 62 65 72  The exact number
c3d0: 0a 20 20 6f 66 20 69 6e 74 65 67 65 72 73 20 69  .  of integers i
c3e0: 6e 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 61  n the returned a
c3f0: 72 72 61 79 20 64 65 70 65 6e 64 73 20 6f 6e 20  rray depends on 
c400: 62 6f 74 68 20 74 68 65 20 71 75 65 72 79 20 61  both the query a
c410: 6e 64 20 74 68 65 20 76 61 6c 75 65 0a 20 20 6f  nd the value.  o
c420: 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  f the second arg
c430: 75 6d 65 6e 74 20 28 69 66 20 61 6e 79 29 20 70  ument (if any) p
c440: 61 73 73 65 64 20 74 6f 20 74 68 65 20 6d 61 74  assed to the mat
c450: 63 68 69 6e 66 6f 20 66 75 6e 63 74 69 6f 6e 2e  chinfo function.
c460: 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 6d 61 74 63  ..<p>.  The matc
c470: 68 69 6e 66 6f 20 66 75 6e 63 74 69 6f 6e 20 69  hinfo function i
c480: 73 20 63 61 6c 6c 65 64 20 77 69 74 68 20 65 69  s called with ei
c490: 74 68 65 72 20 6f 6e 65 20 6f 72 20 74 77 6f 20  ther one or two 
c4a0: 61 72 67 75 6d 65 6e 74 73 2e 20 41 73 20 66 6f  arguments. As fo
c4b0: 72 0a 20 20 61 6c 6c 20 61 75 78 69 6c 69 61 72  r.  all auxiliar
c4c0: 79 20 66 75 6e 63 74 69 6f 6e 73 2c 20 74 68 65  y functions, the
c4d0: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
c4e0: 6d 75 73 74 20 62 65 20 74 68 65 20 73 70 65 63  must be the spec
c4f0: 69 61 6c 20 0a 20 20 5b 46 54 53 20 68 69 64 64  ial .  [FTS hidd
c500: 65 6e 20 63 6f 6c 75 6d 6e 5d 2e 20 54 68 65 20  en column]. The 
c510: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c  second argument,
c520: 20 69 66 20 69 74 20 69 73 20 73 70 65 63 69 66   if it is specif
c530: 69 65 64 2c 20 6d 75 73 74 20 62 65 20 61 20 74  ied, must be a t
c540: 65 78 74 20 76 61 6c 75 65 0a 20 20 63 6f 6d 70  ext value.  comp
c550: 72 69 73 65 64 20 6f 6e 6c 79 20 6f 66 20 74 68  rised only of th
c560: 65 20 63 68 61 72 61 63 74 65 72 73 20 27 70 27  e characters 'p'
c570: 2c 20 27 63 27 2c 20 27 6e 27 2c 20 27 61 27 2c  , 'c', 'n', 'a',
c580: 20 27 6c 27 2c 20 27 73 27 20 61 6e 64 20 27 78   'l', 's' and 'x
c590: 27 2e 0a 20 20 49 66 20 6e 6f 20 73 65 63 6f 6e  '..  If no secon
c5a0: 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 65 78  d argument is ex
c5b0: 70 6c 69 63 69 74 6c 79 20 73 75 70 70 6c 69 65  plicitly supplie
c5c0: 64 2c 20 69 74 20 64 65 66 61 75 6c 74 73 20 74  d, it defaults t
c5d0: 6f 20 22 70 63 78 22 2e 20 54 68 65 0a 20 20 73  o "pcx". The.  s
c5e0: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
c5f0: 73 20 72 65 66 65 72 72 65 64 20 74 6f 20 61 73  s referred to as
c600: 20 74 68 65 20 22 66 6f 72 6d 61 74 20 73 74 72   the "format str
c610: 69 6e 67 22 20 62 65 6c 6f 77 2e 0a 0a 3c 70 3e  ing" below...<p>
c620: 0a 20 20 43 68 61 72 61 63 74 65 72 73 20 69 6e  .  Characters in
c630: 20 74 68 65 20 6d 61 74 63 68 69 6e 66 6f 20 66   the matchinfo f
c640: 6f 72 6d 61 74 20 73 74 72 69 6e 67 20 61 72 65  ormat string are
c650: 20 70 72 6f 63 65 73 73 65 64 20 66 72 6f 6d 20   processed from 
c660: 6c 65 66 74 20 74 6f 20 72 69 67 68 74 2e 20 0a  left to right. .
c670: 20 20 45 61 63 68 20 63 68 61 72 61 63 74 65 72    Each character
c680: 20 69 6e 20 74 68 65 20 66 6f 72 6d 61 74 20 73   in the format s
c690: 74 72 69 6e 67 20 63 61 75 73 65 73 20 6f 6e 65  tring causes one
c6a0: 20 6f 72 20 6d 6f 72 65 20 33 32 2d 62 69 74 20   or more 32-bit 
c6b0: 75 6e 73 69 67 6e 65 64 0a 20 20 69 6e 74 65 67  unsigned.  integ
c6c0: 65 72 20 76 61 6c 75 65 73 20 74 6f 20 62 65 20  er values to be 
c6d0: 61 64 64 65 64 20 74 6f 20 74 68 65 20 72 65 74  added to the ret
c6e0: 75 72 6e 65 64 20 61 72 72 61 79 2e 20 54 68 65  urned array. The
c6f0: 20 22 76 61 6c 75 65 73 22 20 63 6f 6c 75 6d 6e   "values" column
c700: 20 69 6e 0a 20 20 74 68 65 20 66 6f 6c 6c 6f 77   in.  the follow
c710: 69 6e 67 20 74 61 62 6c 65 20 63 6f 6e 74 61 69  ing table contai
c720: 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ns the number of
c730: 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 73 20   integer values 
c740: 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 0a  appended to the.
c750: 20 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20    output buffer 
c760: 66 6f 72 20 65 61 63 68 20 73 75 70 70 6f 72 74  for each support
c770: 65 64 20 66 6f 72 6d 61 74 20 73 74 72 69 6e 67  ed format string
c780: 20 63 68 61 72 61 63 74 65 72 2e 20 49 6e 20 74   character. In t
c790: 68 65 20 66 6f 72 6d 75 6c 61 0a 20 20 67 69 76  he formula.  giv
c7a0: 65 6e 2c 20 3c 69 3e 63 6f 6c 73 3c 2f 69 3e 20  en, <i>cols</i> 
c7b0: 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
c7c0: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
c7d0: 46 54 53 20 74 61 62 6c 65 2c 20 61 6e 64 20 0a  FTS table, and .
c7e0: 20 20 3c 69 3e 70 68 72 61 73 65 73 3c 2f 69 3e    <i>phrases</i>
c7f0: 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
c800: 66 20 3c 61 20 68 72 65 66 3d 23 6d 61 74 63 68  f <a href=#match
c810: 61 62 6c 65 3e 6d 61 74 63 68 61 62 6c 65 20 70  able>matchable p
c820: 68 72 61 73 65 73 3c 2f 61 3e 20 69 6e 20 0a 20  hrases</a> in . 
c830: 20 74 68 65 20 71 75 65 72 79 2e 20 0a 0a 3c 74   the query. ..<t
c840: 61 62 6c 65 20 73 74 72 69 70 65 64 3d 31 3e 0a  able striped=1>.
c850: 20 20 3c 74 72 3e 3c 74 68 3e 43 68 61 72 61 63    <tr><th>Charac
c860: 74 65 72 3c 74 68 3e 56 61 6c 75 65 73 3c 74 68  ter<th>Values<th
c870: 3e 44 65 73 63 72 69 70 74 69 6f 6e 0a 20 20 3c  >Description.  <
c880: 74 72 3e 3c 74 64 3e 70 20 3c 74 64 3e 31 20 3c  tr><td>p <td>1 <
c890: 74 64 3e 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  td>The number of
c8a0: 20 6d 61 74 63 68 61 62 6c 65 20 70 68 72 61 73   matchable phras
c8b0: 65 73 20 69 6e 20 74 68 65 20 71 75 65 72 79 2e  es in the query.
c8c0: 0a 20 20 3c 74 72 3e 3c 74 64 3e 63 20 3c 74 64  .  <tr><td>c <td
c8d0: 3e 31 20 3c 74 64 3e 54 68 65 20 6e 75 6d 62 65  >1 <td>The numbe
c8e0: 72 20 6f 66 20 75 73 65 72 20 64 65 66 69 6e 65  r of user define
c8f0: 64 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  d columns in the
c900: 20 46 54 53 0a 20 20 20 20 74 61 62 6c 65 20 28   FTS.    table (
c910: 69 2e 65 2e 20 6e 6f 74 20 69 6e 63 6c 75 64 69  i.e. not includi
c920: 6e 67 20 74 68 65 20 64 6f 63 69 64 20 6f 72 20  ng the docid or 
c930: 74 68 65 20 5b 46 54 53 20 68 69 64 64 65 6e 20  the [FTS hidden 
c940: 63 6f 6c 75 6d 6e 5d 29 2e 0a 20 20 3c 74 72 3e  column])..  <tr>
c950: 3c 74 64 3e 78 20 3c 74 64 20 73 74 79 6c 65 3d  <td>x <td style=
c960: 22 77 68 69 74 65 2d 73 70 61 63 65 3a 6e 6f 77  "white-space:now
c970: 72 61 70 22 3e 33 20 2a 20 3c 69 3e 63 6f 6c 73  rap">3 * <i>cols
c980: 3c 2f 69 3e 20 2a 20 3c 69 3e 70 68 72 61 73 65  </i> * <i>phrase
c990: 73 3c 2f 69 3e 20 0a 20 20 20 20 3c 74 64 3e 0a  s</i> .    <td>.
c9a0: 20 20 20 20 20 20 46 6f 72 20 65 61 63 68 20 64        For each d
c9b0: 69 73 74 69 6e 63 74 20 63 6f 6d 62 69 6e 61 74  istinct combinat
c9c0: 69 6f 6e 20 6f 66 20 61 20 70 68 72 61 73 65 20  ion of a phrase 
c9d0: 61 6e 64 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  and table column
c9e0: 2c 20 74 68 65 0a 20 20 20 20 20 20 66 6f 6c 6c  , the.      foll
c9f0: 6f 77 69 6e 67 20 74 68 72 65 65 20 76 61 6c 75  owing three valu
ca00: 65 73 3a 0a 20 20 20 20 20 20 3c 75 6c 3e 0a 20  es:.      <ul>. 
ca10: 20 20 20 20 20 20 20 3c 6c 69 3e 20 49 6e 20 74         <li> In t
ca20: 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 2c 20  he current row, 
ca30: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 69  the number of ti
ca40: 6d 65 73 20 74 68 65 20 70 68 72 61 73 65 20 61  mes the phrase a
ca50: 70 70 65 61 72 73 20 69 6e 20 0a 20 20 20 20 20  ppears in .     
ca60: 20 20 20 20 20 20 20 20 74 68 65 20 63 6f 6c 75          the colu
ca70: 6d 6e 2e 0a 20 20 20 20 20 20 20 20 3c 6c 69 3e  mn..        <li>
ca80: 20 54 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   The total numbe
ca90: 72 20 6f 66 20 74 69 6d 65 73 20 74 68 65 20 70  r of times the p
caa0: 68 72 61 73 65 20 61 70 70 65 61 72 73 20 69 6e  hrase appears in
cab0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 0a 20   the column in. 
cac0: 20 20 20 20 20 20 20 20 20 20 20 20 61 6c 6c 20              all 
cad0: 72 6f 77 73 20 69 6e 20 74 68 65 20 46 54 53 20  rows in the FTS 
cae0: 74 61 62 6c 65 2e 0a 20 20 20 20 20 20 20 20 3c  table..        <
caf0: 6c 69 3e 20 54 68 65 20 74 6f 74 61 6c 20 6e 75  li> The total nu
cb00: 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20  mber of rows in 
cb10: 74 68 65 20 46 54 53 20 74 61 62 6c 65 20 66 6f  the FTS table fo
cb20: 72 20 77 68 69 63 68 20 74 68 65 20 0a 20 20 20  r which the .   
cb30: 20 20 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e            column
cb40: 20 63 6f 6e 74 61 69 6e 73 20 61 74 20 6c 65 61   contains at lea
cb50: 73 74 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20  st one instance 
cb60: 6f 66 20 74 68 65 20 70 68 72 61 73 65 2e 0a 20  of the phrase.. 
cb70: 20 20 20 20 20 3c 2f 75 6c 3e 0a 20 20 20 20 20       </ul>.     
cb80: 20 54 68 65 20 66 69 72 73 74 20 73 65 74 20 6f   The first set o
cb90: 66 20 74 68 72 65 65 20 76 61 6c 75 65 73 20 63  f three values c
cba0: 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 68  orresponds to th
cbb0: 65 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75  e left-most colu
cbc0: 6d 6e 0a 20 20 20 20 20 20 6f 66 20 74 68 65 20  mn.      of the 
cbd0: 74 61 62 6c 65 20 28 63 6f 6c 75 6d 6e 20 30 29  table (column 0)
cbe0: 20 61 6e 64 20 74 68 65 20 6c 65 66 74 2d 6d 6f   and the left-mo
cbf0: 73 74 20 6d 61 74 63 68 61 62 6c 65 20 70 68 72  st matchable phr
cc00: 61 73 65 20 69 6e 20 74 68 65 0a 20 20 20 20 20  ase in the.     
cc10: 20 71 75 65 72 79 20 28 70 68 72 61 73 65 20 30   query (phrase 0
cc20: 29 2e 20 49 66 20 74 68 65 20 74 61 62 6c 65 20  ). If the table 
cc30: 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  has more than on
cc40: 65 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 20 73 65  e column, the se
cc50: 63 6f 6e 64 0a 20 20 20 20 20 20 73 65 74 20 6f  cond.      set o
cc60: 66 20 74 68 72 65 65 20 76 61 6c 75 65 73 20 69  f three values i
cc70: 6e 20 74 68 65 20 6f 75 74 70 75 74 20 61 72 72  n the output arr
cc80: 61 79 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f  ay correspond to
cc90: 20 70 68 72 61 73 65 20 30 20 61 6e 64 0a 20 20   phrase 0 and.  
cca0: 20 20 20 20 63 6f 6c 75 6d 6e 20 31 2e 20 46 6f      column 1. Fo
ccb0: 6c 6c 6f 77 65 64 20 62 79 20 70 68 72 61 73 65  llowed by phrase
ccc0: 20 30 2c 20 63 6f 6c 75 6d 6e 20 32 20 61 6e 64   0, column 2 and
ccd0: 20 73 6f 20 6f 6e 20 66 6f 72 20 61 6c 6c 20 63   so on for all c
cce0: 6f 6c 75 6d 6e 73 20 6f 66 0a 20 20 20 20 20 20  olumns of.      
ccf0: 74 68 65 20 74 61 62 6c 65 2e 20 41 6e 64 20 73  the table. And s
cd00: 6f 20 6f 6e 20 66 6f 72 20 70 68 72 61 73 65 20  o on for phrase 
cd10: 31 2c 20 63 6f 6c 75 6d 6e 20 30 2c 20 74 68 65  1, column 0, the
cd20: 6e 20 70 68 72 61 73 65 20 31 2c 20 63 6f 6c 75  n phrase 1, colu
cd30: 6d 6e 20 31 0a 20 20 20 20 20 20 65 74 63 2e 20  mn 1.      etc. 
cd40: 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
cd50: 74 68 65 20 64 61 74 61 20 66 6f 72 20 6f 63 63  the data for occ
cd60: 75 72 72 65 6e 63 65 73 20 6f 66 20 70 68 72 61  urrences of phra
cd70: 73 65 20 3c 69 3e 70 3c 2f 69 3e 20 69 6e 0a 20  se <i>p</i> in. 
cd80: 20 20 20 20 20 63 6f 6c 75 6d 6e 20 3c 69 3e 63       column <i>c
cd90: 3c 2f 69 3e 20 6d 61 79 20 62 65 20 66 6f 75 6e  </i> may be foun
cda0: 64 20 75 73 69 6e 67 20 74 68 65 20 66 6f 6c 6c  d using the foll
cdb0: 6f 77 69 6e 67 20 66 6f 72 6d 75 6c 61 3a 0a 3c  owing formula:.<
cdc0: 70 72 65 3e 0a 20 20 20 20 20 20 20 20 20 20 68  pre>.          h
cdd0: 69 74 73 5f 74 68 69 73 5f 72 6f 77 20 20 3d 20  its_this_row  = 
cde0: 61 72 72 61 79 26 23 39 31 3b 33 20 2a 20 28 63  array&#91;3 * (c
cdf0: 20 2b 20 70 2a 63 6f 6c 73 29 20 2b 20 30 26 23   + p*cols) + 0&#
ce00: 39 33 3b 0a 20 20 20 20 20 20 20 20 20 20 68 69  93;.          hi
ce10: 74 73 5f 61 6c 6c 5f 72 6f 77 73 20 20 3d 20 61  ts_all_rows  = a
ce20: 72 72 61 79 26 23 39 31 3b 33 20 2a 20 28 63 20  rray&#91;3 * (c 
ce30: 2b 20 70 2a 63 6f 6c 73 29 20 2b 20 31 26 23 39  + p*cols) + 1&#9
ce40: 33 3b 0a 20 20 20 20 20 20 20 20 20 20 64 6f 63  3;.          doc
ce50: 73 5f 77 69 74 68 5f 68 69 74 73 20 3d 20 61 72  s_with_hits = ar
ce60: 72 61 79 26 23 39 31 3b 33 20 2a 20 28 63 20 2b  ray&#91;3 * (c +
ce70: 20 70 2a 63 6f 6c 73 29 20 2b 20 32 26 23 39 33   p*cols) + 2&#93
ce80: 3b 0a 3c 2f 70 72 65 3e 0a 20 20 3c 74 72 3e 3c  ;.</pre>.  <tr><
ce90: 74 64 3e 79 20 3c 74 64 20 73 74 79 6c 65 3d 22  td>y <td style="
cea0: 77 68 69 74 65 2d 73 70 61 63 65 3a 6e 6f 77 72  white-space:nowr
ceb0: 61 70 22 3e 3c 69 3e 63 6f 6c 73 3c 2f 69 3e 20  ap"><i>cols</i> 
cec0: 2a 20 3c 69 3e 70 68 72 61 73 65 73 3c 2f 69 3e  * <i>phrases</i>
ced0: 20 0a 20 20 20 20 3c 74 64 3e 0a 20 20 20 20 20   .    <td>.     
cee0: 20 46 6f 72 20 65 61 63 68 20 64 69 73 74 69 6e   For each distin
cef0: 63 74 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f  ct combination o
cf00: 66 20 61 20 70 68 72 61 73 65 20 61 6e 64 20 74  f a phrase and t
cf10: 61 62 6c 65 20 63 6f 6c 75 6d 6e 2c 20 74 68 65  able column, the
cf20: 0a 20 20 20 20 20 20 6e 75 6d 62 65 72 20 6f 66  .      number of
cf30: 20 75 73 61 62 6c 65 20 70 68 72 61 73 65 20 6d   usable phrase m
cf40: 61 74 63 68 65 73 20 74 68 61 74 20 61 70 70 65  atches that appe
cf50: 61 72 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e  ar in the column
cf60: 2e 20 54 68 69 73 20 69 73 0a 20 20 20 20 20 20  . This is.      
cf70: 75 73 75 61 6c 6c 79 20 69 64 65 6e 74 69 63 61  usually identica
cf80: 6c 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 76  l to the first v
cf90: 61 6c 75 65 20 69 6e 20 65 61 63 68 20 73 65 74  alue in each set
cfa0: 20 6f 66 20 74 68 72 65 65 20 72 65 74 75 72 6e   of three return
cfb0: 65 64 20 62 79 20 74 68 65 0a 20 20 20 20 20 20  ed by the.      
cfc0: 27 78 27 20 64 69 72 65 63 74 69 76 65 20 28 73  'x' directive (s
cfd0: 65 65 20 61 62 6f 76 65 29 2e 20 48 6f 77 65 76  ee above). Howev
cfe0: 65 72 2c 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  er, the number o
cff0: 66 20 68 69 74 73 20 72 65 70 6f 72 74 65 64 20  f hits reported 
d000: 62 79 20 74 68 65 0a 20 20 20 20 20 20 27 79 27  by the.      'y'
d010: 20 64 69 72 65 63 74 69 76 65 20 69 73 20 7a 65   directive is ze
d020: 72 6f 20 66 6f 72 20 61 6e 79 20 70 68 72 61 73  ro for any phras
d030: 65 20 74 68 61 74 20 69 73 20 70 61 72 74 20 6f  e that is part o
d040: 66 20 61 20 73 75 62 2d 65 78 70 72 65 73 73 69  f a sub-expressi
d050: 6f 6e 0a 20 20 20 20 20 20 74 68 61 74 20 64 6f  on.      that do
d060: 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65  es not match the
d070: 20 63 75 72 72 65 6e 74 20 72 6f 77 2e 20 54 68   current row. Th
d080: 69 73 20 6d 61 6b 65 73 20 61 20 64 69 66 66 65  is makes a diffe
d090: 72 65 6e 63 65 20 66 6f 72 0a 20 20 20 20 20 20  rence for.      
d0a0: 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74  expressions that
d0b0: 20 63 6f 6e 74 61 69 6e 20 41 4e 44 20 6f 70 65   contain AND ope
d0c0: 72 61 74 6f 72 73 20 74 68 61 74 20 61 72 65 20  rators that are 
d0d0: 64 65 73 63 65 6e 64 61 6e 74 73 20 6f 66 20 4f  descendants of O
d0e0: 52 0a 20 20 20 20 20 20 6f 70 65 72 61 74 6f 72  R.      operator
d0f0: 73 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  s. For example, 
d100: 63 6f 6e 73 69 64 65 72 20 74 68 65 20 65 78 70  consider the exp
d110: 72 65 73 73 69 6f 6e 3a 20 0a 3c 70 72 65 3e 0a  ression: .<pre>.
d120: 20 20 20 20 20 20 20 20 20 20 61 20 4f 52 20 28            a OR (
d130: 62 20 41 4e 44 20 63 29 0a 3c 2f 70 72 65 3e 0a  b AND c).</pre>.
d140: 20 20 20 20 20 20 61 6e 64 20 74 68 65 20 64 6f        and the do
d150: 63 75 6d 65 6e 74 3a 0a 3c 70 72 65 3e 0a 20 20  cument:.<pre>.  
d160: 20 20 20 20 20 20 20 20 22 61 20 63 20 64 22 0a          "a c d".
d170: 3c 2f 70 72 65 3e 0a 20 20 20 20 20 20 54 68 65  </pre>.      The
d180: 20 27 78 27 20 64 69 72 65 63 74 69 76 65 20 77   'x' directive w
d190: 6f 75 6c 64 20 72 65 70 6f 72 74 20 61 20 73 69  ould report a si
d1a0: 6e 67 6c 65 20 68 69 74 20 66 6f 72 20 74 68 65  ngle hit for the
d1b0: 20 70 68 72 61 73 65 73 20 22 61 22 20 61 6e 64   phrases "a" and
d1c0: 20 22 63 22 2e 0a 20 20 20 20 20 20 48 6f 77 65   "c"..      Howe
d1d0: 76 65 72 2c 20 74 68 65 20 27 79 27 20 64 69 72  ver, the 'y' dir
d1e0: 65 63 74 69 76 65 20 72 65 70 6f 72 74 73 20 74  ective reports t
d1f0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 68 69 74  he number of hit
d200: 73 20 66 6f 72 20 22 63 22 20 61 73 20 7a 65 72  s for "c" as zer
d210: 6f 2c 20 61 73 0a 20 20 20 20 20 20 69 74 20 69  o, as.      it i
d220: 73 20 70 61 72 74 20 6f 66 20 61 20 73 75 62 2d  s part of a sub-
d230: 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20  expression that 
d240: 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74  does not match t
d250: 68 65 20 64 6f 63 75 6d 65 6e 74 20 2d 20 28 62  he document - (b
d260: 20 41 4e 44 20 63 29 2e 0a 20 20 20 20 20 20 46   AND c)..      F
d270: 6f 72 20 71 75 65 72 69 65 73 20 74 68 61 74 20  or queries that 
d280: 64 6f 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 41  do not contain A
d290: 4e 44 20 6f 70 65 72 61 74 6f 72 73 20 64 65 73  ND operators des
d2a0: 63 65 6e 64 65 64 20 66 72 6f 6d 20 4f 52 0a 20  cended from OR. 
d2b0: 20 20 20 20 20 6f 70 65 72 61 74 6f 72 73 2c 20       operators, 
d2c0: 74 68 65 20 72 65 73 75 6c 74 20 76 61 6c 75 65  the result value
d2d0: 73 20 72 65 75 74 75 72 6e 65 64 20 62 79 20 27  s reuturned by '
d2e0: 79 27 20 61 72 65 20 61 6c 77 61 79 73 20 74 68  y' are always th
d2f0: 65 20 73 61 6d 65 20 61 73 0a 20 20 20 20 20 20  e same as.      
d300: 74 68 6f 73 65 20 72 65 74 75 72 6e 65 64 20 62  those returned b
d310: 79 20 27 78 27 2e 0a 0a 3c 70 20 73 74 79 6c 65  y 'x'...<p style
d320: 3d 22 6d 61 72 67 69 6e 2d 6c 65 66 74 3a 30 3b  ="margin-left:0;
d330: 6d 61 72 67 69 6e 2d 72 69 67 68 74 3a 30 22 3e  margin-right:0">
d340: 0a 20 20 20 20 20 20 54 68 65 20 66 69 72 73 74  .      The first
d350: 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20 61 72   value in the ar
d360: 72 61 79 20 6f 66 20 69 6e 74 65 67 65 72 20 76  ray of integer v
d370: 61 6c 75 65 73 20 63 6f 72 72 65 73 70 6f 6e 64  alues correspond
d380: 73 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 6c  s to the.      l
d390: 65 66 74 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 6f  eftmost column o
d3a0: 66 20 74 68 65 20 74 61 62 6c 65 20 28 63 6f 6c  f the table (col
d3b0: 75 6d 6e 20 30 29 20 61 6e 64 20 74 68 65 20 66  umn 0) and the f
d3c0: 69 72 73 74 20 70 68 72 61 73 65 20 69 6e 20 74  irst phrase in t
d3d0: 68 65 20 71 75 65 72 79 0a 20 20 20 20 20 20 28  he query.      (
d3e0: 70 68 72 61 73 65 20 30 29 2e 20 54 68 65 20 76  phrase 0). The v
d3f0: 61 6c 75 65 73 20 63 6f 72 72 65 73 70 6f 6e 64  alues correspond
d400: 69 6e 67 20 74 6f 20 6f 74 68 65 72 20 63 6f 6c  ing to other col
d410: 75 6d 6e 2f 70 68 72 61 73 65 20 63 6f 6d 62 69  umn/phrase combi
d420: 6e 61 74 69 6f 6e 73 0a 20 20 20 20 20 20 6d 61  nations.      ma
d430: 79 20 62 65 20 6c 6f 63 61 74 65 64 20 75 73 69  y be located usi
d440: 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ng the following
d450: 20 66 6f 72 6d 75 6c 61 3a 0a 0a 3c 70 72 65 3e   formula:..<pre>
d460: 0a 20 20 20 20 20 20 20 20 20 20 68 69 74 73 5f  .          hits_
d470: 66 6f 72 5f 70 68 72 61 73 65 5f 70 5f 63 6f 6c  for_phrase_p_col
d480: 75 6d 6e 5f 63 20 20 3d 20 61 72 72 61 79 26 23  umn_c  = array&#
d490: 39 31 3b 33 20 2a 20 28 63 20 2b 20 70 2a 63 6f  91;3 * (c + p*co
d4a0: 6c 73 29 20 2b 20 30 26 23 39 33 3b 0a 3c 2f 70  ls) + 0&#93;.</p
d4b0: 72 65 3e 0a 20 20 20 20 20 20 46 6f 72 20 71 75  re>.      For qu
d4c0: 65 72 69 65 73 20 74 68 61 74 20 75 73 65 20 4f  eries that use O
d4d0: 52 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 6f  R expressions, o
d4e0: 72 20 74 68 6f 73 65 20 74 68 61 74 20 75 73 65  r those that use
d4f0: 20 4c 49 4d 49 54 20 6f 72 20 72 65 74 75 72 6e   LIMIT or return
d500: 0a 20 20 20 20 20 20 6d 61 6e 79 20 72 6f 77 73  .      many rows
d510: 2c 20 74 68 65 20 27 79 27 20 6d 61 74 63 68 69  , the 'y' matchi
d520: 6e 66 6f 20 6f 70 74 69 6f 6e 20 6d 61 79 20 69  nfo option may i
d530: 6e 63 75 72 20 73 69 67 6e 69 66 69 63 61 6e 74  ncur significant
d540: 6c 79 20 6c 65 73 73 20 6f 76 65 72 68 65 61 64  ly less overhead
d550: 0a 20 20 20 20 20 20 74 68 61 6e 20 27 78 27 2e  .      than 'x'.
d560: 0a 0a 20 20 3c 74 72 3e 3c 74 64 3e 6e 20 3c 74  ..  <tr><td>n <t
d570: 64 3e 31 20 3c 74 64 3e 54 68 65 20 6e 75 6d 62  d>1 <td>The numb
d580: 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68  er of rows in th
d590: 65 20 46 54 53 34 20 74 61 62 6c 65 2e 20 54 68  e FTS4 table. Th
d5a0: 69 73 20 76 61 6c 75 65 20 69 73 0a 20 20 20 20  is value is.    
d5b0: 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 77  only available w
d5c0: 68 65 6e 20 71 75 65 72 79 69 6e 67 20 46 54 53  hen querying FTS
d5d0: 34 20 74 61 62 6c 65 73 2c 20 6e 6f 74 20 46 54  4 tables, not FT
d5e0: 53 33 2e 0a 20 20 3c 74 72 3e 3c 74 64 3e 61 20  S3..  <tr><td>a 
d5f0: 3c 74 64 3e 3c 69 3e 63 6f 6c 73 3c 2f 69 3e 20  <td><i>cols</i> 
d600: 3c 74 64 3e 46 6f 72 20 65 61 63 68 20 63 6f 6c  <td>For each col
d610: 75 6d 6e 2c 20 74 68 65 20 61 76 65 72 61 67 65  umn, the average
d620: 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 74   number of.    t
d630: 6f 6b 65 6e 73 20 69 6e 20 74 68 65 20 74 65 78  okens in the tex
d640: 74 20 76 61 6c 75 65 73 20 73 74 6f 72 65 64 20  t values stored 
d650: 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 28 63  in the column (c
d660: 6f 6e 73 69 64 65 72 69 6e 67 20 61 6c 6c 20 72  onsidering all r
d670: 6f 77 73 20 69 6e 0a 20 20 20 20 74 68 65 20 46  ows in.    the F
d680: 54 53 34 20 74 61 62 6c 65 29 2e 20 54 68 69 73  TS4 table). This
d690: 20 76 61 6c 75 65 20 69 73 20 6f 6e 6c 79 20 61   value is only a
d6a0: 76 61 69 6c 61 62 6c 65 20 77 68 65 6e 20 71 75  vailable when qu
d6b0: 65 72 79 69 6e 67 20 46 54 53 34 20 74 61 62 6c  erying FTS4 tabl
d6c0: 65 73 2c 0a 20 20 20 20 6e 6f 74 20 46 54 53 33  es,.    not FTS3
d6d0: 2e 20 20 0a 20 20 3c 74 72 3e 3c 74 64 3e 6c 20  .  .  <tr><td>l 
d6e0: 3c 74 64 3e 3c 69 3e 63 6f 6c 73 3c 2f 69 3e 20  <td><i>cols</i> 
d6f0: 3c 74 64 3e 0a 20 20 20 20 46 6f 72 20 65 61 63  <td>.    For eac
d700: 68 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 20 6c 65  h column, the le
d710: 6e 67 74 68 20 6f 66 20 74 68 65 20 76 61 6c 75  ngth of the valu
d720: 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  e stored in the 
d730: 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20 74  current row of t
d740: 68 65 0a 20 20 20 20 46 54 53 34 20 74 61 62 6c  he.    FTS4 tabl
d750: 65 2c 20 69 6e 20 74 6f 6b 65 6e 73 2e 20 20 54  e, in tokens.  T
d760: 68 69 73 20 76 61 6c 75 65 20 69 73 20 6f 6e 6c  his value is onl
d770: 79 20 61 76 61 69 6c 61 62 6c 65 20 77 68 65 6e  y available when
d780: 20 71 75 65 72 79 69 6e 67 0a 20 20 20 20 46 54   querying.    FT
d790: 53 34 20 74 61 62 6c 65 73 2c 20 6e 6f 74 20 46  S4 tables, not F
d7a0: 54 53 33 2e 20 41 6e 64 20 6f 6e 6c 79 20 69 66  TS3. And only if
d7b0: 20 74 68 65 20 22 6d 61 74 63 68 69 6e 66 6f 3d   the "matchinfo=
d7c0: 66 74 73 33 22 20 64 69 72 65 63 74 69 76 65 20  fts3" directive 
d7d0: 77 61 73 20 6e 6f 74 0a 20 20 20 20 73 70 65 63  was not.    spec
d7e0: 69 66 69 65 64 20 61 73 20 70 61 72 74 20 6f 66  ified as part of
d7f0: 20 74 68 65 20 22 43 52 45 41 54 45 20 56 49 52   the "CREATE VIR
d800: 54 55 41 4c 20 54 41 42 4c 45 22 20 73 74 61 74  TUAL TABLE" stat
d810: 65 6d 65 6e 74 20 75 73 65 64 20 74 6f 20 63 72  ement used to cr
d820: 65 61 74 65 0a 20 20 20 20 74 68 65 20 46 54 53  eate.    the FTS
d830: 34 20 74 61 62 6c 65 2e 0a 20 20 3c 74 72 3e 3c  4 table..  <tr><
d840: 74 64 3e 73 20 3c 74 64 3e 3c 69 3e 63 6f 6c 73  td>s <td><i>cols
d850: 3c 2f 69 3e 20 3c 74 64 3e 46 6f 72 20 65 61 63  </i> <td>For eac
d860: 68 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 20 6c 65  h column, the le
d870: 6e 67 74 68 20 6f 66 20 74 68 65 20 6c 6f 6e 67  ngth of the long
d880: 65 73 74 20 0a 20 20 20 20 73 75 62 73 65 71 75  est .    subsequ
d890: 65 6e 63 65 20 6f 66 20 70 68 72 61 73 65 20 6d  ence of phrase m
d8a0: 61 74 63 68 65 73 20 74 68 61 74 20 74 68 65 20  atches that the 
d8b0: 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 68 61 73  column value has
d8c0: 20 69 6e 20 63 6f 6d 6d 6f 6e 0a 20 20 20 20 77   in common.    w
d8d0: 69 74 68 20 74 68 65 20 71 75 65 72 79 20 74 65  ith the query te
d8e0: 78 74 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  xt. For example,
d8f0: 20 69 66 20 61 20 74 61 62 6c 65 20 63 6f 6c 75   if a table colu
d900: 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  mn contains the 
d910: 74 65 78 74 0a 20 20 20 20 27 61 20 62 20 63 20  text.    'a b c 
d920: 64 20 65 27 20 61 6e 64 20 74 68 65 20 71 75 65  d e' and the que
d930: 72 79 20 69 73 20 27 61 20 63 20 22 64 20 65 22  ry is 'a c "d e"
d940: 27 2c 20 74 68 65 6e 20 74 68 65 20 6c 65 6e 67  ', then the leng
d950: 74 68 20 6f 66 20 74 68 65 20 6c 6f 6e 67 65 73  th of the longes
d960: 74 0a 20 20 20 20 63 6f 6d 6d 6f 6e 20 73 75 62  t.    common sub
d970: 73 65 71 75 65 6e 63 65 20 69 73 20 32 20 28 70  sequence is 2 (p
d980: 68 72 61 73 65 20 22 63 22 20 66 6f 6c 6c 6f 77  hrase "c" follow
d990: 65 64 20 62 79 20 70 68 72 61 73 65 20 22 64 20  ed by phrase "d 
d9a0: 65 22 29 2e 0a 20 20 20 20 0a 20 20 20 20 0a 3c  e")..    .    .<
d9b0: 2f 74 61 62 6c 65 3e 0a 0a 3c 70 3e 0a 20 20 46  /table>..<p>.  F
d9c0: 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 0a 3c 63 6f  or example:..<co
d9d0: 64 65 62 6c 6f 63 6b 3e 0a 20 20 3c 69 3e 2d 2d  deblock>.  <i>--
d9e0: 20 43 72 65 61 74 65 20 61 6e 64 20 70 6f 70 75   Create and popu
d9f0: 6c 61 74 65 20 61 6e 20 46 54 53 34 20 74 61 62  late an FTS4 tab
da00: 6c 65 20 77 69 74 68 20 74 77 6f 20 63 6f 6c 75  le with two colu
da10: 6d 6e 73 3a 3c 2f 69 3e 0a 20 20 43 52 45 41 54  mns:</i>.  CREAT
da20: 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20  E VIRTUAL TABLE 
da30: 74 31 20 55 53 49 4e 47 20 66 74 73 34 28 61 2c  t1 USING fts4(a,
da40: 20 62 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e   b);.  INSERT IN
da50: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27 74 72  TO t1 VALUES('tr
da60: 61 6e 73 61 63 74 69 6f 6e 20 64 65 66 61 75 6c  ansaction defaul
da70: 74 20 6d 6f 64 65 6c 73 20 64 65 66 61 75 6c 74  t models default
da80: 27 2c 20 27 4e 6f 6e 20 74 72 61 6e 73 61 63 74  ', 'Non transact
da90: 69 6f 6e 20 72 65 61 64 73 27 29 3b 0a 20 20 49  ion reads');.  I
daa0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
dab0: 4c 55 45 53 28 27 74 68 65 20 64 65 66 61 75 6c  LUES('the defaul
dac0: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 27 2c 20  t transaction', 
dad0: 27 74 68 65 73 65 20 73 65 6d 61 6e 74 69 63 73  'these semantics
dae0: 20 70 72 65 73 65 6e 74 27 29 3b 0a 20 20 49 4e   present');.  IN
daf0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
db00: 55 45 53 28 27 73 69 6e 67 6c 65 20 72 65 71 75  UES('single requ
db10: 65 73 74 27 2c 20 27 64 65 66 61 75 6c 74 20 64  est', 'default d
db20: 61 74 61 27 29 3b 0a 0a 20 20 3c 69 3e 2d 2d 20  ata');..  <i>-- 
db30: 49 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  In the following
db40: 20 71 75 65 72 79 2c 20 6e 6f 20 66 6f 72 6d 61   query, no forma
db50: 74 20 73 74 72 69 6e 67 20 69 73 20 73 70 65 63  t string is spec
db60: 69 66 69 65 64 20 61 6e 64 20 73 6f 20 69 74 20  ified and so it 
db70: 64 65 66 61 75 6c 74 73 3c 2f 69 3e 0a 20 20 3c  defaults</i>.  <
db80: 69 3e 2d 2d 20 74 6f 20 22 70 63 78 22 2e 20 49  i>-- to "pcx". I
db90: 74 20 74 68 65 72 65 66 6f 72 65 20 72 65 74 75  t therefore retu
dba0: 72 6e 73 20 61 20 73 69 6e 67 6c 65 20 72 6f 77  rns a single row
dbb0: 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20 61   consisting of a
dbc0: 20 73 69 6e 67 6c 65 20 62 6c 6f 62 3c 2f 69 3e   single blob</i>
dbd0: 0a 20 20 3c 69 3e 2d 2d 20 76 61 6c 75 65 20 38  .  <i>-- value 8
dbe0: 30 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 20  0 bytes in size 
dbf0: 28 32 30 20 33 32 2d 62 69 74 20 69 6e 74 65 67  (20 32-bit integ
dc00: 65 72 73 20 2d 20 31 20 66 6f 72 20 22 70 22 2c  ers - 1 for "p",
dc10: 20 31 20 66 6f 72 20 22 63 22 20 61 6e 64 3c 2f   1 for "c" and</
dc20: 69 3e 0a 20 20 3c 69 3e 2d 2d 20 33 2a 32 2a 33  i>.  <i>-- 3*2*3
dc30: 20 66 6f 72 20 22 78 22 29 2e 20 49 66 20 65 61   for "x"). If ea
dc40: 63 68 20 62 6c 6f 63 6b 20 6f 66 20 34 20 62 79  ch block of 4 by
dc50: 74 65 73 20 69 6e 3c 2f 69 3e 20 74 68 65 20 62  tes in</i> the b
dc60: 6c 6f 62 20 69 73 20 69 6e 74 65 72 70 72 65 74  lob is interpret
dc70: 65 64 3c 2f 69 3e 20 0a 20 20 3c 69 3e 2d 2d 20  ed</i> .  <i>-- 
dc80: 61 73 20 61 6e 20 75 6e 73 69 67 6e 65 64 20 69  as an unsigned i
dc90: 6e 74 65 67 65 72 20 69 6e 20 6d 61 63 68 69 6e  nteger in machin
dca0: 65 20 62 79 74 65 2d 6f 72 64 65 72 2c 20 74 68  e byte-order, th
dcb0: 65 20 76 61 6c 75 65 73 20 77 69 6c 6c 20 62 65  e values will be
dcc0: 3a 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 3c 2f 69  :</i>.  <i>--</i
dcd0: 3e 0a 20 20 3c 69 3e 2d 2d 20 20 20 20 20 33 20  >.  <i>--     3 
dce0: 32 20 20 31 20 33 20 32 20 20 30 20 31 20 31 20  2  1 3 2  0 1 1 
dcf0: 20 31 20 32 20 32 20 20 30 20 31 20 31 20 20 30   1 2 2  0 1 1  0
dd00: 20 30 20 30 20 20 31 20 31 20 31 3c 2f 69 3e 0a   0 0  1 1 1</i>.
dd10: 20 20 3c 69 3e 2d 2d 3c 2f 69 3e 0a 20 20 3c 69    <i>--</i>.  <i
dd20: 3e 2d 2d 20 54 68 65 20 72 6f 77 20 72 65 74 75  >-- The row retu
dd30: 72 6e 65 64 20 63 6f 72 72 65 73 70 6f 6e 64 73  rned corresponds
dd40: 20 74 6f 20 74 68 65 20 73 65 63 6f 6e 64 20 65   to the second e
dd50: 6e 74 72 79 20 69 6e 73 65 72 74 65 64 20 69 6e  ntry inserted in
dd60: 74 6f 20 74 61 62 6c 65 20 74 31 2e 3c 2f 69 3e  to table t1.</i>
dd70: 0a 20 20 3c 69 3e 2d 2d 20 54 68 65 20 66 69 72  .  <i>-- The fir
dd80: 73 74 20 74 77 6f 20 69 6e 74 65 67 65 72 73 20  st two integers 
dd90: 69 6e 20 74 68 65 20 62 6c 6f 62 20 73 68 6f 77  in the blob show
dda0: 20 74 68 61 74 20 74 68 65 20 71 75 65 72 79 20   that the query 
ddb0: 63 6f 6e 74 61 69 6e 65 64 20 74 68 72 65 65 3c  contained three<
ddc0: 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 70 68 72 61  /i>.  <i>-- phra
ddd0: 73 65 73 20 61 6e 64 20 74 68 65 20 74 61 62 6c  ses and the tabl
dde0: 65 20 62 65 69 6e 67 20 71 75 65 72 69 65 64 20  e being queried 
ddf0: 68 61 73 20 74 77 6f 20 63 6f 6c 75 6d 6e 73 2e  has two columns.
de00: 20 54 68 65 20 6e 65 78 74 20 62 6c 6f 63 6b 20   The next block 
de10: 6f 66 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 74  of</i>.  <i>-- t
de20: 68 72 65 65 20 69 6e 74 65 67 65 72 73 20 64 65  hree integers de
de30: 73 63 72 69 62 65 73 20 63 6f 6c 75 6d 6e 20 30  scribes column 0
de40: 20 28 69 6e 20 74 68 69 73 20 63 61 73 65 20 63   (in this case c
de50: 6f 6c 75 6d 6e 20 22 61 22 29 20 61 6e 64 20 70  olumn "a") and p
de60: 68 72 61 73 65 3c 2f 69 3e 0a 20 20 3c 69 3e 2d  hrase</i>.  <i>-
de70: 2d 20 30 20 28 69 6e 20 74 68 69 73 20 63 61 73  - 0 (in this cas
de80: 65 20 22 64 65 66 61 75 6c 74 22 29 2e 20 54 68  e "default"). Th
de90: 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 63 6f  e current row co
dea0: 6e 74 61 69 6e 73 20 31 20 68 69 74 20 66 6f 72  ntains 1 hit for
deb0: 20 22 64 65 66 61 75 6c 74 22 3c 2f 69 3e 0a 20   "default"</i>. 
dec0: 20 3c 69 3e 2d 2d 20 69 6e 20 63 6f 6c 75 6d 6e   <i>-- in column
ded0: 20 30 2c 20 6f 66 20 61 20 74 6f 74 61 6c 20 6f   0, of a total o
dee0: 66 20 33 20 68 69 74 73 20 66 6f 72 20 22 64 65  f 3 hits for "de
def0: 66 61 75 6c 74 22 20 74 68 61 74 20 6f 63 63 75  fault" that occu
df00: 72 20 69 6e 20 63 6f 6c 75 6d 6e 3c 2f 69 3e 0a  r in column</i>.
df10: 20 20 3c 69 3e 2d 2d 20 30 20 6f 66 20 61 6e 79    <i>-- 0 of any
df20: 20 74 61 62 6c 65 20 72 6f 77 2e 20 54 68 65 20   table row. The 
df30: 33 20 68 69 74 73 20 61 72 65 20 73 70 72 65 61  3 hits are sprea
df40: 64 20 61 63 72 6f 73 73 20 32 20 64 69 66 66 65  d across 2 diffe
df50: 72 65 6e 74 20 72 6f 77 73 2e 3c 2f 69 3e 0a 20  rent rows.</i>. 
df60: 20 3c 69 3e 2d 2d 3c 2f 69 3e 0a 20 20 3c 69 3e   <i>--</i>.  <i>
df70: 2d 2d 20 54 68 65 20 6e 65 78 74 20 73 65 74 20  -- The next set 
df80: 6f 66 20 74 68 72 65 65 20 69 6e 74 65 67 65 72  of three integer
df90: 73 20 28 30 20 31 20 31 29 20 70 65 72 74 61 69  s (0 1 1) pertai
dfa0: 6e 20 74 6f 20 74 68 65 20 68 69 74 73 20 66 6f  n to the hits fo
dfb0: 72 20 22 64 65 66 61 75 6c 74 22 3c 2f 69 3e 0a  r "default"</i>.
dfc0: 20 20 3c 69 3e 2d 2d 20 69 6e 20 63 6f 6c 75 6d    <i>-- in colum
dfd0: 6e 20 31 20 6f 66 20 74 68 65 20 74 61 62 6c 65  n 1 of the table
dfe0: 20 28 30 20 69 6e 20 74 68 69 73 20 72 6f 77 2c   (0 in this row,
dff0: 20 31 20 69 6e 20 61 6c 6c 20 72 6f 77 73 2c 20   1 in all rows, 
e000: 73 70 72 65 61 64 20 61 63 72 6f 73 73 20 3c 2f  spread across </
e010: 69 3e 0a 20 20 3c 69 3e 2d 2d 20 31 20 72 6f 77  i>.  <i>-- 1 row
e020: 73 29 2e 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 3c  s).</i>.  <i>--<
e030: 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20 6d 61 74  /i>.  SELECT mat
e040: 63 68 69 6e 66 6f 28 74 31 29 20 46 52 4f 4d 20  chinfo(t1) FROM 
e050: 74 31 20 57 48 45 52 45 20 74 31 20 4d 41 54 43  t1 WHERE t1 MATC
e060: 48 20 27 64 65 66 61 75 6c 74 20 74 72 61 6e 73  H 'default trans
e070: 61 63 74 69 6f 6e 20 22 74 68 65 73 65 20 73 65  action "these se
e080: 6d 61 6e 74 69 63 73 22 27 3b 0a 0a 20 20 3c 69  mantics"';..  <i
e090: 3e 2d 2d 20 54 68 65 20 66 6f 72 6d 61 74 20 73  >-- The format s
e0a0: 74 72 69 6e 67 20 66 6f 72 20 74 68 69 73 20 71  tring for this q
e0b0: 75 65 72 79 20 69 73 20 22 6e 73 22 2e 20 54 68  uery is "ns". Th
e0c0: 65 20 6f 75 74 70 75 74 20 61 72 72 61 79 20 77  e output array w
e0d0: 69 6c 6c 20 74 68 65 72 65 66 6f 72 65 3c 2f 69  ill therefore</i
e0e0: 3e 0a 20 20 3c 69 3e 2d 2d 20 63 6f 6e 74 61 69  >.  <i>-- contai
e0f0: 6e 20 33 20 69 6e 74 65 67 65 72 20 76 61 6c 75  n 3 integer valu
e100: 65 73 20 2d 20 31 20 66 6f 72 20 22 6e 22 20 61  es - 1 for "n" a
e110: 6e 64 20 32 20 66 6f 72 20 22 73 22 2e 20 54 68  nd 2 for "s". Th
e120: 65 20 71 75 65 72 79 20 72 65 74 75 72 6e 73 3c  e query returns<
e130: 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 74 77 6f 20  /i>.  <i>-- two 
e140: 72 6f 77 73 20 28 74 68 65 20 66 69 72 73 74 20  rows (the first 
e150: 74 77 6f 20 72 6f 77 73 20 69 6e 20 74 68 65 20  two rows in the 
e160: 74 61 62 6c 65 20 6d 61 74 63 68 29 2e 20 54 68  table match). Th
e170: 65 20 76 61 6c 75 65 73 20 72 65 74 75 72 6e 65  e values returne
e180: 64 20 61 72 65 3a 3c 2f 69 3e 0a 20 20 3c 69 3e  d are:</i>.  <i>
e190: 2d 2d 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 20  --</i>.  <i>--  
e1a0: 20 20 20 33 20 20 31 20 31 3c 2f 69 3e 0a 20 20     3  1 1</i>.  
e1b0: 3c 69 3e 2d 2d 20 20 20 20 20 33 20 20 32 20 30  <i>--     3  2 0
e1c0: 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 3c 2f 69 3e  </i>.  <i>--</i>
e1d0: 0a 20 20 3c 69 3e 2d 2d 20 54 68 65 20 66 69 72  .  <i>-- The fir
e1e0: 73 74 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20  st value in the 
e1f0: 6d 61 74 63 68 69 6e 66 6f 20 61 72 72 61 79 20  matchinfo array 
e200: 72 65 74 75 72 6e 65 64 20 66 6f 72 20 62 6f 74  returned for bot
e210: 68 20 72 6f 77 73 20 69 73 20 33 20 28 74 68 65  h rows is 3 (the
e220: 20 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 6e 75   </i>.  <i>-- nu
e230: 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20  mber of rows in 
e240: 74 68 65 20 74 61 62 6c 65 29 2e 20 54 68 65 20  the table). The 
e250: 66 6f 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 76 61  following two va
e260: 6c 75 65 73 20 61 72 65 20 74 68 65 20 6c 65 6e  lues are the len
e270: 67 74 68 73 20 3c 2f 69 3e 0a 20 20 3c 69 3e 2d  gths </i>.  <i>-
e280: 2d 20 6f 66 20 74 68 65 20 6c 6f 6e 67 65 73 74  - of the longest
e290: 20 63 6f 6d 6d 6f 6e 20 73 75 62 73 65 71 75 65   common subseque
e2a0: 6e 63 65 20 6f 66 20 70 68 72 61 73 65 20 6d 61  nce of phrase ma
e2b0: 74 63 68 65 73 20 69 6e 20 65 61 63 68 20 63 6f  tches in each co
e2c0: 6c 75 6d 6e 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45  lumn.</i>.  SELE
e2d0: 43 54 20 6d 61 74 63 68 69 6e 66 6f 28 74 31 2c  CT matchinfo(t1,
e2e0: 20 27 6e 73 27 29 20 46 52 4f 4d 20 74 31 20 57   'ns') FROM t1 W
e2f0: 48 45 52 45 20 74 31 20 4d 41 54 43 48 20 27 64  HERE t1 MATCH 'd
e300: 65 66 61 75 6c 74 20 74 72 61 6e 73 61 63 74 69  efault transacti
e310: 6f 6e 27 3b 0a 3c 2f 63 6f 64 65 62 6c 6f 63 6b  on';.</codeblock
e320: 3e 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 6d 61 74  >..<p>.  The mat
e330: 63 68 69 6e 66 6f 20 66 75 6e 63 74 69 6f 6e 20  chinfo function 
e340: 69 73 20 6d 75 63 68 20 66 61 73 74 65 72 20 74  is much faster t
e350: 68 61 6e 20 65 69 74 68 65 72 20 74 68 65 20 73  han either the s
e360: 6e 69 70 70 65 74 20 6f 72 20 6f 66 66 73 65 74  nippet or offset
e370: 73 0a 20 20 66 75 6e 63 74 69 6f 6e 73 2e 20 54  s.  functions. T
e380: 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20 74  his is because t
e390: 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
e3a0: 6e 20 6f 66 20 62 6f 74 68 20 73 6e 69 70 70 65  n of both snippe
e3b0: 74 20 61 6e 64 20 6f 66 66 73 65 74 73 0a 20 20  t and offsets.  
e3c0: 69 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 72  is required to r
e3d0: 65 74 72 69 65 76 65 20 74 68 65 20 64 6f 63 75  etrieve the docu
e3e0: 6d 65 6e 74 73 20 62 65 69 6e 67 20 61 6e 61 6c  ments being anal
e3f0: 79 7a 65 64 20 66 72 6f 6d 20 64 69 73 6b 2c 20  yzed from disk, 
e400: 77 68 65 72 65 61 73 0a 20 20 61 6c 6c 20 64 61  whereas.  all da
e410: 74 61 20 72 65 71 75 69 72 65 64 20 62 79 20 6d  ta required by m
e420: 61 74 63 68 69 6e 66 6f 20 69 73 20 61 76 61 69  atchinfo is avai
e430: 6c 61 62 6c 65 20 61 73 20 70 61 72 74 20 6f 66  lable as part of
e440: 20 74 68 65 20 73 61 6d 65 20 70 6f 72 74 69 6f   the same portio
e450: 6e 73 0a 20 20 6f 66 20 74 68 65 20 66 75 6c 6c  ns.  of the full
e460: 2d 74 65 78 74 20 69 6e 64 65 78 20 74 68 61 74  -text index that
e470: 20 61 72 65 20 72 65 71 75 69 72 65 64 20 74 6f   are required to
e480: 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 66   implement the f
e490: 75 6c 6c 2d 74 65 78 74 20 71 75 65 72 79 0a 20  ull-text query. 
e4a0: 20 69 74 73 65 6c 66 2e 20 54 68 69 73 20 6d 65   itself. This me
e4b0: 61 6e 73 20 74 68 61 74 20 6f 66 20 74 68 65 20  ans that of the 
e4c0: 66 6f 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 71 75  following two qu
e4d0: 65 72 69 65 73 2c 20 74 68 65 20 66 69 72 73 74  eries, the first
e4e0: 20 6d 61 79 20 62 65 0a 20 20 61 6e 20 6f 72 64   may be.  an ord
e4f0: 65 72 20 6f 66 20 6d 61 67 6e 69 74 75 64 65 20  er of magnitude 
e500: 66 61 73 74 65 72 20 74 68 61 6e 20 74 68 65 20  faster than the 
e510: 73 65 63 6f 6e 64 3a 0a 0a 3c 63 6f 64 65 62 6c  second:..<codebl
e520: 6f 63 6b 3e 0a 20 20 53 45 4c 45 43 54 20 64 6f  ock>.  SELECT do
e530: 63 69 64 2c 20 6d 61 74 63 68 69 6e 66 6f 28 74  cid, matchinfo(t
e540: 62 6c 29 20 46 52 4f 4d 20 74 62 6c 20 57 48 45  bl) FROM tbl WHE
e550: 52 45 20 74 62 6c 20 4d 41 54 43 48 20 26 6c 74  RE tbl MATCH &lt
e560: 3b 71 75 65 72 79 20 65 78 70 72 65 73 73 69 6f  ;query expressio
e570: 6e 26 67 74 3b 3b 0a 20 20 53 45 4c 45 43 54 20  n&gt;;.  SELECT 
e580: 64 6f 63 69 64 2c 20 6f 66 66 73 65 74 73 28 74  docid, offsets(t
e590: 62 6c 29 20 46 52 4f 4d 20 74 62 6c 20 57 48 45  bl) FROM tbl WHE
e5a0: 52 45 20 74 62 6c 20 4d 41 54 43 48 20 26 6c 74  RE tbl MATCH &lt
e5b0: 3b 71 75 65 72 79 20 65 78 70 72 65 73 73 69 6f  ;query expressio
e5c0: 6e 26 67 74 3b 3b 0a 3c 2f 63 6f 64 65 62 6c 6f  n&gt;;.</codeblo
e5d0: 63 6b 3e 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 6d  ck>..<p>.  The m
e5e0: 61 74 63 68 69 6e 66 6f 20 66 75 6e 63 74 69 6f  atchinfo functio
e5f0: 6e 20 70 72 6f 76 69 64 65 73 20 61 6c 6c 20 74  n provides all t
e600: 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 72  he information r
e610: 65 71 75 69 72 65 64 20 74 6f 20 63 61 6c 63 75  equired to calcu
e620: 6c 61 74 65 0a 20 20 70 72 6f 62 61 62 69 6c 69  late.  probabili
e630: 73 74 69 63 20 22 62 61 67 2d 6f 66 2d 77 6f 72  stic "bag-of-wor
e640: 64 73 22 20 72 65 6c 65 76 61 6e 63 79 20 73 63  ds" relevancy sc
e650: 6f 72 65 73 20 73 75 63 68 20 61 73 20 0a 20 20  ores such as .  
e660: 3c 61 20 68 72 65 66 3d 68 74 74 70 3a 2f 2f 65  <a href=http://e
e670: 6e 2e 77 69 6b 69 70 65 64 69 61 2e 6f 72 67 2f  n.wikipedia.org/
e680: 77 69 6b 69 2f 4f 6b 61 70 69 5f 42 4d 32 35 3e  wiki/Okapi_BM25>
e690: 4f 6b 61 70 69 20 42 4d 32 35 2f 42 4d 32 35 46  Okapi BM25/BM25F
e6a0: 3c 2f 61 3e 20 74 68 61 74 20 6d 61 79 0a 20 20  </a> that may.  
e6b0: 62 65 20 75 73 65 64 20 74 6f 20 6f 72 64 65 72  be used to order
e6c0: 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20 66 75   results in a fu
e6d0: 6c 6c 2d 74 65 78 74 20 73 65 61 72 63 68 20 61  ll-text search a
e6e0: 70 70 6c 69 63 61 74 69 6f 6e 2e 20 41 70 70 65  pplication. Appe
e6f0: 6e 64 69 78 20 41 20 6f 66 20 74 68 69 73 20 0a  ndix A of this .
e700: 20 20 64 6f 63 75 6d 65 6e 74 2c 20 22 5b 73 65    document, "[se
e710: 61 72 63 68 20 61 70 70 6c 69 63 61 74 69 6f 6e  arch application
e720: 20 74 69 70 73 5d 22 2c 20 63 6f 6e 74 61 69 6e   tips]", contain
e730: 73 20 61 6e 20 65 78 61 6d 70 6c 65 20 6f 66 20  s an example of 
e740: 75 73 69 6e 67 20 74 68 65 0a 20 20 6d 61 74 63  using the.  matc
e750: 68 69 6e 66 6f 28 29 20 66 75 6e 63 74 69 6f 6e  hinfo() function
e760: 20 65 66 66 69 63 69 65 6e 74 6c 79 2e 0a 0a 3c   efficiently...<
e770: 68 31 20 69 64 3d 66 74 73 34 61 75 78 20 74 61  h1 id=fts4aux ta
e780: 67 73 3d 22 66 74 73 34 61 75 78 22 3e 46 74 73  gs="fts4aux">Fts
e790: 34 61 75 78 20 2d 20 44 69 72 65 63 74 20 41 63  4aux - Direct Ac
e7a0: 63 65 73 73 20 74 6f 20 74 68 65 20 46 75 6c 6c  cess to the Full
e7b0: 2d 54 65 78 74 20 49 6e 64 65 78 3c 2f 68 31 3e  -Text Index</h1>
e7c0: 0a 0a 3c 70 3e 0a 20 20 41 73 20 6f 66 20 76 65  ..<p>.  As of ve
e7d0: 72 73 69 6f 6e 20 33 2e 37 2e 36 2c 20 53 51 4c  rsion 3.7.6, SQL
e7e0: 69 74 65 20 69 6e 63 6c 75 64 65 73 20 61 20 6e  ite includes a n
e7f0: 65 77 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  ew virtual table
e800: 20 6d 6f 64 75 6c 65 20 63 61 6c 6c 65 64 20 0a   module called .
e810: 20 20 22 66 74 73 34 61 75 78 22 2c 20 77 68 69    "fts4aux", whi
e820: 63 68 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  ch can be used t
e830: 6f 20 69 6e 73 70 65 63 74 20 74 68 65 20 66 75  o inspect the fu
e840: 6c 6c 2d 74 65 78 74 20 69 6e 64 65 78 20 6f 66  ll-text index of
e850: 20 61 6e 20 65 78 69 73 74 69 6e 67 0a 20 20 46   an existing.  F
e860: 54 53 20 74 61 62 6c 65 20 64 69 72 65 63 74 6c  TS table directl
e870: 79 2e 20 44 65 73 70 69 74 65 20 69 74 73 20 6e  y. Despite its n
e880: 61 6d 65 2c 20 66 74 73 34 61 75 78 20 77 6f 72  ame, fts4aux wor
e890: 6b 73 20 6a 75 73 74 20 61 73 20 77 65 6c 6c 20  ks just as well 
e8a0: 77 69 74 68 20 46 54 53 33 0a 20 20 74 61 62 6c  with FTS3.  tabl
e8b0: 65 73 20 61 73 20 69 74 20 64 6f 65 73 20 77 69  es as it does wi
e8c0: 74 68 20 46 54 53 34 20 74 61 62 6c 65 73 2e 20  th FTS4 tables. 
e8d0: 46 74 73 34 61 75 78 20 74 61 62 6c 65 73 20 61  Fts4aux tables a
e8e0: 72 65 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 54 68  re read-only. Th
e8f0: 65 20 6f 6e 6c 79 0a 20 20 77 61 79 20 74 6f 20  e only.  way to 
e900: 6d 6f 64 69 66 79 20 74 68 65 20 63 6f 6e 74 65  modify the conte
e910: 6e 74 73 20 6f 66 20 61 6e 20 66 74 73 34 61 75  nts of an fts4au
e920: 78 20 74 61 62 6c 65 20 69 73 20 62 79 20 6d 6f  x table is by mo
e930: 64 69 66 79 69 6e 67 20 74 68 65 0a 20 20 63 6f  difying the.  co
e940: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 61 73  ntents of the as
e950: 73 6f 63 69 61 74 65 64 20 46 54 53 20 74 61 62  sociated FTS tab
e960: 6c 65 2e 20 54 68 65 20 66 74 73 34 61 75 78 20  le. The fts4aux 
e970: 6d 6f 64 75 6c 65 20 69 73 20 61 75 74 6f 6d 61  module is automa
e980: 74 69 63 61 6c 6c 79 0a 20 20 69 6e 63 6c 75 64  tically.  includ
e990: 65 64 20 69 6e 20 61 6c 6c 20 5b 63 6f 6d 70 69  ed in all [compi
e9a0: 6c 65 20 66 74 73 7c 62 75 69 6c 64 73 20 74 68  le fts|builds th
e9b0: 61 74 20 69 6e 63 6c 75 64 65 20 46 54 53 5d 2e  at include FTS].
e9c0: 0a 0a 3c 70 3e 0a 20 20 41 6e 20 66 74 73 34 61  ..<p>.  An fts4a
e9d0: 75 78 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  ux virtual table
e9e0: 20 69 73 20 63 6f 6e 73 74 72 75 63 74 65 64 20   is constructed 
e9f0: 77 69 74 68 20 6f 6e 65 20 6f 72 20 74 77 6f 20  with one or two 
ea00: 61 72 67 75 6d 65 6e 74 73 2e 20 20 57 68 65 6e  arguments.  When
ea10: 0a 20 20 75 73 65 64 20 77 69 74 68 20 61 20 73  .  used with a s
ea20: 69 6e 67 6c 65 20 61 72 67 75 6d 65 6e 74 2c 20  ingle argument, 
ea30: 74 68 61 74 20 61 72 67 75 6d 65 6e 74 20 69 73  that argument is
ea40: 20 74 68 65 20 75 6e 71 75 61 6c 69 66 69 65 64   the unqualified
ea50: 20 6e 61 6d 65 20 6f 66 20 74 68 65 0a 20 20 46   name of the.  F
ea60: 54 53 20 74 61 62 6c 65 20 74 68 61 74 20 69 74  TS table that it
ea70: 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f   will be used to
ea80: 20 61 63 63 65 73 73 2e 20 20 54 6f 20 61 63 63   access.  To acc
ea90: 65 73 73 20 61 20 74 61 62 6c 65 20 69 6e 20 61  ess a table in a
eaa0: 20 64 69 66 66 65 72 65 6e 74 0a 20 20 64 61 74   different.  dat
eab0: 61 62 61 73 65 20 28 66 6f 72 20 65 78 61 6d 70  abase (for examp
eac0: 6c 65 2c 20 74 6f 20 63 72 65 61 74 65 20 61 20  le, to create a 
ead0: 54 45 4d 50 20 66 74 73 34 61 75 78 20 74 61 62  TEMP fts4aux tab
eae0: 6c 65 20 74 68 61 74 20 77 69 6c 6c 20 61 63 63  le that will acc
eaf0: 65 73 73 20 61 6e 0a 20 20 46 54 53 33 20 74 61  ess an.  FTS3 ta
eb00: 62 6c 65 20 69 6e 20 74 68 65 20 4d 41 49 4e 20  ble in the MAIN 
eb10: 64 61 74 61 62 61 73 65 29 20 75 73 65 20 74 68  database) use th
eb20: 65 20 74 77 6f 2d 61 72 67 75 6d 65 6e 74 20 66  e two-argument f
eb30: 6f 72 6d 20 61 6e 64 20 67 69 76 65 20 74 68 65  orm and give the
eb40: 0a 20 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74  .  name of the t
eb50: 61 72 67 65 74 20 64 61 74 61 62 61 73 65 20 28  arget database (
eb60: 65 78 3a 20 22 6d 61 69 6e 22 29 20 69 6e 20 74  ex: "main") in t
eb70: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
eb80: 74 20 61 6e 64 20 74 68 65 20 6e 61 6d 65 0a 20  t and the name. 
eb90: 20 6f 66 20 74 68 65 20 46 54 53 33 2f 34 20 74   of the FTS3/4 t
eba0: 61 62 6c 65 20 61 73 20 74 68 65 20 73 65 63 6f  able as the seco
ebb0: 6e 64 20 61 72 67 75 6d 65 6e 74 2e 20 20 28 54  nd argument.  (T
ebc0: 68 65 20 74 77 6f 2d 61 72 67 75 6d 65 6e 74 20  he two-argument 
ebd0: 66 6f 72 6d 20 6f 66 20 0a 20 20 66 74 73 34 61  form of .  fts4a
ebe0: 75 78 20 77 61 73 20 61 64 64 65 64 20 66 6f 72  ux was added for
ebf0: 20 53 51 4c 69 74 65 20 76 65 72 73 69 6f 6e 20   SQLite version 
ec00: 33 2e 37 2e 31 37 20 61 6e 64 20 77 69 6c 6c 20  3.7.17 and will 
ec10: 74 68 72 6f 77 20 61 6e 20 65 72 72 6f 72 20 69  throw an error i
ec20: 6e 0a 20 20 70 72 69 6f 72 20 72 65 6c 65 61 73  n.  prior releas
ec30: 65 73 2e 29 0a 20 20 46 6f 72 20 65 78 61 6d 70  es.).  For examp
ec40: 6c 65 3a 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e  le:..<codeblock>
ec50: 0a 20 20 3c 69 3e 2d 2d 20 43 72 65 61 74 65 20  .  <i>-- Create 
ec60: 61 6e 20 46 54 53 34 20 74 61 62 6c 65 3c 2f 69  an FTS4 table</i
ec70: 3e 0a 20 20 43 52 45 41 54 45 20 56 49 52 54 55  >.  CREATE VIRTU
ec80: 41 4c 20 54 41 42 4c 45 20 66 74 20 55 53 49 4e  AL TABLE ft USIN
ec90: 47 20 66 74 73 34 28 78 2c 20 79 29 3b 0a 0a 20  G fts4(x, y);.. 
eca0: 20 3c 69 3e 2d 2d 20 43 72 65 61 74 65 20 61 6e   <i>-- Create an
ecb0: 20 66 74 73 34 61 75 78 20 74 61 62 6c 65 20 74   fts4aux table t
ecc0: 6f 20 61 63 63 65 73 73 20 74 68 65 20 66 75 6c  o access the ful
ecd0: 6c 2d 74 65 78 74 20 69 6e 64 65 78 20 66 6f 72  l-text index for
ece0: 20 74 61 62 6c 65 20 22 66 74 22 3c 2f 69 3e 0a   table "ft"</i>.
ecf0: 20 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c    CREATE VIRTUAL
ed00: 20 54 41 42 4c 45 20 66 74 5f 74 65 72 6d 73 20   TABLE ft_terms 
ed10: 55 53 49 4e 47 20 66 74 73 34 61 75 78 28 66 74  USING fts4aux(ft
ed20: 29 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 43 72 65 61  );..  <i>-- Crea
ed30: 74 65 20 61 20 54 45 4d 50 20 66 74 73 34 61 75  te a TEMP fts4au
ed40: 78 20 74 61 62 6c 65 20 61 63 63 65 73 73 69 6e  x table accessin
ed50: 67 20 74 68 65 20 22 66 74 22 20 74 61 62 6c 65  g the "ft" table
ed60: 20 69 6e 20 22 6d 61 69 6e 22 3c 2f 69 3e 0a 20   in "main"</i>. 
ed70: 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20   CREATE VIRTUAL 
ed80: 54 41 42 4c 45 20 74 65 6d 70 2e 66 74 5f 74 65  TABLE temp.ft_te
ed90: 72 6d 73 5f 32 20 55 53 49 4e 47 20 66 74 73 34  rms_2 USING fts4
eda0: 61 75 78 28 6d 61 69 6e 2c 66 74 29 3b 0a 3c 2f  aux(main,ft);.</
edb0: 63 6f 64 65 62 6c 6f 63 6b 3e 0a 0a 3c 70 3e 0a  codeblock>..<p>.
edc0: 20 20 46 6f 72 20 65 61 63 68 20 74 65 72 6d 20    For each term 
edd0: 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 46  present in the F
ede0: 54 53 20 74 61 62 6c 65 2c 20 74 68 65 72 65 20  TS table, there 
edf0: 61 72 65 20 62 65 74 77 65 65 6e 20 32 20 61 6e  are between 2 an
ee00: 64 20 4e 2b 31 20 72 6f 77 73 0a 20 20 69 6e 20  d N+1 rows.  in 
ee10: 74 68 65 20 66 74 73 34 61 75 78 20 74 61 62 6c  the fts4aux tabl
ee20: 65 2c 20 77 68 65 72 65 20 4e 20 69 73 20 74 68  e, where N is th
ee30: 65 20 6e 75 6d 62 65 72 20 6f 66 20 75 73 65 72  e number of user
ee40: 2d 64 65 66 69 6e 65 64 20 63 6f 6c 75 6d 6e 73  -defined columns
ee50: 20 69 6e 0a 20 20 74 68 65 20 61 73 73 6f 63 69   in.  the associ
ee60: 61 74 65 64 20 46 54 53 20 74 61 62 6c 65 2e 20  ated FTS table. 
ee70: 41 6e 20 66 74 73 34 61 75 78 20 74 61 62 6c 65  An fts4aux table
ee80: 20 61 6c 77 61 79 73 20 68 61 73 20 74 68 65 20   always has the 
ee90: 73 61 6d 65 20 66 6f 75 72 20 63 6f 6c 75 6d 6e  same four column
eea0: 73 2c 20 0a 20 20 61 73 20 66 6f 6c 6c 6f 77 73  s, .  as follows
eeb0: 2c 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72  , from left to r
eec0: 69 67 68 74 3a 0a 0a 3c 74 61 62 6c 65 20 73 74  ight:..<table st
eed0: 72 69 70 65 64 3d 31 3e 0a 20 20 3c 74 72 3e 3c  riped=1>.  <tr><
eee0: 74 68 3e 43 6f 6c 75 6d 6e 20 4e 61 6d 65 3c 74  th>Column Name<t
eef0: 68 3e 43 6f 6c 75 6d 6e 20 43 6f 6e 74 65 6e 74  h>Column Content
ef00: 73 0a 20 20 3c 74 72 3e 3c 74 64 3e 74 65 72 6d  s.  <tr><td>term
ef10: 3c 74 64 3e 20 0a 20 20 20 20 43 6f 6e 74 61 69  <td> .    Contai
ef20: 6e 73 20 74 68 65 20 74 65 78 74 20 6f 66 20 74  ns the text of t
ef30: 68 65 20 74 65 72 6d 20 66 6f 72 20 74 68 69 73  he term for this
ef40: 20 72 6f 77 2e 0a 20 20 3c 74 72 3e 3c 74 64 3e   row..  <tr><td>
ef50: 63 6f 6c 3c 74 64 3e 20 0a 20 20 20 20 54 68 69  col<td> .    Thi
ef60: 73 20 63 6f 6c 75 6d 6e 20 6d 61 79 20 63 6f 6e  s column may con
ef70: 74 61 69 6e 20 65 69 74 68 65 72 20 74 68 65 20  tain either the 
ef80: 74 65 78 74 20 76 61 6c 75 65 20 27 2a 27 20 28  text value '*' (
ef90: 69 2e 65 2e 20 61 20 73 69 6e 67 6c 65 20 0a 20  i.e. a single . 
efa0: 20 20 20 63 68 61 72 61 63 74 65 72 2c 20 55 2b     character, U+
efb0: 30 30 32 61 29 20 6f 72 20 61 6e 20 69 6e 74 65  002a) or an inte
efc0: 67 65 72 20 62 65 74 77 65 65 6e 20 30 20 61 6e  ger between 0 an
efd0: 64 20 4e 2d 31 2c 20 77 68 65 72 65 20 4e 20 69  d N-1, where N i
efe0: 73 0a 20 20 20 20 61 67 61 69 6e 20 74 68 65 20  s.    again the 
eff0: 6e 75 6d 62 65 72 20 6f 66 20 75 73 65 72 2d 64  number of user-d
f000: 65 66 69 6e 65 64 20 63 6f 6c 75 6d 6e 73 20 69  efined columns i
f010: 6e 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  n the correspond
f020: 69 6e 67 20 46 54 53 20 74 61 62 6c 65 2e 0a 0a  ing FTS table...
f030: 20 20 3c 74 72 3e 3c 74 64 3e 64 6f 63 75 6d 65    <tr><td>docume
f040: 6e 74 73 3c 74 64 3e 0a 20 20 20 20 54 68 69 73  nts<td>.    This
f050: 20 63 6f 6c 75 6d 6e 20 61 6c 77 61 79 73 20 63   column always c
f060: 6f 6e 74 61 69 6e 73 20 61 6e 20 69 6e 74 65 67  ontains an integ
f070: 65 72 20 76 61 6c 75 65 20 67 72 65 61 74 65 72  er value greater
f080: 20 74 68 61 6e 20 7a 65 72 6f 2e 0a 20 20 20 20   than zero..    
f090: 3c 62 72 3e 3c 62 72 3e 0a 20 20 20 20 49 66 20  <br><br>.    If 
f0a0: 74 68 65 20 22 63 6f 6c 22 20 63 6f 6c 75 6d 6e  the "col" column
f0b0: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 76 61   contains the va
f0c0: 6c 75 65 20 27 2a 27 2c 20 74 68 65 6e 20 74 68  lue '*', then th
f0d0: 69 73 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 63 6f  is column.    co
f0e0: 6e 74 61 69 6e 73 20 74 68 65 20 6e 75 6d 62 65  ntains the numbe
f0f0: 72 20 6f 66 20 72 6f 77 73 20 6f 66 20 74 68 65  r of rows of the
f100: 20 46 54 53 20 74 61 62 6c 65 20 74 68 61 74 20   FTS table that 
f110: 63 6f 6e 74 61 69 6e 20 61 74 20 6c 65 61 73 74  contain at least
f120: 20 6f 6e 65 0a 20 20 20 20 69 6e 73 74 61 6e 63   one.    instanc
f130: 65 20 6f 66 20 74 68 65 20 74 65 72 6d 20 28 69  e of the term (i
f140: 6e 20 61 6e 79 20 63 6f 6c 75 6d 6e 29 2e 20 49  n any column). I
f150: 66 20 63 6f 6c 20 63 6f 6e 74 61 69 6e 73 20 61  f col contains a
f160: 6e 20 69 6e 74 65 67 65 72 0a 20 20 20 20 76 61  n integer.    va
f170: 6c 75 65 2c 20 74 68 65 6e 20 74 68 69 73 20 63  lue, then this c
f180: 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 74  olumn contains t
f190: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
f1a0: 73 20 6f 66 20 74 68 65 20 46 54 53 20 74 61 62  s of the FTS tab
f1b0: 6c 65 20 74 68 61 74 0a 20 20 20 20 63 6f 6e 74  le that.    cont
f1c0: 61 69 6e 20 61 74 20 6c 65 61 73 74 20 6f 6e 65  ain at least one
f1d0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
f1e0: 20 74 65 72 6d 20 69 6e 20 74 68 65 20 63 6f 6c   term in the col
f1f0: 75 6d 6e 20 69 64 65 6e 74 69 66 69 65 64 20 62  umn identified b
f200: 79 0a 20 20 20 20 74 68 65 20 63 6f 6c 20 76 61  y.    the col va
f210: 6c 75 65 2e 20 41 73 20 75 73 75 61 6c 2c 20 74  lue. As usual, t
f220: 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68  he columns of th
f230: 65 20 46 54 53 20 74 61 62 6c 65 20 61 72 65 20  e FTS table are 
f240: 6e 75 6d 62 65 72 65 64 0a 20 20 20 20 66 72 6f  numbered.    fro
f250: 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 2c  m left to right,
f260: 20 73 74 61 72 74 69 6e 67 20 77 69 74 68 20 7a   starting with z
f270: 65 72 6f 2e 0a 0a 20 20 3c 74 72 3e 3c 74 64 3e  ero...  <tr><td>
f280: 6f 63 63 75 72 72 65 6e 63 65 73 3c 74 64 3e 0a  occurrences<td>.
f290: 20 20 20 20 54 68 69 73 20 63 6f 6c 75 6d 6e 20      This column 
f2a0: 61 6c 73 6f 20 61 6c 77 61 79 73 20 63 6f 6e 74  also always cont
f2b0: 61 69 6e 73 20 61 6e 20 69 6e 74 65 67 65 72 20  ains an integer 
f2c0: 76 61 6c 75 65 20 67 72 65 61 74 65 72 20 74 68  value greater th
f2d0: 61 6e 20 7a 65 72 6f 2e 0a 20 20 20 20 3c 62 72  an zero..    <br
f2e0: 3e 3c 62 72 3e 0a 20 20 20 20 49 66 20 74 68 65  ><br>.    If the
f2f0: 20 22 63 6f 6c 22 20 63 6f 6c 75 6d 6e 20 63 6f   "col" column co
f300: 6e 74 61 69 6e 73 20 74 68 65 20 76 61 6c 75 65  ntains the value
f310: 20 27 2a 27 2c 20 74 68 65 6e 20 74 68 69 73 20   '*', then this 
f320: 63 6f 6c 75 6d 6e 0a 20 20 20 20 63 6f 6e 74 61  column.    conta
f330: 69 6e 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75  ins the total nu
f340: 6d 62 65 72 20 6f 66 20 69 6e 73 74 61 6e 63 65  mber of instance
f350: 73 20 6f 66 20 74 68 65 20 74 65 72 6d 20 69 6e  s of the term in
f360: 20 61 6c 6c 20 72 6f 77 73 20 6f 66 20 74 68 65   all rows of the
f370: 20 0a 20 20 20 20 46 54 53 20 74 61 62 6c 65 20   .    FTS table 
f380: 28 69 6e 20 61 6e 79 20 63 6f 6c 75 6d 6e 29 2e  (in any column).
f390: 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 63   Otherwise, if c
f3a0: 6f 6c 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 69  ol contains an i
f3b0: 6e 74 65 67 65 72 0a 20 20 20 20 76 61 6c 75 65  nteger.    value
f3c0: 2c 20 74 68 65 6e 20 74 68 69 73 20 63 6f 6c 75  , then this colu
f3d0: 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  mn contains the 
f3e0: 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
f3f0: 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68 65  instances of the
f400: 0a 20 20 20 20 74 65 72 6d 20 74 68 61 74 20 61  .    term that a
f410: 70 70 65 61 72 20 69 6e 20 74 68 65 20 46 54 53  ppear in the FTS
f420: 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 69 64   table column id
f430: 65 6e 74 69 66 69 65 64 20 62 79 20 74 68 65 20  entified by the 
f440: 63 6f 6c 0a 20 20 20 20 76 61 6c 75 65 2e 0a 0a  col.    value...
f450: 20 20 3c 74 72 3e 3c 74 64 3e 6c 61 6e 67 75 61    <tr><td>langua
f460: 67 65 69 64 20 3c 69 3e 28 68 69 64 64 65 6e 29  geid <i>(hidden)
f470: 3c 2f 69 3e 3c 74 64 3e 0a 20 20 20 20 3c 74 63  </i><td>.    <tc
f480: 6c 3e 68 64 5f 66 72 61 67 6d 65 6e 74 20 66 34  l>hd_fragment f4
f490: 61 6c 69 64 20 7b 66 74 73 34 61 75 78 20 6c 61  alid {fts4aux la
f4a0: 6e 67 75 61 67 65 69 64 20 63 6f 6c 75 6d 6e 7d  nguageid column}
f4b0: 3c 2f 74 63 6c 3e 0a 20 20 20 20 54 68 69 73 20  </tcl>.    This 
f4c0: 63 6f 6c 75 6d 6e 20 64 65 74 65 72 6d 69 6e 65  column determine
f4d0: 73 20 77 68 69 63 68 20 5b 6c 61 6e 67 75 61 67  s which [languag
f4e0: 65 69 64 5d 20 69 73 20 75 73 65 64 20 74 6f 0a  eid] is used to.
f4f0: 20 20 20 20 65 78 74 72 61 63 74 20 76 6f 63 61      extract voca
f500: 62 75 6c 61 72 79 20 66 72 6f 6d 20 74 68 65 20  bulary from the 
f510: 46 54 53 33 2f 34 20 74 61 62 6c 65 2e 0a 20 20  FTS3/4 table..  
f520: 20 20 3c 62 72 3e 3c 62 72 3e 0a 20 20 20 20 54    <br><br>.    T
f530: 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65  he default value
f540: 20 66 6f 72 20 6c 61 6e 67 75 61 67 65 69 64 20   for languageid 
f550: 69 73 20 30 2e 20 20 49 66 20 61 6e 20 61 6c 74  is 0.  If an alt
f560: 65 72 6e 61 74 69 76 65 20 6c 61 6e 67 75 61 67  ernative languag
f570: 65 0a 20 20 20 20 69 73 20 73 70 65 63 69 66 69  e.    is specifi
f580: 65 64 20 69 6e 20 57 48 45 52 45 20 63 6c 61 75  ed in WHERE clau
f590: 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20  se constraints, 
f5a0: 74 68 65 6e 20 74 68 61 74 20 61 6c 74 65 72 6e  then that altern
f5b0: 61 74 69 76 65 20 69 73 0a 20 20 20 20 75 73 65  ative is.    use
f5c0: 64 20 69 6e 73 74 65 61 64 20 6f 66 20 30 2e 20  d instead of 0. 
f5d0: 20 54 68 65 72 65 20 63 61 6e 20 6f 6e 6c 79 20   There can only 
f5e0: 62 65 20 61 20 73 69 6e 67 6c 65 20 6c 61 6e 67  be a single lang
f5f0: 75 61 67 65 69 64 20 70 65 72 20 71 75 65 72 79  uageid per query
f600: 2e 0a 20 20 20 20 49 6e 20 6f 74 68 65 72 20 77  ..    In other w
f610: 6f 72 64 73 2c 20 74 68 65 20 57 48 45 52 45 20  ords, the WHERE 
f620: 63 6c 61 75 73 65 20 63 61 6e 6e 6f 74 20 63 6f  clause cannot co
f630: 6e 74 61 69 6e 20 61 20 72 61 6e 67 65 20 63 6f  ntain a range co
f640: 6e 73 74 72 61 69 6e 74 0a 20 20 20 20 6f 72 20  nstraint.    or 
f650: 49 4e 20 6f 70 65 72 61 74 6f 72 20 6f 6e 20 74  IN operator on t
f660: 68 65 20 6c 61 6e 67 75 61 67 65 69 64 2e 0a 3c  he languageid..<
f670: 2f 74 61 62 6c 65 3e 0a 0a 3c 70 3e 0a 20 20 46  /table>..<p>.  F
f680: 6f 72 20 65 78 61 6d 70 6c 65 2c 20 75 73 69 6e  or example, usin
f690: 67 20 74 68 65 20 74 61 62 6c 65 73 20 63 72 65  g the tables cre
f6a0: 61 74 65 64 20 61 62 6f 76 65 3a 0a 0a 3c 63 6f  ated above:..<co
f6b0: 64 65 62 6c 6f 63 6b 3e 0a 20 20 49 4e 53 45 52  deblock>.  INSER
f6c0: 54 20 49 4e 54 4f 20 66 74 28 78 2c 20 79 29 20  T INTO ft(x, y) 
f6d0: 56 41 4c 55 45 53 28 27 41 70 70 6c 65 20 62 61  VALUES('Apple ba
f6e0: 6e 61 6e 61 27 2c 20 27 43 68 65 72 72 79 27 29  nana', 'Cherry')
f6f0: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
f700: 66 74 28 78 2c 20 79 29 20 56 41 4c 55 45 53 28  ft(x, y) VALUES(
f710: 27 42 61 6e 61 6e 61 20 44 61 74 65 20 44 61 74  'Banana Date Dat
f720: 65 27 2c 20 27 63 68 65 72 72 79 27 29 3b 0a 20  e', 'cherry');. 
f730: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 66 74 28   INSERT INTO ft(
f740: 78 2c 20 79 29 20 56 41 4c 55 45 53 28 27 43 68  x, y) VALUES('Ch
f750: 65 72 72 79 20 45 6c 64 65 72 62 65 72 72 79 27  erry Elderberry'
f760: 2c 20 27 45 6c 64 65 72 62 65 72 72 79 27 29 3b  , 'Elderberry');
f770: 0a 0a 20 20 3c 69 3e 2d 2d 20 54 68 65 20 66 6f  ..  <i>-- The fo
f780: 6c 6c 6f 77 69 6e 67 20 71 75 65 72 79 20 72 65  llowing query re
f790: 74 75 72 6e 73 20 74 68 69 73 20 64 61 74 61 3a  turns this data:
f7a0: 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 3c 2f 69 3e  </i>.  <i>--</i>
f7b0: 0a 20 20 3c 69 3e 2d 2d 20 20 20 20 20 61 70 70  .  <i>--     app
f7c0: 6c 65 20 20 20 20 20 20 20 7c 20 20 2a 20 20 7c  le       |  *  |
f7d0: 20 20 31 20 20 7c 20 20 31 3c 2f 69 3e 0a 20 20    1  |  1</i>.  
f7e0: 3c 69 3e 2d 2d 20 20 20 20 20 61 70 70 6c 65 20  <i>--     apple 
f7f0: 20 20 20 20 20 20 7c 20 20 30 20 20 7c 20 20 31        |  0  |  1
f800: 20 20 7c 20 20 31 3c 2f 69 3e 0a 20 20 3c 69 3e    |  1</i>.  <i>
f810: 2d 2d 20 20 20 20 20 62 61 6e 61 6e 61 20 20 20  --     banana   
f820: 20 20 20 7c 20 20 2a 20 20 7c 20 20 32 20 20 7c     |  *  |  2  |
f830: 20 20 32 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20    2</i>.  <i>-- 
f840: 20 20 20 20 62 61 6e 61 6e 61 20 20 20 20 20 20      banana      
f850: 7c 20 20 30 20 20 7c 20 20 32 20 20 7c 20 20 32  |  0  |  2  |  2
f860: 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 20 20 20  </i>.  <i>--    
f870: 20 63 68 65 72 72 79 20 20 20 20 20 20 7c 20 20   cherry      |  
f880: 2a 20 20 7c 20 20 33 20 20 7c 20 20 33 3c 2f 69  *  |  3  |  3</i
f890: 3e 0a 20 20 3c 69 3e 2d 2d 20 20 20 20 20 63 68  >.  <i>--     ch
f8a0: 65 72 72 79 20 20 20 20 20 20 7c 20 20 30 20 20  erry      |  0  
f8b0: 7c 20 20 31 20 20 7c 20 20 31 3c 2f 69 3e 0a 20  |  1  |  1</i>. 
f8c0: 20 3c 69 3e 2d 2d 20 20 20 20 20 63 68 65 72 72   <i>--     cherr
f8d0: 79 20 20 20 20 20 20 7c 20 20 31 20 20 7c 20 20  y      |  1  |  
f8e0: 32 20 20 7c 20 20 32 3c 2f 69 3e 0a 20 20 3c 69  2  |  2</i>.  <i
f8f0: 3e 2d 2d 20 20 20 20 20 64 61 74 65 20 20 20 20  >--     date    
f900: 20 20 20 20 7c 20 20 2a 20 20 7c 20 20 31 20 20      |  *  |  1  
f910: 7c 20 20 32 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d  |  2</i>.  <i>--
f920: 20 20 20 20 20 64 61 74 65 20 20 20 20 20 20 20       date       
f930: 20 7c 20 20 30 20 20 7c 20 20 31 20 20 7c 20 20   |  0  |  1  |  
f940: 32 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 20 20  2</i>.  <i>--   
f950: 20 20 65 6c 64 65 72 62 65 72 72 79 20 20 7c 20    elderberry  | 
f960: 20 2a 20 20 7c 20 20 31 20 20 7c 20 20 32 3c 2f   *  |  1  |  2</
f970: 69 3e 0a 20 20 3c 69 3e 2d 2d 20 20 20 20 20 65  i>.  <i>--     e
f980: 6c 64 65 72 62 65 72 72 79 20 20 7c 20 20 30 20  lderberry  |  0 
f990: 20 7c 20 20 31 20 20 7c 20 20 31 3c 2f 69 3e 0a   |  1  |  1</i>.
f9a0: 20 20 3c 69 3e 2d 2d 20 20 20 20 20 65 6c 64 65    <i>--     elde
f9b0: 72 62 65 72 72 79 20 20 7c 20 20 31 20 20 7c 20  rberry  |  1  | 
f9c0: 20 31 20 20 7c 20 20 31 3c 2f 69 3e 0a 20 20 3c   1  |  1</i>.  <
f9d0: 69 3e 2d 2d 3c 2f 69 3e 0a 20 20 53 45 4c 45 43  i>--</i>.  SELEC
f9e0: 54 20 74 65 72 6d 2c 20 63 6f 6c 2c 20 64 6f 63  T term, col, doc
f9f0: 75 6d 65 6e 74 73 2c 20 6f 63 63 75 72 72 65 6e  uments, occurren
fa00: 63 65 73 20 46 52 4f 4d 20 66 74 5f 74 65 72 6d  ces FROM ft_term
fa10: 73 3b 0a 3c 2f 63 6f 64 65 62 6c 6f 63 6b 3e 0a  s;.</codeblock>.
fa20: 0a 3c 70 3e 0a 20 20 49 6e 20 74 68 65 20 65 78  .<p>.  In the ex
fa30: 61 6d 70 6c 65 2c 20 74 68 65 20 76 61 6c 75 65  ample, the value
fa40: 73 20 69 6e 20 74 68 65 20 22 74 65 72 6d 22 20  s in the "term" 
fa50: 63 6f 6c 75 6d 6e 20 61 72 65 20 61 6c 6c 20 6c  column are all l
fa60: 6f 77 65 72 20 63 61 73 65 2c 20 0a 20 20 65 76  ower case, .  ev
fa70: 65 6e 20 74 68 6f 75 67 68 20 74 68 65 79 20 77  en though they w
fa80: 65 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74  ere inserted int
fa90: 6f 20 74 61 62 6c 65 20 22 66 74 22 20 69 6e 20  o table "ft" in 
faa0: 6d 69 78 65 64 20 63 61 73 65 2e 20 54 68 69 73  mixed case. This
fab0: 20 69 73 20 62 65 63 61 75 73 65 0a 20 20 61 6e   is because.  an
fac0: 20 66 74 73 34 61 75 78 20 74 61 62 6c 65 20 63   fts4aux table c
fad0: 6f 6e 74 61 69 6e 73 20 74 68 65 20 74 65 72 6d  ontains the term
fae0: 73 20 61 73 20 65 78 74 72 61 63 74 65 64 20 66  s as extracted f
faf0: 72 6f 6d 20 74 68 65 20 64 6f 63 75 6d 65 6e 74  rom the document
fb00: 20 74 65 78 74 0a 20 20 62 79 20 74 68 65 20 5b   text.  by the [
fb10: 74 6f 6b 65 6e 69 7a 65 72 5d 2e 20 49 6e 20 74  tokenizer]. In t
fb20: 68 69 73 20 63 61 73 65 2c 20 73 69 6e 63 65 20  his case, since 
fb30: 74 61 62 6c 65 20 22 66 74 22 20 75 73 65 73 20  table "ft" uses 
fb40: 74 68 65 20 0a 20 20 5b 74 6f 6b 65 6e 69 7a 65  the .  [tokenize
fb50: 72 7c 73 69 6d 70 6c 65 20 74 6f 6b 65 6e 69 7a  r|simple tokeniz
fb60: 65 72 5d 2c 20 74 68 69 73 20 6d 65 61 6e 73 20  er], this means 
fb70: 61 6c 6c 20 74 65 72 6d 73 20 68 61 76 65 20 62  all terms have b
fb80: 65 65 6e 20 66 6f 6c 64 65 64 20 74 6f 0a 20 20  een folded to.  
fb90: 6c 6f 77 65 72 20 63 61 73 65 2e 20 41 6c 73 6f  lower case. Also
fba0: 2c 20 74 68 65 72 65 20 69 73 20 28 66 6f 72 20  , there is (for 
fbb0: 65 78 61 6d 70 6c 65 29 20 6e 6f 20 72 6f 77 20  example) no row 
fbc0: 77 69 74 68 20 63 6f 6c 75 6d 6e 20 22 74 65 72  with column "ter
fbd0: 6d 22 0a 20 20 73 65 74 20 74 6f 20 22 61 70 70  m".  set to "app
fbe0: 6c 65 22 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 22  le" and column "
fbf0: 63 6f 6c 22 20 73 65 74 20 74 6f 20 31 2e 20 53  col" set to 1. S
fc00: 69 6e 63 65 20 74 68 65 72 65 20 61 72 65 20 6e  ince there are n
fc10: 6f 20 69 6e 73 74 61 6e 63 65 73 0a 20 20 6f 66  o instances.  of
fc20: 20 74 68 65 20 74 65 72 6d 20 22 61 70 70 6c 65   the term "apple
fc30: 22 20 69 6e 20 63 6f 6c 75 6d 6e 20 31 2c 20 6e  " in column 1, n
fc40: 6f 20 72 6f 77 20 69 73 20 70 72 65 73 65 6e 74  o row is present
fc50: 20 69 6e 20 74 68 65 20 66 74 73 34 61 75 78 20   in the fts4aux 
fc60: 74 61 62 6c 65 2e 0a 0a 3c 70 3e 0a 20 20 44 75  table...<p>.  Du
fc70: 72 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69  ring a transacti
fc80: 6f 6e 2c 20 73 6f 6d 65 20 6f 66 20 74 68 65 20  on, some of the 
fc90: 64 61 74 61 20 77 72 69 74 74 65 6e 20 74 6f 20  data written to 
fca0: 61 6e 20 46 54 53 20 74 61 62 6c 65 20 6d 61 79  an FTS table may
fcb0: 20 62 65 20 0a 20 20 63 61 63 68 65 64 20 69 6e   be .  cached in
fcc0: 20 6d 65 6d 6f 72 79 20 61 6e 64 20 77 72 69 74   memory and writ
fcd0: 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62  ten to the datab
fce0: 61 73 65 20 6f 6e 6c 79 20 77 68 65 6e 20 74 68  ase only when th
fcf0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
fd00: 20 0a 20 20 63 6f 6d 6d 69 74 74 65 64 2e 20 48   .  committed. H
fd10: 6f 77 65 76 65 72 20 74 68 65 20 69 6d 70 6c 65  owever the imple
fd20: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
fd30: 20 66 74 73 34 61 75 78 20 6d 6f 64 75 6c 65 20   fts4aux module 
fd40: 69 73 20 6f 6e 6c 79 20 61 62 6c 65 20 0a 20 20  is only able .  
fd50: 74 6f 20 72 65 61 64 20 64 61 74 61 20 66 72 6f  to read data fro
fd60: 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  m the database. 
fd70: 49 6e 20 70 72 61 63 74 69 63 65 20 74 68 69 73  In practice this
fd80: 20 6d 65 61 6e 73 20 74 68 61 74 20 69 66 20 61   means that if a
fd90: 6e 20 66 74 73 34 61 75 78 20 0a 20 20 74 61 62  n fts4aux .  tab
fda0: 6c 65 20 69 73 20 71 75 65 72 69 65 64 20 66 72  le is queried fr
fdb0: 6f 6d 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e  om within a tran
fdc0: 73 61 63 74 69 6f 6e 20 69 6e 20 77 68 69 63 68  saction in which
fdd0: 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20   the associated 
fde0: 0a 20 20 46 54 53 20 74 61 62 6c 65 20 68 61 73  .  FTS table has
fdf0: 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2c 20   been modified, 
fe00: 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74  the results of t
fe10: 68 65 20 71 75 65 72 79 20 61 72 65 20 6c 69 6b  he query are lik
fe20: 65 6c 79 20 74 6f 20 72 65 66 6c 65 63 74 20 0a  ely to reflect .
fe30: 20 20 6f 6e 6c 79 20 61 20 28 70 6f 73 73 69 62    only a (possib
fe40: 6c 79 20 65 6d 70 74 79 29 20 73 75 62 73 65 74  ly empty) subset
fe50: 20 6f 66 20 74 68 65 20 63 68 61 6e 67 65 73 20   of the changes 
fe60: 6d 61 64 65 2e 0a 0a 3c 68 31 20 69 64 3d 66 74  made...<h1 id=ft
fe70: 73 34 5f 6f 70 74 69 6f 6e 73 20 74 61 67 73 3d  s4_options tags=
fe80: 22 46 54 53 34 20 6f 70 74 69 6f 6e 73 22 3e 46  "FTS4 options">F
fe90: 54 53 34 20 4f 70 74 69 6f 6e 73 3c 2f 68 31 3e  TS4 Options</h1>
fea0: 0a 0a 3c 70 3e 0a 20 20 49 66 20 74 68 65 20 22  ..<p>.  If the "
feb0: 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54  CREATE VIRTUAL T
fec0: 41 42 4c 45 22 20 73 74 61 74 65 6d 65 6e 74 20  ABLE" statement 
fed0: 73 70 65 63 69 66 69 65 73 20 6d 6f 64 75 6c 65  specifies module
fee0: 20 46 54 53 34 20 28 6e 6f 74 20 46 54 53 33 29   FTS4 (not FTS3)
fef0: 2c 20 0a 20 20 74 68 65 6e 20 73 70 65 63 69 61  , .  then specia
ff00: 6c 20 64 69 72 65 63 74 69 76 65 73 20 2d 20 46  l directives - F
ff10: 54 53 34 20 6f 70 74 69 6f 6e 73 20 2d 20 73 69  TS4 options - si
ff20: 6d 69 6c 61 72 20 74 6f 20 74 68 65 20 22 74 6f  milar to the "to
ff30: 6b 65 6e 69 7a 65 3d 2a 22 20 6f 70 74 69 6f 6e  kenize=*" option
ff40: 0a 20 20 6d 61 79 20 61 6c 73 6f 20 61 70 70 65  .  may also appe
ff50: 61 72 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 63  ar in place of c
ff60: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e 20 41 6e 20  olumn names. An 
ff70: 46 54 53 34 20 6f 70 74 69 6f 6e 20 63 6f 6e 73  FTS4 option cons
ff80: 69 73 74 73 20 6f 66 20 74 68 65 0a 20 20 6f 70  ists of the.  op
ff90: 74 69 6f 6e 20 6e 61 6d 65 2c 20 66 6f 6c 6c 6f  tion name, follo
ffa0: 77 65 64 20 62 79 20 61 6e 20 22 3d 22 20 63 68  wed by an "=" ch
ffb0: 61 72 61 63 74 65 72 2c 20 66 6f 6c 6c 6f 77 65  aracter, followe
ffc0: 64 20 62 79 20 74 68 65 20 6f 70 74 69 6f 6e 20  d by the option 
ffd0: 76 61 6c 75 65 2e 0a 20 20 54 68 65 20 6f 70 74  value..  The opt
ffe0: 69 6f 6e 20 76 61 6c 75 65 20 6d 61 79 20 6f 70  ion value may op
fff0: 74 69 6f 6e 61 6c 6c 79 20 62 65 20 65 6e 63 6c  tionally be encl
10000 6f 73 65 64 20 69 6e 20 73 69 6e 67 6c 65 20 6f  osed in single o
10010 72 20 64 6f 75 62 6c 65 20 71 75 6f 74 65 73 2c  r double quotes,
10020 20 77 69 74 68 0a 20 20 65 6d 62 65 64 64 65 64   with.  embedded
10030 20 71 75 6f 74 65 20 63 68 61 72 61 63 74 65 72   quote character
10040 73 20 65 73 63 61 70 65 64 20 69 6e 20 74 68 65  s escaped in the
10050 20 73 61 6d 65 20 77 61 79 20 61 73 20 66 6f 72   same way as for
10060 20 53 51 4c 20 6c 69 74 65 72 61 6c 73 2e 20 54   SQL literals. T
10070 68 65 72 65 0a 20 20 6d 61 79 20 6e 6f 74 20 62  here.  may not b
10080 65 20 77 68 69 74 65 73 70 61 63 65 20 6f 6e 20  e whitespace on 
10090 65 69 74 68 65 72 20 73 69 64 65 20 6f 66 20 74  either side of t
100a0 68 65 20 22 3d 22 20 63 68 61 72 61 63 74 65 72  he "=" character
100b0 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 0a 20  . For example,. 
100c0 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20 46 54   to create an FT
100d0 53 34 20 74 61 62 6c 65 20 77 69 74 68 20 74 68  S4 table with th
100e0 65 20 76 61 6c 75 65 20 6f 66 20 6f 70 74 69 6f  e value of optio
100f0 6e 20 22 6d 61 74 63 68 69 6e 66 6f 22 20 73 65  n "matchinfo" se
10100 74 20 74 6f 20 22 66 74 73 33 22 3a 0a 0a 3c 63  t to "fts3":..<c
10110 6f 64 65 62 6c 6f 63 6b 3e 0a 20 20 3c 69 3e 2d  odeblock>.  <i>-
10120 2d 20 43 72 65 61 74 65 20 61 20 72 65 64 75 63  - Create a reduc
10130 65 64 2d 66 6f 6f 74 70 72 69 6e 74 20 46 54 53  ed-footprint FTS
10140 34 20 74 61 62 6c 65 2e 3c 2f 69 3e 0a 20 20 43  4 table.</i>.  C
10150 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41  REATE VIRTUAL TA
10160 42 4c 45 20 70 61 70 65 72 73 20 55 53 49 4e 47  BLE papers USING
10170 20 66 74 73 34 28 61 75 74 68 6f 72 2c 20 64 6f   fts4(author, do
10180 63 75 6d 65 6e 74 2c 20 6d 61 74 63 68 69 6e 66  cument, matchinf
10190 6f 3d 66 74 73 33 29 3b 0a 3c 2f 63 6f 64 65 62  o=fts3);.</codeb
101a0 6c 6f 63 6b 3e 0a 0a 3c 70 3e 0a 20 20 46 54 53  lock>..<p>.  FTS
101b0 34 20 63 75 72 72 65 6e 74 6c 79 20 73 75 70 70  4 currently supp
101c0 6f 72 74 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69  orts the followi
101d0 6e 67 20 6f 70 74 69 6f 6e 73 3a 0a 0a 3c 74 61  ng options:..<ta
101e0 62 6c 65 20 73 74 72 69 70 65 64 3d 31 3e 0a 20  ble striped=1>. 
101f0 20 3c 74 72 3e 3c 74 68 3e 4f 70 74 69 6f 6e 3c   <tr><th>Option<
10200 74 68 3e 49 6e 74 65 72 70 72 65 74 61 74 69 6f  th>Interpretatio
10210 6e 0a 20 20 3c 74 72 3e 3c 74 64 3e 63 6f 6d 70  n.  <tr><td>comp
10220 72 65 73 73 3c 74 64 3e 0a 20 20 20 20 5e 54 68  ress<td>.    ^Th
10230 65 20 63 6f 6d 70 72 65 73 73 20 6f 70 74 69 6f  e compress optio
10240 6e 20 69 73 20 75 73 65 64 20 74 6f 20 73 70 65  n is used to spe
10250 63 69 66 79 20 74 68 65 20 63 6f 6d 70 72 65 73  cify the compres
10260 73 20 66 75 6e 63 74 69 6f 6e 2e 20 5e 49 74 20  s function. ^It 
10270 69 73 20 61 6e 20 65 72 72 6f 72 20 74 6f 0a 20  is an error to. 
10280 20 20 20 73 70 65 63 69 66 79 20 61 20 63 6f 6d     specify a com
10290 70 72 65 73 73 20 66 75 6e 63 74 69 6f 6e 20 77  press function w
102a0 69 74 68 6f 75 74 20 61 6c 73 6f 20 73 70 65 63  ithout also spec
102b0 69 66 79 69 6e 67 20 61 6e 20 75 6e 63 6f 6d 70  ifying an uncomp
102c0 72 65 73 73 0a 20 20 20 20 66 75 6e 63 74 69 6f  ress.    functio
102d0 6e 2e 20 5b 66 74 73 34 20 63 6f 6d 70 72 65 73  n. [fts4 compres
102e0 73 20 6f 70 74 69 6f 6e 7c 53 65 65 20 62 65 6c  s option|See bel
102f0 6f 77 5d 20 66 6f 72 20 64 65 74 61 69 6c 73 2e  ow] for details.
10300 0a 0a 20 20 3c 74 72 3e 3c 74 64 3e 63 6f 6e 74  ..  <tr><td>cont
10310 65 6e 74 3c 74 64 3e 0a 20 20 20 20 5e 54 68 65  ent<td>.    ^The
10320 20 63 6f 6e 74 65 6e 74 20 61 6c 6c 6f 77 73 20   content allows 
10330 74 68 65 20 74 65 78 74 20 62 65 69 6e 67 20 69  the text being i
10340 6e 64 65 78 65 64 20 74 6f 20 62 65 0a 20 20 20  ndexed to be.   
10350 20 73 74 6f 72 65 64 20 69 6e 20 61 20 73 65 70   stored in a sep
10360 61 72 61 74 65 20 74 61 62 6c 65 20 64 69 73 74  arate table dist
10370 69 6e 63 74 20 66 72 6f 6d 20 74 68 65 20 46 54  inct from the FT
10380 53 34 20 74 61 62 6c 65 2c 0a 20 20 20 20 6f 72  S4 table,.    or
10390 20 65 76 65 6e 20 6f 75 74 73 69 64 65 20 6f 66   even outside of
103a0 20 53 51 4c 69 74 65 2e 0a 0a 20 20 3c 74 72 3e   SQLite...  <tr>
103b0 3c 74 64 3e 6c 61 6e 67 75 61 67 65 69 64 3c 74  <td>languageid<t
103c0 64 3e 0a 20 20 20 20 5e 54 68 65 20 6c 61 6e 67  d>.    ^The lang
103d0 75 61 67 65 69 64 20 6f 70 74 69 6f 6e 20 63 61  uageid option ca
103e0 75 73 65 73 20 74 68 65 20 46 54 53 34 20 74 61  uses the FTS4 ta
103f0 62 6c 65 20 74 6f 20 68 61 76 65 20 61 6e 20 61  ble to have an a
10400 64 64 69 74 69 6f 6e 61 6c 20 68 69 64 64 65 6e  dditional hidden
10410 0a 20 20 20 20 69 6e 74 65 67 65 72 20 63 6f 6c  .    integer col
10420 75 6d 6e 20 74 68 61 74 20 69 64 65 6e 74 69 66  umn that identif
10430 69 65 73 20 74 68 65 20 6c 61 6e 67 75 61 67 65  ies the language
10440 20 6f 66 20 74 68 65 20 74 65 78 74 20 63 6f 6e   of the text con
10450 74 61 69 6e 65 64 20 69 6e 0a 20 20 20 20 65 61  tained in.    ea
10460 63 68 20 72 6f 77 2e 20 20 54 68 65 20 75 73 65  ch row.  The use
10470 20 6f 66 20 74 68 65 20 6c 61 6e 67 75 61 67 65   of the language
10480 69 64 20 6f 70 74 69 6f 6e 20 61 6c 6c 6f 77 73  id option allows
10490 20 74 68 65 20 73 61 6d 65 20 46 54 53 34 20 74   the same FTS4 t
104a0 61 62 6c 65 0a 20 20 20 20 74 6f 20 68 6f 6c 64  able.    to hold
104b0 20 74 65 78 74 20 69 6e 20 6d 75 6c 74 69 70 6c   text in multipl
104c0 65 20 6c 61 6e 67 75 61 67 65 73 20 6f 72 20 73  e languages or s
104d0 63 72 69 70 74 73 2c 20 65 61 63 68 20 77 69 74  cripts, each wit
104e0 68 20 64 69 66 66 65 72 65 6e 74 20 74 6f 6b 65  h different toke
104f0 6e 69 7a 65 72 0a 20 20 20 20 72 75 6c 65 73 2c  nizer.    rules,
10500 20 61 6e 64 20 74 6f 20 71 75 65 72 79 20 65 61   and to query ea
10510 63 68 20 6c 61 6e 67 75 61 67 65 20 69 6e 64 65  ch language inde
10520 70 65 6e 64 65 6e 74 6c 79 20 6f 66 20 74 68 65  pendently of the
10530 20 6f 74 68 65 72 73 2e 0a 20 20 20 20 0a 20 20   others..    .  
10540 3c 74 72 3e 3c 74 64 3e 6d 61 74 63 68 69 6e 66  <tr><td>matchinf
10550 6f 3c 74 64 3e 20 0a 20 20 20 20 57 68 65 6e 20  o<td> .    When 
10560 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65  set to the value
10570 20 22 66 74 73 33 22 2c 20 74 68 65 20 6d 61 74   "fts3", the mat
10580 63 68 69 6e 66 6f 20 6f 70 74 69 6f 6e 20 72 65  chinfo option re
10590 64 75 63 65 73 20 74 68 65 20 61 6d 6f 75 6e 74  duces the amount
105a0 20 6f 66 0a 20 20 20 20 69 6e 66 6f 72 6d 61 74   of.    informat
105b0 69 6f 6e 20 73 74 6f 72 65 64 20 62 79 20 46 54  ion stored by FT
105c0 53 34 20 77 69 74 68 20 74 68 65 20 63 6f 6e 73  S4 with the cons
105d0 65 71 75 65 6e 63 65 20 74 68 61 74 20 74 68 65  equence that the
105e0 20 22 6c 22 20 6f 70 74 69 6f 6e 20 6f 66 0a 20   "l" option of. 
105f0 20 20 20 5b 6d 61 74 63 68 69 6e 66 6f 28 29 5d     [matchinfo()]
10600 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 61 76   is no longer av
10610 61 69 6c 61 62 6c 65 2e 0a 0a 20 20 3c 74 72 3e  ailable...  <tr>
10620 3c 74 64 3e 6e 6f 74 69 6e 64 65 78 65 64 3c 74  <td>notindexed<t
10630 64 3e 20 0a 20 20 20 20 54 68 69 73 20 6f 70 74  d> .    This opt
10640 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 73  ion is used to s
10650 70 65 63 69 66 79 20 74 68 65 20 6e 61 6d 65 20  pecify the name 
10660 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 66 6f 72 20  of a column for 
10670 77 68 69 63 68 20 64 61 74 61 20 69 73 0a 20 20  which data is.  
10680 20 20 6e 6f 74 20 69 6e 64 65 78 65 64 2e 20 56    not indexed. V
10690 61 6c 75 65 73 20 73 74 6f 72 65 64 20 69 6e 20  alues stored in 
106a0 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 61 72 65  columns that are
106b0 20 6e 6f 74 20 69 6e 64 65 78 65 64 20 61 72 65   not indexed are
106c0 20 6e 6f 74 0a 20 20 20 20 6d 61 74 63 68 65 64   not.    matched
106d0 20 62 79 20 4d 41 54 43 48 20 71 75 65 72 69 65   by MATCH querie
106e0 73 2e 20 4e 6f 72 20 61 72 65 20 74 68 65 79 20  s. Nor are they 
106f0 72 65 63 6f 67 6e 69 7a 65 64 20 62 79 20 61 75  recognized by au
10700 78 69 6c 69 61 72 79 20 66 75 6e 63 74 69 6f 6e  xiliary function
10710 73 2e 0a 20 20 20 20 41 20 73 69 6e 67 6c 65 20  s..    A single 
10720 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54  CREATE VIRTUAL T
10730 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 6d  ABLE statement m
10740 61 79 20 68 61 76 65 20 61 6e 79 20 6e 75 6d 62  ay have any numb
10750 65 72 20 6f 66 20 6e 6f 74 69 6e 64 65 78 65 64  er of notindexed
10760 20 0a 20 20 20 20 6f 70 74 69 6f 6e 73 2e 0a 0a   .    options...
10770 20 20 3c 74 72 3e 3c 74 64 3e 6f 72 64 65 72 3c    <tr><td>order<
10780 74 64 3e 0a 20 20 20 20 3c 74 63 6c 3e 68 64 5f  td>.    <tcl>hd_
10790 66 72 61 67 6d 65 6e 74 20 66 74 73 34 6f 72 64  fragment fts4ord
107a0 65 72 20 7b 46 54 53 34 20 6f 72 64 65 72 20 6f  er {FTS4 order o
107b0 70 74 69 6f 6e 7d 3c 2f 74 63 6c 3e 0a 20 20 20  ption}</tcl>.   
107c0 20 5e 54 68 65 20 22 6f 72 64 65 72 22 20 6f 70   ^The "order" op
107d0 74 69 6f 6e 20 6d 61 79 20 62 65 20 73 65 74 20  tion may be set 
107e0 74 6f 20 65 69 74 68 65 72 20 22 44 45 53 43 22  to either "DESC"
107f0 20 6f 72 20 22 41 53 43 22 20 28 69 6e 20 75 70   or "ASC" (in up
10800 70 65 72 20 6f 72 0a 20 20 20 20 6c 6f 77 65 72  per or.    lower
10810 20 63 61 73 65 29 2e 20 5e 49 66 20 69 74 20 69   case). ^If it i
10820 73 20 73 65 74 20 74 6f 20 22 44 45 53 43 22 2c  s set to "DESC",
10830 20 74 68 65 6e 20 46 54 53 34 20 73 74 6f 72 65   then FTS4 store
10840 73 20 69 74 73 20 64 61 74 61 20 69 6e 20 73 75  s its data in su
10850 63 68 0a 20 20 20 20 61 20 77 61 79 20 61 73 20  ch.    a way as 
10860 74 6f 20 6f 70 74 69 6d 69 7a 65 20 72 65 74 75  to optimize retu
10870 72 6e 69 6e 67 20 72 65 73 75 6c 74 73 20 69 6e  rning results in
10880 20 64 65 73 63 65 6e 64 69 6e 67 20 6f 72 64 65   descending orde
10890 72 20 62 79 20 64 6f 63 69 64 2e 0a 20 20 20 20  r by docid..    
108a0 5e 49 66 20 69 74 20 69 73 20 73 65 74 20 74 6f  ^If it is set to
108b0 20 22 41 53 43 22 20 28 74 68 65 20 64 65 66 61   "ASC" (the defa
108c0 75 6c 74 29 2c 20 74 68 65 6e 20 74 68 65 20 64  ult), then the d
108d0 61 74 61 20 73 74 72 75 63 74 75 72 65 73 20 61  ata structures a
108e0 72 65 20 0a 20 20 20 20 6f 70 74 69 6d 69 7a 65  re .    optimize
108f0 64 20 66 6f 72 20 72 65 74 75 72 6e 69 6e 67 20  d for returning 
10900 72 65 73 75 6c 74 73 20 69 6e 20 61 73 63 65 6e  results in ascen
10910 64 69 6e 67 20 6f 72 64 65 72 20 62 79 20 64 6f  ding order by do
10920 63 69 64 2e 20 20 5e 49 6e 20 6f 74 68 65 72 0a  cid.  ^In other.
10930 20 20 20 20 77 6f 72 64 73 2c 20 69 66 20 6d 61      words, if ma
10940 6e 79 20 6f 66 20 74 68 65 20 71 75 65 72 69 65  ny of the querie
10950 73 20 72 75 6e 20 61 67 61 69 6e 73 74 20 74 68  s run against th
10960 65 20 46 54 53 34 20 74 61 62 6c 65 20 75 73 65  e FTS4 table use
10970 20 22 4f 52 44 45 52 20 42 59 0a 20 20 20 20 64   "ORDER BY.    d
10980 6f 63 69 64 20 44 45 53 43 22 2c 20 74 68 65 6e  ocid DESC", then
10990 20 69 74 20 6d 61 79 20 69 6d 70 72 6f 76 65 20   it may improve 
109a0 70 65 72 66 6f 72 6d 61 6e 63 65 20 74 6f 20 61  performance to a
109b0 64 64 20 74 68 65 20 22 6f 72 64 65 72 3d 64 65  dd the "order=de
109c0 73 63 22 20 0a 20 20 20 20 6f 70 74 69 6f 6e 20  sc" .    option 
109d0 74 6f 20 74 68 65 20 43 52 45 41 54 45 20 56 49  to the CREATE VI
109e0 52 54 55 41 4c 20 54 41 42 4c 45 20 73 74 61 74  RTUAL TABLE stat
109f0 65 6d 65 6e 74 2e 0a 0a 20 20 3c 74 72 3e 3c 74  ement...  <tr><t
10a00 64 3e 70 72 65 66 69 78 3c 74 64 3e 0a 20 20 20  d>prefix<td>.   
10a10 20 54 68 69 73 20 6f 70 74 69 6f 6e 20 6d 61 79   This option may
10a20 20 62 65 20 73 65 74 20 74 6f 20 61 20 63 6f 6d   be set to a com
10a30 6d 61 2d 73 65 70 61 72 61 74 65 64 20 6c 69 73  ma-separated lis
10a40 74 20 6f 66 20 70 6f 73 69 74 69 76 65 20 6e 6f  t of positive no
10a50 6e 2d 7a 65 72 6f 20 0a 20 20 20 20 69 6e 74 65  n-zero .    inte
10a60 67 65 72 73 2e 20 46 6f 72 20 65 61 63 68 20 69  gers. For each i
10a70 6e 74 65 67 65 72 20 4e 20 69 6e 20 74 68 65 20  nteger N in the 
10a80 6c 69 73 74 2c 20 61 20 73 65 70 61 72 61 74 65  list, a separate
10a90 20 69 6e 64 65 78 20 69 73 20 63 72 65 61 74 65   index is create
10aa0 64 0a 20 20 20 20 69 6e 20 74 68 65 20 64 61 74  d.    in the dat
10ab0 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6f 70  abase file to op
10ac0 74 69 6d 69 7a 65 20 5b 70 72 65 66 69 78 20 71  timize [prefix q
10ad0 75 65 72 69 65 73 5d 20 77 68 65 72 65 0a 20 20  ueries] where.  
10ae0 20 20 74 68 65 20 71 75 65 72 79 20 74 65 72 6d    the query term
10af0 20 69 73 20 4e 20 62 79 74 65 73 20 69 6e 20 6c   is N bytes in l
10b00 65 6e 67 74 68 2c 20 6e 6f 74 20 69 6e 63 6c 75  ength, not inclu
10b10 64 69 6e 67 20 74 68 65 20 27 2a 27 20 63 68 61  ding the '*' cha
10b20 72 61 63 74 65 72 2c 0a 20 20 20 20 77 68 65 6e  racter,.    when
10b30 20 65 6e 63 6f 64 65 64 20 75 73 69 6e 67 20 55   encoded using U
10b40 54 46 2d 38 2e 20 5b 66 74 73 34 20 70 72 65 66  TF-8. [fts4 pref
10b50 69 78 20 6f 70 74 69 6f 6e 7c 53 65 65 20 62 65  ix option|See be
10b60 6c 6f 77 5d 20 66 6f 72 20 64 65 74 61 69 6c 73  low] for details
10b70 2e 0a 0a 20 20 3c 74 72 3e 3c 74 64 3e 75 6e 63  ...  <tr><td>unc
10b80 6f 6d 70 72 65 73 73 3c 74 64 3e 0a 20 20 20 20  ompress<td>.    
10b90 54 68 69 73 20 6f 70 74 69 6f 6e 20 69 73 20 75  This option is u
10ba0 73 65 64 20 74 6f 20 73 70 65 63 69 66 79 20 74  sed to specify t
10bb0 68 65 20 75 6e 63 6f 6d 70 72 65 73 73 20 66 75  he uncompress fu
10bc0 6e 63 74 69 6f 6e 2e 20 49 74 20 69 73 20 61 6e  nction. It is an
10bd0 20 65 72 72 6f 72 20 74 6f 0a 20 20 20 20 73 70   error to.    sp
10be0 65 63 69 66 79 20 61 6e 20 75 6e 63 6f 6d 70 72  ecify an uncompr
10bf0 65 73 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 74  ess function wit
10c00 68 6f 75 74 20 61 6c 73 6f 20 73 70 65 63 69 66  hout also specif
10c10 79 69 6e 67 20 61 20 63 6f 6d 70 72 65 73 73 0a  ying a compress.
10c20 20 20 20 20 66 75 6e 63 74 69 6f 6e 2e 20 5b 66      function. [f
10c30 74 73 34 20 63 6f 6d 70 72 65 73 73 20 6f 70 74  ts4 compress opt
10c40 69 6f 6e 7c 53 65 65 20 62 65 6c 6f 77 5d 20 66  ion|See below] f
10c50 6f 72 20 64 65 74 61 69 6c 73 2e 0a 3c 2f 74 61  or details..</ta
10c60 62 6c 65 3e 0a 0a 3c 70 3e 0a 20 20 57 68 65 6e  ble>..<p>.  When
10c70 20 75 73 69 6e 67 20 46 54 53 34 2c 20 73 70 65   using FTS4, spe
10c80 63 69 66 79 69 6e 67 20 61 20 63 6f 6c 75 6d 6e  cifying a column
10c90 20 6e 61 6d 65 20 74 68 61 74 20 63 6f 6e 74 61   name that conta
10ca0 69 6e 73 20 61 6e 20 22 3d 22 20 63 68 61 72 61  ins an "=" chara
10cb0 63 74 65 72 0a 20 20 61 6e 64 20 69 73 20 6e 6f  cter.  and is no
10cc0 74 20 65 69 74 68 65 72 20 61 20 22 74 6f 6b 65  t either a "toke
10cd0 6e 69 7a 65 3d 2a 22 20 73 70 65 63 69 66 69 63  nize=*" specific
10ce0 61 74 69 6f 6e 20 6f 72 20 61 20 72 65 63 6f 67  ation or a recog
10cf0 6e 69 7a 65 64 20 46 54 53 34 20 6f 70 74 69 6f  nized FTS4 optio
10d00 6e 0a 20 20 69 73 20 61 6e 20 65 72 72 6f 72 2e  n.  is an error.
10d10 20 57 69 74 68 20 46 54 53 33 2c 20 74 68 65 20   With FTS3, the 
10d20 66 69 72 73 74 20 74 6f 6b 65 6e 20 69 6e 20 74  first token in t
10d30 68 65 20 75 6e 72 65 63 6f 67 6e 69 7a 65 64 20  he unrecognized 
10d40 64 69 72 65 63 74 69 76 65 20 69 73 20 0a 20 20  directive is .  
10d50 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 61  interpreted as a
10d60 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 2e 20 53 69   column name. Si
10d70 6d 69 6c 61 72 6c 79 2c 20 73 70 65 63 69 66 79  milarly, specify
10d80 69 6e 67 20 6d 75 6c 74 69 70 6c 65 20 22 74 6f  ing multiple "to
10d90 6b 65 6e 69 7a 65 3d 2a 22 0a 20 20 64 69 72 65  kenize=*".  dire
10da0 63 74 69 76 65 73 20 69 6e 20 61 20 73 69 6e 67  ctives in a sing
10db0 6c 65 20 74 61 62 6c 65 20 64 65 63 6c 61 72 61  le table declara
10dc0 74 69 6f 6e 20 69 73 20 61 6e 20 65 72 72 6f 72  tion is an error
10dd0 20 77 68 65 6e 20 75 73 69 6e 67 20 46 54 53 34   when using FTS4
10de0 2c 20 77 68 65 72 65 61 73 0a 20 20 74 68 65 20  , whereas.  the 
10df0 73 65 63 6f 6e 64 20 61 6e 64 20 73 75 62 73 65  second and subse
10e00 71 75 65 6e 74 20 22 74 6f 6b 65 6e 69 7a 65 3d  quent "tokenize=
10e10 2a 22 20 64 69 72 65 63 74 69 76 65 73 20 61 72  *" directives ar
10e20 65 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73  e interpreted as
10e30 20 63 6f 6c 75 6d 6e 0a 20 20 6e 61 6d 65 73 20   column.  names 
10e40 62 79 20 46 54 53 33 2e 20 46 6f 72 20 65 78 61  by FTS3. For exa
10e50 6d 70 6c 65 3a 0a 0a 3c 63 6f 64 65 62 6c 6f 63  mple:..<codebloc
10e60 6b 3e 0a 20 20 3c 69 3e 2d 2d 20 41 6e 20 65 72  k>.  <i>-- An er
10e70 72 6f 72 2e 20 46 54 53 34 20 64 6f 65 73 20 6e  ror. FTS4 does n
10e80 6f 74 20 72 65 63 6f 67 6e 69 7a 65 20 74 68 65  ot recognize the
10e90 20 64 69 72 65 63 74 69 76 65 20 22 78 79 7a 3d   directive "xyz=
10ea0 61 62 63 22 2e 3c 2f 69 3e 0a 20 20 43 52 45 41  abc".</i>.  CREA
10eb0 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45  TE VIRTUAL TABLE
10ec0 20 70 61 70 65 72 73 20 55 53 49 4e 47 20 66 74   papers USING ft
10ed0 73 34 28 61 75 74 68 6f 72 2c 20 64 6f 63 75 6d  s4(author, docum
10ee0 65 6e 74 2c 20 78 79 7a 3d 61 62 63 29 3b 0a 0a  ent, xyz=abc);..
10ef0 20 20 3c 69 3e 2d 2d 20 43 72 65 61 74 65 20 61    <i>-- Create a
10f00 6e 20 46 54 53 33 20 74 61 62 6c 65 20 77 69 74  n FTS3 table wit
10f10 68 20 74 68 72 65 65 20 63 6f 6c 75 6d 6e 73 20  h three columns 
10f20 2d 20 22 61 75 74 68 6f 72 22 2c 20 22 64 6f 63  - "author", "doc
10f30 75 6d 65 6e 74 22 3c 2f 69 3e 0a 20 20 3c 69 3e  ument"</i>.  <i>
10f40 2d 2d 20 61 6e 64 20 22 78 79 7a 22 2e 3c 2f 69  -- and "xyz".</i
10f50 3e 0a 20 20 43 52 45 41 54 45 20 56 49 52 54 55  >.  CREATE VIRTU
10f60 41 4c 20 54 41 42 4c 45 20 70 61 70 65 72 73 20  AL TABLE papers 
10f70 55 53 49 4e 47 20 66 74 73 33 28 61 75 74 68 6f  USING fts3(autho
10f80 72 2c 20 64 6f 63 75 6d 65 6e 74 2c 20 78 79 7a  r, document, xyz
10f90 3d 61 62 63 29 3b 0a 0a 20 20 3c 69 3e 2d 2d 20  =abc);..  <i>-- 
10fa0 41 6e 20 65 72 72 6f 72 2e 20 46 54 53 34 20 64  An error. FTS4 d
10fb0 6f 65 73 20 6e 6f 74 20 61 6c 6c 6f 77 20 6d 75  oes not allow mu
10fc0 6c 74 69 70 6c 65 20 74 6f 6b 65 6e 69 7a 65 3d  ltiple tokenize=
10fd0 2a 20 64 69 72 65 63 74 69 76 65 73 3c 2f 69 3e  * directives</i>
10fe0 0a 20 20 43 52 45 41 54 45 20 56 49 52 54 55 41  .  CREATE VIRTUA
10ff0 4c 20 54 41 42 4c 45 20 70 61 70 65 72 73 20 55  L TABLE papers U
11000 53 49 4e 47 20 66 74 73 34 28 74 6f 6b 65 6e 69  SING fts4(tokeni
11010 7a 65 3d 70 6f 72 74 65 72 2c 20 74 6f 6b 65 6e  ze=porter, token
11020 69 7a 65 3d 73 69 6d 70 6c 65 29 3b 0a 0a 20 20  ize=simple);..  
11030 3c 69 3e 2d 2d 20 43 72 65 61 74 65 20 61 6e 20  <i>-- Create an 
11040 46 54 53 33 20 74 61 62 6c 65 20 77 69 74 68 20  FTS3 table with 
11050 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20  a single column 
11060 6e 61 6d 65 64 20 22 74 6f 6b 65 6e 69 7a 65 22  named "tokenize"
11070 2e 20 54 68 65 3c 2f 69 3e 0a 20 20 3c 69 3e 2d  . The</i>.  <i>-
11080 2d 20 74 61 62 6c 65 20 75 73 65 73 20 74 68 65  - table uses the
11090 20 22 70 6f 72 74 65 72 22 20 74 6f 6b 65 6e 69   "porter" tokeni
110a0 7a 65 72 2e 3c 2f 69 3e 0a 20 20 43 52 45 41 54  zer.</i>.  CREAT
110b0 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20  E VIRTUAL TABLE 
110c0 70 61 70 65 72 73 20 55 53 49 4e 47 20 66 74 73  papers USING fts
110d0 33 28 74 6f 6b 65 6e 69 7a 65 3d 70 6f 72 74 65  3(tokenize=porte
110e0 72 2c 20 74 6f 6b 65 6e 69 7a 65 3d 73 69 6d 70  r, tokenize=simp
110f0 6c 65 29 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 41 6e  le);..  <i>-- An
11100 20 65 72 72 6f 72 2e 20 43 61 6e 6e 6f 74 20 63   error. Cannot c
11110 72 65 61 74 65 20 61 20 74 61 62 6c 65 20 77 69  reate a table wi
11120 74 68 20 74 77 6f 20 63 6f 6c 75 6d 6e 73 20 6e  th two columns n
11130 61 6d 65 64 20 22 74 6f 6b 65 6e 69 7a 65 22 2e  amed "tokenize".
11140 3c 2f 69 3e 0a 20 20 43 52 45 41 54 45 20 56 49  </i>.  CREATE VI
11150 52 54 55 41 4c 20 54 41 42 4c 45 20 70 61 70 65  RTUAL TABLE pape
11160 72 73 20 55 53 49 4e 47 20 66 74 73 33 28 74 6f  rs USING fts3(to
11170 6b 65 6e 69 7a 65 3d 70 6f 72 74 65 72 2c 20 74  kenize=porter, t
11180 6f 6b 65 6e 69 7a 65 3d 73 69 6d 70 6c 65 2c 20  okenize=simple, 
11190 74 6f 6b 65 6e 69 7a 65 3d 69 63 75 29 3b 0a 3c  tokenize=icu);.<
111a0 2f 63 6f 64 65 62 6c 6f 63 6b 3e 0a 0a 3c 74 63  /codeblock>..<tc
111b0 6c 3e 68 64 5f 66 72 61 67 6d 65 6e 74 20 2a 66  l>hd_fragment *f
111c0 74 73 34 63 6f 6d 70 72 65 73 73 69 6f 6e 20 7b  ts4compression {
111d0 63 6f 6d 70 72 65 73 73 65 64 20 46 54 53 34 20  compressed FTS4 
111e0 63 6f 6e 74 65 6e 74 7d 3c 2f 74 63 6c 3e 0a 3c  content}</tcl>.<
111f0 68 32 20 74 61 67 73 3d 22 66 74 73 34 20 63 6f  h2 tags="fts4 co
11200 6d 70 72 65 73 73 20 6f 70 74 69 6f 6e 22 3e 54  mpress option">T
11210 68 65 20 63 6f 6d 70 72 65 73 73 3d 20 61 6e 64  he compress= and
11220 20 75 6e 63 6f 6d 70 72 65 73 73 3d 20 6f 70 74   uncompress= opt
11230 69 6f 6e 73 3c 2f 68 32 3e 0a 0a 3c 70 3e 0a 20  ions</h2>..<p>. 
11240 20 54 68 65 20 63 6f 6d 70 72 65 73 73 20 61 6e   The compress an
11250 64 20 75 6e 63 6f 6d 70 72 65 73 73 20 6f 70 74  d uncompress opt
11260 69 6f 6e 73 20 61 6c 6c 6f 77 20 46 54 53 34 20  ions allow FTS4 
11270 63 6f 6e 74 65 6e 74 20 74 6f 20 62 65 20 73 74  content to be st
11280 6f 72 65 64 20 69 6e 0a 20 20 74 68 65 20 64 61  ored in.  the da
11290 74 61 62 61 73 65 20 69 6e 20 61 20 63 6f 6d 70  tabase in a comp
112a0 72 65 73 73 65 64 20 66 6f 72 6d 2e 20 42 6f 74  ressed form. Bot
112b0 68 20 6f 70 74 69 6f 6e 73 20 73 68 6f 75 6c 64  h options should
112c0 20 62 65 20 73 65 74 20 74 6f 20 74 68 65 20 6e   be set to the n
112d0 61 6d 65 0a 20 20 6f 66 20 61 6e 20 53 51 4c 20  ame.  of an SQL 
112e0 73 63 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e 20  scalar function 
112f0 72 65 67 69 73 74 65 72 65 64 20 75 73 69 6e 67  registered using
11300 20 5b 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65   [sqlite3_create
11310 5f 66 75 6e 63 74 69 6f 6e 28 29 5d 0a 20 20 74  _function()].  t
11320 68 61 74 20 61 63 63 65 70 74 73 20 61 20 73 69  hat accepts a si
11330 6e 67 6c 65 20 61 72 67 75 6d 65 6e 74 2e 20 0a  ngle argument. .
11340 0a 3c 70 3e 0a 20 20 54 68 65 20 63 6f 6d 70 72  .<p>.  The compr
11350 65 73 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f  ess function sho
11360 75 6c 64 20 72 65 74 75 72 6e 20 61 20 63 6f 6d  uld return a com
11370 70 72 65 73 73 65 64 20 76 65 72 73 69 6f 6e 20  pressed version 
11380 6f 66 20 74 68 65 20 76 61 6c 75 65 20 0a 20 20  of the value .  
11390 70 61 73 73 65 64 20 74 6f 20 69 74 20 61 73 20  passed to it as 
113a0 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 45 61 63  an argument. Eac
113b0 68 20 74 69 6d 65 20 64 61 74 61 20 69 73 20 77  h time data is w
113c0 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 46 54  ritten to the FT
113d0 53 34 20 74 61 62 6c 65 2c 20 0a 20 20 65 61 63  S4 table, .  eac
113e0 68 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69  h column value i
113f0 73 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20  s passed to the 
11400 63 6f 6d 70 72 65 73 73 20 66 75 6e 63 74 69 6f  compress functio
11410 6e 20 61 6e 64 20 74 68 65 20 72 65 73 75 6c 74  n and the result
11420 20 76 61 6c 75 65 20 0a 20 20 73 74 6f 72 65 64   value .  stored
11430 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
11440 2e 20 54 68 65 20 63 6f 6d 70 72 65 73 73 20 66  . The compress f
11450 75 6e 63 74 69 6f 6e 20 6d 61 79 20 72 65 74 75  unction may retu
11460 72 6e 20 61 6e 79 20 74 79 70 65 20 6f 66 20 53  rn any type of S
11470 51 4c 69 74 65 20 0a 20 20 76 61 6c 75 65 20 28  QLite .  value (
11480 62 6c 6f 62 2c 20 74 65 78 74 2c 20 72 65 61 6c  blob, text, real
11490 2c 20 69 6e 74 65 67 65 72 20 6f 72 20 6e 75 6c  , integer or nul
114a0 6c 29 2e 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 75  l)...<p>.  The u
114b0 6e 63 6f 6d 70 72 65 73 73 20 66 75 6e 63 74 69  ncompress functi
114c0 6f 6e 20 73 68 6f 75 6c 64 20 75 6e 63 6f 6d 70  on should uncomp
114d0 72 65 73 73 20 64 61 74 61 20 70 72 65 76 69 6f  ress data previo
114e0 75 73 6c 79 20 63 6f 6d 70 72 65 73 73 65 64 20  usly compressed 
114f0 62 79 0a 20 20 74 68 65 20 63 6f 6d 70 72 65 73  by.  the compres
11500 73 20 66 75 6e 63 74 69 6f 6e 2e 20 49 6e 20 6f  s function. In o
11510 74 68 65 72 20 77 6f 72 64 73 2c 20 66 6f 72 20  ther words, for 
11520 61 6c 6c 20 53 51 4c 69 74 65 20 76 61 6c 75 65  all SQLite value
11530 73 20 58 2c 20 69 74 20 73 68 6f 75 6c 64 0a 20  s X, it should. 
11540 20 62 65 20 74 72 75 65 20 74 68 61 74 20 75 6e   be true that un
11550 63 6f 6d 70 72 65 73 73 28 63 6f 6d 70 72 65 73  compress(compres
11560 73 28 58 29 29 20 65 71 75 61 6c 73 20 58 2e 20  s(X)) equals X. 
11570 57 68 65 6e 20 64 61 74 61 20 74 68 61 74 20 68  When data that h
11580 61 73 20 62 65 65 6e 0a 20 20 63 6f 6d 70 72 65  as been.  compre
11590 73 73 65 64 20 62 79 20 74 68 65 20 63 6f 6d 70  ssed by the comp
115a0 72 65 73 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  ress function is
115b0 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64   read from the d
115c0 61 74 61 62 61 73 65 20 62 79 20 46 54 53 34 2c  atabase by FTS4,
115d0 20 69 74 0a 20 20 69 73 20 70 61 73 73 65 64 20   it.  is passed 
115e0 74 6f 20 74 68 65 20 75 6e 63 6f 6d 70 72 65 73  to the uncompres
115f0 73 20 66 75 6e 63 74 69 6f 6e 20 62 65 66 6f 72  s function befor
11600 65 20 69 74 20 69 73 20 75 73 65 64 2e 0a 0a 3c  e it is used...<
11610 70 3e 0a 20 20 49 66 20 74 68 65 20 73 70 65 63  p>.  If the spec
11620 69 66 69 65 64 20 63 6f 6d 70 72 65 73 73 20 6f  ified compress o
11630 72 20 75 6e 63 6f 6d 70 72 65 73 73 20 66 75 6e  r uncompress fun
11640 63 74 69 6f 6e 73 20 64 6f 20 6e 6f 74 20 65 78  ctions do not ex
11650 69 73 74 2c 20 74 68 65 20 74 61 62 6c 65 0a 20  ist, the table. 
11660 20 6d 61 79 20 73 74 69 6c 6c 20 62 65 20 63 72   may still be cr
11670 65 61 74 65 64 2e 20 41 6e 20 65 72 72 6f 72 20  eated. An error 
11680 69 73 20 6e 6f 74 20 72 65 74 75 72 6e 65 64 20  is not returned 
11690 75 6e 74 69 6c 20 74 68 65 20 46 54 53 34 20 74  until the FTS4 t
116a0 61 62 6c 65 20 69 73 0a 20 20 72 65 61 64 20 28  able is.  read (
116b0 69 66 20 74 68 65 20 75 6e 63 6f 6d 70 72 65 73  if the uncompres
116c0 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20  s function does 
116d0 6e 6f 74 20 65 78 69 73 74 29 20 6f 72 20 77 72  not exist) or wr
116e0 69 74 74 65 6e 20 28 69 66 20 69 74 20 69 73 20  itten (if it is 
116f0 74 68 65 20 0a 20 20 63 6f 6d 70 72 65 73 73 20  the .  compress 
11700 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 64 6f  function that do
11710 65 73 20 6e 6f 74 20 65 78 69 73 74 29 2e 0a 0a  es not exist)...
11720 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20 20 3c 69  <codeblock>.  <i
11730 3e 2d 2d 20 43 72 65 61 74 65 20 61 6e 20 46 54  >-- Create an FT
11740 53 34 20 74 61 62 6c 65 20 74 68 61 74 20 73 74  S4 table that st
11750 6f 72 65 73 20 64 61 74 61 20 69 6e 20 63 6f 6d  ores data in com
11760 70 72 65 73 73 65 64 20 66 6f 72 6d 2e 20 54 68  pressed form. Th
11770 69 73 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 61  is</i>.  <i>-- a
11780 73 73 75 6d 65 73 20 74 68 61 74 20 74 68 65 20  ssumes that the 
11790 73 63 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e 73  scalar functions
117a0 20 7a 69 70 28 29 20 61 6e 64 20 75 6e 7a 69 70   zip() and unzip
117b0 28 29 20 68 61 76 65 20 62 65 65 6e 20 28 6f 72  () have been (or
117c0 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 77 69 6c  </i>.  <i>-- wil
117d0 6c 20 62 65 29 20 61 64 64 65 64 20 74 6f 20 74  l be) added to t
117e0 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  he database hand
117f0 6c 65 2e 3c 2f 69 3e 0a 20 20 43 52 45 41 54 45  le.</i>.  CREATE
11800 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 70   VIRTUAL TABLE p
11810 61 70 65 72 73 20 55 53 49 4e 47 20 66 74 73 34  apers USING fts4
11820 28 61 75 74 68 6f 72 2c 20 64 6f 63 75 6d 65 6e  (author, documen
11830 74 2c 20 63 6f 6d 70 72 65 73 73 3d 7a 69 70 2c  t, compress=zip,
11840 20 75 6e 63 6f 6d 70 72 65 73 73 3d 75 6e 7a 69   uncompress=unzi
11850 70 29 3b 0a 3c 2f 63 6f 64 65 62 6c 6f 63 6b 3e  p);.</codeblock>
11860 0a 0a 3c 70 3e 0a 20 20 57 68 65 6e 20 69 6d 70  ..<p>.  When imp
11870 6c 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 63 6f  lementing the co
11880 6d 70 72 65 73 73 20 61 6e 64 20 75 6e 63 6f 6d  mpress and uncom
11890 70 72 65 73 73 20 66 75 6e 63 74 69 6f 6e 73 20  press functions 
118a0 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20  it is important 
118b0 74 6f 0a 20 20 70 61 79 20 61 74 74 65 6e 74 69  to.  pay attenti
118c0 6f 6e 20 74 6f 20 64 61 74 61 20 74 79 70 65 73  on to data types
118d0 2e 20 53 70 65 63 69 66 69 63 61 6c 6c 79 2c 20  . Specifically, 
118e0 77 68 65 6e 20 61 20 75 73 65 72 20 72 65 61 64  when a user read
118f0 73 20 61 20 76 61 6c 75 65 20 66 72 6f 6d 0a 20  s a value from. 
11900 20 61 20 63 6f 6d 70 72 65 73 73 65 64 20 46 54   a compressed FT
11910 53 20 74 61 62 6c 65 2c 20 74 68 65 20 76 61 6c  S table, the val
11920 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 46  ue returned by F
11930 54 53 20 69 73 20 65 78 61 63 74 6c 79 20 74 68  TS is exactly th
11940 65 20 73 61 6d 65 0a 20 20 61 73 20 74 68 65 20  e same.  as the 
11950 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  value returned b
11960 79 20 74 68 65 20 75 6e 63 6f 6d 70 72 65 73 73  y the uncompress
11970 20 66 75 6e 63 74 69 6f 6e 2c 20 69 6e 63 6c 75   function, inclu
11980 64 69 6e 67 20 74 68 65 20 64 61 74 61 20 74 79  ding the data ty
11990 70 65 2e 0a 20 20 49 66 20 74 68 61 74 20 64 61  pe..  If that da
119a0 74 61 20 74 79 70 65 20 69 73 20 6e 6f 74 20 74  ta type is not t
119b0 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 64  he same as the d
119c0 61 74 61 20 74 79 70 65 20 6f 66 20 74 68 65 20  ata type of the 
119d0 6f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 61  original value a
119e0 73 0a 20 20 70 61 73 73 65 64 20 74 6f 20 74 68  s.  passed to th
119f0 65 20 63 6f 6d 70 72 65 73 73 20 66 75 6e 63 74  e compress funct
11a00 69 6f 6e 20 28 66 6f 72 20 65 78 61 6d 70 6c 65  ion (for example
11a10 20 69 66 20 74 68 65 20 75 6e 63 6f 6d 70 72 65   if the uncompre
11a20 73 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 20  ss function is. 
11a30 20 72 65 74 75 72 6e 69 6e 67 20 42 4c 4f 42 20   returning BLOB 
11a40 77 68 65 6e 20 63 6f 6d 70 72 65 73 73 20 77 61  when compress wa
11a50 73 20 6f 72 69 67 69 6e 61 6c 6c 79 20 70 61 73  s originally pas
11a60 73 65 64 20 54 45 58 54 29 2c 20 74 68 65 6e 20  sed TEXT), then 
11a70 74 68 65 20 75 73 65 72 73 0a 20 20 71 75 65 72  the users.  quer
11a80 79 20 6d 61 79 20 6e 6f 74 20 66 75 6e 63 74 69  y may not functi
11a90 6f 6e 20 61 73 20 65 78 70 65 63 74 65 64 2e 0a  on as expected..
11aa0 0a 3c 74 63 6c 3e 68 64 5f 66 72 61 67 6d 65 6e  .<tcl>hd_fragmen
11ab0 74 20 2a 66 74 73 34 63 6f 6e 74 65 6e 74 20 7b  t *fts4content {
11ac0 46 54 53 34 20 63 6f 6e 74 65 6e 74 20 6f 70 74  FTS4 content opt
11ad0 69 6f 6e 7d 3c 2f 74 63 6c 3e 0a 3c 68 32 20 74  ion}</tcl>.<h2 t
11ae0 61 67 73 3d 22 66 74 73 34 20 63 6f 6e 74 65 6e  ags="fts4 conten
11af0 74 20 6f 70 74 69 6f 6e 22 3e 54 68 65 20 63 6f  t option">The co
11b00 6e 74 65 6e 74 3d 20 6f 70 74 69 6f 6e 20 3c 2f  ntent= option </
11b10 68 32 3e 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 63  h2>..<p>.  The c
11b20 6f 6e 74 65 6e 74 20 6f 70 74 69 6f 6e 20 61 6c  ontent option al
11b30 6c 6f 77 73 20 46 54 53 34 20 74 6f 20 66 6f 72  lows FTS4 to for
11b40 65 67 6f 20 73 74 6f 72 69 6e 67 20 74 68 65 20  ego storing the 
11b50 74 65 78 74 20 62 65 69 6e 67 20 69 6e 64 65 78  text being index
11b60 65 64 2e 0a 20 20 54 68 65 20 63 6f 6e 74 65 6e  ed..  The conten
11b70 74 20 6f 70 74 69 6f 6e 20 63 61 6e 20 62 65 20  t option can be 
11b80 75 73 65 64 20 69 6e 20 74 77 6f 20 77 61 79 73  used in two ways
11b90 3a 0a 0a 3c 75 6c 3e 0a 3c 6c 69 3e 3c 70 3e 20  :..<ul>.<li><p> 
11ba0 54 68 65 20 69 6e 64 65 78 65 64 20 64 6f 63 75  The indexed docu
11bb0 6d 65 6e 74 73 20 61 72 65 20 6e 6f 74 20 73 74  ments are not st
11bc0 6f 72 65 64 20 77 69 74 68 69 6e 20 74 68 65 20  ored within the 
11bd0 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65 20  SQLite database 
11be0 0a 20 20 20 20 20 20 20 20 61 74 20 61 6c 6c 20  .        at all 
11bf0 28 61 20 22 63 6f 6e 74 65 6e 74 6c 65 73 73 22  (a "contentless"
11c00 20 46 54 53 34 20 74 61 62 6c 65 29 2c 20 6f 72   FTS4 table), or
11c10 0a 0a 3c 6c 69 3e 3c 70 3e 20 54 68 65 20 69 6e  ..<li><p> The in
11c20 64 65 78 65 64 20 64 6f 63 75 6d 65 6e 74 73 20  dexed documents 
11c30 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20 61 20  are stored in a 
11c40 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 20 63  database table c
11c50 72 65 61 74 65 64 20 61 6e 64 0a 20 20 20 20 20  reated and.     
11c60 20 20 20 6d 61 6e 61 67 65 64 20 62 79 20 74 68     managed by th
11c70 65 20 75 73 65 72 20 28 61 6e 20 22 65 78 74 65  e user (an "exte
11c80 72 6e 61 6c 20 63 6f 6e 74 65 6e 74 22 20 46 54  rnal content" FT
11c90 53 34 20 74 61 62 6c 65 29 2e 0a 3c 2f 75 6c 3e  S4 table)..</ul>
11ca0 0a 0a 3c 70 3e 0a 20 20 42 65 63 61 75 73 65 20  ..<p>.  Because 
11cb0 74 68 65 20 69 6e 64 65 78 65 64 20 64 6f 63 75  the indexed docu
11cc0 6d 65 6e 74 73 20 74 68 65 6d 73 65 6c 76 65 73  ments themselves
11cd0 20 61 72 65 20 75 73 75 61 6c 6c 79 20 6d 75 63   are usually muc
11ce0 68 20 6c 61 72 67 65 72 20 74 68 61 6e 20 0a 20  h larger than . 
11cf0 20 74 68 65 20 66 75 6c 6c 2d 74 65 78 74 20 69   the full-text i
11d00 6e 64 65 78 2c 20 74 68 65 20 63 6f 6e 74 65 6e  ndex, the conten
11d10 74 20 6f 70 74 69 6f 6e 20 63 61 6e 20 62 65 20  t option can be 
11d20 75 73 65 64 20 74 6f 20 61 63 68 69 65 76 65 20  used to achieve 
11d30 0a 20 20 73 69 67 6e 69 66 69 63 61 6e 74 20 73  .  significant s
11d40 70 61 63 65 20 73 61 76 69 6e 67 73 2e 0a 0a 3c  pace savings...<
11d50 68 33 3e 20 43 6f 6e 74 65 6e 74 6c 65 73 73 20  h3> Contentless 
11d60 46 54 53 34 20 54 61 62 6c 65 73 20 3c 2f 68 33  FTS4 Tables </h3
11d70 3e 0a 0a 3c 70 3e 0a 20 20 49 6e 20 6f 72 64 65  >..<p>.  In orde
11d80 72 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20 46  r to create an F
11d90 54 53 34 20 74 61 62 6c 65 20 74 68 61 74 20 64  TS4 table that d
11da0 6f 65 73 20 6e 6f 74 20 73 74 6f 72 65 20 61 20  oes not store a 
11db0 63 6f 70 79 20 6f 66 20 74 68 65 20 69 6e 64 65  copy of the inde
11dc0 78 65 64 0a 20 20 64 6f 63 75 6d 65 6e 74 73 20  xed.  documents 
11dd0 61 74 20 61 6c 6c 2c 20 74 68 65 20 63 6f 6e 74  at all, the cont
11de0 65 6e 74 20 6f 70 74 69 6f 6e 20 73 68 6f 75 6c  ent option shoul
11df0 64 20 62 65 20 73 65 74 20 74 6f 20 61 6e 20 65  d be set to an e
11e00 6d 70 74 79 20 73 74 72 69 6e 67 2e 0a 20 20 46  mpty string..  F
11e10 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 20  or example, the 
11e20 66 6f 6c 6c 6f 77 69 6e 67 20 53 51 4c 20 63 72  following SQL cr
11e30 65 61 74 65 73 20 73 75 63 68 20 61 6e 20 46 54  eates such an FT
11e40 53 34 20 74 61 62 6c 65 20 77 69 74 68 20 74 68  S4 table with th
11e50 72 65 65 0a 20 20 63 6f 6c 75 6d 6e 73 20 2d 20  ree.  columns - 
11e60 22 61 22 2c 20 22 62 22 2c 20 61 6e 64 20 22 63  "a", "b", and "c
11e70 22 3a 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a  ":..<codeblock>.
11e80 20 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c    CREATE VIRTUAL
11e90 20 54 41 42 4c 45 20 74 31 20 55 53 49 4e 47 20   TABLE t1 USING 
11ea0 66 74 73 34 28 63 6f 6e 74 65 6e 74 3d 22 22 2c  fts4(content="",
11eb0 20 61 2c 20 62 2c 20 63 29 3b 0a 3c 2f 63 6f 64   a, b, c);.</cod
11ec0 65 62 6c 6f 63 6b 3e 0a 0a 3c 70 3e 0a 20 20 44  eblock>..<p>.  D
11ed0 61 74 61 20 63 61 6e 20 62 65 20 69 6e 73 65 72  ata can be inser
11ee0 74 65 64 20 69 6e 74 6f 20 73 75 63 68 20 61 6e  ted into such an
11ef0 20 46 54 53 34 20 74 61 62 6c 65 20 75 73 69 6e   FTS4 table usin
11f00 67 20 61 6e 20 49 4e 53 45 52 54 20 73 74 61 74  g an INSERT stat
11f10 65 6d 65 6e 74 73 2e 0a 20 20 48 6f 77 65 76 65  ements..  Howeve
11f20 72 2c 20 75 6e 6c 69 6b 65 20 6f 72 64 69 6e 61  r, unlike ordina
11f30 72 79 20 46 54 53 34 20 74 61 62 6c 65 73 2c 20  ry FTS4 tables, 
11f40 74 68 65 20 75 73 65 72 20 6d 75 73 74 20 73 75  the user must su
11f50 70 70 6c 79 20 61 6e 20 65 78 70 6c 69 63 69 74  pply an explicit
11f60 0a 20 20 69 6e 74 65 67 65 72 20 64 6f 63 69 64  .  integer docid
11f70 20 76 61 6c 75 65 2e 20 46 6f 72 20 65 78 61 6d   value. For exam
11f80 70 6c 65 3a 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b  ple:..<codeblock
11f90 3e 0a 20 20 3c 69 3e 2d 2d 20 54 68 69 73 20 73  >.  <i>-- This s
11fa0 74 61 74 65 6d 65 6e 74 20 69 73 20 4f 6b 3a 3c  tatement is Ok:<
11fb0 2f 69 3e 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  /i>.  INSERT INT
11fc0 4f 20 74 31 28 64 6f 63 69 64 2c 20 61 2c 20 62  O t1(docid, a, b
11fd0 2c 20 63 29 20 56 41 4c 55 45 53 28 31 2c 20 27  , c) VALUES(1, '
11fe0 61 20 62 20 63 27 2c 20 27 64 20 65 20 66 27 2c  a b c', 'd e f',
11ff0 20 27 67 20 68 20 69 27 29 3b 0a 0a 20 20 3c 69   'g h i');..  <i
12000 3e 2d 2d 20 54 68 69 73 20 73 74 61 74 65 6d 65  >-- This stateme
12010 6e 74 20 63 61 75 73 65 73 20 61 6e 20 65 72 72  nt causes an err
12020 6f 72 2c 20 61 73 20 6e 6f 20 64 6f 63 69 64 20  or, as no docid 
12030 76 61 6c 75 65 20 68 61 73 20 62 65 65 6e 20 70  value has been p
12040 72 6f 76 69 64 65 64 3a 3c 2f 69 3e 0a 20 20 49  rovided:</i>.  I
12050 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 28 61 2c  NSERT INTO t1(a,
12060 20 62 2c 20 63 29 20 56 41 4c 55 45 53 28 27 6a   b, c) VALUES('j
12070 20 6b 20 6c 27 2c 20 27 6d 20 6e 20 6f 27 2c 20   k l', 'm n o', 
12080 27 70 20 71 20 72 27 29 3b 0a 3c 2f 63 6f 64 65  'p q r');.</code
12090 62 6c 6f 63 6b 3e 0a 0a 3c 70 3e 0a 20 20 49 74  block>..<p>.  It
120a0 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
120b0 20 74 6f 20 55 50 44 41 54 45 20 6f 72 20 44 45   to UPDATE or DE
120c0 4c 45 54 45 20 61 20 72 6f 77 20 73 74 6f 72 65  LETE a row store
120d0 64 20 69 6e 20 61 20 63 6f 6e 74 65 6e 74 6c 65  d in a contentle
120e0 73 73 20 46 54 53 34 0a 20 20 74 61 62 6c 65 2e  ss FTS4.  table.
120f0 20 41 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 64   Attempting to d
12100 6f 20 73 6f 20 69 73 20 61 6e 20 65 72 72 6f 72  o so is an error
12110 2e 0a 0a 3c 70 3e 0a 20 20 43 6f 6e 74 65 6e 74  ...<p>.  Content
12120 6c 65 73 73 20 46 54 53 34 20 74 61 62 6c 65 73  less FTS4 tables
12130 20 61 6c 73 6f 20 73 75 70 70 6f 72 74 20 53 45   also support SE
12140 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e  LECT statements.
12150 20 48 6f 77 65 76 65 72 2c 20 69 74 20 69 73 0a   However, it is.
12160 20 20 61 6e 20 65 72 72 6f 72 20 74 6f 20 61 74    an error to at
12170 74 65 6d 70 74 20 74 6f 20 72 65 74 72 69 65 76  tempt to retriev
12180 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61  e the value of a
12190 6e 79 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20  ny table column 
121a0 6f 74 68 65 72 20 74 68 61 6e 0a 20 20 74 68 65  other than.  the
121b0 20 64 6f 63 69 64 20 63 6f 6c 75 6d 6e 2e 20 54   docid column. T
121c0 68 65 20 61 75 78 69 6c 69 61 72 79 20 66 75 6e  he auxiliary fun
121d0 63 74 69 6f 6e 20 6d 61 74 63 68 69 6e 66 6f 28  ction matchinfo(
121e0 29 20 6d 61 79 20 62 65 20 75 73 65 64 2c 20 62  ) may be used, b
121f0 75 74 0a 20 20 73 6e 69 70 70 65 74 28 29 20 61  ut.  snippet() a
12200 6e 64 20 6f 66 66 73 65 74 73 28 29 20 6d 61 79  nd offsets() may
12210 20 6e 6f 74 2e 20 46 6f 72 20 65 78 61 6d 70 6c   not. For exampl
12220 65 3a 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a  e:..<codeblock>.
12230 20 20 3c 69 3e 2d 2d 20 54 68 65 20 66 6f 6c 6c    <i>-- The foll
12240 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73  owing statements
12250 20 61 72 65 20 4f 6b 3a 3c 2f 69 3e 0a 20 20 53   are Ok:</i>.  S
12260 45 4c 45 43 54 20 64 6f 63 69 64 20 46 52 4f 4d  ELECT docid FROM
12270 20 74 31 20 57 48 45 52 45 20 74 31 20 4d 41 54   t1 WHERE t1 MAT
12280 43 48 20 27 78 78 78 27 3b 0a 20 20 53 45 4c 45  CH 'xxx';.  SELE
12290 43 54 20 64 6f 63 69 64 20 46 52 4f 4d 20 74 31  CT docid FROM t1
122a0 20 57 48 45 52 45 20 61 20 4d 41 54 43 48 20 27   WHERE a MATCH '
122b0 78 78 78 27 3b 0a 20 20 53 45 4c 45 43 54 20 6d  xxx';.  SELECT m
122c0 61 74 63 68 69 6e 66 6f 28 74 31 29 20 46 52 4f  atchinfo(t1) FRO
122d0 4d 20 74 31 20 57 48 45 52 45 20 74 31 20 4d 41  M t1 WHERE t1 MA
122e0 54 43 48 20 27 78 78 78 27 3b 0a 0a 20 20 3c 69  TCH 'xxx';..  <i
122f0 3e 2d 2d 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  >-- The followin
12300 67 20 73 74 61 74 65 6d 65 6e 74 73 20 61 6c 6c  g statements all
12310 20 63 61 75 73 65 20 65 72 72 6f 72 73 2c 20 61   cause errors, a
12320 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 63  s the value of c
12330 6f 6c 75 6d 6e 73 3c 2f 69 3e 0a 20 20 3c 69 3e  olumns</i>.  <i>
12340 2d 2d 20 6f 74 68 65 72 20 74 68 61 6e 20 64 6f  -- other than do
12350 63 69 64 20 61 72 65 20 72 65 71 75 69 72 65 64  cid are required
12360 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65   to evaluate the
12370 6d 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20  m.</i>.  SELECT 
12380 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 53 45 4c  * FROM t1;.  SEL
12390 45 43 54 20 61 2c 20 62 20 46 52 4f 4d 20 74 31  ECT a, b FROM t1
123a0 20 57 48 45 52 45 20 74 31 20 4d 41 54 43 48 20   WHERE t1 MATCH 
123b0 27 78 78 78 27 3b 0a 20 20 53 45 4c 45 43 54 20  'xxx';.  SELECT 
123c0 64 6f 63 69 64 20 46 52 4f 4d 20 74 31 20 57 48  docid FROM t1 WH
123d0 45 52 45 20 61 20 4c 49 4b 45 20 27 78 78 78 25  ERE a LIKE 'xxx%
123e0 27 3b 0a 20 20 53 45 4c 45 43 54 20 73 6e 69 70  ';.  SELECT snip
123f0 70 65 74 28 74 31 29 20 46 52 4f 4d 20 74 31 20  pet(t1) FROM t1 
12400 57 48 45 52 45 20 74 31 20 4d 41 54 43 48 20 27  WHERE t1 MATCH '
12410 78 78 78 27 3b 0a 3c 2f 63 6f 64 65 62 6c 6f 63  xxx';.</codebloc
12420 6b 3e 0a 0a 3c 70 3e 0a 20 20 45 72 72 6f 72 73  k>..<p>.  Errors
12430 20 72 65 6c 61 74 65 64 20 74 6f 20 61 74 74 65   related to atte
12440 6d 70 74 69 6e 67 20 74 6f 20 72 65 74 72 69 65  mpting to retrie
12450 76 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 73  ve column values
12460 20 6f 74 68 65 72 20 74 68 61 6e 20 64 6f 63 69   other than doci
12470 64 0a 20 20 61 72 65 20 72 75 6e 74 69 6d 65 20  d.  are runtime 
12480 65 72 72 6f 72 73 20 74 68 61 74 20 6f 63 63 75  errors that occu
12490 72 20 77 69 74 68 69 6e 20 73 71 6c 69 74 65 33  r within sqlite3
124a0 5f 73 74 65 70 28 29 2e 20 49 6e 20 73 6f 6d 65  _step(). In some
124b0 20 63 61 73 65 73 2c 20 66 6f 72 0a 20 20 65 78   cases, for.  ex
124c0 61 6d 70 6c 65 20 69 66 20 74 68 65 20 4d 41 54  ample if the MAT
124d0 43 48 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e  CH expression in
124e0 20 61 20 53 45 4c 45 43 54 20 71 75 65 72 79 20   a SELECT query 
124f0 6d 61 74 63 68 65 73 20 7a 65 72 6f 20 72 6f 77  matches zero row
12500 73 2c 20 74 68 65 72 65 0a 20 20 6d 61 79 20 62  s, there.  may b
12510 65 20 6e 6f 20 65 72 72 6f 72 20 61 74 20 61 6c  e no error at al
12520 6c 20 65 76 65 6e 20 69 66 20 61 20 73 74 61 74  l even if a stat
12530 65 6d 65 6e 74 20 64 6f 65 73 20 72 65 66 65 72  ement does refer
12540 20 74 6f 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65   to column value
12550 73 20 0a 20 20 6f 74 68 65 72 20 74 68 61 6e 20  s .  other than 
12560 64 6f 63 69 64 2e 0a 0a 3c 68 33 3e 20 45 78 74  docid...<h3> Ext
12570 65 72 6e 61 6c 20 43 6f 6e 74 65 6e 74 20 46 54  ernal Content FT
12580 53 34 20 54 61 62 6c 65 73 20 3c 2f 68 33 3e 0a  S4 Tables </h3>.
12590 0a 3c 70 3e 0a 20 20 41 6e 20 22 65 78 74 65 72  .<p>.  An "exter
125a0 6e 61 6c 20 63 6f 6e 74 65 6e 74 22 20 46 54 53  nal content" FTS
125b0 34 20 74 61 62 6c 65 20 69 73 20 73 69 6d 69 6c  4 table is simil
125c0 61 72 20 74 6f 20 61 20 63 6f 6e 74 65 6e 74 6c  ar to a contentl
125d0 65 73 73 20 74 61 62 6c 65 2c 20 65 78 63 65 70  ess table, excep
125e0 74 0a 20 20 74 68 61 74 20 69 66 20 65 76 61 6c  t.  that if eval
125f0 75 61 74 69 6f 6e 20 6f 66 20 61 20 71 75 65 72  uation of a quer
12600 79 20 72 65 71 75 69 72 65 73 20 74 68 65 20 76  y requires the v
12610 61 6c 75 65 20 6f 66 20 61 20 63 6f 6c 75 6d 6e  alue of a column
12620 20 6f 74 68 65 72 20 74 68 61 6e 20 0a 20 20 64   other than .  d
12630 6f 63 69 64 2c 20 46 54 53 34 20 61 74 74 65 6d  ocid, FTS4 attem
12640 70 74 73 20 74 6f 20 72 65 74 72 69 65 76 65 20  pts to retrieve 
12650 74 68 61 74 20 76 61 6c 75 65 20 66 72 6f 6d 20  that value from 
12660 61 20 74 61 62 6c 65 20 28 6f 72 20 76 69 65 77  a table (or view
12670 2c 20 6f 72 20 0a 20 20 76 69 72 74 75 61 6c 20  , or .  virtual 
12680 74 61 62 6c 65 29 20 6e 6f 6d 69 6e 61 74 65 64  table) nominated
12690 20 62 79 20 74 68 65 20 75 73 65 72 20 28 68 65   by the user (he
126a0 72 65 61 66 74 65 72 20 72 65 66 65 72 72 65 64  reafter referred
126b0 20 74 6f 20 61 73 20 74 68 65 20 22 63 6f 6e 74   to as the "cont
126c0 65 6e 74 0a 20 20 74 61 62 6c 65 22 29 2e 20 54  ent.  table"). T
126d0 68 65 20 46 54 53 34 20 6d 6f 64 75 6c 65 20 6e  he FTS4 module n
126e0 65 76 65 72 20 77 72 69 74 65 73 20 74 6f 20 74  ever writes to t
126f0 68 65 20 63 6f 6e 74 65 6e 74 20 74 61 62 6c 65  he content table
12700 2c 20 61 6e 64 20 77 72 69 74 69 6e 67 0a 20 20  , and writing.  
12710 74 6f 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 74  to the content t
12720 61 62 6c 65 20 64 6f 65 73 20 6e 6f 74 20 61 66  able does not af
12730 66 65 63 74 20 74 68 65 20 66 75 6c 6c 2d 74 65  fect the full-te
12740 78 74 20 69 6e 64 65 78 2e 20 49 74 20 69 73 20  xt index. It is 
12750 74 68 65 0a 20 20 72 65 73 70 6f 6e 73 69 62 69  the.  responsibi
12760 6c 69 74 79 20 6f 66 20 74 68 65 20 75 73 65 72  lity of the user
12770 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20   to ensure that 
12780 74 68 65 20 63 6f 6e 74 65 6e 74 20 74 61 62 6c  the content tabl
12790 65 20 61 6e 64 20 74 68 65 20 0a 20 20 66 75 6c  e and the .  ful
127a0 6c 2d 74 65 78 74 20 69 6e 64 65 78 20 61 72 65  l-text index are
127b0 20 63 6f 6e 73 69 73 74 65 6e 74 2e 0a 0a 3c 70   consistent...<p
127c0 3e 0a 20 20 41 6e 20 65 78 74 65 72 6e 61 6c 20  >.  An external 
127d0 63 6f 6e 74 65 6e 74 20 46 54 53 34 20 74 61 62  content FTS4 tab
127e0 6c 65 20 69 73 20 63 72 65 61 74 65 64 20 62 79  le is created by
127f0 20 73 65 74 74 69 6e 67 20 74 68 65 20 63 6f 6e   setting the con
12800 74 65 6e 74 20 6f 70 74 69 6f 6e 0a 20 20 74 6f  tent option.  to
12810 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 74   the name of a t
12820 61 62 6c 65 20 28 6f 72 20 76 69 65 77 2c 20 6f  able (or view, o
12830 72 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 29  r virtual table)
12840 20 74 68 61 74 20 6d 61 79 20 62 65 20 71 75 65   that may be que
12850 72 69 65 64 20 62 79 0a 20 20 46 54 53 34 20 74  ried by.  FTS4 t
12860 6f 20 72 65 74 72 69 65 76 65 20 63 6f 6c 75 6d  o retrieve colum
12870 6e 20 76 61 6c 75 65 73 20 77 68 65 6e 20 72 65  n values when re
12880 71 75 69 72 65 64 2e 20 49 66 20 74 68 65 20 6e  quired. If the n
12890 6f 6d 69 6e 61 74 65 64 20 74 61 62 6c 65 20 64  ominated table d
128a0 6f 65 73 0a 20 20 6e 6f 74 20 65 78 69 73 74 2c  oes.  not exist,
128b0 20 74 68 65 6e 20 61 6e 20 65 78 74 65 72 6e 61   then an externa
128c0 6c 20 63 6f 6e 74 65 6e 74 20 74 61 62 6c 65 20  l content table 
128d0 62 65 68 61 76 65 73 20 69 6e 20 74 68 65 20 73  behaves in the s
128e0 61 6d 65 20 77 61 79 20 61 73 0a 20 20 61 20 63  ame way as.  a c
128f0 6f 6e 74 65 6e 74 6c 65 73 73 20 74 61 62 6c 65  ontentless table
12900 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 0a  . For example:..
12910 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20 20 43 52  <codeblock>.  CR
12920 45 41 54 45 20 54 41 42 4c 45 20 74 32 28 69 64  EATE TABLE t2(id
12930 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
12940 20 4b 45 59 2c 20 61 2c 20 62 2c 20 63 29 3b 0a   KEY, a, b, c);.
12950 20 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c    CREATE VIRTUAL
12960 20 54 41 42 4c 45 20 74 33 20 55 53 49 4e 47 20   TABLE t3 USING 
12970 66 74 73 34 28 63 6f 6e 74 65 6e 74 3d 22 74 32  fts4(content="t2
12980 22 2c 20 61 2c 20 63 29 3b 0a 3c 2f 63 6f 64 65  ", a, c);.</code
12990 62 6c 6f 63 6b 3e 0a 0a 3c 70 3e 0a 20 20 41 73  block>..<p>.  As
129a0 73 75 6d 69 6e 67 20 74 68 65 20 6e 6f 6d 69 6e  suming the nomin
129b0 61 74 65 64 20 74 61 62 6c 65 20 64 6f 65 73 20  ated table does 
129c0 65 78 69 73 74 2c 20 74 68 65 6e 20 69 74 73 20  exist, then its 
129d0 63 6f 6c 75 6d 6e 73 20 6d 75 73 74 20 62 65 20  columns must be 
129e0 74 68 65 20 73 61 6d 65 20 0a 20 20 61 73 20 6f  the same .  as o
129f0 72 20 61 20 73 75 70 65 72 73 65 74 20 6f 66 20  r a superset of 
12a00 74 68 6f 73 65 20 64 65 66 69 6e 65 64 20 66 6f  those defined fo
12a10 72 20 74 68 65 20 46 54 53 20 74 61 62 6c 65 2e  r the FTS table.
12a20 20 20 54 68 65 20 65 78 74 65 72 6e 61 6c 20 74    The external t
12a30 61 62 6c 65 0a 20 20 6d 75 73 74 20 61 6c 73 6f  able.  must also
12a40 20 62 65 20 69 6e 20 74 68 65 20 73 61 6d 65 20   be in the same 
12a50 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 73  database file as
12a60 20 74 68 65 20 46 54 53 20 74 61 62 6c 65 2e 20   the FTS table. 
12a70 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
12a80 0a 20 20 54 68 65 20 65 78 74 65 72 6e 61 6c 20  .  The external 
12a90 74 61 62 6c 65 20 63 61 6e 6e 6f 74 20 62 65 20  table cannot be 
12aa0 69 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20 64  in a different d
12ab0 61 74 61 62 61 73 65 20 66 69 6c 65 20 63 6f 6e  atabase file con
12ac0 6e 65 63 74 65 64 20 75 73 69 6e 67 0a 20 20 5b  nected using.  [
12ad0 41 54 54 41 43 48 5d 20 6e 6f 72 20 6d 61 79 20  ATTACH] nor may 
12ae0 6f 6e 65 20 6f 66 20 74 68 65 20 46 54 53 20 74  one of the FTS t
12af0 61 62 6c 65 20 61 6e 64 20 74 68 65 20 65 78 74  able and the ext
12b00 65 72 6e 61 6c 20 63 6f 6e 74 65 6e 74 20 62 65  ernal content be
12b10 20 69 6e 20 74 68 65 0a 20 20 54 45 4d 50 20 64   in the.  TEMP d
12b20 61 74 61 62 61 73 65 20 77 68 65 6e 20 74 68 65  atabase when the
12b30 20 6f 74 68 65 72 20 69 73 20 69 6e 20 61 20 70   other is in a p
12b40 65 72 73 69 73 74 65 6e 74 20 64 61 74 61 62 61  ersistent databa
12b50 73 65 20 66 69 6c 65 20 73 75 63 68 20 61 73 20  se file such as 
12b60 4d 41 49 4e 2e 0a 0a 3c 70 3e 0a 20 20 57 68 65  MAIN...<p>.  Whe
12b70 6e 20 61 20 75 73 65 72 73 20 71 75 65 72 79 20  n a users query 
12b80 6f 6e 20 74 68 65 20 46 54 53 20 74 61 62 6c 65  on the FTS table
12b90 20 72 65 71 75 69 72 65 73 20 61 20 63 6f 6c 75   requires a colu
12ba0 6d 6e 20 76 61 6c 75 65 20 6f 74 68 65 72 20 74  mn value other t
12bb0 68 61 6e 0a 20 20 64 6f 63 69 64 2c 20 46 54 53  han.  docid, FTS
12bc0 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65 61   attempts to rea
12bd0 64 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  d the requested 
12be0 76 61 6c 75 65 20 66 72 6f 6d 20 74 68 65 20 63  value from the c
12bf0 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 63 6f 6c  orresponding col
12c00 75 6d 6e 20 6f 66 0a 20 20 74 68 65 20 72 6f 77  umn of.  the row
12c10 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20   in the content 
12c20 74 61 62 6c 65 20 77 69 74 68 20 61 20 72 6f 77  table with a row
12c30 69 64 20 76 61 6c 75 65 20 65 71 75 61 6c 20 74  id value equal t
12c40 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 46 54  o the current FT
12c50 53 0a 20 20 64 6f 63 69 64 2e 20 4f 72 2c 20 69  S.  docid. Or, i
12c60 66 20 73 75 63 68 20 61 20 72 6f 77 20 63 61 6e  f such a row can
12c70 6e 6f 74 20 62 65 20 66 6f 75 6e 64 20 69 6e 20  not be found in 
12c80 74 68 65 20 63 6f 6e 74 65 6e 74 20 74 61 62 6c  the content tabl
12c90 65 2c 20 61 20 4e 55 4c 4c 0a 20 20 76 61 6c 75  e, a NULL.  valu
12ca0 65 20 69 73 20 75 73 65 64 20 69 6e 73 74 65 61  e is used instea
12cb0 64 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a  d. For example:.
12cc0 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20 20 43  .<codeblock>.  C
12cd0 52 45 41 54 45 20 54 41 42 4c 45 20 74 32 28 69  REATE TABLE t2(i
12ce0 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  d INTEGER PRIMAR
12cf0 59 20 4b 45 59 2c 20 61 2c 20 62 2c 20 63 2c 20  Y KEY, a, b, c, 
12d00 64 29 3b 0a 20 20 43 52 45 41 54 45 20 56 49 52  d);.  CREATE VIR
12d10 54 55 41 4c 20 54 41 42 4c 45 20 74 33 20 55 53  TUAL TABLE t3 US
12d20 49 4e 47 20 66 74 73 34 28 63 6f 6e 74 65 6e 74  ING fts4(content
12d30 3d 22 74 32 22 2c 20 62 2c 20 63 29 3b 0a 20 20  ="t2", b, c);.  
12d40 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  .  INSERT INTO t
12d50 32 20 56 41 4c 55 45 53 28 32 2c 20 27 61 20 62  2 VALUES(2, 'a b
12d60 27 2c 20 27 63 20 64 27 2c 20 27 65 20 66 27 29  ', 'c d', 'e f')
12d70 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
12d80 74 32 20 56 41 4c 55 45 53 28 33 2c 20 27 67 20  t2 VALUES(3, 'g 
12d90 68 27 2c 20 27 69 20 6a 27 2c 20 27 6b 20 6c 27  h', 'i j', 'k l'
12da0 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
12db0 20 74 33 28 64 6f 63 69 64 2c 20 62 2c 20 63 29   t3(docid, b, c)
12dc0 20 53 45 4c 45 43 54 20 69 64 2c 20 62 2c 20 63   SELECT id, b, c
12dd0 20 46 52 4f 4d 20 74 32 3b 0a 20 20 3c 69 3e 2d   FROM t2;.  <i>-
12de0 2d 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  - The following 
12df0 71 75 65 72 79 20 72 65 74 75 72 6e 73 20 61 20  query returns a 
12e00 73 69 6e 67 6c 65 20 72 6f 77 20 77 69 74 68 20  single row with 
12e10 74 77 6f 20 63 6f 6c 75 6d 6e 73 20 63 6f 6e 74  two columns cont
12e20 61 69 6e 69 6e 67 0a 20 20 2d 2d 20 74 68 65 20  aining.  -- the 
12e30 74 65 78 74 20 76 61 6c 75 65 73 20 22 69 20 6a  text values "i j
12e40 22 20 61 6e 64 20 22 6b 20 6c 22 2e 0a 20 20 2d  " and "k l"..  -
12e50 2d 0a 20 20 2d 2d 20 54 68 65 20 71 75 65 72 79  -.  -- The query
12e60 20 75 73 65 73 20 74 68 65 20 66 75 6c 6c 2d 74   uses the full-t
12e70 65 78 74 20 69 6e 64 65 78 20 74 6f 20 64 69 73  ext index to dis
12e80 63 6f 76 65 72 20 74 68 61 74 20 74 68 65 20 4d  cover that the M
12e90 41 54 43 48 20 0a 20 20 2d 2d 20 74 65 72 6d 20  ATCH .  -- term 
12ea0 6d 61 74 63 68 65 73 20 74 68 65 20 72 6f 77 20  matches the row 
12eb0 77 69 74 68 20 64 6f 63 69 64 3d 33 2e 20 49 74  with docid=3. It
12ec0 20 74 68 65 6e 20 72 65 74 72 69 65 76 65 73 20   then retrieves 
12ed0 74 68 65 20 76 61 6c 75 65 73 0a 20 20 2d 2d 20  the values.  -- 
12ee0 6f 66 20 63 6f 6c 75 6d 6e 73 20 62 20 61 6e 64  of columns b and
12ef0 20 63 20 66 72 6f 6d 20 74 68 65 20 72 6f 77 20   c from the row 
12f00 77 69 74 68 20 72 6f 77 69 64 3d 33 20 69 6e 20  with rowid=3 in 
12f10 74 68 65 20 63 6f 6e 74 65 6e 74 20 74 61 62 6c  the content tabl
12f20 65 0a 20 20 2d 2d 20 74 6f 20 72 65 74 75 72 6e  e.  -- to return
12f30 2e 0a 20 20 2d 2d 3c 2f 69 3e 0a 20 20 53 45 4c  ..  --</i>.  SEL
12f40 45 43 54 20 2a 20 46 52 4f 4d 20 74 33 20 57 48  ECT * FROM t3 WH
12f50 45 52 45 20 74 33 20 4d 41 54 43 48 20 27 6b 27  ERE t3 MATCH 'k'
12f60 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 46 6f 6c 6c 6f  ;..  <i>-- Follo
12f70 77 69 6e 67 20 74 68 65 20 55 50 44 41 54 45 2c  wing the UPDATE,
12f80 20 74 68 65 20 71 75 65 72 79 20 73 74 69 6c 6c   the query still
12f90 20 72 65 74 75 72 6e 73 20 61 20 73 69 6e 67 6c   returns a singl
12fa0 65 20 72 6f 77 2c 20 74 68 69 73 0a 20 20 2d 2d  e row, this.  --
12fb0 20 74 69 6d 65 20 63 6f 6e 74 61 69 6e 69 6e 67   time containing
12fc0 20 74 68 65 20 74 65 78 74 20 76 61 6c 75 65 73   the text values
12fd0 20 22 78 78 78 22 20 61 6e 64 20 22 79 79 79 22   "xxx" and "yyy"
12fe0 2e 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73  . This is becaus
12ff0 65 20 74 68 65 0a 20 20 2d 2d 20 66 75 6c 6c 2d  e the.  -- full-
13000 74 65 78 74 20 69 6e 64 65 78 20 73 74 69 6c 6c  text index still
13010 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20   indicates that 
13020 74 68 65 20 72 6f 77 20 77 69 74 68 20 64 6f 63  the row with doc
13030 69 64 3d 33 20 6d 61 74 63 68 65 73 0a 20 20 2d  id=3 matches.  -
13040 2d 20 74 68 65 20 46 54 53 34 20 71 75 65 72 79  - the FTS4 query
13050 20 27 6b 27 2c 20 65 76 65 6e 20 74 68 6f 75 67   'k', even thoug
13060 68 20 74 68 65 20 64 6f 63 75 6d 65 6e 74 73 20  h the documents 
13070 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 63 6f  stored in the co
13080 6e 74 65 6e 74 0a 20 20 2d 2d 20 74 61 62 6c 65  ntent.  -- table
13090 20 68 61 76 65 20 62 65 65 6e 20 6d 6f 64 69 66   have been modif
130a0 69 65 64 2e 0a 20 20 2d 2d 3c 2f 69 3e 0a 20 20  ied..  --</i>.  
130b0 55 50 44 41 54 45 20 74 32 20 53 45 54 20 62 20  UPDATE t2 SET b 
130c0 3d 20 27 78 78 78 27 2c 20 63 20 3d 20 27 79 79  = 'xxx', c = 'yy
130d0 79 27 20 57 48 45 52 45 20 72 6f 77 69 64 20 3d  y' WHERE rowid =
130e0 20 33 3b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46   3;.  SELECT * F
130f0 52 4f 4d 20 74 33 20 57 48 45 52 45 20 74 33 20  ROM t3 WHERE t3 
13100 4d 41 54 43 48 20 27 6b 27 3b 0a 0a 20 20 3c 69  MATCH 'k';..  <i
13110 3e 2d 2d 20 46 6f 6c 6c 6f 77 69 6e 67 20 74 68  >-- Following th
13120 65 20 44 45 4c 45 54 45 20 62 65 6c 6f 77 2c 20  e DELETE below, 
13130 74 68 65 20 71 75 65 72 79 20 72 65 74 75 72 6e  the query return
13140 73 20 6f 6e 65 20 72 6f 77 20 63 6f 6e 74 61 69  s one row contai
13150 6e 69 6e 67 20 74 77 6f 0a 20 20 2d 2d 20 4e 55  ning two.  -- NU
13160 4c 4c 20 76 61 6c 75 65 73 2e 20 4e 55 4c 4c 20  LL values. NULL 
13170 76 61 6c 75 65 73 20 61 72 65 20 72 65 74 75 72  values are retur
13180 6e 65 64 20 62 65 63 61 75 73 65 20 46 54 53 20  ned because FTS 
13190 69 73 20 75 6e 61 62 6c 65 20 74 6f 20 66 69 6e  is unable to fin
131a0 64 0a 20 20 2d 2d 20 61 20 72 6f 77 20 77 69 74  d.  -- a row wit
131b0 68 20 72 6f 77 69 64 3d 33 20 77 69 74 68 69 6e  h rowid=3 within
131c0 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 74 61 62   the content tab
131d0 6c 65 2e 0a 20 20 2d 2d 3c 2f 69 3e 0a 20 20 44  le..  --</i>.  D
131e0 45 4c 45 54 45 20 46 52 4f 4d 20 74 32 3b 0a 20  ELETE FROM t2;. 
131f0 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
13200 33 20 57 48 45 52 45 20 74 33 20 4d 41 54 43 48  3 WHERE t3 MATCH
13210 20 27 6b 27 3b 0a 3c 2f 63 6f 64 65 62 6c 6f 63   'k';.</codebloc
13220 6b 3e 0a 0a 3c 70 3e 0a 20 20 57 68 65 6e 20 61  k>..<p>.  When a
13230 20 72 6f 77 20 69 73 20 64 65 6c 65 74 65 64 20   row is deleted 
13240 66 72 6f 6d 20 61 6e 20 65 78 74 65 72 6e 61 6c  from an external
13250 20 63 6f 6e 74 65 6e 74 20 46 54 53 34 20 74 61   content FTS4 ta
13260 62 6c 65 2c 20 46 54 53 34 20 6e 65 65 64 73 20  ble, FTS4 needs 
13270 74 6f 0a 20 20 72 65 74 72 69 65 76 65 20 74 68  to.  retrieve th
13280 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 73 20  e column values 
13290 6f 66 20 74 68 65 20 72 6f 77 20 62 65 69 6e 67  of the row being
132a0 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 74 68   deleted from th
132b0 65 20 63 6f 6e 74 65 6e 74 20 74 61 62 6c 65 2e  e content table.
132c0 0a 20 20 54 68 69 73 20 69 73 20 73 6f 20 74 68  .  This is so th
132d0 61 74 20 46 54 53 34 20 63 61 6e 20 75 70 64 61  at FTS4 can upda
132e0 74 65 20 74 68 65 20 66 75 6c 6c 2d 74 65 78 74  te the full-text
132f0 20 69 6e 64 65 78 20 65 6e 74 72 69 65 73 20 66   index entries f
13300 6f 72 20 65 61 63 68 20 74 6f 6b 65 6e 0a 20 20  or each token.  
13310 74 68 61 74 20 6f 63 63 75 72 73 20 77 69 74 68  that occurs with
13320 69 6e 20 74 68 65 20 64 65 6c 65 74 65 64 20 72  in the deleted r
13330 6f 77 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74  ow to indicate t
13340 68 61 74 20 72 6f 77 20 68 61 73 20 62 65 65 6e  hat row has been
13350 20 0a 20 20 64 65 6c 65 74 65 64 2e 20 49 66 20   .  deleted. If 
13360 74 68 65 20 63 6f 6e 74 65 6e 74 20 74 61 62 6c  the content tabl
13370 65 20 72 6f 77 20 63 61 6e 6e 6f 74 20 62 65 20  e row cannot be 
13380 66 6f 75 6e 64 2c 20 6f 72 20 69 66 20 69 74 20  found, or if it 
13390 63 6f 6e 74 61 69 6e 73 20 76 61 6c 75 65 73 0a  contains values.
133a0 20 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 77    inconsistent w
133b0 69 74 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ith the contents
133c0 20 6f 66 20 74 68 65 20 46 54 53 20 69 6e 64 65   of the FTS inde
133d0 78 2c 20 74 68 65 20 72 65 73 75 6c 74 73 20 63  x, the results c
133e0 61 6e 20 62 65 20 64 69 66 66 69 63 75 6c 74 0a  an be difficult.
133f0 20 20 74 6f 20 70 72 65 64 69 63 74 2e 20 54 68    to predict. Th
13400 65 20 46 54 53 20 69 6e 64 65 78 20 6d 61 79 20  e FTS index may 
13410 62 65 20 6c 65 66 74 20 63 6f 6e 74 61 69 6e 69  be left containi
13420 6e 67 20 65 6e 74 72 69 65 73 20 63 6f 72 72 65  ng entries corre
13430 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 0a  sponding to the.
13440 20 20 64 65 6c 65 74 65 64 20 72 6f 77 2c 20 77    deleted row, w
13450 68 69 63 68 20 63 61 6e 20 6c 65 61 64 20 74 6f  hich can lead to
13460 20 73 65 65 6d 69 6e 67 6c 79 20 6e 6f 6e 73 65   seemingly nonse
13470 6e 73 69 63 61 6c 20 72 65 73 75 6c 74 73 20 62  nsical results b
13480 65 69 6e 67 20 72 65 74 75 72 6e 65 64 0a 20 20  eing returned.  
13490 62 79 20 73 75 62 73 65 71 75 65 6e 74 20 53 45  by subsequent SE
134a0 4c 45 43 54 20 71 75 65 72 69 65 73 2e 20 54 68  LECT queries. Th
134b0 65 20 73 61 6d 65 20 61 70 70 6c 69 65 73 20 77  e same applies w
134c0 68 65 6e 20 61 20 72 6f 77 20 69 73 20 75 70 64  hen a row is upd
134d0 61 74 65 64 2c 20 61 73 0a 20 20 69 6e 74 65 72  ated, as.  inter
134e0 6e 61 6c 6c 79 20 61 6e 20 55 50 44 41 54 45 20  nally an UPDATE 
134f0 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 61  is the same as a
13500 20 44 45 4c 45 54 45 20 66 6f 6c 6c 6f 77 65 64   DELETE followed
13510 20 62 79 20 61 6e 20 49 4e 53 45 52 54 2e 0a 0a   by an INSERT...
13520 3c 70 3e 20 20 0a 20 20 49 6e 73 74 65 61 64 20  <p>  .  Instead 
13530 6f 66 20 77 72 69 74 69 6e 67 20 73 65 70 61 72  of writing separ
13540 61 74 65 6c 79 20 74 6f 20 74 68 65 20 66 75 6c  ately to the ful
13550 6c 2d 74 65 78 74 20 69 6e 64 65 78 20 61 6e 64  l-text index and
13560 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 74 61 62   the content tab
13570 6c 65 2c 0a 20 20 73 6f 6d 65 20 75 73 65 72 73  le,.  some users
13580 20 6d 61 79 20 77 69 73 68 20 74 6f 20 75 73 65   may wish to use
13590 20 64 61 74 61 62 61 73 65 20 74 72 69 67 67 65   database trigge
135a0 72 73 20 74 6f 20 6b 65 65 70 20 74 68 65 20 66  rs to keep the f
135b0 75 6c 6c 2d 74 65 78 74 20 69 6e 64 65 78 0a 20  ull-text index. 
135c0 20 75 70 20 74 6f 20 64 61 74 65 20 77 69 74 68   up to date with
135d0 20 72 65 73 70 65 63 74 20 74 6f 20 74 68 65 20   respect to the 
135e0 73 65 74 20 6f 66 20 64 6f 63 75 6d 65 6e 74 73  set of documents
135f0 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 63   stored in the c
13600 6f 6e 74 65 6e 74 20 74 61 62 6c 65 2e 0a 20 20  ontent table..  
13610 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 75 73 69  For example, usi
13620 6e 67 20 74 68 65 20 74 61 62 6c 65 73 20 66 72  ng the tables fr
13630 6f 6d 20 65 61 72 6c 69 65 72 20 65 78 61 6d 70  om earlier examp
13640 6c 65 73 3a 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b  les:..<codeblock
13650 3e 0a 20 20 43 52 45 41 54 45 20 54 52 49 47 47  >.  CREATE TRIGG
13660 45 52 20 74 32 5f 62 75 20 42 45 46 4f 52 45 20  ER t2_bu BEFORE 
13670 55 50 44 41 54 45 20 4f 4e 20 74 32 20 42 45 47  UPDATE ON t2 BEG
13680 49 4e 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52  IN.    DELETE FR
13690 4f 4d 20 74 33 20 57 48 45 52 45 20 64 6f 63 69  OM t3 WHERE doci
136a0 64 3d 6f 6c 64 2e 72 6f 77 69 64 3b 0a 20 20 45  d=old.rowid;.  E
136b0 4e 44 3b 0a 20 20 43 52 45 41 54 45 20 54 52 49  ND;.  CREATE TRI
136c0 47 47 45 52 20 74 32 5f 62 64 20 42 45 46 4f 52  GGER t2_bd BEFOR
136d0 45 20 44 45 4c 45 54 45 20 4f 4e 20 74 32 20 42  E DELETE ON t2 B
136e0 45 47 49 4e 0a 20 20 20 20 44 45 4c 45 54 45 20  EGIN.    DELETE 
136f0 46 52 4f 4d 20 74 33 20 57 48 45 52 45 20 64 6f  FROM t3 WHERE do
13700 63 69 64 3d 6f 6c 64 2e 72 6f 77 69 64 3b 0a 20  cid=old.rowid;. 
13710 20 45 4e 44 3b 0a 0a 20 20 43 52 45 41 54 45 20   END;..  CREATE 
13720 54 52 49 47 47 45 52 20 74 32 5f 61 75 20 41 46  TRIGGER t2_au AF
13730 54 45 52 20 55 50 44 41 54 45 20 4f 4e 20 74 32  TER UPDATE ON t2
13740 20 42 45 47 49 4e 0a 20 20 20 20 49 4e 53 45 52   BEGIN.    INSER
13750 54 20 49 4e 54 4f 20 74 33 28 64 6f 63 69 64 2c  T INTO t3(docid,
13760 20 62 2c 20 63 29 20 56 41 4c 55 45 53 28 6e 65   b, c) VALUES(ne
13770 77 2e 72 6f 77 69 64 2c 20 6e 65 77 2e 62 2c 20  w.rowid, new.b, 
13780 6e 65 77 2e 63 29 3b 0a 20 20 45 4e 44 3b 0a 20  new.c);.  END;. 
13790 20 43 52 45 41 54 45 20 54 52 49 47 47 45 52 20   CREATE TRIGGER 
137a0 74 32 5f 61 69 20 41 46 54 45 52 20 49 4e 53 45  t2_ai AFTER INSE
137b0 52 54 20 4f 4e 20 74 32 20 42 45 47 49 4e 0a 20  RT ON t2 BEGIN. 
137c0 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
137d0 33 28 64 6f 63 69 64 2c 20 62 2c 20 63 29 20 56  3(docid, b, c) V
137e0 41 4c 55 45 53 28 6e 65 77 2e 72 6f 77 69 64 2c  ALUES(new.rowid,
137f0 20 6e 65 77 2e 62 2c 20 6e 65 77 2e 63 29 3b 0a   new.b, new.c);.
13800 20 20 45 4e 44 3b 0a 3c 2f 63 6f 64 65 62 6c 6f    END;.</codeblo
13810 63 6b 3e 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 44  ck>..<p>.  The D
13820 45 4c 45 54 45 20 74 72 69 67 67 65 72 20 6d 75  ELETE trigger mu
13830 73 74 20 62 65 20 66 69 72 65 64 20 62 65 66 6f  st be fired befo
13840 72 65 20 74 68 65 20 61 63 74 75 61 6c 20 64 65  re the actual de
13850 6c 65 74 65 20 74 61 6b 65 73 20 70 6c 61 63 65  lete takes place
13860 0a 20 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e  .  on the conten
13870 74 20 74 61 62 6c 65 2e 20 54 68 69 73 20 69 73  t table. This is
13880 20 73 6f 20 74 68 61 74 20 46 54 53 34 20 63 61   so that FTS4 ca
13890 6e 20 73 74 69 6c 6c 20 72 65 74 72 69 65 76 65  n still retrieve
138a0 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 20 20   the original.  
138b0 76 61 6c 75 65 73 20 69 6e 20 6f 72 64 65 72 20  values in order 
138c0 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 66 75  to update the fu
138d0 6c 6c 2d 74 65 78 74 20 69 6e 64 65 78 2e 20 41  ll-text index. A
138e0 6e 64 20 74 68 65 20 49 4e 53 45 52 54 20 74 72  nd the INSERT tr
138f0 69 67 67 65 72 20 6d 75 73 74 0a 20 20 62 65 20  igger must.  be 
13900 66 69 72 65 64 20 61 66 74 65 72 20 74 68 65 20  fired after the 
13910 6e 65 77 20 72 6f 77 20 69 73 20 69 6e 73 65 72  new row is inser
13920 74 65 64 2c 20 73 6f 20 61 73 20 74 6f 20 68 61  ted, so as to ha
13930 6e 64 6c 65 20 74 68 65 20 63 61 73 65 20 77 68  ndle the case wh
13940 65 72 65 20 74 68 65 0a 20 20 72 6f 77 69 64 20  ere the.  rowid 
13950 69 73 20 61 73 73 69 67 6e 65 64 20 61 75 74 6f  is assigned auto
13960 6d 61 74 69 63 61 6c 6c 79 20 77 69 74 68 69 6e  matically within
13970 20 74 68 65 20 73 79 73 74 65 6d 2e 20 54 68 65   the system. The
13980 20 55 50 44 41 54 45 20 74 72 69 67 67 65 72 20   UPDATE trigger 
13990 6d 75 73 74 0a 20 20 62 65 20 73 70 6c 69 74 20  must.  be split 
139a0 69 6e 74 6f 20 74 77 6f 20 70 61 72 74 73 2c 20  into two parts, 
139b0 6f 6e 65 20 66 69 72 65 64 20 62 65 66 6f 72 65  one fired before
139c0 20 61 6e 64 20 6f 6e 65 20 61 66 74 65 72 20 74   and one after t
139d0 68 65 20 75 70 64 61 74 65 20 6f 66 20 74 68 65  he update of the
139e0 0a 20 20 63 6f 6e 74 65 6e 74 20 74 61 62 6c 65  .  content table
139f0 2c 20 66 6f 72 20 74 68 65 20 73 61 6d 65 20 72  , for the same r
13a00 65 61 73 6f 6e 73 2e 0a 0a 3c 70 3e 0a 20 20 54  easons...<p>.  T
13a10 68 65 20 5b 46 54 53 34 20 22 72 65 62 75 69 6c  he [FTS4 "rebuil
13a20 64 22 20 63 6f 6d 6d 61 6e 64 5d 0a 20 20 64 65  d" command].  de
13a30 6c 65 74 65 73 20 74 68 65 20 65 6e 74 69 72 65  letes the entire
13a40 20 66 75 6c 6c 2d 74 65 78 74 20 69 6e 64 65 78   full-text index
13a50 20 61 6e 64 20 72 65 62 75 69 6c 64 73 20 69 74   and rebuilds it
13a60 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 63 75   based on the cu
13a70 72 72 65 6e 74 0a 20 20 73 65 74 20 6f 66 20 64  rrent.  set of d
13a80 6f 63 75 6d 65 6e 74 73 20 69 6e 20 74 68 65 20  ocuments in the 
13a90 63 6f 6e 74 65 6e 74 20 74 61 62 6c 65 2e 20 41  content table. A
13aa0 73 73 75 6d 69 6e 67 20 61 67 61 69 6e 20 74 68  ssuming again th
13ab0 61 74 20 22 74 33 22 20 69 73 20 74 68 65 0a 20  at "t3" is the. 
13ac0 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 65 78 74   name of the ext
13ad0 65 72 6e 61 6c 20 63 6f 6e 74 65 6e 74 20 46 54  ernal content FT
13ae0 53 34 20 74 61 62 6c 65 2c 20 74 68 65 20 72 65  S4 table, the re
13af0 62 75 69 6c 64 20 63 6f 6d 6d 61 6e 64 20 6c 6f  build command lo
13b00 6f 6b 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a 0a  oks like this:..
13b10 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20 20 49 4e  <codeblock>.  IN
13b20 53 45 52 54 20 49 4e 54 4f 20 74 33 28 74 33 29  SERT INTO t3(t3)
13b30 20 56 41 4c 55 45 53 28 27 72 65 62 75 69 6c 64   VALUES('rebuild
13b40 27 29 3b 0a 3c 2f 63 6f 64 65 62 6c 6f 63 6b 3e  ');.</codeblock>
13b50 0a 0a 3c 70 3e 0a 20 20 54 68 69 73 20 63 6f 6d  ..<p>.  This com
13b60 6d 61 6e 64 20 6d 61 79 20 61 6c 73 6f 20 62 65  mand may also be
13b70 20 75 73 65 64 20 77 69 74 68 20 6f 72 64 69 6e   used with ordin
13b80 61 72 79 20 46 54 53 34 20 74 61 62 6c 65 73 2c  ary FTS4 tables,
13b90 20 66 6f 72 20 65 78 61 6d 70 6c 65 20 69 66 0a   for example if.
13ba0 20 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61    the implementa
13bb0 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 6f 6b 65  tion of the toke
13bc0 6e 69 7a 65 72 20 63 68 61 6e 67 65 73 2e 20 20  nizer changes.  
13bd0 49 74 20 69 73 20 61 6e 0a 20 20 65 72 72 6f 72  It is an.  error
13be0 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 72   to attempt to r
13bf0 65 62 75 69 6c 64 20 74 68 65 20 66 75 6c 6c 2d  ebuild the full-
13c00 74 65 78 74 20 69 6e 64 65 78 20 6d 61 69 6e 74  text index maint
13c10 61 69 6e 65 64 20 62 79 20 61 20 63 6f 6e 74 65  ained by a conte
13c20 6e 74 6c 65 73 73 0a 20 20 46 54 53 34 20 74 61  ntless.  FTS4 ta
13c30 62 6c 65 2c 20 73 69 6e 63 65 20 6e 6f 20 63 6f  ble, since no co
13c40 6e 74 65 6e 74 20 77 69 6c 6c 20 62 65 20 61 76  ntent will be av
13c50 61 69 6c 61 62 6c 65 20 74 6f 20 64 6f 20 74 68  ailable to do th
13c60 65 20 72 65 62 75 69 6c 64 69 6e 67 2e 0a 0a 0a  e rebuilding....
13c70 3c 74 63 6c 3e 68 64 5f 66 72 61 67 6d 65 6e 74  <tcl>hd_fragment
13c80 20 2a 66 74 73 34 6c 61 6e 67 75 61 67 65 69 64   *fts4languageid
13c90 20 6c 61 6e 67 75 61 67 65 69 64 20 7b 46 54 53   languageid {FTS
13ca0 34 20 6c 61 6e 67 75 61 67 65 69 64 20 6f 70 74  4 languageid opt
13cb0 69 6f 6e 7d 3c 2f 74 63 6c 3e 0a 3c 68 32 20 74  ion}</tcl>.<h2 t
13cc0 61 67 73 3d 22 66 74 73 34 20 6c 61 6e 67 75 61  ags="fts4 langua
13cd0 67 65 69 64 20 6f 70 74 69 6f 6e 22 3e 54 68 65  geid option">The
13ce0 20 6c 61 6e 67 75 61 67 65 69 64 3d 20 6f 70 74   languageid= opt
13cf0 69 6f 6e 3c 2f 68 32 3e 0a 0a 3c 70 3e 0a 20 20  ion</h2>..<p>.  
13d00 57 68 65 6e 20 74 68 65 20 6c 61 6e 67 75 61 67  When the languag
13d10 65 69 64 20 6f 70 74 69 6f 6e 20 69 73 20 70 72  eid option is pr
13d20 65 73 65 6e 74 2c 20 69 74 20 73 70 65 63 69 66  esent, it specif
13d30 69 65 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 0a  ies the name of.
13d40 20 20 61 6e 6f 74 68 65 72 20 5b 68 69 64 64 65    another [hidde
13d50 6e 20 63 6f 6c 75 6d 6e 5d 20 74 68 61 74 20 69  n column] that i
13d60 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 46  s added to the F
13d70 54 53 34 0a 20 20 74 61 62 6c 65 20 61 6e 64 20  TS4.  table and 
13d80 77 68 69 63 68 20 69 73 20 75 73 65 64 20 74 6f  which is used to
13d90 20 73 70 65 63 69 66 79 20 74 68 65 20 6c 61 6e   specify the lan
13da0 67 75 61 67 65 20 73 74 6f 72 65 64 20 69 6e 20  guage stored in 
13db0 65 61 63 68 20 72 6f 77 0a 20 20 6f 66 20 74 68  each row.  of th
13dc0 65 20 46 54 53 34 20 74 61 62 6c 65 2e 20 20 54  e FTS4 table.  T
13dd0 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 6c  he name of the l
13de0 61 6e 67 75 61 67 65 69 64 20 68 69 64 64 65 6e  anguageid hidden
13df0 20 63 6f 6c 75 6d 6e 20 6d 75 73 74 0a 20 20 62   column must.  b
13e00 65 20 64 69 73 74 69 6e 63 74 20 66 72 6f 6d 20  e distinct from 
13e10 61 6c 6c 20 6f 74 68 65 72 20 63 6f 6c 75 6d 6e  all other column
13e20 20 6e 61 6d 65 73 20 69 6e 20 74 68 65 20 46 54   names in the FT
13e30 53 34 20 74 61 62 6c 65 2e 20 20 45 78 61 6d 70  S4 table.  Examp
13e40 6c 65 3a 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e  le:..<codeblock>
13e50 0a 20 20 43 52 45 41 54 45 20 56 49 52 54 55 41  .  CREATE VIRTUA
13e60 4c 20 54 41 42 4c 45 20 74 31 20 55 53 49 4e 47  L TABLE t1 USING
13e70 20 66 74 73 34 28 78 2c 20 79 2c 20 6c 61 6e 67   fts4(x, y, lang
13e80 75 61 67 65 69 64 3d 22 6c 69 64 22 29 0a 3c 2f  uageid="lid").</
13e90 63 6f 64 65 62 6c 6f 63 6b 3e 0a 0a 3c 70 3e 0a  codeblock>..<p>.
13ea0 20 20 54 68 65 20 64 65 66 61 75 6c 74 20 76 61    The default va
13eb0 6c 75 65 20 6f 66 20 61 20 6c 61 6e 67 75 61 67  lue of a languag
13ec0 65 69 64 20 63 6f 6c 75 6d 6e 20 69 73 20 30 2e  eid column is 0.
13ed0 20 41 6e 79 20 76 61 6c 75 65 20 69 6e 73 65 72   Any value inser
13ee0 74 65 64 0a 20 20 69 6e 74 6f 20 61 20 6c 61 6e  ted.  into a lan
13ef0 67 75 61 67 65 69 64 20 63 6f 6c 75 6d 6e 20 69  guageid column i
13f00 73 20 63 6f 6e 76 65 72 74 65 64 20 74 6f 20 61  s converted to a
13f10 20 33 32 2d 62 69 74 20 28 6e 6f 74 20 36 34 29   32-bit (not 64)
13f20 20 73 69 67 6e 65 64 0a 20 20 69 6e 74 65 67 65   signed.  intege
13f30 72 2e 0a 0a 3c 70 3e 0a 20 20 42 79 20 64 65 66  r...<p>.  By def
13f40 61 75 6c 74 2c 20 46 54 53 20 71 75 65 72 69 65  ault, FTS querie
13f50 73 20 28 74 68 6f 73 65 20 74 68 61 74 20 75 73  s (those that us
13f60 65 20 74 68 65 20 4d 41 54 43 48 20 6f 70 65 72  e the MATCH oper
13f70 61 74 6f 72 29 0a 20 20 63 6f 6e 73 69 64 65 72  ator).  consider
13f80 20 6f 6e 6c 79 20 74 68 6f 73 65 20 72 6f 77 73   only those rows
13f90 20 77 69 74 68 20 74 68 65 20 6c 61 6e 67 75 61   with the langua
13fa0 67 65 69 64 20 63 6f 6c 75 6d 6e 20 73 65 74 20  geid column set 
13fb0 74 6f 20 30 2e 20 54 6f 0a 20 20 71 75 65 72 79  to 0. To.  query
13fc0 20 66 6f 72 20 72 6f 77 73 20 77 69 74 68 20 6f   for rows with o
13fd0 74 68 65 72 20 6c 61 6e 67 75 61 67 65 69 64 20  ther languageid 
13fe0 76 61 6c 75 65 73 2c 20 61 20 63 6f 6e 73 74 72  values, a constr
13ff0 61 69 6e 74 20 6f 66 20 74 68 65 0a 20 20 66 6f  aint of the.  fo
14000 72 6d 20 22 3c 6c 61 6e 67 75 61 67 65 2d 69 64  rm "<language-id
14010 3e 20 3d 20 3c 69 6e 74 65 67 65 72 3e 22 20 6d  > = <integer>" m
14020 75 73 74 20 62 65 20 61 64 64 65 64 20 74 6f 20  ust be added to 
14030 74 68 65 20 71 75 65 72 69 65 73 0a 20 20 57 48  the queries.  WH
14040 45 52 45 20 63 6c 61 75 73 65 2e 20 46 6f 72 20  ERE clause. For 
14050 65 78 61 6d 70 6c 65 3a 0a 0a 3c 63 6f 64 65 62  example:..<codeb
14060 6c 6f 63 6b 3e 0a 20 20 53 45 4c 45 43 54 20 2a  lock>.  SELECT *
14070 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 74   FROM t1 WHERE t
14080 31 20 4d 41 54 43 48 20 27 61 62 63 27 20 41 4e  1 MATCH 'abc' AN
14090 44 20 6c 69 64 3d 35 3b 0a 3c 2f 63 6f 64 65 62  D lid=5;.</codeb
140a0 6c 6f 63 6b 3e 0a 0a 3c 70 3e 0a 20 20 49 74 20  lock>..<p>.  It 
140b0 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
140c0 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 46 54 53  for a single FTS
140d0 20 71 75 65 72 79 20 74 6f 20 72 65 74 75 72 6e   query to return
140e0 20 72 6f 77 73 20 77 69 74 68 0a 20 20 64 69 66   rows with.  dif
140f0 66 65 72 65 6e 74 20 6c 61 6e 67 75 61 67 65 69  ferent languagei
14100 64 20 76 61 6c 75 65 73 2e 20 54 68 65 20 72 65  d values. The re
14110 73 75 6c 74 73 20 6f 66 20 61 64 64 69 6e 67 20  sults of adding 
14120 57 48 45 52 45 20 63 6c 61 75 73 65 73 0a 20 20  WHERE clauses.  
14130 74 68 61 74 20 75 73 65 20 6f 74 68 65 72 20 6f  that use other o
14140 70 65 72 61 74 6f 72 73 20 28 65 2e 67 2e 20 20  perators (e.g.  
14150 6c 69 64 21 3d 35 2c 20 6f 72 20 6c 69 64 26 6c  lid!=5, or lid&l
14160 74 3b 3d 35 29 20 61 72 65 20 75 6e 64 65 66 69  t;=5) are undefi
14170 6e 65 64 2e 0a 0a 3c 70 3e 0a 20 20 49 66 20 74  ned...<p>.  If t
14180 68 65 20 63 6f 6e 74 65 6e 74 20 6f 70 74 69 6f  he content optio
14190 6e 20 69 73 20 75 73 65 64 20 61 6c 6f 6e 67 20  n is used along 
141a0 77 69 74 68 20 74 68 65 20 6c 61 6e 67 75 61 67  with the languag
141b0 65 69 64 20 6f 70 74 69 6f 6e 2c 0a 20 20 74 68  eid option,.  th
141c0 65 6e 20 74 68 65 20 6e 61 6d 65 64 20 6c 61 6e  en the named lan
141d0 67 75 61 67 65 69 64 20 63 6f 6c 75 6d 6e 20 6d  guageid column m
141e0 75 73 74 20 65 78 69 73 74 20 69 6e 20 74 68 65  ust exist in the
141f0 20 63 6f 6e 74 65 6e 74 3d 20 74 61 62 6c 65 0a   content= table.
14200 20 20 28 73 75 62 6a 65 63 74 20 74 6f 20 74 68    (subject to th
14210 65 20 75 73 75 61 6c 20 72 75 6c 65 73 20 2d 20  e usual rules - 
14220 69 66 20 61 20 71 75 65 72 79 20 6e 65 76 65 72  if a query never
14230 20 6e 65 65 64 73 20 74 6f 20 72 65 61 64 20 74   needs to read t
14240 68 65 0a 20 20 63 6f 6e 74 65 6e 74 20 74 61 62  he.  content tab
14250 6c 65 20 74 68 65 6e 20 74 68 69 73 20 72 65 73  le then this res
14260 74 72 69 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f  triction does no
14270 74 20 61 70 70 6c 79 29 2e 0a 0a 3c 70 3e 0a 20  t apply)...<p>. 
14280 20 57 68 65 6e 20 74 68 65 20 6c 61 6e 67 75 61   When the langua
14290 67 65 69 64 20 6f 70 74 69 6f 6e 20 69 73 20 75  geid option is u
142a0 73 65 64 2c 20 53 51 4c 69 74 65 20 69 6e 76 6f  sed, SQLite invo
142b0 6b 65 73 20 74 68 65 20 78 4c 61 6e 67 75 61 67  kes the xLanguag
142c0 65 69 64 28 29 0a 20 20 6f 6e 20 74 68 65 20 73  eid().  on the s
142d0 71 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72  qlite3_tokenizer
142e0 5f 6d 6f 64 75 6c 65 20 6f 62 6a 65 63 74 20 69  _module object i
142f0 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72  mmediately after
14300 20 74 68 65 20 6f 62 6a 65 63 74 0a 20 20 69 73   the object.  is
14310 20 63 72 65 61 74 65 64 20 69 6e 20 6f 72 64 65   created in orde
14320 72 20 74 6f 20 70 61 73 73 20 69 6e 20 74 68 65  r to pass in the
14330 20 6c 61 6e 67 75 61 67 65 20 69 64 20 74 68 61   language id tha
14340 74 20 74 68 65 0a 20 20 74 6f 6b 65 6e 69 7a 65  t the.  tokenize
14350 72 20 73 68 6f 75 6c 64 20 75 73 65 2e 20 20 54  r should use.  T
14360 68 65 20 78 4c 61 6e 67 75 61 67 65 69 64 28 29  he xLanguageid()
14370 20 6d 65 74 68 6f 64 20 77 69 6c 6c 20 6e 65 76   method will nev
14380 65 72 20 62 65 20 63 61 6c 6c 65 64 0a 20 20 6d  er be called.  m
14390 6f 72 65 20 74 68 61 6e 20 6f 6e 63 65 20 66 6f  ore than once fo
143a0 72 20 61 6e 79 20 73 69 6e 67 6c 65 20 74 6f 6b  r any single tok
143b0 65 6e 69 7a 65 72 20 6f 62 6a 65 63 74 2e 20 20  enizer object.  
143c0 54 68 65 20 66 61 63 74 20 74 68 61 74 20 64 69  The fact that di
143d0 66 66 65 72 65 6e 74 0a 20 20 6c 61 6e 67 75 61  fferent.  langua
143e0 67 65 73 20 6d 69 67 68 74 20 62 65 20 74 6f 6b  ges might be tok
143f0 65 6e 69 7a 65 64 20 64 69 66 66 65 72 65 6e 74  enized different
14400 6c 79 20 69 73 20 6f 6e 65 20 72 65 61 73 6f 6e  ly is one reason
14410 20 77 68 79 20 6e 6f 20 73 69 6e 67 6c 65 0a 20   why no single. 
14420 20 46 54 53 20 71 75 65 72 79 20 63 61 6e 20 72   FTS query can r
14430 65 74 75 72 6e 20 72 6f 77 73 20 77 69 74 68 20  eturn rows with 
14440 64 69 66 66 65 72 65 6e 74 20 6c 61 6e 67 75 61  different langua
14450 67 65 69 64 20 76 61 6c 75 65 73 2e 0a 20 20 0a  geid values..  .
14460 0a 0a 3c 74 63 6c 3e 68 64 5f 66 72 61 67 6d 65  ..<tcl>hd_fragme
14470 6e 74 20 66 74 73 34 6d 61 74 63 68 69 6e 66 6f  nt fts4matchinfo
14480 20 7b 46 54 53 34 20 6d 61 74 63 68 69 6e 66 6f   {FTS4 matchinfo
14490 20 6f 70 74 69 6f 6e 7d 3c 2f 74 63 6c 3e 0a 3c   option}</tcl>.<
144a0 68 32 20 74 61 67 73 3d 22 66 74 73 34 20 6d 61  h2 tags="fts4 ma
144b0 74 63 68 69 6e 66 6f 20 6f 70 74 69 6f 6e 22 3e  tchinfo option">
144c0 54 68 65 20 6d 61 74 63 68 69 6e 66 6f 3d 20 6f  The matchinfo= o
144d0 70 74 69 6f 6e 3c 2f 68 32 3e 0a 0a 3c 70 3e 0a  ption</h2>..<p>.
144e0 20 20 54 68 65 20 6d 61 74 63 68 69 6e 66 6f 20    The matchinfo 
144f0 6f 70 74 69 6f 6e 20 6d 61 79 20 6f 6e 6c 79 20  option may only 
14500 62 65 20 73 65 74 20 74 6f 20 74 68 65 20 76 61  be set to the va
14510 6c 75 65 20 22 66 74 73 33 22 2e 20 0a 20 20 41  lue "fts3". .  A
14520 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 73 65 74  ttempting to set
14530 20 6d 61 74 63 68 69 6e 66 6f 20 74 6f 20 61 6e   matchinfo to an
14540 79 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61  ything other tha
14550 6e 20 22 66 74 73 33 22 20 69 73 20 61 6e 20 65  n "fts3" is an e
14560 72 72 6f 72 2e 0a 20 20 49 66 20 74 68 69 73 20  rror..  If this 
14570 6f 70 74 69 6f 6e 20 69 73 20 73 70 65 63 69 66  option is specif
14580 69 65 64 2c 20 74 68 65 6e 20 73 6f 6d 65 20 6f  ied, then some o
14590 66 20 74 68 65 20 65 78 74 72 61 20 69 6e 66 6f  f the extra info
145a0 72 6d 61 74 69 6f 6e 20 73 74 6f 72 65 64 20 62  rmation stored b
145b0 79 0a 20 20 46 54 53 34 20 69 73 20 6f 6d 69 74  y.  FTS4 is omit
145c0 74 65 64 2e 20 54 68 69 73 20 72 65 64 75 63 65  ted. This reduce
145d0 73 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  s the amount of 
145e0 64 69 73 6b 20 73 70 61 63 65 20 63 6f 6e 73 75  disk space consu
145f0 6d 65 64 20 62 79 0a 20 20 61 6e 20 46 54 53 34  med by.  an FTS4
14600 20 74 61 62 6c 65 20 75 6e 74 69 6c 20 69 74 20   table until it 
14610 69 73 20 61 6c 6d 6f 73 74 20 74 68 65 20 73 61  is almost the sa
14620 6d 65 20 61 73 20 74 68 65 20 61 6d 6f 75 6e 74  me as the amount
14630 20 74 68 61 74 20 77 6f 75 6c 64 0a 20 20 62 65   that would.  be
14640 20 75 73 65 64 20 62 79 20 74 68 65 20 65 71 75   used by the equ
14650 69 76 61 6c 65 6e 74 20 46 54 53 33 20 74 61 62  ivalent FTS3 tab
14660 6c 65 2c 20 62 75 74 20 61 6c 73 6f 20 6d 65 61  le, but also mea
14670 6e 73 20 74 68 61 74 20 74 68 65 20 64 61 74 61  ns that the data
14680 0a 20 20 61 63 63 65 73 73 65 64 20 62 79 20 70  .  accessed by p
14690 61 73 73 69 6e 67 20 74 68 65 20 27 6c 27 20 66  assing the 'l' f
146a0 6c 61 67 20 74 6f 20 74 68 65 20 5b 6d 61 74 63  lag to the [matc
146b0 68 69 6e 66 6f 28 29 5d 20 66 75 6e 63 74 69 6f  hinfo()] functio
146c0 6e 20 69 73 0a 20 20 6e 6f 74 20 61 76 61 69 6c  n is.  not avail
146d0 61 62 6c 65 2e 20 0a 0a 3c 74 63 6c 3e 68 64 5f  able. ..<tcl>hd_
146e0 66 72 61 67 6d 65 6e 74 20 66 74 73 34 6e 6f 74  fragment fts4not
146f0 69 6e 64 65 78 65 64 20 7b 46 54 53 34 20 6e 6f  indexed {FTS4 no
14700 74 69 6e 64 65 78 65 64 20 6f 70 74 69 6f 6e 7d  tindexed option}
14710 3c 2f 74 63 6c 3e 0a 3c 68 32 20 74 61 67 73 3d  </tcl>.<h2 tags=
14720 22 66 74 73 34 20 6e 6f 74 69 6e 64 65 78 65 64  "fts4 notindexed
14730 20 6f 70 74 69 6f 6e 22 3e 54 68 65 20 6e 6f 74   option">The not
14740 69 6e 64 65 78 65 64 3d 20 6f 70 74 69 6f 6e 3c  indexed= option<
14750 2f 68 32 3e 0a 0a 3c 70 3e 0a 20 20 4e 6f 72 6d  /h2>..<p>.  Norm
14760 61 6c 6c 79 2c 20 74 68 65 20 46 54 53 20 6d 6f  ally, the FTS mo
14770 64 75 6c 65 20 6d 61 69 6e 74 61 69 6e 73 20 61  dule maintains a
14780 6e 20 69 6e 76 65 72 74 65 64 20 69 6e 64 65 78  n inverted index
14790 20 6f 66 20 61 6c 6c 20 74 65 72 6d 73 20 69 6e   of all terms in
147a0 0a 20 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 6f  .  all columns o
147b0 66 20 74 68 65 20 74 61 62 6c 65 2e 20 54 68 69  f the table. Thi
147c0 73 20 6f 70 74 69 6f 6e 20 69 73 20 75 73 65 64  s option is used
147d0 20 74 6f 20 73 70 65 63 69 66 79 20 74 68 65 20   to specify the 
147e0 6e 61 6d 65 20 6f 66 0a 20 20 61 20 63 6f 6c 75  name of.  a colu
147f0 6d 6e 20 66 6f 72 20 77 68 69 63 68 20 65 6e 74  mn for which ent
14800 72 69 65 73 20 73 68 6f 75 6c 64 20 6e 6f 74 20  ries should not 
14810 62 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  be added to the 
14820 69 6e 64 65 78 2e 20 4d 75 6c 74 69 70 6c 65 0a  index. Multiple.
14830 20 20 22 6e 6f 74 69 6e 64 65 78 65 64 22 20 6f    "notindexed" o
14840 70 74 69 6f 6e 73 20 6d 61 79 20 62 65 20 75 73  ptions may be us
14850 65 64 20 74 6f 20 73 70 65 63 69 66 79 20 74 68  ed to specify th
14860 61 74 20 6d 75 6c 74 69 70 6c 65 20 63 6f 6c 75  at multiple colu
14870 6d 6e 73 20 73 68 6f 75 6c 64 0a 20 20 62 65 20  mns should.  be 
14880 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20 74 68 65  omitted from the
14890 20 69 6e 64 65 78 2e 20 46 6f 72 20 65 78 61 6d   index. For exam
148a0 70 6c 65 3a 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b  ple:..<codeblock
148b0 3e 0a 20 20 3c 69 3e 2d 2d 20 43 72 65 61 74 65  >.  <i>-- Create
148c0 20 61 6e 20 46 54 53 34 20 74 61 62 6c 65 20 66   an FTS4 table f
148d0 6f 72 20 77 68 69 63 68 20 6f 6e 6c 79 20 74 68  or which only th
148e0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 63 6f  e contents of co
148f0 6c 75 6d 6e 73 20 63 32 20 61 6e 64 20 63 34 3c  lumns c2 and c4<
14900 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 61 72 65 20  /i>.  <i>-- are 
14910 74 6f 6b 65 6e 69 7a 65 64 20 61 6e 64 20 61 64  tokenized and ad
14920 64 65 64 20 74 6f 20 74 68 65 20 69 6e 76 65 72  ded to the inver
14930 74 65 64 20 69 6e 64 65 78 2e 3c 2f 69 3e 0a 20  ted index.</i>. 
14940 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20   CREATE VIRTUAL 
14950 54 41 42 4c 45 20 74 31 20 55 53 49 4e 47 20 66  TABLE t1 USING f
14960 74 73 34 28 63 31 2c 20 63 32 2c 20 63 33 2c 20  ts4(c1, c2, c3, 
14970 63 34 2c 20 6e 6f 74 69 6e 64 65 78 65 64 3d 63  c4, notindexed=c
14980 31 2c 20 6e 6f 74 69 6e 64 65 78 65 64 3d 63 33  1, notindexed=c3
14990 29 3b 0a 3c 2f 63 6f 64 65 62 6c 6f 63 6b 3e 0a  );.</codeblock>.
149a0 0a 3c 70 3e 0a 20 20 56 61 6c 75 65 73 20 73 74  .<p>.  Values st
149b0 6f 72 65 64 20 69 6e 20 75 6e 69 6e 64 65 78 65  ored in unindexe
149c0 64 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 6e 6f  d columns are no
149d0 74 20 65 6c 69 67 69 62 6c 65 20 74 6f 20 6d 61  t eligible to ma
149e0 74 63 68 20 4d 41 54 43 48 20 0a 20 20 6f 70 65  tch MATCH .  ope
149f0 72 61 74 6f 72 73 2e 20 54 68 65 20 64 6f 20 6e  rators. The do n
14a00 6f 74 20 69 6e 66 6c 75 65 6e 63 65 20 74 68 65  ot influence the
14a10 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20   results of the 
14a20 6f 66 66 73 65 74 73 28 29 20 6f 72 20 6d 61 74  offsets() or mat
14a30 63 68 69 6e 66 6f 28 29 0a 20 20 61 75 78 69 6c  chinfo().  auxil
14a40 69 61 72 79 20 66 75 6e 63 74 69 6f 6e 73 2e 20  iary functions. 
14a50 4e 6f 72 20 77 69 6c 6c 20 74 68 65 20 73 6e 69  Nor will the sni
14a60 70 70 65 74 28 29 20 66 75 6e 63 74 69 6f 6e 20  ppet() function 
14a70 65 76 65 72 20 72 65 74 75 72 6e 20 61 0a 20 20  ever return a.  
14a80 73 6e 69 70 70 65 74 20 62 61 73 65 64 20 6f 6e  snippet based on
14a90 20 61 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20   a value stored 
14aa0 69 6e 20 61 6e 20 75 6e 69 6e 64 65 78 65 64 20  in an unindexed 
14ab0 63 6f 6c 75 6d 6e 2e 0a 0a 3c 74 63 6c 3e 68 64  column...<tcl>hd
14ac0 5f 66 72 61 67 6d 65 6e 74 20 66 74 73 34 70 72  _fragment fts4pr
14ad0 65 66 69 78 20 7b 46 54 53 34 20 70 72 65 66 69  efix {FTS4 prefi
14ae0 78 20 6f 70 74 69 6f 6e 7d 3c 2f 74 63 6c 3e 0a  x option}</tcl>.
14af0 3c 68 32 20 74 61 67 73 3d 22 66 74 73 34 20 70  <h2 tags="fts4 p
14b00 72 65 66 69 78 20 6f 70 74 69 6f 6e 22 3e 54 68  refix option">Th
14b10 65 20 70 72 65 66 69 78 3d 20 6f 70 74 69 6f 6e  e prefix= option
14b20 3c 2f 68 32 3e 0a 0a 3c 70 3e 0a 20 20 5e 54 68  </h2>..<p>.  ^Th
14b30 65 20 46 54 53 34 20 70 72 65 66 69 78 20 6f 70  e FTS4 prefix op
14b40 74 69 6f 6e 20 63 61 75 73 65 73 20 46 54 53 20  tion causes FTS 
14b50 74 6f 20 69 6e 64 65 78 20 74 65 72 6d 20 70 72  to index term pr
14b60 65 66 69 78 65 73 20 6f 66 20 73 70 65 63 69 66  efixes of specif
14b70 69 65 64 20 6c 65 6e 67 74 68 73 0a 20 20 69 6e  ied lengths.  in
14b80 20 74 68 65 20 73 61 6d 65 20 77 61 79 20 74 68   the same way th
14b90 61 74 20 69 74 20 61 6c 77 61 79 73 20 69 6e 64  at it always ind
14ba0 65 78 65 73 20 63 6f 6d 70 6c 65 74 65 20 74 65  exes complete te
14bb0 72 6d 73 2e 20 20 5e 54 68 65 20 70 72 65 66 69  rms.  ^The prefi
14bc0 78 20 6f 70 74 69 6f 6e 0a 20 20 6d 75 73 74 20  x option.  must 
14bd0 62 65 20 73 65 74 20 74 6f 20 61 20 63 6f 6d 6d  be set to a comm
14be0 61 20 73 65 70 61 72 61 74 65 64 20 6c 69 73 74  a separated list
14bf0 20 6f 66 20 70 6f 73 69 74 69 76 65 20 6e 6f 6e   of positive non
14c00 2d 7a 65 72 6f 20 69 6e 74 65 67 65 72 73 2e 20  -zero integers. 
14c10 0a 20 20 5e 46 6f 72 20 65 61 63 68 20 76 61 6c  .  ^For each val
14c20 75 65 20 4e 20 69 6e 20 74 68 65 20 6c 69 73 74  ue N in the list
14c30 2c 20 70 72 65 66 69 78 65 73 20 6f 66 20 6c 65  , prefixes of le
14c40 6e 67 74 68 20 4e 20 62 79 74 65 73 20 28 77 68  ngth N bytes (wh
14c50 65 6e 20 65 6e 63 6f 64 65 64 20 0a 20 20 75 73  en encoded .  us
14c60 69 6e 67 20 55 54 46 2d 38 29 20 61 72 65 20 69  ing UTF-8) are i
14c70 6e 64 65 78 65 64 2e 20 20 5e 46 54 53 34 20 75  ndexed.  ^FTS4 u
14c80 73 65 73 20 74 65 72 6d 20 70 72 65 66 69 78 20  ses term prefix 
14c90 69 6e 64 65 78 65 73 20 74 6f 20 73 70 65 65 64  indexes to speed
14ca0 20 75 70 0a 20 20 5b 70 72 65 66 69 78 20 71 75   up.  [prefix qu
14cb0 65 72 69 65 73 5d 2e 20 54 68 65 20 63 6f 73 74  eries]. The cost
14cc0 2c 20 6f 66 20 63 6f 75 72 73 65 2c 20 69 73 20  , of course, is 
14cd0 74 68 61 74 20 69 6e 64 65 78 69 6e 67 20 74 65  that indexing te
14ce0 72 6d 20 70 72 65 66 69 78 65 73 20 61 73 0a 20  rm prefixes as. 
14cf0 20 77 65 6c 6c 20 61 73 20 63 6f 6d 70 6c 65 74   well as complet
14d00 65 20 74 65 72 6d 73 20 69 6e 63 72 65 61 73 65  e terms increase
14d10 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  s the database s
14d20 69 7a 65 20 61 6e 64 20 73 6c 6f 77 73 20 64 6f  ize and slows do
14d30 77 6e 20 77 72 69 74 65 20 0a 20 20 6f 70 65 72  wn write .  oper
14d40 61 74 69 6f 6e 73 20 6f 6e 20 74 68 65 20 46 54  ations on the FT
14d50 53 34 20 74 61 62 6c 65 2e 0a 0a 3c 70 3e 0a 20  S4 table...<p>. 
14d60 20 50 72 65 66 69 78 20 69 6e 64 65 78 65 73 20   Prefix indexes 
14d70 6d 61 79 20 62 65 20 75 73 65 64 20 74 6f 20 6f  may be used to o
14d80 70 74 69 6d 69 7a 65 20 5b 70 72 65 66 69 78 20  ptimize [prefix 
14d90 71 75 65 72 69 65 73 5d 20 69 6e 20 74 77 6f 20  queries] in two 
14da0 63 61 73 65 73 2e 0a 20 20 49 66 20 74 68 65 20  cases..  If the 
14db0 71 75 65 72 79 20 69 73 20 66 6f 72 20 61 20 70  query is for a p
14dc0 72 65 66 69 78 20 6f 66 20 4e 20 62 79 74 65 73  refix of N bytes
14dd0 2c 20 74 68 65 6e 20 61 20 70 72 65 66 69 78 20  , then a prefix 
14de0 69 6e 64 65 78 20 63 72 65 61 74 65 64 0a 20 20  index created.  
14df0 77 69 74 68 20 22 70 72 65 66 69 78 3d 4e 22 20  with "prefix=N" 
14e00 70 72 6f 76 69 64 65 73 20 74 68 65 20 62 65 73  provides the bes
14e10 74 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20  t optimization. 
14e20 4f 72 2c 20 69 66 20 6e 6f 20 22 70 72 65 66 69  Or, if no "prefi
14e30 78 3d 4e 22 0a 20 20 69 6e 64 65 78 20 69 73 20  x=N".  index is 
14e40 61 76 61 69 6c 61 62 6c 65 2c 20 61 20 22 70 72  available, a "pr
14e50 65 66 69 78 3d 4e 2b 31 22 20 69 6e 64 65 78 20  efix=N+1" index 
14e60 6d 61 79 20 62 65 20 75 73 65 64 20 69 6e 73 74  may be used inst
14e70 65 61 64 2e 20 0a 20 20 55 73 69 6e 67 20 61 20  ead. .  Using a 
14e80 22 70 72 65 66 69 78 3d 4e 2b 31 22 20 69 6e 64  "prefix=N+1" ind
14e90 65 78 20 69 73 20 6c 65 73 73 0a 20 20 65 66 66  ex is less.  eff
14ea0 69 63 69 65 6e 74 20 74 68 61 6e 20 61 20 22 70  icient than a "p
14eb0 72 65 66 69 78 3d 4e 22 20 69 6e 64 65 78 2c 20  refix=N" index, 
14ec0 62 75 74 20 69 73 20 62 65 74 74 65 72 20 74 68  but is better th
14ed0 61 6e 20 6e 6f 20 70 72 65 66 69 78 20 69 6e 64  an no prefix ind
14ee0 65 78 20 61 74 20 61 6c 6c 2e 0a 0a 3c 63 6f 64  ex at all...<cod
14ef0 65 62 6c 6f 63 6b 3e 0a 20 20 3c 69 3e 2d 2d 20  eblock>.  <i>-- 
14f00 43 72 65 61 74 65 20 61 6e 20 46 54 53 34 20 74  Create an FTS4 t
14f10 61 62 6c 65 20 77 69 74 68 20 69 6e 64 65 78 65  able with indexe
14f20 73 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20 32 20  s to optimize 2 
14f30 61 6e 64 20 34 20 62 79 74 65 20 70 72 65 66 69  and 4 byte prefi
14f40 78 20 71 75 65 72 69 65 73 2e 3c 2f 69 3e 0a 20  x queries.</i>. 
14f50 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20   CREATE VIRTUAL 
14f60 54 41 42 4c 45 20 74 31 20 55 53 49 4e 47 20 66  TABLE t1 USING f
14f70 74 73 34 28 63 31 2c 20 63 32 2c 20 70 72 65 66  ts4(c1, c2, pref
14f80 69 78 3d 22 32 2c 34 22 29 3b 0a 0a 20 20 3c 69  ix="2,4");..  <i
14f90 3e 2d 2d 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  >-- The followin
14fa0 67 20 74 77 6f 20 71 75 65 72 69 65 73 20 61 72  g two queries ar
14fb0 65 20 62 6f 74 68 20 6f 70 74 69 6d 69 7a 65 64  e both optimized
14fc0 20 75 73 69 6e 67 20 74 68 65 20 70 72 65 66 69   using the prefi
14fd0 78 20 69 6e 64 65 78 65 73 2e 3c 2f 69 3e 0a 20  x indexes.</i>. 
14fe0 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
14ff0 31 20 57 48 45 52 45 20 74 31 20 4d 41 54 43 48  1 WHERE t1 MATCH
15000 20 27 61 62 2a 27 3b 0a 20 20 53 45 4c 45 43 54   'ab*';.  SELECT
15010 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   * FROM t1 WHERE
15020 20 74 31 20 4d 41 54 43 48 20 27 61 62 63 64 2a   t1 MATCH 'abcd*
15030 27 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 54 68 65 20  ';..  <i>-- The 
15040 66 6f 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 71 75  following two qu
15050 65 72 69 65 73 20 61 72 65 20 62 6f 74 68 20 70  eries are both p
15060 61 72 74 69 61 6c 6c 79 20 6f 70 74 69 6d 69 7a  artially optimiz
15070 65 64 20 75 73 69 6e 67 20 74 68 65 20 70 72 65  ed using the pre
15080 66 69 78 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20  fix</i>.  <i>-- 
15090 69 6e 64 65 78 65 73 2e 20 54 68 65 20 6f 70 74  indexes. The opt
150a0 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 6e 6f 74  imization is not
150b0 20 61 73 20 70 72 6f 6e 6f 75 6e 63 65 64 20 61   as pronounced a
150c0 73 20 69 74 20 69 73 20 66 6f 72 20 74 68 65 20  s it is for the 
150d0 71 75 65 72 69 65 73 3c 2f 69 3e 0a 20 20 3c 69  queries</i>.  <i
150e0 3e 2d 2d 20 61 62 6f 76 65 2c 20 62 75 74 20 73  >-- above, but s
150f0 74 69 6c 6c 20 61 6e 20 69 6d 70 72 6f 76 65 6d  till an improvem
15100 65 6e 74 20 6f 76 65 72 20 6e 6f 20 70 72 65 66  ent over no pref
15110 69 78 20 69 6e 64 65 78 65 73 20 61 74 20 61 6c  ix indexes at al
15120 6c 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20  l.</i>.  SELECT 
15130 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  * FROM t1 WHERE 
15140 74 31 20 4d 41 54 43 48 20 27 61 2a 27 3b 0a 20  t1 MATCH 'a*';. 
15150 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
15160 31 20 57 48 45 52 45 20 74 31 20 4d 41 54 43 48  1 WHERE t1 MATCH
15170 20 27 61 62 63 2a 27 3b 0a 3c 2f 63 6f 64 65 62   'abc*';.</codeb
15180 6c 6f 63 6b 3e 0a 0a 3c 74 63 6c 3e 68 64 5f 66  lock>..<tcl>hd_f
15190 72 61 67 6d 65 6e 74 20 2a 63 6d 64 73 20 7b 46  ragment *cmds {F
151a0 54 53 34 20 63 6f 6d 6d 61 6e 64 73 7d 3c 2f 74  TS4 commands}</t
151b0 63 6c 3e 0a 3c 68 31 20 69 64 3d 63 6f 6d 6d 61  cl>.<h1 id=comma
151c0 6e 64 73 20 74 61 67 73 3d 22 63 6f 6d 6d 61 6e  nds tags="comman
151d0 64 73 22 3e 53 70 65 63 69 61 6c 20 43 6f 6d 6d  ds">Special Comm
151e0 61 6e 64 73 20 46 6f 72 20 46 54 53 33 20 61 6e  ands For FTS3 an
151f0 64 20 46 54 53 34 3c 2f 68 31 3e 0a 0a 3c 70 3e  d FTS4</h1>..<p>
15200 0a 20 20 53 70 65 63 69 61 6c 20 49 4e 53 45 52  .  Special INSER
15210 54 20 6f 70 65 72 61 74 65 73 20 63 61 6e 20 62  T operates can b
15220 65 20 75 73 65 64 20 74 6f 20 69 73 73 75 65 20  e used to issue 
15230 63 6f 6d 6d 61 6e 64 73 20 74 6f 20 46 54 53 33  commands to FTS3
15240 20 61 6e 64 20 46 54 53 34 20 74 61 62 6c 65 73   and FTS4 tables
15250 2e 0a 20 20 45 76 65 72 79 20 46 54 53 33 20 61  ..  Every FTS3 a
15260 6e 64 20 46 54 53 34 20 68 61 73 20 61 20 68 69  nd FTS4 has a hi
15270 64 64 65 6e 2c 20 72 65 61 64 2d 6f 6e 6c 79 20  dden, read-only 
15280 63 6f 6c 75 6d 6e 20 77 68 69 63 68 20 69 73 20  column which is 
15290 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 61 73  the same name as
152a0 0a 20 20 74 68 65 20 74 61 62 6c 65 20 69 74 73  .  the table its
152b0 65 6c 66 2e 20 20 49 4e 53 45 52 54 73 20 69 6e  elf.  INSERTs in
152c0 74 6f 20 74 68 69 73 20 68 69 64 64 65 6e 20 63  to this hidden c
152d0 6f 6c 75 6d 6e 20 61 72 65 20 69 6e 74 65 72 70  olumn are interp
152e0 72 65 74 65 64 20 61 73 20 63 6f 6d 6d 61 6e 64  reted as command
152f0 73 0a 20 20 74 6f 20 74 68 65 20 46 54 53 33 2f  s.  to the FTS3/
15300 34 20 74 61 62 6c 65 2e 20 20 46 6f 72 20 61 20  4 table.  For a 
15310 74 61 62 6c 65 20 77 69 74 68 20 74 68 65 20 6e  table with the n
15320 61 6d 65 20 22 78 79 7a 22 20 74 68 65 20 66 6f  ame "xyz" the fo
15330 6c 6c 6f 77 69 6e 67 20 63 6f 6d 6d 61 6e 64 73  llowing commands
15340 0a 20 20 61 72 65 20 73 75 70 70 6f 72 74 65 64  .  are supported
15350 3a 0a 0a 3c 75 6c 3e 0a 3c 6c 69 3e 3c 70 3e 49  :..<ul>.<li><p>I
15360 4e 53 45 52 54 20 49 4e 54 4f 20 78 79 7a 28 78  NSERT INTO xyz(x
15370 79 7a 29 20 56 41 4c 55 45 53 28 27 6f 70 74 69  yz) VALUES('opti
15380 6d 69 7a 65 27 29 3b 3c 2f 70 3e 0a 3c 6c 69 3e  mize');</p>.<li>
15390 3c 70 3e 49 4e 53 45 52 54 20 49 4e 54 4f 20 78  <p>INSERT INTO x
153a0 79 7a 28 78 79 7a 29 20 56 41 4c 55 45 53 28 27  yz(xyz) VALUES('
153b0 72 65 62 75 69 6c 64 27 29 3b 3c 2f 70 3e 0a 3c  rebuild');</p>.<
153c0 6c 69 3e 3c 70 3e 49 4e 53 45 52 54 20 49 4e 54  li><p>INSERT INT
153d0 4f 20 78 79 7a 28 78 79 7a 29 20 56 41 4c 55 45  O xyz(xyz) VALUE
153e0 53 28 27 69 6e 74 65 67 72 69 74 79 2d 63 68 65  S('integrity-che
153f0 63 6b 27 29 3b 3c 2f 70 3e 0a 3c 6c 69 3e 3c 70  ck');</p>.<li><p
15400 3e 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 79 7a  >INSERT INTO xyz
15410 28 78 79 7a 29 20 56 41 4c 55 45 53 28 27 6d 65  (xyz) VALUES('me
15420 72 67 65 3d 58 2c 59 27 29 3b 3c 2f 70 3e 0a 3c  rge=X,Y');</p>.<
15430 6c 69 3e 3c 70 3e 49 4e 53 45 52 54 20 49 4e 54  li><p>INSERT INT
15440 4f 20 78 79 7a 28 78 79 7a 29 20 56 41 4c 55 45  O xyz(xyz) VALUE
15450 53 28 27 61 75 74 6f 6d 65 72 67 65 3d 4e 27 29  S('automerge=N')
15460 3b 3c 2f 70 3e 0a 3c 2f 75 6c 3e 0a 0a 3c 74 63  ;</p>.</ul>..<tc
15470 6c 3e 68 64 5f 66 72 61 67 6d 65 6e 74 20 2a 66  l>hd_fragment *f
15480 74 73 34 6f 70 74 63 6d 64 20 7b 46 54 53 34 20  ts4optcmd {FTS4 
15490 22 6f 70 74 69 6d 69 7a 65 22 20 63 6f 6d 6d 61  "optimize" comma
154a0 6e 64 7d 20 5c 0a 20 20 20 20 20 20 20 20 20 20  nd} \.          
154b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
154c0 20 20 20 7b 22 6f 70 74 69 6d 69 7a 65 22 20 63     {"optimize" c
154d0 6f 6d 6d 61 6e 64 7d 3c 2f 74 63 6c 3e 0a 3c 68  ommand}</tcl>.<h
154e0 32 20 69 64 3d 6f 70 74 69 6d 69 7a 65 3e 54 68  2 id=optimize>Th
154f0 65 20 22 6f 70 74 69 6d 69 7a 65 22 20 63 6f 6d  e "optimize" com
15500 6d 61 6e 64 3c 2f 68 32 3e 0a 0a 3c 70 3e 0a 20  mand</h2>..<p>. 
15510 20 54 68 65 20 22 6f 70 74 69 6d 69 7a 65 22 20   The "optimize" 
15520 63 6f 6d 6d 61 6e 64 20 63 61 75 73 65 73 20 46  command causes F
15530 54 53 33 2f 34 20 74 6f 20 6d 65 72 67 65 20 74  TS3/4 to merge t
15540 6f 67 65 74 68 65 72 20 61 6c 6c 20 6f 66 20 69  ogether all of i
15550 74 73 0a 20 20 69 6e 76 65 72 74 65 64 20 69 6e  ts.  inverted in
15560 64 65 78 20 62 2d 74 72 65 65 73 20 69 6e 74 6f  dex b-trees into
15570 20 6f 6e 65 20 6c 61 72 67 65 20 61 6e 64 20 63   one large and c
15580 6f 6d 70 6c 65 74 65 20 62 2d 74 72 65 65 2e 20  omplete b-tree. 
15590 20 44 6f 69 6e 67 0a 20 20 61 6e 20 6f 70 74 69   Doing.  an opti
155a0 6d 69 7a 65 20 77 69 6c 6c 20 6d 61 6b 65 20 73  mize will make s
155b0 75 62 73 65 71 75 65 6e 74 20 71 75 65 72 69 65  ubsequent querie
155c0 73 20 72 75 6e 20 66 61 73 74 65 72 20 73 69 6e  s run faster sin
155d0 63 65 20 74 68 65 72 65 20 61 72 65 0a 20 20 66  ce there are.  f
155e0 65 77 65 72 20 62 2d 74 72 65 65 73 20 74 6f 20  ewer b-trees to 
155f0 73 65 61 72 63 68 2c 20 61 6e 64 20 69 74 20 6d  search, and it m
15600 61 79 20 72 65 64 75 63 65 20 64 69 73 6b 20 75  ay reduce disk u
15610 73 61 67 65 20 62 79 20 63 6f 61 6c 65 73 63 69  sage by coalesci
15620 6e 67 0a 20 20 72 65 64 75 6e 64 61 6e 74 20 65  ng.  redundant e
15630 6e 74 72 69 65 73 2e 20 20 48 6f 77 65 76 65 72  ntries.  However
15640 2c 20 66 6f 72 20 61 20 6c 61 72 67 65 20 46 54  , for a large FT
15650 53 20 74 61 62 6c 65 2c 20 72 75 6e 6e 69 6e 67  S table, running
15660 20 6f 70 74 69 6d 69 7a 65 0a 20 20 63 61 6e 20   optimize.  can 
15670 62 65 20 61 73 20 65 78 70 65 6e 73 69 76 65 20  be as expensive 
15680 61 73 20 72 75 6e 6e 69 6e 67 20 5b 56 41 43 55  as running [VACU
15690 55 4d 5d 2e 20 20 54 68 65 20 6f 70 74 69 6d 69  UM].  The optimi
156a0 7a 65 20 63 6f 6d 6d 61 6e 64 0a 20 20 65 73 73  ze command.  ess
156b0 65 6e 74 69 61 6c 6c 79 20 68 61 73 20 74 6f 20  entially has to 
156c0 72 65 61 64 20 61 6e 64 20 77 72 69 74 65 20 74  read and write t
156d0 68 65 20 65 6e 74 69 72 65 20 46 54 53 20 74 61  he entire FTS ta
156e0 62 6c 65 2c 20 72 65 73 75 6c 74 69 6e 67 0a 20  ble, resulting. 
156f0 20 69 6e 20 61 20 6c 61 72 67 65 20 74 72 61 6e   in a large tran
15700 73 61 63 74 69 6f 6e 2e 0a 0a 3c 70 3e 0a 20 20  saction...<p>.  
15710 49 6e 20 62 61 74 63 68 2d 6d 6f 64 65 20 6f 70  In batch-mode op
15720 65 72 61 74 69 6f 6e 2c 20 77 68 65 72 65 20 61  eration, where a
15730 6e 20 46 54 53 20 74 61 62 6c 65 20 69 73 20 69  n FTS table is i
15740 6e 69 74 69 61 6c 6c 79 20 62 75 69 6c 74 20 75  nitially built u
15750 70 0a 20 20 75 73 69 6e 67 20 61 20 6c 61 72 67  p.  using a larg
15760 65 20 6e 75 6d 62 65 72 20 6f 66 20 49 4e 53 45  e number of INSE
15770 52 54 20 6f 70 65 72 61 74 69 6f 6e 73 2c 20 74  RT operations, t
15780 68 65 6e 20 71 75 65 72 69 65 64 20 72 65 70 65  hen queried repe
15790 61 74 65 64 6c 79 0a 20 20 77 69 74 68 6f 75 74  atedly.  without
157a0 20 66 75 72 74 68 65 72 20 63 68 61 6e 67 65 73   further changes
157b0 2c 20 69 74 20 69 73 20 6f 66 74 65 6e 20 61 20  , it is often a 
157c0 67 6f 6f 64 20 69 64 65 61 0a 20 20 74 6f 20 72  good idea.  to r
157d0 75 6e 20 22 6f 70 74 69 6d 69 7a 65 22 20 61 66  un "optimize" af
157e0 74 65 72 20 74 68 65 20 6c 61 73 74 20 49 4e 53  ter the last INS
157f0 45 52 54 20 61 6e 64 20 62 65 66 6f 72 65 20 74  ERT and before t
15800 68 65 20 66 69 72 73 74 20 71 75 65 72 79 2e 0a  he first query..
15810 0a 3c 74 63 6c 3e 68 64 5f 66 72 61 67 6d 65 6e  .<tcl>hd_fragmen
15820 74 20 2a 66 74 73 34 72 65 62 75 69 64 63 6d 64  t *fts4rebuidcmd
15830 20 7b 46 54 53 34 20 22 72 65 62 75 69 6c 64 22   {FTS4 "rebuild"
15840 20 63 6f 6d 6d 61 6e 64 7d 20 5c 0a 20 20 20 20   command} \.    
15850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15860 20 20 20 20 20 20 20 20 20 20 20 20 7b 22 72 65              {"re
15870 62 75 69 6c 64 22 20 63 6f 6d 6d 61 6e 64 7d 3c  build" command}<
15880 2f 74 63 6c 3e 0a 3c 68 32 20 69 64 3d 72 65 62  /tcl>.<h2 id=reb
15890 75 69 6c 64 3e 54 68 65 20 22 72 65 62 75 69 6c  uild>The "rebuil
158a0 64 22 20 63 6f 6d 6d 61 6e 64 3c 2f 68 32 3e 0a  d" command</h2>.
158b0 0a 3c 70 3e 0a 20 20 54 68 65 20 22 72 65 62 75  .<p>.  The "rebu
158c0 69 6c 64 22 20 63 6f 6d 6d 61 6e 64 20 63 61 75  ild" command cau
158d0 73 65 73 20 53 51 4c 69 74 65 20 74 6f 20 64 69  ses SQLite to di
158e0 73 63 61 72 64 20 74 68 65 20 65 6e 74 69 72 65  scard the entire
158f0 20 46 54 53 33 2f 34 0a 20 20 74 61 62 6c 65 20   FTS3/4.  table 
15900 61 6e 64 20 74 68 65 6e 20 72 65 62 75 69 6c 64  and then rebuild
15910 20 69 74 20 61 67 61 69 6e 20 66 72 6f 6d 20 6f   it again from o
15920 72 69 67 69 6e 61 6c 20 74 65 78 74 2e 20 20 54  riginal text.  T
15930 68 65 20 63 6f 6e 63 65 70 74 0a 20 20 69 73 20  he concept.  is 
15940 73 69 6d 69 6c 61 72 20 74 6f 20 5b 52 45 49 4e  similar to [REIN
15950 44 45 58 5d 2c 20 6f 6e 6c 79 20 74 68 61 74 20  DEX], only that 
15960 69 74 20 61 70 70 6c 69 65 73 20 74 6f 20 61 6e  it applies to an
15970 0a 20 20 46 54 53 33 2f 34 20 74 61 62 6c 65 20  .  FTS3/4 table 
15980 69 6e 73 74 65 61 64 20 6f 66 20 61 6e 20 6f 72  instead of an or
15990 64 69 6e 61 72 79 20 69 6e 64 65 78 2e 0a 0a 3c  dinary index...<
159a0 70 3e 0a 20 20 54 68 65 20 22 72 65 62 75 69 6c  p>.  The "rebuil
159b0 64 22 20 63 6f 6d 6d 61 6e 64 20 73 68 6f 75 6c  d" command shoul
159c0 64 20 62 65 20 72 75 6e 20 77 68 65 6e 65 76 65  d be run wheneve
159d0 72 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  r the implementa
159e0 74 69 6f 6e 0a 20 20 6f 66 20 61 20 63 75 73 74  tion.  of a cust
159f0 6f 6d 20 74 6f 6b 65 6e 69 7a 65 72 20 63 68 61  om tokenizer cha
15a00 6e 67 65 73 2c 20 73 6f 20 74 68 61 74 20 61 6c  nges, so that al
15a10 6c 20 63 6f 6e 74 65 6e 74 20 63 61 6e 20 62 65  l content can be
15a20 20 72 65 74 6f 6b 65 6e 69 7a 65 64 2e 0a 20 20   retokenized..  
15a30 54 68 65 20 22 72 65 62 75 69 6c 64 22 20 63 6f  The "rebuild" co
15a40 6d 6d 61 6e 64 20 69 73 20 61 6c 73 6f 20 75 73  mmand is also us
15a50 65 66 75 6c 20 77 68 65 6e 20 75 73 69 6e 67 20  eful when using 
15a60 74 68 65 0a 20 20 5b 46 54 53 34 20 63 6f 6e 74  the.  [FTS4 cont
15a70 65 6e 74 20 6f 70 74 69 6f 6e 5d 20 61 66 74 65  ent option] afte
15a80 72 20 63 68 61 6e 67 65 73 20 68 61 76 65 20 62  r changes have b
15a90 65 65 6e 20 6d 61 64 65 20 74 6f 20 74 68 65 20  een made to the 
15aa0 6f 72 69 67 69 6e 61 6c 0a 20 20 63 6f 6e 74 65  original.  conte
15ab0 6e 74 20 74 61 62 6c 65 2e 0a 0a 3c 74 63 6c 3e  nt table...<tcl>
15ac0 68 64 5f 66 72 61 67 6d 65 6e 74 20 2a 66 74 73  hd_fragment *fts
15ad0 34 69 63 6b 63 6d 64 20 7b 46 54 53 34 20 22 69  4ickcmd {FTS4 "i
15ae0 6e 74 65 67 72 69 74 79 2d 63 68 65 63 6b 22 20  ntegrity-check" 
15af0 63 6f 6d 6d 61 6e 64 7d 3c 2f 74 63 6c 3e 0a 3c  command}</tcl>.<
15b00 68 32 20 69 64 3d 69 6e 74 65 67 63 68 65 63 6b  h2 id=integcheck
15b10 3e 54 68 65 20 22 69 6e 74 65 67 72 69 74 79 2d  >The "integrity-
15b20 63 68 65 63 6b 22 20 63 6f 6d 6d 61 6e 64 3c 2f  check" command</
15b30 68 32 3e 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 22  h2>..<p>.  The "
15b40 69 6e 74 65 67 72 69 74 79 2d 63 68 65 63 6b 22  integrity-check"
15b50 20 63 6f 6d 6d 61 6e 64 20 63 61 75 73 65 73 20   command causes 
15b60 53 51 4c 69 74 65 20 74 6f 20 72 65 61 64 20 61  SQLite to read a
15b70 6e 64 20 76 65 72 69 66 79 0a 20 20 74 68 65 20  nd verify.  the 
15b80 61 63 63 75 72 61 63 79 20 6f 66 20 61 6c 6c 20  accuracy of all 
15b90 69 6e 76 65 72 74 65 64 20 69 6e 64 69 63 65 73  inverted indices
15ba0 20 69 6e 20 61 6e 20 46 54 53 33 2f 34 20 74 61   in an FTS3/4 ta
15bb0 62 6c 65 20 62 79 20 63 6f 6d 70 61 72 69 6e 67  ble by comparing
15bc0 0a 20 20 74 68 6f 73 65 20 69 6e 76 65 72 74 65  .  those inverte
15bd0 64 20 69 6e 64 69 63 65 73 20 61 67 61 69 6e 73  d indices agains
15be0 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 63  t the original c
15bf0 6f 6e 74 65 6e 74 2e 20 54 68 65 20 0a 20 20 22  ontent. The .  "
15c00 69 6e 74 65 67 72 69 74 79 2d 63 68 65 63 6b 22  integrity-check"
15c10 20 63 6f 6d 6d 61 6e 64 20 73 69 6c 65 6e 74 6c   command silentl
15c20 79 20 73 75 63 63 65 65 64 73 20 69 66 20 74 68  y succeeds if th
15c30 65 20 69 6e 76 65 72 74 65 64 0a 20 20 69 6e 64  e inverted.  ind
15c40 69 63 65 73 20 61 72 65 20 61 6c 6c 20 6f 6b 2c  ices are all ok,
15c50 20 62 75 74 20 77 69 6c 6c 20 66 61 69 6c 20 77   but will fail w
15c60 69 74 68 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f  ith an SQLITE_CO
15c70 52 52 55 50 54 20 65 72 72 6f 72 0a 20 20 69 66  RRUPT error.  if
15c80 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73 20 61 72   any problems ar
15c90 65 20 66 6f 75 6e 64 2e 0a 0a 3c 70 3e 0a 20 20  e found...<p>.  
15ca0 54 68 65 20 22 69 6e 74 65 67 72 69 74 79 2d 63  The "integrity-c
15cb0 68 65 63 6b 22 20 63 6f 6d 6d 61 6e 64 20 69 73  heck" command is
15cc0 20 73 69 6d 69 6c 61 72 20 69 6e 20 63 6f 6e 63   similar in conc
15cd0 65 70 74 20 74 6f 0a 20 5b 50 52 41 47 4d 41 20  ept to. [PRAGMA 
15ce0 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 5d  integrity_check]
15cf0 2e 20 20 49 6e 20 61 20 77 6f 72 6b 69 6e 67 20  .  In a working 
15d00 73 79 73 74 65 6d 2c 20 74 68 65 20 22 69 6e 74  system, the "int
15d10 65 67 72 69 74 79 2d 63 6f 6d 6d 61 6e 64 22 0a  egrity-command".
15d20 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62   should always b
15d30 65 20 73 75 63 63 65 73 73 66 75 6c 2e 20 20 50  e successful.  P
15d40 6f 73 73 69 62 6c 65 20 63 61 75 73 65 73 20 6f  ossible causes o
15d50 66 20 69 6e 74 65 67 72 69 74 79 2d 63 68 65 63  f integrity-chec
15d60 6b 0a 20 66 61 69 6c 75 72 65 73 20 69 6e 63 6c  k. failures incl
15d70 75 64 65 3a 0a 20 20 3c 75 6c 3e 0a 20 20 3c 6c  ude:.  <ul>.  <l
15d80 69 3e 20 54 68 65 20 61 70 70 6c 69 63 61 74 69  i> The applicati
15d90 6f 6e 20 68 61 73 20 6d 61 64 65 20 63 68 61 6e  on has made chan
15da0 67 65 73 20 74 6f 20 74 68 65 20 5b 46 54 53 20  ges to the [FTS 
15db0 73 68 61 64 6f 77 20 74 61 62 6c 65 73 5d 0a 20  shadow tables]. 
15dc0 20 20 20 20 20 20 64 69 72 65 63 74 6c 79 2c 20        directly, 
15dd0 77 69 74 68 6f 75 74 20 75 73 69 6e 67 20 74 68  without using th
15de0 65 20 46 54 53 33 2f 34 20 76 69 72 74 75 61 6c  e FTS3/4 virtual
15df0 20 74 61 62 6c 65 2c 20 63 61 75 73 69 6e 67 0a   table, causing.
15e00 20 20 20 20 20 20 20 74 68 65 20 73 68 61 64 6f         the shado
15e10 77 20 74 61 62 6c 65 73 20 74 6f 20 62 65 63 6f  w tables to beco
15e20 6d 65 20 6f 75 74 20 6f 66 20 73 79 6e 63 20 77  me out of sync w
15e30 69 74 68 20 65 61 63 68 20 6f 74 68 65 72 2e 0a  ith each other..
15e40 20 20 3c 6c 69 3e 20 55 73 69 6e 67 20 74 68 65    <li> Using the
15e50 20 5b 46 54 53 34 20 63 6f 6e 74 65 6e 74 20 6f   [FTS4 content o
15e60 70 74 69 6f 6e 5d 20 61 6e 64 20 66 61 69 6c 69  ption] and faili
15e70 6e 67 20 74 6f 20 6d 61 6e 75 61 6c 6c 79 20 6b  ng to manually k
15e80 65 65 70 0a 20 20 20 20 20 20 20 74 68 65 20 63  eep.       the c
15e90 6f 6e 74 65 6e 74 20 69 6e 20 73 79 6e 63 20 77  ontent in sync w
15ea0 69 74 68 20 74 68 65 20 46 54 53 34 20 69 6e 76  ith the FTS4 inv
15eb0 65 72 74 65 64 20 69 6e 64 69 63 65 73 2e 0a 20  erted indices.. 
15ec0 20 3c 6c 69 3e 20 42 75 67 73 20 69 6e 20 74 68   <li> Bugs in th
15ed0 65 20 46 54 53 33 2f 34 20 76 69 72 74 75 61 6c  e FTS3/4 virtual
15ee0 20 74 61 62 6c 65 2e 20 20 28 54 68 65 20 22 69   table.  (The "i
15ef0 6e 74 65 67 72 69 74 79 2d 63 68 65 63 6b 22 0a  ntegrity-check".
15f00 20 20 20 20 20 20 20 63 6f 6d 6d 61 6e 64 20 77         command w
15f10 61 73 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 63  as original conc
15f20 65 69 76 65 64 20 61 73 20 70 61 72 74 20 6f 66  eived as part of
15f30 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65 0a   the test suite.
15f40 20 20 20 20 20 20 20 66 6f 72 20 46 54 53 33 2f         for FTS3/
15f50 34 2e 29 0a 20 20 3c 6c 69 3e 20 43 6f 72 72 75  4.).  <li> Corru
15f60 70 74 69 6f 6e 20 74 6f 20 74 68 65 20 75 6e 64  ption to the und
15f70 65 72 6c 79 69 6e 67 20 53 51 4c 69 74 65 20 64  erlying SQLite d
15f80 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 28  atabase file.  (
15f90 53 65 65 0a 20 20 20 20 20 20 20 64 6f 63 75 6d  See.       docum
15fa0 65 6e 74 61 74 69 6f 6e 20 6f 6e 20 5b 68 6f 77  entation on [how
15fb0 20 74 6f 20 63 6f 72 72 75 70 74 5d 20 61 6e 64   to corrupt] and
15fc0 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65   SQLite database
15fd0 20 66 6f 72 0a 20 20 20 20 20 20 20 61 64 64 69   for.       addi
15fe0 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
15ff0 6f 6e 2e 29 0a 20 20 3c 2f 75 6c 3e 0a 0a 3c 74  on.).  </ul>..<t
16000 63 6c 3e 68 64 5f 66 72 61 67 6d 65 6e 74 20 2a  cl>hd_fragment *
16010 66 74 73 34 6d 65 72 67 65 63 6d 64 20 7b 46 54  fts4mergecmd {FT
16020 53 34 20 22 6d 65 72 67 65 22 20 63 6f 6d 6d 61  S4 "merge" comma
16030 6e 64 7d 20 7b 22 6d 65 72 67 65 22 20 63 6f 6d  nd} {"merge" com
16040 6d 61 6e 64 7d 3c 2f 74 63 6c 3e 0a 3c 68 32 20  mand}</tcl>.<h2 
16050 69 64 3d 22 6d 65 72 67 65 63 6d 64 22 3e 54 68  id="mergecmd">Th
16060 65 20 22 6d 65 72 67 65 3d 58 2c 59 22 20 63 6f  e "merge=X,Y" co
16070 6d 6d 61 6e 64 3c 2f 68 32 3e 0a 0a 3c 70 3e 0a  mmand</h2>..<p>.
16080 20 20 54 68 65 20 22 6d 65 72 67 65 3d 58 2c 59    The "merge=X,Y
16090 22 20 63 6f 6d 6d 61 6e 64 20 28 77 68 65 72 65  " command (where
160a0 20 58 20 61 6e 64 20 59 20 61 72 65 20 69 6e 74   X and Y are int
160b0 65 67 65 72 73 29 20 63 61 75 73 65 73 20 53 51  egers) causes SQ
160c0 4c 69 74 65 0a 20 20 74 6f 20 64 6f 20 61 20 6c  Lite.  to do a l
160d0 69 6d 69 74 65 64 20 61 6d 6f 75 6e 74 20 6f 66  imited amount of
160e0 20 77 6f 72 6b 20 74 6f 77 61 72 64 20 6d 65 72   work toward mer
160f0 67 69 6e 67 20 74 68 65 20 76 61 72 69 6f 75 73  ging the various
16100 20 69 6e 76 65 72 74 65 64 0a 20 20 69 6e 64 65   inverted.  inde
16110 78 20 62 2d 74 72 65 65 73 20 6f 66 20 61 6e 20  x b-trees of an 
16120 46 54 53 33 2f 34 20 74 61 62 6c 65 20 74 6f 67  FTS3/4 table tog
16130 65 74 68 65 72 20 69 6e 74 6f 20 6f 6e 65 20 6c  ether into one l
16140 61 72 67 65 20 62 2d 74 72 65 65 2e 0a 20 20 54  arge b-tree..  T
16150 68 65 20 58 20 76 61 6c 75 65 20 69 73 20 74 68  he X value is th
16160 65 20 74 61 72 67 65 74 20 6e 75 6d 62 65 72 20  e target number 
16170 6f 66 20 22 62 6c 6f 63 6b 73 22 20 74 6f 20 62  of "blocks" to b
16180 65 20 6d 65 72 67 65 64 2c 20 61 6e 64 20 59 20  e merged, and Y 
16190 69 73 0a 20 20 74 68 65 20 6d 69 6e 69 6d 75 6d  is.  the minimum
161a0 20 6e 75 6d 62 65 72 20 6f 66 20 62 2d 74 72 65   number of b-tre
161b0 65 20 73 65 67 6d 65 6e 74 73 20 6f 6e 20 61 20  e segments on a 
161c0 6c 65 76 65 6c 20 72 65 71 75 69 72 65 64 20 62  level required b
161d0 65 66 6f 72 65 0a 20 20 6d 65 72 67 69 6e 67 20  efore.  merging 
161e0 77 69 6c 6c 20 62 65 20 61 70 70 6c 69 65 64 20  will be applied 
161f0 74 6f 20 74 68 61 74 20 6c 65 76 65 6c 2e 20 20  to that level.  
16200 54 68 65 20 76 61 6c 75 65 20 6f 66 20 59 20 73  The value of Y s
16210 68 6f 75 6c 64 0a 20 20 62 65 20 62 65 74 77 65  hould.  be betwe
16220 65 6e 20 32 20 61 6e 64 20 31 36 20 77 69 74 68  en 2 and 16 with
16230 20 61 20 72 65 63 6f 6d 6d 65 6e 64 65 64 20 76   a recommended v
16240 61 6c 75 65 20 6f 66 20 38 2e 20 20 54 68 65 20  alue of 8.  The 
16250 76 61 6c 75 65 20 6f 66 20 58 0a 20 20 63 61 6e  value of X.  can
16260 20 62 65 20 61 6e 79 20 70 6f 73 69 74 69 76 65   be any positive
16270 20 69 6e 74 65 67 65 72 20 62 75 74 20 76 61 6c   integer but val
16280 75 65 73 20 6f 6e 20 74 68 65 20 6f 72 64 65 72  ues on the order
16290 20 6f 66 20 31 30 30 20 74 6f 20 33 30 30 0a 20   of 100 to 300. 
162a0 20 61 72 65 20 72 65 63 6f 6d 6d 65 6e 64 65 64   are recommended
162b0 2e 0a 0a 3c 70 3e 0a 20 20 57 68 65 6e 20 61 6e  ...<p>.  When an
162c0 20 46 54 53 20 74 61 62 6c 65 20 61 63 63 75 6d   FTS table accum
162d0 75 6c 61 74 65 73 20 31 36 20 62 2d 74 72 65 65  ulates 16 b-tree
162e0 20 73 65 67 6d 65 6e 74 73 20 61 74 20 74 68 65   segments at the
162f0 20 73 61 6d 65 20 6c 65 76 65 6c 2c 0a 20 20 74   same level,.  t
16300 68 65 20 6e 65 78 74 20 49 4e 53 45 52 54 20 69  he next INSERT i
16310 6e 74 6f 20 74 68 61 74 20 74 61 62 6c 65 20 77  nto that table w
16320 69 6c 6c 20 63 61 75 73 65 20 61 6c 6c 20 31 36  ill cause all 16
16330 20 73 65 67 6d 65 6e 74 73 20 74 6f 20 62 65 0a   segments to be.
16340 20 20 6d 65 72 67 65 64 20 69 6e 74 6f 20 61 20    merged into a 
16350 73 69 6e 67 6c 65 20 62 2d 74 72 65 65 20 73 65  single b-tree se
16360 67 6d 65 6e 74 20 61 74 20 74 68 65 20 6e 65 78  gment at the nex
16370 74 20 68 69 67 68 65 72 20 6c 65 76 65 6c 2e 20  t higher level. 
16380 20 54 68 65 0a 20 20 65 66 66 65 63 74 20 6f 66   The.  effect of
16390 20 74 68 65 73 65 20 6c 65 76 65 6c 20 6d 65 72   these level mer
163a0 67 65 73 20 69 73 20 74 68 61 74 20 6d 6f 73 74  ges is that most
163b0 20 49 4e 53 45 52 54 73 20 69 6e 74 6f 20 61 6e   INSERTs into an
163c0 20 46 54 53 20 74 61 62 6c 65 0a 20 20 61 72 65   FTS table.  are
163d0 20 76 65 72 79 20 66 61 73 74 20 61 6e 64 20 74   very fast and t
163e0 61 6b 65 20 6d 69 6e 69 6d 61 6c 20 6d 65 6d 6f  ake minimal memo
163f0 72 79 2c 20 62 75 74 20 61 6e 20 6f 63 63 61 73  ry, but an occas
16400 69 6f 6e 61 6c 20 49 4e 53 45 52 54 20 69 73 0a  ional INSERT is.
16410 20 20 73 6c 6f 77 20 61 6e 64 20 67 65 6e 65 72    slow and gener
16420 61 74 65 73 20 61 20 6c 61 72 67 65 20 74 72 61  ates a large tra
16430 6e 73 61 63 74 69 6f 6e 20 62 65 63 61 75 73 65  nsaction because
16440 20 6f 66 20 74 68 65 20 6e 65 65 64 20 74 6f 0a   of the need to.
16450 20 20 64 6f 20 6d 65 72 67 69 6e 67 2e 20 54 68    do merging. Th
16460 69 73 20 72 65 73 75 6c 74 73 20 69 6e 20 22 73  is results in "s
16470 70 69 6b 79 22 20 70 65 72 66 6f 72 6d 61 6e 63  piky" performanc
16480 65 20 6f 66 20 49 4e 53 45 52 54 73 2e 0a 0a 3c  e of INSERTs...<
16490 70 3e 0a 20 20 54 6f 20 61 76 6f 69 64 20 73 70  p>.  To avoid sp
164a0 69 6b 79 20 49 4e 53 45 52 54 20 70 65 72 66 6f  iky INSERT perfo
164b0 72 6d 61 6e 63 65 2c 20 61 6e 20 61 70 70 6c 69  rmance, an appli
164c0 63 61 74 69 6f 6e 20 63 61 6e 20 72 75 6e 20 74  cation can run t
164d0 68 65 0a 20 20 22 6d 65 72 67 65 3d 58 2c 59 22  he.  "merge=X,Y"
164e0 20 63 6f 6d 6d 61 6e 64 20 70 65 72 69 6f 64 69   command periodi
164f0 63 61 6c 6c 79 2c 20 70 6f 73 73 69 62 6c 79 20  cally, possibly 
16500 69 6e 20 61 6e 20 69 64 6c 65 20 74 68 72 65 61  in an idle threa
16510 64 20 6f 72 0a 20 20 69 64 6c 65 20 70 72 6f 63  d or.  idle proc
16520 65 73 73 2c 20 74 6f 20 65 6e 73 75 72 65 20 74  ess, to ensure t
16530 68 61 74 20 74 68 65 20 46 54 53 20 74 61 62 6c  hat the FTS tabl
16540 65 20 6e 65 76 65 72 20 61 63 63 75 6d 75 6c 61  e never accumula
16550 74 65 73 0a 20 20 74 6f 6f 20 6d 61 6e 79 20 62  tes.  too many b
16560 2d 74 72 65 65 20 73 65 67 6d 65 6e 74 73 20 61  -tree segments a
16570 74 20 74 68 65 20 73 61 6d 65 20 6c 65 76 65 6c  t the same level
16580 2e 20 20 49 4e 53 45 52 54 20 70 65 72 66 6f 72  .  INSERT perfor
16590 6d 61 6e 63 65 0a 20 20 73 70 69 6b 65 73 20 63  mance.  spikes c
165a0 61 6e 20 67 65 6e 65 72 61 6c 6c 79 20 62 65 20  an generally be 
165b0 61 76 6f 69 64 65 64 2c 20 61 6e 64 20 70 65 72  avoided, and per
165c0 66 6f 72 6d 61 6e 63 65 20 6f 66 20 46 54 53 33  formance of FTS3
165d0 2f 34 20 63 61 6e 20 62 65 0a 20 20 6d 61 78 69  /4 can be.  maxi
165e0 6d 69 7a 65 64 2c 20 62 79 20 72 75 6e 6e 69 6e  mized, by runnin
165f0 67 20 22 6d 65 72 67 65 3d 58 2c 59 22 20 61 66  g "merge=X,Y" af
16600 74 65 72 20 65 76 65 72 79 20 66 65 77 20 74 68  ter every few th
16610 6f 75 73 61 6e 64 0a 20 20 64 6f 63 75 6d 65 6e  ousand.  documen
16620 74 20 69 6e 73 65 72 74 73 2e 20 20 45 61 63 68  t inserts.  Each
16630 20 22 6d 65 72 67 65 3d 58 2c 59 22 20 63 6f 6d   "merge=X,Y" com
16640 6d 61 6e 64 20 77 69 6c 6c 20 72 75 6e 20 69 6e  mand will run in
16650 20 61 20 73 65 70 61 72 61 74 65 0a 20 20 74 72   a separate.  tr
16660 61 6e 73 61 63 74 69 6f 6e 20 28 75 6e 6c 65 73  ansaction (unles
16670 73 20 74 68 65 79 20 61 72 65 20 67 72 6f 75 70  s they are group
16680 65 64 20 74 6f 67 65 74 68 65 72 20 75 73 69 6e  ed together usin
16690 67 20 5b 42 45 47 49 4e 5d 2e 2e 2e 5b 43 4f 4d  g [BEGIN]...[COM
166a0 4d 49 54 5d 2c 0a 20 20 6f 66 20 63 6f 75 72 73  MIT],.  of cours
166b0 65 29 2e 20 20 54 68 65 20 74 72 61 6e 73 61 63  e).  The transac
166c0 74 69 6f 6e 73 20 63 61 6e 20 62 65 20 6b 65 70  tions can be kep
166d0 74 20 73 6d 61 6c 6c 20 62 79 20 63 68 6f 6f 73  t small by choos
166e0 69 6e 67 20 61 20 76 61 6c 75 65 0a 20 20 66 6f  ing a value.  fo
166f0 72 20 58 20 69 6e 20 74 68 65 20 72 61 6e 67 65  r X in the range
16700 20 6f 66 20 31 30 30 20 74 6f 20 33 30 30 2e 20   of 100 to 300. 
16710 20 54 68 65 20 69 64 6c 65 20 74 68 72 65 61 64   The idle thread
16720 20 74 68 61 74 20 69 73 20 72 75 6e 6e 69 6e 67   that is running
16730 0a 20 20 74 68 65 20 6d 65 72 67 65 20 63 6f 6d  .  the merge com
16740 6d 61 6e 64 73 20 63 61 6e 20 6b 6e 6f 77 20 77  mands can know w
16750 68 65 6e 20 69 74 20 69 73 20 64 6f 6e 65 20 62  hen it is done b
16760 79 20 63 68 65 63 6b 69 6e 67 20 74 68 65 20 64  y checking the d
16770 69 66 66 65 72 65 6e 63 65 0a 20 20 69 6e 20 5b  ifference.  in [
16780 73 71 6c 69 74 65 33 5f 74 6f 74 61 6c 5f 63 68  sqlite3_total_ch
16790 61 6e 67 65 73 28 29 5d 20 62 65 66 6f 72 65 20  anges()] before 
167a0 61 6e 64 20 61 66 74 65 72 20 65 61 63 68 20 22  and after each "
167b0 6d 65 72 67 65 3d 58 2c 59 22 0a 20 20 63 6f 6d  merge=X,Y".  com
167c0 6d 61 6e 64 20 61 6e 64 20 73 74 6f 70 70 69 6e  mand and stoppin
167d0 67 20 74 68 65 20 6c 6f 6f 70 20 77 68 65 6e 20  g the loop when 
167e0 74 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 64  the difference d
167f0 72 6f 70 73 20 62 65 6c 6f 77 20 74 77 6f 2e 0a  rops below two..
16800 0a 3c 74 63 6c 3e 68 64 5f 66 72 61 67 6d 65 6e  .<tcl>hd_fragmen
16810 74 20 2a 66 74 73 34 61 75 74 6f 6d 65 72 67 65  t *fts4automerge
16820 63 6d 64 20 7b 46 54 53 34 20 22 61 75 74 6f 6d  cmd {FTS4 "autom
16830 65 72 67 65 22 20 63 6f 6d 6d 61 6e 64 7d 20 5c  erge" command} \
16840 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16860 20 20 20 20 7b 22 61 75 74 6f 6d 65 72 67 65 22      {"automerge"
16870 20 63 6f 6d 6d 61 6e 64 7d 3c 2f 74 63 6c 3e 0a   command}</tcl>.
16880 3c 68 32 20 69 64 3d 61 75 74 6f 6d 65 72 67 65  <h2 id=automerge
16890 22 3e 54 68 65 20 22 61 75 74 6f 6d 65 72 67 65  ">The "automerge
168a0 3d 4e 22 20 63 6f 6d 6d 61 6e 64 3c 2f 68 32 3e  =N" command</h2>
168b0 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 22 61 75 74  ..<p>.  The "aut
168c0 6f 6d 65 72 67 65 3d 4e 22 20 63 6f 6d 6d 61 6e  omerge=N" comman
168d0 64 20 28 77 68 65 72 65 20 4e 20 69 73 20 61 6e  d (where N is an
168e0 20 69 6e 74 65 67 65 72 20 62 65 74 77 65 65 6e   integer between
168f0 20 30 20 61 6e 64 20 31 35 2c 0a 20 20 69 6e 63   0 and 15,.  inc
16900 6c 75 73 69 76 65 29 20 69 73 20 75 73 65 64 20  lusive) is used 
16910 74 6f 20 63 6f 6e 66 69 67 75 72 65 20 61 6e 20  to configure an 
16920 46 54 53 33 2f 34 20 74 61 62 6c 65 73 20 22 61  FTS3/4 tables "a
16930 75 74 6f 6d 65 72 67 65 22 20 70 61 72 61 6d 65  utomerge" parame
16940 74 65 72 2c 0a 20 20 77 68 69 63 68 20 63 6f 6e  ter,.  which con
16950 74 72 6f 6c 73 20 61 75 74 6f 6d 61 74 69 63 20  trols automatic 
16960 69 6e 63 72 65 6d 65 6e 74 61 6c 20 69 6e 76 65  incremental inve
16970 72 74 65 64 20 69 6e 64 65 78 20 6d 65 72 67 69  rted index mergi
16980 6e 67 2e 20 54 68 65 20 64 65 66 61 75 6c 74 20  ng. The default 
16990 0a 20 20 61 75 74 6f 6d 65 72 67 65 20 76 61 6c  .  automerge val
169a0 75 65 20 66 6f 72 20 6e 65 77 20 74 61 62 6c 65  ue for new table
169b0 73 20 69 73 20 30 2c 20 6d 65 61 6e 69 6e 67 20  s is 0, meaning 
169c0 74 68 61 74 20 61 75 74 6f 6d 61 74 69 63 20 69  that automatic i
169d0 6e 63 72 65 6d 65 6e 74 61 6c 20 0a 20 20 6d 65  ncremental .  me
169e0 72 67 69 6e 67 20 69 73 20 63 6f 6d 70 6c 65 74  rging is complet
169f0 65 6c 79 20 64 69 73 61 62 6c 65 64 2e 20 49 66  ely disabled. If
16a00 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
16a10 65 20 61 75 74 6f 6d 65 72 67 65 20 70 61 72 61  e automerge para
16a20 6d 65 74 65 72 0a 20 20 69 73 20 6d 6f 64 69 66  meter.  is modif
16a30 69 65 64 20 75 73 69 6e 67 20 74 68 65 20 22 61  ied using the "a
16a40 75 74 6f 6d 65 72 67 65 3d 4e 22 20 63 6f 6d 6d  utomerge=N" comm
16a50 61 6e 64 2c 20 74 68 65 20 6e 65 77 20 70 61 72  and, the new par
16a60 61 6d 65 74 65 72 20 76 61 6c 75 65 20 69 73 0a  ameter value is.
16a70 20 20 73 74 6f 72 65 64 20 70 65 72 73 69 73 74    stored persist
16a80 65 6e 74 6c 79 20 69 6e 20 74 68 65 20 64 61 74  ently in the dat
16a90 61 62 61 73 65 20 61 6e 64 20 69 73 20 75 73 65  abase and is use
16aa0 64 20 62 79 20 61 6c 6c 20 73 75 62 73 65 71 75  d by all subsequ
16ab0 65 6e 74 6c 79 0a 20 20 65 73 74 61 62 6c 69 73  ently.  establis
16ac0 68 65 64 20 64 61 74 61 62 61 73 65 20 63 6f 6e  hed database con
16ad0 6e 65 63 74 69 6f 6e 73 2e 0a 0a 3c 70 3e 0a 20  nections...<p>. 
16ae0 20 53 65 74 74 69 6e 67 20 74 68 65 20 61 75 74   Setting the aut
16af0 6f 6d 65 72 67 65 20 70 61 72 61 6d 65 74 65 72  omerge parameter
16b00 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76   to a non-zero v
16b10 61 6c 75 65 20 65 6e 61 62 6c 65 73 20 61 75 74  alue enables aut
16b20 6f 6d 61 74 69 63 0a 20 20 69 6e 63 72 65 6d 65  omatic.  increme
16b30 6e 74 61 6c 20 6d 65 72 67 69 6e 67 2e 20 54 68  ntal merging. Th
16b40 69 73 20 63 61 75 73 65 73 20 53 51 4c 69 74 65  is causes SQLite
16b50 20 74 6f 20 64 6f 20 61 20 73 6d 61 6c 6c 20 61   to do a small a
16b60 6d 6f 75 6e 74 20 6f 66 20 69 6e 76 65 72 74 65  mount of inverte
16b70 64 20 0a 20 20 69 6e 64 65 78 20 6d 65 72 67 69  d .  index mergi
16b80 6e 67 20 61 66 74 65 72 20 65 76 65 72 79 20 49  ng after every I
16b90 4e 53 45 52 54 20 6f 70 65 72 61 74 69 6f 6e 2e  NSERT operation.
16ba0 20 54 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 6d   The amount of m
16bb0 65 72 67 69 6e 67 20 0a 20 20 70 65 72 66 6f 72  erging .  perfor
16bc0 6d 65 64 20 69 73 20 64 65 73 69 67 6e 65 64 20  med is designed 
16bd0 73 6f 20 74 68 61 74 20 74 68 65 20 46 54 53 33  so that the FTS3
16be0 2f 34 20 74 61 62 6c 65 20 6e 65 76 65 72 20 72  /4 table never r
16bf0 65 61 63 68 65 73 20 61 20 70 6f 69 6e 74 20 0a  eaches a point .
16c00 20 20 77 68 65 72 65 20 69 74 20 68 61 73 20 31    where it has 1
16c10 36 20 73 65 67 6d 65 6e 74 73 20 61 74 20 74 68  6 segments at th
16c20 65 20 73 61 6d 65 20 6c 65 76 65 6c 20 61 6e 64  e same level and
16c30 20 68 65 6e 63 65 20 68 61 73 20 74 6f 20 64 6f   hence has to do
16c40 20 61 20 6c 61 72 67 65 20 0a 20 20 6d 65 72 67   a large .  merg
16c50 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f  e in order to co
16c60 6d 70 6c 65 74 65 20 61 6e 20 69 6e 73 65 72 74  mplete an insert
16c70 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
16c80 73 2c 20 61 75 74 6f 6d 61 74 69 63 20 0a 20 20  s, automatic .  
16c90 69 6e 63 72 65 6d 65 6e 74 61 6c 20 6d 65 72 67  incremental merg
16ca0 69 6e 67 20 69 73 20 64 65 73 69 67 6e 65 64 20  ing is designed 
16cb0 74 6f 20 70 72 65 76 65 6e 74 20 73 70 69 6b 79  to prevent spiky
16cc0 20 49 4e 53 45 52 54 20 70 65 72 66 6f 72 6d 61   INSERT performa
16cd0 6e 63 65 2e 0a 0a 3c 70 3e 0a 20 20 54 68 65 20  nce...<p>.  The 
16ce0 64 6f 77 6e 73 69 64 65 20 6f 66 20 61 75 74 6f  downside of auto
16cf0 6d 61 74 69 63 20 69 6e 63 72 65 6d 65 6e 74 61  matic incrementa
16d00 6c 20 6d 65 72 67 69 6e 67 20 69 73 20 74 68 61  l merging is tha
16d10 74 20 69 74 20 6d 61 6b 65 73 0a 20 20 65 76 65  t it makes.  eve
16d20 72 79 20 49 4e 53 45 52 54 2c 20 55 50 44 41 54  ry INSERT, UPDAT
16d30 45 2c 20 61 6e 64 20 44 45 4c 45 54 45 20 6f 70  E, and DELETE op
16d40 65 72 61 74 69 6f 6e 20 6f 6e 20 61 6e 20 46 54  eration on an FT
16d50 53 33 2f 34 20 74 61 62 6c 65 20 72 75 6e 0a 20  S3/4 table run. 
16d60 20 61 20 6c 69 74 74 6c 65 20 73 6c 6f 77 65 72   a little slower
16d70 2c 20 73 69 6e 63 65 20 65 78 74 72 61 20 74 69  , since extra ti
16d80 6d 65 20 6d 75 73 74 20 62 65 20 75 73 65 64 20  me must be used 
16d90 74 6f 20 64 6f 20 74 68 65 20 69 6e 63 72 65 6d  to do the increm
16da0 65 6e 74 61 6c 0a 20 20 6d 65 72 67 65 2e 20 20  ental.  merge.  
16db0 46 6f 72 20 6d 61 78 69 6d 75 6d 20 70 65 72 66  For maximum perf
16dc0 6f 72 6d 61 6e 63 65 2c 20 69 74 20 69 73 20 72  ormance, it is r
16dd0 65 63 6f 6d 6d 65 6e 64 65 64 20 74 68 61 74 20  ecommended that 
16de0 61 70 70 6c 69 63 61 74 69 6f 6e 73 0a 20 20 64  applications.  d
16df0 69 73 61 62 6c 65 20 61 75 74 6f 6d 61 74 69 63  isable automatic
16e00 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 6d 65 72   incremental mer
16e10 67 65 20 61 6e 64 20 69 6e 73 74 65 61 64 20 75  ge and instead u
16e20 73 65 20 74 68 65 20 0a 20 20 5b 22 6d 65 72 67  se the .  ["merg
16e30 65 22 20 63 6f 6d 6d 61 6e 64 5d 20 69 6e 20 61  e" command] in a
16e40 6e 20 69 64 6c 65 20 70 72 6f 63 65 73 73 20 74  n idle process t
16e50 6f 20 6b 65 65 70 20 74 68 65 20 69 6e 76 65 72  o keep the inver
16e60 74 65 64 20 69 6e 64 69 63 65 73 0a 20 20 77 65  ted indices.  we
16e70 6c 6c 20 6d 65 72 67 65 64 2e 20 20 42 75 74 20  ll merged.  But 
16e80 69 66 20 74 68 65 20 73 74 72 75 63 74 75 72 65  if the structure
16e90 20 6f 66 20 61 6e 20 61 70 70 6c 69 63 61 74 69   of an applicati
16ea0 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 65 61 73 69  on does not easi
16eb0 6c 79 0a 20 20 61 6c 6c 6f 77 20 66 6f 72 20 69  ly.  allow for i
16ec0 64 6c 65 20 70 72 6f 63 65 73 73 65 73 2c 20 74  dle processes, t
16ed0 68 65 20 75 73 65 20 6f 66 20 61 75 74 6f 6d 61  he use of automa
16ee0 74 69 63 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20  tic incremental 
16ef0 6d 65 72 67 65 20 69 73 0a 20 20 61 20 76 65 72  merge is.  a ver
16f00 79 20 72 65 61 73 6f 6e 61 62 6c 65 20 66 61 6c  y reasonable fal
16f10 6c 62 61 63 6b 20 73 6f 6c 75 74 69 6f 6e 2e 0a  lback solution..
16f20 0a 3c 70 3e 0a 20 20 54 68 65 20 61 63 74 75 61  .<p>.  The actua
16f30 6c 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 61  l value of the a
16f40 75 74 6f 6d 65 72 67 65 20 70 61 72 61 6d 65 74  utomerge paramet
16f50 65 72 20 64 65 74 65 72 6d 69 6e 65 73 20 74 68  er determines th
16f60 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 69 6e  e number of.  in
16f70 64 65 78 20 73 65 67 6d 65 6e 74 73 20 6d 65 72  dex segments mer
16f80 67 65 64 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73  ged simultaneous
16f90 6c 79 20 62 79 20 61 6e 20 61 75 74 6f 6d 61 74  ly by an automat
16fa0 69 63 20 69 6e 76 65 72 74 65 64 20 69 6e 64 65  ic inverted inde
16fb0 78 0a 20 20 6d 65 72 67 65 2e 20 49 66 20 74 68  x.  merge. If th
16fc0 65 20 76 61 6c 75 65 20 69 73 20 73 65 74 20 74  e value is set t
16fd0 6f 20 4e 2c 20 74 68 65 20 73 79 73 74 65 6d 20  o N, the system 
16fe0 77 61 69 74 73 20 75 6e 74 69 6c 20 74 68 65 72  waits until ther
16ff0 65 20 61 72 65 20 61 74 0a 20 20 6c 65 61 73 74  e are at.  least
17000 20 4e 20 73 65 67 6d 65 6e 74 73 20 6f 6e 20 61   N segments on a
17010 20 73 69 6e 67 6c 65 20 6c 65 76 65 6c 20 62 65   single level be
17020 66 6f 72 65 20 62 65 67 69 6e 6e 69 6e 67 20 74  fore beginning t
17030 6f 20 69 6e 63 72 65 6d 65 6e 74 61 6c 6c 79 0a  o incrementally.
17040 20 20 6d 65 72 67 65 20 74 68 65 6d 2e 20 53 65    merge them. Se
17050 74 74 69 6e 67 20 61 20 6c 6f 77 65 72 20 76 61  tting a lower va
17060 6c 75 65 20 6f 66 20 4e 20 63 61 75 73 65 73 20  lue of N causes 
17070 73 65 67 6d 65 6e 74 73 20 74 6f 20 62 65 20 6d  segments to be m
17080 65 72 67 65 64 20 6d 6f 72 65 0a 20 20 71 75 69  erged more.  qui
17090 63 6b 6c 79 2c 20 77 68 69 63 68 20 6d 61 79 20  ckly, which may 
170a0 73 70 65 65 64 20 75 70 20 66 75 6c 6c 2d 74 65  speed up full-te
170b0 78 74 20 71 75 65 72 69 65 73 20 61 6e 64 2c 20  xt queries and, 
170c0 69 66 20 74 68 65 20 77 6f 72 6b 6c 6f 61 64 20  if the workload 
170d0 0a 20 20 63 6f 6e 74 61 69 6e 73 20 55 50 44 41  .  contains UPDA
170e0 54 45 20 6f 72 20 44 45 4c 45 54 45 20 6f 70 65  TE or DELETE ope
170f0 72 61 74 69 6f 6e 73 20 61 73 20 77 65 6c 6c 20  rations as well 
17100 61 73 20 49 4e 53 45 52 54 73 2c 20 72 65 64 75  as INSERTs, redu
17110 63 65 20 74 68 65 20 73 70 61 63 65 0a 20 20 6f  ce the space.  o
17120 6e 20 64 69 73 6b 20 63 6f 6e 73 75 6d 65 64 20  n disk consumed 
17130 62 79 20 74 68 65 20 66 75 6c 6c 2d 74 65 78 74  by the full-text
17140 20 69 6e 64 65 78 2e 20 48 6f 77 65 76 65 72 2c   index. However,
17150 20 69 74 20 61 6c 73 6f 20 69 6e 63 72 65 61 73   it also increas
17160 65 73 20 74 68 65 0a 20 20 61 6d 6f 75 6e 74 20  es the.  amount 
17170 6f 66 20 64 61 74 61 20 77 72 69 74 74 65 6e 20  of data written 
17180 74 6f 20 64 69 73 6b 2e 0a 0a 3c 70 3e 0a 20 20  to disk...<p>.  
17190 46 6f 72 20 67 65 6e 65 72 61 6c 20 75 73 65 20  For general use 
171a0 69 6e 20 63 61 73 65 73 20 77 68 65 72 65 20 74  in cases where t
171b0 68 65 20 77 6f 72 6b 6c 6f 61 64 20 63 6f 6e 74  he workload cont
171c0 61 69 6e 73 20 66 65 77 20 55 50 44 41 54 45 20  ains few UPDATE 
171d0 6f 72 20 44 45 4c 45 54 45 0a 20 20 6f 70 65 72  or DELETE.  oper
171e0 61 74 69 6f 6e 73 2c 20 61 20 67 6f 6f 64 20 63  ations, a good c
171f0 68 6f 69 63 65 20 66 6f 72 20 61 75 74 6f 6d 65  hoice for autome
17200 72 67 65 20 69 73 20 38 2e 20 49 66 20 74 68 65  rge is 8. If the
17210 20 77 6f 72 6b 6c 6f 61 64 20 63 6f 6e 74 61 69   workload contai
17220 6e 73 0a 20 20 6d 61 6e 79 20 55 50 44 41 54 45  ns.  many UPDATE
17230 20 6f 72 20 44 45 4c 45 54 45 20 63 6f 6d 6d 61   or DELETE comma
17240 6e 64 73 2c 20 0a 20 20 6f 72 20 69 66 20 71 75  nds, .  or if qu
17250 65 72 79 20 73 70 65 65 64 20 69 73 20 61 20 63  ery speed is a c
17260 6f 6e 63 65 72 6e 2c 20 69 74 20 6d 61 79 20 62  oncern, it may b
17270 65 20 61 64 76 61 6e 74 61 67 65 6f 75 73 20 74  e advantageous t
17280 6f 20 72 65 64 75 63 65 20 61 75 74 6f 6d 65 72  o reduce automer
17290 67 65 0a 20 20 74 6f 20 32 2e 0a 0a 3c 70 3e 0a  ge.  to 2...<p>.
172a0 20 20 46 6f 72 20 72 65 61 73 6f 6e 73 20 6f 66    For reasons of
172b0 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61   backwards compa
172c0 74 69 62 69 6c 69 74 79 2c 20 74 68 65 20 22 61  tibility, the "a
172d0 75 74 6f 6d 65 72 67 65 3d 31 22 20 63 6f 6d 6d  utomerge=1" comm
172e0 61 6e 64 20 73 65 74 73 0a 20 20 74 68 65 20 61  and sets.  the a
172f0 75 74 6f 6d 65 72 67 65 20 70 61 72 61 6d 65 74  utomerge paramet
17300 65 72 20 74 6f 20 38 2c 20 6e 6f 74 20 31 20 28  er to 8, not 1 (
17310 61 20 76 61 6c 75 65 20 6f 66 20 31 20 77 6f 75  a value of 1 wou
17320 6c 64 20 6d 61 6b 65 20 6e 6f 20 73 65 6e 73 65  ld make no sense
17330 20 0a 20 20 61 6e 79 77 61 79 2c 20 61 73 20 6d   .  anyway, as m
17340 65 72 67 69 6e 67 20 64 61 74 61 20 66 72 6f 6d  erging data from
17350 20 61 20 73 69 6e 67 6c 65 20 73 65 67 6d 65 6e   a single segmen
17360 74 20 69 73 20 61 20 6e 6f 2d 6f 70 29 2e 0a 0a  t is a no-op)...
17370 0a 3c 68 31 20 69 64 3d 74 6f 6b 65 6e 69 7a 65  .<h1 id=tokenize
17380 72 20 74 61 67 73 3d 22 74 6f 6b 65 6e 69 7a 65  r tags="tokenize
17390 72 22 3e 54 6f 6b 65 6e 69 7a 65 72 73 3c 2f 68  r">Tokenizers</h
173a0 31 3e 0a 0a 3c 70 3e 0a 20 20 41 6e 20 46 54 53  1>..<p>.  An FTS
173b0 20 74 6f 6b 65 6e 69 7a 65 72 20 69 73 20 61 20   tokenizer is a 
173c0 73 65 74 20 6f 66 20 72 75 6c 65 73 20 66 6f 72  set of rules for
173d0 20 65 78 74 72 61 63 74 69 6e 67 20 74 65 72 6d   extracting term
173e0 73 20 66 72 6f 6d 20 61 20 64 6f 63 75 6d 65 6e  s from a documen
173f0 74 20 0a 20 20 6f 72 20 62 61 73 69 63 20 46 54  t .  or basic FT
17400 53 20 66 75 6c 6c 2d 74 65 78 74 20 71 75 65 72  S full-text quer
17410 79 2e 20 0a 0a 3c 70 3e 0a 20 20 55 6e 6c 65 73  y. ..<p>.  Unles
17420 73 20 61 20 73 70 65 63 69 66 69 63 20 74 6f 6b  s a specific tok
17430 65 6e 69 7a 65 72 20 69 73 20 73 70 65 63 69 66  enizer is specif
17440 69 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 74  ied as part of t
17450 68 65 20 43 52 45 41 54 45 20 0a 20 20 56 49 52  he CREATE .  VIR
17460 54 55 41 4c 20 54 41 42 4c 45 20 73 74 61 74 65  TUAL TABLE state
17470 6d 65 6e 74 20 75 73 65 64 20 74 6f 20 63 72 65  ment used to cre
17480 61 74 65 20 74 68 65 20 46 54 53 20 74 61 62 6c  ate the FTS tabl
17490 65 2c 20 74 68 65 20 64 65 66 61 75 6c 74 20 0a  e, the default .
174a0 20 20 74 6f 6b 65 6e 69 7a 65 72 2c 20 22 73 69    tokenizer, "si
174b0 6d 70 6c 65 22 2c 20 69 73 20 75 73 65 64 2e 20  mple", is used. 
174c0 54 68 65 20 73 69 6d 70 6c 65 20 74 6f 6b 65 6e  The simple token
174d0 69 7a 65 72 20 65 78 74 72 61 63 74 73 20 74 6f  izer extracts to
174e0 6b 65 6e 73 20 66 72 6f 6d 0a 20 20 61 20 64 6f  kens from.  a do
174f0 63 75 6d 65 6e 74 20 6f 72 20 62 61 73 69 63 20  cument or basic 
17500 46 54 53 20 66 75 6c 6c 2d 74 65 78 74 20 71 75  FTS full-text qu
17510 65 72 79 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  ery according to
17520 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a   the following .
17530 20 20 72 75 6c 65 73 3a 0a 0a 3c 75 6c 3e 0a 20    rules:..<ul>. 
17540 20 3c 6c 69 3e 3c 70 3e 20 41 20 74 65 72 6d 20   <li><p> A term 
17550 69 73 20 61 20 63 6f 6e 74 69 67 75 6f 75 73 20  is a contiguous 
17560 73 65 71 75 65 6e 63 65 20 6f 66 20 65 6c 69 67  sequence of elig
17570 69 62 6c 65 20 63 68 61 72 61 63 74 65 72 73 2c  ible characters,
17580 20 77 68 65 72 65 20 0a 20 20 20 20 65 6c 69 67   where .    elig
17590 69 62 6c 65 20 63 68 61 72 61 63 74 65 72 73 20  ible characters 
175a0 61 72 65 20 61 6c 6c 20 61 6c 70 68 61 6e 75 6d  are all alphanum
175b0 65 72 69 63 20 63 68 61 72 61 63 74 65 72 73 20  eric characters 
175c0 61 6e 64 20 61 6c 6c 20 63 68 61 72 61 63 74 65  and all characte
175d0 72 73 20 77 69 74 68 0a 20 20 20 20 55 6e 69 63  rs with.    Unic
175e0 6f 64 65 20 63 6f 64 65 70 6f 69 6e 74 20 76 61  ode codepoint va
175f0 6c 75 65 73 20 67 72 65 61 74 65 72 20 74 68 61  lues greater tha
17600 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 31 32  n or equal to 12
17610 38 2e 0a 20 20 20 20 41 6c 6c 20 6f 74 68 65 72  8..    All other
17620 20 63 68 61 72 61 63 74 65 72 73 20 61 72 65 0a   characters are.
17630 20 20 20 20 64 69 73 63 61 72 64 65 64 20 77 68      discarded wh
17640 65 6e 20 73 70 6c 69 74 74 69 6e 67 20 61 20 64  en splitting a d
17650 6f 63 75 6d 65 6e 74 20 69 6e 74 6f 20 74 65 72  ocument into ter
17660 6d 73 2e 20 54 68 65 69 72 20 6f 6e 6c 79 20 63  ms. Their only c
17670 6f 6e 74 72 69 62 75 74 69 6f 6e 20 69 73 0a 20  ontribution is. 
17680 20 20 20 74 6f 20 73 65 70 61 72 61 74 65 20 61     to separate a
17690 64 6a 61 63 65 6e 74 20 74 65 72 6d 73 2e 0a 0a  djacent terms...
176a0 20 20 3c 6c 69 3e 3c 70 3e 20 41 6c 6c 20 75 70    <li><p> All up
176b0 70 65 72 63 61 73 65 20 63 68 61 72 61 63 74 65  percase characte
176c0 72 73 20 77 69 74 68 69 6e 20 74 68 65 20 41 53  rs within the AS
176d0 43 49 49 20 72 61 6e 67 65 20 28 55 6e 69 63 6f  CII range (Unico
176e0 64 65 20 63 6f 64 65 70 6f 69 6e 74 73 0a 20 20  de codepoints.  
176f0 20 20 6c 65 73 73 20 74 68 61 6e 20 31 32 38 29    less than 128)
17700 2c 20 61 72 65 20 74 72 61 6e 73 66 6f 72 6d 65  , are transforme
17710 64 20 74 6f 20 74 68 65 69 72 20 6c 6f 77 65 72  d to their lower
17720 63 61 73 65 20 65 71 75 69 76 61 6c 65 6e 74 73  case equivalents
17730 20 61 73 20 70 61 72 74 0a 20 20 20 20 6f 66 20   as part.    of 
17740 74 68 65 20 74 6f 6b 65 6e 69 7a 61 74 69 6f 6e  the tokenization
17750 20 70 72 6f 63 65 73 73 2e 20 54 68 75 73 2c 20   process. Thus, 
17760 66 75 6c 6c 2d 74 65 78 74 20 71 75 65 72 69 65  full-text querie
17770 73 20 61 72 65 0a 20 20 20 20 63 61 73 65 2d 69  s are.    case-i
17780 6e 73 65 6e 73 69 74 69 76 65 20 77 68 65 6e 20  nsensitive when 
17790 75 73 69 6e 67 20 74 68 65 20 73 69 6d 70 6c 65  using the simple
177a0 20 74 6f 6b 65 6e 69 7a 65 72 2e 0a 3c 2f 75 6c   tokenizer..</ul
177b0 3e 0a 0a 3c 70 3e 0a 20 20 46 6f 72 20 65 78 61  >..<p>.  For exa
177c0 6d 70 6c 65 2c 20 77 68 65 6e 20 61 20 64 6f 63  mple, when a doc
177d0 75 6d 65 6e 74 20 63 6f 6e 74 61 69 6e 69 6e 67  ument containing
177e0 20 74 68 65 20 74 65 78 74 20 22 52 69 67 68 74   the text "Right
177f0 20 6e 6f 77 2c 20 74 68 65 79 27 72 65 20 76 65   now, they're ve
17800 72 79 0a 20 20 66 72 75 73 74 72 61 74 65 64 2e  ry.  frustrated.
17810 22 2c 20 74 68 65 20 74 65 72 6d 73 20 65 78 74  ", the terms ext
17820 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65 20  racted from the 
17830 64 6f 63 75 6d 65 6e 74 20 61 6e 64 20 61 64 64  document and add
17840 65 64 20 74 6f 20 74 68 65 20 0a 20 20 66 75 6c  ed to the .  ful
17850 6c 2d 74 65 78 74 20 69 6e 64 65 78 20 61 72 65  l-text index are
17860 2c 20 69 6e 20 6f 72 64 65 72 2c 20 22 72 69 67  , in order, "rig
17870 68 74 20 6e 6f 77 20 74 68 65 79 20 72 65 20 76  ht now they re v
17880 65 72 79 20 66 72 75 73 74 72 61 74 65 64 22 2e  ery frustrated".
17890 20 53 75 63 68 0a 20 20 61 20 64 6f 63 75 6d 65   Such.  a docume
178a0 6e 74 20 77 6f 75 6c 64 20 6d 61 74 63 68 20 61  nt would match a
178b0 20 66 75 6c 6c 2d 74 65 78 74 20 71 75 65 72 79   full-text query
178c0 20 73 75 63 68 20 61 73 20 22 4d 41 54 43 48 20   such as "MATCH 
178d0 27 46 72 75 73 74 72 61 74 65 64 27 22 2c 20 0a  'Frustrated'", .
178e0 20 20 61 73 20 74 68 65 20 73 69 6d 70 6c 65 20    as the simple 
178f0 74 6f 6b 65 6e 69 7a 65 72 20 74 72 61 6e 73 66  tokenizer transf
17900 6f 72 6d 73 20 74 68 65 20 74 65 72 6d 20 69 6e  orms the term in
17910 20 74 68 65 20 71 75 65 72 79 20 74 6f 20 6c 6f   the query to lo
17920 77 65 72 63 61 73 65 0a 20 20 62 65 66 6f 72 65  wercase.  before
17930 20 73 65 61 72 63 68 69 6e 67 20 74 68 65 20 66   searching the f
17940 75 6c 6c 2d 74 65 78 74 20 69 6e 64 65 78 2e 0a  ull-text index..
17950 0a 3c 70 3e 0a 20 20 41 73 20 77 65 6c 6c 20 61  .<p>.  As well a
17960 73 20 74 68 65 20 22 73 69 6d 70 6c 65 22 20 74  s the "simple" t
17970 6f 6b 65 6e 69 7a 65 72 2c 20 74 68 65 20 46 54  okenizer, the FT
17980 53 20 73 6f 75 72 63 65 20 63 6f 64 65 20 66 65  S source code fe
17990 61 74 75 72 65 73 20 61 20 74 6f 6b 65 6e 69 7a  atures a tokeniz
179a0 65 72 20 0a 20 20 74 68 61 74 20 75 73 65 73 20  er .  that uses 
179b0 74 68 65 20 3c 61 20 68 72 65 66 3d 22 68 74 74  the <a href="htt
179c0 70 3a 2f 2f 74 61 72 74 61 72 75 73 2e 6f 72 67  p://tartarus.org
179d0 2f 7e 6d 61 72 74 69 6e 2f 50 6f 72 74 65 72 53  /~martin/PorterS
179e0 74 65 6d 6d 65 72 2f 22 3e 50 6f 72 74 65 72 20  temmer/">Porter 
179f0 0a 20 20 53 74 65 6d 6d 69 6e 67 20 61 6c 67 6f  .  Stemming algo
17a00 72 69 74 68 6d 3c 2f 61 3e 2e 20 54 68 69 73 20  rithm</a>. This 
17a10 74 6f 6b 65 6e 69 7a 65 72 20 75 73 65 73 20 74  tokenizer uses t
17a20 68 65 20 73 61 6d 65 20 72 75 6c 65 73 20 74 6f  he same rules to
17a30 20 73 65 70 61 72 61 74 65 0a 20 20 74 68 65 20   separate.  the 
17a40 69 6e 70 75 74 20 64 6f 63 75 6d 65 6e 74 20 69  input document i
17a50 6e 74 6f 20 74 65 72 6d 73 20 69 6e 63 6c 75 64  nto terms includ
17a60 69 6e 67 20 66 6f 6c 64 69 6e 67 20 61 6c 6c 20  ing folding all 
17a70 74 65 72 6d 73 20 69 6e 74 6f 20 6c 6f 77 65 72  terms into lower
17a80 20 63 61 73 65 2c 0a 20 20 62 75 74 20 61 6c 73   case,.  but als
17a90 6f 20 75 73 65 73 20 74 68 65 20 50 6f 72 74 65  o uses the Porte
17aa0 72 20 53 74 65 6d 6d 69 6e 67 20 61 6c 67 6f 72  r Stemming algor
17ab0 69 74 68 6d 20 74 6f 20 72 65 64 75 63 65 20 72  ithm to reduce r
17ac0 65 6c 61 74 65 64 20 45 6e 67 6c 69 73 68 20 6c  elated English l
17ad0 61 6e 67 75 61 67 65 0a 20 20 77 6f 72 64 73 20  anguage.  words 
17ae0 74 6f 20 61 20 63 6f 6d 6d 6f 6e 20 72 6f 6f 74  to a common root
17af0 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 75  . For example, u
17b00 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 69 6e  sing the same in
17b10 70 75 74 20 64 6f 63 75 6d 65 6e 74 20 61 73 20  put document as 
17b20 69 6e 20 74 68 65 0a 20 20 70 61 72 61 67 72 61  in the.  paragra
17b30 70 68 20 61 62 6f 76 65 2c 20 74 68 65 20 70 6f  ph above, the po
17b40 72 74 65 72 20 74 6f 6b 65 6e 69 7a 65 72 20 65  rter tokenizer e
17b50 78 74 72 61 63 74 73 20 74 68 65 20 66 6f 6c 6c  xtracts the foll
17b60 6f 77 69 6e 67 20 74 6f 6b 65 6e 73 3a 0a 20 20  owing tokens:.  
17b70 22 72 69 67 68 74 20 6e 6f 77 20 74 68 65 69 20  "right now thei 
17b80 76 65 72 69 20 66 72 75 73 74 72 61 74 22 2e 20  veri frustrat". 
17b90 45 76 65 6e 20 74 68 6f 75 67 68 20 73 6f 6d 65  Even though some
17ba0 20 6f 66 20 74 68 65 73 65 20 74 65 72 6d 73 20   of these terms 
17bb0 61 72 65 20 6e 6f 74 20 65 76 65 6e 0a 20 20 45  are not even.  E
17bc0 6e 67 6c 69 73 68 20 77 6f 72 64 73 2c 20 69 6e  nglish words, in
17bd0 20 73 6f 6d 65 20 63 61 73 65 73 20 75 73 69 6e   some cases usin
17be0 67 20 74 68 65 6d 20 74 6f 20 62 75 69 6c 64 20  g them to build 
17bf0 74 68 65 20 66 75 6c 6c 2d 74 65 78 74 20 69 6e  the full-text in
17c00 64 65 78 20 69 73 20 6d 6f 72 65 0a 20 20 75 73  dex is more.  us
17c10 65 66 75 6c 20 74 68 61 6e 20 74 68 65 20 6d 6f  eful than the mo
17c20 72 65 20 69 6e 74 65 6c 6c 69 67 69 62 6c 65 20  re intelligible 
17c30 6f 75 74 70 75 74 20 70 72 6f 64 75 63 65 64 20  output produced 
17c40 62 79 20 74 68 65 20 73 69 6d 70 6c 65 20 74 6f  by the simple to
17c50 6b 65 6e 69 7a 65 72 2e 0a 20 20 55 73 69 6e 67  kenizer..  Using
17c60 20 74 68 65 20 70 6f 72 74 65 72 20 74 6f 6b 65   the porter toke
17c70 6e 69 7a 65 72 2c 20 74 68 65 20 64 6f 63 75 6d  nizer, the docum
17c80 65 6e 74 20 6e 6f 74 20 6f 6e 6c 79 20 6d 61 74  ent not only mat
17c90 63 68 65 73 20 66 75 6c 6c 2d 74 65 78 74 20 71  ches full-text q
17ca0 75 65 72 69 65 73 0a 20 20 73 75 63 68 20 61 73  ueries.  such as
17cb0 20 22 4d 41 54 43 48 20 27 46 72 75 73 74 72 61   "MATCH 'Frustra
17cc0 74 65 64 27 22 2c 20 62 75 74 20 61 6c 73 6f 20  ted'", but also 
17cd0 71 75 65 72 69 65 73 20 73 75 63 68 20 61 73 20  queries such as 
17ce0 22 4d 41 54 43 48 20 27 46 72 75 73 74 72 61 74  "MATCH 'Frustrat
17cf0 69 6f 6e 27 22 2c 0a 20 20 61 73 20 74 68 65 20  ion'",.  as the 
17d00 74 65 72 6d 20 22 46 72 75 73 74 72 61 74 69 6f  term "Frustratio
17d10 6e 22 20 69 73 20 72 65 64 75 63 65 64 20 62 79  n" is reduced by
17d20 20 74 68 65 20 50 6f 72 74 65 72 20 73 74 65 6d   the Porter stem
17d30 6d 65 72 20 61 6c 67 6f 72 69 74 68 6d 20 74 6f  mer algorithm to
17d40 20 0a 20 20 22 66 72 75 73 74 72 61 74 22 20 2d   .  "frustrat" -
17d50 20 6a 75 73 74 20 61 73 20 22 46 72 75 73 74 72   just as "Frustr
17d60 61 74 65 64 22 20 69 73 2e 20 53 6f 2c 20 77 68  ated" is. So, wh
17d70 65 6e 20 75 73 69 6e 67 20 74 68 65 20 70 6f 72  en using the por
17d80 74 65 72 20 74 6f 6b 65 6e 69 7a 65 72 2c 0a 20  ter tokenizer,. 
17d90 20 46 54 53 20 69 73 20 61 62 6c 65 20 74 6f 20   FTS is able to 
17da0 66 69 6e 64 20 6e 6f 74 20 6a 75 73 74 20 65 78  find not just ex
17db0 61 63 74 20 6d 61 74 63 68 65 73 20 66 6f 72 20  act matches for 
17dc0 71 75 65 72 69 65 64 20 74 65 72 6d 73 2c 20 62  queried terms, b
17dd0 75 74 20 6d 61 74 63 68 65 73 0a 20 20 61 67 61  ut matches.  aga
17de0 69 6e 73 74 20 73 69 6d 69 6c 61 72 20 45 6e 67  inst similar Eng
17df0 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 20 74 65  lish language te
17e00 72 6d 73 2e 20 46 6f 72 20 6d 6f 72 65 20 69 6e  rms. For more in
17e10 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 74 68 65  formation on the
17e20 20 0a 20 20 50 6f 72 74 65 72 20 53 74 65 6d 6d   .  Porter Stemm
17e30 65 72 20 61 6c 67 6f 72 69 74 68 6d 2c 20 70 6c  er algorithm, pl
17e40 65 61 73 65 20 72 65 66 65 72 20 74 6f 20 74 68  ease refer to th
17e50 65 20 70 61 67 65 20 6c 69 6e 6b 65 64 20 61 62  e page linked ab
17e60 6f 76 65 2e 0a 0a 3c 70 3e 0a 20 20 45 78 61 6d  ove...<p>.  Exam
17e70 70 6c 65 20 69 6c 6c 75 73 74 72 61 74 69 6e 67  ple illustrating
17e80 20 74 68 65 20 64 69 66 66 65 72 65 6e 63 65 20   the difference 
17e90 62 65 74 77 65 65 6e 20 74 68 65 20 22 73 69 6d  between the "sim
17ea0 70 6c 65 22 20 61 6e 64 20 22 70 6f 72 74 65 72  ple" and "porter
17eb0 22 0a 20 20 74 6f 6b 65 6e 69 7a 65 72 73 3a 0a  ".  tokenizers:.
17ec0 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20 20 3c  .<codeblock>.  <
17ed0 69 3e 2d 2d 20 43 72 65 61 74 65 20 61 20 74 61  i>-- Create a ta
17ee0 62 6c 65 20 75 73 69 6e 67 20 74 68 65 20 73 69  ble using the si
17ef0 6d 70 6c 65 20 74 6f 6b 65 6e 69 7a 65 72 2e 20  mple tokenizer. 
17f00 49 6e 73 65 72 74 20 61 20 64 6f 63 75 6d 65 6e  Insert a documen
17f10 74 20 69 6e 74 6f 20 69 74 2e 3c 2f 69 3e 0a 20  t into it.</i>. 
17f20 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20   CREATE VIRTUAL 
17f30 54 41 42 4c 45 20 73 69 6d 70 6c 65 20 55 53 49  TABLE simple USI
17f40 4e 47 20 66 74 73 33 28 74 6f 6b 65 6e 69 7a 65  NG fts3(tokenize
17f50 3d 73 69 6d 70 6c 65 29 3b 0a 20 20 49 4e 53 45  =simple);.  INSE
17f60 52 54 20 49 4e 54 4f 20 73 69 6d 70 6c 65 20 56  RT INTO simple V
17f70 41 4c 55 45 53 28 27 52 69 67 68 74 20 6e 6f 77  ALUES('Right now
17f80 20 74 68 65 79 27 27 72 65 20 76 65 72 79 20 66   they''re very f
17f90 72 75 73 74 72 61 74 65 64 27 29 3b 0a 0a 20 20  rustrated');..  
17fa0 3c 69 3e 2d 2d 20 54 68 65 20 66 69 72 73 74 20  <i>-- The first 
17fb0 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
17fc0 20 74 77 6f 20 71 75 65 72 69 65 73 20 6d 61 74   two queries mat
17fd0 63 68 65 73 20 74 68 65 20 64 6f 63 75 6d 65 6e  ches the documen
17fe0 74 20 73 74 6f 72 65 64 20 69 6e 3c 2f 69 3e 0a  t stored in</i>.
17ff0 20 20 3c 69 3e 2d 2d 20 74 61 62 6c 65 20 22 73    <i>-- table "s
18000 69 6d 70 6c 65 22 2e 20 54 68 65 20 73 65 63 6f  imple". The seco
18010 6e 64 20 64 6f 65 73 20 6e 6f 74 2e 3c 2f 69 3e  nd does not.</i>
18020 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  .  SELECT * FROM
18030 20 73 69 6d 70 6c 65 20 57 48 45 52 45 20 73 69   simple WHERE si
18040 6d 70 6c 65 20 4d 41 54 43 48 20 27 46 72 75 73  mple MATCH 'Frus
18050 74 72 61 74 65 64 27 3b 0a 20 20 53 45 4c 45 43  trated';.  SELEC
18060 54 20 2a 20 46 52 4f 4d 20 73 69 6d 70 6c 65 20  T * FROM simple 
18070 57 48 45 52 45 20 73 69 6d 70 6c 65 20 4d 41 54  WHERE simple MAT
18080 43 48 20 27 46 72 75 73 74 72 61 74 69 6f 6e 27  CH 'Frustration'
18090 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 43 72 65 61 74  ;..  <i>-- Creat
180a0 65 20 61 20 74 61 62 6c 65 20 75 73 69 6e 67 20  e a table using 
180b0 74 68 65 20 70 6f 72 74 65 72 20 74 6f 6b 65 6e  the porter token
180c0 69 7a 65 72 2e 20 49 6e 73 65 72 74 20 74 68 65  izer. Insert the
180d0 20 73 61 6d 65 20 64 6f 63 75 6d 65 6e 74 20 69   same document i
180e0 6e 74 6f 20 69 74 3c 2f 69 3e 0a 20 20 43 52 45  nto it</i>.  CRE
180f0 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c  ATE VIRTUAL TABL
18100 45 20 70 6f 72 74 65 72 20 55 53 49 4e 47 20 66  E porter USING f
18110 74 73 33 28 74 6f 6b 65 6e 69 7a 65 3d 70 6f 72  ts3(tokenize=por
18120 74 65 72 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  ter);.  INSERT I
18130 4e 54 4f 20 70 6f 72 74 65 72 20 56 41 4c 55 45  NTO porter VALUE
18140 53 28 27 52 69 67 68 74 20 6e 6f 77 20 74 68 65  S('Right now the
18150 79 27 27 72 65 20 76 65 72 79 20 66 72 75 73 74  y''re very frust
18160 72 61 74 65 64 27 29 3b 0a 0a 20 20 3c 69 3e 2d  rated');..  <i>-
18170 2d 20 42 6f 74 68 20 6f 66 20 74 68 65 20 66 6f  - Both of the fo
18180 6c 6c 6f 77 69 6e 67 20 71 75 65 72 69 65 73 20  llowing queries 
18190 6d 61 74 63 68 20 74 68 65 20 64 6f 63 75 6d 65  match the docume
181a0 6e 74 20 73 74 6f 72 65 64 20 69 6e 20 74 61 62  nt stored in tab
181b0 6c 65 20 22 70 6f 72 74 65 72 22 2e 3c 2f 69 3e  le "porter".</i>
181c0 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  .  SELECT * FROM
181d0 20 70 6f 72 74 65 72 20 57 48 45 52 45 20 70 6f   porter WHERE po
181e0 72 74 65 72 20 4d 41 54 43 48 20 27 46 72 75 73  rter MATCH 'Frus
181f0 74 72 61 74 65 64 27 3b 0a 20 20 53 45 4c 45 43  trated';.  SELEC
18200 54 20 2a 20 46 52 4f 4d 20 70 6f 72 74 65 72 20  T * FROM porter 
18210 57 48 45 52 45 20 70 6f 72 74 65 72 20 4d 41 54  WHERE porter MAT
18220 43 48 20 27 46 72 75 73 74 72 61 74 69 6f 6e 27  CH 'Frustration'
18230 3b 0a 3c 2f 63 6f 64 65 62 6c 6f 63 6b 3e 0a 0a  ;.</codeblock>..
18240 3c 70 3e 0a 20 20 49 66 20 74 68 69 73 20 65 78  <p>.  If this ex
18250 74 65 6e 73 69 6f 6e 20 69 73 20 63 6f 6d 70 69  tension is compi
18260 6c 65 64 20 77 69 74 68 20 74 68 65 20 53 51 4c  led with the SQL
18270 49 54 45 5f 45 4e 41 42 4c 45 5f 49 43 55 20 70  ITE_ENABLE_ICU p
18280 72 65 2d 70 72 6f 63 65 73 73 6f 72 0a 20 20 73  re-processor.  s
18290 79 6d 62 6f 6c 20 64 65 66 69 6e 65 64 2c 20 74  ymbol defined, t
182a0 68 65 6e 20 74 68 65 72 65 20 65 78 69 73 74 73  hen there exists
182b0 20 61 20 62 75 69 6c 74 2d 69 6e 20 74 6f 6b 65   a built-in toke
182c0 6e 69 7a 65 72 20 6e 61 6d 65 64 20 22 69 63 75  nizer named "icu
182d0 22 0a 20 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20  ".  implemented 
182e0 75 73 69 6e 67 20 74 68 65 20 49 43 55 20 6c 69  using the ICU li
182f0 62 72 61 72 79 2e 20 54 68 65 20 66 69 72 73 74  brary. The first
18300 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64   argument passed
18310 20 74 6f 20 74 68 65 0a 20 20 78 43 72 65 61 74   to the.  xCreat
18320 65 28 29 20 6d 65 74 68 6f 64 20 28 73 65 65 20  e() method (see 
18330 66 74 73 33 5f 74 6f 6b 65 6e 69 7a 65 72 2e 68  fts3_tokenizer.h
18340 29 20 6f 66 20 74 68 69 73 20 74 6f 6b 65 6e 69  ) of this tokeni
18350 7a 65 72 20 6d 61 79 20 62 65 0a 20 20 61 6e 20  zer may be.  an 
18360 49 43 55 20 6c 6f 63 61 6c 65 20 69 64 65 6e 74  ICU locale ident
18370 69 66 69 65 72 2e 20 46 6f 72 20 65 78 61 6d 70  ifier. For examp
18380 6c 65 20 22 74 72 5f 54 52 22 20 66 6f 72 20 54  le "tr_TR" for T
18390 75 72 6b 69 73 68 20 61 73 20 75 73 65 64 0a 20  urkish as used. 
183a0 20 69 6e 20 54 75 72 6b 65 79 2c 20 6f 72 20 22   in Turkey, or "
183b0 65 6e 5f 41 55 22 20 66 6f 72 20 45 6e 67 6c 69  en_AU" for Engli
183c0 73 68 20 61 73 20 75 73 65 64 20 69 6e 20 41 75  sh as used in Au
183d0 73 74 72 61 6c 69 61 2e 20 46 6f 72 20 65 78 61  stralia. For exa
183e0 6d 70 6c 65 3a 0a 0a 3c 63 6f 64 65 62 6c 6f 63  mple:..<codebloc
183f0 6b 3e 0a 20 20 20 20 43 52 45 41 54 45 20 56 49  k>.    CREATE VI
18400 52 54 55 41 4c 20 54 41 42 4c 45 20 74 68 61 69  RTUAL TABLE thai
18410 5f 74 65 78 74 20 55 53 49 4e 47 20 66 74 73 33  _text USING fts3
18420 28 74 65 78 74 2c 20 74 6f 6b 65 6e 69 7a 65 3d  (text, tokenize=
18430 69 63 75 20 74 68 5f 54 48 29 0a 3c 2f 63 6f 64  icu th_TH).</cod
18440 65 62 6c 6f 63 6b 3e 0a 0a 3c 70 3e 0a 20 20 54  eblock>..<p>.  T
18450 68 65 20 49 43 55 20 74 6f 6b 65 6e 69 7a 65 72  he ICU tokenizer
18460 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
18470 69 73 20 76 65 72 79 20 73 69 6d 70 6c 65 2e 20  is very simple. 
18480 49 74 20 73 70 6c 69 74 73 20 74 68 65 20 69 6e  It splits the in
18490 70 75 74 0a 20 20 74 65 78 74 20 61 63 63 6f 72  put.  text accor
184a0 64 69 6e 67 20 74 6f 20 74 68 65 20 49 43 55 20  ding to the ICU 
184b0 72 75 6c 65 73 20 66 6f 72 20 66 69 6e 64 69 6e  rules for findin
184c0 67 20 77 6f 72 64 20 62 6f 75 6e 64 61 72 69 65  g word boundarie
184d0 73 20 61 6e 64 20 64 69 73 63 61 72 64 73 0a 20  s and discards. 
184e0 20 61 6e 79 20 74 6f 6b 65 6e 73 20 74 68 61 74   any tokens that
184f0 20 63 6f 6e 73 69 73 74 20 65 6e 74 69 72 65 6c   consist entirel
18500 79 20 6f 66 20 77 68 69 74 65 2d 73 70 61 63 65  y of white-space
18510 2e 20 54 68 69 73 20 6d 61 79 20 62 65 20 73 75  . This may be su
18520 69 74 61 62 6c 65 0a 20 20 66 6f 72 20 73 6f 6d  itable.  for som
18530 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 73 20 69  e applications i
18540 6e 20 73 6f 6d 65 20 6c 6f 63 61 6c 65 73 2c 20  n some locales, 
18550 62 75 74 20 6e 6f 74 20 61 6c 6c 2e 20 49 66 20  but not all. If 
18560 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 0a 20 20 70  more complex.  p
18570 72 6f 63 65 73 73 69 6e 67 20 69 73 20 72 65 71  rocessing is req
18580 75 69 72 65 64 2c 20 66 6f 72 20 65 78 61 6d 70  uired, for examp
18590 6c 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  le to implement 
185a0 73 74 65 6d 6d 69 6e 67 20 6f 72 0a 20 20 64 69  stemming or.  di
185b0 73 63 61 72 64 20 70 75 6e 63 74 75 61 74 69 6f  scard punctuatio
185c0 6e 2c 20 74 68 69 73 20 63 61 6e 20 62 65 20 64  n, this can be d
185d0 6f 6e 65 20 62 79 20 63 72 65 61 74 69 6e 67 20  one by creating 
185e0 61 20 74 6f 6b 65 6e 69 7a 65 72 0a 20 20 69 6d  a tokenizer.  im
185f0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 74 68 61  plementation tha
18600 74 20 75 73 65 73 20 74 68 65 20 49 43 55 20 74  t uses the ICU t
18610 6f 6b 65 6e 69 7a 65 72 20 61 73 20 70 61 72 74  okenizer as part
18620 20 6f 66 20 69 74 73 20 69 6d 70 6c 65 6d 65 6e   of its implemen
18630 74 61 74 69 6f 6e 2e 0a 0a 3c 74 63 6c 3e 68 64  tation...<tcl>hd
18640 5f 66 72 61 67 6d 65 6e 74 20 75 6e 69 63 6f 64  _fragment unicod
18650 65 36 31 20 75 6e 69 63 6f 64 65 36 31 3c 2f 74  e61 unicode61</t
18660 63 6c 3e 0a 3c 70 3e 0a 20 20 54 68 65 20 22 75  cl>.<p>.  The "u
18670 6e 69 63 6f 64 65 36 31 22 20 74 6f 6b 65 6e 69  nicode61" tokeni
18680 7a 65 72 20 69 73 20 61 76 61 69 6c 61 62 6c 65  zer is available
18690 20 62 65 67 69 6e 6e 69 6e 67 20 77 69 74 68 20   beginning with 
186a0 53 51 4c 69 74 65 20 5b 76 65 72 73 69 6f 6e 20  SQLite [version 
186b0 33 2e 37 2e 31 33 5d 2e 0a 20 20 55 6e 69 63 6f  3.7.13]..  Unico
186c0 64 65 36 31 20 77 6f 72 6b 73 20 76 65 72 79 20  de61 works very 
186d0 6d 75 63 68 20 6c 69 6b 65 20 22 73 69 6d 70 6c  much like "simpl
186e0 65 22 20 65 78 63 65 70 74 20 74 68 61 74 20 69  e" except that i
186f0 74 20 64 6f 65 73 20 66 75 6c 6c 20 75 6e 69 63  t does full unic
18700 6f 64 65 0a 20 20 63 61 73 65 20 66 6f 6c 64 69  ode.  case foldi
18710 6e 67 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  ng according to 
18720 72 75 6c 65 73 20 69 6e 20 55 6e 69 63 6f 64 65  rules in Unicode
18730 20 56 65 72 73 69 6f 6e 20 36 2e 31 20 61 6e 64   Version 6.1 and
18740 20 69 74 20 72 65 63 6f 67 6e 69 7a 65 73 0a 20   it recognizes. 
18750 20 75 6e 69 63 6f 64 65 20 73 70 61 63 65 20 61   unicode space a
18760 6e 64 20 70 75 6e 63 74 75 61 74 69 6f 6e 20 63  nd punctuation c
18770 68 61 72 61 63 74 65 72 73 20 61 6e 64 20 75 73  haracters and us
18780 65 73 20 74 68 6f 73 65 20 74 6f 20 73 65 70 61  es those to sepa
18790 72 61 74 65 20 74 6f 6b 65 6e 73 2e 0a 20 20 54  rate tokens..  T
187a0 68 65 20 73 69 6d 70 6c 65 20 74 6f 6b 65 6e 69  he simple tokeni
187b0 7a 65 72 20 6f 6e 6c 79 20 64 6f 65 73 20 63 61  zer only does ca
187c0 73 65 20 66 6f 6c 64 69 6e 67 20 6f 66 20 41 53  se folding of AS
187d0 43 49 49 20 63 68 61 72 61 63 74 65 72 73 20 61  CII characters a
187e0 6e 64 20 6f 6e 6c 79 0a 20 20 72 65 63 6f 67 6e  nd only.  recogn
187f0 69 7a 65 73 20 41 53 43 49 49 20 73 70 61 63 65  izes ASCII space
18800 20 61 6e 64 20 70 75 6e 63 74 75 61 74 69 6f 6e   and punctuation
18810 20 63 68 61 72 61 63 74 65 72 73 20 61 73 20 74   characters as t
18820 6f 6b 65 6e 20 73 65 70 61 72 61 74 6f 72 73 2e  oken separators.
18830 0a 0a 3c 70 3e 0a 20 20 42 79 20 64 65 66 61 75  ..<p>.  By defau
18840 6c 74 2c 20 22 75 6e 69 63 6f 64 65 36 31 22 20  lt, "unicode61" 
18850 61 6c 73 6f 20 72 65 6d 6f 76 65 73 20 61 6c 6c  also removes all
18860 20 64 69 61 63 72 69 74 69 63 73 20 66 72 6f 6d   diacritics from
18870 20 4c 61 74 69 6e 20 73 63 72 69 70 74 0a 20 20   Latin script.  
18880 63 68 61 72 61 63 74 65 72 73 2e 20 54 68 69 73  characters. This
18890 20 62 65 68 61 76 69 6f 75 72 20 63 61 6e 20 62   behaviour can b
188a0 65 20 6f 76 65 72 72 69 64 64 65 6e 20 62 79 20  e overridden by 
188b0 61 64 64 69 6e 67 20 74 68 65 20 74 6f 6b 65 6e  adding the token
188c0 69 7a 65 72 20 61 72 67 75 6d 65 6e 74 0a 20 20  izer argument.  
188d0 22 72 65 6d 6f 76 65 5f 64 69 61 63 72 69 74 69  "remove_diacriti
188e0 63 73 3d 30 22 2e 20 46 6f 72 20 65 78 61 6d 70  cs=0". For examp
188f0 6c 65 3a 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e  le:..<codeblock>
18900 0a 20 20 20 20 3c 69 3e 2d 2d 20 43 72 65 61 74  .    <i>-- Creat
18910 65 20 74 61 62 6c 65 73 20 74 68 61 74 20 72 65  e tables that re
18920 6d 6f 76 65 20 64 69 61 63 72 69 74 69 63 73 20  move diacritics 
18930 66 72 6f 6d 20 4c 61 74 69 6e 20 73 63 72 69 70  from Latin scrip
18940 74 20 63 68 61 72 61 63 74 65 72 73 3c 2f 69 3e  t characters</i>
18950 0a 20 20 20 20 3c 69 3e 2d 2d 20 61 73 20 70 61  .    <i>-- as pa
18960 72 74 20 6f 66 20 74 6f 6b 65 6e 69 7a 61 74 69  rt of tokenizati
18970 6f 6e 2e 3c 2f 69 3e 0a 20 20 20 20 43 52 45 41  on.</i>.    CREA
18980 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45  TE VIRTUAL TABLE
18990 20 74 78 74 31 20 55 53 49 4e 47 20 66 74 73 34   txt1 USING fts4
189a0 28 74 6f 6b 65 6e 69 7a 65 3d 75 6e 69 63 6f 64  (tokenize=unicod
189b0 65 36 31 29 3b 0a 20 20 20 20 43 52 45 41 54 45  e61);.    CREATE
189c0 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 74   VIRTUAL TABLE t
189d0 78 74 32 20 55 53 49 4e 47 20 66 74 73 34 28 74  xt2 USING fts4(t
189e0 6f 6b 65 6e 69 7a 65 3d 75 6e 69 63 6f 64 65 36  okenize=unicode6
189f0 31 20 22 72 65 6d 6f 76 65 5f 64 69 61 63 72 69  1 "remove_diacri
18a00 74 69 63 73 3d 31 22 29 3b 0a 0a 20 20 20 20 3c  tics=1");..    <
18a10 69 3e 2d 2d 20 43 72 65 61 74 65 20 61 20 74 61  i>-- Create a ta
18a20 62 6c 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  ble that does no
18a30 74 20 72 65 6d 6f 76 65 20 64 69 61 63 72 69 74  t remove diacrit
18a40 69 63 73 20 66 72 6f 6d 20 4c 61 74 69 6e 20 73  ics from Latin s
18a50 63 72 69 70 74 3c 2f 69 3e 0a 20 20 20 20 3c 69  cript</i>.    <i
18a60 3e 2d 2d 20 63 68 61 72 61 63 74 65 72 73 20 61  >-- characters a
18a70 73 20 70 61 72 74 20 6f 66 20 74 6f 6b 65 6e 69  s part of tokeni
18a80 7a 61 74 69 6f 6e 2e 3c 2f 69 3e 0a 20 20 20 20  zation.</i>.    
18a90 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54  CREATE VIRTUAL T
18aa0 41 42 4c 45 20 74 78 74 33 20 55 53 49 4e 47 20  ABLE txt3 USING 
18ab0 66 74 73 34 28 74 6f 6b 65 6e 69 7a 65 3d 75 6e  fts4(tokenize=un
18ac0 69 63 6f 64 65 36 31 20 22 72 65 6d 6f 76 65 5f  icode61 "remove_
18ad0 64 69 61 63 72 69 74 69 63 73 3d 30 22 29 3b 0a  diacritics=0");.
18ae0 3c 2f 63 6f 64 65 62 6c 6f 63 6b 3e 0a 0a 3c 70  </codeblock>..<p
18af0 3e 0a 20 20 49 74 20 69 73 20 61 6c 73 6f 20 70  >.  It is also p
18b00 6f 73 73 69 62 6c 65 20 74 6f 20 63 75 73 74 6f  ossible to custo
18b10 6d 69 7a 65 20 74 68 65 20 73 65 74 20 6f 66 20  mize the set of 
18b20 63 6f 64 65 70 6f 69 6e 74 73 20 74 68 61 74 20  codepoints that 
18b30 75 6e 69 63 6f 64 65 36 31 20 74 72 65 61 74 73  unicode61 treats
18b40 0a 20 20 61 73 20 73 65 70 61 72 61 74 6f 72 20  .  as separator 
18b50 63 68 61 72 61 63 74 65 72 73 2e 20 54 68 65 20  characters. The 
18b60 22 73 65 70 61 72 61 74 6f 72 73 3d 22 20 6f 70  "separators=" op
18b70 74 69 6f 6e 20 6d 61 79 20 62 65 20 75 73 65 64  tion may be used
18b80 20 74 6f 20 73 70 65 63 69 66 79 20 6f 6e 65 0a   to specify one.
18b90 20 20 6f 72 20 6d 6f 72 65 20 65 78 74 72 61 20    or more extra 
18ba0 63 68 61 72 61 63 74 65 72 73 20 74 68 61 74 20  characters that 
18bb0 73 68 6f 75 6c 64 20 62 65 20 74 72 65 61 74 65  should be treate
18bc0 64 20 61 73 20 73 65 70 61 72 61 74 6f 72 20 63  d as separator c
18bd0 68 61 72 61 63 74 65 72 73 2c 20 61 6e 64 0a 20  haracters, and. 
18be0 20 74 68 65 20 22 74 6f 6b 65 6e 63 68 61 72 73   the "tokenchars
18bf0 3d 22 20 6f 70 74 69 6f 6e 20 6d 61 79 20 62 65  =" option may be
18c00 20 75 73 65 64 20 74 6f 20 73 70 65 63 69 66 79   used to specify
18c10 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 65 78 74   one or more ext
18c20 72 61 20 63 68 61 72 61 63 74 65 72 73 0a 20 20  ra characters.  
18c30 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 74  that should be t
18c40 72 65 61 74 65 64 20 61 73 20 70 61 72 74 20 6f  reated as part o
18c50 66 20 74 6f 6b 65 6e 73 20 69 6e 73 74 65 61 64  f tokens instead
18c60 20 6f 66 20 61 73 20 73 65 70 61 72 61 74 6f 72   of as separator
18c70 20 63 68 61 72 61 63 74 65 72 73 2e 0a 20 20 46   characters..  F
18c80 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 0a 3c 63 6f  or example:..<co
18c90 64 65 62 6c 6f 63 6b 3e 0a 20 20 20 20 3c 69 3e  deblock>.    <i>
18ca0 2d 2d 20 43 72 65 61 74 65 20 61 20 74 61 62 6c  -- Create a tabl
18cb0 65 20 74 68 61 74 20 75 73 65 73 20 74 68 65 20  e that uses the 
18cc0 75 6e 69 63 6f 64 65 36 31 20 74 6f 6b 65 6e 69  unicode61 tokeni
18cd0 7a 65 72 2c 20 62 75 74 20 63 6f 6e 73 69 64 65  zer, but conside
18ce0 72 73 20 22 2e 22 3c 2f 69 3e 0a 20 20 20 20 3c  rs "."</i>.    <
18cf0 69 3e 2d 2d 20 61 6e 64 20 22 3d 22 20 63 68 61  i>-- and "=" cha
18d00 72 61 63 74 65 72 73 20 74 6f 20 62 65 20 70 61  racters to be pa
18d10 72 74 20 6f 66 20 74 6f 6b 65 6e 73 2c 20 61 6e  rt of tokens, an
18d20 64 20 63 61 70 69 74 61 6c 20 22 58 22 20 63 68  d capital "X" ch
18d30 61 72 61 63 74 65 72 73 20 74 6f 3c 2f 69 3e 0a  aracters to</i>.
18d40 20 20 20 20 3c 69 3e 2d 2d 20 66 75 6e 63 74 69      <i>-- functi
18d50 6f 6e 20 61 73 20 73 65 70 61 72 61 74 6f 72 73  on as separators
18d60 2e 3c 2f 69 3e 0a 20 20 20 20 43 52 45 41 54 45  .</i>.    CREATE
18d70 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 74   VIRTUAL TABLE t
18d80 78 74 33 20 55 53 49 4e 47 20 66 74 73 34 28 74  xt3 USING fts4(t
18d90 6f 6b 65 6e 69 7a 65 3d 75 6e 69 63 6f 64 65 36  okenize=unicode6
18da0 31 20 22 74 6f 6b 65 6e 63 68 61 72 73 3d 2e 3d  1 "tokenchars=.=
18db0 22 20 22 73 65 70 61 72 61 74 6f 72 73 3d 58 22  " "separators=X"
18dc0 29 3b 0a 0a 20 20 20 20 3c 69 3e 2d 2d 20 43 72  );..    <i>-- Cr
18dd0 65 61 74 65 20 61 20 74 61 62 6c 65 20 74 68 61  eate a table tha
18de0 74 20 63 6f 6e 73 69 64 65 72 73 20 73 70 61 63  t considers spac
18df0 65 20 63 68 61 72 61 63 74 65 72 73 20 28 63 6f  e characters (co
18e00 64 65 70 6f 69 6e 74 20 33 32 29 20 74 6f 20 62  depoint 32) to b
18e10 65 3c 2f 69 3e 0a 20 20 20 20 3c 69 3e 2d 2d 20  e</i>.    <i>-- 
18e20 61 20 74 6f 6b 65 6e 20 63 68 61 72 61 63 74 65  a token characte
18e30 72 3c 2f 69 3e 0a 20 20 20 20 43 52 45 41 54 45  r</i>.    CREATE
18e40 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 74   VIRTUAL TABLE t
18e50 78 74 34 20 55 53 49 4e 47 20 66 74 73 34 28 74  xt4 USING fts4(t
18e60 6f 6b 65 6e 69 7a 65 3d 75 6e 69 63 6f 64 65 36  okenize=unicode6
18e70 31 20 22 74 6f 6b 65 6e 63 68 61 72 73 3d 20 22  1 "tokenchars= "
18e80 29 3b 0a 3c 2f 63 6f 64 65 62 6c 6f 63 6b 3e 0a  );.</codeblock>.
18e90 0a 3c 70 3e 0a 20 20 49 66 20 61 20 63 68 61 72  .<p>.  If a char
18ea0 61 63 74 65 72 20 73 70 65 63 69 66 69 65 64 20  acter specified 
18eb0 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 61  as part of the a
18ec0 72 67 75 6d 65 6e 74 20 74 6f 20 22 74 6f 6b 65  rgument to "toke
18ed0 6e 63 68 61 72 73 3d 22 20 69 73 20 63 6f 6e 73  nchars=" is cons
18ee0 69 64 65 72 65 64 0a 20 20 74 6f 20 62 65 20 61  idered.  to be a
18ef0 20 74 6f 6b 65 6e 20 63 68 61 72 61 63 74 65 72   token character
18f00 20 62 79 20 64 65 66 61 75 6c 74 2c 20 69 74 20   by default, it 
18f10 69 73 20 69 67 6e 6f 72 65 64 2e 20 54 68 69 73  is ignored. This
18f20 20 69 73 20 74 72 75 65 20 65 76 65 6e 20 69 66   is true even if
18f30 20 69 74 20 68 61 73 0a 20 20 62 65 65 6e 20 6d   it has.  been m
18f40 61 72 6b 65 64 20 61 73 20 61 20 73 65 70 61 72  arked as a separ
18f50 61 74 6f 72 20 62 79 20 61 6e 20 65 61 72 6c 69  ator by an earli
18f60 65 72 20 22 73 65 70 61 72 61 74 6f 72 73 3d 22  er "separators="
18f70 20 6f 70 74 69 6f 6e 2e 20 53 69 6d 69 6c 61 72   option. Similar
18f80 6c 79 2c 20 69 66 0a 20 20 61 20 63 68 61 72 61  ly, if.  a chara
18f90 63 74 65 72 20 73 70 65 63 69 66 69 65 64 20 61  cter specified a
18fa0 73 20 70 61 72 74 20 6f 66 20 61 20 22 73 65 70  s part of a "sep
18fb0 61 72 61 74 6f 72 73 3d 22 20 6f 70 74 69 6f 6e  arators=" option
18fc0 20 69 73 20 74 72 65 61 74 65 64 20 61 73 20 61   is treated as a
18fd0 20 73 65 70 61 72 61 74 6f 72 0a 20 20 63 68 61   separator.  cha
18fe0 72 61 63 74 65 72 20 62 79 20 64 65 66 61 75 6c  racter by defaul
18ff0 74 2c 20 69 74 20 69 73 20 69 67 6e 6f 72 65 64  t, it is ignored
19000 2e 20 49 66 20 6d 75 6c 74 69 70 6c 65 20 22 74  . If multiple "t
19010 6f 6b 65 6e 63 68 61 72 73 3d 22 20 6f 72 20 22  okenchars=" or "
19020 73 65 70 61 72 61 74 6f 72 73 3d 22 0a 20 20 6f  separators=".  o
19030 70 74 69 6f 6e 73 20 61 72 65 20 73 70 65 63 69  ptions are speci
19040 66 69 65 64 2c 20 61 6c 6c 20 61 72 65 20 70 72  fied, all are pr
19050 6f 63 65 73 73 65 64 2e 20 46 6f 72 20 65 78 61  ocessed. For exa
19060 6d 70 6c 65 3a 0a 0a 3c 63 6f 64 65 62 6c 6f 63  mple:..<codebloc
19070 6b 3e 0a 20 20 20 20 3c 69 3e 2d 2d 20 43 72 65  k>.    <i>-- Cre
19080 61 74 65 20 61 20 74 61 62 6c 65 20 74 68 61 74  ate a table that
19090 20 75 73 65 73 20 74 68 65 20 75 6e 69 63 6f 64   uses the unicod
190a0 65 36 31 20 74 6f 6b 65 6e 69 7a 65 72 2c 20 62  e61 tokenizer, b
190b0 75 74 20 63 6f 6e 73 69 64 65 72 73 20 22 2e 22  ut considers "."
190c0 3c 2f 69 3e 0a 20 20 20 20 3c 69 3e 2d 2d 20 61  </i>.    <i>-- a
190d0 6e 64 20 22 3d 22 20 63 68 61 72 61 63 74 65 72  nd "=" character
190e0 73 20 74 6f 20 62 65 20 70 61 72 74 20 6f 66 20  s to be part of 
190f0 74 6f 6b 65 6e 73 2c 20 61 6e 64 20 63 61 70 69  tokens, and capi
19100 74 61 6c 20 22 58 22 20 63 68 61 72 61 63 74 65  tal "X" characte
19110 72 73 20 74 6f 3c 2f 69 3e 0a 20 20 20 20 3c 69  rs to</i>.    <i
19120 3e 2d 2d 20 66 75 6e 63 74 69 6f 6e 20 61 73 20  >-- function as 
19130 73 65 70 61 72 61 74 6f 72 73 2e 20 42 6f 74 68  separators. Both
19140 20 6f 66 20 74 68 65 20 22 74 6f 6b 65 6e 63 68   of the "tokench
19150 61 72 73 3d 22 20 6f 70 74 69 6f 6e 73 20 61 72  ars=" options ar
19160 65 20 70 72 6f 63 65 73 73 65 64 3c 2f 69 3e 0a  e processed</i>.
19170 20 20 20 20 3c 69 3e 2d 2d 20 54 68 65 20 22 73      <i>-- The "s
19180 65 70 61 72 61 74 6f 72 73 3d 22 20 6f 70 74 69  eparators=" opti
19190 6f 6e 20 69 67 6e 6f 72 65 73 20 74 68 65 20 22  on ignores the "
191a0 2e 22 20 70 61 73 73 65 64 20 74 6f 20 69 74 2c  ." passed to it,
191b0 20 61 73 20 22 2e 22 20 69 73 20 62 79 3c 2f 69   as "." is by</i
191c0 3e 0a 20 20 20 20 3c 69 3e 2d 2d 20 64 65 66 61  >.    <i>-- defa
191d0 75 6c 74 20 61 20 73 65 70 61 72 61 74 6f 72 20  ult a separator 
191e0 63 68 61 72 61 63 74 65 72 2c 20 65 76 65 6e 20  character, even 
191f0 74 68 6f 75 67 68 20 69 74 20 68 61 73 20 62 65  though it has be
19200 65 6e 20 6d 61 72 6b 65 64 20 61 73 20 61 20 74  en marked as a t
19210 6f 6b 65 6e 3c 2f 69 3e 0a 20 20 20 20 3c 69 3e  oken</i>.    <i>
19220 2d 2d 20 63 68 61 72 61 63 74 65 72 20 62 79 20  -- character by 
19230 61 6e 20 65 61 72 6c 69 65 72 20 22 74 6f 6b 65  an earlier "toke
19240 6e 63 68 61 72 73 3d 22 20 6f 70 74 69 6f 6e 2e  nchars=" option.
19250 3c 2f 69 3e 0a 20 20 20 20 43 52 45 41 54 45 20  </i>.    CREATE 
19260 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 74 78  VIRTUAL TABLE tx
19270 74 35 20 55 53 49 4e 47 20 66 74 73 34 28 0a 20  t5 USING fts4(. 
19280 20 20 20 20 20 20 20 74 6f 6b 65 6e 69 7a 65 3d         tokenize=
19290 75 6e 69 63 6f 64 65 36 31 20 22 74 6f 6b 65 6e  unicode61 "token
192a0 63 68 61 72 73 3d 2e 22 20 22 73 65 70 61 72 61  chars=." "separa
192b0 74 6f 72 73 3d 58 2e 22 20 22 74 6f 6b 65 6e 63  tors=X." "tokenc
192c0 68 61 72 73 3d 3d 22 0a 20 20 20 20 29 3b 0a 3c  hars==".    );.<
192d0 2f 63 6f 64 65 62 6c 6f 63 6b 3e 0a 0a 3c 70 3e  /codeblock>..<p>
192e0 0a 20 20 54 68 65 20 61 72 67 75 6d 65 6e 74 73  .  The arguments
192f0 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 22   passed to the "
19300 74 6f 6b 65 6e 63 68 61 72 73 3d 22 20 6f 72 20  tokenchars=" or 
19310 22 73 65 70 61 72 61 74 6f 72 73 3d 22 20 6f 70  "separators=" op
19320 74 69 6f 6e 73 20 61 72 65 20 0a 20 20 63 61 73  tions are .  cas
19330 65 2d 73 65 6e 73 69 74 69 76 65 2e 20 49 6e 20  e-sensitive. In 
19340 74 68 65 20 65 78 61 6d 70 6c 65 20 61 62 6f 76  the example abov
19350 65 2c 20 73 70 65 63 69 66 79 69 6e 67 20 74 68  e, specifying th
19360 61 74 20 22 58 22 20 69 73 20 61 20 73 65 70 61  at "X" is a sepa
19370 72 61 74 6f 72 0a 20 20 63 68 61 72 61 63 74 65  rator.  characte
19380 72 20 64 6f 65 73 20 6e 6f 74 20 61 66 66 65 63  r does not affec
19390 74 20 74 68 65 20 77 61 79 20 22 78 22 20 69 73  t the way "x" is
193a0 20 68 61 6e 64 6c 65 64 2e 0a 0a 3c 68 32 3e 43   handled...<h2>C
193b0 75 73 74 6f 6d 20 28 55 73 65 72 20 49 6d 70 6c  ustom (User Impl
193c0 65 6d 65 6e 74 65 64 29 20 54 6f 6b 65 6e 69 7a  emented) Tokeniz
193d0 65 72 73 3c 2f 68 32 3e 0a 0a 3c 70 3e 0a 20 20  ers</h2>..<p>.  
193e0 41 73 20 77 65 6c 6c 20 61 73 20 74 68 65 20 62  As well as the b
193f0 75 69 6c 74 2d 69 6e 20 22 73 69 6d 70 6c 65 22  uilt-in "simple"
19400 2c 20 22 70 6f 72 74 65 72 22 20 61 6e 64 20 28  , "porter" and (
19410 70 6f 73 73 69 62 6c 79 29 20 22 69 63 75 22 20  possibly) "icu" 
19420 61 6e 64 0a 20 20 22 75 6e 69 63 6f 64 65 36 31  and.  "unicode61
19430 22 20 74 6f 6b 65 6e 69 7a 65 72 73 2c 0a 20 20  " tokenizers,.  
19440 46 54 53 20 65 78 70 6f 72 74 73 20 61 6e 20 69  FTS exports an i
19450 6e 74 65 72 66 61 63 65 20 74 68 61 74 20 61 6c  nterface that al
19460 6c 6f 77 73 20 75 73 65 72 73 20 74 6f 20 69 6d  lows users to im
19470 70 6c 65 6d 65 6e 74 20 63 75 73 74 6f 6d 20 74  plement custom t
19480 6f 6b 65 6e 69 7a 65 72 73 0a 20 20 75 73 69 6e  okenizers.  usin
19490 67 20 43 2e 20 54 68 65 20 69 6e 74 65 72 66 61  g C. The interfa
194a0 63 65 20 75 73 65 64 20 74 6f 20 63 72 65 61 74  ce used to creat
194b0 65 20 61 20 6e 65 77 20 74 6f 6b 65 6e 69 7a 65  e a new tokenize
194c0 72 20 69 73 20 64 65 66 69 6e 65 64 20 61 6e 64  r is defined and
194d0 20 0a 20 20 64 65 73 63 72 69 62 65 64 20 69 6e   .  described in
194e0 20 74 68 65 20 66 74 73 33 5f 74 6f 6b 65 6e 69   the fts3_tokeni
194f0 7a 65 72 2e 68 20 73 6f 75 72 63 65 20 66 69 6c  zer.h source fil
19500 65 2e 0a 0a 3c 70 3e 0a 20 20 52 65 67 69 73 74  e...<p>.  Regist
19510 65 72 69 6e 67 20 61 20 6e 65 77 20 46 54 53 20  ering a new FTS 
19520 74 6f 6b 65 6e 69 7a 65 72 20 69 73 20 73 69 6d  tokenizer is sim
19530 69 6c 61 72 20 74 6f 20 72 65 67 69 73 74 65 72  ilar to register
19540 69 6e 67 20 61 20 6e 65 77 0a 20 20 76 69 72 74  ing a new.  virt
19550 75 61 6c 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65  ual table module
19560 20 77 69 74 68 20 53 51 4c 69 74 65 2e 20 54 68   with SQLite. Th
19570 65 20 75 73 65 72 20 70 61 73 73 65 73 20 61 20  e user passes a 
19580 70 6f 69 6e 74 65 72 20 74 6f 20 61 0a 20 20 73  pointer to a.  s
19590 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e  tructure contain
195a0 69 6e 67 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  ing pointers to 
195b0 76 61 72 69 6f 75 73 20 63 61 6c 6c 62 61 63 6b  various callback
195c0 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 0a   functions that.
195d0 20 20 6d 61 6b 65 20 75 70 20 74 68 65 20 69 6d    make up the im
195e0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
195f0 74 68 65 20 6e 65 77 20 74 6f 6b 65 6e 69 7a 65  the new tokenize
19600 72 20 74 79 70 65 2e 20 46 6f 72 20 74 6f 6b 65  r type. For toke
19610 6e 69 7a 65 72 73 2c 0a 20 20 74 68 65 20 73 74  nizers,.  the st
19620 72 75 63 74 75 72 65 20 28 64 65 66 69 6e 65 64  ructure (defined
19630 20 69 6e 20 66 74 73 33 5f 74 6f 6b 65 6e 69 7a   in fts3_tokeniz
19640 65 72 2e 68 29 20 69 73 20 63 61 6c 6c 65 64 0a  er.h) is called.
19650 20 20 22 73 71 6c 69 74 65 33 5f 74 6f 6b 65 6e    "sqlite3_token
19660 69 7a 65 72 5f 6d 6f 64 75 6c 65 22 2e 0a 0a 3c  izer_module"...<
19670 70 3e 0a 20 20 46 54 53 20 64 6f 65 73 20 6e 6f  p>.  FTS does no
19680 74 20 65 78 70 6f 73 65 20 61 20 43 2d 66 75 6e  t expose a C-fun
19690 63 74 69 6f 6e 20 74 68 61 74 20 75 73 65 72 73  ction that users
196a0 20 63 61 6c 6c 20 74 6f 20 72 65 67 69 73 74 65   call to registe
196b0 72 20 6e 65 77 0a 20 20 74 6f 6b 65 6e 69 7a 65  r new.  tokenize
196c0 72 20 74 79 70 65 73 20 77 69 74 68 20 61 20 64  r types with a d
196d0 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 2e 20  atabase handle. 
196e0 49 6e 73 74 65 61 64 2c 20 74 68 65 20 70 6f 69  Instead, the poi
196f0 6e 74 65 72 20 6d 75 73 74 0a 20 20 62 65 20 65  nter must.  be e
19700 6e 63 6f 64 65 64 20 61 73 20 61 6e 20 53 51 4c  ncoded as an SQL
19710 20 62 6c 6f 62 20 76 61 6c 75 65 20 61 6e 64 20   blob value and 
19720 70 61 73 73 65 64 20 74 6f 20 46 54 53 20 74 68  passed to FTS th
19730 72 6f 75 67 68 20 74 68 65 20 53 51 4c 0a 20 20  rough the SQL.  
19740 65 6e 67 69 6e 65 20 62 79 20 65 76 61 6c 75 61  engine by evalua
19750 74 69 6e 67 20 61 20 73 70 65 63 69 61 6c 20 73  ting a special s
19760 63 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e 2c 20  calar function, 
19770 22 66 74 73 33 5f 74 6f 6b 65 6e 69 7a 65 72 28  "fts3_tokenizer(
19780 29 22 2e 0a 20 20 54 68 65 20 66 74 73 33 5f 74  )"..  The fts3_t
19790 6f 6b 65 6e 69 7a 65 72 28 29 20 66 75 6e 63 74  okenizer() funct
197a0 69 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c 65  ion may be calle
197b0 64 20 77 69 74 68 20 6f 6e 65 20 6f 72 20 74 77  d with one or tw
197c0 6f 20 61 72 67 75 6d 65 6e 74 73 2c 0a 20 20 61  o arguments,.  a
197d0 73 20 66 6f 6c 6c 6f 77 73 3a 0a 0a 3c 63 6f 64  s follows:..<cod
197e0 65 62 6c 6f 63 6b 3e 0a 20 20 20 20 53 45 4c 45  eblock>.    SELE
197f0 43 54 20 66 74 73 33 5f 74 6f 6b 65 6e 69 7a 65  CT fts3_tokenize
19800 72 28 26 6c 74 3b 74 6f 6b 65 6e 69 7a 65 72 2d  r(&lt;tokenizer-
19810 6e 61 6d 65 26 67 74 3b 29 3b 0a 20 20 20 20 53  name&gt;);.    S
19820 45 4c 45 43 54 20 66 74 73 33 5f 74 6f 6b 65 6e  ELECT fts3_token
19830 69 7a 65 72 28 26 6c 74 3b 74 6f 6b 65 6e 69 7a  izer(&lt;tokeniz
19840 65 72 2d 6e 61 6d 65 26 67 74 3b 2c 20 26 6c 74  er-name&gt;, &lt
19850 3b 73 71 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a  ;sqlite3_tokeniz
19860 65 72 5f 6d 6f 64 75 6c 65 20 70 74 72 26 67 74  er_module ptr&gt
19870 3b 29 3b 0a 3c 2f 63 6f 64 65 62 6c 6f 63 6b 3e  ;);.</codeblock>
19880 0a 0a 3c 70 3e 0a 20 20 57 68 65 72 65 20 26 6c  ..<p>.  Where &l
19890 74 3b 74 6f 6b 65 6e 69 7a 65 72 2d 6e 61 6d 65  t;tokenizer-name
198a0 26 67 74 3b 20 69 73 20 61 20 73 74 72 69 6e 67  &gt; is a string
198b0 20 69 64 65 6e 74 69 66 79 69 6e 67 20 74 68 65   identifying the
198c0 20 74 6f 6b 65 6e 69 7a 65 72 20 61 6e 64 0a 20   tokenizer and. 
198d0 20 26 6c 74 3b 73 71 6c 69 74 65 33 5f 74 6f 6b   &lt;sqlite3_tok
198e0 65 6e 69 7a 65 72 5f 6d 6f 64 75 6c 65 20 70 74  enizer_module pt
198f0 72 26 67 74 3b 20 69 73 20 61 20 70 6f 69 6e 74  r&gt; is a point
19900 65 72 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33  er to an sqlite3
19910 5f 74 6f 6b 65 6e 69 7a 65 72 5f 6d 6f 64 75 6c  _tokenizer_modul
19920 65 0a 20 20 73 74 72 75 63 74 75 72 65 20 65 6e  e.  structure en
19930 63 6f 64 65 64 20 61 73 20 61 6e 20 53 51 4c 20  coded as an SQL 
19940 62 6c 6f 62 2e 20 49 66 20 74 68 65 20 73 65 63  blob. If the sec
19950 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ond argument is 
19960 70 72 65 73 65 6e 74 2c 0a 20 20 69 74 20 69 73  present,.  it is
19970 20 72 65 67 69 73 74 65 72 65 64 20 61 73 20 74   registered as t
19980 6f 6b 65 6e 69 7a 65 72 20 26 6c 74 3b 74 6f 6b  okenizer &lt;tok
19990 65 6e 69 7a 65 72 2d 6e 61 6d 65 26 67 74 3b 20  enizer-name&gt; 
199a0 61 6e 64 20 61 20 63 6f 70 79 20 6f 66 20 69 74  and a copy of it
199b0 0a 20 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  .  returned. If 
199c0 6f 6e 6c 79 20 6f 6e 65 20 61 72 67 75 6d 65 6e  only one argumen
199d0 74 20 69 73 20 70 61 73 73 65 64 2c 20 61 20 70  t is passed, a p
199e0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 74 6f  ointer to the to
199f0 6b 65 6e 69 7a 65 72 0a 20 20 69 6d 70 6c 65 6d  kenizer.  implem
19a00 65 6e 74 61 74 69 6f 6e 20 63 75 72 72 65 6e 74  entation current
19a10 6c 79 20 72 65 67 69 73 74 65 72 65 64 20 61 73  ly registered as
19a20 20 26 6c 74 3b 74 6f 6b 65 6e 69 7a 65 72 2d 6e   &lt;tokenizer-n
19a30 61 6d 65 26 67 74 3b 20 69 73 20 72 65 74 75 72  ame&gt; is retur
19a40 6e 65 64 2c 0a 20 20 65 6e 63 6f 64 65 64 20 61  ned,.  encoded a
19a50 73 20 61 20 62 6c 6f 62 2e 20 4f 72 2c 20 69 66  s a blob. Or, if
19a60 20 6e 6f 20 73 75 63 68 20 74 6f 6b 65 6e 69 7a   no such tokeniz
19a70 65 72 20 65 78 69 73 74 73 2c 20 61 6e 20 53 51  er exists, an SQ
19a80 4c 20 65 78 63 65 70 74 69 6f 6e 0a 20 20 28 65  L exception.  (e
19a90 72 72 6f 72 29 20 69 73 20 72 61 69 73 65 64 2e  rror) is raised.
19aa0 0a 0a 3c 70 3e 0a 20 20 3c 62 3e 53 45 43 55 52  ..<p>.  <b>SECUR
19ab0 49 54 59 20 57 41 52 4e 49 4e 47 3c 2f 62 3e 3a  ITY WARNING</b>:
19ac0 20 49 66 20 74 68 65 20 66 74 73 33 2f 34 20 65   If the fts3/4 e
19ad0 78 74 65 6e 73 69 6f 6e 20 69 73 20 75 73 65 64  xtension is used
19ae0 20 69 6e 20 61 6e 20 65 6e 76 69 72 6f 6e 6d 65   in an environme
19af0 6e 74 0a 20 20 77 68 65 72 65 20 70 6f 74 65 6e  nt.  where poten
19b00 74 69 61 6c 6c 79 20 6d 61 6c 69 63 69 6f 75 73  tially malicious
19b10 20 75 73 65 72 73 20 6d 61 79 20 65 78 65 63 75   users may execu
19b20 74 65 20 61 72 62 69 74 72 61 72 79 20 53 51 4c  te arbitrary SQL
19b30 2c 20 74 68 65 79 20 73 68 6f 75 6c 64 20 0a 20  , they should . 
19b40 20 62 65 20 70 72 65 76 65 6e 74 65 64 20 66 72   be prevented fr
19b50 6f 6d 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20  om invoking the 
19b60 66 74 73 33 5f 74 6f 6b 65 6e 69 7a 65 72 28 29  fts3_tokenizer()
19b70 20 66 75 6e 63 74 69 6f 6e 2c 20 70 6f 73 73 69   function, possi
19b80 62 6c 79 20 75 73 69 6e 67 20 0a 20 20 74 68 65  bly using .  the
19b90 20 5b 73 71 6c 69 74 65 33 5f 73 65 74 5f 61 75   [sqlite3_set_au
19ba0 74 68 6f 72 69 7a 65 72 28 29 7c 61 75 74 68 6f  thorizer()|autho
19bb0 72 69 7a 61 74 69 6f 6e 20 63 61 6c 6c 62 61 63  rization callbac
19bc0 6b 5d 2e 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 66  k]...<p>.  The f
19bd0 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 63  ollowing block c
19be0 6f 6e 74 61 69 6e 73 20 61 6e 20 65 78 61 6d 70  ontains an examp
19bf0 6c 65 20 6f 66 20 63 61 6c 6c 69 6e 67 20 74 68  le of calling th
19c00 65 20 66 74 73 33 5f 74 6f 6b 65 6e 69 7a 65 72  e fts3_tokenizer
19c10 28 29 0a 20 20 66 75 6e 63 74 69 6f 6e 20 66 72  ().  function fr
19c20 6f 6d 20 43 20 63 6f 64 65 3a 0a 0a 3c 63 6f 64  om C code:..<cod
19c30 65 62 6c 6f 63 6b 3e 0a 20 20 3c 69 3e 2f 2a 0a  eblock>.  <i>/*.
19c40 20 20 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20    ** Register a 
19c50 74 6f 6b 65 6e 69 7a 65 72 20 69 6d 70 6c 65 6d  tokenizer implem
19c60 65 6e 74 61 74 69 6f 6e 20 77 69 74 68 20 46 54  entation with FT
19c70 53 33 20 6f 72 20 46 54 53 34 2e 0a 20 20 2a 2f  S3 or FTS4..  */
19c80 3c 2f 69 3e 0a 20 20 69 6e 74 20 72 65 67 69 73  </i>.  int regis
19c90 74 65 72 54 6f 6b 65 6e 69 7a 65 72 28 0a 20 20  terTokenizer(.  
19ca0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20    sqlite3 *db,. 
19cb0 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 0a     char *zName,.
19cc0 20 20 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65      const sqlite
19cd0 33 5f 74 6f 6b 65 6e 69 7a 65 72 5f 6d 6f 64 75  3_tokenizer_modu
19ce0 6c 65 20 2a 70 0a 20 20 29 7b 0a 20 20 20 20 69  le *p.  ){.    i
19cf0 6e 74 20 72 63 3b 0a 20 20 20 20 73 71 6c 69 74  nt rc;.    sqlit
19d00 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
19d10 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
19d20 7a 53 71 6c 20 3d 20 22 53 45 4c 45 43 54 20 66  zSql = "SELECT f
19d30 74 73 33 5f 74 6f 6b 65 6e 69 7a 65 72 28 3f 2c  ts3_tokenizer(?,
19d40 20 3f 29 22 3b 0a 0a 20 20 20 20 72 63 20 3d 20   ?)";..    rc = 
19d50 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
19d60 76 32 28 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c  v2(db, zSql, -1,
19d70 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20   &pStmt, 0);.   
19d80 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
19d90 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
19da0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn rc;.    }..  
19db0 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74    sqlite3_bind_t
19dc0 65 78 74 28 70 53 74 6d 74 2c 20 31 2c 20 7a 4e  ext(pStmt, 1, zN
19dd0 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  ame, -1, SQLITE_
19de0 53 54 41 54 49 43 29 3b 0a 20 20 20 20 73 71 6c  STATIC);.    sql
19df0 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70  ite3_bind_blob(p
19e00 53 74 6d 74 2c 20 32 2c 20 26 70 2c 20 73 69 7a  Stmt, 2, &p, siz
19e10 65 6f 66 28 70 29 2c 20 53 51 4c 49 54 45 5f 53  eof(p), SQLITE_S
19e20 54 41 54 49 43 29 3b 0a 20 20 20 20 73 71 6c 69  TATIC);.    sqli
19e30 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b  te3_step(pStmt);
19e40 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c  ..    return sql
19e50 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
19e60 74 6d 74 29 3b 0a 20 20 7d 0a 0a 20 20 3c 69 3e  tmt);.  }..  <i>
19e70 2f 2a 0a 20 20 2a 2a 20 51 75 65 72 79 20 46 54  /*.  ** Query FT
19e80 53 20 66 6f 72 20 74 68 65 20 74 6f 6b 65 6e 69  S for the tokeni
19e90 7a 65 72 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  zer implementati
19ea0 6f 6e 20 6e 61 6d 65 64 20 7a 4e 61 6d 65 2e 0a  on named zName..
19eb0 20 20 2a 2f 3c 2f 69 3e 0a 20 20 69 6e 74 20 71    */</i>.  int q
19ec0 75 65 72 79 54 6f 6b 65 6e 69 7a 65 72 28 0a 20  ueryTokenizer(. 
19ed0 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a     sqlite3 *db,.
19ee0 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c      char *zName,
19ef0 0a 20 20 20 20 63 6f 6e 73 74 20 73 71 6c 69 74  .    const sqlit
19f00 65 33 5f 74 6f 6b 65 6e 69 7a 65 72 5f 6d 6f 64  e3_tokenizer_mod
19f10 75 6c 65 20 2a 2a 70 70 0a 20 20 29 7b 0a 20 20  ule **pp.  ){.  
19f20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 73 71    int rc;.    sq
19f30 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
19f40 74 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  t;.    const cha
19f50 72 20 2a 7a 53 71 6c 20 3d 20 22 53 45 4c 45 43  r *zSql = "SELEC
19f60 54 20 66 74 73 33 5f 74 6f 6b 65 6e 69 7a 65 72  T fts3_tokenizer
19f70 28 3f 29 22 3b 0a 0a 20 20 20 20 2a 70 70 20 3d  (?)";..    *pp =
19f80 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   0;.    rc = sql
19f90 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
19fa0 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70  db, zSql, -1, &p
19fb0 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69 66  Stmt, 0);.    if
19fc0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
19fd0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
19fe0 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73  rc;.    }..    s
19ff0 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74  qlite3_bind_text
1a000 28 70 53 74 6d 74 2c 20 31 2c 20 7a 4e 61 6d 65  (pStmt, 1, zName
1a010 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41  , -1, SQLITE_STA
1a020 54 49 43 29 3b 0a 20 20 20 20 69 66 28 20 53 51  TIC);.    if( SQ
1a030 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65  LITE_ROW==sqlite
1a040 33 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b  3_step(pStmt) ){
1a050 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
1a060 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 28 70  e3_column_type(p
1a070 53 74 6d 74 2c 20 30 29 3d 3d 53 51 4c 49 54 45  Stmt, 0)==SQLITE
1a080 5f 42 4c 4f 42 20 29 7b 0a 20 20 20 20 20 20 20  _BLOB ){.       
1a090 20 6d 65 6d 63 70 79 28 70 70 2c 20 73 71 6c 69   memcpy(pp, sqli
1a0a0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28  te3_column_blob(
1a0b0 70 53 74 6d 74 2c 20 30 29 2c 20 73 69 7a 65 6f  pStmt, 0), sizeo
1a0c0 66 28 2a 70 70 29 29 3b 0a 20 20 20 20 20 20 7d  f(*pp));.      }
1a0d0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 65 74 75  .    }..    retu
1a0e0 72 6e 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c  rn sqlite3_final
1a0f0 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 7d 0a  ize(pStmt);.  }.
1a100 3c 2f 63 6f 64 65 62 6c 6f 63 6b 3e 0a 0a 0a 3c  </codeblock>...<
1a110 74 63 6c 3e 68 64 5f 66 72 61 67 6d 65 6e 74 20  tcl>hd_fragment 
1a120 66 74 73 33 74 6f 6b 20 7b 66 74 73 33 74 6f 6b  fts3tok {fts3tok
1a130 65 6e 69 7a 65 7d 20 7b 66 74 73 33 74 6f 6b 65  enize} {fts3toke
1a140 6e 69 7a 65 20 76 69 72 74 75 61 6c 20 74 61 62  nize virtual tab
1a150 6c 65 7d 3c 2f 74 63 6c 3e 0a 3c 68 32 3e 51 75  le}</tcl>.<h2>Qu
1a160 65 72 79 69 6e 67 20 54 6f 6b 65 6e 69 7a 65 72  erying Tokenizer
1a170 73 3c 2f 68 32 3e 0a 0a 3c 70 3e 54 68 65 20 22  s</h2>..<p>The "
1a180 66 74 73 33 74 6f 6b 65 6e 69 7a 65 22 20 76 69  fts3tokenize" vi
1a190 72 74 75 61 6c 20 74 61 62 6c 65 20 63 61 6e 20  rtual table can 
1a1a0 62 65 20 75 73 65 64 20 74 6f 20 64 69 72 65 63  be used to direc
1a1b0 74 6c 79 20 61 63 63 65 73 73 20 61 6e 79 0a 20  tly access any. 
1a1c0 20 20 74 6f 6b 65 6e 69 7a 65 72 2e 20 20 54 68    tokenizer.  Th
1a1d0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 53 51 4c 20  e following SQL 
1a1e0 64 65 6d 6f 6e 73 74 72 61 74 65 73 20 68 6f 77  demonstrates how
1a1f0 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20 69 6e   to create an in
1a200 73 74 61 6e 63 65 20 0a 20 20 20 6f 66 20 74 68  stance .   of th
1a210 65 20 66 74 73 33 74 6f 6b 65 6e 69 7a 65 20 76  e fts3tokenize v
1a220 69 72 74 75 61 6c 20 74 61 62 6c 65 3a 0a 0a 3c  irtual table:..<
1a230 63 6f 64 65 62 6c 6f 63 6b 3e 0a 43 52 45 41 54  codeblock>.CREAT
1a240 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20  E VIRTUAL TABLE 
1a250 74 6f 6b 31 20 55 53 49 4e 47 20 66 74 73 33 74  tok1 USING fts3t
1a260 6f 6b 65 6e 69 7a 65 28 27 70 6f 72 74 65 72 27  okenize('porter'
1a270 29 3b 0a 3c 2f 63 6f 64 65 62 6c 6f 63 6b 3e 0a  );.</codeblock>.
1a280 0a 3c 70 3e 54 68 65 20 6e 61 6d 65 20 6f 66 20  .<p>The name of 
1a290 74 68 65 20 64 65 73 69 72 65 64 20 74 6f 6b 65  the desired toke
1a2a0 6e 69 7a 65 72 20 73 68 6f 75 6c 64 20 62 65 20  nizer should be 
1a2b0 73 75 62 73 74 69 74 75 74 65 64 20 69 6e 20 70  substituted in p
1a2c0 6c 61 63 65 20 6f 66 0a 20 20 20 27 70 6f 72 74  lace of.   'port
1a2d0 65 72 27 20 69 6e 20 74 68 65 20 65 78 61 6d 70  er' in the examp
1a2e0 6c 65 2c 20 6f 66 20 63 6f 75 72 73 65 2e 20 20  le, of course.  
1a2f0 49 66 20 74 68 65 20 74 6f 6b 65 6e 69 7a 65 72  If the tokenizer
1a300 20 72 65 71 75 69 72 65 73 20 6f 6e 65 20 6f 72   requires one or
1a310 0a 20 20 20 6d 6f 72 65 20 61 72 67 75 6d 65 6e  .   more argumen
1a320 74 73 2c 20 74 68 65 79 20 73 68 6f 75 6c 64 20  ts, they should 
1a330 62 65 20 73 65 70 61 72 61 74 65 64 20 62 79 20  be separated by 
1a340 63 6f 6d 6d 61 73 20 69 6e 20 74 68 65 20 66 74  commas in the ft
1a350 73 33 74 6f 6b 65 6e 69 7a 65 0a 20 20 20 64 65  s3tokenize.   de
1a360 63 6c 61 72 61 74 69 6f 6e 20 28 65 76 65 6e 20  claration (even 
1a370 74 68 6f 75 67 68 20 74 68 65 79 20 61 72 65 20  though they are 
1a380 73 65 70 61 72 61 74 65 64 20 62 79 20 73 70 61  separated by spa
1a390 63 65 73 20 69 6e 20 64 65 63 6c 61 72 61 74 69  ces in declarati
1a3a0 6f 6e 73 0a 20 20 20 6f 66 20 72 65 67 75 6c 61  ons.   of regula
1a3b0 72 20 66 74 73 34 20 74 61 62 6c 65 73 29 2e 20  r fts4 tables). 
1a3c0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 72  The following cr
1a3d0 65 61 74 65 73 20 66 74 73 34 20 61 6e 64 20 66  eates fts4 and f
1a3e0 74 73 33 74 6f 6b 65 6e 69 7a 65 0a 20 20 20 74  ts3tokenize.   t
1a3f0 61 62 6c 65 73 20 74 68 61 74 20 75 73 65 20 74  ables that use t
1a400 68 65 20 73 61 6d 65 20 74 6f 6b 65 6e 69 7a 65  he same tokenize
1a410 72 3a 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20  r:.<codeblock>. 
1a420 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20   CREATE VIRTUAL 
1a430 54 41 42 4c 45 20 74 65 78 74 31 20 55 53 49 4e  TABLE text1 USIN
1a440 47 20 66 74 73 34 28 74 6f 6b 65 6e 69 7a 65 3d  G fts4(tokenize=
1a450 69 63 75 20 65 6e 5f 41 55 29 3b 0a 20 20 43 52  icu en_AU);.  CR
1a460 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42  EATE VIRTUAL TAB
1a470 4c 45 20 74 6f 6b 65 6e 73 31 20 55 53 49 4e 47  LE tokens1 USING
1a480 20 66 74 73 33 74 6f 6b 65 6e 69 7a 65 28 69 63   fts3tokenize(ic
1a490 75 2c 20 65 6e 5f 41 55 29 3b 0a 0a 20 20 43 52  u, en_AU);..  CR
1a4a0 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42  EATE VIRTUAL TAB
1a4b0 4c 45 20 74 65 78 74 32 20 55 53 49 4e 47 20 66  LE text2 USING f
1a4c0 74 73 34 28 74 6f 6b 65 6e 69 7a 65 3d 75 6e 69  ts4(tokenize=uni
1a4d0 63 6f 64 65 36 31 20 22 74 6f 6b 65 6e 63 68 61  code61 "tokencha
1a4e0 72 73 3d 40 2e 22 20 22 73 65 70 61 72 61 74 6f  rs=@." "separato
1a4f0 72 73 3d 31 32 33 22 29 3b 0a 20 20 43 52 45 41  rs=123");.  CREA
1a500 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45  TE VIRTUAL TABLE
1a510 20 74 6f 6b 65 6e 73 32 20 55 53 49 4e 47 20 66   tokens2 USING f
1a520 74 73 33 74 6f 6b 65 6e 69 7a 65 28 75 6e 69 63  ts3tokenize(unic
1a530 6f 64 65 36 31 2c 20 22 74 6f 6b 65 6e 63 68 61  ode61, "tokencha
1a540 72 73 3d 40 2e 22 2c 20 22 73 65 70 61 72 61 74  rs=@.", "separat
1a550 6f 72 73 3d 31 32 33 22 29 3b 0a 3c 2f 63 6f 64  ors=123");.</cod
1a560 65 62 6c 6f 63 6b 3e 0a 20 20 20 0a 3c 70 3e 0a  eblock>.   .<p>.
1a570 20 20 20 4f 6e 63 65 20 74 68 65 20 76 69 72 74     Once the virt
1a580 75 61 6c 20 74 61 62 6c 65 20 69 73 20 63 72 65  ual table is cre
1a590 61 74 65 64 2c 20 69 74 20 63 61 6e 20 62 65 20  ated, it can be 
1a5a0 71 75 65 72 69 65 64 20 61 73 20 66 6f 6c 6c 6f  queried as follo
1a5b0 77 73 3a 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e  ws:..<codeblock>
1a5c0 0a 53 45 4c 45 43 54 20 74 6f 6b 65 6e 2c 20 73  .SELECT token, s
1a5d0 74 61 72 74 2c 20 65 6e 64 2c 20 70 6f 73 69 74  tart, end, posit
1a5e0 69 6f 6e 20 0a 20 20 46 52 4f 4d 20 74 6f 6b 31  ion .  FROM tok1
1a5f0 0a 20 57 48 45 52 45 20 69 6e 70 75 74 3d 27 54  . WHERE input='T
1a600 68 69 73 20 69 73 20 61 20 74 65 73 74 20 73 65  his is a test se
1a610 6e 74 65 6e 63 65 2e 27 3b 0a 3c 2f 63 6f 64 65  ntence.';.</code
1a620 62 6c 6f 63 6b 3e 0a 0a 3c 70 3e 54 68 65 20 76  block>..<p>The v
1a630 69 72 74 75 61 6c 20 74 61 62 6c 65 20 77 69 6c  irtual table wil
1a640 6c 20 72 65 74 75 72 6e 20 6f 6e 65 20 72 6f 77  l return one row
1a650 20 6f 66 20 6f 75 74 70 75 74 20 66 6f 72 20 65   of output for e
1a660 61 63 68 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65  ach token in the
1a670 0a 20 20 20 69 6e 70 75 74 20 73 74 72 69 6e 67  .   input string
1a680 2e 20 20 54 68 65 20 22 74 6f 6b 65 6e 22 20 63  .  The "token" c
1a690 6f 6c 75 6d 6e 20 69 73 20 74 68 65 20 74 65 78  olumn is the tex
1a6a0 74 20 6f 66 20 74 68 65 20 74 6f 6b 65 6e 2e 20  t of the token. 
1a6b0 20 54 68 65 20 22 73 74 61 72 74 22 0a 20 20 20   The "start".   
1a6c0 61 6e 64 20 22 65 6e 64 22 20 63 6f 6c 75 6d 6e  and "end" column
1a6d0 73 20 61 72 65 20 74 68 65 20 62 79 74 65 20 6f  s are the byte o
1a6e0 66 66 73 65 74 20 74 6f 20 74 68 65 20 62 65 67  ffset to the beg
1a6f0 69 6e 6e 69 6e 67 20 61 6e 64 20 65 6e 64 20 6f  inning and end o
1a700 66 20 74 68 65 0a 20 20 20 74 6f 6b 65 6e 20 69  f the.   token i
1a710 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 69  n the original i
1a720 6e 70 75 74 20 73 74 72 69 6e 67 2e 20 20 0a 20  nput string.  . 
1a730 20 20 54 68 65 20 22 70 6f 73 69 74 69 6f 6e 22    The "position"
1a740 20 63 6f 6c 75 6d 6e 20 69 73 20 74 68 65 20 73   column is the s
1a750 65 71 75 65 6e 63 65 20 6e 75 6d 62 65 72 0a 20  equence number. 
1a760 20 20 6f 66 20 74 68 65 20 74 6f 6b 65 6e 20 69    of the token i
1a770 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 69  n the original i
1a780 6e 70 75 74 20 73 74 72 69 6e 67 2e 20 20 54 68  nput string.  Th
1a790 65 72 65 20 69 73 20 61 6c 73 6f 20 61 6e 20 22  ere is also an "
1a7a0 69 6e 70 75 74 22 0a 20 20 20 63 6f 6c 75 6d 6e  input".   column
1a7b0 20 77 68 69 63 68 20 69 73 20 73 69 6d 70 6c 79   which is simply
1a7c0 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 69   a copy of the i
1a7d0 6e 70 75 74 20 73 74 72 69 6e 67 20 74 68 61 74  nput string that
1a7e0 20 69 73 20 73 70 65 63 69 66 69 65 64 20 69 6e   is specified in
1a7f0 0a 20 20 20 74 68 65 20 57 48 45 52 45 20 63 6c  .   the WHERE cl
1a800 61 75 73 65 2e 20 20 4e 6f 74 65 20 74 68 61 74  ause.  Note that
1a810 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 66   a constraint of
1a820 20 74 68 65 20 66 6f 72 6d 20 22 69 6e 70 75 74   the form "input
1a830 3d 3f 22 20 6d 75 73 74 0a 20 20 20 61 70 70 65  =?" must.   appe
1a840 61 72 20 69 6e 20 74 68 65 20 57 48 45 52 45 20  ar in the WHERE 
1a850 63 6c 61 75 73 65 20 6f 72 20 65 6c 73 65 20 74  clause or else t
1a860 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  he virtual table
1a870 20 77 69 6c 6c 20 68 61 76 65 20 6e 6f 20 69 6e   will have no in
1a880 70 75 74 0a 20 20 20 74 6f 20 74 6f 6b 65 6e 69  put.   to tokeni
1a890 7a 65 20 61 6e 64 20 77 69 6c 6c 20 72 65 74 75  ze and will retu
1a8a0 72 6e 20 6e 6f 20 72 6f 77 73 2e 20 20 54 68 65  rn no rows.  The
1a8b0 20 65 78 61 6d 70 6c 65 20 61 62 6f 76 65 20 67   example above g
1a8c0 65 6e 65 72 61 74 65 73 0a 20 20 20 74 68 65 20  enerates.   the 
1a8d0 66 6f 6c 6c 6f 77 69 6e 67 20 6f 75 74 70 75 74  following output
1a8e0 3a 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a 74  :..<codeblock>.t
1a8f0 68 69 7c 30 7c 34 7c 30 0a 69 73 7c 35 7c 37 7c  hi|0|4|0.is|5|7|
1a900 31 0a 61 7c 38 7c 39 7c 32 0a 74 65 73 74 7c 31  1.a|8|9|2.test|1
1a910 30 7c 31 34 7c 33 0a 73 65 6e 74 65 6e 63 7c 31  0|14|3.sentenc|1
1a920 35 7c 32 33 7c 34 0a 3c 2f 63 6f 64 65 62 6c 6f  5|23|4.</codeblo
1a930 63 6b 3e 0a 0a 3c 70 3e 4e 6f 74 69 63 65 20 74  ck>..<p>Notice t
1a940 68 61 74 20 74 68 65 20 74 6f 6b 65 6e 73 20 69  hat the tokens i
1a950 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
1a960 20 66 72 6f 6d 20 74 68 65 20 66 74 73 33 74 6f   from the fts3to
1a970 6b 65 6e 69 7a 65 20 76 69 72 74 75 61 6c 0a 20  kenize virtual. 
1a980 20 20 74 61 62 6c 65 20 68 61 76 65 20 62 65 65    table have bee
1a990 6e 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 61 63  n transformed ac
1a9a0 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 72  cording to the r
1a9b0 75 6c 65 73 20 6f 66 20 74 68 65 20 74 6f 6b 65  ules of the toke
1a9c0 6e 69 7a 65 72 2e 0a 20 20 20 53 69 6e 63 65 20  nizer..   Since 
1a9d0 74 68 69 73 20 65 78 61 6d 70 6c 65 20 75 73 65  this example use
1a9e0 64 20 74 68 65 20 22 70 6f 72 74 65 72 22 20 74  d the "porter" t
1a9f0 6f 6b 65 6e 69 7a 65 72 2c 20 74 68 65 20 22 54  okenizer, the "T
1aa00 68 69 73 22 20 74 6f 6b 65 6e 20 77 61 73 0a 20  his" token was. 
1aa10 20 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f    converted into
1aa20 20 22 74 68 69 22 2e 20 20 49 66 20 74 68 65 20   "thi".  If the 
1aa30 6f 72 69 67 69 6e 61 6c 20 74 65 78 74 20 6f 66  original text of
1aa40 20 74 68 65 20 74 6f 6b 65 6e 20 69 73 20 64 65   the token is de
1aa50 73 69 72 65 64 2c 0a 20 20 20 69 74 20 63 61 6e  sired,.   it can
1aa60 20 62 65 20 72 65 74 72 69 65 76 65 64 20 75 73   be retrieved us
1aa70 69 6e 67 20 74 68 65 20 22 73 74 61 72 74 22 20  ing the "start" 
1aa80 61 6e 64 20 22 65 6e 64 22 20 63 6f 6c 75 6d 6e  and "end" column
1aa90 73 20 77 69 74 68 20 74 68 65 0a 20 20 20 5b 73  s with the.   [s
1aaa0 75 62 73 74 72 28 29 5d 20 66 75 6e 63 74 69 6f  ubstr()] functio
1aab0 6e 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a  n.  For example:
1aac0 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a 53 45  ..<codeblock>.SE
1aad0 4c 45 43 54 20 73 75 62 73 74 72 28 69 6e 70 75  LECT substr(inpu
1aae0 74 2c 20 73 74 61 72 74 2b 31 2c 20 65 6e 64 2d  t, start+1, end-
1aaf0 73 74 61 72 74 29 2c 20 74 6f 6b 65 6e 2c 20 70  start), token, p
1ab00 6f 73 69 74 69 6f 6e 0a 20 20 46 52 4f 4d 20 74  osition.  FROM t
1ab10 6f 6b 31 0a 20 57 48 45 52 45 20 69 6e 70 75 74  ok1. WHERE input
1ab20 3d 27 54 68 69 73 20 69 73 20 61 20 74 65 73 74  ='This is a test
1ab30 20 73 65 6e 74 65 6e 63 65 2e 27 3b 0a 3c 2f 63   sentence.';.</c
1ab40 6f 64 65 62 6c 6f 63 6b 3e 0a 0a 3c 70 3e 54 68  odeblock>..<p>Th
1ab50 65 20 66 74 73 33 74 6f 6b 65 6e 69 7a 65 20 76  e fts3tokenize v
1ab60 69 72 74 75 61 6c 20 74 61 62 6c 65 20 63 61 6e  irtual table can
1ab70 20 62 65 20 75 73 65 64 20 6f 6e 20 61 6e 79 20   be used on any 
1ab80 74 6f 6b 65 6e 69 7a 65 72 2c 20 72 65 67 61 72  tokenizer, regar
1ab90 64 6c 65 73 73 0a 20 20 20 6f 66 20 77 68 65 74  dless.   of whet
1aba0 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 72 65  her or not there
1abb0 20 65 78 69 73 74 73 20 61 6e 20 46 54 53 33 20   exists an FTS3 
1abc0 6f 72 20 46 54 53 34 20 74 61 62 6c 65 20 74 68  or FTS4 table th
1abd0 61 74 20 61 63 74 75 61 6c 6c 79 20 75 73 65 73  at actually uses
1abe0 0a 20 20 20 74 68 61 74 20 74 6f 6b 65 6e 69 7a  .   that tokeniz
1abf0 65 72 2e 0a 0a 20 0a 3c 68 31 20 74 61 67 73 3d  er... .<h1 tags=
1ac00 22 73 65 67 6d 65 6e 74 20 62 74 72 65 65 22 3e  "segment btree">
1ac10 44 61 74 61 20 53 74 72 75 63 74 75 72 65 73 3c  Data Structures<
1ac20 2f 68 31 3e 0a 0a 3c 70 3e 0a 20 20 54 68 69 73  /h1>..<p>.  This
1ac30 20 73 65 63 74 69 6f 6e 20 64 65 73 63 72 69 62   section describ
1ac40 65 73 20 61 74 20 61 20 68 69 67 68 2d 6c 65 76  es at a high-lev
1ac50 65 6c 20 74 68 65 20 77 61 79 20 74 68 65 20 46  el the way the F
1ac60 54 53 20 6d 6f 64 75 6c 65 20 73 74 6f 72 65 73  TS module stores
1ac70 20 69 74 73 0a 20 20 69 6e 64 65 78 20 61 6e 64   its.  index and
1ac80 20 63 6f 6e 74 65 6e 74 20 69 6e 20 74 68 65 20   content in the 
1ac90 64 61 74 61 62 61 73 65 2e 20 49 74 20 69 73 20  database. It is 
1aca0 3c 62 3e 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  <b>not necessary
1acb0 20 74 6f 20 72 65 61 64 20 6f 72 20 0a 20 20 75   to read or .  u
1acc0 6e 64 65 72 73 74 61 6e 64 20 74 68 65 20 6d 61  nderstand the ma
1acd0 74 65 72 69 61 6c 20 69 6e 20 74 68 69 73 20 73  terial in this s
1ace0 65 63 74 69 6f 6e 20 69 6e 20 6f 72 64 65 72 20  ection in order 
1acf0 74 6f 20 75 73 65 20 46 54 53 3c 2f 62 3e 20 69  to use FTS</b> i
1ad00 6e 20 61 6e 20 0a 20 20 61 70 70 6c 69 63 61 74  n an .  applicat
1ad10 69 6f 6e 2e 20 48 6f 77 65 76 65 72 2c 20 69 74  ion. However, it
1ad20 20 6d 61 79 20 62 65 20 75 73 65 66 75 6c 20 74   may be useful t
1ad30 6f 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 64 65  o application de
1ad40 76 65 6c 6f 70 65 72 73 20 61 74 74 65 6d 70 74  velopers attempt
1ad50 69 6e 67 20 0a 20 20 74 6f 20 61 6e 61 6c 79 7a  ing .  to analyz
1ad60 65 20 61 6e 64 20 75 6e 64 65 72 73 74 61 6e 64  e and understand
1ad70 20 46 54 53 20 70 65 72 66 6f 72 6d 61 6e 63 65   FTS performance
1ad80 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63 73   characteristics
1ad90 2c 20 6f 72 20 74 6f 20 64 65 76 65 6c 6f 70 65  , or to develope
1ada0 72 73 20 0a 20 20 63 6f 6e 74 65 6d 70 6c 61 74  rs .  contemplat
1adb0 69 6e 67 20 65 6e 68 61 6e 63 65 6d 65 6e 74 73  ing enhancements
1adc0 20 74 6f 20 74 68 65 20 65 78 69 73 74 69 6e 67   to the existing
1add0 20 46 54 53 20 66 65 61 74 75 72 65 20 73 65 74   FTS feature set
1ade0 2e 0a 0a 3c 74 63 6c 3e 68 64 5f 66 72 61 67 6d  ...<tcl>hd_fragm
1adf0 65 6e 74 20 2a 73 68 61 64 6f 77 74 61 62 20 7b  ent *shadowtab {
1ae00 46 54 53 20 73 68 61 64 6f 77 20 74 61 62 6c 65  FTS shadow table
1ae10 73 7d 20 7b 73 68 61 64 6f 77 20 74 61 62 6c 65  s} {shadow table
1ae20 73 7d 3c 2f 74 63 6c 3e 0a 3c 68 32 20 74 61 67  s}</tcl>.<h2 tag
1ae30 73 3d 22 73 68 61 64 6f 77 74 61 62 73 22 3e 53  s="shadowtabs">S
1ae40 68 61 64 6f 77 20 54 61 62 6c 65 73 3c 2f 68 32  hadow Tables</h2
1ae50 3e 0a 3c 70 3e 0a 20 20 46 6f 72 20 65 61 63 68  >.<p>.  For each
1ae60 20 46 54 53 20 76 69 72 74 75 61 6c 20 74 61 62   FTS virtual tab
1ae70 6c 65 20 69 6e 20 61 20 64 61 74 61 62 61 73 65  le in a database
1ae80 2c 20 74 68 72 65 65 20 74 6f 20 66 69 76 65 20  , three to five 
1ae90 72 65 61 6c 20 28 6e 6f 6e 2d 76 69 72 74 75 61  real (non-virtua
1aea0 6c 29 20 74 61 62 6c 65 73 0a 20 20 61 72 65 20  l) tables.  are 
1aeb0 63 72 65 61 74 65 64 20 74 6f 20 73 74 6f 72 65  created to store
1aec0 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
1aed0 64 61 74 61 2e 20 20 54 68 65 73 65 20 72 65 61  data.  These rea
1aee0 6c 20 74 61 62 6c 65 73 20 61 72 65 20 63 61 6c  l tables are cal
1aef0 6c 65 64 20 22 73 68 61 64 6f 77 20 74 61 62 6c  led "shadow tabl
1af00 65 73 22 2e 0a 20 20 54 68 65 20 72 65 61 6c 20  es"..  The real 
1af10 74 61 62 6c 65 73 20 61 72 65 20 6e 61 6d 65 64  tables are named
1af20 20 22 25 5f 63 6f 6e 74 65 6e 74 22 2c 0a 20 20   "%_content",.  
1af30 22 25 5f 73 65 67 64 69 72 22 2c 20 22 25 5f 73  "%_segdir", "%_s
1af40 65 67 6d 65 6e 74 73 22 2c 20 22 25 5f 73 74 61  egments", "%_sta
1af50 74 22 2c 20 61 6e 64 20 22 25 5f 64 6f 63 73 69  t", and "%_docsi
1af60 7a 65 22 2c 20 77 68 65 72 65 20 22 25 22 20 69  ze", where "%" i
1af70 73 20 72 65 70 6c 61 63 65 64 20 62 79 20 74 68  s replaced by th
1af80 65 20 6e 61 6d 65 0a 20 20 6f 66 20 74 68 65 20  e name.  of the 
1af90 46 54 53 20 76 69 72 74 75 61 6c 20 74 61 62 6c  FTS virtual tabl
1afa0 65 2e 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 6c 65  e...<p>.  The le
1afb0 66 74 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 6f 66  ftmost column of
1afc0 20 74 68 65 20 22 25 5f 63 6f 6e 74 65 6e 74 22   the "%_content"
1afd0 20 74 61 62 6c 65 20 69 73 20 61 6e 20 49 4e 54   table is an INT
1afe0 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
1aff0 20 66 69 65 6c 64 0a 20 20 6e 61 6d 65 64 20 22   field.  named "
1b000 64 6f 63 69 64 22 2e 20 46 6f 6c 6c 6f 77 69 6e  docid". Followin
1b010 67 20 74 68 69 73 20 69 73 20 6f 6e 65 20 63 6f  g this is one co
1b020 6c 75 6d 6e 20 66 6f 72 20 65 61 63 68 20 63 6f  lumn for each co
1b030 6c 75 6d 6e 20 6f 66 20 74 68 65 20 46 54 53 0a  lumn of the FTS.
1b040 20 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20    virtual table 
1b050 61 73 20 64 65 63 6c 61 72 65 64 20 62 79 20 74  as declared by t
1b060 68 65 20 75 73 65 72 2c 20 6e 61 6d 65 64 20 62  he user, named b
1b070 79 20 70 72 65 70 65 6e 64 69 6e 67 20 74 68 65  y prepending the
1b080 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 0a 20 20 73   column name.  s
1b090 75 70 70 6c 69 65 64 20 62 79 20 74 68 65 20 75  upplied by the u
1b0a0 73 65 72 20 77 69 74 68 20 22 63 3c 69 3e 4e 3c  ser with "c<i>N<
1b0b0 2f 69 3e 22 2c 20 77 68 65 72 65 20 3c 69 3e 4e  /i>", where <i>N
1b0c0 3c 2f 69 3e 20 69 73 20 74 68 65 20 69 6e 64 65  </i> is the inde
1b0d0 78 20 6f 66 20 74 68 65 20 0a 20 20 63 6f 6c 75  x of the .  colu
1b0e0 6d 6e 20 77 69 74 68 69 6e 20 74 68 65 20 74 61  mn within the ta
1b0f0 62 6c 65 2c 20 6e 75 6d 62 65 72 65 64 20 66 72  ble, numbered fr
1b100 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74  om left to right
1b110 20 73 74 61 72 74 69 6e 67 20 77 69 74 68 20 30   starting with 0
1b120 2e 20 44 61 74 61 0a 20 20 74 79 70 65 73 20 73  . Data.  types s
1b130 75 70 70 6c 69 65 64 20 61 73 20 70 61 72 74 20  upplied as part 
1b140 6f 66 20 74 68 65 20 76 69 72 74 75 61 6c 20 74  of the virtual t
1b150 61 62 6c 65 20 64 65 63 6c 61 72 61 74 69 6f 6e  able declaration
1b160 20 61 72 65 20 6e 6f 74 20 75 73 65 64 20 61 73   are not used as
1b170 0a 20 20 70 61 72 74 20 6f 66 20 74 68 65 20 25  .  part of the %
1b180 5f 63 6f 6e 74 65 6e 74 20 74 61 62 6c 65 20 64  _content table d
1b190 65 63 6c 61 72 61 74 69 6f 6e 2e 20 46 6f 72 20  eclaration. For 
1b1a0 65 78 61 6d 70 6c 65 3a 0a 0a 3c 63 6f 64 65 62  example:..<codeb
1b1b0 6c 6f 63 6b 3e 0a 20 20 3c 69 3e 2d 2d 20 56 69  lock>.  <i>-- Vi
1b1c0 72 74 75 61 6c 20 74 61 62 6c 65 20 64 65 63 6c  rtual table decl
1b1d0 61 72 61 74 69 6f 6e 3c 2f 69 3e 0a 20 20 43 52  aration</i>.  CR
1b1e0 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42  EATE VIRTUAL TAB
1b1f0 4c 45 20 61 62 63 20 55 53 49 4e 47 20 66 74 73  LE abc USING fts
1b200 34 28 61 20 4e 55 4d 42 45 52 2c 20 62 20 54 45  4(a NUMBER, b TE
1b210 58 54 2c 20 63 29 3b 0a 0a 20 20 3c 69 3e 2d 2d  XT, c);..  <i>--
1b220 20 43 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 25   Corresponding %
1b230 5f 63 6f 6e 74 65 6e 74 20 74 61 62 6c 65 20 64  _content table d
1b240 65 63 6c 61 72 61 74 69 6f 6e 3c 2f 69 3e 0a 20  eclaration</i>. 
1b250 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 61 62   CREATE TABLE ab
1b260 63 5f 63 6f 6e 74 65 6e 74 28 64 6f 63 69 64 20  c_content(docid 
1b270 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
1b280 4b 45 59 2c 20 63 30 61 2c 20 63 31 62 2c 20 63  KEY, c0a, c1b, c
1b290 32 63 29 3b 0a 3c 2f 63 6f 64 65 62 6c 6f 63 6b  2c);.</codeblock
1b2a0 3e 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 25 5f 63  >..<p>.  The %_c
1b2b0 6f 6e 74 65 6e 74 20 74 61 62 6c 65 20 63 6f 6e  ontent table con
1b2c0 74 61 69 6e 73 20 74 68 65 20 75 6e 61 64 75 6c  tains the unadul
1b2d0 74 65 72 61 74 65 64 20 64 61 74 61 20 69 6e 73  terated data ins
1b2e0 65 72 74 65 64 20 62 79 20 74 68 65 20 75 73 65  erted by the use
1b2f0 72 20 0a 20 20 69 6e 74 6f 20 74 68 65 20 46 54  r .  into the FT
1b300 53 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  S virtual table 
1b310 62 79 20 74 68 65 20 75 73 65 72 2e 20 49 66 20  by the user. If 
1b320 74 68 65 20 75 73 65 72 20 64 6f 65 73 20 6e 6f  the user does no
1b330 74 20 65 78 70 6c 69 63 69 74 6c 79 0a 20 20 73  t explicitly.  s
1b340 75 70 70 6c 79 20 61 20 22 64 6f 63 69 64 22 20  upply a "docid" 
1b350 76 61 6c 75 65 20 77 68 65 6e 20 69 6e 73 65 72  value when inser
1b360 74 69 6e 67 20 72 65 63 6f 72 64 73 2c 20 6f 6e  ting records, on
1b370 65 20 69 73 20 73 65 6c 65 63 74 65 64 20 61 75  e is selected au
1b380 74 6f 6d 61 74 69 63 61 6c 6c 79 0a 20 20 62 79  tomatically.  by
1b390 20 74 68 65 20 73 79 73 74 65 6d 2e 0a 0a 3c 70   the system...<p
1b3a0 3e 0a 20 20 54 68 65 20 25 5f 73 74 61 74 20 61  >.  The %_stat a
1b3b0 6e 64 20 25 5f 64 6f 63 73 69 7a 65 20 74 61 62  nd %_docsize tab
1b3c0 6c 65 73 20 61 72 65 20 6f 6e 6c 79 20 63 72 65  les are only cre
1b3d0 61 74 65 64 20 69 66 20 74 68 65 20 46 54 53 20  ated if the FTS 
1b3e0 74 61 62 6c 65 20 75 73 65 73 20 74 68 65 0a 20  table uses the. 
1b3f0 20 46 54 53 34 20 6d 6f 64 75 6c 65 2c 20 6e 6f   FTS4 module, no
1b400 74 20 46 54 53 33 2e 20 46 75 72 74 68 65 72 6d  t FTS3. Furtherm
1b410 6f 72 65 2c 20 74 68 65 20 25 5f 64 6f 63 73 69  ore, the %_docsi
1b420 7a 65 20 74 61 62 6c 65 20 69 73 20 6f 6d 69 74  ze table is omit
1b430 74 65 64 20 69 66 20 74 68 65 0a 20 20 46 54 53  ted if the.  FTS
1b440 34 20 74 61 62 6c 65 20 69 73 20 63 72 65 61 74  4 table is creat
1b450 65 64 20 77 69 74 68 20 74 68 65 20 5b 46 54 53  ed with the [FTS
1b460 34 20 6d 61 74 63 68 69 6e 66 6f 20 6f 70 74 69  4 matchinfo opti
1b470 6f 6e 7c 22 6d 61 74 63 68 69 6e 66 6f 3d 66 74  on|"matchinfo=ft
1b480 73 33 22 5d 20 64 69 72 65 63 74 69 76 65 0a 20  s3"] directive. 
1b490 20 73 70 65 63 69 66 69 65 64 20 61 73 20 70 61   specified as pa
1b4a0 72 74 20 6f 66 20 74 68 65 20 43 52 45 41 54 45  rt of the CREATE
1b4b0 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 73   VIRTUAL TABLE s
1b4c0 74 61 74 65 6d 65 6e 74 2e 20 49 66 20 74 68 65  tatement. If the
1b4d0 79 20 61 72 65 20 63 72 65 61 74 65 64 2c 0a 20  y are created,. 
1b4e0 20 74 68 65 20 73 63 68 65 6d 61 20 6f 66 20 74   the schema of t
1b4f0 68 65 20 74 77 6f 20 74 61 62 6c 65 73 20 69 73  he two tables is
1b500 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 3c 63 6f   as follows:.<co
1b510 64 65 62 6c 6f 63 6b 3e 0a 20 20 43 52 45 41 54  deblock>.  CREAT
1b520 45 20 54 41 42 4c 45 20 25 5f 73 74 61 74 28 0a  E TABLE %_stat(.
1b530 20 20 20 20 69 64 20 49 4e 54 45 47 45 52 20 50      id INTEGER P
1b540 52 49 4d 41 52 59 20 4b 45 59 2c 20 0a 20 20 20  RIMARY KEY, .   
1b550 20 76 61 6c 75 65 20 42 4c 4f 42 0a 20 20 29 3b   value BLOB.  );
1b560 0a 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  ..  CREATE TABLE
1b570 20 25 5f 64 6f 63 73 69 7a 65 28 0a 20 20 20 20   %_docsize(.    
1b580 64 6f 63 69 64 20 49 4e 54 45 47 45 52 20 50 52  docid INTEGER PR
1b590 49 4d 41 52 59 20 4b 45 59 2c 0a 20 20 20 20 73  IMARY KEY,.    s
1b5a0 69 7a 65 20 42 4c 4f 42 0a 20 20 29 3b 0a 3c 2f  ize BLOB.  );.</
1b5b0 63 6f 64 65 62 6c 6f 63 6b 3e 0a 0a 3c 70 3e 0a  codeblock>..<p>.
1b5c0 20 20 46 6f 72 20 65 61 63 68 20 72 6f 77 20 69    For each row i
1b5d0 6e 20 74 68 65 20 46 54 53 20 74 61 62 6c 65 2c  n the FTS table,
1b5e0 20 74 68 65 20 25 5f 64 6f 63 73 69 7a 65 20 74   the %_docsize t
1b5f0 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20 61 20  able contains a 
1b600 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 20 20  corresponding.  
1b610 72 6f 77 20 77 69 74 68 20 74 68 65 20 73 61 6d  row with the sam
1b620 65 20 22 64 6f 63 69 64 22 20 76 61 6c 75 65 2e  e "docid" value.
1b630 20 54 68 65 20 22 73 69 7a 65 22 20 66 69 65 6c   The "size" fiel
1b640 64 20 63 6f 6e 74 61 69 6e 73 20 61 20 62 6c 6f  d contains a blo
1b650 62 20 63 6f 6e 73 69 73 74 69 6e 67 0a 20 20 6f  b consisting.  o
1b660 66 20 3c 69 3e 4e 3c 2f 69 3e 20 46 54 53 20 76  f <i>N</i> FTS v
1b670 61 72 69 6e 74 73 2c 20 77 68 65 72 65 20 3c 69  arints, where <i
1b680 3e 4e 3c 2f 69 3e 20 69 73 20 74 68 65 20 6e 75  >N</i> is the nu
1b690 6d 62 65 72 20 6f 66 20 75 73 65 72 2d 64 65 66  mber of user-def
1b6a0 69 6e 65 64 20 63 6f 6c 75 6d 6e 73 0a 20 20 69  ined columns.  i
1b6b0 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 45 61 63  n the table. Eac
1b6c0 68 20 76 61 72 69 6e 74 20 69 6e 20 74 68 65 20  h varint in the 
1b6d0 22 73 69 7a 65 22 20 62 6c 6f 62 20 69 73 20 74  "size" blob is t
1b6e0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 6f 6b  he number of tok
1b6f0 65 6e 73 20 69 6e 20 74 68 65 0a 20 20 63 6f 72  ens in the.  cor
1b700 72 65 73 70 6f 6e 64 69 6e 67 20 63 6f 6c 75 6d  responding colum
1b710 6e 20 6f 66 20 74 68 65 20 61 73 73 6f 63 69 61  n of the associa
1b720 74 65 64 20 72 6f 77 20 69 6e 20 74 68 65 20 46  ted row in the F
1b730 54 53 20 74 61 62 6c 65 2e 20 54 68 65 20 25 5f  TS table. The %_
1b740 73 74 61 74 20 74 61 62 6c 65 0a 20 20 61 6c 77  stat table.  alw
1b750 61 79 73 20 63 6f 6e 74 61 69 6e 73 20 61 20 73  ays contains a s
1b760 69 6e 67 6c 65 20 72 6f 77 20 77 69 74 68 20 74  ingle row with t
1b770 68 65 20 22 69 64 22 20 63 6f 6c 75 6d 6e 20 73  he "id" column s
1b780 65 74 20 74 6f 20 30 2e 20 54 68 65 20 22 76 61  et to 0. The "va
1b790 6c 75 65 22 20 0a 20 20 63 6f 6c 75 6d 6e 20 63  lue" .  column c
1b7a0 6f 6e 74 61 69 6e 73 20 61 20 62 6c 6f 62 20 63  ontains a blob c
1b7b0 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20 3c 69 3e  onsisting of <i>
1b7c0 4e 2b 31 3c 2f 69 3e 20 46 54 53 20 76 61 72 69  N+1</i> FTS vari
1b7d0 6e 74 73 2c 20 77 68 65 72 65 20 3c 69 3e 4e 3c  nts, where <i>N<
1b7e0 2f 69 3e 0a 20 20 69 73 20 61 67 61 69 6e 20 74  /i>.  is again t
1b7f0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 75 73 65  he number of use
1b800 72 2d 64 65 66 69 6e 65 64 20 63 6f 6c 75 6d 6e  r-defined column
1b810 73 20 69 6e 20 74 68 65 20 46 54 53 20 74 61 62  s in the FTS tab
1b820 6c 65 2e 20 54 68 65 20 66 69 72 73 74 0a 20 20  le. The first.  
1b830 76 61 72 69 6e 74 20 69 6e 20 74 68 65 20 62 6c  varint in the bl
1b840 6f 62 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ob is set to the
1b850 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
1b860 20 72 6f 77 73 20 69 6e 20 74 68 65 20 46 54 53   rows in the FTS
1b870 20 74 61 62 6c 65 2e 20 54 68 65 0a 20 20 73 65   table. The.  se
1b880 63 6f 6e 64 20 61 6e 64 20 73 75 62 73 65 71 75  cond and subsequ
1b890 65 6e 74 20 76 61 72 69 6e 74 73 20 63 6f 6e 74  ent varints cont
1b8a0 61 69 6e 20 74 68 65 20 74 6f 74 61 6c 20 6e 75  ain the total nu
1b8b0 6d 62 65 72 20 6f 66 20 74 6f 6b 65 6e 73 20 73  mber of tokens s
1b8c0 74 6f 72 65 64 20 69 6e 0a 20 20 74 68 65 20 63  tored in.  the c
1b8d0 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 63 6f 6c  orresponding col
1b8e0 75 6d 6e 20 66 6f 72 20 61 6c 6c 20 72 6f 77 73  umn for all rows
1b8f0 20 6f 66 20 74 68 65 20 46 54 53 20 74 61 62 6c   of the FTS tabl
1b900 65 2e 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 74 77  e...<p>.  The tw
1b910 6f 20 72 65 6d 61 69 6e 69 6e 67 20 74 61 62 6c  o remaining tabl
1b920 65 73 2c 20 25 5f 73 65 67 6d 65 6e 74 73 20 61  es, %_segments a
1b930 6e 64 20 25 5f 73 65 67 64 69 72 2c 20 61 72 65  nd %_segdir, are
1b940 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74   used to store t
1b950 68 65 20 0a 20 20 66 75 6c 6c 2d 74 65 78 74 20  he .  full-text 
1b960 69 6e 64 65 78 2e 20 43 6f 6e 63 65 70 74 75 61  index. Conceptua
1b970 6c 6c 79 2c 20 74 68 69 73 20 69 6e 64 65 78 20  lly, this index 
1b980 69 73 20 61 20 6c 6f 6f 6b 75 70 20 74 61 62 6c  is a lookup tabl
1b990 65 20 74 68 61 74 20 6d 61 70 73 20 65 61 63 68  e that maps each
1b9a0 20 0a 20 20 74 65 72 6d 20 28 77 6f 72 64 29 20   .  term (word) 
1b9b0 74 6f 20 74 68 65 20 73 65 74 20 6f 66 20 64 6f  to the set of do
1b9c0 63 69 64 20 76 61 6c 75 65 73 20 63 6f 72 72 65  cid values corre
1b9d0 73 70 6f 6e 64 69 6e 67 20 74 6f 20 72 65 63 6f  sponding to reco
1b9e0 72 64 73 20 69 6e 20 74 68 65 20 0a 20 20 25 5f  rds in the .  %_
1b9f0 63 6f 6e 74 65 6e 74 20 74 61 62 6c 65 20 74 68  content table th
1ba00 61 74 20 63 6f 6e 74 61 69 6e 20 6f 6e 65 20 6f  at contain one o
1ba10 72 20 6d 6f 72 65 20 6f 63 63 75 72 72 65 6e 63  r more occurrenc
1ba20 65 73 20 6f 66 20 74 68 65 20 74 65 72 6d 2e 20  es of the term. 
1ba30 54 6f 0a 20 20 72 65 74 72 69 65 76 65 20 61 6c  To.  retrieve al
1ba40 6c 20 64 6f 63 75 6d 65 6e 74 73 20 74 68 61 74  l documents that
1ba50 20 63 6f 6e 74 61 69 6e 20 61 20 73 70 65 63 69   contain a speci
1ba60 66 69 65 64 20 74 65 72 6d 2c 20 74 68 65 20 46  fied term, the F
1ba70 54 53 20 6d 6f 64 75 6c 65 0a 20 20 71 75 65 72  TS module.  quer
1ba80 69 65 73 20 74 68 69 73 20 69 6e 64 65 78 20 74  ies this index t
1ba90 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20  o determine the 
1baa0 73 65 74 20 6f 66 20 64 6f 63 69 64 20 76 61 6c  set of docid val
1bab0 75 65 73 20 66 6f 72 20 72 65 63 6f 72 64 73 20  ues for records 
1bac0 74 68 61 74 0a 20 20 63 6f 6e 74 61 69 6e 20 74  that.  contain t
1bad0 68 65 20 74 65 72 6d 2c 20 74 68 65 6e 20 72 65  he term, then re
1bae0 74 72 69 65 76 65 73 20 74 68 65 20 72 65 71 75  trieves the requ
1baf0 69 72 65 64 20 64 6f 63 75 6d 65 6e 74 73 20 66  ired documents f
1bb00 72 6f 6d 20 74 68 65 20 25 5f 63 6f 6e 74 65 6e  rom the %_conten
1bb10 74 0a 20 20 74 61 62 6c 65 2e 20 52 65 67 61 72  t.  table. Regar
1bb20 64 6c 65 73 73 20 6f 66 20 74 68 65 20 73 63 68  dless of the sch
1bb30 65 6d 61 20 6f 66 20 74 68 65 20 46 54 53 20 76  ema of the FTS v
1bb40 69 72 74 75 61 6c 20 74 61 62 6c 65 2c 20 74 68  irtual table, th
1bb50 65 20 25 5f 73 65 67 6d 65 6e 74 73 0a 20 20 61  e %_segments.  a
1bb60 6e 64 20 25 5f 73 65 67 64 69 72 20 74 61 62 6c  nd %_segdir tabl
1bb70 65 73 20 61 72 65 20 61 6c 77 61 79 73 20 63 72  es are always cr
1bb80 65 61 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73  eated as follows
1bb90 3a 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20  :..<codeblock>. 
1bba0 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 25 5f   CREATE TABLE %_
1bbb0 73 65 67 6d 65 6e 74 73 28 0a 20 20 20 20 62 6c  segments(.    bl
1bbc0 6f 63 6b 69 64 20 49 4e 54 45 47 45 52 20 50 52  ockid INTEGER PR
1bbd0 49 4d 41 52 59 20 4b 45 59 2c 20 20 20 20 20 20  IMARY KEY,      
1bbe0 20 3c 69 3e 2d 2d 20 42 2d 74 72 65 65 20 6e 6f   <i>-- B-tree no
1bbf0 64 65 20 69 64 3c 2f 69 3e 0a 20 20 20 20 62 6c  de id</i>.    bl
1bc00 6f 63 6b 20 62 6c 6f 62 20 20 20 20 20 20 20 20  ock blob        
1bc10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc20 20 3c 69 3e 2d 2d 20 42 2d 74 72 65 65 20 6e 6f   <i>-- B-tree no
1bc30 64 65 20 64 61 74 61 3c 2f 69 3e 0a 20 20 29 3b  de data</i>.  );
1bc40 0a 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  ..  CREATE TABLE
1bc50 20 25 5f 73 65 67 64 69 72 28 0a 20 20 20 20 6c   %_segdir(.    l
1bc60 65 76 65 6c 20 49 4e 54 45 47 45 52 2c 0a 20 20  evel INTEGER,.  
1bc70 20 20 69 64 78 20 49 4e 54 45 47 45 52 2c 0a 20    idx INTEGER,. 
1bc80 20 20 20 73 74 61 72 74 5f 62 6c 6f 63 6b 20 49     start_block I
1bc90 4e 54 45 47 45 52 2c 20 20 20 20 20 20 20 20 20  NTEGER,         
1bca0 20 20 20 20 20 20 3c 69 3e 2d 2d 20 42 6c 6f 63        <i>-- Bloc
1bcb0 6b 69 64 20 6f 66 20 66 69 72 73 74 20 6e 6f 64  kid of first nod
1bcc0 65 20 69 6e 20 25 5f 73 65 67 6d 65 6e 74 73 3c  e in %_segments<
1bcd0 2f 69 3e 0a 20 20 20 20 6c 65 61 76 65 73 5f 65  /i>.    leaves_e
1bce0 6e 64 5f 62 6c 6f 63 6b 20 49 4e 54 45 47 45 52  nd_block INTEGER
1bcf0 2c 20 20 20 20 20 20 20 20 20 20 3c 69 3e 2d 2d  ,          <i>--
1bd00 20 42 6c 6f 63 6b 69 64 20 6f 66 20 6c 61 73 74   Blockid of last
1bd10 20 6c 65 61 66 20 6e 6f 64 65 20 69 6e 20 25 5f   leaf node in %_
1bd20 73 65 67 6d 65 6e 74 73 3c 2f 69 3e 0a 20 20 20  segments</i>.   
1bd30 20 65 6e 64 5f 62 6c 6f 63 6b 20 49 4e 54 45 47   end_block INTEG
1bd40 45 52 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ER,             
1bd50 20 20 20 20 3c 69 3e 2d 2d 20 42 6c 6f 63 6b 69      <i>-- Blocki
1bd60 64 20 6f 66 20 6c 61 73 74 20 6e 6f 64 65 20 69  d of last node i
1bd70 6e 20 25 5f 73 65 67 6d 65 6e 74 73 3c 2f 69 3e  n %_segments</i>
1bd80 0a 20 20 20 20 72 6f 6f 74 20 42 4c 4f 42 2c 20  .    root BLOB, 
1bd90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bda0 20 20 20 20 20 20 20 20 3c 69 3e 2d 2d 20 42 2d          <i>-- B-
1bdb0 74 72 65 65 20 72 6f 6f 74 20 6e 6f 64 65 3c 2f  tree root node</
1bdc0 69 3e 0a 20 20 20 20 50 52 49 4d 41 52 59 20 4b  i>.    PRIMARY K
1bdd0 45 59 28 6c 65 76 65 6c 2c 20 69 64 78 29 0a 20  EY(level, idx). 
1bde0 20 29 3b 0a 3c 2f 63 6f 64 65 62 6c 6f 63 6b 3e   );.</codeblock>
1bdf0 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 73 63 68 65  ..<p>.  The sche
1be00 6d 61 20 64 65 70 69 63 74 65 64 20 61 62 6f 76  ma depicted abov
1be10 65 20 69 73 20 6e 6f 74 20 64 65 73 69 67 6e 65  e is not designe
1be20 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 66  d to store the f
1be30 75 6c 6c 2d 74 65 78 74 20 69 6e 64 65 78 20 0a  ull-text index .
1be40 20 20 64 69 72 65 63 74 6c 79 2e 20 49 6e 73 74    directly. Inst
1be50 65 61 64 2c 20 69 74 20 69 73 20 75 73 65 64 20  ead, it is used 
1be60 74 6f 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 62  to one or more b
1be70 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65 73  -tree structures
1be80 2e 20 54 68 65 72 65 0a 20 20 69 73 20 6f 6e 65  . There.  is one
1be90 20 62 2d 74 72 65 65 20 66 6f 72 20 65 61 63 68   b-tree for each
1bea0 20 72 6f 77 20 69 6e 20 74 68 65 20 25 5f 73 65   row in the %_se
1beb0 67 64 69 72 20 74 61 62 6c 65 2e 20 54 68 65 20  gdir table. The 
1bec0 25 5f 73 65 67 64 69 72 20 74 61 62 6c 65 0a 20  %_segdir table. 
1bed0 20 72 6f 77 20 63 6f 6e 74 61 69 6e 73 20 74 68   row contains th
1bee0 65 20 72 6f 6f 74 20 6e 6f 64 65 20 61 6e 64 20  e root node and 
1bef0 76 61 72 69 6f 75 73 20 6d 65 74 61 2d 64 61 74  various meta-dat
1bf00 61 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  a associated wit
1bf10 68 20 74 68 65 0a 20 20 62 2d 74 72 65 65 20 73  h the.  b-tree s
1bf20 74 72 75 63 74 75 72 65 2c 20 61 6e 64 20 74 68  tructure, and th
1bf30 65 20 25 5f 73 65 67 6d 65 6e 74 73 20 74 61 62  e %_segments tab
1bf40 6c 65 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20  le contains all 
1bf50 6f 74 68 65 72 20 28 6e 6f 6e 2d 72 6f 6f 74 29  other (non-root)
1bf60 0a 20 20 62 2d 74 72 65 65 20 6e 6f 64 65 73 2e  .  b-tree nodes.
1bf70 20 45 61 63 68 20 62 2d 74 72 65 65 20 69 73 20   Each b-tree is 
1bf80 72 65 66 65 72 72 65 64 20 74 6f 20 61 73 20 61  referred to as a
1bf90 20 22 73 65 67 6d 65 6e 74 22 2e 20 4f 6e 63 65   "segment". Once
1bfa0 20 69 74 20 68 61 73 0a 20 20 62 65 65 6e 20 63   it has.  been c
1bfb0 72 65 61 74 65 64 2c 20 61 20 73 65 67 6d 65 6e  reated, a segmen
1bfc0 74 20 62 2d 74 72 65 65 20 69 73 20 6e 65 76 65  t b-tree is neve
1bfd0 72 20 75 70 64 61 74 65 64 20 28 61 6c 74 68 6f  r updated (altho
1bfe0 75 67 68 20 69 74 20 6d 61 79 20 62 65 0a 20 20  ugh it may be.  
1bff0 64 65 6c 65 74 65 64 20 61 6c 74 6f 67 65 74 68  deleted altogeth
1c000 65 72 29 2e 0a 0a 3c 70 3e 0a 20 20 54 68 65 20  er)...<p>.  The 
1c010 6b 65 79 73 20 75 73 65 64 20 62 79 20 65 61 63  keys used by eac
1c020 68 20 73 65 67 6d 65 6e 74 20 62 2d 74 72 65 65  h segment b-tree
1c030 20 61 72 65 20 74 65 72 6d 73 20 28 77 6f 72 64   are terms (word
1c040 73 29 2e 20 41 73 20 77 65 6c 6c 20 61 73 20 74  s). As well as t
1c050 68 65 0a 20 20 6b 65 79 2c 20 65 61 63 68 20 73  he.  key, each s
1c060 65 67 6d 65 6e 74 20 62 2d 74 72 65 65 20 65 6e  egment b-tree en
1c070 74 72 79 20 68 61 73 20 61 6e 20 61 73 73 6f 63  try has an assoc
1c080 69 61 74 65 64 20 22 64 6f 63 6c 69 73 74 22 20  iated "doclist" 
1c090 28 64 6f 63 75 6d 65 6e 74 20 6c 69 73 74 29 2e  (document list).
1c0a0 0a 20 20 41 20 64 6f 63 6c 69 73 74 20 63 6f 6e  .  A doclist con
1c0b0 73 69 73 74 73 20 6f 66 20 7a 65 72 6f 20 6f 72  sists of zero or
1c0c0 20 6d 6f 72 65 20 65 6e 74 72 69 65 73 2c 20 77   more entries, w
1c0d0 68 65 72 65 20 65 61 63 68 20 65 6e 74 72 79 20  here each entry 
1c0e0 63 6f 6e 73 69 73 74 73 20 6f 66 3a 0a 0a 3c 75  consists of:..<u
1c0f0 6c 3e 0a 20 20 3c 6c 69 3e 20 41 20 64 6f 63 69  l>.  <li> A doci
1c100 64 20 28 64 6f 63 75 6d 65 6e 74 20 69 64 29 2c  d (document id),
1c110 20 61 6e 64 0a 20 20 3c 6c 69 3e 20 41 20 6c 69   and.  <li> A li
1c120 73 74 20 6f 66 20 74 65 72 6d 20 6f 66 66 73 65  st of term offse
1c130 74 73 2c 20 6f 6e 65 20 66 6f 72 20 65 61 63 68  ts, one for each
1c140 20 6f 63 63 75 72 72 65 6e 63 65 20 6f 66 20 74   occurrence of t
1c150 68 65 20 74 65 72 6d 20 77 69 74 68 69 6e 0a 20  he term within. 
1c160 20 20 20 20 20 20 74 68 65 20 64 6f 63 75 6d 65        the docume
1c170 6e 74 2e 20 41 20 74 65 72 6d 20 6f 66 66 73 65  nt. A term offse
1c180 74 20 69 6e 64 69 63 61 74 65 73 20 74 68 65 20  t indicates the 
1c190 6e 75 6d 62 65 72 20 6f 66 20 74 6f 6b 65 6e 73  number of tokens
1c1a0 20 28 77 6f 72 64 73 29 0a 20 20 20 20 20 20 20   (words).       
1c1b0 74 68 61 74 20 6f 63 63 75 72 20 62 65 66 6f 72  that occur befor
1c1c0 65 20 74 68 65 20 74 65 72 6d 20 69 6e 20 71 75  e the term in qu
1c1d0 65 73 74 69 6f 6e 2c 20 6e 6f 74 20 74 68 65 20  estion, not the 
1c1e0 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63  number of charac
1c1f0 74 65 72 73 0a 20 20 20 20 20 20 20 6f 72 20 62  ters.       or b
1c200 79 74 65 73 2e 20 46 6f 72 20 65 78 61 6d 70 6c  ytes. For exampl
1c210 65 2c 20 74 68 65 20 74 65 72 6d 20 6f 66 66 73  e, the term offs
1c220 65 74 20 6f 66 20 74 68 65 20 74 65 72 6d 20 22  et of the term "
1c230 77 61 72 22 20 69 6e 20 74 68 65 0a 20 20 20 20  war" in the.    
1c240 20 20 20 70 68 72 61 73 65 20 22 41 6e 63 65 73     phrase "Ances
1c250 74 72 61 6c 20 76 6f 69 63 65 73 20 70 72 6f 70  tral voices prop
1c260 68 65 73 79 69 6e 67 20 77 61 72 21 22 20 69 73  hesying war!" is
1c270 20 33 2e 0a 3c 2f 75 6c 3e 0a 0a 3c 70 3e 0a 20   3..</ul>..<p>. 
1c280 20 45 6e 74 72 69 65 73 20 77 69 74 68 69 6e 20   Entries within 
1c290 61 20 64 6f 63 6c 69 73 74 20 61 72 65 20 73 6f  a doclist are so
1c2a0 72 74 65 64 20 62 79 20 64 6f 63 69 64 2e 20 50  rted by docid. P
1c2b0 6f 73 69 74 69 6f 6e 73 20 77 69 74 68 69 6e 20  ositions within 
1c2c0 61 20 64 6f 63 6c 69 73 74 0a 20 20 65 6e 74 72  a doclist.  entr
1c2d0 79 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20  y are stored in 
1c2e0 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e  ascending order.
1c2f0 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 63 6f 6e 74  ..<p>.  The cont
1c300 65 6e 74 73 20 6f 66 20 74 68 65 20 6c 6f 67 69  ents of the logi
1c310 63 61 6c 20 66 75 6c 6c 2d 74 65 78 74 20 69 6e  cal full-text in
1c320 64 65 78 20 69 73 20 66 6f 75 6e 64 20 62 79 20  dex is found by 
1c330 6d 65 72 67 69 6e 67 20 74 68 65 0a 20 20 63 6f  merging the.  co
1c340 6e 74 65 6e 74 73 20 6f 66 20 61 6c 6c 20 73 65  ntents of all se
1c350 67 6d 65 6e 74 20 62 2d 74 72 65 65 73 2e 20 49  gment b-trees. I
1c360 66 20 61 20 74 65 72 6d 20 69 73 20 70 72 65 73  f a term is pres
1c370 65 6e 74 20 69 6e 20 6d 6f 72 65 20 74 68 61 6e  ent in more than
1c380 20 6f 6e 65 0a 20 20 73 65 67 6d 65 6e 74 20 62   one.  segment b
1c390 2d 74 72 65 65 2c 20 74 68 65 6e 20 69 74 20 6d  -tree, then it m
1c3a0 61 70 73 20 74 6f 20 74 68 65 20 75 6e 69 6f 6e  aps to the union
1c3b0 20 6f 66 20 65 61 63 68 20 69 6e 64 69 76 69 64   of each individ
1c3c0 75 61 6c 20 64 6f 63 6c 69 73 74 2e 20 49 66 2c  ual doclist. If,
1c3d0 0a 20 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20  .  for a single 
1c3e0 74 65 72 6d 2c 20 74 68 65 20 73 61 6d 65 20 64  term, the same d
1c3f0 6f 63 69 64 20 6f 63 63 75 72 73 20 69 6e 20 6d  ocid occurs in m
1c400 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 64 6f 63  ore than one doc
1c410 6c 69 73 74 2c 20 74 68 65 6e 20 6f 6e 6c 79 0a  list, then only.
1c420 20 20 74 68 65 20 64 6f 63 6c 69 73 74 20 74 68    the doclist th
1c430 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 74 68  at is part of th
1c440 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
1c450 63 72 65 61 74 65 64 20 73 65 67 6d 65 6e 74 20  created segment 
1c460 62 2d 74 72 65 65 20 69 73 20 0a 20 20 63 6f 6e  b-tree is .  con
1c470 73 69 64 65 72 65 64 20 76 61 6c 69 64 2e 20 0a  sidered valid. .
1c480 0a 3c 70 3e 0a 20 20 4d 75 6c 74 69 70 6c 65 20  .<p>.  Multiple 
1c490 62 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65  b-tree structure
1c4a0 73 20 61 72 65 20 75 73 65 64 20 69 6e 73 74 65  s are used inste
1c4b0 61 64 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 62  ad of a single b
1c4c0 2d 74 72 65 65 20 74 6f 20 72 65 64 75 63 65 0a  -tree to reduce.
1c4d0 20 20 74 68 65 20 63 6f 73 74 20 6f 66 20 69 6e    the cost of in
1c4e0 73 65 72 74 69 6e 67 20 72 65 63 6f 72 64 73 20  serting records 
1c4f0 69 6e 74 6f 20 46 54 53 20 74 61 62 6c 65 73 2e  into FTS tables.
1c500 20 57 68 65 6e 20 61 20 6e 65 77 20 72 65 63 6f   When a new reco
1c510 72 64 20 69 73 20 0a 20 20 69 6e 73 65 72 74 65  rd is .  inserte
1c520 64 20 69 6e 74 6f 20 61 6e 20 46 54 53 20 74 61  d into an FTS ta
1c530 62 6c 65 20 74 68 61 74 20 61 6c 72 65 61 64 79  ble that already
1c540 20 63 6f 6e 74 61 69 6e 73 20 61 20 6c 6f 74 20   contains a lot 
1c550 6f 66 20 64 61 74 61 2c 20 69 74 20 69 73 0a 20  of data, it is. 
1c560 20 6c 69 6b 65 6c 79 20 74 68 61 74 20 6d 61 6e   likely that man
1c570 79 20 6f 66 20 74 68 65 20 74 65 72 6d 73 20 69  y of the terms i
1c580 6e 20 74 68 65 20 6e 65 77 20 72 65 63 6f 72 64  n the new record
1c590 20 61 72 65 20 61 6c 72 65 61 64 79 20 70 72 65   are already pre
1c5a0 73 65 6e 74 20 69 6e 0a 20 20 61 20 6c 61 72 67  sent in.  a larg
1c5b0 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 78 69 73  e number of exis
1c5c0 74 69 6e 67 20 72 65 63 6f 72 64 73 2e 20 49 66  ting records. If
1c5d0 20 61 20 73 69 6e 67 6c 65 20 62 2d 74 72 65 65   a single b-tree
1c5e0 20 77 65 72 65 20 75 73 65 64 2c 20 74 68 65 6e   were used, then
1c5f0 0a 20 20 6c 61 72 67 65 20 64 6f 63 6c 69 73 74  .  large doclist
1c600 20 73 74 72 75 63 74 75 72 65 73 20 77 6f 75 6c   structures woul
1c610 64 20 68 61 76 65 20 74 6f 20 62 65 20 6c 6f 61  d have to be loa
1c620 64 65 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ded from the dat
1c630 61 62 61 73 65 2c 0a 20 20 61 6d 65 6e 64 65 64  abase,.  amended
1c640 20 74 6f 20 69 6e 63 6c 75 64 65 20 74 68 65 20   to include the 
1c650 6e 65 77 20 64 6f 63 69 64 20 61 6e 64 20 74 65  new docid and te
1c660 72 6d 2d 6f 66 66 73 65 74 20 6c 69 73 74 2c 20  rm-offset list, 
1c670 74 68 65 6e 20 77 72 69 74 74 65 6e 20 62 61 63  then written bac
1c680 6b 0a 20 20 74 6f 20 74 68 65 20 64 61 74 61 62  k.  to the datab
1c690 61 73 65 2e 20 55 73 69 6e 67 20 6d 75 6c 74 69  ase. Using multi
1c6a0 70 6c 65 20 62 2d 74 72 65 65 20 74 61 62 6c 65  ple b-tree table
1c6b0 73 20 61 6c 6c 6f 77 73 20 74 68 69 73 20 74 6f  s allows this to
1c6c0 20 62 65 20 61 76 6f 69 64 65 64 0a 20 20 62 79   be avoided.  by
1c6d0 20 63 72 65 61 74 69 6e 67 20 61 20 6e 65 77 20   creating a new 
1c6e0 62 2d 74 72 65 65 20 77 68 69 63 68 20 63 61 6e  b-tree which can
1c6f0 20 62 65 20 6d 65 72 67 65 64 20 77 69 74 68 20   be merged with 
1c700 74 68 65 20 65 78 69 73 74 69 6e 67 20 62 2d 74  the existing b-t
1c710 72 65 65 0a 20 20 28 6f 72 20 62 2d 74 72 65 65  ree.  (or b-tree
1c720 73 29 20 6c 61 74 65 72 20 6f 6e 2e 20 4d 65 72  s) later on. Mer
1c730 67 69 6e 67 20 6f 66 20 62 2d 74 72 65 65 20 73  ging of b-tree s
1c740 74 72 75 63 74 75 72 65 73 20 63 61 6e 20 62 65  tructures can be
1c750 20 70 65 72 66 6f 72 6d 65 64 20 61 73 0a 20 20   performed as.  
1c760 61 20 62 61 63 6b 67 72 6f 75 6e 64 20 74 61 73  a background tas
1c770 6b 2c 20 6f 72 20 6f 6e 63 65 20 61 20 63 65 72  k, or once a cer
1c780 74 61 69 6e 20 6e 75 6d 62 65 72 20 6f 66 20 73  tain number of s
1c790 65 70 61 72 61 74 65 20 62 2d 74 72 65 65 20 73  eparate b-tree s
1c7a0 74 72 75 63 74 75 72 65 73 0a 20 20 68 61 76 65  tructures.  have
1c7b0 20 62 65 65 6e 20 61 63 63 75 6d 75 6c 61 74 65   been accumulate
1c7c0 64 2e 20 4f 66 20 63 6f 75 72 73 65 2c 20 74 68  d. Of course, th
1c7d0 69 73 20 73 63 68 65 6d 65 20 6d 61 6b 65 73 20  is scheme makes 
1c7e0 71 75 65 72 69 65 73 20 6d 6f 72 65 20 65 78 70  queries more exp
1c7f0 65 6e 73 69 76 65 0a 20 20 28 61 73 20 74 68 65  ensive.  (as the
1c800 20 46 54 53 20 63 6f 64 65 20 6d 61 79 20 68 61   FTS code may ha
1c810 76 65 20 74 6f 20 6c 6f 6f 6b 20 75 70 20 69 6e  ve to look up in
1c820 64 69 76 69 64 75 61 6c 20 74 65 72 6d 73 20 69  dividual terms i
1c830 6e 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 0a  n more than one.
1c840 20 20 62 2d 74 72 65 65 20 61 6e 64 20 6d 65 72    b-tree and mer
1c850 67 65 20 74 68 65 20 72 65 73 75 6c 74 73 29 2c  ge the results),
1c860 20 62 75 74 20 69 74 20 68 61 73 20 62 65 65 6e   but it has been
1c870 20 66 6f 75 6e 64 20 74 68 61 74 20 69 6e 20 70   found that in p
1c880 72 61 63 74 69 63 65 20 74 68 69 73 0a 20 20 6f  ractice this.  o
1c890 76 65 72 68 65 61 64 20 69 73 20 6f 66 74 65 6e  verhead is often
1c8a0 20 6e 65 67 6c 69 67 69 62 6c 65 2e 0a 20 20 0a   negligible..  .
1c8b0 3c 68 32 3e 56 61 72 69 61 62 6c 65 20 4c 65 6e  <h2>Variable Len
1c8c0 67 74 68 20 49 6e 74 65 67 65 72 20 28 76 61 72  gth Integer (var
1c8d0 69 6e 74 29 20 46 6f 72 6d 61 74 3c 2f 68 32 3e  int) Format</h2>
1c8e0 0a 0a 3c 70 3e 0a 20 20 49 6e 74 65 67 65 72 20  ..<p>.  Integer 
1c8f0 76 61 6c 75 65 73 20 73 74 6f 72 65 64 20 61 73  values stored as
1c900 20 70 61 72 74 20 6f 66 20 73 65 67 6d 65 6e 74   part of segment
1c910 20 62 2d 74 72 65 65 20 6e 6f 64 65 73 20 61 72   b-tree nodes ar
1c920 65 20 65 6e 63 6f 64 65 64 20 75 73 69 6e 67 20  e encoded using 
1c930 74 68 65 0a 20 20 46 54 53 20 76 61 72 69 6e 74  the.  FTS varint
1c940 20 66 6f 72 6d 61 74 2e 20 54 68 69 73 20 65 6e   format. This en
1c950 63 6f 64 69 6e 67 20 69 73 20 73 69 6d 69 6c 61  coding is simila
1c960 72 2c 20 62 75 74 20 3c 62 3e 6e 6f 74 20 69 64  r, but <b>not id
1c970 65 6e 74 69 63 61 6c 3c 2f 62 3e 2c 20 74 6f 0a  entical</b>, to.
1c980 20 20 74 68 65 20 3c 61 20 68 72 65 66 3d 22 66    the <a href="f
1c990 69 6c 65 66 6f 72 6d 61 74 2e 68 74 6d 6c 23 76  ileformat.html#v
1c9a0 61 72 69 6e 74 5f 66 6f 72 6d 61 74 22 3e 53 51  arint_format">SQ
1c9b0 4c 69 74 65 20 76 61 72 69 6e 74 20 66 6f 72 6d  Lite varint form
1c9c0 61 74 3c 2f 61 3e 2e 0a 0a 3c 70 3e 0a 20 20 41  at</a>...<p>.  A
1c9d0 6e 20 65 6e 63 6f 64 65 64 20 46 54 53 20 76 61  n encoded FTS va
1c9e0 72 69 6e 74 20 63 6f 6e 73 75 6d 65 73 20 62 65  rint consumes be
1c9f0 74 77 65 65 6e 20 6f 6e 65 20 61 6e 64 20 74 65  tween one and te
1ca00 6e 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65  n bytes of space
1ca10 2e 20 54 68 65 0a 20 20 6e 75 6d 62 65 72 20 6f  . The.  number o
1ca20 66 20 62 79 74 65 73 20 72 65 71 75 69 72 65 64  f bytes required
1ca30 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62   is determined b
1ca40 79 20 74 68 65 20 73 69 67 6e 20 61 6e 64 20 6d  y the sign and m
1ca50 61 67 6e 69 74 75 64 65 20 6f 66 20 74 68 65 0a  agnitude of the.
1ca60 20 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20    integer value 
1ca70 65 6e 63 6f 64 65 64 2e 20 4d 6f 72 65 20 61 63  encoded. More ac
1ca80 63 75 72 61 74 65 6c 79 2c 20 74 68 65 20 6e 75  curately, the nu
1ca90 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 75 73  mber of bytes us
1caa0 65 64 20 74 6f 20 73 74 6f 72 65 0a 20 20 74 68  ed to store.  th
1cab0 65 20 65 6e 63 6f 64 65 64 20 69 6e 74 65 67 65  e encoded intege
1cac0 72 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65  r depends on the
1cad0 20 70 6f 73 69 74 69 6f 6e 20 6f 66 20 74 68 65   position of the
1cae0 20 6d 6f 73 74 20 73 69 67 6e 69 66 69 63 61 6e   most significan
1caf0 74 20 73 65 74 20 62 69 74 0a 20 20 69 6e 20 74  t set bit.  in t
1cb00 68 65 20 36 34 2d 62 69 74 20 74 77 6f 73 2d 63  he 64-bit twos-c
1cb10 6f 6d 70 6c 65 6d 65 6e 74 20 72 65 70 72 65 73  omplement repres
1cb20 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
1cb30 69 6e 74 65 67 65 72 20 76 61 6c 75 65 2e 20 4e  integer value. N
1cb40 65 67 61 74 69 76 65 0a 20 20 76 61 6c 75 65 73  egative.  values
1cb50 20 61 6c 77 61 79 73 20 68 61 76 65 20 74 68 65   always have the
1cb60 20 6d 6f 73 74 20 73 69 67 6e 69 66 69 63 61 6e   most significan
1cb70 74 20 62 69 74 20 73 65 74 20 28 74 68 65 20 73  t bit set (the s
1cb80 69 67 6e 20 62 69 74 29 2c 20 61 6e 64 20 73 6f  ign bit), and so
1cb90 20 61 72 65 0a 20 20 61 6c 77 61 79 73 20 73 74   are.  always st
1cba0 6f 72 65 64 20 75 73 69 6e 67 20 74 68 65 20 66  ored using the f
1cbb0 75 6c 6c 20 74 65 6e 20 62 79 74 65 73 2e 20 50  ull ten bytes. P
1cbc0 6f 73 69 74 69 76 65 20 69 6e 74 65 67 65 72 20  ositive integer 
1cbd0 76 61 6c 75 65 73 20 6d 61 79 20 62 65 0a 20 20  values may be.  
1cbe0 73 74 6f 72 65 64 20 75 73 69 6e 67 20 6c 65 73  stored using les
1cbf0 73 20 73 70 61 63 65 2e 0a 0a 3c 70 3e 0a 20 20  s space...<p>.  
1cc00 54 68 65 20 66 69 6e 61 6c 20 62 79 74 65 20 6f  The final byte o
1cc10 66 20 61 6e 20 65 6e 63 6f 64 65 64 20 46 54 53  f an encoded FTS
1cc20 20 76 61 72 69 6e 74 20 68 61 73 20 69 74 73 20   varint has its 
1cc30 6d 6f 73 74 20 73 69 67 6e 69 66 69 63 61 6e 74  most significant
1cc40 20 62 69 74 20 0a 20 20 63 6c 65 61 72 65 64 2e   bit .  cleared.
1cc50 20 41 6c 6c 20 70 72 65 63 65 64 69 6e 67 20 62   All preceding b
1cc60 79 74 65 73 20 68 61 76 65 20 74 68 65 20 6d 6f  ytes have the mo
1cc70 73 74 20 73 69 67 6e 69 66 69 63 61 6e 74 20 62  st significant b
1cc80 69 74 20 73 65 74 2e 20 44 61 74 61 0a 20 20 69  it set. Data.  i
1cc90 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  s stored in the 
1cca0 72 65 6d 61 69 6e 69 6e 67 20 73 65 76 65 6e 20  remaining seven 
1ccb0 6c 65 61 73 74 20 73 69 67 6e 69 66 69 63 61 6e  least significan
1ccc0 74 20 62 69 74 73 20 6f 66 20 65 61 63 68 20 62  t bits of each b
1ccd0 79 74 65 2e 0a 20 20 54 68 65 20 66 69 72 73 74  yte..  The first
1cce0 20 62 79 74 65 20 6f 66 20 74 68 65 20 65 6e 63   byte of the enc
1ccf0 6f 64 65 64 20 72 65 70 72 65 73 65 6e 74 61 74  oded representat
1cd00 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  ion contains the
1cd10 20 6c 65 61 73 74 20 73 69 67 6e 69 66 69 63 61   least significa
1cd20 6e 74 0a 20 20 73 65 76 65 6e 20 62 69 74 73 20  nt.  seven bits 
1cd30 6f 66 20 74 68 65 20 65 6e 63 6f 64 65 64 20 69  of the encoded i
1cd40 6e 74 65 67 65 72 20 76 61 6c 75 65 2e 20 54 68  nteger value. Th
1cd50 65 20 73 65 63 6f 6e 64 20 62 79 74 65 20 6f 66  e second byte of
1cd60 20 74 68 65 20 65 6e 63 6f 64 65 64 0a 20 20 72   the encoded.  r
1cd70 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 2c 20 69  epresentation, i
1cd80 66 20 69 74 20 69 73 20 70 72 65 73 65 6e 74 2c  f it is present,
1cd90 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 73 65   contains the se
1cda0 76 65 6e 20 6e 65 78 74 20 6c 65 61 73 74 20 73  ven next least s
1cdb0 69 67 6e 69 66 69 63 61 6e 74 0a 20 20 62 69 74  ignificant.  bit
1cdc0 73 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72  s of the integer
1cdd0 20 76 61 6c 75 65 2c 20 61 6e 64 20 73 6f 20 6f   value, and so o
1cde0 6e 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  n. The following
1cdf0 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20   table contains 
1ce00 65 78 61 6d 70 6c 65 73 0a 20 20 6f 66 20 65 6e  examples.  of en
1ce10 63 6f 64 65 64 20 69 6e 74 65 67 65 72 20 76 61  coded integer va
1ce20 6c 75 65 73 3a 0a 0a 3c 74 61 62 6c 65 20 73 74  lues:..<table st
1ce30 72 69 70 65 64 3d 31 3e 0a 20 20 3c 74 72 3e 3c  riped=1>.  <tr><
1ce40 74 68 3e 44 65 63 69 6d 61 6c 3c 74 68 3e 48 65  th>Decimal<th>He
1ce50 78 61 64 65 63 69 6d 61 6c 3c 74 68 20 77 69 64  xadecimal<th wid
1ce60 74 68 3d 31 30 30 25 3e 45 6e 63 6f 64 65 64 20  th=100%>Encoded 
1ce70 52 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 0a 20  Representation. 
1ce80 20 3c 74 72 3e 3c 74 64 3e 34 33 3c 74 64 3e 30   <tr><td>43<td>0
1ce90 78 30 30 30 30 30 30 30 30 30 30 30 30 30 30 32  x000000000000002
1cea0 42 3c 74 64 3e 30 78 32 42 20 0a 20 20 3c 74 72  B<td>0x2B .  <tr
1ceb0 3e 3c 74 64 3e 32 30 30 38 31 35 3c 74 64 3e 30  ><td>200815<td>0
1cec0 78 30 30 30 30 30 30 30 30 30 30 30 33 31 30 36  x000000000003106
1ced0 46 3c 74 64 3e 30 78 39 43 20 30 78 41 30 20 30  F<td>0x9C 0xA0 0
1cee0 78 30 43 0a 20 20 3c 74 72 3e 3c 74 64 3e 2d 31  x0C.  <tr><td>-1
1cef0 3c 74 64 3e 30 78 46 46 46 46 46 46 46 46 46 46  <td>0xFFFFFFFFFF
1cf00 46 46 46 46 46 46 3c 74 64 3e 30 78 46 46 20 30  FFFFFF<td>0xFF 0
1cf10 78 46 46 20 30 78 46 46 20 30 78 46 46 20 30 78  xFF 0xFF 0xFF 0x
1cf20 46 46 20 30 78 46 46 20 30 78 46 46 20 30 78 46  FF 0xFF 0xFF 0xF
1cf30 46 20 30 78 46 46 20 30 78 30 31 0a 3c 2f 74 61  F 0xFF 0x01.</ta
1cf40 62 6c 65 3e 0a 20 20 0a 0a 3c 68 32 3e 53 65 67  ble>.  ..<h2>Seg
1cf50 6d 65 6e 74 20 42 2d 54 72 65 65 20 46 6f 72 6d  ment B-Tree Form
1cf60 61 74 3c 2f 68 32 3e 0a 0a 3c 70 3e 0a 20 20 53  at</h2>..<p>.  S
1cf70 65 67 6d 65 6e 74 20 62 2d 74 72 65 65 73 20 61  egment b-trees a
1cf80 72 65 20 70 72 65 66 69 78 2d 63 6f 6d 70 72 65  re prefix-compre
1cf90 73 73 65 64 20 62 2b 2d 74 72 65 65 73 2e 20 54  ssed b+-trees. T
1cfa0 68 65 72 65 20 69 73 20 6f 6e 65 20 73 65 67 6d  here is one segm
1cfb0 65 6e 74 20 62 2d 74 72 65 65 0a 20 20 66 6f 72  ent b-tree.  for
1cfc0 20 65 61 63 68 20 72 6f 77 20 69 6e 20 74 68 65   each row in the
1cfd0 20 25 5f 73 65 67 64 69 72 20 74 61 62 6c 65 20   %_segdir table 
1cfe0 28 73 65 65 20 61 62 6f 76 65 29 2e 20 54 68 65  (see above). The
1cff0 20 72 6f 6f 74 20 6e 6f 64 65 20 6f 66 20 74 68   root node of th
1d000 65 20 73 65 67 6d 65 6e 74 0a 20 20 62 2d 74 72  e segment.  b-tr
1d010 65 65 20 69 73 20 73 74 6f 72 65 64 20 61 73 20  ee is stored as 
1d020 61 20 62 6c 6f 62 20 69 6e 20 74 68 65 20 22 72  a blob in the "r
1d030 6f 6f 74 22 20 66 69 65 6c 64 20 6f 66 20 74 68  oot" field of th
1d040 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
1d050 72 6f 77 0a 20 20 6f 66 20 74 68 65 20 25 5f 73  row.  of the %_s
1d060 65 67 64 69 72 20 74 61 62 6c 65 2e 20 41 6c 6c  egdir table. All
1d070 20 6f 74 68 65 72 20 6e 6f 64 65 73 20 28 69 66   other nodes (if
1d080 20 61 6e 79 20 65 78 69 73 74 29 20 61 72 65 20   any exist) are 
1d090 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 0a 20  stored in the . 
1d0a0 20 22 62 6c 6f 62 22 20 63 6f 6c 75 6d 6e 20 6f   "blob" column o
1d0b0 66 20 74 68 65 20 25 5f 73 65 67 6d 65 6e 74 73  f the %_segments
1d0c0 20 74 61 62 6c 65 2e 20 4e 6f 64 65 73 20 77 69   table. Nodes wi
1d0d0 74 68 69 6e 20 74 68 65 20 25 5f 73 65 67 6d 65  thin the %_segme
1d0e0 6e 74 73 20 74 61 62 6c 65 20 61 72 65 0a 20 20  nts table are.  
1d0f0 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 74 68  identified by th
1d100 65 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20  e integer value 
1d110 69 6e 20 74 68 65 20 62 6c 6f 63 6b 69 64 20 66  in the blockid f
1d120 69 65 6c 64 20 6f 66 20 74 68 65 20 63 6f 72 72  ield of the corr
1d130 65 73 70 6f 6e 64 69 6e 67 0a 20 20 72 6f 77 2e  esponding.  row.
1d140 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   The following t
1d150 61 62 6c 65 20 64 65 73 63 72 69 62 65 73 20 74  able describes t
1d160 68 65 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65  he fields of the
1d170 20 25 5f 73 65 67 64 69 72 20 74 61 62 6c 65 3a   %_segdir table:
1d180 0a 0a 3c 74 61 62 6c 65 20 73 74 72 69 70 65 64  ..<table striped
1d190 3d 31 3e 0a 20 20 3c 74 72 3e 3c 74 68 3e 43 6f  =1>.  <tr><th>Co
1d1a0 6c 75 6d 6e 20 20 20 20 20 20 20 20 20 20 20 3c  lumn           <
1d1b0 74 68 20 77 69 64 74 68 3d 31 30 30 25 3e 49 6e  th width=100%>In
1d1c0 74 65 72 70 72 65 74 61 74 69 6f 6e 0a 20 20 3c  terpretation.  <
1d1d0 74 72 3e 3c 74 64 3e 6c 65 76 65 6c 20 20 20 20  tr><td>level    
1d1e0 20 20 20 20 20 20 20 20 3c 74 64 3e 20 0a 20 20          <td> .  
1d1f0 20 20 42 65 74 77 65 65 6e 20 74 68 65 6d 2c 20    Between them, 
1d200 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
1d210 74 68 65 20 22 6c 65 76 65 6c 22 20 61 6e 64 20  the "level" and 
1d220 22 69 64 78 22 20 66 69 65 6c 64 73 20 64 65 66  "idx" fields def
1d230 69 6e 65 20 74 68 65 0a 20 20 20 20 72 65 6c 61  ine the.    rela
1d240 74 69 76 65 20 61 67 65 20 6f 66 20 74 68 65 20  tive age of the 
1d250 73 65 67 6d 65 6e 74 20 62 2d 74 72 65 65 2e 20  segment b-tree. 
1d260 54 68 65 20 73 6d 61 6c 6c 65 72 20 74 68 65 20  The smaller the 
1d270 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20  value stored in 
1d280 74 68 65 0a 20 20 20 20 22 6c 65 76 65 6c 22 20  the.    "level" 
1d290 66 69 65 6c 64 2c 20 74 68 65 20 6d 6f 72 65 20  field, the more 
1d2a0 72 65 63 65 6e 74 6c 79 20 74 68 65 20 73 65 67  recently the seg
1d2b0 6d 65 6e 74 20 62 2d 74 72 65 65 20 77 61 73 20  ment b-tree was 
1d2c0 63 72 65 61 74 65 64 2e 20 49 66 20 74 77 6f 0a  created. If two.
1d2d0 20 20 20 20 73 65 67 6d 65 6e 74 20 62 2d 74 72      segment b-tr
1d2e0 65 65 73 20 61 72 65 20 6f 66 20 74 68 65 20 73  ees are of the s
1d2f0 61 6d 65 20 22 6c 65 76 65 6c 22 2c 20 74 68 65  ame "level", the
1d300 20 73 65 67 6d 65 6e 74 20 77 69 74 68 20 74 68   segment with th
1d310 65 20 6c 61 72 67 65 72 0a 20 20 20 20 76 61 6c  e larger.    val
1d320 75 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  ue stored in the
1d330 20 22 69 64 78 22 20 63 6f 6c 75 6d 6e 20 69 73   "idx" column is
1d340 20 6d 6f 72 65 20 72 65 63 65 6e 74 2e 20 54 68   more recent. Th
1d350 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f  e PRIMARY KEY co
1d360 6e 73 74 72 61 69 6e 74 0a 20 20 20 20 6f 6e 20  nstraint.    on 
1d370 74 68 65 20 25 5f 73 65 67 64 69 72 20 74 61 62  the %_segdir tab
1d380 6c 65 20 70 72 65 76 65 6e 74 73 20 61 6e 79 20  le prevents any 
1d390 74 77 6f 20 73 65 67 6d 65 6e 74 73 20 66 72 6f  two segments fro
1d3a0 6d 20 68 61 76 69 6e 67 20 74 68 65 20 73 61 6d  m having the sam
1d3b0 65 20 76 61 6c 75 65 0a 20 20 20 20 66 6f 72 20  e value.    for 
1d3c0 62 6f 74 68 20 74 68 65 20 22 6c 65 76 65 6c 22  both the "level"
1d3d0 20 61 6e 64 20 22 69 64 78 22 20 66 69 65 6c 64   and "idx" field
1d3e0 73 2e 0a 20 20 3c 74 72 3e 3c 74 64 3e 69 64 78  s..  <tr><td>idx
1d3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3c 74                <t
1d400 64 3e 20 53 65 65 20 61 62 6f 76 65 2e 0a 20 20  d> See above..  
1d410 3c 74 72 3e 3c 74 64 3e 73 74 61 72 74 5f 62 6c  <tr><td>start_bl
1d420 6f 63 6b 20 20 20 20 20 20 3c 74 64 3e 0a 20 20  ock      <td>.  
1d430 20 20 54 68 65 20 62 6c 6f 63 6b 69 64 20 74 68    The blockid th
1d440 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74  at corresponds t
1d450 6f 20 74 68 65 20 6e 6f 64 65 20 77 69 74 68 20  o the node with 
1d460 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 62 6c 6f  the smallest blo
1d470 63 6b 69 64 20 74 68 61 74 20 0a 20 20 20 20 62  ckid that .    b
1d480 65 6c 6f 6e 67 73 20 74 6f 20 74 68 69 73 20 73  elongs to this s
1d490 65 67 6d 65 6e 74 20 62 2d 74 72 65 65 2e 20 4f  egment b-tree. O
1d4a0 72 20 7a 65 72 6f 20 69 66 20 74 68 65 20 65 6e  r zero if the en
1d4b0 74 69 72 65 20 73 65 67 6d 65 6e 74 20 62 2d 74  tire segment b-t
1d4c0 72 65 65 0a 20 20 20 20 66 69 74 73 20 6f 6e 20  ree.    fits on 
1d4d0 74 68 65 20 72 6f 6f 74 20 6e 6f 64 65 2e 20 49  the root node. I
1d4e0 66 20 69 74 20 65 78 69 73 74 73 2c 20 74 68 69  f it exists, thi
1d4f0 73 20 6e 6f 64 65 20 69 73 20 61 6c 77 61 79 73  s node is always
1d500 20 61 20 6c 65 61 66 20 6e 6f 64 65 2e 0a 20 20   a leaf node..  
1d510 3c 74 72 3e 3c 74 64 3e 6c 65 61 76 65 73 5f 65  <tr><td>leaves_e
1d520 6e 64 5f 62 6c 6f 63 6b 20 3c 74 64 3e 0a 20 20  nd_block <td>.  
1d530 20 20 54 68 65 20 62 6c 6f 63 6b 69 64 20 74 68    The blockid th
1d540 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74  at corresponds t
1d550 6f 20 74 68 65 20 6c 65 61 66 20 6e 6f 64 65 20  o the leaf node 
1d560 77 69 74 68 20 74 68 65 20 6c 61 72 67 65 73 74  with the largest
1d570 20 62 6c 6f 63 6b 69 64 20 0a 20 20 20 20 74 68   blockid .    th
1d580 61 74 20 62 65 6c 6f 6e 67 73 20 74 6f 20 74 68  at belongs to th
1d590 69 73 20 73 65 67 6d 65 6e 74 20 62 2d 74 72 65  is segment b-tre
1d5a0 65 2e 20 4f 72 20 7a 65 72 6f 20 69 66 20 74 68  e. Or zero if th
1d5b0 65 20 65 6e 74 69 72 65 20 73 65 67 6d 65 6e 74  e entire segment
1d5c0 20 62 2d 74 72 65 65 0a 20 20 20 20 66 69 74 73   b-tree.    fits
1d5d0 20 6f 6e 20 74 68 65 20 72 6f 6f 74 20 6e 6f 64   on the root nod
1d5e0 65 2e 0a 20 20 3c 74 72 3e 3c 74 64 3e 65 6e 64  e..  <tr><td>end
1d5f0 5f 62 6c 6f 63 6b 20 3c 74 64 3e 0a 20 20 20 20  _block <td>.    
1d600 54 68 69 73 20 66 69 65 6c 64 20 6d 61 79 20 63  This field may c
1d610 6f 6e 74 61 69 6e 20 65 69 74 68 65 72 20 61 6e  ontain either an
1d620 20 69 6e 74 65 67 65 72 20 6f 72 20 61 20 74 65   integer or a te
1d630 78 74 20 66 69 65 6c 64 20 63 6f 6e 73 69 73 74  xt field consist
1d640 69 6e 67 20 6f 66 0a 20 20 20 20 74 77 6f 20 69  ing of.    two i
1d650 6e 74 65 67 65 72 73 20 73 65 70 61 72 61 74 65  ntegers separate
1d660 64 20 62 79 20 61 20 73 70 61 63 65 20 63 68 61  d by a space cha
1d670 72 61 63 74 65 72 20 28 75 6e 69 63 6f 64 65 20  racter (unicode 
1d680 63 6f 64 65 70 6f 69 6e 74 20 30 78 32 30 29 2e  codepoint 0x20).
1d690 0a 3c 70 20 73 74 79 6c 65 3d 22 6d 61 72 67 69  .<p style="margi
1d6a0 6e 2d 6c 65 66 74 3a 30 3b 6d 61 72 67 69 6e 2d  n-left:0;margin-
1d6b0 72 69 67 68 74 3a 30 22 3e 0a 20 20 20 20 54 68  right:0">.    Th
1d6c0 65 20 66 69 72 73 74 2c 20 6f 72 20 6f 6e 6c 79  e first, or only
1d6d0 2c 20 69 6e 74 65 67 65 72 20 69 73 20 74 68 65  , integer is the
1d6e0 20 62 6c 6f 63 6b 69 64 20 74 68 61 74 20 63 6f   blockid that co
1d6f0 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 68 65  rresponds to the
1d700 20 69 6e 74 65 72 69 6f 72 0a 20 20 20 20 6e 6f   interior.    no
1d710 64 65 20 77 69 74 68 20 74 68 65 20 6c 61 72 67  de with the larg
1d720 65 73 74 20 62 6c 6f 63 6b 69 64 20 74 68 61 74  est blockid that
1d730 20 62 65 6c 6f 6e 67 73 20 74 6f 20 74 68 69 73   belongs to this
1d740 20 73 65 67 6d 65 6e 74 20 62 2d 74 72 65 65 2e   segment b-tree.
1d750 20 4f 72 20 7a 65 72 6f 0a 20 20 20 20 69 66 20   Or zero.    if 
1d760 74 68 65 20 65 6e 74 69 72 65 20 73 65 67 6d 65  the entire segme
1d770 6e 74 20 62 2d 74 72 65 65 20 66 69 74 73 20 6f  nt b-tree fits o
1d780 6e 20 74 68 65 20 72 6f 6f 74 20 6e 6f 64 65 2e  n the root node.
1d790 20 49 66 20 69 74 20 65 78 69 73 74 73 2c 20 74   If it exists, t
1d7a0 68 69 73 20 6e 6f 64 65 0a 20 20 20 20 69 73 20  his node.    is 
1d7b0 61 6c 77 61 79 73 20 61 6e 20 69 6e 74 65 72 69  always an interi
1d7c0 6f 72 20 6e 6f 64 65 2e 0a 3c 70 20 73 74 79 6c  or node..<p styl
1d7d0 65 3d 22 6d 61 72 67 69 6e 2d 6c 65 66 74 3a 30  e="margin-left:0
1d7e0 3b 6d 61 72 67 69 6e 2d 72 69 67 68 74 3a 30 3b  ;margin-right:0;
1d7f0 6d 61 72 67 69 6e 2d 62 6f 74 74 6f 6d 3a 30 22  margin-bottom:0"
1d800 3e 0a 20 20 20 20 54 68 65 20 73 65 63 6f 6e 64  >.    The second
1d810 20 69 6e 74 65 67 65 72 2c 20 69 66 20 69 74 20   integer, if it 
1d820 69 73 20 70 72 65 73 65 6e 74 2c 20 69 73 20 74  is present, is t
1d830 68 65 20 61 67 67 72 65 67 61 74 65 20 73 69 7a  he aggregate siz
1d840 65 20 6f 66 20 61 6c 6c 20 64 61 74 61 0a 20 20  e of all data.  
1d850 20 20 73 74 6f 72 65 64 20 6f 6e 20 6c 65 61 66    stored on leaf
1d860 20 70 61 67 65 73 20 69 6e 20 62 79 74 65 73 2e   pages in bytes.
1d870 20 49 66 20 74 68 65 20 76 61 6c 75 65 20 69 73   If the value is
1d880 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e 20   negative, then 
1d890 74 68 65 20 73 65 67 6d 65 6e 74 0a 20 20 20 20  the segment.    
1d8a0 69 73 20 74 68 65 20 6f 75 74 70 75 74 20 6f 66  is the output of
1d8b0 20 61 6e 20 75 6e 66 69 6e 69 73 68 65 64 20 69   an unfinished i
1d8c0 6e 63 72 65 6d 65 6e 74 61 6c 2d 6d 65 72 67 65  ncremental-merge
1d8d0 20 6f 70 65 72 61 74 69 6f 6e 2c 20 61 6e 64 20   operation, and 
1d8e0 74 68 65 0a 20 20 20 20 61 62 73 6f 6c 75 74 65  the.    absolute
1d8f0 20 76 61 6c 75 65 20 69 73 20 63 75 72 72 65 6e   value is curren
1d900 74 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 2e  t size in bytes.
1d910 0a 0a 20 20 3c 74 72 3e 3c 74 64 3e 72 6f 6f 74  ..  <tr><td>root
1d920 20 20 20 20 20 20 20 20 20 20 20 20 20 3c 74 64               <td
1d930 3e 0a 20 20 20 20 42 6c 6f 62 20 63 6f 6e 74 61  >.    Blob conta
1d940 69 6e 69 6e 67 20 74 68 65 20 72 6f 6f 74 20 6e  ining the root n
1d950 6f 64 65 20 6f 66 20 74 68 65 20 73 65 67 6d 65  ode of the segme
1d960 6e 74 20 62 2d 74 72 65 65 2e 0a 3c 2f 74 61 62  nt b-tree..</tab
1d970 6c 65 3e 0a 0a 3c 70 3e 0a 20 20 41 70 61 72 74  le>..<p>.  Apart
1d980 20 66 72 6f 6d 20 74 68 65 20 72 6f 6f 74 20 6e   from the root n
1d990 6f 64 65 2c 20 74 68 65 20 6e 6f 64 65 73 20 74  ode, the nodes t
1d9a0 68 61 74 20 6d 61 6b 65 20 75 70 20 61 20 73 69  hat make up a si
1d9b0 6e 67 6c 65 20 73 65 67 6d 65 6e 74 20 62 2d 74  ngle segment b-t
1d9c0 72 65 65 20 61 72 65 0a 20 20 61 6c 77 61 79 73  ree are.  always
1d9d0 20 73 74 6f 72 65 64 20 75 73 69 6e 67 20 61 20   stored using a 
1d9e0 63 6f 6e 74 69 67 75 6f 75 73 20 73 65 71 75 65  contiguous seque
1d9f0 6e 63 65 20 6f 66 20 62 6c 6f 63 6b 69 64 73 2e  nce of blockids.
1da00 20 46 75 72 74 68 65 72 6d 6f 72 65 2c 20 74 68   Furthermore, th
1da10 65 0a 20 20 6e 6f 64 65 73 20 74 68 61 74 20 6d  e.  nodes that m
1da20 61 6b 65 20 75 70 20 61 20 73 69 6e 67 6c 65 20  ake up a single 
1da30 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 62 2d 74  level of the b-t
1da40 72 65 65 20 61 72 65 20 74 68 65 6d 73 65 6c 76  ree are themselv
1da50 65 73 20 73 74 6f 72 65 64 20 61 73 0a 20 20 61  es stored as.  a
1da60 20 63 6f 6e 74 69 67 75 6f 75 73 20 62 6c 6f 63   contiguous bloc
1da70 6b 2c 20 69 6e 20 62 2d 74 72 65 65 20 6f 72 64  k, in b-tree ord
1da80 65 72 2e 20 54 68 65 20 63 6f 6e 74 69 67 75 6f  er. The contiguo
1da90 75 73 20 73 65 71 75 65 6e 63 65 20 6f 66 20 62  us sequence of b
1daa0 6c 6f 63 6b 69 64 73 0a 20 20 75 73 65 64 20 74  lockids.  used t
1dab0 6f 20 73 74 6f 72 65 20 74 68 65 20 62 2d 74 72  o store the b-tr
1dac0 65 65 20 6c 65 61 76 65 73 20 61 72 65 20 61 6c  ee leaves are al
1dad0 6c 6f 63 61 74 65 64 20 73 74 61 72 74 69 6e 67  located starting
1dae0 20 77 69 74 68 20 74 68 65 20 62 6c 6f 63 6b 69   with the blocki
1daf0 64 0a 20 20 76 61 6c 75 65 20 73 74 6f 72 65 64  d.  value stored
1db00 20 69 6e 20 74 68 65 20 22 73 74 61 72 74 5f 62   in the "start_b
1db10 6c 6f 63 6b 22 20 63 6f 6c 75 6d 6e 20 6f 66 20  lock" column of 
1db20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
1db30 67 20 25 5f 73 65 67 64 69 72 20 72 6f 77 2c 0a  g %_segdir row,.
1db40 20 20 61 6e 64 20 66 69 6e 69 73 68 69 6e 67 20    and finishing 
1db50 61 74 20 74 68 65 20 62 6c 6f 63 6b 69 64 20 76  at the blockid v
1db60 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20 74  alue stored in t
1db70 68 65 20 22 6c 65 61 76 65 73 5f 65 6e 64 5f 62  he "leaves_end_b
1db80 6c 6f 63 6b 22 0a 20 20 66 69 65 6c 64 20 6f 66  lock".  field of
1db90 20 74 68 65 20 73 61 6d 65 20 72 6f 77 2e 20 49   the same row. I
1dba0 74 20 69 73 20 74 68 65 72 65 66 6f 72 65 20 70  t is therefore p
1dbb0 6f 73 73 69 62 6c 65 20 74 6f 20 69 74 65 72 61  ossible to itera
1dbc0 74 65 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 74  te through all t
1dbd0 68 65 0a 20 20 6c 65 61 76 65 73 20 6f 66 20 61  he.  leaves of a
1dbe0 20 73 65 67 6d 65 6e 74 20 62 2d 74 72 65 65 2c   segment b-tree,
1dbf0 20 69 6e 20 6b 65 79 20 6f 72 64 65 72 2c 20 62   in key order, b
1dc00 79 20 74 72 61 76 65 72 73 69 6e 67 20 74 68 65  y traversing the
1dc10 20 25 5f 73 65 67 6d 65 6e 74 73 20 0a 20 20 74   %_segments .  t
1dc20 61 62 6c 65 20 69 6e 20 62 6c 6f 63 6b 69 64 20  able in blockid 
1dc30 6f 72 64 65 72 20 66 72 6f 6d 20 22 73 74 61 72  order from "star
1dc40 74 5f 62 6c 6f 63 6b 22 20 74 6f 20 22 6c 65 61  t_block" to "lea
1dc50 76 65 73 5f 65 6e 64 5f 62 6c 6f 63 6b 22 2e 20  ves_end_block". 
1dc60 20 0a 0a 3c 68 33 3e 53 65 67 6d 65 6e 74 20 42   ..<h3>Segment B
1dc70 2d 54 72 65 65 20 4c 65 61 66 20 4e 6f 64 65 73  -Tree Leaf Nodes
1dc80 3c 2f 68 33 3e 0a 0a 3c 70 3e 0a 20 20 54 68 65  </h3>..<p>.  The
1dc90 20 66 6f 6c 6c 6f 77 69 6e 67 20 64 69 61 67 72   following diagr
1dca0 61 6d 20 64 65 70 69 63 74 73 20 74 68 65 20 66  am depicts the f
1dcb0 6f 72 6d 61 74 20 6f 66 20 61 20 73 65 67 6d 65  ormat of a segme
1dcc0 6e 74 20 62 2d 74 72 65 65 20 6c 65 61 66 20 6e  nt b-tree leaf n
1dcd0 6f 64 65 2e 0a 0a 3c 63 65 6e 74 65 72 3e 0a 20  ode...<center>. 
1dce0 20 3c 69 6d 67 20 73 72 63 3d 69 6d 61 67 65 73   <img src=images
1dcf0 2f 66 74 73 33 5f 6c 65 61 66 5f 6e 6f 64 65 2e  /fts3_leaf_node.
1dd00 70 6e 67 3e 0a 20 20 3c 70 3e 20 53 65 67 6d 65  png>.  <p> Segme
1dd10 6e 74 20 42 2d 54 72 65 65 20 4c 65 61 66 20 4e  nt B-Tree Leaf N
1dd20 6f 64 65 20 46 6f 72 6d 61 74 0a 3c 2f 63 65 6e  ode Format.</cen
1dd30 74 65 72 3e 0a 0a 3c 70 3e 0a 20 20 54 68 65 20  ter>..<p>.  The 
1dd40 66 69 72 73 74 20 74 65 72 6d 20 73 74 6f 72 65  first term store
1dd50 64 20 6f 6e 20 65 61 63 68 20 6e 6f 64 65 20 28  d on each node (
1dd60 22 54 65 72 6d 20 31 22 20 69 6e 20 74 68 65 20  "Term 1" in the 
1dd70 66 69 67 75 72 65 20 61 62 6f 76 65 29 20 69 73  figure above) is
1dd80 0a 20 20 73 74 6f 72 65 64 20 76 65 72 62 61 74  .  stored verbat
1dd90 69 6d 2e 20 45 61 63 68 20 73 75 62 73 65 71 75  im. Each subsequ
1dda0 65 6e 74 20 74 65 72 6d 20 69 73 20 70 72 65 66  ent term is pref
1ddb0 69 78 2d 63 6f 6d 70 72 65 73 73 65 64 20 77 69  ix-compressed wi
1ddc0 74 68 20 72 65 73 70 65 63 74 0a 20 20 74 6f 20  th respect.  to 
1ddd0 69 74 73 20 70 72 65 64 65 63 65 73 73 6f 72 2e  its predecessor.
1dde0 20 54 65 72 6d 73 20 61 72 65 20 73 74 6f 72 65   Terms are store
1ddf0 64 20 77 69 74 68 69 6e 20 61 20 70 61 67 65 20  d within a page 
1de00 69 6e 20 73 6f 72 74 65 64 20 28 6d 65 6d 63 6d  in sorted (memcm
1de10 70 29 0a 20 20 6f 72 64 65 72 2e 0a 0a 3c 68 33  p).  order...<h3
1de20 3e 53 65 67 6d 65 6e 74 20 42 2d 54 72 65 65 20  >Segment B-Tree 
1de30 49 6e 74 65 72 69 6f 72 20 4e 6f 64 65 73 3c 2f  Interior Nodes</
1de40 68 33 3e 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 66  h3>..<p>.  The f
1de50 6f 6c 6c 6f 77 69 6e 67 20 64 69 61 67 72 61 6d  ollowing diagram
1de60 20 64 65 70 69 63 74 73 20 74 68 65 20 66 6f 72   depicts the for
1de70 6d 61 74 20 6f 66 20 61 20 73 65 67 6d 65 6e 74  mat of a segment
1de80 20 62 2d 74 72 65 65 20 69 6e 74 65 72 69 6f 72   b-tree interior
1de90 20 0a 20 20 28 6e 6f 6e 2d 6c 65 61 66 29 20 6e   .  (non-leaf) n
1dea0 6f 64 65 2e 0a 0a 3c 63 65 6e 74 65 72 3e 0a 20  ode...<center>. 
1deb0 20 3c 69 6d 67 20 73 72 63 3d 69 6d 61 67 65 73   <img src=images
1dec0 2f 66 74 73 33 5f 69 6e 74 65 72 69 6f 72 5f 6e  /fts3_interior_n
1ded0 6f 64 65 2e 70 6e 67 3e 0a 20 20 3c 70 3e 20 53  ode.png>.  <p> S
1dee0 65 67 6d 65 6e 74 20 42 2d 54 72 65 65 20 49 6e  egment B-Tree In
1def0 74 65 72 69 6f 72 20 4e 6f 64 65 20 46 6f 72 6d  terior Node Form
1df00 61 74 0a 3c 2f 63 65 6e 74 65 72 3e 0a 0a 0a 3c  at.</center>...<
1df10 68 32 3e 44 6f 63 6c 69 73 74 20 46 6f 72 6d 61  h2>Doclist Forma
1df20 74 3c 2f 68 32 3e 0a 0a 3c 70 3e 0a 20 20 41 20  t</h2>..<p>.  A 
1df30 64 6f 63 6c 69 73 74 20 63 6f 6e 73 69 73 74 73  doclist consists
1df40 20 6f 66 20 61 6e 20 61 72 72 61 79 20 6f 66 20   of an array of 
1df50 36 34 2d 62 69 74 20 73 69 67 6e 65 64 20 69 6e  64-bit signed in
1df60 74 65 67 65 72 73 2c 20 73 65 72 69 61 6c 69 7a  tegers, serializ
1df70 65 64 20 75 73 69 6e 67 0a 20 20 74 68 65 20 46  ed using.  the F
1df80 54 53 20 76 61 72 69 6e 74 20 66 6f 72 6d 61 74  TS varint format
1df90 2e 20 45 61 63 68 20 64 6f 63 6c 69 73 74 20 65  . Each doclist e
1dfa0 6e 74 72 79 20 69 73 20 6d 61 64 65 20 75 70 20  ntry is made up 
1dfb0 6f 66 20 61 20 73 65 72 69 65 73 20 6f 66 20 74  of a series of t
1dfc0 77 6f 20 0a 20 20 6f 72 20 6d 6f 72 65 20 69 6e  wo .  or more in
1dfd0 74 65 67 65 72 73 2c 20 61 73 20 66 6f 6c 6c 6f  tegers, as follo
1dfe0 77 73 3a 0a 0a 3c 6f 6c 3e 0a 20 20 3c 6c 69 3e  ws:..<ol>.  <li>
1dff0 20 54 68 65 20 64 6f 63 69 64 20 76 61 6c 75 65   The docid value
1e000 2e 20 54 68 65 20 66 69 72 73 74 20 65 6e 74 72  . The first entr
1e010 79 20 69 6e 20 61 20 64 6f 63 6c 69 73 74 20 63  y in a doclist c
1e020 6f 6e 74 61 69 6e 73 20 74 68 65 20 6c 69 74 65  ontains the lite
1e030 72 61 6c 20 64 6f 63 69 64 0a 20 20 20 20 20 20  ral docid.      
1e040 20 76 61 6c 75 65 2e 20 54 68 65 20 66 69 72 73   value. The firs
1e050 74 20 66 69 65 6c 64 20 6f 66 20 65 61 63 68 20  t field of each 
1e060 73 75 62 73 65 71 75 65 6e 74 20 64 6f 63 6c 69  subsequent docli
1e070 73 74 20 65 6e 74 72 79 20 63 6f 6e 74 61 69 6e  st entry contain
1e080 73 20 74 68 65 20 0a 20 20 20 20 20 20 20 64 69  s the .       di
1e090 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e  fference between
1e0a0 20 74 68 65 20 6e 65 77 20 64 6f 63 69 64 20 61   the new docid a
1e0b0 6e 64 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  nd the previous 
1e0c0 6f 6e 65 20 28 61 6c 77 61 79 73 20 61 20 70 6f  one (always a po
1e0d0 73 69 74 69 76 65 20 0a 20 20 20 20 20 20 20 6e  sitive .       n
1e0e0 75 6d 62 65 72 29 2e 0a 20 20 3c 6c 69 3e 20 5a  umber)..  <li> Z
1e0f0 65 72 6f 20 6f 72 20 6d 6f 72 65 20 74 65 72 6d  ero or more term
1e100 2d 6f 66 66 73 65 74 20 6c 69 73 74 73 2e 20 41  -offset lists. A
1e110 20 74 65 72 6d 2d 6f 66 66 73 65 74 20 6c 69 73   term-offset lis
1e120 74 20 69 73 20 70 72 65 73 65 6e 74 20 66 6f 72  t is present for
1e130 20 65 61 63 68 0a 20 20 20 20 20 20 20 63 6f 6c   each.       col
1e140 75 6d 6e 20 6f 66 20 74 68 65 20 46 54 53 20 76  umn of the FTS v
1e150 69 72 74 75 61 6c 20 74 61 62 6c 65 20 74 68 61  irtual table tha
1e160 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 74  t contains the t
1e170 65 72 6d 2e 20 41 20 74 65 72 6d 2d 6f 66 66 73  erm. A term-offs
1e180 65 74 0a 20 20 20 20 20 20 20 6c 69 73 74 20 63  et.       list c
1e190 6f 6e 73 69 73 74 73 20 6f 66 20 74 68 65 20 66  onsists of the f
1e1a0 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 20 20 20 3c  ollowing:.     <
1e1b0 6f 6c 3e 0a 20 20 20 20 20 20 20 3c 6c 69 3e 20  ol>.       <li> 
1e1c0 43 6f 6e 73 74 61 6e 74 20 76 61 6c 75 65 20 31  Constant value 1
1e1d0 2e 20 54 68 69 73 20 66 69 65 6c 64 20 69 73 20  . This field is 
1e1e0 6f 6d 69 74 74 65 64 20 66 6f 72 20 61 6e 79 20  omitted for any 
1e1f0 74 65 72 6d 2d 6f 66 66 73 65 74 20 6c 69 73 74  term-offset list
1e200 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
1e210 6f 63 69 61 74 65 64 20 77 69 74 68 20 63 6f 6c  ociated with col
1e220 75 6d 6e 20 30 2e 0a 20 20 20 20 20 20 20 3c 6c  umn 0..       <l
1e230 69 3e 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6e 75  i> The column nu
1e240 6d 62 65 72 20 28 31 20 66 6f 72 20 74 68 65 20  mber (1 for the 
1e250 73 65 63 6f 6e 64 20 6c 65 66 74 6d 6f 73 74 20  second leftmost 
1e260 63 6f 6c 75 6d 6e 2c 20 65 74 63 2e 29 2e 20 54  column, etc.). T
1e270 68 69 73 0a 20 20 20 20 20 20 20 20 20 20 20 20  his.            
1e280 66 69 65 6c 64 20 69 73 20 6f 6d 69 74 74 65 64  field is omitted
1e290 20 66 6f 72 20 61 6e 79 20 74 65 72 6d 2d 6f 66   for any term-of
1e2a0 66 73 65 74 20 6c 69 73 74 20 61 73 73 6f 63 69  fset list associ
1e2b0 61 74 65 64 20 77 69 74 68 20 63 6f 6c 75 6d 6e  ated with column
1e2c0 20 30 2e 0a 20 20 20 20 20 20 20 3c 6c 69 3e 20   0..       <li> 
1e2d0 41 20 6c 69 73 74 20 6f 66 20 74 65 72 6d 2d 6f  A list of term-o
1e2e0 66 66 73 65 74 73 2c 20 73 6f 72 74 65 64 20 66  ffsets, sorted f
1e2f0 72 6f 6d 20 73 6d 61 6c 6c 65 73 74 20 74 6f 20  rom smallest to 
1e300 6c 61 72 67 65 73 74 2e 20 49 6e 73 74 65 61 64  largest. Instead
1e310 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20  .            of 
1e320 73 74 6f 72 69 6e 67 20 74 68 65 20 74 65 72 6d  storing the term
1e330 2d 6f 66 66 73 65 74 20 76 61 6c 75 65 20 6c 69  -offset value li
1e340 74 65 72 61 6c 6c 79 2c 20 65 61 63 68 20 69 6e  terally, each in
1e350 74 65 67 65 72 20 73 74 6f 72 65 64 20 0a 20 20  teger stored .  
1e360 20 20 20 20 20 20 20 20 20 20 69 73 20 74 68 65            is the
1e370 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77   difference betw
1e380 65 65 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  een the current 
1e390 74 65 72 6d 2d 6f 66 66 73 65 74 20 61 6e 64 20  term-offset and 
1e3a0 74 68 65 20 70 72 65 76 69 6f 75 73 20 0a 20 20  the previous .  
1e3b0 20 20 20 20 20 20 20 20 20 20 6f 6e 65 20 28 6f            one (o
1e3c0 72 20 7a 65 72 6f 20 69 66 20 74 68 65 20 63 75  r zero if the cu
1e3d0 72 72 65 6e 74 20 74 65 72 6d 2d 6f 66 66 73 65  rrent term-offse
1e3e0 74 20 69 73 20 74 68 65 20 66 69 72 73 74 29 2c  t is the first),
1e3f0 20 70 6c 75 73 20 32 2e 0a 20 20 20 20 20 3c 2f   plus 2..     </
1e400 6f 6c 3e 0a 20 20 3c 6c 69 3e 20 43 6f 6e 73 74  ol>.  <li> Const
1e410 61 6e 74 20 76 61 6c 75 65 20 30 2e 0a 3c 2f 6f  ant value 0..</o
1e420 6c 3e 0a 0a 3c 63 65 6e 74 65 72 3e 0a 20 20 3c  l>..<center>.  <
1e430 69 6d 67 20 73 72 63 3d 69 6d 61 67 65 73 2f 66  img src=images/f
1e440 74 73 33 5f 64 6f 63 6c 69 73 74 32 2e 70 6e 67  ts3_doclist2.png
1e450 3e 0a 20 20 3c 70 3e 20 46 54 53 33 20 44 6f 63  >.  <p> FTS3 Doc
1e460 6c 69 73 74 20 46 6f 72 6d 61 74 0a 3c 2f 63 65  list Format.</ce
1e470 6e 74 65 72 3e 0a 0a 3c 63 65 6e 74 65 72 3e 0a  nter>..<center>.
1e480 20 20 3c 69 6d 67 20 73 72 63 3d 69 6d 61 67 65    <img src=image
1e490 73 2f 66 74 73 33 5f 64 6f 63 6c 69 73 74 2e 70  s/fts3_doclist.p
1e4a0 6e 67 3e 0a 20 20 3c 70 3e 20 46 54 53 20 44 6f  ng>.  <p> FTS Do
1e4b0 63 6c 69 73 74 20 45 6e 74 72 79 20 46 6f 72 6d  clist Entry Form
1e4c0 61 74 0a 3c 2f 63 65 6e 74 65 72 3e 0a 0a 3c 70  at.</center>..<p
1e4d0 3e 0a 20 20 46 6f 72 20 64 6f 63 6c 69 73 74 73  >.  For doclists
1e4e0 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 74   for which the t
1e4f0 65 72 6d 20 61 70 70 65 61 72 73 20 69 6e 20 6d  erm appears in m
1e500 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 63 6f 6c  ore than one col
1e510 75 6d 6e 20 6f 66 20 74 68 65 20 46 54 53 0a 20  umn of the FTS. 
1e520 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2c 20   virtual table, 
1e530 74 65 72 6d 2d 6f 66 66 73 65 74 20 6c 69 73 74  term-offset list
1e540 73 20 77 69 74 68 69 6e 20 74 68 65 20 64 6f 63  s within the doc
1e550 6c 69 73 74 20 61 72 65 20 73 74 6f 72 65 64 20  list are stored 
1e560 69 6e 20 63 6f 6c 75 6d 6e 20 0a 20 20 6e 75 6d  in column .  num
1e570 62 65 72 20 6f 72 64 65 72 2e 20 54 68 69 73 20  ber order. This 
1e580 65 6e 73 75 72 65 73 20 74 68 61 74 20 74 68 65  ensures that the
1e590 20 74 65 72 6d 2d 6f 66 66 73 65 74 20 6c 69 73   term-offset lis
1e5a0 74 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  t associated wit
1e5b0 68 20 0a 20 20 63 6f 6c 75 6d 6e 20 30 20 28 69  h .  column 0 (i
1e5c0 66 20 61 6e 79 29 20 69 73 20 61 6c 77 61 79 73  f any) is always
1e5d0 20 66 69 72 73 74 2c 20 61 6c 6c 6f 77 69 6e 67   first, allowing
1e5e0 20 74 68 65 20 66 69 72 73 74 20 74 77 6f 20 66   the first two f
1e5f0 69 65 6c 64 73 20 6f 66 20 74 68 65 0a 20 20 74  ields of the.  t
1e600 65 72 6d 2d 6f 66 66 73 65 74 20 6c 69 73 74 20  erm-offset list 
1e610 74 6f 20 62 65 20 6f 6d 69 74 74 65 64 20 69 6e  to be omitted in
1e620 20 74 68 69 73 20 63 61 73 65 2e 0a 0a 3c 68 31   this case...<h1
1e630 20 69 64 3d 61 70 70 65 6e 64 69 78 5f 61 20 6e   id=appendix_a n
1e640 6f 6e 75 6d 62 65 72 20 74 61 67 73 3d 22 73 65  onumber tags="se
1e650 61 72 63 68 20 61 70 70 6c 69 63 61 74 69 6f 6e  arch application
1e660 20 74 69 70 73 22 3e 0a 20 20 41 70 70 65 6e 64   tips">.  Append
1e670 69 78 20 41 3a 20 53 65 61 72 63 68 20 41 70 70  ix A: Search App
1e680 6c 69 63 61 74 69 6f 6e 20 54 69 70 73 0a 3c 2f  lication Tips.</
1e690 68 31 3e 0a 0a 3c 70 3e 0a 20 20 46 54 53 20 69  h1>..<p>.  FTS i
1e6a0 73 20 70 72 69 6d 61 72 69 6c 79 20 64 65 73 69  s primarily desi
1e6b0 67 6e 65 64 20 74 6f 20 73 75 70 70 6f 72 74 20  gned to support 
1e6c0 42 6f 6f 6c 65 61 6e 20 66 75 6c 6c 2d 74 65 78  Boolean full-tex
1e6d0 74 20 71 75 65 72 69 65 73 20 2d 20 71 75 65 72  t queries - quer
1e6e0 69 65 73 0a 20 20 74 6f 20 66 69 6e 64 20 74 68  ies.  to find th
1e6f0 65 20 73 65 74 20 6f 66 20 64 6f 63 75 6d 65 6e  e set of documen
1e700 74 73 20 74 68 61 74 20 6d 61 74 63 68 20 61 20  ts that match a 
1e710 73 70 65 63 69 66 69 65 64 20 63 72 69 74 65 72  specified criter
1e720 69 61 2e 20 48 6f 77 65 76 65 72 2c 20 6d 61 6e  ia. However, man
1e730 79 20 0a 20 20 28 6d 6f 73 74 3f 29 20 73 65 61  y .  (most?) sea
1e740 72 63 68 20 61 70 70 6c 69 63 61 74 69 6f 6e 73  rch applications
1e750 20 72 65 71 75 69 72 65 20 74 68 61 74 20 72 65   require that re
1e760 73 75 6c 74 73 20 61 72 65 20 73 6f 6d 65 68 6f  sults are someho
1e770 77 20 72 61 6e 6b 65 64 20 69 6e 20 6f 72 64 65  w ranked in orde
1e780 72 0a 20 20 6f 66 20 22 72 65 6c 65 76 61 6e 63  r.  of "relevanc
1e790 65 22 2c 20 77 68 65 72 65 20 22 72 65 6c 65 76  e", where "relev
1e7a0 61 6e 63 65 22 20 69 73 20 64 65 66 69 6e 65 64  ance" is defined
1e7b0 20 61 73 20 74 68 65 20 6c 69 6b 65 6c 69 68 6f   as the likeliho
1e7c0 6f 64 20 74 68 61 74 20 74 68 65 20 75 73 65 72  od that the user
1e7d0 0a 20 20 77 68 6f 20 70 65 72 66 6f 72 6d 65 64  .  who performed
1e7e0 20 74 68 65 20 73 65 61 72 63 68 20 69 73 20 69   the search is i
1e7f0 6e 74 65 72 65 73 74 65 64 20 69 6e 20 61 20 73  nterested in a s
1e800 70 65 63 69 66 69 63 20 65 6c 65 6d 65 6e 74 20  pecific element 
1e810 6f 66 20 74 68 65 20 72 65 74 75 72 6e 65 64 0a  of the returned.
1e820 20 20 73 65 74 20 6f 66 20 64 6f 63 75 6d 65 6e    set of documen
1e830 74 73 2e 20 57 68 65 6e 20 75 73 69 6e 67 20 61  ts. When using a
1e840 20 73 65 61 72 63 68 20 65 6e 67 69 6e 65 20 74   search engine t
1e850 6f 20 66 69 6e 64 20 64 6f 63 75 6d 65 6e 74 73  o find documents
1e860 20 6f 6e 20 74 68 65 20 77 6f 72 6c 64 0a 20 20   on the world.  
1e870 77 69 64 65 20 77 65 62 2c 20 74 68 65 20 75 73  wide web, the us
1e880 65 72 20 65 78 70 65 63 74 73 20 74 68 61 74 20  er expects that 
1e890 74 68 65 20 6d 6f 73 74 20 75 73 65 66 75 6c 2c  the most useful,
1e8a0 20 6f 72 20 22 72 65 6c 65 76 61 6e 74 22 2c 20   or "relevant", 
1e8b0 64 6f 63 75 6d 65 6e 74 73 20 0a 20 20 77 69 6c  documents .  wil
1e8c0 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 61 73  l be returned as
1e8d0 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20   the first page 
1e8e0 6f 66 20 72 65 73 75 6c 74 73 2c 20 61 6e 64 20  of results, and 
1e8f0 74 68 61 74 20 65 61 63 68 20 73 75 62 73 65 71  that each subseq
1e900 75 65 6e 74 20 70 61 67 65 20 0a 20 20 63 6f 6e  uent page .  con
1e910 74 61 69 6e 73 20 70 72 6f 67 72 65 73 73 69 76  tains progressiv
1e920 65 6c 79 20 6c 65 73 73 20 72 65 6c 65 76 61 6e  ely less relevan
1e930 74 20 72 65 73 75 6c 74 73 2e 20 45 78 61 63 74  t results. Exact
1e940 6c 79 20 68 6f 77 20 61 20 6d 61 63 68 69 6e 65  ly how a machine
1e950 20 63 61 6e 20 0a 20 20 64 65 74 65 72 6d 69 6e   can .  determin
1e960 65 20 64 6f 63 75 6d 65 6e 74 20 72 65 6c 65 76  e document relev
1e970 61 6e 63 65 20 62 61 73 65 64 20 6f 6e 20 61 20  ance based on a 
1e980 75 73 65 72 73 20 71 75 65 72 79 20 69 73 20 61  users query is a
1e990 20 63 6f 6d 70 6c 69 63 61 74 65 64 20 70 72 6f   complicated pro
1e9a0 62 6c 65 6d 0a 20 20 61 6e 64 20 74 68 65 20 73  blem.  and the s
1e9b0 75 62 6a 65 63 74 20 6f 66 20 6d 75 63 68 20 6f  ubject of much o
1e9c0 6e 67 6f 69 6e 67 20 72 65 73 65 61 72 63 68 2e  ngoing research.
1e9d0 0a 0a 3c 70 3e 0a 20 20 4f 6e 65 20 76 65 72 79  ..<p>.  One very
1e9e0 20 73 69 6d 70 6c 65 20 73 63 68 65 6d 65 20 6d   simple scheme m
1e9f0 69 67 68 74 20 62 65 20 74 6f 20 63 6f 75 6e 74  ight be to count
1ea00 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 69   the number of i
1ea10 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68 65 20  nstances of the 
1ea20 0a 20 20 75 73 65 72 73 20 73 65 61 72 63 68 20  .  users search 
1ea30 74 65 72 6d 73 20 69 6e 20 65 61 63 68 20 72 65  terms in each re
1ea40 73 75 6c 74 20 64 6f 63 75 6d 65 6e 74 2e 20 54  sult document. T
1ea50 68 6f 73 65 20 64 6f 63 75 6d 65 6e 74 73 20 74  hose documents t
1ea60 68 61 74 20 63 6f 6e 74 61 69 6e 0a 20 20 6d 61  hat contain.  ma
1ea70 6e 79 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20  ny instances of 
1ea80 74 68 65 20 74 65 72 6d 73 20 61 72 65 20 63 6f  the terms are co
1ea90 6e 73 69 64 65 72 65 64 20 6d 6f 72 65 20 72 65  nsidered more re
1eaa0 6c 65 76 61 6e 74 20 74 68 61 6e 20 74 68 6f 73  levant than thos
1eab0 65 20 77 69 74 68 0a 20 20 61 20 73 6d 61 6c 6c  e with.  a small
1eac0 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 73 74 61   number of insta
1ead0 6e 63 65 73 20 6f 66 20 65 61 63 68 20 74 65 72  nces of each ter
1eae0 6d 2e 20 49 6e 20 61 6e 20 46 54 53 20 61 70 70  m. In an FTS app
1eaf0 6c 69 63 61 74 69 6f 6e 2c 20 74 68 65 20 0a 20  lication, the . 
1eb00 20 6e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 20   number of term 
1eb10 69 6e 73 74 61 6e 63 65 73 20 69 6e 20 65 61 63  instances in eac
1eb20 68 20 72 65 73 75 6c 74 20 63 6f 75 6c 64 20 62  h result could b
1eb30 65 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  e determined by 
1eb40 63 6f 75 6e 74 69 6e 67 0a 20 20 74 68 65 20 6e  counting.  the n
1eb50 75 6d 62 65 72 20 6f 66 20 69 6e 74 65 67 65 72  umber of integer
1eb60 73 20 69 6e 20 74 68 65 20 72 65 74 75 72 6e 20  s in the return 
1eb70 76 61 6c 75 65 20 6f 66 20 74 68 65 20 5b 6f 66  value of the [of
1eb80 66 73 65 74 73 5d 20 66 75 6e 63 74 69 6f 6e 2e  fsets] function.
1eb90 0a 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
1eba0 20 65 78 61 6d 70 6c 65 20 73 68 6f 77 73 20 61   example shows a
1ebb0 20 71 75 65 72 79 20 74 68 61 74 20 63 6f 75 6c   query that coul
1ebc0 64 20 62 65 20 75 73 65 64 20 74 6f 20 6f 62 74  d be used to obt
1ebd0 61 69 6e 20 74 68 65 0a 20 20 74 65 6e 20 6d 6f  ain the.  ten mo
1ebe0 73 74 20 72 65 6c 65 76 61 6e 74 20 72 65 73 75  st relevant resu
1ebf0 6c 74 73 20 66 6f 72 20 61 20 71 75 65 72 79 20  lts for a query 
1ec00 65 6e 74 65 72 65 64 20 62 79 20 74 68 65 20 75  entered by the u
1ec10 73 65 72 3a 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b  ser:..<codeblock
1ec20 3e 0a 20 20 3c 69 3e 2d 2d 20 54 68 69 73 20 65  >.  <i>-- This e
1ec30 78 61 6d 70 6c 65 20 28 61 6e 64 20 61 6c 6c 20  xample (and all 
1ec40 6f 74 68 65 72 73 20 69 6e 20 74 68 69 73 20 73  others in this s
1ec50 65 63 74 69 6f 6e 29 20 61 73 73 75 6d 65 73 20  ection) assumes 
1ec60 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 63  the following sc
1ec70 68 65 6d 61 3c 2f 69 3e 0a 20 20 43 52 45 41 54  hema</i>.  CREAT
1ec80 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20  E VIRTUAL TABLE 
1ec90 64 6f 63 75 6d 65 6e 74 73 20 55 53 49 4e 47 20  documents USING 
1eca0 66 74 73 33 28 74 69 74 6c 65 2c 20 63 6f 6e 74  fts3(title, cont
1ecb0 65 6e 74 29 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 41  ent);..  <i>-- A
1ecc0 73 73 75 6d 69 6e 67 20 74 68 65 20 61 70 70 6c  ssuming the appl
1ecd0 69 63 61 74 69 6f 6e 20 68 61 73 20 73 75 70 70  ication has supp
1ece0 6c 69 65 64 20 61 6e 20 53 51 4c 69 74 65 20 75  lied an SQLite u
1ecf0 73 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  ser function nam
1ed00 65 64 20 22 63 6f 75 6e 74 69 6e 74 65 67 65 72  ed "countinteger
1ed10 73 22 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 74  s"</i>.  <i>-- t
1ed20 68 61 74 20 72 65 74 75 72 6e 73 20 74 68 65 20  hat returns the 
1ed30 6e 75 6d 62 65 72 20 6f 66 20 73 70 61 63 65 2d  number of space-
1ed40 73 65 70 61 72 61 74 65 64 20 69 6e 74 65 67 65  separated intege
1ed50 72 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  rs contained in 
1ed60 69 74 73 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e  its only argumen
1ed70 74 2c 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 74  t,</i>.  <i>-- t
1ed80 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 71 75 65  he following que
1ed90 72 79 20 63 6f 75 6c 64 20 62 65 20 75 73 65 64  ry could be used
1eda0 20 74 6f 20 72 65 74 75 72 6e 20 74 68 65 20 74   to return the t
1edb0 69 74 6c 65 73 20 6f 66 20 74 68 65 20 31 30 20  itles of the 10 
1edc0 64 6f 63 75 6d 65 6e 74 73 20 74 68 61 74 20 63  documents that c
1edd0 6f 6e 74 61 69 6e 3c 2f 69 3e 0a 20 20 3c 69 3e  ontain</i>.  <i>
1ede0 2d 2d 20 74 68 65 20 67 72 65 61 74 65 73 74 20  -- the greatest 
1edf0 6e 75 6d 62 65 72 20 6f 66 20 69 6e 73 74 61 6e  number of instan
1ee00 63 65 73 20 6f 66 20 74 68 65 20 75 73 65 72 73  ces of the users
1ee10 20 71 75 65 72 79 20 74 65 72 6d 73 2e 20 48 6f   query terms. Ho
1ee20 70 65 66 75 6c 6c 79 2c 20 74 68 65 73 65 20 31  pefully, these 1
1ee30 30 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 64 6f  0</i>.  <i>-- do
1ee40 63 75 6d 65 6e 74 73 20 77 69 6c 6c 20 62 65 20  cuments will be 
1ee50 74 68 6f 73 65 20 74 68 61 74 20 74 68 65 20 75  those that the u
1ee60 73 65 72 73 20 63 6f 6e 73 69 64 65 72 73 20 6d  sers considers m
1ee70 6f 72 65 20 6f 72 20 6c 65 73 73 20 74 68 65 20  ore or less the 
1ee80 6d 6f 73 74 20 22 72 65 6c 65 76 61 6e 74 22 2e  most "relevant".
1ee90 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20 74 69  </i>.  SELECT ti
1eea0 74 6c 65 20 46 52 4f 4d 20 64 6f 63 75 6d 65 6e  tle FROM documen
1eeb0 74 73 20 0a 20 20 20 20 57 48 45 52 45 20 64 6f  ts .    WHERE do
1eec0 63 75 6d 65 6e 74 73 20 4d 41 54 43 48 20 26 6c  cuments MATCH &l
1eed0 74 3b 71 75 65 72 79 26 67 74 3b 0a 20 20 20 20  t;query&gt;.    
1eee0 4f 52 44 45 52 20 42 59 20 63 6f 75 6e 74 69 6e  ORDER BY countin
1eef0 74 65 67 65 72 73 28 6f 66 66 73 65 74 73 28 64  tegers(offsets(d
1ef00 6f 63 75 6d 65 6e 74 73 29 29 20 44 45 53 43 0a  ocuments)) DESC.
1ef10 20 20 20 20 4c 49 4d 49 54 20 31 30 20 4f 46 46      LIMIT 10 OFF
1ef20 53 45 54 20 30 0a 3c 2f 63 6f 64 65 62 6c 6f 63  SET 0.</codebloc
1ef30 6b 3e 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 71 75  k>..<p>.  The qu
1ef40 65 72 79 20 61 62 6f 76 65 20 63 6f 75 6c 64 20  ery above could 
1ef50 62 65 20 6d 61 64 65 20 74 6f 20 72 75 6e 20 66  be made to run f
1ef60 61 73 74 65 72 20 62 79 20 75 73 69 6e 67 20 74  aster by using t
1ef70 68 65 20 46 54 53 20 5b 6d 61 74 63 68 69 6e 66  he FTS [matchinf
1ef80 6f 5d 0a 20 20 66 75 6e 63 74 69 6f 6e 20 74 6f  o].  function to
1ef90 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6e   determine the n
1efa0 75 6d 62 65 72 20 6f 66 20 71 75 65 72 79 20 74  umber of query t
1efb0 65 72 6d 20 69 6e 73 74 61 6e 63 65 73 20 74 68  erm instances th
1efc0 61 74 20 61 70 70 65 61 72 20 69 6e 20 65 61 63  at appear in eac
1efd0 68 0a 20 20 72 65 73 75 6c 74 2e 20 54 68 65 20  h.  result. The 
1efe0 6d 61 74 63 68 69 6e 66 6f 20 66 75 6e 63 74 69  matchinfo functi
1eff0 6f 6e 20 69 73 20 6d 75 63 68 20 6d 6f 72 65 20  on is much more 
1f000 65 66 66 69 63 69 65 6e 74 20 74 68 61 6e 20 74  efficient than t
1f010 68 65 20 6f 66 66 73 65 74 73 20 0a 20 20 66 75  he offsets .  fu
1f020 6e 63 74 69 6f 6e 2e 20 46 75 72 74 68 65 72 6d  nction. Furtherm
1f030 6f 72 65 2c 20 74 68 65 20 6d 61 74 63 68 69 6e  ore, the matchin
1f040 66 6f 20 66 75 6e 63 74 69 6f 6e 20 70 72 6f 76  fo function prov
1f050 69 64 65 73 20 65 78 74 72 61 20 69 6e 66 6f 72  ides extra infor
1f060 6d 61 74 69 6f 6e 0a 20 20 72 65 67 61 72 64 69  mation.  regardi
1f070 6e 67 20 74 68 65 20 6f 76 65 72 61 6c 6c 20 6e  ng the overall n
1f080 75 6d 62 65 72 20 6f 66 20 6f 63 63 75 72 72 65  umber of occurre
1f090 6e 63 65 73 20 6f 66 20 65 61 63 68 20 71 75 65  nces of each que
1f0a0 72 79 20 74 65 72 6d 20 69 6e 20 74 68 65 20 65  ry term in the e
1f0b0 6e 74 69 72 65 0a 20 20 64 6f 63 75 6d 65 6e 74  ntire.  document
1f0c0 20 73 65 74 20 28 6e 6f 74 20 6a 75 73 74 20 74   set (not just t
1f0d0 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 29 20  he current row) 
1f0e0 61 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  and the number o
1f0f0 66 20 64 6f 63 75 6d 65 6e 74 73 20 69 6e 20 77  f documents in w
1f100 68 69 63 68 20 0a 20 20 65 61 63 68 20 71 75 65  hich .  each que
1f110 72 79 20 74 65 72 6d 20 61 70 70 65 61 72 73 2e  ry term appears.
1f120 20 54 68 69 73 20 6d 61 79 20 62 65 20 75 73 65   This may be use
1f130 64 20 28 66 6f 72 20 65 78 61 6d 70 6c 65 29 20  d (for example) 
1f140 74 6f 20 61 74 74 61 63 68 20 61 20 68 69 67 68  to attach a high
1f150 65 72 0a 20 20 77 65 69 67 68 74 20 74 6f 20 6c  er.  weight to l
1f160 65 73 73 20 63 6f 6d 6d 6f 6e 20 74 65 72 6d 73  ess common terms
1f170 20 77 68 69 63 68 20 6d 61 79 20 69 6e 63 72 65   which may incre
1f180 61 73 65 20 74 68 65 20 6f 76 65 72 61 6c 6c 20  ase the overall 
1f190 63 6f 6d 70 75 74 65 64 20 72 65 6c 65 76 61 6e  computed relevan
1f1a0 63 79 20 0a 20 20 6f 66 20 74 68 6f 73 65 20 72  cy .  of those r
1f1b0 65 73 75 6c 74 73 20 74 68 65 20 75 73 65 72 20  esults the user 
1f1c0 63 6f 6e 73 69 64 65 72 73 20 6d 6f 72 65 20 69  considers more i
1f1d0 6e 74 65 72 65 73 74 69 6e 67 2e 0a 0a 3c 63 6f  nteresting...<co
1f1e0 64 65 62 6c 6f 63 6b 3e 0a 20 20 3c 69 3e 2d 2d  deblock>.  <i>--
1f1f0 20 49 66 20 74 68 65 20 61 70 70 6c 69 63 61 74   If the applicat
1f200 69 6f 6e 20 73 75 70 70 6c 69 65 73 20 61 6e 20  ion supplies an 
1f210 53 51 4c 69 74 65 20 75 73 65 72 20 66 75 6e 63  SQLite user func
1f220 74 69 6f 6e 20 63 61 6c 6c 65 64 20 22 72 61 6e  tion called "ran
1f230 6b 22 20 74 68 61 74 3c 2f 69 3e 0a 20 20 3c 69  k" that</i>.  <i
1f240 3e 2d 2d 20 69 6e 74 65 72 70 72 65 74 73 20 74  >-- interprets t
1f250 68 65 20 62 6c 6f 62 20 6f 66 20 64 61 74 61 20  he blob of data 
1f260 72 65 74 75 72 6e 65 64 20 62 79 20 6d 61 74 63  returned by matc
1f270 68 69 6e 66 6f 20 61 6e 64 20 72 65 74 75 72 6e  hinfo and return
1f280 73 20 61 20 6e 75 6d 65 72 69 63 3c 2f 69 3e 0a  s a numeric</i>.
1f290 20 20 3c 69 3e 2d 2d 20 72 65 6c 65 76 61 6e 63    <i>-- relevanc
1f2a0 79 20 62 61 73 65 64 20 6f 6e 20 69 74 2c 20 74  y based on it, t
1f2b0 68 65 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  hen the followin
1f2c0 67 20 53 51 4c 20 6d 61 79 20 62 65 20 75 73 65  g SQL may be use
1f2d0 64 20 74 6f 20 72 65 74 75 72 6e 20 74 68 65 3c  d to return the<
1f2e0 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 74 69 74 6c  /i>.  <i>-- titl
1f2f0 65 73 20 6f 66 20 74 68 65 20 31 30 20 6d 6f 73  es of the 10 mos
1f300 74 20 72 65 6c 65 76 61 6e 74 20 64 6f 63 75 6d  t relevant docum
1f310 65 6e 74 73 20 69 6e 20 74 68 65 20 64 61 74 61  ents in the data
1f320 73 65 74 20 66 6f 72 20 61 20 75 73 65 72 73 20  set for a users 
1f330 71 75 65 72 79 2e 3c 2f 69 3e 0a 20 20 53 45 4c  query.</i>.  SEL
1f340 45 43 54 20 74 69 74 6c 65 20 46 52 4f 4d 20 64  ECT title FROM d
1f350 6f 63 75 6d 65 6e 74 73 20 0a 20 20 20 20 57 48  ocuments .    WH
1f360 45 52 45 20 64 6f 63 75 6d 65 6e 74 73 20 4d 41  ERE documents MA
1f370 54 43 48 20 26 6c 74 3b 71 75 65 72 79 26 67 74  TCH &lt;query&gt
1f380 3b 0a 20 20 20 20 4f 52 44 45 52 20 42 59 20 72  ;.    ORDER BY r
1f390 61 6e 6b 28 6d 61 74 63 68 69 6e 66 6f 28 64 6f  ank(matchinfo(do
1f3a0 63 75 6d 65 6e 74 73 29 29 20 44 45 53 43 0a 20  cuments)) DESC. 
1f3b0 20 20 20 4c 49 4d 49 54 20 31 30 20 4f 46 46 53     LIMIT 10 OFFS
1f3c0 45 54 20 30 0a 3c 2f 63 6f 64 65 62 6c 6f 63 6b  ET 0.</codeblock
1f3d0 3e 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 53 51 4c  >..<p>.  The SQL
1f3e0 20 71 75 65 72 79 20 69 6e 20 74 68 65 20 65 78   query in the ex
1f3f0 61 6d 70 6c 65 20 61 62 6f 76 65 20 75 73 65 73  ample above uses
1f400 20 6c 65 73 73 20 43 50 55 20 74 68 61 6e 20 74   less CPU than t
1f410 68 65 20 66 69 72 73 74 20 65 78 61 6d 70 6c 65  he first example
1f420 0a 20 20 69 6e 20 74 68 69 73 20 73 65 63 74 69  .  in this secti
1f430 6f 6e 2c 20 62 75 74 20 73 74 69 6c 6c 20 68 61  on, but still ha
1f440 73 20 61 20 6e 6f 6e 2d 6f 62 76 69 6f 75 73 20  s a non-obvious 
1f450 70 65 72 66 6f 72 6d 61 6e 63 65 20 70 72 6f 62  performance prob
1f460 6c 65 6d 2e 20 53 51 4c 69 74 65 0a 20 20 73 61  lem. SQLite.  sa
1f470 74 69 73 66 69 65 73 20 74 68 69 73 20 71 75 65  tisfies this que
1f480 72 79 20 62 79 20 72 65 74 72 69 65 76 69 6e 67  ry by retrieving
1f490 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
1f4a0 65 20 22 74 69 74 6c 65 22 20 63 6f 6c 75 6d 6e  e "title" column
1f4b0 20 61 6e 64 0a 20 20 6d 61 74 63 68 69 6e 66 6f   and.  matchinfo
1f4c0 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 46   data from the F
1f4d0 54 53 20 6d 6f 64 75 6c 65 20 66 6f 72 20 65 76  TS module for ev
1f4e0 65 72 79 20 72 6f 77 20 6d 61 74 63 68 65 64 20  ery row matched 
1f4f0 62 79 20 74 68 65 20 75 73 65 72 73 0a 20 20 71  by the users.  q
1f500 75 65 72 79 20 62 65 66 6f 72 65 20 69 74 20 73  uery before it s
1f510 6f 72 74 73 20 61 6e 64 20 6c 69 6d 69 74 73 20  orts and limits 
1f520 74 68 65 20 72 65 73 75 6c 74 73 2e 20 42 65 63  the results. Bec
1f530 61 75 73 65 20 6f 66 20 74 68 65 20 77 61 79 20  ause of the way 
1f540 53 51 4c 69 74 65 27 73 0a 20 20 76 69 72 74 75  SQLite's.  virtu
1f550 61 6c 20 74 61 62 6c 65 20 69 6e 74 65 72 66 61  al table interfa
1f560 63 65 20 77 6f 72 6b 73 2c 20 72 65 74 72 69 65  ce works, retrie
1f570 76 69 6e 67 20 74 68 65 20 76 61 6c 75 65 20 6f  ving the value o
1f580 66 20 74 68 65 20 22 74 69 74 6c 65 22 20 63 6f  f the "title" co
1f590 6c 75 6d 6e 0a 20 20 72 65 71 75 69 72 65 73 20  lumn.  requires 
1f5a0 6c 6f 61 64 69 6e 67 20 74 68 65 20 65 6e 74 69  loading the enti
1f5b0 72 65 20 72 6f 77 20 66 72 6f 6d 20 64 69 73 6b  re row from disk
1f5c0 20 28 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20   (including the 
1f5d0 22 63 6f 6e 74 65 6e 74 22 20 66 69 65 6c 64 2c  "content" field,
1f5e0 0a 20 20 77 68 69 63 68 20 6d 61 79 20 62 65 20  .  which may be 
1f5f0 71 75 69 74 65 20 6c 61 72 67 65 29 2e 20 54 68  quite large). Th
1f600 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 69 66  is means that if
1f610 20 74 68 65 20 75 73 65 72 73 20 71 75 65 72 79   the users query
1f620 20 6d 61 74 63 68 65 73 0a 20 20 73 65 76 65 72   matches.  sever
1f630 61 6c 20 74 68 6f 75 73 61 6e 64 20 64 6f 63 75  al thousand docu
1f640 6d 65 6e 74 73 2c 20 6d 61 6e 79 20 6d 65 67 61  ments, many mega
1f650 62 79 74 65 73 20 6f 66 20 22 74 69 74 6c 65 22  bytes of "title"
1f660 20 61 6e 64 20 22 63 6f 6e 74 65 6e 74 22 20 64   and "content" d
1f670 61 74 61 0a 20 20 6d 61 79 20 62 65 20 6c 6f 61  ata.  may be loa
1f680 64 65 64 20 66 72 6f 6d 20 64 69 73 6b 20 69 6e  ded from disk in
1f690 74 6f 20 6d 65 6d 6f 72 79 20 65 76 65 6e 20 74  to memory even t
1f6a0 68 6f 75 67 68 20 74 68 65 79 20 77 69 6c 6c 20  hough they will 
1f6b0 6e 65 76 65 72 20 62 65 20 75 73 65 64 0a 20 20  never be used.  
1f6c0 66 6f 72 20 61 6e 79 20 70 75 72 70 6f 73 65 2e  for any purpose.
1f6d0 20 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 53 51 4c   ..<p>.  The SQL
1f6e0 20 71 75 65 72 79 20 69 6e 20 74 68 65 20 66 6f   query in the fo
1f6f0 6c 6c 6f 77 69 6e 67 20 65 78 61 6d 70 6c 65 20  llowing example 
1f700 62 6c 6f 63 6b 20 69 73 20 6f 6e 65 20 73 6f 6c  block is one sol
1f710 75 74 69 6f 6e 20 74 6f 20 74 68 69 73 20 0a 20  ution to this . 
1f720 20 70 72 6f 62 6c 65 6d 2e 20 49 6e 20 53 51 4c   problem. In SQL
1f730 69 74 65 2c 20 77 68 65 6e 20 61 20 3c 61 20 68  ite, when a <a h
1f740 72 65 66 3d 22 6f 70 74 6f 76 65 72 76 69 65 77  ref="optoverview
1f750 2e 68 74 6d 6c 23 66 6c 61 74 74 65 6e 69 6e 67  .html#flattening
1f760 22 3e 73 75 62 2d 71 75 65 72 79 20 0a 20 20 75  ">sub-query .  u
1f770 73 65 64 20 69 6e 20 61 20 6a 6f 69 6e 20 63 6f  sed in a join co
1f780 6e 74 61 69 6e 73 20 61 20 4c 49 4d 49 54 20 63  ntains a LIMIT c
1f790 6c 61 75 73 65 3c 2f 61 3e 2c 20 74 68 65 20 72  lause</a>, the r
1f7a0 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73 75  esults of the su
1f7b0 62 2d 71 75 65 72 79 20 61 72 65 0a 20 20 63 61  b-query are.  ca
1f7c0 6c 63 75 6c 61 74 65 64 20 61 6e 64 20 73 74 6f  lculated and sto
1f7d0 72 65 64 20 69 6e 20 74 65 6d 70 6f 72 61 72 79  red in temporary
1f7e0 20 74 61 62 6c 65 20 62 65 66 6f 72 65 20 74 68   table before th
1f7f0 65 20 6d 61 69 6e 20 71 75 65 72 79 20 69 73 20  e main query is 
1f800 65 78 65 63 75 74 65 64 2e 0a 20 20 54 68 69 73  executed..  This
1f810 20 6d 65 61 6e 73 20 74 68 61 74 20 53 51 4c 69   means that SQLi
1f820 74 65 20 77 69 6c 6c 20 6c 6f 61 64 20 6f 6e 6c  te will load onl
1f830 79 20 74 68 65 20 64 6f 63 69 64 20 61 6e 64 20  y the docid and 
1f840 6d 61 74 63 68 69 6e 66 6f 20 64 61 74 61 20 66  matchinfo data f
1f850 6f 72 20 65 61 63 68 0a 20 20 72 6f 77 20 6d 61  or each.  row ma
1f860 74 63 68 69 6e 67 20 74 68 65 20 75 73 65 72 73  tching the users
1f870 20 71 75 65 72 79 20 69 6e 74 6f 20 6d 65 6d 6f   query into memo
1f880 72 79 2c 20 64 65 74 65 72 6d 69 6e 65 20 74 68  ry, determine th
1f890 65 20 64 6f 63 69 64 20 76 61 6c 75 65 73 0a 20  e docid values. 
1f8a0 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
1f8b0 6f 20 74 68 65 20 74 65 6e 20 6d 6f 73 74 20 72  o the ten most r
1f8c0 65 6c 65 76 61 6e 74 20 64 6f 63 75 6d 65 6e 74  elevant document
1f8d0 73 2c 20 74 68 65 6e 20 6c 6f 61 64 20 6f 6e 6c  s, then load onl
1f8e0 79 20 74 68 65 20 74 69 74 6c 65 0a 20 20 61 6e  y the title.  an
1f8f0 64 20 63 6f 6e 74 65 6e 74 20 69 6e 66 6f 72 6d  d content inform
1f900 61 74 69 6f 6e 20 66 6f 72 20 74 68 6f 73 65 20  ation for those 
1f910 31 30 20 64 6f 63 75 6d 65 6e 74 73 20 6f 6e 6c  10 documents onl
1f920 79 2e 20 42 65 63 61 75 73 65 20 62 6f 74 68 20  y. Because both 
1f930 74 68 65 20 6d 61 74 63 68 69 6e 66 6f 0a 20 20  the matchinfo.  
1f940 61 6e 64 20 64 6f 63 69 64 20 76 61 6c 75 65 73  and docid values
1f950 20 61 72 65 20 67 6c 65 61 6e 65 64 20 65 6e 74   are gleaned ent
1f960 69 72 65 6c 79 20 66 72 6f 6d 20 74 68 65 20 66  irely from the f
1f970 75 6c 6c 2d 74 65 78 74 20 69 6e 64 65 78 2c 20  ull-text index, 
1f980 74 68 69 73 20 72 65 73 75 6c 74 73 0a 20 20 69  this results.  i
1f990 6e 20 64 72 61 6d 61 74 69 63 61 6c 6c 79 20 6c  n dramatically l
1f9a0 65 73 73 20 64 61 74 61 20 62 65 69 6e 67 20 6c  ess data being l
1f9b0 6f 61 64 65 64 20 66 72 6f 6d 20 74 68 65 20 64  oaded from the d
1f9c0 61 74 61 62 61 73 65 20 69 6e 74 6f 20 6d 65 6d  atabase into mem
1f9d0 6f 72 79 2e 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b  ory...<codeblock
1f9e0 3e 0a 20 20 53 45 4c 45 43 54 20 74 69 74 6c 65  >.  SELECT title
1f9f0 20 46 52 4f 4d 20 64 6f 63 75 6d 65 6e 74 73 20   FROM documents 
1fa00 4a 4f 49 4e 20 28 20 0a 20 20 20 20 20 20 53 45  JOIN ( .      SE
1fa10 4c 45 43 54 20 64 6f 63 69 64 2c 20 72 61 6e 6b  LECT docid, rank
1fa20 28 6d 61 74 63 68 69 6e 66 6f 28 64 6f 63 75 6d  (matchinfo(docum
1fa30 65 6e 74 73 29 29 20 41 53 20 72 61 6e 6b 20 0a  ents)) AS rank .
1fa40 20 20 20 20 20 20 46 52 4f 4d 20 64 6f 63 75 6d        FROM docum
1fa50 65 6e 74 73 0a 20 20 20 20 20 20 57 48 45 52 45  ents.      WHERE
1fa60 20 64 6f 63 75 6d 65 6e 74 73 20 4d 41 54 43 48   documents MATCH
1fa70 20 26 6c 74 3b 71 75 65 72 79 26 67 74 3b 0a 20   &lt;query&gt;. 
1fa80 20 20 20 20 20 4f 52 44 45 52 20 42 59 20 72 61       ORDER BY ra
1fa90 6e 6b 20 44 45 53 43 20 0a 20 20 20 20 20 20 4c  nk DESC .      L
1faa0 49 4d 49 54 20 31 30 20 4f 46 46 53 45 54 20 30  IMIT 10 OFFSET 0
1fab0 0a 20 20 29 20 41 53 20 72 61 6e 6b 74 61 62 6c  .  ) AS ranktabl
1fac0 65 20 55 53 49 4e 47 28 64 6f 63 69 64 29 0a 20  e USING(docid). 
1fad0 20 4f 52 44 45 52 20 42 59 20 72 61 6e 6b 74 61   ORDER BY rankta
1fae0 62 6c 65 2e 72 61 6e 6b 20 44 45 53 43 0a 3c 2f  ble.rank DESC.</
1faf0 63 6f 64 65 62 6c 6f 63 6b 3e 0a 0a 3c 70 3e 0a  codeblock>..<p>.
1fb00 20 20 54 68 65 20 6e 65 78 74 20 62 6c 6f 63 6b    The next block
1fb10 20 6f 66 20 53 51 4c 20 65 6e 68 61 6e 63 65 73   of SQL enhances
1fb20 20 74 68 65 20 71 75 65 72 79 20 77 69 74 68 20   the query with 
1fb30 73 6f 6c 75 74 69 6f 6e 73 20 74 6f 20 74 77 6f  solutions to two
1fb40 20 6f 74 68 65 72 20 70 72 6f 62 6c 65 6d 73 0a   other problems.
1fb50 20 20 74 68 61 74 20 6d 61 79 20 61 72 69 73 65    that may arise
1fb60 20 69 6e 20 64 65 76 65 6c 6f 70 69 6e 67 20 73   in developing s
1fb70 65 61 72 63 68 20 61 70 70 6c 69 63 61 74 69 6f  earch applicatio
1fb80 6e 73 20 75 73 69 6e 67 20 46 54 53 3a 0a 0a 3c  ns using FTS:..<
1fb90 6f 6c 3e 0a 20 20 3c 6c 69 3e 20 3c 70 3e 0a 20  ol>.  <li> <p>. 
1fba0 20 20 20 20 20 20 54 68 65 20 5b 73 6e 69 70 70        The [snipp
1fbb0 65 74 5d 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e  et] function can
1fbc0 6e 6f 74 20 62 65 20 75 73 65 64 20 77 69 74 68  not be used with
1fbd0 20 74 68 65 20 61 62 6f 76 65 20 71 75 65 72 79   the above query
1fbe0 2e 20 42 65 63 61 75 73 65 0a 20 20 20 20 20 20  . Because.      
1fbf0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1fc00 20 64 6f 65 73 20 6e 6f 74 20 69 6e 63 6c 75 64   does not includ
1fc10 65 20 61 20 22 57 48 45 52 45 20 2e 2e 2e 20 4d  e a "WHERE ... M
1fc20 41 54 43 48 22 20 63 6c 61 75 73 65 2c 20 74 68  ATCH" clause, th
1fc30 65 20 73 6e 69 70 70 65 74 20 0a 20 20 20 20 20  e snippet .     
1fc40 20 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 6e    function may n
1fc50 6f 74 20 62 65 20 75 73 65 64 20 77 69 74 68 20  ot be used with 
1fc60 69 74 2e 20 4f 6e 65 20 73 6f 6c 75 74 69 6f 6e  it. One solution
1fc70 20 69 73 20 74 6f 20 64 75 70 6c 69 63 61 74 65   is to duplicate
1fc80 20 74 68 65 20 57 48 45 52 45 0a 20 20 20 20 20   the WHERE.     
1fc90 20 20 63 6c 61 75 73 65 20 75 73 65 64 20 62 79    clause used by
1fca0 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 69   the sub-query i
1fcb0 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
1fcc0 79 2e 20 54 68 65 20 6f 76 65 72 68 65 61 64 20  y. The overhead 
1fcd0 61 73 73 6f 63 69 61 74 65 64 0a 20 20 20 20 20  associated.     
1fce0 20 20 77 69 74 68 20 74 68 69 73 20 69 73 20 75    with this is u
1fcf0 73 75 61 6c 6c 79 20 6e 65 67 6c 69 67 69 62 6c  sually negligibl
1fd00 65 2e 0a 20 20 3c 6c 69 3e 20 3c 70 3e 0a 20 20  e..  <li> <p>.  
1fd10 20 20 20 20 20 54 68 65 20 72 65 6c 65 76 61 6e       The relevan
1fd20 63 79 20 6f 66 20 61 20 64 6f 63 75 6d 65 6e 74  cy of a document
1fd30 20 6d 61 79 20 64 65 70 65 6e 64 20 6f 6e 20 73   may depend on s
1fd40 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72 20 74  omething other t
1fd50 68 61 6e 20 6a 75 73 74 0a 20 20 20 20 20 20 20  han just.       
1fd60 74 68 65 20 64 61 74 61 20 61 76 61 69 6c 61 62  the data availab
1fd70 6c 65 20 69 6e 20 74 68 65 20 72 65 74 75 72 6e  le in the return
1fd80 20 76 61 6c 75 65 20 6f 66 20 6d 61 74 63 68 69   value of matchi
1fd90 6e 66 6f 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65  nfo. For example
1fda0 0a 20 20 20 20 20 20 20 65 61 63 68 20 64 6f 63  .       each doc
1fdb0 75 6d 65 6e 74 20 69 6e 20 74 68 65 20 64 61 74  ument in the dat
1fdc0 61 62 61 73 65 20 6d 61 79 20 62 65 20 61 73 73  abase may be ass
1fdd0 69 67 6e 65 64 20 61 20 73 74 61 74 69 63 20 77  igned a static w
1fde0 65 69 67 68 74 20 62 61 73 65 64 0a 20 20 20 20  eight based.    
1fdf0 20 20 20 6f 6e 20 66 61 63 74 6f 72 73 20 75 6e     on factors un
1fe00 72 65 6c 61 74 65 64 20 74 6f 20 69 74 73 20 63  related to its c
1fe10 6f 6e 74 65 6e 74 20 28 6f 72 69 67 69 6e 2c 20  ontent (origin, 
1fe20 61 75 74 68 6f 72 2c 20 61 67 65 2c 20 6e 75 6d  author, age, num
1fe30 62 65 72 0a 20 20 20 20 20 20 20 6f 66 20 72 65  ber.       of re
1fe40 66 65 72 65 6e 63 65 73 20 65 74 63 2e 29 2e 20  ferences etc.). 
1fe50 54 68 65 73 65 20 76 61 6c 75 65 73 20 63 61 6e  These values can
1fe60 20 62 65 20 73 74 6f 72 65 64 20 62 79 20 74 68   be stored by th
1fe70 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 0a 20 20  e application.  
1fe80 20 20 20 20 20 69 6e 20 61 20 73 65 70 61 72 61       in a separa
1fe90 74 65 20 74 61 62 6c 65 20 74 68 61 74 20 63 61  te table that ca
1fea0 6e 20 62 65 20 6a 6f 69 6e 65 64 20 61 67 61 69  n be joined agai
1feb0 6e 73 74 20 74 68 65 20 64 6f 63 75 6d 65 6e 74  nst the document
1fec0 73 20 74 61 62 6c 65 0a 20 20 20 20 20 20 20 69  s table.       i
1fed0 6e 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20  n the sub-query 
1fee0 73 6f 20 74 68 61 74 20 74 68 65 20 72 61 6e 6b  so that the rank
1fef0 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 61 63   function may ac
1ff00 63 65 73 73 20 74 68 65 6d 2e 0a 3c 2f 6f 6c 3e  cess them..</ol>
1ff10 0a 0a 3c 70 3e 0a 20 20 54 68 69 73 20 76 65 72  ..<p>.  This ver
1ff20 73 69 6f 6e 20 6f 66 20 74 68 65 20 71 75 65 72  sion of the quer
1ff30 79 20 69 73 20 76 65 72 79 20 73 69 6d 69 6c 61  y is very simila
1ff40 72 20 74 6f 20 74 68 61 74 20 75 73 65 64 20 62  r to that used b
1ff50 79 20 74 68 65 20 0a 20 20 3c 61 20 68 72 65 66  y the .  <a href
1ff60 3d 22 68 74 74 70 3a 2f 2f 77 77 77 2e 73 71 6c  ="http://www.sql
1ff70 69 74 65 2e 6f 72 67 2f 73 65 61 72 63 68 3f 71  ite.org/search?q
1ff80 3d 66 74 73 33 22 3e 73 71 6c 69 74 65 2e 6f 72  =fts3">sqlite.or
1ff90 67 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20  g documentation 
1ffa0 73 65 61 72 63 68 3c 2f 61 3e 20 0a 20 20 61 70  search</a> .  ap
1ffb0 70 6c 69 63 61 74 69 6f 6e 2e 0a 0a 3c 63 6f 64  plication...<cod
1ffc0 65 62 6c 6f 63 6b 3e 0a 20 20 3c 69 3e 2d 2d 20  eblock>.  <i>-- 
1ffd0 54 68 69 73 20 74 61 62 6c 65 20 73 74 6f 72 65  This table store
1ffe0 73 20 74 68 65 20 73 74 61 74 69 63 20 77 65 69  s the static wei
1fff0 67 68 74 20 61 73 73 69 67 6e 65 64 20 74 6f 20  ght assigned to 
20000 65 61 63 68 20 64 6f 63 75 6d 65 6e 74 20 69 6e  each document in
20010 20 46 54 53 20 74 61 62 6c 65 3c 2f 69 3e 0a 20   FTS table</i>. 
20020 20 3c 69 3e 2d 2d 20 22 64 6f 63 75 6d 65 6e 74   <i>-- "document
20030 73 22 2e 20 46 6f 72 20 65 61 63 68 20 72 6f 77  s". For each row
20040 20 69 6e 20 74 68 65 20 64 6f 63 75 6d 65 6e 74   in the document
20050 73 20 74 61 62 6c 65 20 74 68 65 72 65 20 69 73  s table there is
20060 20 61 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67   a corresponding
20070 20 72 6f 77 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d   row</i>.  <i>--
20080 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 64   with the same d
20090 6f 63 69 64 20 76 61 6c 75 65 20 69 6e 20 74 68  ocid value in th
200a0 69 73 20 74 61 62 6c 65 2e 3c 2f 69 3e 0a 20 20  is table.</i>.  
200b0 43 52 45 41 54 45 20 54 41 42 4c 45 20 64 6f 63  CREATE TABLE doc
200c0 75 6d 65 6e 74 73 5f 64 61 74 61 28 64 6f 63 69  uments_data(doci
200d0 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  d INTEGER PRIMAR
200e0 59 20 4b 45 59 2c 20 77 65 69 67 68 74 29 3b 0a  Y KEY, weight);.
200f0 0a 20 20 3c 69 3e 2d 2d 20 54 68 69 73 20 71 75  .  <i>-- This qu
20100 65 72 79 20 69 73 20 73 69 6d 69 6c 61 72 20 74  ery is similar t
20110 6f 20 74 68 65 20 6f 6e 65 20 69 6e 20 74 68 65  o the one in the
20120 20 62 6c 6f 63 6b 20 61 62 6f 76 65 2c 20 65 78   block above, ex
20130 63 65 70 74 20 74 68 61 74 3a 3c 2f 69 3e 0a 20  cept that:</i>. 
20140 20 3c 69 3e 2d 2d 3c 2f 69 3e 0a 20 20 3c 69 3e   <i>--</i>.  <i>
20150 2d 2d 20 20 20 31 2e 20 49 74 20 72 65 74 75 72  --   1. It retur
20160 6e 73 20 61 20 22 73 6e 69 70 70 65 74 22 20 6f  ns a "snippet" o
20170 66 20 74 65 78 74 20 61 6c 6f 6e 67 20 77 69 74  f text along wit
20180 68 20 74 68 65 20 64 6f 63 75 6d 65 6e 74 20 74  h the document t
20190 69 74 6c 65 20 66 6f 72 20 64 69 73 70 6c 61 79  itle for display
201a0 2e 20 53 6f 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d  . So</i>.  <i>--
201b0 20 20 20 20 20 20 74 68 61 74 20 74 68 65 20 73        that the s
201c0 6e 69 70 70 65 74 20 66 75 6e 63 74 69 6f 6e 20  nippet function 
201d0 6d 61 79 20 62 65 20 75 73 65 64 2c 20 74 68 65  may be used, the
201e0 20 22 57 48 45 52 45 20 2e 2e 2e 20 4d 41 54 43   "WHERE ... MATC
201f0 48 20 2e 2e 2e 22 20 63 6c 61 75 73 65 20 66 72  H ..." clause fr
20200 6f 6d 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 20  om</i>.  <i>--  
20210 20 20 20 20 74 68 65 20 73 75 62 2d 71 75 65 72      the sub-quer
20220 79 20 69 73 20 64 75 70 6c 69 63 61 74 65 64 20  y is duplicated 
20230 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  in the outer que
20240 72 79 2e 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 3c  ry.</i>.  <i>--<
20250 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 20 20 32 2e  /i>.  <i>--   2.
20260 20 54 68 65 20 73 75 62 2d 71 75 65 72 79 20 6a   The sub-query j
20270 6f 69 6e 73 20 74 68 65 20 64 6f 63 75 6d 65 6e  oins the documen
20280 74 73 20 74 61 62 6c 65 20 77 69 74 68 20 74 68  ts table with th
20290 65 20 64 6f 63 75 6d 65 6e 74 5f 64 61 74 61 20  e document_data 
202a0 74 61 62 6c 65 2c 20 73 6f 20 74 68 61 74 3c 2f  table, so that</
202b0 69 3e 0a 20 20 3c 69 3e 2d 2d 20 20 20 20 20 20  i>.  <i>--      
202c0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
202d0 66 20 74 68 65 20 72 61 6e 6b 20 66 75 6e 63 74  f the rank funct
202e0 69 6f 6e 20 68 61 73 20 61 63 63 65 73 73 20 74  ion has access t
202f0 6f 20 74 68 65 20 73 74 61 74 69 63 20 77 65 69  o the static wei
20300 67 68 74 20 61 73 73 69 67 6e 65 64 3c 2f 69 3e  ght assigned</i>
20310 0a 20 20 3c 69 3e 2d 2d 20 20 20 20 20 20 74 6f  .  <i>--      to
20320 20 65 61 63 68 20 64 6f 63 75 6d 65 6e 74 2e 3c   each document.<
20330 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20 74 69 74  /i>.  SELECT tit
20340 6c 65 2c 20 73 6e 69 70 70 65 74 28 64 6f 63 75  le, snippet(docu
20350 6d 65 6e 74 73 29 20 46 52 4f 4d 20 64 6f 63 75  ments) FROM docu
20360 6d 65 6e 74 73 20 4a 4f 49 4e 20 28 20 0a 20 20  ments JOIN ( .  
20370 20 20 20 20 53 45 4c 45 43 54 20 64 6f 63 69 64      SELECT docid
20380 2c 20 72 61 6e 6b 28 6d 61 74 63 68 69 6e 66 6f  , rank(matchinfo
20390 28 64 6f 63 75 6d 65 6e 74 73 29 2c 20 64 6f 63  (documents), doc
203a0 75 6d 65 6e 74 73 5f 64 61 74 61 2e 77 65 69 67  uments_data.weig
203b0 68 74 29 20 41 53 20 72 61 6e 6b 0a 20 20 20 20  ht) AS rank.    
203c0 20 20 46 52 4f 4d 20 64 6f 63 75 6d 65 6e 74 73    FROM documents
203d0 20 4a 4f 49 4e 20 64 6f 63 75 6d 65 6e 74 73 5f   JOIN documents_
203e0 64 61 74 61 20 55 53 49 4e 47 28 64 6f 63 69 64  data USING(docid
203f0 29 0a 20 20 20 20 20 20 57 48 45 52 45 20 64 6f  ).      WHERE do
20400 63 75 6d 65 6e 74 73 20 4d 41 54 43 48 20 26 6c  cuments MATCH &l
20410 74 3b 71 75 65 72 79 26 67 74 3b 0a 20 20 20 20  t;query&gt;.    
20420 20 20 4f 52 44 45 52 20 42 59 20 72 61 6e 6b 20    ORDER BY rank 
20430 44 45 53 43 20 0a 20 20 20 20 20 20 4c 49 4d 49  DESC .      LIMI
20440 54 20 31 30 20 4f 46 46 53 45 54 20 30 0a 20 20  T 10 OFFSET 0.  
20450 29 20 41 53 20 72 61 6e 6b 74 61 62 6c 65 20 55  ) AS ranktable U
20460 53 49 4e 47 28 64 6f 63 69 64 29 0a 20 20 57 48  SING(docid).  WH
20470 45 52 45 20 64 6f 63 75 6d 65 6e 74 73 20 4d 41  ERE documents MA
20480 54 43 48 20 26 6c 74 3b 71 75 65 72 79 26 67 74  TCH &lt;query&gt
20490 3b 0a 20 20 4f 52 44 45 52 20 42 59 20 72 61 6e  ;.  ORDER BY ran
204a0 6b 74 61 62 6c 65 2e 72 61 6e 6b 20 44 45 53 43  ktable.rank DESC
204b0 0a 3c 2f 63 6f 64 65 62 6c 6f 63 6b 3e 0a 0a 3c  .</codeblock>..<
204c0 70 3e 0a 20 20 41 6c 6c 20 74 68 65 20 65 78 61  p>.  All the exa
204d0 6d 70 6c 65 20 71 75 65 72 69 65 73 20 61 62 6f  mple queries abo
204e0 76 65 20 72 65 74 75 72 6e 20 74 68 65 20 74 65  ve return the te
204f0 6e 20 6d 6f 73 74 20 72 65 6c 65 76 61 6e 74 20  n most relevant 
20500 71 75 65 72 79 20 72 65 73 75 6c 74 73 2e 0a 20  query results.. 
20510 20 42 79 20 6d 6f 64 69 66 79 69 6e 67 20 74 68   By modifying th
20520 65 20 76 61 6c 75 65 73 20 75 73 65 64 20 77 69  e values used wi
20530 74 68 20 74 68 65 20 4f 46 46 53 45 54 20 61 6e  th the OFFSET an
20540 64 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 73 2c  d LIMIT clauses,
20550 20 61 20 71 75 65 72 79 20 0a 20 20 74 6f 20 72   a query .  to r
20560 65 74 75 72 6e 20 28 73 61 79 29 20 74 68 65 20  eturn (say) the 
20570 6e 65 78 74 20 74 65 6e 20 6d 6f 73 74 20 72 65  next ten most re
20580 6c 65 76 61 6e 74 20 72 65 73 75 6c 74 73 20 69  levant results i
20590 73 20 65 61 73 79 20 74 6f 20 63 6f 6e 73 74 72  s easy to constr
205a0 75 63 74 2e 20 0a 20 20 54 68 69 73 20 6d 61 79  uct. .  This may
205b0 20 62 65 20 75 73 65 64 20 74 6f 20 6f 62 74 61   be used to obta
205c0 69 6e 20 74 68 65 20 64 61 74 61 20 72 65 71 75  in the data requ
205d0 69 72 65 64 20 66 6f 72 20 61 20 73 65 61 72 63  ired for a searc
205e0 68 20 61 70 70 6c 69 63 61 74 69 6f 6e 73 20 73  h applications s
205f0 65 63 6f 6e 64 0a 20 20 61 6e 64 20 73 75 62 73  econd.  and subs
20600 65 71 75 65 6e 74 20 70 61 67 65 73 20 6f 66 20  equent pages of 
20610 72 65 73 75 6c 74 73 2e 0a 0a 3c 70 3e 0a 20 20  results...<p>.  
20620 54 68 65 20 6e 65 78 74 20 62 6c 6f 63 6b 20 63  The next block c
20630 6f 6e 74 61 69 6e 73 20 61 6e 20 65 78 61 6d 70  ontains an examp
20640 6c 65 20 72 61 6e 6b 20 66 75 6e 63 74 69 6f 6e  le rank function
20650 20 74 68 61 74 20 75 73 65 73 20 6d 61 74 63 68   that uses match
20660 69 6e 66 6f 20 64 61 74 61 20 0a 20 20 69 6d 70  info data .  imp
20670 6c 65 6d 65 6e 74 65 64 20 69 6e 20 43 2e 20 49  lemented in C. I
20680 6e 73 74 65 61 64 20 6f 66 20 61 20 73 69 6e 67  nstead of a sing
20690 6c 65 20 77 65 69 67 68 74 2c 20 69 74 20 61 6c  le weight, it al
206a0 6c 6f 77 73 20 61 20 77 65 69 67 68 74 20 74 6f  lows a weight to
206b0 20 62 65 20 0a 20 20 65 78 74 65 72 6e 61 6c 6c   be .  externall
206c0 79 20 61 73 73 69 67 6e 65 64 20 74 6f 20 65 61  y assigned to ea
206d0 63 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 65 61 63  ch column of eac
206e0 68 20 64 6f 63 75 6d 65 6e 74 2e 20 49 74 20 6d  h document. It m
206f0 61 79 20 62 65 20 72 65 67 69 73 74 65 72 65 64  ay be registered
20700 0a 20 20 77 69 74 68 20 53 51 4c 69 74 65 20 6c  .  with SQLite l
20710 69 6b 65 20 61 6e 79 20 6f 74 68 65 72 20 75 73  ike any other us
20720 65 72 20 66 75 6e 63 74 69 6f 6e 20 75 73 69 6e  er function usin
20730 67 20 5b 73 71 6c 69 74 65 33 5f 63 72 65 61 74  g [sqlite3_creat
20740 65 5f 66 75 6e 63 74 69 6f 6e 5d 2e 0a 0a 3c 63  e_function]...<c
20750 6f 64 65 62 6c 6f 63 6b 3e 0a 3c 69 3e 2f 2a 3c  odeblock>.<i>/*<
20760 2f 69 3e 0a 3c 69 3e 2a 2a 20 53 51 4c 69 74 65  /i>.<i>** SQLite
20770 20 75 73 65 72 20 64 65 66 69 6e 65 64 20 66 75   user defined fu
20780 6e 63 74 69 6f 6e 20 74 6f 20 75 73 65 20 77 69  nction to use wi
20790 74 68 20 6d 61 74 63 68 69 6e 66 6f 28 29 20 74  th matchinfo() t
207a0 6f 20 63 61 6c 63 75 6c 61 74 65 20 74 68 65 3c  o calculate the<
207b0 2f 69 3e 0a 3c 69 3e 2a 2a 20 72 65 6c 65 76 61  /i>.<i>** releva
207c0 6e 63 79 20 6f 66 20 61 6e 20 46 54 53 20 6d 61  ncy of an FTS ma
207d0 74 63 68 2e 20 54 68 65 20 76 61 6c 75 65 20 72  tch. The value r
207e0 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 20 72  eturned is the r
207f0 65 6c 65 76 61 6e 63 79 20 73 63 6f 72 65 3c 2f  elevancy score</
20800 69 3e 0a 3c 69 3e 2a 2a 20 28 61 20 72 65 61 6c  i>.<i>** (a real
20810 20 76 61 6c 75 65 20 67 72 65 61 74 65 72 20 74   value greater t
20820 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
20830 7a 65 72 6f 29 2e 20 41 20 6c 61 72 67 65 72 20  zero). A larger 
20840 76 61 6c 75 65 20 69 6e 64 69 63 61 74 65 73 20  value indicates 
20850 3c 2f 69 3e 0a 3c 69 3e 2a 2a 20 61 20 6d 6f 72  </i>.<i>** a mor
20860 65 20 72 65 6c 65 76 61 6e 74 20 64 6f 63 75 6d  e relevant docum
20870 65 6e 74 2e 3c 2f 69 3e 0a 3c 69 3e 2a 2a 3c 2f  ent.</i>.<i>**</
20880 69 3e 0a 3c 69 3e 2a 2a 20 54 68 65 20 6f 76 65  i>.<i>** The ove
20890 72 61 6c 6c 20 72 65 6c 65 76 61 6e 63 79 20 72  rall relevancy r
208a0 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 20 73  eturned is the s
208b0 75 6d 20 6f 66 20 74 68 65 20 72 65 6c 65 76 61  um of the releva
208c0 6e 63 69 65 73 20 6f 66 20 65 61 63 68 20 3c 2f  ncies of each </
208d0 69 3e 0a 3c 69 3e 2a 2a 20 63 6f 6c 75 6d 6e 20  i>.<i>** column 
208e0 76 61 6c 75 65 20 69 6e 20 74 68 65 20 46 54 53  value in the FTS
208f0 20 74 61 62 6c 65 2e 20 54 68 65 20 72 65 6c 65   table. The rele
20900 76 61 6e 63 79 20 6f 66 20 61 20 63 6f 6c 75 6d  vancy of a colum
20910 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65 3c 2f  n value is the</
20920 69 3e 0a 3c 69 3e 2a 2a 20 73 75 6d 20 6f 66 20  i>.<i>** sum of 
20930 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f  the following fo
20940 72 20 65 61 63 68 20 72 65 70 6f 72 74 61 62 6c  r each reportabl
20950 65 20 70 68 72 61 73 65 20 69 6e 20 74 68 65 20  e phrase in the 
20960 46 54 53 20 71 75 65 72 79 3a 3c 2f 69 3e 0a 3c  FTS query:</i>.<
20970 69 3e 2a 2a 3c 2f 69 3e 0a 3c 69 3e 2a 2a 20 20  i>**</i>.<i>**  
20980 20 28 26 6c 74 3b 68 69 74 20 63 6f 75 6e 74 26   (&lt;hit count&
20990 67 74 3b 20 2f 20 26 6c 74 3b 67 6c 6f 62 61 6c  gt; / &lt;global
209a0 20 68 69 74 20 63 6f 75 6e 74 26 67 74 29 20 2a   hit count&gt) *
209b0 20 26 6c 74 3b 63 6f 6c 75 6d 6e 20 77 65 69 67   &lt;column weig
209c0 68 74 26 67 74 3b 3c 2f 69 3e 0a 3c 69 3e 2a 2a  ht&gt;</i>.<i>**
209d0 3c 2f 69 3e 0a 3c 69 3e 2a 2a 20 77 68 65 72 65  </i>.<i>** where
209e0 20 26 6c 74 3b 68 69 74 20 63 6f 75 6e 74 26 67   &lt;hit count&g
209f0 74 3b 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  t; is the number
20a00 20 6f 66 20 69 6e 73 74 61 6e 63 65 73 20 6f 66   of instances of
20a10 20 74 68 65 20 70 68 72 61 73 65 20 69 6e 20 74   the phrase in t
20a20 68 65 3c 2f 69 3e 0a 3c 69 3e 2a 2a 20 63 6f 6c  he</i>.<i>** col
20a30 75 6d 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 65  umn value of the
20a40 20 63 75 72 72 65 6e 74 20 72 6f 77 20 61 6e 64   current row and
20a50 20 26 6c 74 3b 67 6c 6f 62 61 6c 20 68 69 74 20   &lt;global hit 
20a60 63 6f 75 6e 74 26 67 74 3b 20 69 73 20 74 68 65  count&gt; is the
20a70 20 6e 75 6d 62 65 72 3c 2f 69 3e 0a 3c 69 3e 2a   number</i>.<i>*
20a80 2a 20 6f 66 20 69 6e 73 74 61 6e 63 65 73 20 6f  * of instances o
20a90 66 20 74 68 65 20 70 68 72 61 73 65 20 69 6e 20  f the phrase in 
20aa0 74 68 65 20 73 61 6d 65 20 63 6f 6c 75 6d 6e 20  the same column 
20ab0 6f 66 20 61 6c 6c 20 72 6f 77 73 20 69 6e 20 74  of all rows in t
20ac0 68 65 20 46 54 53 3c 2f 69 3e 0a 3c 69 3e 2a 2a  he FTS</i>.<i>**
20ad0 20 74 61 62 6c 65 2e 20 54 68 65 20 26 6c 74 3b   table. The &lt;
20ae0 63 6f 6c 75 6d 6e 20 77 65 69 67 68 74 26 67 74  column weight&gt
20af0 3b 20 69 73 20 61 20 77 65 69 67 68 74 69 6e 67  ; is a weighting
20b00 20 66 61 63 74 6f 72 20 61 73 73 69 67 6e 65 64   factor assigned
20b10 20 74 6f 20 65 61 63 68 3c 2f 69 3e 0a 3c 69 3e   to each</i>.<i>
20b20 2a 2a 20 63 6f 6c 75 6d 6e 20 62 79 20 74 68 65  ** column by the
20b30 20 63 61 6c 6c 65 72 20 28 73 65 65 20 62 65 6c   caller (see bel
20b40 6f 77 29 2e 3c 2f 69 3e 0a 3c 69 3e 2a 2a 3c 2f  ow).</i>.<i>**</
20b50 69 3e 0a 3c 69 3e 2a 2a 20 54 68 65 20 66 69 72  i>.<i>** The fir
20b60 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  st argument to t
20b70 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73  his function mus
20b80 74 20 62 65 20 74 68 65 20 72 65 74 75 72 6e 20  t be the return 
20b90 76 61 6c 75 65 20 6f 66 20 74 68 65 20 46 54 53  value of the FTS
20ba0 20 3c 2f 69 3e 0a 3c 69 3e 2a 2a 20 6d 61 74 63   </i>.<i>** matc
20bb0 68 69 6e 66 6f 28 29 20 66 75 6e 63 74 69 6f 6e  hinfo() function
20bc0 2e 20 46 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73  . Following this
20bd0 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 61 72 67   must be one arg
20be0 75 6d 65 6e 74 20 66 6f 72 20 65 61 63 68 20 63  ument for each c
20bf0 6f 6c 75 6d 6e 20 3c 2f 69 3e 0a 3c 69 3e 2a 2a  olumn </i>.<i>**
20c00 20 6f 66 20 74 68 65 20 46 54 53 20 74 61 62 6c   of the FTS tabl
20c10 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 20 6e  e containing a n
20c20 75 6d 65 72 69 63 20 77 65 69 67 68 74 20 66 61  umeric weight fa
20c30 63 74 6f 72 20 66 6f 72 20 74 68 65 20 63 6f 72  ctor for the cor
20c40 72 65 73 70 6f 6e 64 69 6e 67 20 3c 2f 69 3e 0a  responding </i>.
20c50 3c 69 3e 2a 2a 20 63 6f 6c 75 6d 6e 2e 20 45 78  <i>** column. Ex
20c60 61 6d 70 6c 65 3a 3c 2f 69 3e 0a 3c 69 3e 2a 2a  ample:</i>.<i>**
20c70 3c 2f 69 3e 0a 3c 69 3e 2a 2a 20 20 20 20 20 43  </i>.<i>**     C
20c80 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41  REATE VIRTUAL TA
20c90 42 4c 45 20 64 6f 63 75 6d 65 6e 74 73 20 55 53  BLE documents US
20ca0 49 4e 47 20 66 74 73 33 28 74 69 74 6c 65 2c 20  ING fts3(title, 
20cb0 63 6f 6e 74 65 6e 74 29 3c 2f 69 3e 0a 3c 69 3e  content)</i>.<i>
20cc0 2a 2a 3c 2f 69 3e 0a 3c 69 3e 2a 2a 20 54 68 65  **</i>.<i>** The
20cd0 20 66 6f 6c 6c 6f 77 69 6e 67 20 71 75 65 72 79   following query
20ce0 20 72 65 74 75 72 6e 73 20 74 68 65 20 64 6f 63   returns the doc
20cf0 69 64 73 20 6f 66 20 64 6f 63 75 6d 65 6e 74 73  ids of documents
20d00 20 74 68 61 74 20 6d 61 74 63 68 20 74 68 65 20   that match the 
20d10 66 75 6c 6c 2d 74 65 78 74 3c 2f 69 3e 0a 3c 69  full-text</i>.<i
20d20 3e 2a 2a 20 71 75 65 72 79 20 26 6c 74 3b 71 75  >** query &lt;qu
20d30 65 72 79 26 67 74 3b 20 73 6f 72 74 65 64 20 66  ery&gt; sorted f
20d40 72 6f 6d 20 6d 6f 73 74 20 74 6f 20 6c 65 61 73  rom most to leas
20d50 74 20 72 65 6c 65 76 61 6e 74 2e 20 57 68 65 6e  t relevant. When
20d60 20 63 61 6c 63 75 6c 61 74 69 6e 67 3c 2f 69 3e   calculating</i>
20d70 0a 3c 69 3e 2a 2a 20 72 65 6c 65 76 61 6e 63 65  .<i>** relevance
20d80 2c 20 71 75 65 72 79 20 74 65 72 6d 20 69 6e 73  , query term ins
20d90 74 61 6e 63 65 73 20 69 6e 20 74 68 65 20 27 74  tances in the 't
20da0 69 74 6c 65 27 20 63 6f 6c 75 6d 6e 20 61 72 65  itle' column are
20db0 20 67 69 76 65 6e 20 74 77 69 63 65 20 74 68 65   given twice the
20dc0 3c 2f 69 3e 0a 3c 69 3e 2a 2a 20 77 65 69 67 68  </i>.<i>** weigh
20dd0 74 69 6e 67 20 6f 66 20 74 68 6f 73 65 20 69 6e  ting of those in
20de0 20 74 68 65 20 27 63 6f 6e 74 65 6e 74 27 20 63   the 'content' c
20df0 6f 6c 75 6d 6e 2e 3c 2f 69 3e 0a 3c 69 3e 2a 2a  olumn.</i>.<i>**
20e00 3c 2f 69 3e 0a 3c 69 3e 2a 2a 20 20 20 20 20 53  </i>.<i>**     S
20e10 45 4c 45 43 54 20 64 6f 63 69 64 20 46 52 4f 4d  ELECT docid FROM
20e20 20 64 6f 63 75 6d 65 6e 74 73 20 3c 2f 69 3e 0a   documents </i>.
20e30 3c 69 3e 2a 2a 20 20 20 20 20 57 48 45 52 45 20  <i>**     WHERE 
20e40 64 6f 63 75 6d 65 6e 74 73 20 4d 41 54 43 48 20  documents MATCH 
20e50 26 6c 74 3b 71 75 65 72 79 26 67 74 3b 20 3c 2f  &lt;query&gt; </
20e60 69 3e 0a 3c 69 3e 2a 2a 20 20 20 20 20 4f 52 44  i>.<i>**     ORD
20e70 45 52 20 42 59 20 72 61 6e 6b 28 6d 61 74 63 68  ER BY rank(match
20e80 69 6e 66 6f 28 64 6f 63 75 6d 65 6e 74 73 29 2c  info(documents),
20e90 20 31 2e 30 2c 20 30 2e 35 29 20 44 45 53 43 3c   1.0, 0.5) DESC<
20ea0 2f 69 3e 0a 3c 69 3e 2a 2f 3c 2f 69 3e 0a 73 74  /i>.<i>*/</i>.st
20eb0 61 74 69 63 20 76 6f 69 64 20 72 61 6e 6b 66 75  atic void rankfu
20ec0 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  nc(sqlite3_conte
20ed0 78 74 20 2a 70 43 74 78 2c 20 69 6e 74 20 6e 56  xt *pCtx, int nV
20ee0 61 6c 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  al, sqlite3_valu
20ef0 65 20 2a 2a 61 70 56 61 6c 29 7b 0a 20 20 69 6e  e **apVal){.  in
20f00 74 20 2a 61 4d 61 74 63 68 69 6e 66 6f 3b 20 20  t *aMatchinfo;  
20f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3c 69                <i
20f20 3e 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65  >/* Return value
20f30 20 6f 66 20 6d 61 74 63 68 69 6e 66 6f 28 29 20   of matchinfo() 
20f40 2a 2f 3c 2f 69 3e 0a 20 20 69 6e 74 20 6e 43 6f  */</i>.  int nCo
20f50 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
20f60 20 20 20 20 20 20 20 20 20 3c 69 3e 2f 2a 20 4e           <i>/* N
20f70 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
20f80 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f   in the table */
20f90 3c 2f 69 3e 0a 20 20 69 6e 74 20 6e 50 68 72 61  </i>.  int nPhra
20fa0 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  se;             
20fb0 20 20 20 20 20 20 20 3c 69 3e 2f 2a 20 4e 75 6d         <i>/* Num
20fc0 62 65 72 20 6f 66 20 70 68 72 61 73 65 73 20 69  ber of phrases i
20fd0 6e 20 74 68 65 20 71 75 65 72 79 20 2a 2f 3c 2f  n the query */</
20fe0 69 3e 0a 20 20 69 6e 74 20 69 50 68 72 61 73 65  i>.  int iPhrase
20ff0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
21000 20 20 20 20 20 3c 69 3e 2f 2a 20 43 75 72 72 65       <i>/* Curre
21010 6e 74 20 70 68 72 61 73 65 20 2a 2f 3c 2f 69 3e  nt phrase */</i>
21020 0a 20 20 64 6f 75 62 6c 65 20 73 63 6f 72 65 20  .  double score 
21030 3d 20 30 2e 30 3b 20 20 20 20 20 20 20 20 20 20  = 0.0;          
21040 20 20 20 3c 69 3e 2f 2a 20 56 61 6c 75 65 20 74     <i>/* Value t
21050 6f 20 72 65 74 75 72 6e 20 2a 2f 3c 2f 69 3e 0a  o return */</i>.
21060 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f  .  assert( sizeo
21070 66 28 69 6e 74 29 3d 3d 34 20 29 3b 0a 0a 3c 69  f(int)==4 );..<i
21080 3e 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74  >  /* Check that
21090 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61   the number of a
210a0 72 67 75 6d 65 6e 74 73 20 70 61 73 73 65 64 20  rguments passed 
210b0 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
210c0 20 69 73 20 63 6f 72 72 65 63 74 2e 3c 2f 69 3e   is correct.</i>
210d0 0a 3c 69 3e 20 20 2a 2a 20 49 66 20 6e 6f 74 2c  .<i>  ** If not,
210e0 20 6a 75 6d 70 20 74 6f 20 77 72 6f 6e 67 5f 6e   jump to wrong_n
210f0 75 6d 62 65 72 5f 61 72 67 73 2e 20 53 65 74 20  umber_args. Set 
21100 61 4d 61 74 63 68 69 6e 66 6f 20 74 6f 20 70 6f  aMatchinfo to po
21110 69 6e 74 20 74 6f 20 74 68 65 20 61 72 72 61 79  int to the array
21120 3c 2f 69 3e 0a 3c 69 3e 20 20 2a 2a 20 6f 66 20  </i>.<i>  ** of 
21130 75 6e 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  unsigned integer
21140 20 76 61 6c 75 65 73 20 72 65 74 75 72 6e 65 64   values returned
21150 20 62 79 20 46 54 53 20 66 75 6e 63 74 69 6f 6e   by FTS function
21160 20 6d 61 74 63 68 69 6e 66 6f 2e 20 53 65 74 3c   matchinfo. Set<
21170 2f 69 3e 0a 3c 69 3e 20 20 2a 2a 20 6e 50 68 72  /i>.<i>  ** nPhr
21180 61 73 65 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74  ase to contain t
21190 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 70  he number of rep
211a0 6f 72 74 61 62 6c 65 20 70 68 72 61 73 65 73 20  ortable phrases 
211b0 69 6e 20 74 68 65 20 75 73 65 72 73 20 66 75 6c  in the users ful
211c0 6c 2d 74 65 78 74 3c 2f 69 3e 0a 3c 69 3e 20 20  l-text</i>.<i>  
211d0 2a 2a 20 71 75 65 72 79 2c 20 61 6e 64 20 6e 43  ** query, and nC
211e0 6f 6c 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  ol to the number
211f0 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   of columns in t
21200 68 65 20 74 61 62 6c 65 2e 3c 2f 69 3e 0a 3c 69  he table.</i>.<i
21210 3e 20 20 2a 2f 3c 2f 69 3e 0a 20 20 69 66 28 20  >  */</i>.  if( 
21220 6e 56 61 6c 26 6c 74 3b 31 20 29 20 67 6f 74 6f  nVal&lt;1 ) goto
21230 20 77 72 6f 6e 67 5f 6e 75 6d 62 65 72 5f 61 72   wrong_number_ar
21240 67 73 3b 0a 20 20 61 4d 61 74 63 68 69 6e 66 6f  gs;.  aMatchinfo
21250 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74   = (unsigned int
21260 20 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   *)sqlite3_value
21270 5f 62 6c 6f 62 28 61 70 56 61 6c 26 23 78 35 42  _blob(apVal&#x5B
21280 3b 30 26 23 78 35 44 3b 29 3b 0a 20 20 6e 50 68  ;0&#x5D;);.  nPh
21290 72 61 73 65 20 3d 20 61 4d 61 74 63 68 69 6e 66  rase = aMatchinf
212a0 6f 26 23 78 35 42 3b 30 26 23 78 35 44 3b 3b 0a  o&#x5B;0&#x5D;;.
212b0 20 20 6e 43 6f 6c 20 3d 20 61 4d 61 74 63 68 69    nCol = aMatchi
212c0 6e 66 6f 26 23 78 35 42 3b 31 26 23 78 35 44 3b  nfo&#x5B;1&#x5D;
212d0 3b 0a 20 20 69 66 28 20 6e 56 61 6c 21 3d 28 31  ;.  if( nVal!=(1
212e0 2b 6e 43 6f 6c 29 20 29 20 67 6f 74 6f 20 77 72  +nCol) ) goto wr
212f0 6f 6e 67 5f 6e 75 6d 62 65 72 5f 61 72 67 73 3b  ong_number_args;
21300 0a 0a 3c 69 3e 20 20 2f 2a 20 49 74 65 72 61 74  ..<i>  /* Iterat
21310 65 20 74 68 72 6f 75 67 68 20 65 61 63 68 20 70  e through each p
21320 68 72 61 73 65 20 69 6e 20 74 68 65 20 75 73 65  hrase in the use
21330 72 73 20 71 75 65 72 79 2e 20 2a 2f 3c 2f 69 3e  rs query. */</i>
21340 0a 20 20 66 6f 72 28 69 50 68 72 61 73 65 3d 30  .  for(iPhrase=0
21350 3b 20 69 50 68 72 61 73 65 26 6c 74 3b 6e 50 68  ; iPhrase&lt;nPh
21360 72 61 73 65 3b 20 69 50 68 72 61 73 65 2b 2b 29  rase; iPhrase++)
21370 7b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 3b 20  {.    int iCol; 
21380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21390 20 20 20 20 3c 69 3e 2f 2a 20 43 75 72 72 65 6e      <i>/* Curren
213a0 74 20 63 6f 6c 75 6d 6e 20 2a 2f 3c 2f 69 3e 0a  t column */</i>.
213b0 0a 3c 69 3e 20 20 20 20 2f 2a 20 4e 6f 77 20 69  .<i>    /* Now i
213c0 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 65  terate through e
213d0 61 63 68 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68  ach column in th
213e0 65 20 75 73 65 72 73 20 71 75 65 72 79 2e 20 46  e users query. F
213f0 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 2c 3c  or each column,<
21400 2f 69 3e 0a 3c 69 3e 20 20 20 20 2a 2a 20 69 6e  /i>.<i>    ** in
21410 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 6c 65  crement the rele
21420 76 61 6e 63 79 20 73 63 6f 72 65 20 62 79 3a 3c  vancy score by:<
21430 2f 69 3e 0a 3c 69 3e 20 20 20 20 2a 2a 3c 2f 69  /i>.<i>    **</i
21440 3e 0a 3c 69 3e 20 20 20 20 2a 2a 20 20 20 28 26  >.<i>    **   (&
21450 6c 74 3b 68 69 74 20 63 6f 75 6e 74 26 67 74 3b  lt;hit count&gt;
21460 20 2f 20 26 6c 74 3b 67 6c 6f 62 61 6c 20 68 69   / &lt;global hi
21470 74 20 63 6f 75 6e 74 26 67 74 29 20 2a 20 26 6c  t count&gt) * &l
21480 74 3b 63 6f 6c 75 6d 6e 20 77 65 69 67 68 74 26  t;column weight&
21490 67 74 3b 3c 2f 69 3e 0a 3c 69 3e 20 20 20 20 2a  gt;</i>.<i>    *
214a0 2a 3c 2f 69 3e 0a 3c 69 3e 20 20 20 20 2a 2a 20  *</i>.<i>    ** 
214b0 61 50 68 72 61 73 65 69 6e 66 6f 26 23 78 35 42  aPhraseinfo&#x5B
214c0 3b 26 23 78 35 44 3b 20 70 6f 69 6e 74 73 20 74  ;&#x5D; points t
214d0 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  o the start of t
214e0 68 65 20 64 61 74 61 20 66 6f 72 20 70 68 72 61  he data for phra
214f0 73 65 20 69 50 68 72 61 73 65 2e 20 53 6f 3c 2f  se iPhrase. So</
21500 69 3e 0a 3c 69 3e 20 20 20 20 2a 2a 20 74 68 65  i>.<i>    ** the
21510 20 68 69 74 20 63 6f 75 6e 74 20 61 6e 64 20 67   hit count and g
21520 6c 6f 62 61 6c 20 68 69 74 20 63 6f 75 6e 74 73  lobal hit counts
21530 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e   for each column
21540 20 61 72 65 20 66 6f 75 6e 64 20 69 6e 20 3c 2f   are found in </
21550 69 3e 0a 3c 69 3e 20 20 20 20 2a 2a 20 61 50 68  i>.<i>    ** aPh
21560 72 61 73 65 69 6e 66 6f 26 23 78 35 42 3b 69 43  raseinfo&#x5B;iC
21570 6f 6c 2a 33 26 23 78 35 44 3b 20 61 6e 64 20 61  ol*3&#x5D; and a
21580 50 68 72 61 73 65 69 6e 66 6f 26 23 78 35 42 3b  Phraseinfo&#x5B;
21590 69 43 6f 6c 2a 33 2b 31 26 23 78 35 44 3b 2c 20  iCol*3+1&#x5D;, 
215a0 72 65 73 70 65 63 74 69 76 65 6c 79 2e 3c 2f 69  respectively.</i
215b0 3e 0a 3c 69 3e 20 20 20 20 2a 2f 3c 2f 69 3e 0a  >.<i>    */</i>.
215c0 20 20 20 20 69 6e 74 20 2a 61 50 68 72 61 73 65      int *aPhrase
215d0 69 6e 66 6f 20 3d 20 26 61 4d 61 74 63 68 69 6e  info = &aMatchin
215e0 66 6f 26 23 78 35 42 3b 32 20 2b 20 69 50 68 72  fo&#x5B;2 + iPhr
215f0 61 73 65 2a 6e 43 6f 6c 2a 33 26 23 78 35 44 3b  ase*nCol*3&#x5D;
21600 3b 0a 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30  ;.    for(iCol=0
21610 3b 20 69 43 6f 6c 26 6c 74 3b 6e 43 6f 6c 3b 20  ; iCol&lt;nCol; 
21620 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 69  iCol++){.      i
21630 6e 74 20 6e 48 69 74 43 6f 75 6e 74 20 3d 20 61  nt nHitCount = a
21640 50 68 72 61 73 65 69 6e 66 6f 26 23 78 35 42 3b  Phraseinfo&#x5B;
21650 33 2a 69 43 6f 6c 26 23 78 35 44 3b 3b 0a 20 20  3*iCol&#x5D;;.  
21660 20 20 20 20 69 6e 74 20 6e 47 6c 6f 62 61 6c 48      int nGlobalH
21670 69 74 43 6f 75 6e 74 20 3d 20 61 50 68 72 61 73  itCount = aPhras
21680 65 69 6e 66 6f 26 23 78 35 42 3b 33 2a 69 43 6f  einfo&#x5B;3*iCo
21690 6c 2b 31 26 23 78 35 44 3b 3b 0a 20 20 20 20 20  l+1&#x5D;;.     
216a0 20 64 6f 75 62 6c 65 20 77 65 69 67 68 74 20 3d   double weight =
216b0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64   sqlite3_value_d
216c0 6f 75 62 6c 65 28 61 70 56 61 6c 26 23 78 35 42  ouble(apVal&#x5B
216d0 3b 69 43 6f 6c 2b 31 26 23 78 35 44 3b 29 3b 0a  ;iCol+1&#x5D;);.
216e0 20 20 20 20 20 20 69 66 28 20 6e 48 69 74 43 6f        if( nHitCo
216f0 75 6e 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  unt>0 ){.       
21700 20 73 63 6f 72 65 20 2b 3d 20 28 28 64 6f 75 62   score += ((doub
21710 6c 65 29 6e 48 69 74 43 6f 75 6e 74 20 2f 20 28  le)nHitCount / (
21720 64 6f 75 62 6c 65 29 6e 47 6c 6f 62 61 6c 48 69  double)nGlobalHi
21730 74 43 6f 75 6e 74 29 20 2a 20 77 65 69 67 68 74  tCount) * weight
21740 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
21750 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 72    }..  sqlite3_r
21760 65 73 75 6c 74 5f 64 6f 75 62 6c 65 28 70 43 74  esult_double(pCt
21770 78 2c 20 73 63 6f 72 65 29 3b 0a 20 20 72 65 74  x, score);.  ret
21780 75 72 6e 3b 0a 0a 3c 69 3e 20 20 2f 2a 20 4a 75  urn;..<i>  /* Ju
21790 6d 70 20 68 65 72 65 20 69 66 20 74 68 65 20 77  mp here if the w
217a0 72 6f 6e 67 20 6e 75 6d 62 65 72 20 6f 66 20 61  rong number of a
217b0 72 67 75 6d 65 6e 74 73 20 61 72 65 20 70 61 73  rguments are pas
217c0 73 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63  sed to this func
217d0 74 69 6f 6e 20 2a 2f 3c 2f 69 3e 0a 77 72 6f 6e  tion */</i>.wron
217e0 67 5f 6e 75 6d 62 65 72 5f 61 72 67 73 3a 0a 20  g_number_args:. 
217f0 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
21800 65 72 72 6f 72 28 70 43 74 78 2c 20 22 77 72 6f  error(pCtx, "wro
21810 6e 67 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67  ng number of arg
21820 75 6d 65 6e 74 73 20 74 6f 20 66 75 6e 63 74 69  uments to functi
21830 6f 6e 20 72 61 6e 6b 28 29 22 2c 20 2d 31 29 3b  on rank()", -1);
21840 0a 7d 0a 3c 2f 63 6f 64 65 62 6c 6f 63 6b 3e 0a  .}.</codeblock>.