Documentation Source Text

Hex Artifact Content
Login

Artifact 459c44e7d62163ad70c58bbfbd07d10f9b6c81f8:


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 3e 3c 70 3e 3c 62 3e 50 68 72 61 73 65  <li><p><b>Phrase
6540: 20 71 75 65 72 69 65 73 3c 2f 62 3e 2e 0a 20 20   queries</b>..  
6550: 20 20 41 20 70 68 72 61 73 65 20 71 75 65 72 79    A phrase query
6560: 20 69 73 20 61 20 71 75 65 72 79 20 74 68 61 74   is a query that
6570: 20 72 65 74 72 69 65 76 65 73 20 61 6c 6c 20 64   retrieves all d
6580: 6f 63 75 6d 65 6e 74 73 20 74 68 61 74 20 63 6f  ocuments that co
6590: 6e 74 61 69 6e 20 61 0a 20 20 20 20 6e 6f 6d 69  ntain a.    nomi
65a0: 6e 61 74 65 64 20 73 65 74 20 6f 66 20 74 65 72  nated set of ter
65b0: 6d 73 20 6f 72 20 74 65 72 6d 20 70 72 65 66 69  ms or term prefi
65c0: 78 65 73 20 69 6e 20 61 20 73 70 65 63 69 66 69  xes in a specifi
65d0: 65 64 20 6f 72 64 65 72 20 77 69 74 68 20 6e 6f  ed order with no
65e0: 0a 20 20 20 20 69 6e 74 65 72 76 65 6e 69 6e 67  .    intervening
65f0: 20 74 6f 6b 65 6e 73 2e 20 50 68 72 61 73 65 20   tokens. Phrase 
6600: 71 75 65 72 69 65 73 20 61 72 65 20 73 70 65 63  queries are spec
6610: 69 66 69 65 64 20 62 79 20 65 6e 63 6c 6f 73 69  ified by enclosi
6620: 6e 67 20 61 20 73 70 61 63 65 0a 20 20 20 20 73  ng a space.    s
6630: 65 70 61 72 61 74 65 64 20 73 65 71 75 65 6e 63  eparated sequenc
6640: 65 20 6f 66 20 74 65 72 6d 73 20 6f 72 20 74 65  e of terms or te
6650: 72 6d 20 70 72 65 66 69 78 65 73 20 69 6e 20 64  rm prefixes in d
6660: 6f 75 62 6c 65 20 71 75 6f 74 65 73 20 28 22 29  ouble quotes (")
6670: 2e 0a 20 20 20 20 46 6f 72 20 65 78 61 6d 70 6c  ..    For exampl
6680: 65 3a 0a 3c 2f 75 6c 3e 0a 0a 3c 63 6f 64 65 62  e:.</ul>..<codeb
6690: 6c 6f 63 6b 3e 0a 20 20 3c 69 3e 2d 2d 20 51 75  lock>.  <i>-- Qu
66a0: 65 72 79 20 66 6f 72 20 61 6c 6c 20 64 6f 63 75  ery for all docu
66b0: 6d 65 6e 74 73 20 74 68 61 74 20 63 6f 6e 74 61  ments that conta
66c0: 69 6e 20 74 68 65 20 70 68 72 61 73 65 20 22 6c  in the phrase "l
66d0: 69 6e 75 78 20 61 70 70 6c 69 63 61 74 69 6f 6e  inux application
66e0: 73 22 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54  s".</i>.  SELECT
66f0: 20 2a 20 46 52 4f 4d 20 64 6f 63 73 20 57 48 45   * FROM docs WHE
6700: 52 45 20 64 6f 63 73 20 4d 41 54 43 48 20 27 22  RE docs MATCH '"
6710: 6c 69 6e 75 78 20 61 70 70 6c 69 63 61 74 69 6f  linux applicatio
6720: 6e 73 22 27 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 51  ns"';..  <i>-- Q
6730: 75 65 72 79 20 66 6f 72 20 61 6c 6c 20 64 6f 63  uery for all doc
6740: 75 6d 65 6e 74 73 20 74 68 61 74 20 63 6f 6e 74  uments that cont
6750: 61 69 6e 20 61 20 70 68 72 61 73 65 20 74 68 61  ain a phrase tha
6760: 74 20 6d 61 74 63 68 65 73 20 22 6c 69 6e 2a 20  t matches "lin* 
6770: 61 70 70 2a 22 2e 20 41 73 20 77 65 6c 6c 20 61  app*". As well a
6780: 73 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 22 6c  s</i>.  <i>-- "l
6790: 69 6e 75 78 20 61 70 70 6c 69 63 61 74 69 6f 6e  inux application
67a0: 73 22 2c 20 74 68 69 73 20 77 69 6c 6c 20 6d 61  s", this will ma
67b0: 74 63 68 20 63 6f 6d 6d 6f 6e 20 70 68 72 61 73  tch common phras
67c0: 65 73 20 73 75 63 68 20 61 73 20 22 6c 69 6e 6f  es such as "lino
67d0: 6c 65 75 6d 20 61 70 70 6c 69 61 6e 63 65 73 22  leum appliances"
67e0: 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 6f 72 20  </i>.  <i>-- or 
67f0: 22 6c 69 6e 6b 20 61 70 70 72 65 6e 74 69 63 65  "link apprentice
6800: 22 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20  ".</i>.  SELECT 
6810: 2a 20 46 52 4f 4d 20 64 6f 63 73 20 57 48 45 52  * FROM docs WHER
6820: 45 20 64 6f 63 73 20 4d 41 54 43 48 20 27 22 6c  E docs MATCH '"l
6830: 69 6e 2a 20 61 70 70 2a 22 27 3b 0a 3c 2f 63 6f  in* app*"';.</co
6840: 64 65 62 6c 6f 63 6b 3e 0a 0a 3c 75 6c 3e 0a 20  deblock>..<ul>. 
6850: 20 3c 6c 69 3e 3c 70 3e 3c 62 3e 4e 45 41 52 20   <li><p><b>NEAR 
6860: 71 75 65 72 69 65 73 3c 2f 62 3e 2e 20 0a 20 20  queries</b>. .  
6870: 20 20 41 20 4e 45 41 52 20 71 75 65 72 79 20 69    A NEAR query i
6880: 73 20 61 20 71 75 65 72 79 20 74 68 61 74 20 72  s a query that r
6890: 65 74 75 72 6e 73 20 64 6f 63 75 6d 65 6e 74 73  eturns documents
68a0: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 20 61 20   that contain a 
68b0: 74 77 6f 20 6f 72 0a 20 20 20 20 6d 6f 72 65 20  two or.    more 
68c0: 6e 6f 6d 69 6e 61 74 65 64 20 74 65 72 6d 73 20  nominated terms 
68d0: 6f 72 20 70 68 72 61 73 65 73 20 77 69 74 68 69  or phrases withi
68e0: 6e 20 61 20 73 70 65 63 69 66 69 65 64 20 70 72  n a specified pr
68f0: 6f 78 69 6d 69 74 79 20 6f 66 20 65 61 63 68 20  oximity of each 
6900: 0a 20 20 20 20 6f 74 68 65 72 20 28 62 79 20 64  .    other (by d
6910: 65 66 61 75 6c 74 20 77 69 74 68 20 31 30 20 6f  efault with 10 o
6920: 72 20 6c 65 73 73 20 69 6e 74 65 72 76 65 6e 69  r less interveni
6930: 6e 67 20 74 65 72 6d 73 29 2e 20 41 20 4e 45 41  ng terms). A NEA
6940: 52 20 71 75 65 72 79 20 69 73 20 0a 20 20 20 20  R query is .    
6950: 73 70 65 63 69 66 69 65 64 20 62 79 20 70 75 74  specified by put
6960: 74 69 6e 67 20 74 68 65 20 6b 65 79 77 6f 72 64  ting the keyword
6970: 20 22 4e 45 41 52 22 20 62 65 74 77 65 65 6e 20   "NEAR" between 
6980: 74 77 6f 20 70 68 72 61 73 65 2c 20 74 65 72 6d  two phrase, term
6990: 20 6f 72 20 0a 20 20 20 20 5b 70 72 65 66 69 78   or .    [prefix
69a0: 20 71 75 65 72 69 65 73 5d 2e 20 54 6f 20 73 70   queries]. To sp
69b0: 65 63 69 66 79 20 61 20 70 72 6f 78 69 6d 69 74  ecify a proximit
69c0: 79 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65  y other than the
69d0: 20 64 65 66 61 75 6c 74 2c 0a 20 20 20 20 61 6e   default,.    an
69e0: 20 6f 70 65 72 61 74 6f 72 20 6f 66 20 74 68 65   operator of the
69f0: 20 66 6f 72 6d 20 22 4e 45 41 52 2f 3c 69 3e 26   form "NEAR/<i>&
6a00: 6c 74 3b 4e 26 67 74 3b 3c 2f 69 3e 22 20 6d 61  lt;N&gt;</i>" ma
6a10: 79 20 62 65 20 75 73 65 64 2c 20 77 68 65 72 65  y be used, where
6a20: 0a 20 20 20 20 3c 69 3e 26 6c 74 3b 4e 26 67 74  .    <i>&lt;N&gt
6a30: 3b 3c 2f 69 3e 20 69 73 20 74 68 65 20 6d 61 78  ;</i> is the max
6a40: 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 69  imum number of i
6a50: 6e 74 65 72 76 65 6e 69 6e 67 20 74 65 72 6d 73  ntervening terms
6a60: 20 61 6c 6c 6f 77 65 64 2e 0a 20 20 20 20 46 6f   allowed..    Fo
6a70: 72 20 65 78 61 6d 70 6c 65 3a 0a 3c 2f 75 6c 3e  r example:.</ul>
6a80: 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20 20  ..<codeblock>.  
6a90: 3c 69 3e 2d 2d 20 56 69 72 74 75 61 6c 20 74 61  <i>-- Virtual ta
6aa0: 62 6c 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 2e  ble declaration.
6ab0: 3c 2f 69 3e 0a 20 20 43 52 45 41 54 45 20 56 49  </i>.  CREATE VI
6ac0: 52 54 55 41 4c 20 54 41 42 4c 45 20 64 6f 63 73  RTUAL TABLE docs
6ad0: 20 55 53 49 4e 47 20 66 74 73 34 28 29 3b 0a 0a   USING fts4();..
6ae0: 20 20 3c 69 3e 2d 2d 20 56 69 72 74 75 61 6c 20    <i>-- Virtual 
6af0: 74 61 62 6c 65 20 64 61 74 61 2e 3c 2f 69 3e 0a  table data.</i>.
6b00: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 64 6f    INSERT INTO do
6b10: 63 73 20 56 41 4c 55 45 53 28 27 53 51 4c 69 74  cs VALUES('SQLit
6b20: 65 20 69 73 20 61 6e 20 41 43 49 44 20 63 6f 6d  e is an ACID com
6b30: 70 6c 69 61 6e 74 20 65 6d 62 65 64 64 65 64 20  pliant embedded 
6b40: 72 65 6c 61 74 69 6f 6e 61 6c 20 64 61 74 61 62  relational datab
6b50: 61 73 65 20 6d 61 6e 61 67 65 6d 65 6e 74 20 73  ase management s
6b60: 79 73 74 65 6d 27 29 3b 0a 0a 20 20 3c 69 3e 2d  ystem');..  <i>-
6b70: 2d 20 53 65 61 72 63 68 20 66 6f 72 20 61 20 64  - Search for a d
6b80: 6f 63 75 6d 65 6e 74 20 74 68 61 74 20 63 6f 6e  ocument that con
6b90: 74 61 69 6e 73 20 74 68 65 20 74 65 72 6d 73 20  tains the terms 
6ba0: 22 73 71 6c 69 74 65 22 20 61 6e 64 20 22 64 61  "sqlite" and "da
6bb0: 74 61 62 61 73 65 22 20 77 69 74 68 3c 2f 69 3e  tabase" with</i>
6bc0: 0a 20 20 3c 69 3e 2d 2d 20 6e 6f 74 20 6d 6f 72  .  <i>-- not mor
6bd0: 65 20 74 68 61 6e 20 31 30 20 69 6e 74 65 72 76  e than 10 interv
6be0: 65 6e 69 6e 67 20 74 65 72 6d 73 2e 20 54 68 69  ening terms. Thi
6bf0: 73 20 6d 61 74 63 68 65 73 20 74 68 65 20 6f 6e  s matches the on
6c00: 6c 79 20 64 6f 63 75 6d 65 6e 74 20 69 6e 3c 2f  ly document in</
6c10: 69 3e 0a 20 20 3c 69 3e 2d 2d 20 74 61 62 6c 65  i>.  <i>-- table
6c20: 20 64 6f 63 73 20 28 73 69 6e 63 65 20 74 68 65   docs (since the
6c30: 72 65 20 61 72 65 20 6f 6e 6c 79 20 73 69 78 20  re are only six 
6c40: 74 65 72 6d 73 20 62 65 74 77 65 65 6e 20 22 53  terms between "S
6c50: 51 4c 69 74 65 22 20 61 6e 64 20 22 64 61 74 61  QLite" and "data
6c60: 62 61 73 65 22 3c 2f 69 3e 20 0a 20 20 3c 69 3e  base"</i> .  <i>
6c70: 2d 2d 20 69 6e 20 74 68 65 20 64 6f 63 75 6d 65  -- in the docume
6c80: 6e 74 29 3c 2f 69 3e 2e 0a 20 20 53 45 4c 45 43  nt)</i>..  SELEC
6c90: 54 20 2a 20 46 52 4f 4d 20 64 6f 63 73 20 57 48  T * FROM docs WH
6ca0: 45 52 45 20 64 6f 63 73 20 4d 41 54 43 48 20 27  ERE docs MATCH '
6cb0: 73 71 6c 69 74 65 20 4e 45 41 52 20 64 61 74 61  sqlite NEAR data
6cc0: 62 61 73 65 27 3b 0a 0a 20 20 3c 69 3e 2d 2d 20  base';..  <i>-- 
6cd0: 53 65 61 72 63 68 20 66 6f 72 20 61 20 64 6f 63  Search for a doc
6ce0: 75 6d 65 6e 74 20 74 68 61 74 20 63 6f 6e 74 61  ument that conta
6cf0: 69 6e 73 20 74 68 65 20 74 65 72 6d 73 20 22 73  ins the terms "s
6d00: 71 6c 69 74 65 22 20 61 6e 64 20 22 64 61 74 61  qlite" and "data
6d10: 62 61 73 65 22 20 77 69 74 68 3c 2f 69 3e 0a 20  base" with</i>. 
6d20: 20 3c 69 3e 2d 2d 20 6e 6f 74 20 6d 6f 72 65 20   <i>-- not more 
6d30: 74 68 61 6e 20 36 20 69 6e 74 65 72 76 65 6e 69  than 6 interveni
6d40: 6e 67 20 74 65 72 6d 73 2e 20 54 68 69 73 20 61  ng terms. This a
6d50: 6c 73 6f 20 6d 61 74 63 68 65 73 20 74 68 65 20  lso matches the 
6d60: 6f 6e 6c 79 20 64 6f 63 75 6d 65 6e 74 20 69 6e  only document in
6d70: 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 74 61 62  </i>.  <i>-- tab
6d80: 6c 65 20 64 6f 63 73 2e 20 4e 6f 74 65 20 74 68  le docs. Note th
6d90: 61 74 20 74 68 65 20 6f 72 64 65 72 20 69 6e 20  at the order in 
6da0: 77 68 69 63 68 20 74 68 65 20 74 65 72 6d 73 20  which the terms 
6db0: 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 64 6f  appear in the do
6dc0: 63 75 6d 65 6e 74 3c 2f 69 3e 0a 20 20 3c 69 3e  cument</i>.  <i>
6dd0: 2d 2d 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65  -- does not have
6de0: 20 74 6f 20 62 65 20 74 68 65 20 73 61 6d 65 20   to be the same 
6df0: 61 73 20 74 68 65 20 6f 72 64 65 72 20 69 6e 20  as the order in 
6e00: 77 68 69 63 68 20 74 68 65 79 20 61 70 70 65 61  which they appea
6e10: 72 20 69 6e 20 74 68 65 20 71 75 65 72 79 2e 3c  r in the query.<
6e20: 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20 2a 20 46  /i>.  SELECT * F
6e30: 52 4f 4d 20 64 6f 63 73 20 57 48 45 52 45 20 64  ROM docs WHERE d
6e40: 6f 63 73 20 4d 41 54 43 48 20 27 64 61 74 61 62  ocs MATCH 'datab
6e50: 61 73 65 20 4e 45 41 52 2f 36 20 73 71 6c 69 74  ase NEAR/6 sqlit
6e60: 65 27 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 53 65 61  e';..  <i>-- Sea
6e70: 72 63 68 20 66 6f 72 20 61 20 64 6f 63 75 6d 65  rch for a docume
6e80: 6e 74 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  nt that contains
6e90: 20 74 68 65 20 74 65 72 6d 73 20 22 73 71 6c 69   the terms "sqli
6ea0: 74 65 22 20 61 6e 64 20 22 64 61 74 61 62 61 73  te" and "databas
6eb0: 65 22 20 77 69 74 68 3c 2f 69 3e 0a 20 20 3c 69  e" with</i>.  <i
6ec0: 3e 2d 2d 20 6e 6f 74 20 6d 6f 72 65 20 74 68 61  >-- not more tha
6ed0: 6e 20 35 20 69 6e 74 65 72 76 65 6e 69 6e 67 20  n 5 intervening 
6ee0: 74 65 72 6d 73 2e 20 54 68 69 73 20 71 75 65 72  terms. This quer
6ef0: 79 20 6d 61 74 63 68 65 73 20 6e 6f 20 64 6f 63  y matches no doc
6f00: 75 6d 65 6e 74 73 2e 3c 2f 69 3e 0a 20 20 53 45  uments.</i>.  SE
6f10: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 64 6f 63 73  LECT * FROM docs
6f20: 20 57 48 45 52 45 20 64 6f 63 73 20 4d 41 54 43   WHERE docs MATC
6f30: 48 20 27 64 61 74 61 62 61 73 65 20 4e 45 41 52  H 'database NEAR
6f40: 2f 35 20 73 71 6c 69 74 65 27 3b 0a 0a 20 20 3c  /5 sqlite';..  <
6f50: 69 3e 2d 2d 20 53 65 61 72 63 68 20 66 6f 72 20  i>-- Search for 
6f60: 61 20 64 6f 63 75 6d 65 6e 74 20 74 68 61 74 20  a document that 
6f70: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 70 68 72  contains the phr
6f80: 61 73 65 20 22 41 43 49 44 20 63 6f 6d 70 6c 69  ase "ACID compli
6f90: 61 6e 74 22 20 61 6e 64 20 74 68 65 20 74 65 72  ant" and the ter
6fa0: 6d 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 22 64  m</i>.  <i>-- "d
6fb0: 61 74 61 62 61 73 65 22 20 77 69 74 68 20 6e 6f  atabase" with no
6fc0: 74 20 6d 6f 72 65 20 74 68 61 6e 20 32 20 74 65  t more than 2 te
6fd0: 72 6d 73 20 73 65 70 61 72 61 74 69 6e 67 20 74  rms separating t
6fe0: 68 65 20 74 77 6f 2e 20 54 68 69 73 20 6d 61 74  he two. This mat
6ff0: 63 68 65 73 20 74 68 65 3c 2f 69 3e 0a 20 20 3c  ches the</i>.  <
7000: 69 3e 2d 2d 20 64 6f 63 75 6d 65 6e 74 20 73 74  i>-- document st
7010: 6f 72 65 64 20 69 6e 20 74 61 62 6c 65 20 64 6f  ored in table do
7020: 63 73 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54  cs.</i>.  SELECT
7030: 20 2a 20 46 52 4f 4d 20 64 6f 63 73 20 57 48 45   * FROM docs WHE
7040: 52 45 20 64 6f 63 73 20 4d 41 54 43 48 20 27 64  RE docs MATCH 'd
7050: 61 74 61 62 61 73 65 20 4e 45 41 52 2f 32 20 22  atabase NEAR/2 "
7060: 41 43 49 44 20 63 6f 6d 70 6c 69 61 6e 74 22 27  ACID compliant"'
7070: 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 53 65 61 72 63  ;..  <i>-- Searc
7080: 68 20 66 6f 72 20 61 20 64 6f 63 75 6d 65 6e 74  h for a document
7090: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
70a0: 68 65 20 70 68 72 61 73 65 20 22 41 43 49 44 20  he phrase "ACID 
70b0: 63 6f 6d 70 6c 69 61 6e 74 22 20 61 6e 64 20 74  compliant" and t
70c0: 68 65 20 74 65 72 6d 3c 2f 69 3e 0a 20 20 3c 69  he term</i>.  <i
70d0: 3e 2d 2d 20 22 73 71 6c 69 74 65 22 20 77 69 74  >-- "sqlite" wit
70e0: 68 20 6e 6f 74 20 6d 6f 72 65 20 74 68 61 6e 20  h not more than 
70f0: 32 20 74 65 72 6d 73 20 73 65 70 61 72 61 74 69  2 terms separati
7100: 6e 67 20 74 68 65 20 74 77 6f 2e 20 54 68 69 73  ng the two. This
7110: 20 61 6c 73 6f 20 6d 61 74 63 68 65 73 3c 2f 69   also matches</i
7120: 3e 0a 20 20 3c 69 3e 2d 2d 20 74 68 65 20 6f 6e  >.  <i>-- the on
7130: 6c 79 20 64 6f 63 75 6d 65 6e 74 20 73 74 6f 72  ly document stor
7140: 65 64 20 69 6e 20 74 61 62 6c 65 20 64 6f 63 73  ed in table docs
7150: 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20 2a  .</i>.  SELECT *
7160: 20 46 52 4f 4d 20 64 6f 63 73 20 57 48 45 52 45   FROM docs WHERE
7170: 20 64 6f 63 73 20 4d 41 54 43 48 20 27 22 41 43   docs MATCH '"AC
7180: 49 44 20 63 6f 6d 70 6c 69 61 6e 74 22 20 4e 45  ID compliant" NE
7190: 41 52 2f 32 20 73 71 6c 69 74 65 27 3b 0a 3c 2f  AR/2 sqlite';.</
71a0: 63 6f 64 65 62 6c 6f 63 6b 3e 0a 0a 3c 75 6c 3e  codeblock>..<ul>
71b0: 0a 20 20 3c 6c 69 20 73 74 79 6c 65 3d 22 6c 69  .  <li style="li
71c0: 73 74 2d 73 74 79 6c 65 3a 20 6e 6f 6e 65 22 3e  st-style: none">
71d0: 3c 70 3e 0a 20 20 20 20 4d 6f 72 65 20 74 68 61  <p>.    More tha
71e0: 6e 20 6f 6e 65 20 4e 45 41 52 20 6f 70 65 72 61  n one NEAR opera
71f0: 74 6f 72 20 6d 61 79 20 61 70 70 65 61 72 20 69  tor may appear i
7200: 6e 20 61 20 73 69 6e 67 6c 65 20 71 75 65 72 79  n a single query
7210: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 65  . In this case e
7220: 61 63 68 0a 20 20 20 20 70 61 69 72 20 6f 66 20  ach.    pair of 
7230: 74 65 72 6d 73 20 6f 72 20 70 68 72 61 73 65 73  terms or phrases
7240: 20 73 65 70 61 72 61 74 65 64 20 62 79 20 61 20   separated by a 
7250: 4e 45 41 52 20 6f 70 65 72 61 74 6f 72 20 6d 75  NEAR operator mu
7260: 73 74 20 61 70 70 65 61 72 20 77 69 74 68 69 6e  st appear within
7270: 20 74 68 65 0a 20 20 20 20 73 70 65 63 69 66 69   the.    specifi
7280: 65 64 20 70 72 6f 78 69 6d 69 74 79 20 6f 66 20  ed proximity of 
7290: 65 61 63 68 20 6f 74 68 65 72 20 69 6e 20 74 68  each other in th
72a0: 65 20 64 6f 63 75 6d 65 6e 74 2e 20 55 73 69 6e  e document. Usin
72b0: 67 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65  g the same table
72c0: 20 61 6e 64 0a 20 20 20 20 64 61 74 61 20 61 73   and.    data as
72d0: 20 69 6e 20 74 68 65 20 62 6c 6f 63 6b 20 6f 66   in the block of
72e0: 20 65 78 61 6d 70 6c 65 73 20 61 62 6f 76 65 3a   examples above:
72f0: 0a 3c 2f 75 6c 3e 0a 0a 3c 63 6f 64 65 62 6c 6f  .</ul>..<codeblo
7300: 63 6b 3e 20 0a 20 3c 69 3e 2d 2d 20 54 68 65 20  ck> . <i>-- The 
7310: 66 6f 6c 6c 6f 77 69 6e 67 20 71 75 65 72 79 20  following query 
7320: 73 65 6c 65 63 74 73 20 64 6f 63 75 6d 65 6e 74  selects document
7330: 73 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  s that contains 
7340: 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  an instance of t
7350: 68 65 20 74 65 72 6d 20 3c 2f 69 3e 0a 20 20 3c  he term </i>.  <
7360: 69 3e 2d 2d 20 22 73 71 6c 69 74 65 22 20 73 65  i>-- "sqlite" se
7370: 70 61 72 61 74 65 64 20 62 79 20 74 77 6f 20 6f  parated by two o
7380: 72 20 66 65 77 65 72 20 74 65 72 6d 73 20 66 72  r fewer terms fr
7390: 6f 6d 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f  om an instance o
73a0: 66 20 74 68 65 20 74 65 72 6d 20 22 61 63 69 64  f the term "acid
73b0: 22 2c 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 77  ",</i>.  <i>-- w
73c0: 68 69 63 68 20 69 73 20 69 6e 20 74 75 72 6e 20  hich is in turn 
73d0: 73 65 70 61 72 61 74 65 64 20 62 79 20 74 77 6f  separated by two
73e0: 20 6f 72 20 66 65 77 65 72 20 74 65 72 6d 73 20   or fewer terms 
73f0: 66 72 6f 6d 20 61 6e 20 69 6e 73 74 61 6e 63 65  from an instance
7400: 20 6f 66 20 74 68 65 20 74 65 72 6d 3c 2f 69 3e   of the term</i>
7410: 0a 20 20 3c 69 3e 2d 2d 20 22 72 65 6c 61 74 69  .  <i>-- "relati
7420: 6f 6e 61 6c 22 2e 20 41 73 20 69 74 20 68 61 70  onal". As it hap
7430: 70 65 6e 73 2c 20 74 68 65 20 6f 6e 6c 79 20 64  pens, the only d
7440: 6f 63 75 6d 65 6e 74 20 69 6e 20 74 61 62 6c 65  ocument in table
7450: 20 64 6f 63 73 20 73 61 74 69 73 66 69 65 73 20   docs satisfies 
7460: 74 68 69 73 20 63 72 69 74 65 72 69 61 2e 3c 2f  this criteria.</
7470: 69 3e 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52  i>.  SELECT * FR
7480: 4f 4d 20 64 6f 63 73 20 57 48 45 52 45 20 64 6f  OM docs WHERE do
7490: 63 73 20 4d 41 54 43 48 20 27 73 71 6c 69 74 65  cs MATCH 'sqlite
74a0: 20 4e 45 41 52 2f 32 20 61 63 69 64 20 4e 45 41   NEAR/2 acid NEA
74b0: 52 2f 32 20 72 65 6c 61 74 69 6f 6e 61 6c 27 3b  R/2 relational';
74c0: 0a 0a 20 20 3c 69 3e 2d 2d 20 54 68 69 73 20 71  ..  <i>-- This q
74d0: 75 65 72 79 20 6d 61 74 63 68 65 73 20 6e 6f 20  uery matches no 
74e0: 64 6f 63 75 6d 65 6e 74 73 2e 20 54 68 65 72 65  documents. There
74f0: 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20   is an instance 
7500: 6f 66 20 74 68 65 20 74 65 72 6d 20 22 73 71 6c  of the term "sql
7510: 69 74 65 22 20 77 69 74 68 3c 2f 69 3e 0a 20 20  ite" with</i>.  
7520: 3c 69 3e 2d 2d 20 73 75 66 66 69 63 69 65 6e 74  <i>-- sufficient
7530: 20 70 72 6f 78 69 6d 69 74 79 20 74 6f 20 61 6e   proximity to an
7540: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 22 61 63   instance of "ac
7550: 69 64 22 20 62 75 74 20 69 74 20 69 73 20 6e 6f  id" but it is no
7560: 74 20 73 75 66 66 69 63 69 65 6e 74 6c 79 20 63  t sufficiently c
7570: 6c 6f 73 65 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d  lose</i>.  <i>--
7580: 20 74 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65 20   to an instance 
7590: 6f 66 20 74 68 65 20 74 65 72 6d 20 22 72 65 6c  of the term "rel
75a0: 61 74 69 6f 6e 61 6c 22 2e 3c 2f 69 3e 0a 20 20  ational".</i>.  
75b0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 64 6f  SELECT * FROM do
75c0: 63 73 20 57 48 45 52 45 20 64 6f 63 73 20 4d 41  cs WHERE docs MA
75d0: 54 43 48 20 27 61 63 69 64 20 4e 45 41 52 2f 32  TCH 'acid NEAR/2
75e0: 20 73 71 6c 69 74 65 20 4e 45 41 52 2f 32 20 72   sqlite NEAR/2 r
75f0: 65 6c 61 74 69 6f 6e 61 6c 27 3b 0a 3c 2f 63 6f  elational';.</co
7600: 64 65 62 6c 6f 63 6b 3e 0a 0a 3c 70 3e 0a 20 20  deblock>..<p>.  
7610: 50 68 72 61 73 65 20 61 6e 64 20 4e 45 41 52 20  Phrase and NEAR 
7620: 71 75 65 72 69 65 73 20 6d 61 79 20 6e 6f 74 20  queries may not 
7630: 73 70 61 6e 20 6d 75 6c 74 69 70 6c 65 20 63 6f  span multiple co
7640: 6c 75 6d 6e 73 20 77 69 74 68 69 6e 20 61 20 72  lumns within a r
7650: 6f 77 2e 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 74  ow...<p>.  The t
7660: 68 72 65 65 20 62 61 73 69 63 20 71 75 65 72 79  hree basic query
7670: 20 74 79 70 65 73 20 64 65 73 63 72 69 62 65 64   types described
7680: 20 61 62 6f 76 65 20 6d 61 79 20 62 65 20 75 73   above may be us
7690: 65 64 20 74 6f 20 71 75 65 72 79 20 74 68 65 20  ed to query the 
76a0: 66 75 6c 6c 2d 74 65 78 74 0a 20 20 69 6e 64 65  full-text.  inde
76b0: 78 20 66 6f 72 20 74 68 65 20 73 65 74 20 6f 66  x for the set of
76c0: 20 64 6f 63 75 6d 65 6e 74 73 20 74 68 61 74 20   documents that 
76d0: 6d 61 74 63 68 20 74 68 65 20 73 70 65 63 69 66  match the specif
76e0: 69 65 64 20 63 72 69 74 65 72 69 61 2e 20 55 73  ied criteria. Us
76f0: 69 6e 67 20 74 68 65 0a 20 20 46 54 53 20 71 75  ing the.  FTS qu
7700: 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  ery expression l
7710: 61 6e 67 75 61 67 65 20 69 74 20 69 73 20 70 6f  anguage it is po
7720: 73 73 69 62 6c 65 20 74 6f 20 70 65 72 66 6f 72  ssible to perfor
7730: 6d 20 76 61 72 69 6f 75 73 20 73 65 74 20 0a 20  m various set . 
7740: 20 6f 70 65 72 61 74 69 6f 6e 73 20 6f 6e 20 74   operations on t
7750: 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 62 61  he results of ba
7760: 73 69 63 20 71 75 65 72 69 65 73 2e 20 54 68 65  sic queries. The
7770: 72 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79  re are currently
7780: 20 74 68 72 65 65 20 0a 20 20 73 75 70 70 6f 72   three .  suppor
7790: 74 65 64 20 6f 70 65 72 61 74 69 6f 6e 73 3a 0a  ted operations:.
77a0: 0a 3c 75 6c 3e 0a 20 20 3c 6c 69 3e 20 54 68 65  .<ul>.  <li> The
77b0: 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 20 64 65   AND operator de
77c0: 74 65 72 6d 69 6e 65 73 20 74 68 65 20 3c 62 3e  termines the <b>
77d0: 69 6e 74 65 72 73 65 63 74 69 6f 6e 3c 2f 62 3e  intersection</b>
77e0: 20 6f 66 20 74 77 6f 20 73 65 74 73 20 6f 66 20   of two sets of 
77f0: 64 6f 63 75 6d 65 6e 74 73 2e 0a 0a 20 20 3c 6c  documents...  <l
7800: 69 3e 20 54 68 65 20 4f 52 20 6f 70 65 72 61 74  i> The OR operat
7810: 6f 72 20 63 61 6c 63 75 6c 61 74 65 73 20 74 68  or calculates th
7820: 65 20 3c 62 3e 75 6e 69 6f 6e 3c 2f 62 3e 20 6f  e <b>union</b> o
7830: 66 20 74 77 6f 20 73 65 74 73 20 6f 66 20 64 6f  f two sets of do
7840: 63 75 6d 65 6e 74 73 2e 0a 0a 20 20 3c 6c 69 3e  cuments...  <li>
7850: 20 54 68 65 20 4e 4f 54 20 6f 70 65 72 61 74 6f   The NOT operato
7860: 72 20 28 6f 72 2c 20 69 66 20 75 73 69 6e 67 20  r (or, if using 
7870: 74 68 65 20 73 74 61 6e 64 61 72 64 20 73 79 6e  the standard syn
7880: 74 61 78 2c 20 61 20 75 6e 61 72 79 20 22 2d 22  tax, a unary "-"
7890: 20 6f 70 65 72 61 74 6f 72 29 0a 20 20 20 20 20   operator).     
78a0: 20 20 6d 61 79 20 62 65 20 75 73 65 64 20 74 6f    may be used to
78b0: 20 63 6f 6d 70 75 74 65 20 74 68 65 20 3c 62 3e   compute the <b>
78c0: 72 65 6c 61 74 69 76 65 20 63 6f 6d 70 6c 65 6d  relative complem
78d0: 65 6e 74 3c 2f 62 3e 20 6f 66 20 6f 6e 65 20 73  ent</b> of one s
78e0: 65 74 20 6f 66 0a 20 20 20 20 20 20 20 64 6f 63  et of.       doc
78f0: 75 6d 65 6e 74 73 20 77 69 74 68 20 72 65 73 70  uments with resp
7900: 65 63 74 20 74 6f 20 61 6e 6f 74 68 65 72 2e 0a  ect to another..
7910: 3c 2f 75 6c 3e 0a 0a 3c 70 3e 0a 20 20 54 68 65  </ul>..<p>.  The
7920: 20 46 54 53 20 6d 6f 64 75 6c 65 73 20 6d 61 79   FTS modules may
7930: 20 62 65 20 63 6f 6d 70 69 6c 65 64 20 74 6f 20   be compiled to 
7940: 75 73 65 20 6f 6e 65 20 6f 66 20 74 77 6f 20 73  use one of two s
7950: 6c 69 67 68 74 6c 79 20 64 69 66 66 65 72 65 6e  lightly differen
7960: 74 20 76 65 72 73 69 6f 6e 73 0a 20 20 6f 66 20  t versions.  of 
7970: 74 68 65 20 66 75 6c 6c 2d 74 65 78 74 20 71 75  the full-text qu
7980: 65 72 79 20 73 79 6e 74 61 78 2c 20 74 68 65 20  ery syntax, the 
7990: 22 73 74 61 6e 64 61 72 64 22 20 71 75 65 72 79  "standard" query
79a0: 20 73 79 6e 74 61 78 20 61 6e 64 20 74 68 65 20   syntax and the 
79b0: 22 65 6e 68 61 6e 63 65 64 22 20 0a 20 20 71 75  "enhanced" .  qu
79c0: 65 72 79 20 73 79 6e 74 61 78 2e 20 54 68 65 20  ery syntax. The 
79d0: 62 61 73 69 63 20 74 65 72 6d 2c 20 74 65 72 6d  basic term, term
79e0: 2d 70 72 65 66 69 78 2c 20 70 68 72 61 73 65 20  -prefix, phrase 
79f0: 61 6e 64 20 4e 45 41 52 20 71 75 65 72 69 65 73  and NEAR queries
7a00: 20 64 65 73 63 72 69 62 65 64 20 0a 20 20 61 62   described .  ab
7a10: 6f 76 65 20 61 72 65 20 74 68 65 20 73 61 6d 65  ove are the same
7a20: 20 69 6e 20 62 6f 74 68 20 76 65 72 73 69 6f 6e   in both version
7a30: 73 20 6f 66 20 74 68 65 20 73 79 6e 74 61 78 2e  s of the syntax.
7a40: 20 54 68 65 20 77 61 79 20 69 6e 20 77 68 69 63   The way in whic
7a50: 68 20 73 65 74 20 0a 20 20 6f 70 65 72 61 74 69  h set .  operati
7a60: 6f 6e 73 20 61 72 65 20 73 70 65 63 69 66 69 65  ons are specifie
7a70: 64 20 69 73 20 73 6c 69 67 68 74 6c 79 20 64 69  d is slightly di
7a80: 66 66 65 72 65 6e 74 2e 20 54 68 65 20 66 6f 6c  fferent. The fol
7a90: 6c 6f 77 69 6e 67 20 74 77 6f 20 73 75 62 2d 73  lowing two sub-s
7aa0: 65 63 74 69 6f 6e 73 20 0a 20 20 64 65 73 63 72  ections .  descr
7ab0: 69 62 65 20 74 68 65 20 70 61 72 74 20 6f 66 20  ibe the part of 
7ac0: 74 68 65 20 74 77 6f 20 71 75 65 72 79 20 73 79  the two query sy
7ad0: 6e 74 61 78 65 73 20 74 68 61 74 20 70 65 72 74  ntaxes that pert
7ae0: 61 69 6e 73 20 74 6f 20 73 65 74 20 6f 70 65 72  ains to set oper
7af0: 61 74 69 6f 6e 73 2e 20 0a 20 20 52 65 66 65 72  ations. .  Refer
7b00: 20 74 6f 20 74 68 65 20 64 65 73 63 72 69 70 74   to the descript
7b10: 69 6f 6e 20 6f 66 20 68 6f 77 20 74 6f 20 5b 63  ion of how to [c
7b20: 6f 6d 70 69 6c 65 20 66 74 73 5d 20 66 6f 72 20  ompile fts] for 
7b30: 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 6e 6f 74 65  compilation note
7b40: 73 2e 0a 0a 3c 68 32 20 74 61 67 73 3d 22 65 6e  s...<h2 tags="en
7b50: 68 61 6e 63 65 64 20 71 75 65 72 79 20 73 79 6e  hanced query syn
7b60: 74 61 78 22 3e 0a 20 20 53 65 74 20 4f 70 65 72  tax">.  Set Oper
7b70: 61 74 69 6f 6e 73 20 55 73 69 6e 67 20 54 68 65  ations Using The
7b80: 20 45 6e 68 61 6e 63 65 64 20 51 75 65 72 79 20   Enhanced Query 
7b90: 53 79 6e 74 61 78 3c 2f 68 32 3e 0a 0a 3c 70 3e  Syntax</h2>..<p>
7ba0: 0a 20 20 54 68 65 20 65 6e 68 61 6e 63 65 64 20  .  The enhanced 
7bb0: 71 75 65 72 79 20 73 79 6e 74 61 78 20 73 75 70  query syntax sup
7bc0: 70 6f 72 74 73 20 74 68 65 20 41 4e 44 2c 20 4f  ports the AND, O
7bd0: 52 20 61 6e 64 20 4e 4f 54 20 62 69 6e 61 72 79  R and NOT binary
7be0: 20 73 65 74 20 6f 70 65 72 61 74 6f 72 73 2e 0a   set operators..
7bf0: 20 20 45 61 63 68 20 6f 66 20 74 68 65 20 74 77    Each of the tw
7c00: 6f 20 6f 70 65 72 61 6e 64 73 20 74 6f 20 61 6e  o operands to an
7c10: 20 6f 70 65 72 61 74 6f 72 20 6d 61 79 20 62 65   operator may be
7c20: 20 61 20 62 61 73 69 63 20 46 54 53 20 71 75 65   a basic FTS que
7c30: 72 79 2c 20 6f 72 20 74 68 65 0a 20 20 72 65 73  ry, or the.  res
7c40: 75 6c 74 20 6f 66 20 61 6e 6f 74 68 65 72 20 41  ult of another A
7c50: 4e 44 2c 20 4f 52 20 6f 72 20 4e 4f 54 20 73 65  ND, OR or NOT se
7c60: 74 20 6f 70 65 72 61 74 69 6f 6e 2e 20 4f 70 65  t operation. Ope
7c70: 72 61 74 6f 72 73 20 6d 75 73 74 20 62 65 20 65  rators must be e
7c80: 6e 74 65 72 65 64 0a 20 20 75 73 69 6e 67 20 63  ntered.  using c
7c90: 61 70 69 74 61 6c 20 6c 65 74 74 65 72 73 2e 20  apital letters. 
7ca0: 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 79 20  Otherwise, they 
7cb0: 61 72 65 20 69 6e 74 65 72 70 72 65 74 65 64 20  are interpreted 
7cc0: 61 73 20 62 61 73 69 63 20 74 65 72 6d 20 71 75  as basic term qu
7cd0: 65 72 69 65 73 0a 20 20 69 6e 73 74 65 61 64 20  eries.  instead 
7ce0: 6f 66 20 73 65 74 20 6f 70 65 72 61 74 6f 72 73  of set operators
7cf0: 2e 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 41 4e 44  ...<p>.  The AND
7d00: 20 6f 70 65 72 61 74 6f 72 20 6d 61 79 20 62 65   operator may be
7d10: 20 69 6d 70 6c 69 63 69 74 6c 79 20 73 70 65 63   implicitly spec
7d20: 69 66 69 65 64 2e 20 49 66 20 74 77 6f 20 62 61  ified. If two ba
7d30: 73 69 63 20 71 75 65 72 69 65 73 20 61 70 70 65  sic queries appe
7d40: 61 72 20 0a 20 20 77 69 74 68 20 6e 6f 20 6f 70  ar .  with no op
7d50: 65 72 61 74 6f 72 20 73 65 70 61 72 61 74 69 6e  erator separatin
7d60: 67 20 74 68 65 6d 20 69 6e 20 61 6e 20 46 54 53  g them in an FTS
7d70: 20 71 75 65 72 79 20 73 74 72 69 6e 67 2c 20 74   query string, t
7d80: 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 0a 20  he results are. 
7d90: 20 74 68 65 20 73 61 6d 65 20 61 73 20 69 66 20   the same as if 
7da0: 74 68 65 20 74 77 6f 20 62 61 73 69 63 20 71 75  the two basic qu
7db0: 65 72 69 65 73 20 77 65 72 65 20 73 65 70 61 72  eries were separ
7dc0: 61 74 65 64 20 62 79 20 61 6e 20 41 4e 44 20 6f  ated by an AND o
7dd0: 70 65 72 61 74 6f 72 2e 0a 20 20 46 6f 72 20 65  perator..  For e
7de0: 78 61 6d 70 6c 65 2c 20 74 68 65 20 71 75 65 72  xample, the quer
7df0: 79 20 65 78 70 72 65 73 73 69 6f 6e 20 22 69 6d  y expression "im
7e00: 70 6c 69 63 69 74 20 6f 70 65 72 61 74 6f 72 22  plicit operator"
7e10: 20 69 73 20 61 20 6d 6f 72 65 20 73 75 63 63 69   is a more succi
7e20: 6e 63 74 0a 20 20 76 65 72 73 69 6f 6e 20 6f 66  nct.  version of
7e30: 20 22 69 6d 70 6c 69 63 69 74 20 41 4e 44 20 6f   "implicit AND o
7e40: 70 65 72 61 74 6f 72 22 2e 0a 0a 3c 63 6f 64 65  perator"...<code
7e50: 62 6c 6f 63 6b 3e 0a 20 20 3c 69 3e 2d 2d 20 56  block>.  <i>-- V
7e60: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 64 65 63  irtual table dec
7e70: 6c 61 72 61 74 69 6f 6e 3c 2f 69 3e 0a 20 20 43  laration</i>.  C
7e80: 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41  REATE VIRTUAL TA
7e90: 42 4c 45 20 64 6f 63 73 20 55 53 49 4e 47 20 66  BLE docs USING f
7ea0: 74 73 33 28 29 3b 0a 0a 20 20 3c 69 3e 2d 2d 20  ts3();..  <i>-- 
7eb0: 56 69 72 74 75 61 6c 20 74 61 62 6c 65 20 64 61  Virtual table da
7ec0: 74 61 3c 2f 69 3e 0a 20 20 49 4e 53 45 52 54 20  ta</i>.  INSERT 
7ed0: 49 4e 54 4f 20 64 6f 63 73 28 64 6f 63 69 64 2c  INTO docs(docid,
7ee0: 20 63 6f 6e 74 65 6e 74 29 20 56 41 4c 55 45 53   content) VALUES
7ef0: 28 31 2c 20 27 61 20 64 61 74 61 62 61 73 65 20  (1, 'a database 
7f00: 69 73 20 61 20 73 6f 66 74 77 61 72 65 20 73 79  is a software sy
7f10: 73 74 65 6d 27 29 3b 0a 20 20 49 4e 53 45 52 54  stem');.  INSERT
7f20: 20 49 4e 54 4f 20 64 6f 63 73 28 64 6f 63 69 64   INTO docs(docid
7f30: 2c 20 63 6f 6e 74 65 6e 74 29 20 56 41 4c 55 45  , content) VALUE
7f40: 53 28 32 2c 20 27 73 71 6c 69 74 65 20 69 73 20  S(2, 'sqlite is 
7f50: 61 20 73 6f 66 74 77 61 72 65 20 73 79 73 74 65  a software syste
7f60: 6d 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e  m');.  INSERT IN
7f70: 54 4f 20 64 6f 63 73 28 64 6f 63 69 64 2c 20 63  TO docs(docid, c
7f80: 6f 6e 74 65 6e 74 29 20 56 41 4c 55 45 53 28 33  ontent) VALUES(3
7f90: 2c 20 27 73 71 6c 69 74 65 20 69 73 20 61 20 64  , 'sqlite is a d
7fa0: 61 74 61 62 61 73 65 27 29 3b 0a 0a 20 20 3c 69  atabase');..  <i
7fb0: 3e 2d 2d 20 52 65 74 75 72 6e 20 74 68 65 20 73  >-- Return the s
7fc0: 65 74 20 6f 66 20 64 6f 63 75 6d 65 6e 74 73 20  et of documents 
7fd0: 74 68 61 74 20 63 6f 6e 74 61 69 6e 20 74 68 65  that contain the
7fe0: 20 74 65 72 6d 20 22 73 71 6c 69 74 65 22 2c 20   term "sqlite", 
7ff0: 61 6e 64 20 74 68 65 3c 2f 69 3e 0a 20 20 3c 69  and the</i>.  <i
8000: 3e 2d 2d 20 74 65 72 6d 20 22 64 61 74 61 62 61  >-- term "databa
8010: 73 65 22 2e 20 54 68 69 73 20 71 75 65 72 79 20  se". This query 
8020: 77 69 6c 6c 20 72 65 74 75 72 6e 20 74 68 65 20  will return the 
8030: 64 6f 63 75 6d 65 6e 74 20 77 69 74 68 20 64 6f  document with do
8040: 63 69 64 20 33 20 6f 6e 6c 79 2e 3c 2f 69 3e 0a  cid 3 only.</i>.
8050: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
8060: 64 6f 63 73 20 57 48 45 52 45 20 64 6f 63 73 20  docs WHERE docs 
8070: 4d 41 54 43 48 20 27 73 71 6c 69 74 65 20 41 4e  MATCH 'sqlite AN
8080: 44 20 64 61 74 61 62 61 73 65 27 3b 0a 0a 20 20  D database';..  
8090: 3c 69 3e 2d 2d 20 41 67 61 69 6e 2c 20 72 65 74  <i>-- Again, ret
80a0: 75 72 6e 20 74 68 65 20 73 65 74 20 6f 66 20 64  urn the set of d
80b0: 6f 63 75 6d 65 6e 74 73 20 74 68 61 74 20 63 6f  ocuments that co
80c0: 6e 74 61 69 6e 20 62 6f 74 68 20 22 73 71 6c 69  ntain both "sqli
80d0: 74 65 22 20 61 6e 64 3c 2f 69 3e 0a 20 20 3c 69  te" and</i>.  <i
80e0: 3e 2d 2d 20 22 64 61 74 61 62 61 73 65 22 2e 20  >-- "database". 
80f0: 54 68 69 73 20 74 69 6d 65 2c 20 75 73 65 20 61  This time, use a
8100: 6e 20 69 6d 70 6c 69 63 69 74 20 41 4e 44 20 6f  n implicit AND o
8110: 70 65 72 61 74 6f 72 2e 20 41 67 61 69 6e 2c 20  perator. Again, 
8120: 64 6f 63 75 6d 65 6e 74 3c 2f 69 3e 0a 20 20 3c  document</i>.  <
8130: 69 3e 2d 2d 20 33 20 69 73 20 74 68 65 20 6f 6e  i>-- 3 is the on
8140: 6c 79 20 64 6f 63 75 6d 65 6e 74 20 6d 61 74 63  ly document matc
8150: 68 65 64 20 62 79 20 74 68 69 73 20 71 75 65 72  hed by this quer
8160: 79 2e 20 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54  y. </i>.  SELECT
8170: 20 2a 20 46 52 4f 4d 20 64 6f 63 73 20 57 48 45   * FROM docs WHE
8180: 52 45 20 64 6f 63 73 20 4d 41 54 43 48 20 27 64  RE docs MATCH 'd
8190: 61 74 61 62 61 73 65 20 73 71 6c 69 74 65 27 3b  atabase sqlite';
81a0: 0a 0a 20 20 3c 69 3e 2d 2d 20 51 75 65 72 79 20  ..  <i>-- Query 
81b0: 66 6f 72 20 74 68 65 20 73 65 74 20 6f 66 20 64  for the set of d
81c0: 6f 63 75 6d 65 6e 74 73 20 74 68 61 74 20 63 6f  ocuments that co
81d0: 6e 74 61 69 6e 73 20 65 69 74 68 65 72 20 22 73  ntains either "s
81e0: 71 6c 69 74 65 22 20 6f 72 20 22 64 61 74 61 62  qlite" or "datab
81f0: 61 73 65 22 2e 3c 2f 69 3e 0a 20 20 3c 69 3e 2d  ase".</i>.  <i>-
8200: 2d 20 41 6c 6c 20 74 68 72 65 65 20 64 6f 63 75  - All three docu
8210: 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 64 61 74  ments in the dat
8220: 61 62 61 73 65 20 61 72 65 20 6d 61 74 63 68 65  abase are matche
8230: 64 20 62 79 20 74 68 69 73 20 71 75 65 72 79 2e  d by this query.
8240: 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20 2a 20  </i>.  SELECT * 
8250: 46 52 4f 4d 20 64 6f 63 73 20 57 48 45 52 45 20  FROM docs WHERE 
8260: 64 6f 63 73 20 4d 41 54 43 48 20 27 73 71 6c 69  docs MATCH 'sqli
8270: 74 65 20 4f 52 20 64 61 74 61 62 61 73 65 27 3b  te OR database';
8280: 0a 0a 20 20 3c 69 3e 2d 2d 20 51 75 65 72 79 20  ..  <i>-- Query 
8290: 66 6f 72 20 61 6c 6c 20 64 6f 63 75 6d 65 6e 74  for all document
82a0: 73 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 20 74  s that contain t
82b0: 68 65 20 74 65 72 6d 20 22 64 61 74 61 62 61 73  he term "databas
82c0: 65 22 2c 20 62 75 74 20 64 6f 20 6e 6f 74 20 63  e", but do not c
82d0: 6f 6e 74 61 69 6e 3c 2f 69 3e 0a 20 20 3c 69 3e  ontain</i>.  <i>
82e0: 2d 2d 20 74 68 65 20 74 65 72 6d 20 22 73 71 6c  -- the term "sql
82f0: 69 74 65 22 2e 20 44 6f 63 75 6d 65 6e 74 20 31  ite". Document 1
8300: 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 64 6f 63   is the only doc
8310: 75 6d 65 6e 74 20 74 68 61 74 20 6d 61 74 63 68  ument that match
8320: 65 73 20 74 68 69 73 20 63 72 69 74 65 72 69 61  es this criteria
8330: 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20 2a  .</i>.  SELECT *
8340: 20 46 52 4f 4d 20 64 6f 63 73 20 57 48 45 52 45   FROM docs WHERE
8350: 20 64 6f 63 73 20 4d 41 54 43 48 20 27 64 61 74   docs MATCH 'dat
8360: 61 62 61 73 65 20 4e 4f 54 20 73 71 6c 69 74 65  abase NOT sqlite
8370: 27 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 54 68 65 20  ';..  <i>-- The 
8380: 66 6f 6c 6c 6f 77 69 6e 67 20 71 75 65 72 79 20  following query 
8390: 6d 61 74 63 68 65 73 20 6e 6f 20 64 6f 63 75 6d  matches no docum
83a0: 65 6e 74 73 2e 20 42 65 63 61 75 73 65 20 22 61  ents. Because "a
83b0: 6e 64 22 20 69 73 20 69 6e 20 6c 6f 77 65 72 63  nd" is in lowerc
83c0: 61 73 65 20 6c 65 74 74 65 72 73 2c 3c 2f 69 3e  ase letters,</i>
83d0: 0a 20 20 3c 69 3e 2d 2d 20 69 74 20 69 73 20 69  .  <i>-- it is i
83e0: 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 61 20  nterpreted as a 
83f0: 62 61 73 69 63 20 74 65 72 6d 20 71 75 65 72 79  basic term query
8400: 20 69 6e 73 74 65 61 64 20 6f 66 20 61 6e 20 6f   instead of an o
8410: 70 65 72 61 74 6f 72 2e 20 4f 70 65 72 61 74 6f  perator. Operato
8420: 72 73 20 6d 75 73 74 3c 2f 69 3e 0a 20 20 3c 69  rs must</i>.  <i
8430: 3e 2d 2d 20 62 65 20 73 70 65 63 69 66 69 65 64  >-- be specified
8440: 20 75 73 69 6e 67 20 63 61 70 69 74 61 6c 20 6c   using capital l
8450: 65 74 74 65 72 73 2e 20 49 6e 20 70 72 61 63 74  etters. In pract
8460: 69 63 65 2c 20 74 68 69 73 20 71 75 65 72 79 20  ice, this query 
8470: 77 69 6c 6c 20 6d 61 74 63 68 20 61 6e 79 20 64  will match any d
8480: 6f 63 75 6d 65 6e 74 73 3c 2f 69 3e 0a 20 20 3c  ocuments</i>.  <
8490: 69 3e 2d 2d 20 74 68 61 74 20 63 6f 6e 74 61 69  i>-- that contai
84a0: 6e 20 65 61 63 68 20 6f 66 20 74 68 65 20 74 68  n each of the th
84b0: 72 65 65 20 74 65 72 6d 73 20 22 64 61 74 61 62  ree terms "datab
84c0: 61 73 65 22 2c 20 22 61 6e 64 22 20 61 6e 64 20  ase", "and" and 
84d0: 22 73 71 6c 69 74 65 22 20 61 74 20 6c 65 61 73  "sqlite" at leas
84e0: 74 20 6f 6e 63 65 2e 3c 2f 69 3e 0a 20 20 3c 69  t once.</i>.  <i
84f0: 3e 2d 2d 20 4e 6f 20 64 6f 63 75 6d 65 6e 74 73  >-- No documents
8500: 20 69 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 20   in the example 
8510: 64 61 74 61 20 61 62 6f 76 65 20 6d 61 74 63 68  data above match
8520: 20 74 68 69 73 20 63 72 69 74 65 72 69 61 2e 3c   this criteria.<
8530: 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20 2a 20 46  /i>.  SELECT * F
8540: 52 4f 4d 20 64 6f 63 73 20 57 48 45 52 45 20 64  ROM docs WHERE d
8550: 6f 63 73 20 4d 41 54 43 48 20 27 64 61 74 61 62  ocs MATCH 'datab
8560: 61 73 65 20 61 6e 64 20 73 71 6c 69 74 65 27 3b  ase and sqlite';
8570: 0a 3c 2f 63 6f 64 65 62 6c 6f 63 6b 3e 0a 0a 3c  .</codeblock>..<
8580: 70 3e 0a 20 20 54 68 65 20 65 78 61 6d 70 6c 65  p>.  The example
8590: 73 20 61 62 6f 76 65 20 61 6c 6c 20 75 73 65 20  s above all use 
85a0: 62 61 73 69 63 20 66 75 6c 6c 2d 74 65 78 74 20  basic full-text 
85b0: 74 65 72 6d 20 71 75 65 72 69 65 73 20 61 73 20  term queries as 
85c0: 62 6f 74 68 20 6f 70 65 72 61 6e 64 73 20 6f 66  both operands of
85d0: 20 0a 20 20 74 68 65 20 73 65 74 20 6f 70 65 72   .  the set oper
85e0: 61 74 69 6f 6e 73 20 64 65 6d 6f 6e 73 74 72 61  ations demonstra
85f0: 74 65 64 2e 20 50 68 72 61 73 65 20 61 6e 64 20  ted. Phrase and 
8600: 4e 45 41 52 20 71 75 65 72 69 65 73 20 6d 61 79  NEAR queries may
8610: 20 61 6c 73 6f 20 62 65 20 75 73 65 64 2c 0a 20   also be used,. 
8620: 20 61 73 20 6d 61 79 20 74 68 65 20 72 65 73 75   as may the resu
8630: 6c 74 73 20 6f 66 20 6f 74 68 65 72 20 73 65 74  lts of other set
8640: 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20 57 68 65   operations. Whe
8650: 6e 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  n more than one 
8660: 73 65 74 20 6f 70 65 72 61 74 69 6f 6e 0a 20 20  set operation.  
8670: 69 73 20 70 72 65 73 65 6e 74 20 69 6e 20 61 6e  is present in an
8680: 20 46 54 53 20 71 75 65 72 79 2c 20 74 68 65 20   FTS query, the 
8690: 70 72 65 63 65 64 65 6e 63 65 20 6f 66 20 6f 70  precedence of op
86a0: 65 72 61 74 6f 72 73 20 69 73 20 61 73 20 66 6f  erators is as fo
86b0: 6c 6c 6f 77 73 3a 0a 0a 3c 74 61 62 6c 65 20 73  llows:..<table s
86c0: 74 72 69 70 65 64 3d 31 3e 0a 20 20 3c 74 72 3e  triped=1>.  <tr>
86d0: 3c 74 68 3e 4f 70 65 72 61 74 6f 72 3c 74 68 3e  <th>Operator<th>
86e0: 45 6e 68 61 6e 63 65 64 20 51 75 65 72 79 20 53  Enhanced Query S
86f0: 79 6e 74 61 78 20 50 72 65 63 65 64 65 6e 63 65  yntax Precedence
8700: 0a 20 20 3c 74 72 3e 3c 74 64 3e 4e 4f 54 20 3c  .  <tr><td>NOT <
8710: 74 64 3e 20 48 69 67 68 65 73 74 20 70 72 65 63  td> Highest prec
8720: 65 64 65 6e 63 65 20 28 74 69 67 68 74 65 73 74  edence (tightest
8730: 20 67 72 6f 75 70 69 6e 67 29 2e 0a 20 20 3c 74   grouping)..  <t
8740: 72 3e 3c 74 64 3e 41 4e 44 20 3c 74 64 3e 0a 20  r><td>AND <td>. 
8750: 20 3c 74 72 3e 3c 74 64 3e 4f 52 20 20 3c 74 64   <tr><td>OR  <td
8760: 3e 20 4c 6f 77 65 73 74 20 70 72 65 63 65 64 65  > Lowest precede
8770: 6e 63 65 20 28 6c 6f 6f 73 65 73 74 20 67 72 6f  nce (loosest gro
8780: 75 70 69 6e 67 29 2e 0a 3c 2f 74 61 62 6c 65 3e  uping)..</table>
8790: 0a 0a 3c 70 3e 0a 20 20 57 68 65 6e 20 75 73 69  ..<p>.  When usi
87a0: 6e 67 20 74 68 65 20 65 6e 68 61 6e 63 65 64 20  ng the enhanced 
87b0: 71 75 65 72 79 20 73 79 6e 74 61 78 2c 20 70 61  query syntax, pa
87c0: 72 65 6e 74 68 65 73 69 73 20 6d 61 79 20 62 65  renthesis may be
87d0: 20 75 73 65 64 20 74 6f 20 6f 76 65 72 72 69 64   used to overrid
87e0: 65 0a 20 20 74 68 65 20 64 65 66 61 75 6c 74 20  e.  the default 
87f0: 70 72 65 63 65 64 65 6e 63 65 20 6f 66 20 74 68  precedence of th
8800: 65 20 76 61 72 69 6f 75 73 20 6f 70 65 72 61 74  e various operat
8810: 6f 72 73 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65  ors. For example
8820: 3a 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a 0a  :..<codeblock>..
8830: 20 20 3c 69 3e 2d 2d 20 52 65 74 75 72 6e 20 74    <i>-- Return t
8840: 68 65 20 64 6f 63 69 64 20 76 61 6c 75 65 73 20  he docid values 
8850: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
8860: 61 6c 6c 20 64 6f 63 75 6d 65 6e 74 73 20 74 68  all documents th
8870: 61 74 20 63 6f 6e 74 61 69 6e 20 74 68 65 3c 2f  at contain the</
8880: 69 3e 0a 20 20 3c 69 3e 2d 2d 20 74 77 6f 20 74  i>.  <i>-- two t
8890: 65 72 6d 73 20 22 73 71 6c 69 74 65 22 20 61 6e  erms "sqlite" an
88a0: 64 20 22 64 61 74 61 62 61 73 65 22 2c 20 61 6e  d "database", an
88b0: 64 2f 6f 72 20 63 6f 6e 74 61 69 6e 20 74 68 65  d/or contain the
88c0: 20 74 65 72 6d 20 22 6c 69 62 72 61 72 79 22 2e   term "library".
88d0: 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20 64 6f  </i>.  SELECT do
88e0: 63 69 64 20 46 52 4f 4d 20 64 6f 63 73 20 57 48  cid FROM docs WH
88f0: 45 52 45 20 64 6f 63 73 20 4d 41 54 43 48 20 27  ERE docs MATCH '
8900: 73 71 6c 69 74 65 20 41 4e 44 20 64 61 74 61 62  sqlite AND datab
8910: 61 73 65 20 4f 52 20 6c 69 62 72 61 72 79 27 3b  ase OR library';
8920: 0a 0a 20 20 3c 69 3e 2d 2d 20 54 68 69 73 20 71  ..  <i>-- This q
8930: 75 65 72 79 20 69 73 20 65 71 75 69 76 61 6c 65  uery is equivale
8940: 6e 74 20 74 6f 20 74 68 65 20 61 62 6f 76 65 2e  nt to the above.
8950: 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20 64 6f  </i>.  SELECT do
8960: 63 69 64 20 46 52 4f 4d 20 64 6f 63 73 20 57 48  cid FROM docs WH
8970: 45 52 45 20 64 6f 63 73 20 4d 41 54 43 48 20 27  ERE docs MATCH '
8980: 73 71 6c 69 74 65 20 41 4e 44 20 64 61 74 61 62  sqlite AND datab
8990: 61 73 65 27 0a 20 20 20 20 55 4e 49 4f 4e 0a 20  ase'.    UNION. 
89a0: 20 53 45 4c 45 43 54 20 64 6f 63 69 64 20 46 52   SELECT docid FR
89b0: 4f 4d 20 64 6f 63 73 20 57 48 45 52 45 20 64 6f  OM docs WHERE do
89c0: 63 73 20 4d 41 54 43 48 20 27 6c 69 62 72 61 72  cs MATCH 'librar
89d0: 79 27 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 51 75 65  y';..  <i>-- Que
89e0: 72 79 20 66 6f 72 20 74 68 65 20 73 65 74 20 6f  ry for the set o
89f0: 66 20 64 6f 63 75 6d 65 6e 74 73 20 74 68 61 74  f documents that
8a00: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 74 65   contains the te
8a10: 72 6d 20 22 6c 69 6e 75 78 22 2c 20 61 6e 64 20  rm "linux", and 
8a20: 61 74 20 6c 65 61 73 74 3c 2f 69 3e 0a 20 20 3c  at least</i>.  <
8a30: 69 3e 2d 2d 20 6f 6e 65 20 6f 66 20 74 68 65 20  i>-- one of the 
8a40: 70 68 72 61 73 65 73 20 22 73 71 6c 69 74 65 20  phrases "sqlite 
8a50: 64 61 74 61 62 61 73 65 22 20 61 6e 64 20 22 73  database" and "s
8a60: 71 6c 69 74 65 20 6c 69 62 72 61 72 79 22 2e 3c  qlite library".<
8a70: 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20 64 6f 63  /i>.  SELECT doc
8a80: 69 64 20 46 52 4f 4d 20 64 6f 63 73 20 57 48 45  id FROM docs WHE
8a90: 52 45 20 64 6f 63 73 20 4d 41 54 43 48 20 27 28  RE docs MATCH '(
8aa0: 22 73 71 6c 69 74 65 20 64 61 74 61 62 61 73 65  "sqlite database
8ab0: 22 20 4f 52 20 22 73 71 6c 69 74 65 20 6c 69 62  " OR "sqlite lib
8ac0: 72 61 72 79 22 29 20 41 4e 44 20 6c 69 6e 75 78  rary") AND linux
8ad0: 27 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 54 68 69 73  ';..  <i>-- This
8ae0: 20 71 75 65 72 79 20 69 73 20 65 71 75 69 76 61   query is equiva
8af0: 6c 65 6e 74 20 74 6f 20 74 68 65 20 61 62 6f 76  lent to the abov
8b00: 65 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20  e.</i>.  SELECT 
8b10: 64 6f 63 69 64 20 46 52 4f 4d 20 64 6f 63 73 20  docid FROM docs 
8b20: 57 48 45 52 45 20 64 6f 63 73 20 4d 41 54 43 48  WHERE docs MATCH
8b30: 20 27 6c 69 6e 75 78 27 0a 20 20 20 20 49 4e 54   'linux'.    INT
8b40: 45 52 53 45 43 54 0a 20 20 53 45 4c 45 43 54 20  ERSECT.  SELECT 
8b50: 64 6f 63 69 64 20 46 52 4f 4d 20 28 0a 20 20 20  docid FROM (.   
8b60: 20 53 45 4c 45 43 54 20 64 6f 63 69 64 20 46 52   SELECT docid FR
8b70: 4f 4d 20 64 6f 63 73 20 57 48 45 52 45 20 64 6f  OM docs WHERE do
8b80: 63 73 20 4d 41 54 43 48 20 27 22 73 71 6c 69 74  cs MATCH '"sqlit
8b90: 65 20 6c 69 62 72 61 72 79 22 27 0a 20 20 20 20  e library"'.    
8ba0: 20 20 55 4e 49 4f 4e 0a 20 20 20 20 53 45 4c 45    UNION.    SELE
8bb0: 43 54 20 64 6f 63 69 64 20 46 52 4f 4d 20 64 6f  CT docid FROM do
8bc0: 63 73 20 57 48 45 52 45 20 64 6f 63 73 20 4d 41  cs WHERE docs MA
8bd0: 54 43 48 20 27 22 73 71 6c 69 74 65 20 64 61 74  TCH '"sqlite dat
8be0: 61 62 61 73 65 22 27 0a 20 20 29 3b 0a 3c 2f 63  abase"'.  );.</c
8bf0: 6f 64 65 62 6c 6f 63 6b 3e 0a 0a 0a 3c 68 32 3e  odeblock>...<h2>
8c00: 53 65 74 20 4f 70 65 72 61 74 69 6f 6e 73 20 55  Set Operations U
8c10: 73 69 6e 67 20 54 68 65 20 53 74 61 6e 64 61 72  sing The Standar
8c20: 64 20 51 75 65 72 79 20 53 79 6e 74 61 78 3c 2f  d Query Syntax</
8c30: 68 32 3e 0a 0a 3c 70 3e 0a 20 20 46 54 53 20 71  h2>..<p>.  FTS q
8c40: 75 65 72 79 20 73 65 74 20 6f 70 65 72 61 74 69  uery set operati
8c50: 6f 6e 73 20 75 73 69 6e 67 20 74 68 65 20 73 74  ons using the st
8c60: 61 6e 64 61 72 64 20 71 75 65 72 79 20 73 79 6e  andard query syn
8c70: 74 61 78 20 61 72 65 20 73 69 6d 69 6c 61 72 2c  tax are similar,
8c80: 20 62 75 74 0a 20 20 6e 6f 74 20 69 64 65 6e 74   but.  not ident
8c90: 69 63 61 6c 2c 20 74 6f 20 73 65 74 20 6f 70 65  ical, to set ope
8ca0: 72 61 74 69 6f 6e 73 20 77 69 74 68 20 74 68 65  rations with the
8cb0: 20 65 6e 68 61 6e 63 65 64 20 71 75 65 72 79 20   enhanced query 
8cc0: 73 79 6e 74 61 78 2e 20 54 68 65 72 65 0a 20 20  syntax. There.  
8cd0: 61 72 65 20 66 6f 75 72 20 64 69 66 66 65 72 65  are four differe
8ce0: 6e 63 65 73 2c 20 61 73 20 66 6f 6c 6c 6f 77 73  nces, as follows
8cf0: 3a 0a 0a 3c 6f 6c 3e 0a 20 20 3c 6c 69 20 76 61  :..<ol>.  <li va
8d00: 6c 75 65 3d 31 3e 3c 70 3e 20 4f 6e 6c 79 20 74  lue=1><p> Only t
8d10: 68 65 20 69 6d 70 6c 69 63 69 74 20 76 65 72 73  he implicit vers
8d20: 69 6f 6e 20 6f 66 20 74 68 65 20 41 4e 44 20 6f  ion of the AND o
8d30: 70 65 72 61 74 6f 72 20 69 73 20 73 75 70 70 6f  perator is suppo
8d40: 72 74 65 64 2e 0a 20 20 20 20 53 70 65 63 69 66  rted..    Specif
8d50: 79 69 6e 67 20 74 68 65 20 73 74 72 69 6e 67 20  ying the string 
8d60: 22 41 4e 44 22 20 61 73 20 70 61 72 74 20 6f 66  "AND" as part of
8d70: 20 61 20 73 74 61 6e 64 61 72 64 20 71 75 65 72   a standard quer
8d80: 79 20 73 79 6e 74 61 78 20 71 75 65 72 79 20 69  y syntax query i
8d90: 73 0a 20 20 20 20 69 6e 74 65 72 70 72 65 74 65  s.    interprete
8da0: 64 20 61 73 20 61 20 74 65 72 6d 20 71 75 65 72  d as a term quer
8db0: 79 20 66 6f 72 20 74 68 65 20 73 65 74 20 6f 66  y for the set of
8dc0: 20 64 6f 63 75 6d 65 6e 74 73 20 63 6f 6e 74 61   documents conta
8dd0: 69 6e 69 6e 67 20 74 68 65 20 74 65 72 6d 20 0a  ining the term .
8de0: 20 20 20 20 22 61 6e 64 22 2e 0a 3c 2f 6f 6c 3e      "and"..</ol>
8df0: 0a 0a 3c 6f 6c 3e 0a 20 20 3c 6c 69 20 76 61 6c  ..<ol>.  <li val
8e00: 75 65 3d 32 3e 3c 70 3e 20 50 61 72 65 6e 74 68  ue=2><p> Parenth
8e10: 65 73 69 73 20 61 72 65 20 6e 6f 74 20 73 75 70  esis are not sup
8e20: 70 6f 72 74 65 64 2e 0a 3c 2f 6f 6c 3e 0a 0a 3c  ported..</ol>..<
8e30: 6f 6c 3e 0a 20 20 3c 6c 69 20 76 61 6c 75 65 3d  ol>.  <li value=
8e40: 33 3e 3c 70 3e 20 54 68 65 20 4e 4f 54 20 6f 70  3><p> The NOT op
8e50: 65 72 61 74 6f 72 20 69 73 20 6e 6f 74 20 73 75  erator is not su
8e60: 70 70 6f 72 74 65 64 2e 20 49 6e 73 74 65 61 64  pported. Instead
8e70: 20 6f 66 20 74 68 65 20 4e 4f 54 20 0a 20 20 20   of the NOT .   
8e80: 20 6f 70 65 72 61 74 6f 72 2c 20 74 68 65 20 73   operator, the s
8e90: 74 61 6e 64 61 72 64 20 71 75 65 72 79 20 73 79  tandard query sy
8ea0: 6e 74 61 78 20 73 75 70 70 6f 72 74 73 20 61 20  ntax supports a 
8eb0: 75 6e 61 72 79 20 22 2d 22 20 6f 70 65 72 61 74  unary "-" operat
8ec0: 6f 72 20 74 68 61 74 0a 20 20 20 20 6d 61 79 20  or that.    may 
8ed0: 62 65 20 61 70 70 6c 69 65 64 20 74 6f 20 62 61  be applied to ba
8ee0: 73 69 63 20 74 65 72 6d 20 61 6e 64 20 74 65 72  sic term and ter
8ef0: 6d 2d 70 72 65 66 69 78 20 71 75 65 72 69 65 73  m-prefix queries
8f00: 20 28 62 75 74 20 6e 6f 74 20 74 6f 20 70 68 72   (but not to phr
8f10: 61 73 65 0a 20 20 20 20 6f 72 20 4e 45 41 52 20  ase.    or NEAR 
8f20: 71 75 65 72 69 65 73 29 2e 20 41 20 74 65 72 6d  queries). A term
8f30: 20 6f 72 20 74 65 72 6d 2d 70 72 65 66 69 78 20   or term-prefix 
8f40: 74 68 61 74 20 68 61 73 20 61 20 75 6e 61 72 79  that has a unary
8f50: 20 22 2d 22 20 6f 70 65 72 61 74 6f 72 0a 20 20   "-" operator.  
8f60: 20 20 61 74 74 61 63 68 65 64 20 74 6f 20 69 74    attached to it
8f70: 20 6d 61 79 20 6e 6f 74 20 61 70 70 65 61 72 20   may not appear 
8f80: 61 73 20 61 6e 20 6f 70 65 72 61 6e 64 20 74 6f  as an operand to
8f90: 20 61 6e 20 4f 52 20 6f 70 65 72 61 74 6f 72 2e   an OR operator.
8fa0: 20 41 6e 20 46 54 53 0a 20 20 20 20 71 75 65 72   An FTS.    quer
8fb0: 79 20 6d 61 79 20 6e 6f 74 20 63 6f 6e 73 69 73  y may not consis
8fc0: 74 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 74 65  t entirely of te
8fd0: 72 6d 73 20 6f 72 20 74 65 72 6d 2d 70 72 65 66  rms or term-pref
8fe0: 69 78 20 71 75 65 72 69 65 73 20 77 69 74 68 20  ix queries with 
8ff0: 75 6e 61 72 79 0a 20 20 20 20 22 2d 22 20 6f 70  unary.    "-" op
9000: 65 72 61 74 6f 72 73 20 61 74 74 61 63 68 65 64  erators attached
9010: 20 74 6f 20 74 68 65 6d 2e 0a 3c 2f 6f 6c 3e 0a   to them..</ol>.
9020: 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20 20 3c  .<codeblock>.  <
9030: 69 3e 2d 2d 20 53 65 61 72 63 68 20 66 6f 72 20  i>-- Search for 
9040: 74 68 65 20 73 65 74 20 6f 66 20 64 6f 63 75 6d  the set of docum
9050: 65 6e 74 73 20 74 68 61 74 20 63 6f 6e 74 61 69  ents that contai
9060: 6e 20 74 68 65 20 74 65 72 6d 20 22 73 71 6c 69  n the term "sqli
9070: 74 65 22 20 62 75 74 20 64 6f 3c 2f 69 3e 0a 20  te" but do</i>. 
9080: 20 3c 69 3e 2d 2d 20 6e 6f 74 20 63 6f 6e 74 61   <i>-- not conta
9090: 69 6e 20 74 68 65 20 74 65 72 6d 20 22 64 61 74  in the term "dat
90a0: 61 62 61 73 65 22 2e 3c 2f 69 3e 0a 20 20 53 45  abase".</i>.  SE
90b0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 64 6f 63 73  LECT * FROM docs
90c0: 20 57 48 45 52 45 20 64 6f 63 73 20 4d 41 54 43   WHERE docs MATC
90d0: 48 20 27 73 71 6c 69 74 65 20 2d 64 61 74 61 62  H 'sqlite -datab
90e0: 61 73 65 27 3b 0a 3c 2f 63 6f 64 65 62 6c 6f 63  ase';.</codebloc
90f0: 6b 3e 0a 0a 3c 6f 6c 3e 0a 20 20 3c 6c 69 20 76  k>..<ol>.  <li v
9100: 61 6c 75 65 3d 34 3e 3c 70 3e 20 54 68 65 20 72  alue=4><p> The r
9110: 65 6c 61 74 69 76 65 20 70 72 65 63 65 64 65 6e  elative preceden
9120: 63 65 20 6f 66 20 74 68 65 20 73 65 74 20 6f 70  ce of the set op
9130: 65 72 61 74 69 6f 6e 73 20 69 73 20 64 69 66 66  erations is diff
9140: 65 72 65 6e 74 2e 20 0a 20 20 20 49 6e 20 70 61  erent. .   In pa
9150: 72 74 69 63 75 6c 61 72 2c 20 75 73 69 6e 67 20  rticular, using 
9160: 74 68 65 20 73 74 61 6e 64 61 72 64 20 71 75 65  the standard que
9170: 72 79 20 73 79 6e 74 61 78 20 74 68 65 20 22 4f  ry syntax the "O
9180: 52 22 20 6f 70 65 72 61 74 6f 72 20 68 61 73 20  R" operator has 
9190: 61 0a 20 20 20 68 69 67 68 65 72 20 70 72 65 63  a.   higher prec
91a0: 65 64 65 6e 63 65 20 74 68 61 6e 20 22 41 4e 44  edence than "AND
91b0: 22 2e 20 54 68 65 20 70 72 65 63 65 64 65 6e 63  ". The precedenc
91c0: 65 20 6f 66 20 6f 70 65 72 61 74 6f 72 73 20 77  e of operators w
91d0: 68 65 6e 20 75 73 69 6e 67 20 74 68 65 0a 20 20  hen using the.  
91e0: 20 73 74 61 6e 64 61 72 64 20 71 75 65 72 79 20   standard query 
91f0: 73 79 6e 74 61 78 20 69 73 3a 20 0a 3c 2f 6f 6c  syntax is: .</ol
9200: 3e 0a 0a 3c 74 61 62 6c 65 20 73 74 72 69 70 65  >..<table stripe
9210: 64 3d 31 3e 0a 20 20 3c 74 72 3e 3c 74 68 3e 4f  d=1>.  <tr><th>O
9220: 70 65 72 61 74 6f 72 3c 74 68 3e 53 74 61 6e 64  perator<th>Stand
9230: 61 72 64 20 51 75 65 72 79 20 53 79 6e 74 61 78  ard Query Syntax
9240: 20 50 72 65 63 65 64 65 6e 63 65 0a 20 20 3c 74   Precedence.  <t
9250: 72 3e 3c 74 64 3e 55 6e 61 72 79 20 22 2d 22 20  r><td>Unary "-" 
9260: 3c 74 64 3e 20 48 69 67 68 65 73 74 20 70 72 65  <td> Highest pre
9270: 63 65 64 65 6e 63 65 20 28 74 69 67 68 74 65 73  cedence (tightes
9280: 74 20 67 72 6f 75 70 69 6e 67 29 2e 0a 20 20 3c  t grouping)..  <
9290: 74 72 3e 3c 74 64 3e 4f 52 20 20 3c 74 64 3e 0a  tr><td>OR  <td>.
92a0: 20 20 3c 74 72 3e 3c 74 64 3e 41 4e 44 20 3c 74    <tr><td>AND <t
92b0: 64 3e 20 4c 6f 77 65 73 74 20 70 72 65 63 65 64  d> Lowest preced
92c0: 65 6e 63 65 20 28 6c 6f 6f 73 65 73 74 20 67 72  ence (loosest gr
92d0: 6f 75 70 69 6e 67 29 2e 0a 3c 2f 74 61 62 6c 65  ouping)..</table
92e0: 3e 0a 0a 3c 6f 6c 3e 3c 6c 69 20 73 74 79 6c 65  >..<ol><li style
92f0: 3d 22 6c 69 73 74 2d 73 74 79 6c 65 3a 6e 6f 6e  ="list-style:non
9300: 65 22 3e 0a 20 20 54 68 65 20 66 6f 6c 6c 6f 77  e">.  The follow
9310: 69 6e 67 20 65 78 61 6d 70 6c 65 20 69 6c 6c 75  ing example illu
9320: 73 74 72 61 74 65 73 20 70 72 65 63 65 64 65 6e  strates preceden
9330: 63 65 20 6f 66 20 6f 70 65 72 61 74 6f 72 73 20  ce of operators 
9340: 75 73 69 6e 67 20 74 68 65 20 73 74 61 6e 64 61  using the standa
9350: 72 64 20 0a 20 20 71 75 65 72 79 20 73 79 6e 74  rd .  query synt
9360: 61 78 3a 0a 3c 2f 6f 6c 3e 0a 0a 3c 63 6f 64 65  ax:.</ol>..<code
9370: 62 6c 6f 63 6b 3e 0a 20 20 3c 69 3e 2d 2d 20 53  block>.  <i>-- S
9380: 65 61 72 63 68 20 66 6f 72 20 64 6f 63 75 6d 65  earch for docume
9390: 6e 74 73 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  nts that contain
93a0: 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 66   at least one of
93b0: 20 74 68 65 20 74 65 72 6d 73 20 22 64 61 74 61   the terms "data
93c0: 62 61 73 65 22 3c 2f 69 3e 0a 20 20 3c 69 3e 2d  base"</i>.  <i>-
93d0: 2d 20 61 6e 64 20 22 73 71 6c 69 74 65 22 2c 20  - and "sqlite", 
93e0: 61 6e 64 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e  and also contain
93f0: 20 74 68 65 20 74 65 72 6d 20 22 6c 69 62 72 61   the term "libra
9400: 72 79 22 2e 20 42 65 63 61 75 73 65 20 6f 66 20  ry". Because of 
9410: 74 68 65 20 64 69 66 66 65 72 65 6e 63 65 73 3c  the differences<
9420: 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 69 6e 20 6f  /i>.  <i>-- in o
9430: 70 65 72 61 74 6f 72 20 70 72 65 63 65 64 65 6e  perator preceden
9440: 63 65 73 2c 20 74 68 69 73 20 71 75 65 72 79 20  ces, this query 
9450: 77 6f 75 6c 64 20 68 61 76 65 20 61 20 64 69 66  would have a dif
9460: 66 65 72 65 6e 74 20 69 6e 74 65 72 70 72 65 74  ferent interpret
9470: 61 74 69 6f 6e 20 75 73 69 6e 67 3c 2f 69 3e 0a  ation using</i>.
9480: 20 20 3c 69 3e 2d 2d 20 74 68 65 20 65 6e 68 61    <i>-- the enha
9490: 6e 63 65 64 20 71 75 65 72 79 20 73 79 6e 74 61  nced query synta
94a0: 78 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20  x.</i>.  SELECT 
94b0: 2a 20 46 52 4f 4d 20 64 6f 63 73 20 57 48 45 52  * FROM docs WHER
94c0: 45 20 64 6f 63 73 20 4d 41 54 43 48 20 27 73 71  E docs MATCH 'sq
94d0: 6c 69 74 65 20 4f 52 20 64 61 74 61 62 61 73 65  lite OR database
94e0: 20 6c 69 62 72 61 72 79 27 3b 0a 3c 2f 63 6f 64   library';.</cod
94f0: 65 62 6c 6f 63 6b 3e 0a 0a 3c 74 63 6c 3e 68 64  eblock>..<tcl>hd
9500: 5f 66 72 61 67 6d 65 6e 74 20 73 6e 69 70 70 65  _fragment snippe
9510: 74 20 7b 46 54 53 20 61 75 78 69 6c 69 61 72 79  t {FTS auxiliary
9520: 20 66 75 6e 63 74 69 6f 6e 73 7d 3c 2f 74 63 6c   functions}</tcl
9530: 3e 0a 3c 68 31 3e 41 75 78 69 6c 69 61 72 79 20  >.<h1>Auxiliary 
9540: 46 75 6e 63 74 69 6f 6e 73 20 2d 20 53 6e 69 70  Functions - Snip
9550: 70 65 74 2c 20 4f 66 66 73 65 74 73 20 61 6e 64  pet, Offsets and
9560: 20 4d 61 74 63 68 69 6e 66 6f 3c 2f 68 31 3e 0a   Matchinfo</h1>.
9570: 0a 3c 70 3e 0a 20 20 54 68 65 20 46 54 53 33 20  .<p>.  The FTS3 
9580: 61 6e 64 20 46 54 53 34 20 6d 6f 64 75 6c 65 73  and FTS4 modules
9590: 20 70 72 6f 76 69 64 65 20 74 68 72 65 65 20 73   provide three s
95a0: 70 65 63 69 61 6c 20 53 51 4c 20 73 63 61 6c 61  pecial SQL scala
95b0: 72 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74  r functions that
95c0: 20 6d 61 79 20 62 65 20 75 73 65 66 75 6c 0a 20   may be useful. 
95d0: 20 74 6f 20 74 68 65 20 64 65 76 65 6c 6f 70 65   to the develope
95e0: 72 73 20 6f 66 20 66 75 6c 6c 2d 74 65 78 74 20  rs of full-text 
95f0: 71 75 65 72 79 20 73 79 73 74 65 6d 73 3a 20 22  query systems: "
9600: 73 6e 69 70 70 65 74 22 2c 20 22 6f 66 66 73 65  snippet", "offse
9610: 74 73 22 20 61 6e 64 0a 20 20 22 6d 61 74 63 68  ts" and.  "match
9620: 69 6e 66 6f 22 2e 20 54 68 65 20 70 75 72 70 6f  info". The purpo
9630: 73 65 20 6f 66 20 74 68 65 20 22 73 6e 69 70 70  se of the "snipp
9640: 65 74 22 20 61 6e 64 20 22 6f 66 66 73 65 74 73  et" and "offsets
9650: 22 20 66 75 6e 63 74 69 6f 6e 73 20 69 73 20 74  " functions is t
9660: 6f 20 61 6c 6c 6f 77 0a 20 20 74 68 65 20 75 73  o allow.  the us
9670: 65 72 20 74 6f 20 69 64 65 6e 74 69 66 79 20 74  er to identify t
9680: 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 71  he location of q
9690: 75 65 72 69 65 64 20 74 65 72 6d 73 20 69 6e 20  ueried terms in 
96a0: 74 68 65 20 72 65 74 75 72 6e 65 64 20 64 6f 63  the returned doc
96b0: 75 6d 65 6e 74 73 2e 0a 20 20 54 68 65 20 22 6d  uments..  The "m
96c0: 61 74 63 68 69 6e 66 6f 22 20 66 75 6e 63 74 69  atchinfo" functi
96d0: 6f 6e 20 70 72 6f 76 69 64 65 73 20 74 68 65 20  on provides the 
96e0: 75 73 65 72 20 77 69 74 68 20 6d 65 74 72 69 63  user with metric
96f0: 73 20 74 68 61 74 20 6d 61 79 20 62 65 20 75 73  s that may be us
9700: 65 66 75 6c 0a 20 20 66 6f 72 20 66 69 6c 74 65  eful.  for filte
9710: 72 69 6e 67 20 6f 72 20 73 6f 72 74 69 6e 67 20  ring or sorting 
9720: 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 61 63  query results ac
9730: 63 6f 72 64 69 6e 67 20 74 6f 20 72 65 6c 65 76  cording to relev
9740: 61 6e 63 65 2e 0a 0a 3c 70 3e 0a 20 20 54 68 65  ance...<p>.  The
9750: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
9760: 74 6f 20 61 6c 6c 20 74 68 72 65 65 20 73 70 65  to all three spe
9770: 63 69 61 6c 20 53 51 4c 20 73 63 61 6c 61 72 20  cial SQL scalar 
9780: 66 75 6e 63 74 69 6f 6e 73 0a 20 20 6d 75 73 74  functions.  must
9790: 20 62 65 20 74 68 65 20 5b 46 54 53 20 68 69 64   be the [FTS hid
97a0: 64 65 6e 20 63 6f 6c 75 6d 6e 5d 20 6f 66 20 74  den column] of t
97b0: 68 65 20 46 54 53 20 74 61 62 6c 65 20 74 68 61  he FTS table tha
97c0: 74 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 69  t the function i
97d0: 73 0a 20 20 61 70 70 6c 69 65 64 20 74 6f 2e 20  s.  applied to. 
97e0: 20 54 68 65 20 5b 46 54 53 20 68 69 64 64 65 6e   The [FTS hidden
97f0: 20 63 6f 6c 75 6d 6e 5d 20 69 73 20 61 6e 20 61   column] is an a
9800: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2d 67 65 6e  utomatically-gen
9810: 65 72 61 74 65 64 20 63 6f 6c 75 6d 6e 20 66 6f  erated column fo
9820: 75 6e 64 20 6f 6e 0a 20 20 61 6c 6c 20 46 54 53  und on.  all FTS
9830: 20 74 61 62 6c 65 73 20 74 68 61 74 20 68 61 73   tables that has
9840: 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 61   the same name a
9850: 73 20 74 68 65 20 46 54 53 20 74 61 62 6c 65 20  s the FTS table 
9860: 69 74 73 65 6c 66 2e 0a 20 20 46 6f 72 20 65 78  itself..  For ex
9870: 61 6d 70 6c 65 2c 20 67 69 76 65 6e 20 61 6e 20  ample, given an 
9880: 46 54 53 20 74 61 62 6c 65 20 6e 61 6d 65 64 20  FTS table named 
9890: 22 6d 61 69 6c 22 3a 0a 0a 3c 63 6f 64 65 62 6c  "mail":..<codebl
98a0: 6f 63 6b 3e 0a 20 20 53 45 4c 45 43 54 20 6f 66  ock>.  SELECT of
98b0: 66 73 65 74 73 28 6d 61 69 6c 29 20 46 52 4f 4d  fsets(mail) FROM
98c0: 20 6d 61 69 6c 20 57 48 45 52 45 20 6d 61 69 6c   mail WHERE mail
98d0: 20 4d 41 54 43 48 20 26 6c 74 3b 66 75 6c 6c 2d   MATCH &lt;full-
98e0: 74 65 78 74 20 71 75 65 72 79 20 65 78 70 72 65  text query expre
98f0: 73 73 69 6f 6e 26 67 74 3b 3b 0a 20 20 53 45 4c  ssion&gt;;.  SEL
9900: 45 43 54 20 73 6e 69 70 70 65 74 28 6d 61 69 6c  ECT snippet(mail
9910: 29 20 46 52 4f 4d 20 6d 61 69 6c 20 57 48 45 52  ) FROM mail WHER
9920: 45 20 6d 61 69 6c 20 4d 41 54 43 48 20 26 6c 74  E mail MATCH &lt
9930: 3b 66 75 6c 6c 2d 74 65 78 74 20 71 75 65 72 79  ;full-text query
9940: 20 65 78 70 72 65 73 73 69 6f 6e 26 67 74 3b 3b   expression&gt;;
9950: 0a 20 20 53 45 4c 45 43 54 20 6d 61 74 63 68 69  .  SELECT matchi
9960: 6e 66 6f 28 6d 61 69 6c 29 20 46 52 4f 4d 20 6d  nfo(mail) FROM m
9970: 61 69 6c 20 57 48 45 52 45 20 6d 61 69 6c 20 4d  ail WHERE mail M
9980: 41 54 43 48 20 26 6c 74 3b 66 75 6c 6c 2d 74 65  ATCH &lt;full-te
9990: 78 74 20 71 75 65 72 79 20 65 78 70 72 65 73 73  xt query express
99a0: 69 6f 6e 26 67 74 3b 3b 0a 3c 2f 63 6f 64 65 62  ion&gt;;.</codeb
99b0: 6c 6f 63 6b 3e 0a 0a 3c 70 3e 0a 20 20 54 68 65  lock>..<p>.  The
99c0: 20 74 68 72 65 65 20 61 75 78 69 6c 69 61 72 79   three auxiliary
99d0: 20 66 75 6e 63 74 69 6f 6e 73 20 61 72 65 20 6f   functions are o
99e0: 6e 6c 79 20 75 73 65 66 75 6c 20 77 69 74 68 69  nly useful withi
99f0: 6e 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  n a SELECT state
9a00: 6d 65 6e 74 20 74 68 61 74 0a 20 20 75 73 65 73  ment that.  uses
9a10: 20 74 68 65 20 46 54 53 20 74 61 62 6c 65 27 73   the FTS table's
9a20: 20 66 75 6c 6c 2d 74 65 78 74 20 69 6e 64 65 78   full-text index
9a30: 2e 20 5e 49 66 20 75 73 65 64 20 77 69 74 68 69  . ^If used withi
9a40: 6e 20 61 20 53 45 4c 45 43 54 20 74 68 61 74 20  n a SELECT that 
9a50: 75 73 65 73 0a 20 20 74 68 65 20 22 71 75 65 72  uses.  the "quer
9a60: 79 20 62 79 20 72 6f 77 69 64 22 20 6f 72 20 22  y by rowid" or "
9a70: 6c 69 6e 65 61 72 20 73 63 61 6e 22 20 73 74 72  linear scan" str
9a80: 61 74 65 67 69 65 73 2c 20 74 68 65 6e 20 74 68  ategies, then th
9a90: 65 20 73 6e 69 70 70 65 74 20 61 6e 64 0a 20 20  e snippet and.  
9aa0: 6f 66 66 73 65 74 73 20 62 6f 74 68 20 72 65 74  offsets both ret
9ab0: 75 72 6e 20 61 6e 20 65 6d 70 74 79 20 73 74 72  urn an empty str
9ac0: 69 6e 67 2c 20 61 6e 64 20 74 68 65 20 6d 61 74  ing, and the mat
9ad0: 63 68 69 6e 66 6f 20 66 75 6e 63 74 69 6f 6e 20  chinfo function 
9ae0: 72 65 74 75 72 6e 73 0a 20 20 61 20 62 6c 6f 62  returns.  a blob
9af0: 20 76 61 6c 75 65 20 7a 65 72 6f 20 62 79 74 65   value zero byte
9b00: 73 20 69 6e 20 73 69 7a 65 2e 0a 0a 3c 70 20 69  s in size...<p i
9b10: 64 3d 6d 61 74 63 68 61 62 6c 65 3e 0a 20 20 41  d=matchable>.  A
9b20: 6c 6c 20 74 68 72 65 65 20 61 75 78 69 6c 69 61  ll three auxilia
9b30: 72 79 20 66 75 6e 63 74 69 6f 6e 73 20 65 78 74  ry functions ext
9b40: 72 61 63 74 20 61 20 73 65 74 20 6f 66 20 22 6d  ract a set of "m
9b50: 61 74 63 68 61 62 6c 65 20 70 68 72 61 73 65 73  atchable phrases
9b60: 22 20 66 72 6f 6d 0a 20 20 74 68 65 20 46 54 53  " from.  the FTS
9b70: 20 71 75 65 72 79 20 65 78 70 72 65 73 73 69 6f   query expressio
9b80: 6e 20 74 6f 20 77 6f 72 6b 20 77 69 74 68 2e 20  n to work with. 
9b90: 54 68 65 20 73 65 74 20 6f 66 20 6d 61 74 63 68  The set of match
9ba0: 61 62 6c 65 20 70 68 72 61 73 65 73 20 66 6f 72  able phrases for
9bb0: 0a 20 20 61 20 67 69 76 65 6e 20 71 75 65 72 79  .  a given query
9bc0: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 6c 6c   consists of all
9bd0: 20 70 68 72 61 73 65 73 20 28 69 6e 63 6c 75 64   phrases (includ
9be0: 69 6e 67 20 75 6e 71 75 6f 74 65 64 20 74 6f 6b  ing unquoted tok
9bf0: 65 6e 73 20 61 6e 64 0a 20 20 74 6f 6b 65 6e 20  ens and.  token 
9c00: 70 72 65 66 69 78 65 73 29 20 69 6e 20 74 68 65  prefixes) in the
9c10: 20 65 78 70 72 65 73 73 69 6f 6e 20 65 78 63 65   expression exce
9c20: 70 74 20 74 68 6f 73 65 20 74 68 61 74 20 61 72  pt those that ar
9c30: 65 20 70 72 65 66 69 78 65 64 20 77 69 74 68 0a  e prefixed with.
9c40: 20 20 61 20 75 6e 61 72 79 20 22 2d 22 20 6f 70    a unary "-" op
9c50: 65 72 61 74 6f 72 20 28 73 74 61 6e 64 61 72 64  erator (standard
9c60: 20 73 79 6e 74 61 78 29 20 6f 72 20 61 72 65 20   syntax) or are 
9c70: 70 61 72 74 20 6f 66 20 61 20 73 75 62 2d 65 78  part of a sub-ex
9c80: 70 72 65 73 73 69 6f 6e 20 0a 20 20 74 68 61 74  pression .  that
9c90: 20 69 73 20 75 73 65 64 20 61 73 20 74 68 65 20   is used as the 
9ca0: 72 69 67 68 74 2d 68 61 6e 64 20 6f 70 65 72 61  right-hand opera
9cb0: 6e 64 20 6f 66 20 61 20 4e 4f 54 20 6f 70 65 72  nd of a NOT oper
9cc0: 61 74 6f 72 2e 0a 0a 3c 70 3e 0a 20 20 57 69 74  ator...<p>.  Wit
9cd0: 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  h the following 
9ce0: 70 72 6f 76 69 73 6f 73 2c 20 65 61 63 68 20 73  provisos, each s
9cf0: 65 72 69 65 73 20 6f 66 20 74 6f 6b 65 6e 73 20  eries of tokens 
9d00: 69 6e 20 74 68 65 20 46 54 53 20 74 61 62 6c 65  in the FTS table
9d10: 20 74 68 61 74 0a 20 20 6d 61 74 63 68 65 73 20   that.  matches 
9d20: 6f 6e 65 20 6f 66 20 74 68 65 20 6d 61 74 63 68  one of the match
9d30: 61 62 6c 65 20 70 68 72 61 73 65 73 20 69 6e 20  able phrases in 
9d40: 74 68 65 20 71 75 65 72 79 20 65 78 70 72 65 73  the query expres
9d50: 73 69 6f 6e 20 69 73 20 6b 6e 6f 77 6e 20 61 73  sion is known as
9d60: 20 61 0a 20 20 22 70 68 72 61 73 65 20 6d 61 74   a.  "phrase mat
9d70: 63 68 22 3a 0a 0a 3c 6f 6c 3e 0a 20 20 3c 6c 69  ch":..<ol>.  <li
9d80: 3e 20 49 66 20 61 20 6d 61 74 63 68 61 62 6c 65  > If a matchable
9d90: 20 70 68 72 61 73 65 20 69 73 20 70 61 72 74 20   phrase is part 
9da0: 6f 66 20 61 20 73 65 72 69 65 73 20 6f 66 20 70  of a series of p
9db0: 68 72 61 73 65 73 20 63 6f 6e 6e 65 63 74 65 64  hrases connected
9dc0: 20 62 79 0a 20 20 20 20 20 20 20 4e 45 41 52 20   by.       NEAR 
9dd0: 6f 70 65 72 61 74 6f 72 73 20 69 6e 20 74 68 65  operators in the
9de0: 20 46 54 53 20 71 75 65 72 79 20 65 78 70 72 65   FTS query expre
9df0: 73 73 69 6f 6e 2c 20 74 68 65 6e 20 65 61 63 68  ssion, then each
9e00: 20 70 68 72 61 73 65 20 6d 61 74 63 68 0a 20 20   phrase match.  
9e10: 20 20 20 20 20 6d 75 73 74 20 62 65 20 73 75 66       must be suf
9e20: 66 69 63 69 65 6e 74 6c 79 20 63 6c 6f 73 65 20  ficiently close 
9e30: 74 6f 20 6f 74 68 65 72 20 70 68 72 61 73 65 20  to other phrase 
9e40: 6d 61 74 63 68 65 73 20 6f 66 20 74 68 65 20 72  matches of the r
9e50: 65 6c 65 76 61 6e 74 0a 20 20 20 20 20 20 20 74  elevant.       t
9e60: 79 70 65 73 20 74 6f 20 73 61 74 69 73 66 79 20  ypes to satisfy 
9e70: 74 68 65 20 4e 45 41 52 20 63 6f 6e 64 69 74 69  the NEAR conditi
9e80: 6f 6e 2e 0a 0a 20 20 3c 6c 69 3e 20 49 66 20 74  on...  <li> If t
9e90: 68 65 20 6d 61 74 63 68 61 62 6c 65 20 70 68 72  he matchable phr
9ea0: 61 73 65 20 69 6e 20 74 68 65 20 46 54 53 20 71  ase in the FTS q
9eb0: 75 65 72 79 20 69 73 20 72 65 73 74 72 69 63 74  uery is restrict
9ec0: 65 64 20 74 6f 20 6d 61 74 63 68 69 6e 67 0a 20  ed to matching. 
9ed0: 20 20 20 20 20 20 64 61 74 61 20 69 6e 20 61 20        data in a 
9ee0: 73 70 65 63 69 66 69 65 64 20 46 54 53 20 74 61  specified FTS ta
9ef0: 62 6c 65 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e  ble column, then
9f00: 20 6f 6e 6c 79 20 70 68 72 61 73 65 20 6d 61 74   only phrase mat
9f10: 63 68 65 73 20 74 68 61 74 20 0a 20 20 20 20 20  ches that .     
9f20: 20 20 6f 63 63 75 72 20 77 69 74 68 69 6e 20 74    occur within t
9f30: 68 61 74 20 63 6f 6c 75 6d 6e 20 61 72 65 20 63  hat column are c
9f40: 6f 6e 73 69 64 65 72 65 64 2e 0a 3c 2f 6f 6c 3e  onsidered..</ol>
9f50: 0a 20 0a 3c 74 63 6c 3e 68 64 5f 66 72 61 67 6d  . .<tcl>hd_fragm
9f60: 65 6e 74 20 6f 66 66 73 65 74 73 20 6f 66 66 73  ent offsets offs
9f70: 65 74 73 3c 2f 74 63 6c 3e 0a 3c 68 32 3e 54 68  ets</tcl>.<h2>Th
9f80: 65 20 4f 66 66 73 65 74 73 20 46 75 6e 63 74 69  e Offsets Functi
9f90: 6f 6e 3c 2f 68 32 3e 0a 0a 3c 70 3e 0a 20 20 46  on</h2>..<p>.  F
9fa0: 6f 72 20 61 20 53 45 4c 45 43 54 20 71 75 65 72  or a SELECT quer
9fb0: 79 20 74 68 61 74 20 75 73 65 73 20 74 68 65 20  y that uses the 
9fc0: 66 75 6c 6c 2d 74 65 78 74 20 69 6e 64 65 78 2c  full-text index,
9fd0: 20 74 68 65 20 6f 66 66 73 65 74 73 28 29 20 66   the offsets() f
9fe0: 75 6e 63 74 69 6f 6e 20 0a 20 20 72 65 74 75 72  unction .  retur
9ff0: 6e 73 20 61 20 74 65 78 74 20 76 61 6c 75 65 20  ns a text value 
a000: 63 6f 6e 74 61 69 6e 69 6e 67 20 61 20 73 65 72  containing a ser
a010: 69 65 73 20 6f 66 20 73 70 61 63 65 2d 73 65 70  ies of space-sep
a020: 61 72 61 74 65 64 20 69 6e 74 65 67 65 72 73 2e  arated integers.
a030: 20 46 6f 72 0a 20 20 65 61 63 68 20 74 65 72 6d   For.  each term
a040: 20 69 6e 20 65 61 63 68 20 3c 61 20 68 72 65 66   in each <a href
a050: 3d 23 6d 61 74 63 68 61 62 6c 65 3e 70 68 72 61  =#matchable>phra
a060: 73 65 20 6d 61 74 63 68 3c 2f 61 3e 20 6f 66 20  se match</a> of 
a070: 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 2c  the current row,
a080: 20 0a 20 20 74 68 65 72 65 20 61 72 65 20 66 6f   .  there are fo
a090: 75 72 20 69 6e 74 65 67 65 72 73 20 69 6e 20 74  ur integers in t
a0a0: 68 65 20 72 65 74 75 72 6e 65 64 20 6c 69 73 74  he returned list
a0b0: 2e 20 45 61 63 68 20 73 65 74 20 6f 66 20 66 6f  . Each set of fo
a0c0: 75 72 20 69 6e 74 65 67 65 72 73 20 69 73 20 0a  ur integers is .
a0d0: 20 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73    interpreted as
a0e0: 20 66 6f 6c 6c 6f 77 73 3a 0a 0a 3c 74 61 62 6c   follows:..<tabl
a0f0: 65 20 73 74 72 69 70 65 64 3d 31 3e 0a 20 20 3c  e striped=1>.  <
a100: 74 72 3e 3c 74 68 3e 49 6e 74 65 67 65 72 20 3c  tr><th>Integer <
a110: 74 68 3e 49 6e 74 65 72 70 72 65 74 61 74 69 6f  th>Interpretatio
a120: 6e 0a 20 20 3c 74 72 3e 3c 74 64 3e 30 20 0a 20  n.  <tr><td>0 . 
a130: 20 20 20 20 20 3c 74 64 3e 54 68 65 20 63 6f 6c       <td>The col
a140: 75 6d 6e 20 6e 75 6d 62 65 72 20 74 68 61 74 20  umn number that 
a150: 74 68 65 20 74 65 72 6d 20 69 6e 73 74 61 6e 63  the term instanc
a160: 65 20 6f 63 63 75 72 73 20 69 6e 20 28 30 20 66  e occurs in (0 f
a170: 6f 72 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  or the.         
a180: 20 6c 65 66 74 6d 6f 73 74 20 63 6f 6c 75 6d 6e   leftmost column
a190: 20 6f 66 20 74 68 65 20 46 54 53 20 74 61 62 6c   of the FTS tabl
a1a0: 65 2c 20 31 20 66 6f 72 20 74 68 65 20 6e 65 78  e, 1 for the nex
a1b0: 74 20 6c 65 66 74 6d 6f 73 74 2c 20 65 74 63 2e  t leftmost, etc.
a1c0: 29 2e 0a 20 20 3c 74 72 3e 3c 74 64 3e 31 0a 20  )..  <tr><td>1. 
a1d0: 20 20 20 20 20 3c 74 64 3e 54 68 65 20 74 65 72       <td>The ter
a1e0: 6d 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  m number of the 
a1f0: 6d 61 74 63 68 69 6e 67 20 74 65 72 6d 20 77 69  matching term wi
a200: 74 68 69 6e 20 74 68 65 20 66 75 6c 6c 2d 74 65  thin the full-te
a210: 78 74 20 71 75 65 72 79 0a 20 20 20 20 20 20 20  xt query.       
a220: 20 20 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 54     expression. T
a230: 65 72 6d 73 20 77 69 74 68 69 6e 20 61 20 71 75  erms within a qu
a240: 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20 61  ery expression a
a250: 72 65 20 6e 75 6d 62 65 72 65 64 20 73 74 61 72  re numbered star
a260: 74 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20 66  ting.          f
a270: 72 6f 6d 20 30 20 69 6e 20 74 68 65 20 6f 72 64  rom 0 in the ord
a280: 65 72 20 74 68 61 74 20 74 68 65 79 20 6f 63 63  er that they occ
a290: 75 72 2e 0a 20 20 3c 74 72 3e 3c 74 64 3e 32 0a  ur..  <tr><td>2.
a2a0: 20 20 20 20 20 20 3c 74 64 3e 54 68 65 20 62 79        <td>The by
a2b0: 74 65 20 6f 66 66 73 65 74 20 6f 66 20 74 68 65  te offset of the
a2c0: 20 6d 61 74 63 68 69 6e 67 20 74 65 72 6d 20 77   matching term w
a2d0: 69 74 68 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e  ithin the column
a2e0: 2e 0a 20 20 3c 74 72 3e 3c 74 64 3e 33 0a 20 20  ..  <tr><td>3.  
a2f0: 20 20 20 20 3c 74 64 3e 54 68 65 20 73 69 7a 65      <td>The size
a300: 20 6f 66 20 74 68 65 20 6d 61 74 63 68 69 6e 67   of the matching
a310: 20 74 65 72 6d 20 69 6e 20 62 79 74 65 73 2e 0a   term in bytes..
a320: 3c 2f 74 61 62 6c 65 3e 0a 0a 3c 70 3e 0a 20 20  </table>..<p>.  
a330: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c  The following bl
a340: 6f 63 6b 20 63 6f 6e 74 61 69 6e 73 20 65 78 61  ock contains exa
a350: 6d 70 6c 65 73 20 74 68 61 74 20 75 73 65 20 74  mples that use t
a360: 68 65 20 6f 66 66 73 65 74 73 20 66 75 6e 63 74  he offsets funct
a370: 69 6f 6e 2e 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b  ion...<codeblock
a380: 3e 0a 20 20 43 52 45 41 54 45 20 56 49 52 54 55  >.  CREATE VIRTU
a390: 41 4c 20 54 41 42 4c 45 20 6d 61 69 6c 20 55 53  AL TABLE mail US
a3a0: 49 4e 47 20 66 74 73 33 28 73 75 62 6a 65 63 74  ING fts3(subject
a3b0: 2c 20 62 6f 64 79 29 3b 0a 20 20 49 4e 53 45 52  , body);.  INSER
a3c0: 54 20 49 4e 54 4f 20 6d 61 69 6c 20 56 41 4c 55  T INTO mail VALU
a3d0: 45 53 28 27 68 65 6c 6c 6f 20 77 6f 72 6c 64 27  ES('hello world'
a3e0: 2c 20 27 54 68 69 73 20 6d 65 73 73 61 67 65 20  , 'This message 
a3f0: 69 73 20 61 20 68 65 6c 6c 6f 20 77 6f 72 6c 64  is a hello world
a400: 20 6d 65 73 73 61 67 65 2e 27 29 3b 0a 20 20 49   message.');.  I
a410: 4e 53 45 52 54 20 49 4e 54 4f 20 6d 61 69 6c 20  NSERT INTO mail 
a420: 56 41 4c 55 45 53 28 27 75 72 67 65 6e 74 3a 20  VALUES('urgent: 
a430: 73 65 72 69 6f 75 73 27 2c 20 27 54 68 69 73 20  serious', 'This 
a440: 6d 61 69 6c 20 69 73 20 73 65 65 6e 20 61 73 20  mail is seen as 
a450: 61 20 6d 6f 72 65 20 73 65 72 69 6f 75 73 20 6d  a more serious m
a460: 61 69 6c 27 29 3b 0a 0a 20 20 3c 69 3e 2d 2d 20  ail');..  <i>-- 
a470: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 71 75  The following qu
a480: 65 72 79 20 72 65 74 75 72 6e 73 20 61 20 73 69  ery returns a si
a490: 6e 67 6c 65 20 72 6f 77 20 28 61 73 20 69 74 20  ngle row (as it 
a4a0: 6d 61 74 63 68 65 73 20 6f 6e 6c 79 20 74 68 65  matches only the
a4b0: 20 66 69 72 73 74 3c 2f 69 3e 0a 20 20 3c 69 3e   first</i>.  <i>
a4c0: 2d 2d 20 65 6e 74 72 79 20 69 6e 20 74 61 62 6c  -- entry in tabl
a4d0: 65 20 22 6d 61 69 6c 22 2e 20 54 68 65 20 74 65  e "mail". The te
a4e0: 78 74 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  xt returned by t
a4f0: 68 65 20 6f 66 66 73 65 74 73 20 66 75 6e 63 74  he offsets funct
a500: 69 6f 6e 20 69 73 3c 2f 69 3e 0a 20 20 3c 69 3e  ion is</i>.  <i>
a510: 2d 2d 20 22 30 20 30 20 36 20 35 20 31 20 30 20  -- "0 0 6 5 1 0 
a520: 32 34 20 35 22 2e 3c 2f 69 3e 0a 20 20 3c 69 3e  24 5".</i>.  <i>
a530: 2d 2d 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 54  --</i>.  <i>-- T
a540: 68 65 20 66 69 72 73 74 20 73 65 74 20 6f 66 20  he first set of 
a550: 66 6f 75 72 20 69 6e 74 65 67 65 72 73 20 69 6e  four integers in
a560: 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e 64 69   the result indi
a570: 63 61 74 65 20 74 68 61 74 20 63 6f 6c 75 6d 6e  cate that column
a580: 20 30 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 63   0</i>.  <i>-- c
a590: 6f 6e 74 61 69 6e 73 20 61 6e 20 69 6e 73 74 61  ontains an insta
a5a0: 6e 63 65 20 6f 66 20 74 65 72 6d 20 30 20 28 22  nce of term 0 ("
a5b0: 77 6f 72 6c 64 22 29 20 61 74 20 62 79 74 65 20  world") at byte 
a5c0: 6f 66 66 73 65 74 20 36 2e 20 54 68 65 20 74 65  offset 6. The te
a5d0: 72 6d 20 69 6e 73 74 61 6e 63 65 3c 2f 69 3e 0a  rm instance</i>.
a5e0: 20 20 3c 69 3e 2d 2d 20 69 73 20 35 20 62 79 74    <i>-- is 5 byt
a5f0: 65 73 20 69 6e 20 73 69 7a 65 2e 20 54 68 65 20  es in size. The 
a600: 73 65 63 6f 6e 64 20 73 65 74 20 6f 66 20 66 6f  second set of fo
a610: 75 72 20 69 6e 74 65 67 65 72 73 20 73 68 6f 77  ur integers show
a620: 73 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 31 3c  s that column 1<
a630: 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 6f 66 20 74  /i>.  <i>-- of t
a640: 68 65 20 6d 61 74 63 68 65 64 20 72 6f 77 20 63  he matched row c
a650: 6f 6e 74 61 69 6e 73 20 61 6e 20 69 6e 73 74 61  ontains an insta
a660: 6e 63 65 20 6f 66 20 74 65 72 6d 20 30 20 28 22  nce of term 0 ("
a670: 77 6f 72 6c 64 22 29 20 61 74 20 62 79 74 65 20  world") at byte 
a680: 6f 66 66 73 65 74 3c 2f 69 3e 0a 20 20 3c 69 3e  offset</i>.  <i>
a690: 2d 2d 20 32 34 2e 20 41 67 61 69 6e 2c 20 74 68  -- 24. Again, th
a6a0: 65 20 74 65 72 6d 20 69 6e 73 74 61 6e 63 65 20  e term instance 
a6b0: 69 73 20 35 20 62 79 74 65 73 20 69 6e 20 73 69  is 5 bytes in si
a6c0: 7a 65 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54  ze.</i>.  SELECT
a6d0: 20 6f 66 66 73 65 74 73 28 6d 61 69 6c 29 20 46   offsets(mail) F
a6e0: 52 4f 4d 20 6d 61 69 6c 20 57 48 45 52 45 20 6d  ROM mail WHERE m
a6f0: 61 69 6c 20 4d 41 54 43 48 20 27 77 6f 72 6c 64  ail MATCH 'world
a700: 27 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 54 68 65 20  ';..  <i>-- The 
a710: 66 6f 6c 6c 6f 77 69 6e 67 20 71 75 65 72 79 20  following query 
a720: 72 65 74 75 72 6e 73 20 61 6c 73 6f 20 6d 61 74  returns also mat
a730: 63 68 65 73 20 6f 6e 6c 79 20 74 68 65 20 66 69  ches only the fi
a740: 72 73 74 20 72 6f 77 20 69 6e 20 74 61 62 6c 65  rst row in table
a750: 20 22 6d 61 69 6c 22 2e 3c 2f 69 3e 0a 20 20 3c   "mail".</i>.  <
a760: 69 3e 2d 2d 20 49 6e 20 74 68 69 73 20 63 61 73  i>-- In this cas
a770: 65 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 74  e the returned t
a780: 65 78 74 20 69 73 20 22 31 20 30 20 35 20 37 20  ext is "1 0 5 7 
a790: 31 20 30 20 33 30 20 37 22 2e 3c 2f 69 3e 0a 20  1 0 30 7".</i>. 
a7a0: 20 53 45 4c 45 43 54 20 6f 66 66 73 65 74 73 28   SELECT offsets(
a7b0: 6d 61 69 6c 29 20 46 52 4f 4d 20 6d 61 69 6c 20  mail) FROM mail 
a7c0: 57 48 45 52 45 20 6d 61 69 6c 20 4d 41 54 43 48  WHERE mail MATCH
a7d0: 20 27 6d 65 73 73 61 67 65 27 3b 0a 0a 20 20 3c   'message';..  <
a7e0: 69 3e 2d 2d 20 54 68 65 20 66 6f 6c 6c 6f 77 69  i>-- The followi
a7f0: 6e 67 20 71 75 65 72 79 20 6d 61 74 63 68 65 73  ng query matches
a800: 20 74 68 65 20 73 65 63 6f 6e 64 20 72 6f 77 20   the second row 
a810: 69 6e 20 74 61 62 6c 65 20 22 6d 61 69 6c 22 2e  in table "mail".
a820: 20 49 74 20 72 65 74 75 72 6e 73 20 74 68 65 3c   It returns the<
a830: 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 74 65 78 74  /i>.  <i>-- text
a840: 20 22 31 20 30 20 32 38 20 37 20 31 20 31 20 33   "1 0 28 7 1 1 3
a850: 36 20 34 22 2e 20 4f 6e 6c 79 20 74 68 6f 73 65  6 4". Only those
a860: 20 6f 63 63 75 72 72 65 6e 63 65 73 20 6f 66 20   occurrences of 
a870: 74 65 72 6d 73 20 22 73 65 72 69 6f 75 73 22 20  terms "serious" 
a880: 61 6e 64 20 22 6d 61 69 6c 22 3c 2f 69 3e 0a 20  and "mail"</i>. 
a890: 20 3c 69 3e 2d 2d 20 74 68 61 74 20 61 72 65 20   <i>-- that are 
a8a0: 70 61 72 74 20 6f 66 20 61 6e 20 69 6e 73 74 61  part of an insta
a8b0: 6e 63 65 20 6f 66 20 74 68 65 20 70 68 72 61 73  nce of the phras
a8c0: 65 20 22 73 65 72 69 6f 75 73 20 6d 61 69 6c 22  e "serious mail"
a8d0: 20 61 72 65 20 69 64 65 6e 74 69 66 69 65 64 3b   are identified;
a8e0: 20 74 68 65 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d   the</i>.  <i>--
a8f0: 20 6f 74 68 65 72 20 6f 63 63 75 72 72 65 6e 63   other occurrenc
a900: 65 73 20 6f 66 20 22 73 65 72 69 6f 75 73 22 20  es of "serious" 
a910: 61 6e 64 20 22 6d 61 69 6c 22 20 61 72 65 20 69  and "mail" are i
a920: 67 6e 6f 72 65 64 2e 3c 2f 69 3e 0a 20 20 53 45  gnored.</i>.  SE
a930: 4c 45 43 54 20 6f 66 66 73 65 74 73 28 6d 61 69  LECT offsets(mai
a940: 6c 29 20 46 52 4f 4d 20 6d 61 69 6c 20 57 48 45  l) FROM mail WHE
a950: 52 45 20 6d 61 69 6c 20 4d 41 54 43 48 20 27 22  RE mail MATCH '"
a960: 73 65 72 69 6f 75 73 20 6d 61 69 6c 22 27 3b 0a  serious mail"';.
a970: 3c 2f 63 6f 64 65 62 6c 6f 63 6b 3e 0a 0a 3c 74  </codeblock>..<t
a980: 63 6c 3e 68 64 5f 66 72 61 67 6d 65 6e 74 20 73  cl>hd_fragment s
a990: 6e 69 70 70 65 74 20 73 6e 69 70 70 65 74 3c 2f  nippet snippet</
a9a0: 74 63 6c 3e 0a 3c 68 32 3e 54 68 65 20 53 6e 69  tcl>.<h2>The Sni
a9b0: 70 70 65 74 20 46 75 6e 63 74 69 6f 6e 3c 2f 68  ppet Function</h
a9c0: 32 3e 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 73 6e  2>..<p>.  The sn
a9d0: 69 70 70 65 74 20 66 75 6e 63 74 69 6f 6e 20 69  ippet function i
a9e0: 73 20 75 73 65 64 20 74 6f 20 63 72 65 61 74 65  s used to create
a9f0: 20 66 6f 72 6d 61 74 74 65 64 20 66 72 61 67 6d   formatted fragm
aa00: 65 6e 74 73 20 6f 66 20 64 6f 63 75 6d 65 6e 74  ents of document
aa10: 20 74 65 78 74 0a 20 20 66 6f 72 20 64 69 73 70   text.  for disp
aa20: 6c 61 79 20 61 73 20 70 61 72 74 20 6f 66 20 61  lay as part of a
aa30: 20 66 75 6c 6c 2d 74 65 78 74 20 71 75 65 72 79   full-text query
aa40: 20 72 65 73 75 6c 74 73 20 72 65 70 6f 72 74 2e   results report.
aa50: 20 54 68 65 20 73 6e 69 70 70 65 74 20 66 75 6e   The snippet fun
aa60: 63 74 69 6f 6e 20 0a 20 20 6d 61 79 20 62 65 20  ction .  may be 
aa70: 70 61 73 73 65 64 20 62 65 74 77 65 65 6e 20 6f  passed between o
aa80: 6e 65 20 61 6e 64 20 73 69 78 20 61 72 67 75 6d  ne and six argum
aa90: 65 6e 74 73 2c 20 61 73 20 66 6f 6c 6c 6f 77 73  ents, as follows
aaa0: 3a 0a 0a 3c 74 61 62 6c 65 20 73 74 72 69 70 65  :..<table stripe
aab0: 64 3d 31 3e 0a 20 20 3c 74 72 3e 3c 74 68 3e 41  d=1>.  <tr><th>A
aac0: 72 67 75 6d 65 6e 74 20 3c 74 68 3e 44 65 66 61  rgument <th>Defa
aad0: 75 6c 74 20 56 61 6c 75 65 20 3c 74 68 3e 44 65  ult Value <th>De
aae0: 73 63 72 69 70 74 69 6f 6e 0a 20 20 3c 74 72 3e  scription.  <tr>
aaf0: 3c 74 64 3e 30 20 3c 74 64 3e 4e 2f 41 0a 20 20  <td>0 <td>N/A.  
ab00: 20 20 20 20 3c 74 64 3e 20 54 68 65 20 66 69 72      <td> The fir
ab10: 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  st argument to t
ab20: 68 65 20 73 6e 69 70 70 65 74 20 66 75 6e 63 74  he snippet funct
ab30: 69 6f 6e 20 6d 75 73 74 20 61 6c 77 61 79 73 20  ion must always 
ab40: 62 65 20 74 68 65 20 5b 46 54 53 20 68 69 64 64  be the [FTS hidd
ab50: 65 6e 20 63 6f 6c 75 6d 6e 5d 0a 20 20 20 20 20  en column].     
ab60: 20 20 20 20 20 20 6f 66 20 74 68 65 20 46 54 53        of the FTS
ab70: 20 74 61 62 6c 65 20 62 65 69 6e 67 20 71 75 65   table being que
ab80: 72 69 65 64 20 61 6e 64 20 66 72 6f 6d 20 77 68  ried and from wh
ab90: 69 63 68 20 74 68 65 20 73 6e 69 70 70 65 74 20  ich the snippet 
aba0: 69 73 20 74 6f 20 62 65 20 74 61 6b 65 6e 2e 20  is to be taken. 
abb0: 20 54 68 65 0a 20 20 20 20 20 20 20 20 20 20 20   The.           
abc0: 5b 46 54 53 20 68 69 64 64 65 6e 20 63 6f 6c 75  [FTS hidden colu
abd0: 6d 6e 5d 20 69 73 20 61 6e 20 61 75 74 6f 6d 61  mn] is an automa
abe0: 74 69 63 61 6c 6c 79 20 67 65 6e 65 72 61 74 65  tically generate
abf0: 64 20 63 6f 6c 75 6d 6e 20 77 69 74 68 20 74 68  d column with th
ac00: 65 20 73 61 6d 65 20 6e 61 6d 65 20 61 73 20 74  e same name as t
ac10: 68 65 0a 20 20 20 20 20 20 20 20 20 20 20 46 54  he.           FT
ac20: 53 20 74 61 62 6c 65 20 69 74 73 65 6c 66 2e 0a  S table itself..
ac30: 20 20 3c 74 72 3e 3c 74 64 3e 31 20 3c 74 64 3e    <tr><td>1 <td>
ac40: 22 26 6c 74 3b 62 26 67 74 3b 22 0a 20 20 20 20  "&lt;b&gt;".    
ac50: 20 20 3c 74 64 3e 20 54 68 65 20 22 73 74 61 72    <td> The "star
ac60: 74 20 6d 61 74 63 68 22 20 74 65 78 74 2e 0a 20  t match" text.. 
ac70: 20 3c 74 72 3e 3c 74 64 3e 32 20 3c 74 64 3e 22   <tr><td>2 <td>"
ac80: 26 6c 74 3b 2f 62 26 67 74 3b 22 0a 20 20 20 20  &lt;/b&gt;".    
ac90: 20 20 3c 74 64 3e 20 54 68 65 20 22 65 6e 64 20    <td> The "end 
aca0: 6d 61 74 63 68 22 20 74 65 78 74 2e 0a 20 20 3c  match" text..  <
acb0: 74 72 3e 3c 74 64 3e 33 20 3c 74 64 3e 22 26 6c  tr><td>3 <td>"&l
acc0: 74 3b 62 26 67 74 3b 2e 2e 2e 26 6c 74 3b 2f 62  t;b&gt;...&lt;/b
acd0: 26 67 74 3b 22 0a 20 20 20 20 20 20 3c 74 64 3e  &gt;".      <td>
ace0: 20 54 68 65 20 22 65 6c 6c 69 70 73 65 73 22 20   The "ellipses" 
acf0: 74 65 78 74 2e 0a 20 20 3c 74 72 3e 3c 74 64 3e  text..  <tr><td>
ad00: 34 20 3c 74 64 3e 2d 31 0a 20 20 20 20 20 20 3c  4 <td>-1.      <
ad10: 74 64 3e 20 54 68 65 20 46 54 53 20 74 61 62 6c  td> The FTS tabl
ad20: 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20  e column number 
ad30: 74 6f 20 65 78 74 72 61 63 74 20 74 68 65 20 72  to extract the r
ad40: 65 74 75 72 6e 65 64 20 66 72 61 67 6d 65 6e 74  eturned fragment
ad50: 73 20 6f 66 0a 20 20 20 20 20 20 20 20 20 20 20  s of.           
ad60: 74 65 78 74 20 66 72 6f 6d 2e 20 43 6f 6c 75 6d  text from. Colum
ad70: 6e 73 20 61 72 65 20 6e 75 6d 62 65 72 65 64 20  ns are numbered 
ad80: 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67  from left to rig
ad90: 68 74 20 73 74 61 72 74 69 6e 67 20 77 69 74 68  ht starting with
ada0: 0a 20 20 20 20 20 20 20 20 20 20 20 7a 65 72 6f  .           zero
adb0: 2e 20 41 20 6e 65 67 61 74 69 76 65 20 76 61 6c  . A negative val
adc0: 75 65 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  ue indicates tha
add0: 74 20 74 68 65 20 74 65 78 74 20 6d 61 79 20 62  t the text may b
ade0: 65 20 65 78 74 72 61 63 74 65 64 0a 20 20 20 20  e extracted.    
adf0: 20 20 20 20 20 20 20 66 72 6f 6d 20 61 6e 79 20         from any 
ae00: 63 6f 6c 75 6d 6e 2e 0a 20 20 3c 74 72 3e 3c 74  column..  <tr><t
ae10: 64 3e 35 20 3c 74 64 3e 2d 31 35 0a 20 20 20 20  d>5 <td>-15.    
ae20: 20 20 3c 74 64 3e 20 54 68 65 20 61 62 73 6f 6c    <td> The absol
ae30: 75 74 65 20 76 61 6c 75 65 20 6f 66 20 74 68 69  ute value of thi
ae40: 73 20 69 6e 74 65 67 65 72 20 61 72 67 75 6d 65  s integer argume
ae50: 6e 74 20 69 73 20 75 73 65 64 20 61 73 20 74 68  nt is used as th
ae60: 65 20 0a 20 20 20 20 20 20 20 20 20 20 20 28 61  e .           (a
ae70: 70 70 72 6f 78 69 6d 61 74 65 29 20 6e 75 6d 62  pproximate) numb
ae80: 65 72 20 6f 66 20 74 6f 6b 65 6e 73 20 74 6f 20  er of tokens to 
ae90: 69 6e 63 6c 75 64 65 20 69 6e 20 74 68 65 20 72  include in the r
aea0: 65 74 75 72 6e 65 64 20 74 65 78 74 20 0a 20 20  eturned text .  
aeb0: 20 20 20 20 20 20 20 20 20 76 61 6c 75 65 2e 20           value. 
aec0: 54 68 65 20 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f  The maximum allo
aed0: 77 61 62 6c 65 20 61 62 73 6f 6c 75 74 65 20 76  wable absolute v
aee0: 61 6c 75 65 20 69 73 20 36 34 2e 20 54 68 65 20  alue is 64. The 
aef0: 76 61 6c 75 65 20 6f 66 0a 20 20 20 20 20 20 20  value of.       
af00: 20 20 20 20 74 68 69 73 20 61 72 67 75 6d 65 6e      this argumen
af10: 74 20 69 73 20 72 65 66 65 72 72 65 64 20 74 6f  t is referred to
af20: 20 61 73 20 3c 69 3e 4e 3c 2f 69 3e 20 69 6e 20   as <i>N</i> in 
af30: 74 68 65 20 64 69 73 63 75 73 73 69 6f 6e 20 62  the discussion b
af40: 65 6c 6f 77 2e 0a 3c 2f 74 61 62 6c 65 3e 0a 0a  elow..</table>..
af50: 3c 70 3e 0a 20 20 54 68 65 20 73 6e 69 70 70 65  <p>.  The snippe
af60: 74 20 66 75 6e 63 74 69 6f 6e 20 66 69 72 73 74  t function first
af70: 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66 69 6e   attempts to fin
af80: 64 20 61 20 66 72 61 67 6d 65 6e 74 20 6f 66 20  d a fragment of 
af90: 74 65 78 74 20 63 6f 6e 73 69 73 74 69 6e 67 0a  text consisting.
afa0: 20 20 6f 66 20 3c 69 3e 7c 4e 7c 3c 2f 69 3e 20    of <i>|N|</i> 
afb0: 74 6f 6b 65 6e 73 20 77 69 74 68 69 6e 20 74 68  tokens within th
afc0: 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 74 68  e current row th
afd0: 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 74 20 6c  at contains at l
afe0: 65 61 73 74 20 6f 6e 65 20 70 68 72 61 73 65 20  east one phrase 
aff0: 0a 20 20 6d 61 74 63 68 20 66 6f 72 20 65 61 63  .  match for eac
b000: 68 20 6d 61 74 63 68 61 62 6c 65 20 70 68 72 61  h matchable phra
b010: 73 65 20 6d 61 74 63 68 65 64 20 73 6f 6d 65 77  se matched somew
b020: 68 65 72 65 20 69 6e 20 74 68 65 20 63 75 72 72  here in the curr
b030: 65 6e 74 20 72 6f 77 2c 20 0a 20 20 77 68 65 72  ent row, .  wher
b040: 65 20 3c 69 3e 7c 4e 7c 3c 2f 69 3e 20 69 73 20  e <i>|N|</i> is 
b050: 74 68 65 20 61 62 73 6f 6c 75 74 65 20 76 61 6c  the absolute val
b060: 75 65 20 6f 66 20 74 68 65 20 73 69 78 74 68 20  ue of the sixth 
b070: 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20  argument passed 
b080: 74 6f 20 74 68 65 0a 20 20 73 6e 69 70 70 65 74  to the.  snippet
b090: 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66 20 74 68   function. If th
b0a0: 65 20 74 65 78 74 20 73 74 6f 72 65 64 20 69 6e  e text stored in
b0b0: 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e   a single column
b0c0: 20 63 6f 6e 74 61 69 6e 73 20 6c 65 73 73 20 74   contains less t
b0d0: 68 61 6e 0a 20 20 3c 69 3e 7c 4e 7c 3c 2f 69 3e  han.  <i>|N|</i>
b0e0: 20 74 6f 6b 65 6e 73 2c 20 74 68 65 6e 20 74 68   tokens, then th
b0f0: 65 20 65 6e 74 69 72 65 20 63 6f 6c 75 6d 6e 20  e entire column 
b100: 76 61 6c 75 65 20 69 73 20 63 6f 6e 73 69 64 65  value is conside
b110: 72 65 64 2e 20 54 65 78 74 20 66 72 61 67 6d 65  red. Text fragme
b120: 6e 74 73 20 0a 20 20 6d 61 79 20 6e 6f 74 20 73  nts .  may not s
b130: 70 61 6e 20 6d 75 6c 74 69 70 6c 65 20 63 6f 6c  pan multiple col
b140: 75 6d 6e 73 2e 0a 0a 3c 70 3e 0a 20 20 49 66 20  umns...<p>.  If 
b150: 73 75 63 68 20 61 20 74 65 78 74 20 66 72 61 67  such a text frag
b160: 6d 65 6e 74 20 63 61 6e 20 62 65 20 66 6f 75 6e  ment can be foun
b170: 64 2c 20 69 74 20 69 73 20 72 65 74 75 72 6e 65  d, it is returne
b180: 64 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f  d with the follo
b190: 77 69 6e 67 0a 20 20 6d 6f 64 69 66 69 63 61 74  wing.  modificat
b1a0: 69 6f 6e 73 3a 0a 0a 3c 75 6c 3e 0a 20 20 3c 6c  ions:..<ul>.  <l
b1b0: 69 3e 20 49 66 20 74 68 65 20 74 65 78 74 20 66  i> If the text f
b1c0: 72 61 67 6d 65 6e 74 20 64 6f 65 73 20 6e 6f 74  ragment does not
b1d0: 20 62 65 67 69 6e 20 61 74 20 74 68 65 20 73 74   begin at the st
b1e0: 61 72 74 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20  art of a column 
b1f0: 76 61 6c 75 65 2c 0a 20 20 20 20 20 20 20 74 68  value,.       th
b200: 65 20 22 65 6c 6c 69 70 73 65 73 22 20 74 65 78  e "ellipses" tex
b210: 74 20 69 73 20 70 72 65 70 65 6e 64 65 64 20 74  t is prepended t
b220: 6f 20 69 74 2e 0a 20 20 3c 6c 69 3e 20 49 66 20  o it..  <li> If 
b230: 74 68 65 20 74 65 78 74 20 66 72 61 67 6d 65 6e  the text fragmen
b240: 74 20 64 6f 65 73 20 6e 6f 74 20 66 69 6e 69 73  t does not finis
b250: 68 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  h at the end of 
b260: 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c 0a  a column value,.
b270: 20 20 20 20 20 20 20 74 68 65 20 22 65 6c 6c 69         the "elli
b280: 70 73 65 73 22 20 74 65 78 74 20 69 73 20 61 70  pses" text is ap
b290: 70 65 6e 64 65 64 20 74 6f 20 69 74 2e 0a 20 20  pended to it..  
b2a0: 3c 6c 69 3e 20 46 6f 72 20 65 61 63 68 20 74 6f  <li> For each to
b2b0: 6b 65 6e 20 69 6e 20 74 68 65 20 74 65 78 74 20  ken in the text 
b2c0: 66 72 61 67 6d 65 6e 74 20 74 68 61 74 20 69 73  fragment that is
b2d0: 20 70 61 72 74 20 6f 66 20 61 20 70 68 72 61 73   part of a phras
b2e0: 65 20 6d 61 74 63 68 2c 0a 20 20 20 20 20 20 20  e match,.       
b2f0: 74 68 65 20 22 73 74 61 72 74 20 6d 61 74 63 68  the "start match
b300: 22 20 74 65 78 74 20 69 73 20 69 6e 73 65 72 74  " text is insert
b310: 65 64 20 69 6e 74 6f 20 74 68 65 20 66 72 61 67  ed into the frag
b320: 6d 65 6e 74 20 62 65 66 6f 72 65 20 74 68 65 20  ment before the 
b330: 74 6f 6b 65 6e 2c 0a 20 20 20 20 20 20 20 61 6e  token,.       an
b340: 64 20 74 68 65 20 22 65 6e 64 20 6d 61 74 63 68  d the "end match
b350: 22 20 74 65 78 74 20 69 73 20 69 6e 73 65 72 74  " text is insert
b360: 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61  ed immediately a
b370: 66 74 65 72 20 69 74 2e 0a 3c 2f 75 6c 3e 0a 0a  fter it..</ul>..
b380: 3c 70 3e 0a 20 20 49 66 20 6d 6f 72 65 20 74 68  <p>.  If more th
b390: 61 6e 20 6f 6e 65 20 73 75 63 68 20 66 72 61 67  an one such frag
b3a0: 6d 65 6e 74 20 63 61 6e 20 62 65 20 66 6f 75 6e  ment can be foun
b3b0: 64 2c 20 74 68 65 6e 20 66 72 61 67 6d 65 6e 74  d, then fragment
b3c0: 73 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 0a 20  s that contain. 
b3d0: 20 61 20 6c 61 72 67 65 72 20 6e 75 6d 62 65 72   a larger number
b3e0: 20 6f 66 20 22 65 78 74 72 61 22 20 70 68 72 61   of "extra" phra
b3f0: 73 65 20 6d 61 74 63 68 65 73 20 61 72 65 20 66  se matches are f
b400: 61 76 6f 72 65 64 2e 20 54 68 65 20 73 74 61 72  avored. The star
b410: 74 20 6f 66 0a 20 20 74 68 65 20 73 65 6c 65 63  t of.  the selec
b420: 74 65 64 20 74 65 78 74 20 66 72 61 67 6d 65 6e  ted text fragmen
b430: 74 20 6d 61 79 20 62 65 20 6d 6f 76 65 64 20 61  t may be moved a
b440: 20 66 65 77 20 74 6f 6b 65 6e 73 20 66 6f 72 77   few tokens forw
b450: 61 72 64 20 6f 72 20 62 61 63 6b 77 61 72 64 0a  ard or backward.
b460: 20 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f 20    to attempt to 
b470: 63 6f 6e 63 65 6e 74 72 61 74 65 20 74 68 65 20  concentrate the 
b480: 70 68 72 61 73 65 20 6d 61 74 63 68 65 73 20 74  phrase matches t
b490: 6f 77 61 72 64 20 74 68 65 20 63 65 6e 74 65 72  oward the center
b4a0: 20 6f 66 20 74 68 65 0a 20 20 66 72 61 67 6d 65   of the.  fragme
b4b0: 6e 74 2e 0a 0a 3c 70 3e 0a 20 20 41 73 73 75 6d  nt...<p>.  Assum
b4c0: 69 6e 67 20 3c 69 3e 4e 3c 2f 69 3e 20 69 73 20  ing <i>N</i> is 
b4d0: 61 20 70 6f 73 69 74 69 76 65 20 76 61 6c 75 65  a positive value
b4e0: 2c 20 69 66 20 6e 6f 20 66 72 61 67 6d 65 6e 74  , if no fragment
b4f0: 73 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 74  s can be found t
b500: 68 61 74 0a 20 20 63 6f 6e 74 61 69 6e 20 61 20  hat.  contain a 
b510: 70 68 72 61 73 65 20 6d 61 74 63 68 20 63 6f 72  phrase match cor
b520: 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 65 61  responding to ea
b530: 63 68 20 6d 61 74 63 68 61 62 6c 65 20 70 68 72  ch matchable phr
b540: 61 73 65 2c 20 74 68 65 20 73 6e 69 70 70 65 74  ase, the snippet
b550: 0a 20 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65  .  function atte
b560: 6d 70 74 73 20 74 6f 20 66 69 6e 64 20 74 77 6f  mpts to find two
b570: 20 66 72 61 67 6d 65 6e 74 73 20 6f 66 20 61 70   fragments of ap
b580: 70 72 6f 78 69 6d 61 74 65 6c 79 20 3c 69 3e 4e  proximately <i>N
b590: 3c 2f 69 3e 2f 32 20 74 6f 6b 65 6e 73 0a 20 20  </i>/2 tokens.  
b5a0: 74 68 61 74 20 62 65 74 77 65 65 6e 20 74 68 65  that between the
b5b0: 6d 20 63 6f 6e 74 61 69 6e 20 61 74 20 6c 65 61  m contain at lea
b5c0: 73 74 20 6f 6e 65 20 70 68 72 61 73 65 20 6d 61  st one phrase ma
b5d0: 74 63 68 20 66 6f 72 20 65 61 63 68 20 6d 61 74  tch for each mat
b5e0: 63 68 61 62 6c 65 20 70 68 72 61 73 65 0a 20 20  chable phrase.  
b5f0: 6d 61 74 63 68 65 64 20 62 79 20 74 68 65 20 63  matched by the c
b600: 75 72 72 65 6e 74 20 72 6f 77 2e 20 49 66 20 74  urrent row. If t
b610: 68 69 73 20 66 61 69 6c 73 2c 20 61 74 74 65 6d  his fails, attem
b620: 70 74 73 20 61 72 65 20 6d 61 64 65 20 74 6f 20  pts are made to 
b630: 66 69 6e 64 20 74 68 72 65 65 0a 20 20 66 72 61  find three.  fra
b640: 67 6d 65 6e 74 73 20 6f 66 20 3c 69 3e 4e 3c 2f  gments of <i>N</
b650: 69 3e 2f 33 20 74 6f 6b 65 6e 73 20 65 61 63 68  i>/3 tokens each
b660: 20 61 6e 64 20 66 69 6e 61 6c 6c 79 20 66 6f 75   and finally fou
b670: 72 20 3c 69 3e 4e 3c 2f 69 3e 2f 34 20 74 6f 6b  r <i>N</i>/4 tok
b680: 65 6e 0a 20 20 66 72 61 67 6d 65 6e 74 73 2e 20  en.  fragments. 
b690: 49 66 20 61 20 73 65 74 20 6f 66 20 66 6f 75 72  If a set of four
b6a0: 20 66 72 61 67 6d 65 6e 74 73 20 63 61 6e 6e 6f   fragments canno
b6b0: 74 20 62 65 20 66 6f 75 6e 64 20 74 68 61 74 20  t be found that 
b6c0: 65 6e 63 6f 6d 70 61 73 73 65 73 20 74 68 65 0a  encompasses the.
b6d0: 20 20 72 65 71 75 69 72 65 64 20 70 68 72 61 73    required phras
b6e0: 65 20 6d 61 74 63 68 65 73 2c 20 74 68 65 20 66  e matches, the f
b6f0: 6f 75 72 20 66 72 61 67 6d 65 6e 74 73 20 6f 66  our fragments of
b700: 20 3c 69 3e 4e 3c 2f 69 3e 2f 34 20 74 6f 6b 65   <i>N</i>/4 toke
b710: 6e 73 20 74 68 61 74 20 70 72 6f 76 69 64 65 0a  ns that provide.
b720: 20 20 74 68 65 20 62 65 73 74 20 63 6f 76 65 72    the best cover
b730: 61 67 65 20 61 72 65 20 73 65 6c 65 63 74 65 64  age are selected
b740: 2e 0a 0a 3c 70 3e 0a 20 20 49 66 20 3c 69 3e 4e  ...<p>.  If <i>N
b750: 3c 2f 69 3e 20 69 73 20 61 20 6e 65 67 61 74 69  </i> is a negati
b760: 76 65 20 76 61 6c 75 65 2c 20 61 6e 64 20 6e 6f  ve value, and no
b770: 20 73 69 6e 67 6c 65 20 66 72 61 67 6d 65 6e 74   single fragment
b780: 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 0a 20   can be found . 
b790: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
b7a0: 72 65 71 75 69 72 65 64 20 70 68 72 61 73 65 20  required phrase 
b7b0: 6d 61 74 63 68 65 73 2c 20 74 68 65 20 73 6e 69  matches, the sni
b7c0: 70 70 65 74 20 66 75 6e 63 74 69 6f 6e 20 73 65  ppet function se
b7d0: 61 72 63 68 65 73 0a 20 20 66 6f 72 20 74 77 6f  arches.  for two
b7e0: 20 66 72 61 67 6d 65 6e 74 73 20 6f 66 20 3c 69   fragments of <i
b7f0: 3e 7c 4e 7c 3c 2f 69 3e 20 74 6f 6b 65 6e 73 20  >|N|</i> tokens 
b800: 65 61 63 68 2c 20 74 68 65 6e 20 74 68 72 65 65  each, then three
b810: 2c 20 74 68 65 6e 20 66 6f 75 72 2e 20 49 6e 0a  , then four. In.
b820: 20 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69    other words, i
b830: 66 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  f the specified 
b840: 76 61 6c 75 65 20 6f 66 20 3c 69 3e 4e 3c 2f 69  value of <i>N</i
b850: 3e 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 74  > is negative, t
b860: 68 65 20 73 69 7a 65 73 0a 20 20 6f 66 20 74 68  he sizes.  of th
b870: 65 20 66 72 61 67 6d 65 6e 74 73 20 69 73 20 6e  e fragments is n
b880: 6f 74 20 64 65 63 72 65 61 73 65 64 20 69 66 20  ot decreased if 
b890: 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 66 72  more than one fr
b8a0: 61 67 6d 65 6e 74 20 69 73 20 72 65 71 75 69 72  agment is requir
b8b0: 65 64 0a 20 20 74 6f 20 70 72 6f 76 69 64 65 20  ed.  to provide 
b8c0: 74 68 65 20 64 65 73 69 72 65 64 20 70 68 72 61  the desired phra
b8d0: 73 65 20 6d 61 74 63 68 20 63 6f 76 65 72 61 67  se match coverag
b8e0: 65 2e 0a 0a 3c 70 3e 0a 20 20 41 66 74 65 72 20  e...<p>.  After 
b8f0: 74 68 65 20 3c 69 3e 4d 3c 2f 69 3e 20 66 72 61  the <i>M</i> fra
b900: 67 6d 65 6e 74 73 20 68 61 76 65 20 62 65 65 6e  gments have been
b910: 20 6c 6f 63 61 74 65 64 2c 20 77 68 65 72 65 20   located, where 
b920: 3c 69 3e 4d 3c 2f 69 3e 20 69 73 20 62 65 74 77  <i>M</i> is betw
b930: 65 65 6e 0a 20 20 74 77 6f 20 61 6e 64 20 66 6f  een.  two and fo
b940: 75 72 20 61 73 20 64 65 73 63 72 69 62 65 64 20  ur as described 
b950: 69 6e 20 74 68 65 20 70 61 72 61 67 72 61 70 68  in the paragraph
b960: 73 20 61 62 6f 76 65 2c 20 74 68 65 79 20 61 72  s above, they ar
b970: 65 20 6a 6f 69 6e 65 64 20 74 6f 67 65 74 68 65  e joined togethe
b980: 72 0a 20 20 69 6e 20 73 6f 72 74 65 64 20 6f 72  r.  in sorted or
b990: 64 65 72 20 77 69 74 68 20 74 68 65 20 22 65 6c  der with the "el
b9a0: 6c 69 70 73 65 73 22 20 74 65 78 74 20 73 65 70  lipses" text sep
b9b0: 61 72 61 74 69 6e 67 20 74 68 65 6d 2e 20 54 68  arating them. Th
b9c0: 65 20 74 68 72 65 65 20 0a 20 20 6d 6f 64 69 66  e three .  modif
b9d0: 69 63 61 74 69 6f 6e 73 20 65 6e 75 6d 65 72 61  ications enumera
b9e0: 74 65 64 20 65 61 72 6c 69 65 72 20 61 72 65 20  ted earlier are 
b9f0: 70 65 72 66 6f 72 6d 65 64 20 6f 6e 20 74 68 65  performed on the
ba00: 20 74 65 78 74 20 62 65 66 6f 72 65 20 69 74 20   text before it 
ba10: 69 73 20 0a 20 20 72 65 74 75 72 6e 65 64 2e 0a  is .  returned..
ba20: 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20 20 3c  .<codeblock>.  <
ba30: 62 3e 4e 6f 74 65 3a 20 49 6e 20 74 68 69 73 20  b>Note: In this 
ba40: 62 6c 6f 63 6b 20 6f 66 20 65 78 61 6d 70 6c 65  block of example
ba50: 73 2c 20 6e 65 77 6c 69 6e 65 73 20 61 6e 64 20  s, newlines and 
ba60: 77 68 69 74 65 73 70 61 63 65 20 63 68 61 72 61  whitespace chara
ba70: 63 74 65 72 73 20 68 61 76 65 0a 20 20 62 65 65  cters have.  bee
ba80: 6e 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20  n inserted into 
ba90: 74 68 65 20 64 6f 63 75 6d 65 6e 74 20 69 6e 73  the document ins
baa0: 65 72 74 65 64 20 69 6e 74 6f 20 74 68 65 20 46  erted into the F
bab0: 54 53 20 74 61 62 6c 65 2c 20 61 6e 64 20 74 68  TS table, and th
bac0: 65 20 65 78 70 65 63 74 65 64 0a 20 20 72 65 73  e expected.  res
bad0: 75 6c 74 73 20 64 65 73 63 72 69 62 65 64 20 69  ults described i
bae0: 6e 20 53 51 4c 20 63 6f 6d 6d 65 6e 74 73 2e 20  n SQL comments. 
baf0: 54 68 69 73 20 69 73 20 64 6f 6e 65 20 74 6f 20  This is done to 
bb00: 65 6e 68 61 6e 63 65 20 72 65 61 64 61 62 69 6c  enhance readabil
bb10: 69 74 79 20 6f 6e 6c 79 2c 0a 20 20 74 68 65 79  ity only,.  they
bb20: 20 77 6f 75 6c 64 20 6e 6f 74 20 62 65 20 70 72   would not be pr
bb30: 65 73 65 6e 74 20 69 6e 20 61 63 74 75 61 6c 20  esent in actual 
bb40: 53 51 4c 69 74 65 20 63 6f 6d 6d 61 6e 64 73 20  SQLite commands 
bb50: 6f 72 20 6f 75 74 70 75 74 2e 3c 2f 62 3e 0a 0a  or output.</b>..
bb60: 20 20 3c 69 3e 2d 2d 20 43 72 65 61 74 65 20 61    <i>-- Create a
bb70: 6e 64 20 70 6f 70 75 6c 61 74 65 20 61 6e 20 46  nd populate an F
bb80: 54 53 20 74 61 62 6c 65 2e 3c 2f 69 3e 0a 20 20  TS table.</i>.  
bb90: 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54  CREATE VIRTUAL T
bba0: 41 42 4c 45 20 74 65 78 74 20 55 53 49 4e 47 20  ABLE text USING 
bbb0: 66 74 73 34 28 29 3b 0a 20 20 49 4e 53 45 52 54  fts4();.  INSERT
bbc0: 20 49 4e 54 4f 20 74 65 78 74 20 56 41 4c 55 45   INTO text VALUE
bbd0: 53 28 27 0a 20 20 20 20 44 75 72 69 6e 67 20 33  S('.    During 3
bbe0: 30 20 4e 6f 76 2d 31 20 44 65 63 2c 20 32 2d 33  0 Nov-1 Dec, 2-3
bbf0: 6f 43 20 64 72 6f 70 73 2e 20 43 6f 6f 6c 20 69  oC drops. Cool i
bc00: 6e 20 74 68 65 20 75 70 70 65 72 20 70 6f 72 74  n the upper port
bc10: 69 6f 6e 2c 20 6d 69 6e 69 6d 75 6d 20 74 65 6d  ion, minimum tem
bc20: 70 65 72 61 74 75 72 65 20 31 34 2d 31 36 6f 43  perature 14-16oC
bc30: 20 0a 20 20 20 20 61 6e 64 20 63 6f 6f 6c 20 65   .    and cool e
bc40: 6c 73 65 77 68 65 72 65 2c 20 6d 69 6e 69 6d 75  lsewhere, minimu
bc50: 6d 20 74 65 6d 70 65 72 61 74 75 72 65 20 31 37  m temperature 17
bc60: 2d 32 30 6f 43 2e 20 43 6f 6c 64 20 74 6f 20 76  -20oC. Cold to v
bc70: 65 72 79 20 63 6f 6c 64 20 6f 6e 20 6d 6f 75 6e  ery cold on moun
bc80: 74 61 69 6e 74 6f 70 73 2c 20 0a 20 20 20 20 6d  taintops, .    m
bc90: 69 6e 69 6d 75 6d 20 74 65 6d 70 65 72 61 74 75  inimum temperatu
bca0: 72 65 20 36 2d 31 32 6f 43 2e 20 4e 6f 72 74 68  re 6-12oC. North
bcb0: 65 61 73 74 65 72 6c 79 20 77 69 6e 64 73 20 31  easterly winds 1
bcc0: 35 2d 33 30 20 6b 6d 2f 68 72 2e 20 41 66 74 65  5-30 km/hr. Afte
bcd0: 72 20 74 68 61 74 2c 20 74 65 6d 70 65 72 61 74  r that, temperat
bce0: 75 72 65 20 0a 20 20 20 20 69 6e 63 72 65 61 73  ure .    increas
bcf0: 65 73 2e 20 4e 6f 72 74 68 65 61 73 74 65 72 6c  es. Northeasterl
bd00: 79 20 77 69 6e 64 73 20 31 35 2d 33 30 20 6b 6d  y winds 15-30 km
bd10: 2f 68 72 2e 20 20 20 20 20 0a 20 20 27 29 3b 0a  /hr.     .  ');.
bd20: 0a 20 20 3c 69 3e 2d 2d 20 54 68 65 20 66 6f 6c  .  <i>-- The fol
bd30: 6c 6f 77 69 6e 67 20 71 75 65 72 79 20 72 65 74  lowing query ret
bd40: 75 72 6e 73 20 74 68 65 20 74 65 78 74 20 76 61  urns the text va
bd50: 6c 75 65 3a 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d  lue:</i>.  <i>--
bd60: 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 20 20 22  </i>.  <i>--   "
bd70: 26 6c 74 3b 62 26 67 74 3b 2e 2e 2e 26 6c 74 3b  &lt;b&gt;...&lt;
bd80: 2f 62 26 67 74 3b 63 6f 6f 6c 20 65 6c 73 65 77  /b&gt;cool elsew
bd90: 68 65 72 65 2c 20 6d 69 6e 69 6d 75 6d 20 74 65  here, minimum te
bda0: 6d 70 65 72 61 74 75 72 65 20 31 37 2d 32 30 6f  mperature 17-20o
bdb0: 43 2e 20 26 6c 74 3b 62 26 67 74 3b 43 6f 6c 64  C. &lt;b&gt;Cold
bdc0: 26 6c 74 3b 2f 62 26 67 74 3b 20 74 6f 20 76 65  &lt;/b&gt; to ve
bdd0: 72 79 20 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20  ry </i>.  <i>-- 
bde0: 20 20 20 26 6c 74 3b 62 26 67 74 3b 63 6f 6c 64     &lt;b&gt;cold
bdf0: 26 6c 74 3b 2f 62 26 67 74 3b 20 6f 6e 20 6d 6f  &lt;/b&gt; on mo
be00: 75 6e 74 61 69 6e 74 6f 70 73 2c 20 6d 69 6e 69  untaintops, mini
be10: 6d 75 6d 20 74 65 6d 70 65 72 61 74 75 72 65 20  mum temperature 
be20: 36 26 6c 74 3b 62 26 67 74 3b 2e 2e 2e 26 6c 74  6&lt;b&gt;...&lt
be30: 3b 2f 62 26 67 74 3b 22 2e 3c 2f 69 3e 0a 20 20  ;/b&gt;".</i>.  
be40: 3c 69 3e 2d 2d 3c 2f 69 3e 0a 20 20 53 45 4c 45  <i>--</i>.  SELE
be50: 43 54 20 73 6e 69 70 70 65 74 28 74 65 78 74 29  CT snippet(text)
be60: 20 46 52 4f 4d 20 74 65 78 74 20 57 48 45 52 45   FROM text WHERE
be70: 20 74 65 78 74 20 4d 41 54 43 48 20 27 63 6f 6c   text MATCH 'col
be80: 64 27 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 54 68 65  d';..  <i>-- The
be90: 20 66 6f 6c 6c 6f 77 69 6e 67 20 71 75 65 72 79   following query
bea0: 20 72 65 74 75 72 6e 73 20 74 68 65 20 74 65 78   returns the tex
beb0: 74 20 76 61 6c 75 65 3a 3c 2f 69 3e 0a 20 20 3c  t value:</i>.  <
bec0: 69 3e 2d 2d 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d  i>--</i>.  <i>--
bed0: 20 20 20 22 2e 2e 2e 74 68 65 20 75 70 70 65 72     "...the upper
bee0: 20 70 6f 72 74 69 6f 6e 2c 20 26 23 39 31 3b 6d   portion, &#91;m
bef0: 69 6e 69 6d 75 6d 26 23 39 33 3b 20 26 23 39 31  inimum&#93; &#91
bf00: 3b 74 65 6d 70 65 72 61 74 75 72 65 26 23 39 33  ;temperature&#93
bf10: 3b 20 31 34 2d 31 36 6f 43 20 61 6e 64 20 63 6f  ; 14-16oC and co
bf20: 6f 6c 20 65 6c 73 65 77 68 65 72 65 2c 3c 2f 69  ol elsewhere,</i
bf30: 3e 0a 20 20 3c 69 3e 2d 2d 20 20 20 20 26 23 39  >.  <i>--    &#9
bf40: 31 3b 6d 69 6e 69 6d 75 6d 26 23 39 33 3b 20 26  1;minimum&#93; &
bf50: 23 39 31 3b 74 65 6d 70 65 72 61 74 75 72 65 26  #91;temperature&
bf60: 23 39 33 3b 20 31 37 2d 32 30 6f 43 2e 20 43 6f  #93; 17-20oC. Co
bf70: 6c 64 2e 2e 2e 22 3c 2f 69 3e 0a 20 20 3c 69 3e  ld..."</i>.  <i>
bf80: 2d 2d 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20  --</i>.  SELECT 
bf90: 73 6e 69 70 70 65 74 28 74 65 78 74 2c 20 27 26  snippet(text, '&
bfa0: 23 39 31 3b 20 27 26 23 39 33 3b 27 2c 20 27 2e  #91; '&#93;', '.
bfb0: 2e 2e 27 29 20 46 52 4f 4d 20 74 65 78 74 20 57  ..') FROM text W
bfc0: 48 45 52 45 20 74 65 78 74 20 4d 41 54 43 48 20  HERE text MATCH 
bfd0: 27 22 6d 69 6e 2a 20 74 65 6d 2a 22 27 0a 3c 2f  '"min* tem*"'.</
bfe0: 63 6f 64 65 62 6c 6f 63 6b 3e 0a 0a 3c 68 32 20  codeblock>..<h2 
bff0: 69 64 3d 6d 61 74 63 68 69 6e 66 6f 20 74 61 67  id=matchinfo tag
c000: 73 3d 6d 61 74 63 68 69 6e 66 6f 3e 54 68 65 20  s=matchinfo>The 
c010: 4d 61 74 63 68 69 6e 66 6f 20 46 75 6e 63 74 69  Matchinfo Functi
c020: 6f 6e 3c 2f 68 32 3e 0a 0a 3c 70 3e 0a 20 20 54  on</h2>..<p>.  T
c030: 68 65 20 6d 61 74 63 68 69 6e 66 6f 20 66 75 6e  he matchinfo fun
c040: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 20  ction returns a 
c050: 62 6c 6f 62 20 76 61 6c 75 65 2e 20 49 66 20 69  blob value. If i
c060: 74 20 69 73 20 75 73 65 64 20 77 69 74 68 69 6e  t is used within
c070: 20 61 20 71 75 65 72 79 0a 20 20 74 68 61 74 20   a query.  that 
c080: 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 74 68 65  does not use the
c090: 20 66 75 6c 6c 2d 74 65 78 74 20 69 6e 64 65 78   full-text index
c0a0: 20 28 61 20 22 71 75 65 72 79 20 62 79 20 72 6f   (a "query by ro
c0b0: 77 69 64 22 20 6f 72 20 22 6c 69 6e 65 61 72 20  wid" or "linear 
c0c0: 73 63 61 6e 22 29 2c 0a 20 20 74 68 65 6e 20 74  scan"),.  then t
c0d0: 68 65 20 62 6c 6f 62 20 69 73 20 7a 65 72 6f 20  he blob is zero 
c0e0: 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20 4f  bytes in size. O
c0f0: 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 62 6c  therwise, the bl
c100: 6f 62 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 7a  ob consists of z
c110: 65 72 6f 0a 20 20 6f 72 20 6d 6f 72 65 20 33 32  ero.  or more 32
c120: 2d 62 69 74 20 75 6e 73 69 67 6e 65 64 20 69 6e  -bit unsigned in
c130: 74 65 67 65 72 73 20 69 6e 20 6d 61 63 68 69 6e  tegers in machin
c140: 65 20 62 79 74 65 2d 6f 72 64 65 72 2e 20 54 68  e byte-order. Th
c150: 65 20 65 78 61 63 74 20 6e 75 6d 62 65 72 0a 20  e exact number. 
c160: 20 6f 66 20 69 6e 74 65 67 65 72 73 20 69 6e 20   of integers in 
c170: 74 68 65 20 72 65 74 75 72 6e 65 64 20 61 72 72  the returned arr
c180: 61 79 20 64 65 70 65 6e 64 73 20 6f 6e 20 62 6f  ay depends on bo
c190: 74 68 20 74 68 65 20 71 75 65 72 79 20 61 6e 64  th the query and
c1a0: 20 74 68 65 20 76 61 6c 75 65 0a 20 20 6f 66 20   the value.  of 
c1b0: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
c1c0: 65 6e 74 20 28 69 66 20 61 6e 79 29 20 70 61 73  ent (if any) pas
c1d0: 73 65 64 20 74 6f 20 74 68 65 20 6d 61 74 63 68  sed to the match
c1e0: 69 6e 66 6f 20 66 75 6e 63 74 69 6f 6e 2e 0a 0a  info function...
c1f0: 3c 70 3e 0a 20 20 54 68 65 20 6d 61 74 63 68 69  <p>.  The matchi
c200: 6e 66 6f 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  nfo function is 
c210: 63 61 6c 6c 65 64 20 77 69 74 68 20 65 69 74 68  called with eith
c220: 65 72 20 6f 6e 65 20 6f 72 20 74 77 6f 20 61 72  er one or two ar
c230: 67 75 6d 65 6e 74 73 2e 20 41 73 20 66 6f 72 0a  guments. As for.
c240: 20 20 61 6c 6c 20 61 75 78 69 6c 69 61 72 79 20    all auxiliary 
c250: 66 75 6e 63 74 69 6f 6e 73 2c 20 74 68 65 20 66  functions, the f
c260: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 6d 75  irst argument mu
c270: 73 74 20 62 65 20 74 68 65 20 73 70 65 63 69 61  st be the specia
c280: 6c 20 0a 20 20 5b 46 54 53 20 68 69 64 64 65 6e  l .  [FTS hidden
c290: 20 63 6f 6c 75 6d 6e 5d 2e 20 54 68 65 20 73 65   column]. The se
c2a0: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 20 69  cond argument, i
c2b0: 66 20 69 74 20 69 73 20 73 70 65 63 69 66 69 65  f it is specifie
c2c0: 64 2c 20 6d 75 73 74 20 62 65 20 61 20 74 65 78  d, must be a tex
c2d0: 74 20 76 61 6c 75 65 0a 20 20 63 6f 6d 70 72 69  t value.  compri
c2e0: 73 65 64 20 6f 6e 6c 79 20 6f 66 20 74 68 65 20  sed only of the 
c2f0: 63 68 61 72 61 63 74 65 72 73 20 27 70 27 2c 20  characters 'p', 
c300: 27 63 27 2c 20 27 6e 27 2c 20 27 61 27 2c 20 27  'c', 'n', 'a', '
c310: 6c 27 2c 20 27 73 27 20 61 6e 64 20 27 78 27 2e  l', 's' and 'x'.
c320: 0a 20 20 49 66 20 6e 6f 20 73 65 63 6f 6e 64 20  .  If no second 
c330: 61 72 67 75 6d 65 6e 74 20 69 73 20 65 78 70 6c  argument is expl
c340: 69 63 69 74 6c 79 20 73 75 70 70 6c 69 65 64 2c  icitly supplied,
c350: 20 69 74 20 64 65 66 61 75 6c 74 73 20 74 6f 20   it defaults to 
c360: 22 70 63 78 22 2e 20 54 68 65 0a 20 20 73 65 63  "pcx". The.  sec
c370: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ond argument is 
c380: 72 65 66 65 72 72 65 64 20 74 6f 20 61 73 20 74  referred to as t
c390: 68 65 20 22 66 6f 72 6d 61 74 20 73 74 72 69 6e  he "format strin
c3a0: 67 22 20 62 65 6c 6f 77 2e 0a 0a 3c 70 3e 0a 20  g" below...<p>. 
c3b0: 20 43 68 61 72 61 63 74 65 72 73 20 69 6e 20 74   Characters in t
c3c0: 68 65 20 6d 61 74 63 68 69 6e 66 6f 20 66 6f 72  he matchinfo for
c3d0: 6d 61 74 20 73 74 72 69 6e 67 20 61 72 65 20 70  mat string are p
c3e0: 72 6f 63 65 73 73 65 64 20 66 72 6f 6d 20 6c 65  rocessed from le
c3f0: 66 74 20 74 6f 20 72 69 67 68 74 2e 20 0a 20 20  ft to right. .  
c400: 45 61 63 68 20 63 68 61 72 61 63 74 65 72 20 69  Each character i
c410: 6e 20 74 68 65 20 66 6f 72 6d 61 74 20 73 74 72  n the format str
c420: 69 6e 67 20 63 61 75 73 65 73 20 6f 6e 65 20 6f  ing causes one o
c430: 72 20 6d 6f 72 65 20 33 32 2d 62 69 74 20 75 6e  r more 32-bit un
c440: 73 69 67 6e 65 64 0a 20 20 69 6e 74 65 67 65 72  signed.  integer
c450: 20 76 61 6c 75 65 73 20 74 6f 20 62 65 20 61 64   values to be ad
c460: 64 65 64 20 74 6f 20 74 68 65 20 72 65 74 75 72  ded to the retur
c470: 6e 65 64 20 61 72 72 61 79 2e 20 54 68 65 20 22  ned array. The "
c480: 76 61 6c 75 65 73 22 20 63 6f 6c 75 6d 6e 20 69  values" column i
c490: 6e 0a 20 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  n.  the followin
c4a0: 67 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73  g table contains
c4b0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 69   the number of i
c4c0: 6e 74 65 67 65 72 20 76 61 6c 75 65 73 20 61 70  nteger values ap
c4d0: 70 65 6e 64 65 64 20 74 6f 20 74 68 65 0a 20 20  pended to the.  
c4e0: 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 66 6f  output buffer fo
c4f0: 72 20 65 61 63 68 20 73 75 70 70 6f 72 74 65 64  r each supported
c500: 20 66 6f 72 6d 61 74 20 73 74 72 69 6e 67 20 63   format string c
c510: 68 61 72 61 63 74 65 72 2e 20 49 6e 20 74 68 65  haracter. In the
c520: 20 66 6f 72 6d 75 6c 61 0a 20 20 67 69 76 65 6e   formula.  given
c530: 2c 20 3c 69 3e 63 6f 6c 73 3c 2f 69 3e 20 69 73  , <i>cols</i> is
c540: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
c550: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 46 54  olumns in the FT
c560: 53 20 74 61 62 6c 65 2c 20 61 6e 64 20 0a 20 20  S table, and .  
c570: 3c 69 3e 70 68 72 61 73 65 73 3c 2f 69 3e 20 69  <i>phrases</i> i
c580: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
c590: 3c 61 20 68 72 65 66 3d 23 6d 61 74 63 68 61 62  <a href=#matchab
c5a0: 6c 65 3e 6d 61 74 63 68 61 62 6c 65 20 70 68 72  le>matchable phr
c5b0: 61 73 65 73 3c 2f 61 3e 20 69 6e 20 0a 20 20 74  ases</a> in .  t
c5c0: 68 65 20 71 75 65 72 79 2e 20 0a 0a 3c 74 61 62  he query. ..<tab
c5d0: 6c 65 20 73 74 72 69 70 65 64 3d 31 3e 0a 20 20  le striped=1>.  
c5e0: 3c 74 72 3e 3c 74 68 3e 43 68 61 72 61 63 74 65  <tr><th>Characte
c5f0: 72 3c 74 68 3e 56 61 6c 75 65 73 3c 74 68 3e 44  r<th>Values<th>D
c600: 65 73 63 72 69 70 74 69 6f 6e 0a 20 20 3c 74 72  escription.  <tr
c610: 3e 3c 74 64 3e 70 20 3c 74 64 3e 31 20 3c 74 64  ><td>p <td>1 <td
c620: 3e 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d  >The number of m
c630: 61 74 63 68 61 62 6c 65 20 70 68 72 61 73 65 73  atchable phrases
c640: 20 69 6e 20 74 68 65 20 71 75 65 72 79 2e 0a 20   in the query.. 
c650: 20 3c 74 72 3e 3c 74 64 3e 63 20 3c 74 64 3e 31   <tr><td>c <td>1
c660: 20 3c 74 64 3e 54 68 65 20 6e 75 6d 62 65 72 20   <td>The number 
c670: 6f 66 20 75 73 65 72 20 64 65 66 69 6e 65 64 20  of user defined 
c680: 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 46  columns in the F
c690: 54 53 0a 20 20 20 20 74 61 62 6c 65 20 28 69 2e  TS.    table (i.
c6a0: 65 2e 20 6e 6f 74 20 69 6e 63 6c 75 64 69 6e 67  e. not including
c6b0: 20 74 68 65 20 64 6f 63 69 64 20 6f 72 20 74 68   the docid or th
c6c0: 65 20 5b 46 54 53 20 68 69 64 64 65 6e 20 63 6f  e [FTS hidden co
c6d0: 6c 75 6d 6e 5d 29 2e 0a 20 20 3c 74 72 3e 3c 74  lumn])..  <tr><t
c6e0: 64 3e 78 20 3c 74 64 20 73 74 79 6c 65 3d 22 77  d>x <td style="w
c6f0: 68 69 74 65 2d 73 70 61 63 65 3a 6e 6f 77 72 61  hite-space:nowra
c700: 70 22 3e 33 20 2a 20 3c 69 3e 63 6f 6c 73 3c 2f  p">3 * <i>cols</
c710: 69 3e 20 2a 20 3c 69 3e 70 68 72 61 73 65 73 3c  i> * <i>phrases<
c720: 2f 69 3e 20 0a 20 20 20 20 3c 74 64 3e 0a 20 20  /i> .    <td>.  
c730: 20 20 20 20 46 6f 72 20 65 61 63 68 20 64 69 73      For each dis
c740: 74 69 6e 63 74 20 63 6f 6d 62 69 6e 61 74 69 6f  tinct combinatio
c750: 6e 20 6f 66 20 61 20 70 68 72 61 73 65 20 61 6e  n of a phrase an
c760: 64 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 2c 20  d table column, 
c770: 74 68 65 0a 20 20 20 20 20 20 66 6f 6c 6c 6f 77  the.      follow
c780: 69 6e 67 20 74 68 72 65 65 20 76 61 6c 75 65 73  ing three values
c790: 3a 0a 20 20 20 20 20 20 3c 75 6c 3e 0a 20 20 20  :.      <ul>.   
c7a0: 20 20 20 20 20 3c 6c 69 3e 20 49 6e 20 74 68 65       <li> In the
c7b0: 20 63 75 72 72 65 6e 74 20 72 6f 77 2c 20 74 68   current row, th
c7c0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 69 6d 65  e number of time
c7d0: 73 20 74 68 65 20 70 68 72 61 73 65 20 61 70 70  s the phrase app
c7e0: 65 61 72 73 20 69 6e 20 0a 20 20 20 20 20 20 20  ears in .       
c7f0: 20 20 20 20 20 20 74 68 65 20 63 6f 6c 75 6d 6e        the column
c800: 2e 0a 20 20 20 20 20 20 20 20 3c 6c 69 3e 20 54  ..        <li> T
c810: 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
c820: 6f 66 20 74 69 6d 65 73 20 74 68 65 20 70 68 72  of times the phr
c830: 61 73 65 20 61 70 70 65 61 72 73 20 69 6e 20 74  ase appears in t
c840: 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 0a 20 20 20  he column in.   
c850: 20 20 20 20 20 20 20 20 20 20 61 6c 6c 20 72 6f            all ro
c860: 77 73 20 69 6e 20 74 68 65 20 46 54 53 20 74 61  ws in the FTS ta
c870: 62 6c 65 2e 0a 20 20 20 20 20 20 20 20 3c 6c 69  ble..        <li
c880: 3e 20 54 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  > The total numb
c890: 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68  er of rows in th
c8a0: 65 20 46 54 53 20 74 61 62 6c 65 20 66 6f 72 20  e FTS table for 
c8b0: 77 68 69 63 68 20 74 68 65 20 0a 20 20 20 20 20  which the .     
c8c0: 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 20 63          column c
c8d0: 6f 6e 74 61 69 6e 73 20 61 74 20 6c 65 61 73 74  ontains at least
c8e0: 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66   one instance of
c8f0: 20 74 68 65 20 70 68 72 61 73 65 2e 0a 20 20 20   the phrase..   
c900: 20 20 20 3c 2f 75 6c 3e 0a 20 20 20 20 20 20 54     </ul>.      T
c910: 68 65 20 66 69 72 73 74 20 73 65 74 20 6f 66 20  he first set of 
c920: 74 68 72 65 65 20 76 61 6c 75 65 73 20 63 6f 72  three values cor
c930: 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 68 65 20  responds to the 
c940: 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e  left-most column
c950: 0a 20 20 20 20 20 20 6f 66 20 74 68 65 20 74 61  .      of the ta
c960: 62 6c 65 20 28 63 6f 6c 75 6d 6e 20 30 29 20 61  ble (column 0) a
c970: 6e 64 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74  nd the left-most
c980: 20 6d 61 74 63 68 61 62 6c 65 20 70 68 72 61 73   matchable phras
c990: 65 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20 71  e in the.      q
c9a0: 75 65 72 79 20 28 70 68 72 61 73 65 20 30 29 2e  uery (phrase 0).
c9b0: 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 68 61   If the table ha
c9c0: 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  s more than one 
c9d0: 63 6f 6c 75 6d 6e 2c 20 74 68 65 20 73 65 63 6f  column, the seco
c9e0: 6e 64 0a 20 20 20 20 20 20 73 65 74 20 6f 66 20  nd.      set of 
c9f0: 74 68 72 65 65 20 76 61 6c 75 65 73 20 69 6e 20  three values in 
ca00: 74 68 65 20 6f 75 74 70 75 74 20 61 72 72 61 79  the output array
ca10: 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 70   correspond to p
ca20: 68 72 61 73 65 20 30 20 61 6e 64 0a 20 20 20 20  hrase 0 and.    
ca30: 20 20 63 6f 6c 75 6d 6e 20 31 2e 20 46 6f 6c 6c    column 1. Foll
ca40: 6f 77 65 64 20 62 79 20 70 68 72 61 73 65 20 30  owed by phrase 0
ca50: 2c 20 63 6f 6c 75 6d 6e 20 32 20 61 6e 64 20 73  , column 2 and s
ca60: 6f 20 6f 6e 20 66 6f 72 20 61 6c 6c 20 63 6f 6c  o on for all col
ca70: 75 6d 6e 73 20 6f 66 0a 20 20 20 20 20 20 74 68  umns of.      th
ca80: 65 20 74 61 62 6c 65 2e 20 41 6e 64 20 73 6f 20  e table. And so 
ca90: 6f 6e 20 66 6f 72 20 70 68 72 61 73 65 20 31 2c  on for phrase 1,
caa0: 20 63 6f 6c 75 6d 6e 20 30 2c 20 74 68 65 6e 20   column 0, then 
cab0: 70 68 72 61 73 65 20 31 2c 20 63 6f 6c 75 6d 6e  phrase 1, column
cac0: 20 31 0a 20 20 20 20 20 20 65 74 63 2e 20 49 6e   1.      etc. In
cad0: 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68   other words, th
cae0: 65 20 64 61 74 61 20 66 6f 72 20 6f 63 63 75 72  e data for occur
caf0: 72 65 6e 63 65 73 20 6f 66 20 70 68 72 61 73 65  rences of phrase
cb00: 20 3c 69 3e 70 3c 2f 69 3e 20 69 6e 0a 20 20 20   <i>p</i> in.   
cb10: 20 20 20 63 6f 6c 75 6d 6e 20 3c 69 3e 63 3c 2f     column <i>c</
cb20: 69 3e 20 6d 61 79 20 62 65 20 66 6f 75 6e 64 20  i> may be found 
cb30: 75 73 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77  using the follow
cb40: 69 6e 67 20 66 6f 72 6d 75 6c 61 3a 0a 3c 70 72  ing formula:.<pr
cb50: 65 3e 0a 20 20 20 20 20 20 20 20 20 20 68 69 74  e>.          hit
cb60: 73 5f 74 68 69 73 5f 72 6f 77 20 20 3d 20 61 72  s_this_row  = ar
cb70: 72 61 79 26 23 39 31 3b 33 20 2a 20 28 63 20 2b  ray&#91;3 * (c +
cb80: 20 70 2a 63 6f 6c 73 29 20 2b 20 30 26 23 39 33   p*cols) + 0&#93
cb90: 3b 0a 20 20 20 20 20 20 20 20 20 20 68 69 74 73  ;.          hits
cba0: 5f 61 6c 6c 5f 72 6f 77 73 20 20 3d 20 61 72 72  _all_rows  = arr
cbb0: 61 79 26 23 39 31 3b 33 20 2a 20 28 63 20 2b 20  ay&#91;3 * (c + 
cbc0: 70 2a 63 6f 6c 73 29 20 2b 20 31 26 23 39 33 3b  p*cols) + 1&#93;
cbd0: 0a 20 20 20 20 20 20 20 20 20 20 64 6f 63 73 5f  .          docs_
cbe0: 77 69 74 68 5f 68 69 74 73 20 3d 20 61 72 72 61  with_hits = arra
cbf0: 79 26 23 39 31 3b 33 20 2a 20 28 63 20 2b 20 70  y&#91;3 * (c + p
cc00: 2a 63 6f 6c 73 29 20 2b 20 32 26 23 39 33 3b 0a  *cols) + 2&#93;.
cc10: 3c 2f 70 72 65 3e 0a 0a 20 20 3c 74 72 3e 3c 74  </pre>..  <tr><t
cc20: 64 3e 6e 20 3c 74 64 3e 31 20 3c 74 64 3e 54 68  d>n <td>1 <td>Th
cc30: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
cc40: 20 69 6e 20 74 68 65 20 46 54 53 34 20 74 61 62   in the FTS4 tab
cc50: 6c 65 2e 20 54 68 69 73 20 76 61 6c 75 65 20 69  le. This value i
cc60: 73 0a 20 20 20 20 6f 6e 6c 79 20 61 76 61 69 6c  s.    only avail
cc70: 61 62 6c 65 20 77 68 65 6e 20 71 75 65 72 79 69  able when queryi
cc80: 6e 67 20 46 54 53 34 20 74 61 62 6c 65 73 2c 20  ng FTS4 tables, 
cc90: 6e 6f 74 20 46 54 53 33 2e 0a 20 20 3c 74 72 3e  not FTS3..  <tr>
cca0: 3c 74 64 3e 61 20 3c 74 64 3e 3c 69 3e 63 6f 6c  <td>a <td><i>col
ccb0: 73 3c 2f 69 3e 20 3c 74 64 3e 46 6f 72 20 65 61  s</i> <td>For ea
ccc0: 63 68 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 20 61  ch column, the a
ccd0: 76 65 72 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  verage number of
cce0: 0a 20 20 20 20 74 6f 6b 65 6e 73 20 69 6e 20 74  .    tokens in t
ccf0: 68 65 20 74 65 78 74 20 76 61 6c 75 65 73 20 73  he text values s
cd00: 74 6f 72 65 64 20 69 6e 20 74 68 65 20 63 6f 6c  tored in the col
cd10: 75 6d 6e 20 28 63 6f 6e 73 69 64 65 72 69 6e 67  umn (considering
cd20: 20 61 6c 6c 20 72 6f 77 73 20 69 6e 0a 20 20 20   all rows in.   
cd30: 20 74 68 65 20 46 54 53 34 20 74 61 62 6c 65 29   the FTS4 table)
cd40: 2e 20 54 68 69 73 20 76 61 6c 75 65 20 69 73 20  . This value is 
cd50: 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 77  only available w
cd60: 68 65 6e 20 71 75 65 72 79 69 6e 67 20 46 54 53  hen querying FTS
cd70: 34 20 74 61 62 6c 65 73 2c 0a 20 20 20 20 6e 6f  4 tables,.    no
cd80: 74 20 46 54 53 33 2e 20 20 0a 20 20 3c 74 72 3e  t FTS3.  .  <tr>
cd90: 3c 74 64 3e 6c 20 3c 74 64 3e 3c 69 3e 63 6f 6c  <td>l <td><i>col
cda0: 73 3c 2f 69 3e 20 3c 74 64 3e 0a 20 20 20 20 46  s</i> <td>.    F
cdb0: 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 2c 20  or each column, 
cdc0: 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68  the length of th
cdd0: 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69  e value stored i
cde0: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f  n the current ro
cdf0: 77 20 6f 66 20 74 68 65 0a 20 20 20 20 46 54 53  w of the.    FTS
ce00: 34 20 74 61 62 6c 65 2c 20 69 6e 20 74 6f 6b 65  4 table, in toke
ce10: 6e 73 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20  ns.  This value 
ce20: 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c  is only availabl
ce30: 65 20 77 68 65 6e 20 71 75 65 72 79 69 6e 67 0a  e when querying.
ce40: 20 20 20 20 46 54 53 34 20 74 61 62 6c 65 73 2c      FTS4 tables,
ce50: 20 6e 6f 74 20 46 54 53 33 2e 20 41 6e 64 20 6f   not FTS3. And o
ce60: 6e 6c 79 20 69 66 20 74 68 65 20 22 6d 61 74 63  nly if the "matc
ce70: 68 69 6e 66 6f 3d 66 74 73 33 22 20 64 69 72 65  hinfo=fts3" dire
ce80: 63 74 69 76 65 20 77 61 73 20 6e 6f 74 0a 20 20  ctive was not.  
ce90: 20 20 73 70 65 63 69 66 69 65 64 20 61 73 20 70    specified as p
cea0: 61 72 74 20 6f 66 20 74 68 65 20 22 43 52 45 41  art of the "CREA
ceb0: 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45  TE VIRTUAL TABLE
cec0: 22 20 73 74 61 74 65 6d 65 6e 74 20 75 73 65 64  " statement used
ced0: 20 74 6f 20 63 72 65 61 74 65 0a 20 20 20 20 74   to create.    t
cee0: 68 65 20 46 54 53 34 20 74 61 62 6c 65 2e 0a 20  he FTS4 table.. 
cef0: 20 3c 74 72 3e 3c 74 64 3e 73 20 3c 74 64 3e 3c   <tr><td>s <td><
cf00: 69 3e 63 6f 6c 73 3c 2f 69 3e 20 3c 74 64 3e 46  i>cols</i> <td>F
cf10: 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 2c 20  or each column, 
cf20: 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68  the length of th
cf30: 65 20 6c 6f 6e 67 65 73 74 20 0a 20 20 20 20 73  e longest .    s
cf40: 75 62 73 65 71 75 65 6e 63 65 20 6f 66 20 70 68  ubsequence of ph
cf50: 72 61 73 65 20 6d 61 74 63 68 65 73 20 74 68 61  rase matches tha
cf60: 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c  t the column val
cf70: 75 65 20 68 61 73 20 69 6e 20 63 6f 6d 6d 6f 6e  ue has in common
cf80: 0a 20 20 20 20 77 69 74 68 20 74 68 65 20 71 75  .    with the qu
cf90: 65 72 79 20 74 65 78 74 2e 20 46 6f 72 20 65 78  ery text. For ex
cfa0: 61 6d 70 6c 65 2c 20 69 66 20 61 20 74 61 62 6c  ample, if a tabl
cfb0: 65 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e  e column contain
cfc0: 73 20 74 68 65 20 74 65 78 74 0a 20 20 20 20 27  s the text.    '
cfd0: 61 20 62 20 63 20 64 20 65 27 20 61 6e 64 20 74  a b c d e' and t
cfe0: 68 65 20 71 75 65 72 79 20 69 73 20 27 61 20 63  he query is 'a c
cff0: 20 22 64 20 65 22 27 2c 20 74 68 65 6e 20 74 68   "d e"', then th
d000: 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20  e length of the 
d010: 6c 6f 6e 67 65 73 74 0a 20 20 20 20 63 6f 6d 6d  longest.    comm
d020: 6f 6e 20 73 75 62 73 65 71 75 65 6e 63 65 20 69  on subsequence i
d030: 73 20 32 20 28 70 68 72 61 73 65 20 22 63 22 20  s 2 (phrase "c" 
d040: 66 6f 6c 6c 6f 77 65 64 20 62 79 20 70 68 72 61  followed by phra
d050: 73 65 20 22 64 20 65 22 29 2e 0a 20 20 20 20 0a  se "d e")..    .
d060: 20 20 20 20 0a 3c 2f 74 61 62 6c 65 3e 0a 0a 3c      .</table>..<
d070: 70 3e 0a 20 20 46 6f 72 20 65 78 61 6d 70 6c 65  p>.  For example
d080: 3a 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20  :..<codeblock>. 
d090: 20 3c 69 3e 2d 2d 20 43 72 65 61 74 65 20 61 6e   <i>-- Create an
d0a0: 64 20 70 6f 70 75 6c 61 74 65 20 61 6e 20 46 54  d populate an FT
d0b0: 53 34 20 74 61 62 6c 65 20 77 69 74 68 20 74 77  S4 table with tw
d0c0: 6f 20 63 6f 6c 75 6d 6e 73 3a 3c 2f 69 3e 0a 20  o columns:</i>. 
d0d0: 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20   CREATE VIRTUAL 
d0e0: 54 41 42 4c 45 20 74 31 20 55 53 49 4e 47 20 66  TABLE t1 USING f
d0f0: 74 73 34 28 61 2c 20 62 29 3b 0a 20 20 49 4e 53  ts4(a, b);.  INS
d100: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
d110: 45 53 28 27 74 72 61 6e 73 61 63 74 69 6f 6e 20  ES('transaction 
d120: 64 65 66 61 75 6c 74 20 6d 6f 64 65 6c 73 20 64  default models d
d130: 65 66 61 75 6c 74 27 2c 20 27 4e 6f 6e 20 74 72  efault', 'Non tr
d140: 61 6e 73 61 63 74 69 6f 6e 20 72 65 61 64 73 27  ansaction reads'
d150: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
d160: 20 74 31 20 56 41 4c 55 45 53 28 27 74 68 65 20   t1 VALUES('the 
d170: 64 65 66 61 75 6c 74 20 74 72 61 6e 73 61 63 74  default transact
d180: 69 6f 6e 27 2c 20 27 74 68 65 73 65 20 73 65 6d  ion', 'these sem
d190: 61 6e 74 69 63 73 20 70 72 65 73 65 6e 74 27 29  antics present')
d1a0: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
d1b0: 74 31 20 56 41 4c 55 45 53 28 27 73 69 6e 67 6c  t1 VALUES('singl
d1c0: 65 20 72 65 71 75 65 73 74 27 2c 20 27 64 65 66  e request', 'def
d1d0: 61 75 6c 74 20 64 61 74 61 27 29 3b 0a 0a 20 20  ault data');..  
d1e0: 3c 69 3e 2d 2d 20 49 6e 20 74 68 65 20 66 6f 6c  <i>-- In the fol
d1f0: 6c 6f 77 69 6e 67 20 71 75 65 72 79 2c 20 6e 6f  lowing query, no
d200: 20 66 6f 72 6d 61 74 20 73 74 72 69 6e 67 20 69   format string i
d210: 73 20 73 70 65 63 69 66 69 65 64 20 61 6e 64 20  s specified and 
d220: 73 6f 20 69 74 20 64 65 66 61 75 6c 74 73 3c 2f  so it defaults</
d230: 69 3e 0a 20 20 3c 69 3e 2d 2d 20 74 6f 20 22 70  i>.  <i>-- to "p
d240: 63 78 22 2e 20 49 74 20 74 68 65 72 65 66 6f 72  cx". It therefor
d250: 65 20 72 65 74 75 72 6e 73 20 61 20 73 69 6e 67  e returns a sing
d260: 6c 65 20 72 6f 77 20 63 6f 6e 73 69 73 74 69 6e  le row consistin
d270: 67 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 62 6c  g of a single bl
d280: 6f 62 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 76  ob</i>.  <i>-- v
d290: 61 6c 75 65 20 38 30 20 62 79 74 65 73 20 69 6e  alue 80 bytes in
d2a0: 20 73 69 7a 65 20 28 32 30 20 33 32 2d 62 69 74   size (20 32-bit
d2b0: 20 69 6e 74 65 67 65 72 73 20 2d 20 31 20 66 6f   integers - 1 fo
d2c0: 72 20 22 70 22 2c 20 31 20 66 6f 72 20 22 63 22  r "p", 1 for "c"
d2d0: 20 61 6e 64 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d   and</i>.  <i>--
d2e0: 20 33 2a 32 2a 33 20 66 6f 72 20 22 78 22 29 2e   3*2*3 for "x").
d2f0: 20 49 66 20 65 61 63 68 20 62 6c 6f 63 6b 20 6f   If each block o
d300: 66 20 34 20 62 79 74 65 73 20 69 6e 3c 2f 69 3e  f 4 bytes in</i>
d310: 20 74 68 65 20 62 6c 6f 62 20 69 73 20 69 6e 74   the blob is int
d320: 65 72 70 72 65 74 65 64 3c 2f 69 3e 20 0a 20 20  erpreted</i> .  
d330: 3c 69 3e 2d 2d 20 61 73 20 61 6e 20 75 6e 73 69  <i>-- as an unsi
d340: 67 6e 65 64 20 69 6e 74 65 67 65 72 20 69 6e 20  gned integer in 
d350: 6d 61 63 68 69 6e 65 20 62 79 74 65 2d 6f 72 64  machine byte-ord
d360: 65 72 2c 20 74 68 65 20 76 61 6c 75 65 73 20 77  er, the values w
d370: 69 6c 6c 20 62 65 3a 3c 2f 69 3e 0a 20 20 3c 69  ill be:</i>.  <i
d380: 3e 2d 2d 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20  >--</i>.  <i>-- 
d390: 20 20 20 20 33 20 32 20 20 31 20 33 20 32 20 20      3 2  1 3 2  
d3a0: 30 20 31 20 31 20 20 31 20 32 20 32 20 20 30 20  0 1 1  1 2 2  0 
d3b0: 31 20 31 20 20 30 20 30 20 30 20 20 31 20 31 20  1 1  0 0 0  1 1 
d3c0: 31 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 3c 2f 69  1</i>.  <i>--</i
d3d0: 3e 0a 20 20 3c 69 3e 2d 2d 20 54 68 65 20 72 6f  >.  <i>-- The ro
d3e0: 77 20 72 65 74 75 72 6e 65 64 20 63 6f 72 72 65  w returned corre
d3f0: 73 70 6f 6e 64 73 20 74 6f 20 74 68 65 20 73 65  sponds to the se
d400: 63 6f 6e 64 20 65 6e 74 72 79 20 69 6e 73 65 72  cond entry inser
d410: 74 65 64 20 69 6e 74 6f 20 74 61 62 6c 65 20 74  ted into table t
d420: 31 2e 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 54  1.</i>.  <i>-- T
d430: 68 65 20 66 69 72 73 74 20 74 77 6f 20 69 6e 74  he first two int
d440: 65 67 65 72 73 20 69 6e 20 74 68 65 20 62 6c 6f  egers in the blo
d450: 62 20 73 68 6f 77 20 74 68 61 74 20 74 68 65 20  b show that the 
d460: 71 75 65 72 79 20 63 6f 6e 74 61 69 6e 65 64 20  query contained 
d470: 74 68 72 65 65 3c 2f 69 3e 0a 20 20 3c 69 3e 2d  three</i>.  <i>-
d480: 2d 20 70 68 72 61 73 65 73 20 61 6e 64 20 74 68  - phrases and th
d490: 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 71 75  e table being qu
d4a0: 65 72 69 65 64 20 68 61 73 20 74 77 6f 20 63 6f  eried has two co
d4b0: 6c 75 6d 6e 73 2e 20 54 68 65 20 6e 65 78 74 20  lumns. The next 
d4c0: 62 6c 6f 63 6b 20 6f 66 3c 2f 69 3e 0a 20 20 3c  block of</i>.  <
d4d0: 69 3e 2d 2d 20 74 68 72 65 65 20 69 6e 74 65 67  i>-- three integ
d4e0: 65 72 73 20 64 65 73 63 72 69 62 65 73 20 63 6f  ers describes co
d4f0: 6c 75 6d 6e 20 30 20 28 69 6e 20 74 68 69 73 20  lumn 0 (in this 
d500: 63 61 73 65 20 63 6f 6c 75 6d 6e 20 22 61 22 29  case column "a")
d510: 20 61 6e 64 20 70 68 72 61 73 65 3c 2f 69 3e 0a   and phrase</i>.
d520: 20 20 3c 69 3e 2d 2d 20 30 20 28 69 6e 20 74 68    <i>-- 0 (in th
d530: 69 73 20 63 61 73 65 20 22 64 65 66 61 75 6c 74  is case "default
d540: 22 29 2e 20 54 68 65 20 63 75 72 72 65 6e 74 20  "). The current 
d550: 72 6f 77 20 63 6f 6e 74 61 69 6e 73 20 31 20 68  row contains 1 h
d560: 69 74 20 66 6f 72 20 22 64 65 66 61 75 6c 74 22  it for "default"
d570: 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 69 6e 20  </i>.  <i>-- in 
d580: 63 6f 6c 75 6d 6e 20 30 2c 20 6f 66 20 61 20 74  column 0, of a t
d590: 6f 74 61 6c 20 6f 66 20 33 20 68 69 74 73 20 66  otal of 3 hits f
d5a0: 6f 72 20 22 64 65 66 61 75 6c 74 22 20 74 68 61  or "default" tha
d5b0: 74 20 6f 63 63 75 72 20 69 6e 20 63 6f 6c 75 6d  t occur in colum
d5c0: 6e 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 30 20  n</i>.  <i>-- 0 
d5d0: 6f 66 20 61 6e 79 20 74 61 62 6c 65 20 72 6f 77  of any table row
d5e0: 2e 20 54 68 65 20 33 20 68 69 74 73 20 61 72 65  . The 3 hits are
d5f0: 20 73 70 72 65 61 64 20 61 63 72 6f 73 73 20 32   spread across 2
d600: 20 64 69 66 66 65 72 65 6e 74 20 72 6f 77 73 2e   different rows.
d610: 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 3c 2f 69 3e  </i>.  <i>--</i>
d620: 0a 20 20 3c 69 3e 2d 2d 20 54 68 65 20 6e 65 78  .  <i>-- The nex
d630: 74 20 73 65 74 20 6f 66 20 74 68 72 65 65 20 69  t set of three i
d640: 6e 74 65 67 65 72 73 20 28 30 20 31 20 31 29 20  ntegers (0 1 1) 
d650: 70 65 72 74 61 69 6e 20 74 6f 20 74 68 65 20 68  pertain to the h
d660: 69 74 73 20 66 6f 72 20 22 64 65 66 61 75 6c 74  its for "default
d670: 22 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 69 6e  "</i>.  <i>-- in
d680: 20 63 6f 6c 75 6d 6e 20 31 20 6f 66 20 74 68 65   column 1 of the
d690: 20 74 61 62 6c 65 20 28 30 20 69 6e 20 74 68 69   table (0 in thi
d6a0: 73 20 72 6f 77 2c 20 31 20 69 6e 20 61 6c 6c 20  s row, 1 in all 
d6b0: 72 6f 77 73 2c 20 73 70 72 65 61 64 20 61 63 72  rows, spread acr
d6c0: 6f 73 73 20 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d  oss </i>.  <i>--
d6d0: 20 31 20 72 6f 77 73 29 2e 3c 2f 69 3e 0a 20 20   1 rows).</i>.  
d6e0: 3c 69 3e 2d 2d 3c 2f 69 3e 0a 20 20 53 45 4c 45  <i>--</i>.  SELE
d6f0: 43 54 20 6d 61 74 63 68 69 6e 66 6f 28 74 31 29  CT matchinfo(t1)
d700: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 74   FROM t1 WHERE t
d710: 31 20 4d 41 54 43 48 20 27 64 65 66 61 75 6c 74  1 MATCH 'default
d720: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 22 74 68   transaction "th
d730: 65 73 65 20 73 65 6d 61 6e 74 69 63 73 22 27 3b  ese semantics"';
d740: 0a 0a 20 20 3c 69 3e 2d 2d 20 54 68 65 20 66 6f  ..  <i>-- The fo
d750: 72 6d 61 74 20 73 74 72 69 6e 67 20 66 6f 72 20  rmat string for 
d760: 74 68 69 73 20 71 75 65 72 79 20 69 73 20 22 6e  this query is "n
d770: 73 22 2e 20 54 68 65 20 6f 75 74 70 75 74 20 61  s". The output a
d780: 72 72 61 79 20 77 69 6c 6c 20 74 68 65 72 65 66  rray will theref
d790: 6f 72 65 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20  ore</i>.  <i>-- 
d7a0: 63 6f 6e 74 61 69 6e 20 33 20 69 6e 74 65 67 65  contain 3 intege
d7b0: 72 20 76 61 6c 75 65 73 20 2d 20 31 20 66 6f 72  r values - 1 for
d7c0: 20 22 6e 22 20 61 6e 64 20 32 20 66 6f 72 20 22   "n" and 2 for "
d7d0: 73 22 2e 20 54 68 65 20 71 75 65 72 79 20 72 65  s". The query re
d7e0: 74 75 72 6e 73 3c 2f 69 3e 0a 20 20 3c 69 3e 2d  turns</i>.  <i>-
d7f0: 2d 20 74 77 6f 20 72 6f 77 73 20 28 74 68 65 20  - two rows (the 
d800: 66 69 72 73 74 20 74 77 6f 20 72 6f 77 73 20 69  first two rows i
d810: 6e 20 74 68 65 20 74 61 62 6c 65 20 6d 61 74 63  n the table matc
d820: 68 29 2e 20 54 68 65 20 76 61 6c 75 65 73 20 72  h). The values r
d830: 65 74 75 72 6e 65 64 20 61 72 65 3a 3c 2f 69 3e  eturned are:</i>
d840: 0a 20 20 3c 69 3e 2d 2d 3c 2f 69 3e 0a 20 20 3c  .  <i>--</i>.  <
d850: 69 3e 2d 2d 20 20 20 20 20 33 20 20 31 20 31 3c  i>--     3  1 1<
d860: 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 20 20 20 20  /i>.  <i>--     
d870: 33 20 20 32 20 30 3c 2f 69 3e 0a 20 20 3c 69 3e  3  2 0</i>.  <i>
d880: 2d 2d 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 54  --</i>.  <i>-- T
d890: 68 65 20 66 69 72 73 74 20 76 61 6c 75 65 20 69  he first value i
d8a0: 6e 20 74 68 65 20 6d 61 74 63 68 69 6e 66 6f 20  n the matchinfo 
d8b0: 61 72 72 61 79 20 72 65 74 75 72 6e 65 64 20 66  array returned f
d8c0: 6f 72 20 62 6f 74 68 20 72 6f 77 73 20 69 73 20  or both rows is 
d8d0: 33 20 28 74 68 65 20 3c 2f 69 3e 0a 20 20 3c 69  3 (the </i>.  <i
d8e0: 3e 2d 2d 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  >-- number of ro
d8f0: 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 29  ws in the table)
d900: 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  . The following 
d910: 74 77 6f 20 76 61 6c 75 65 73 20 61 72 65 20 74  two values are t
d920: 68 65 20 6c 65 6e 67 74 68 73 20 3c 2f 69 3e 0a  he lengths </i>.
d930: 20 20 3c 69 3e 2d 2d 20 6f 66 20 74 68 65 20 6c    <i>-- of the l
d940: 6f 6e 67 65 73 74 20 63 6f 6d 6d 6f 6e 20 73 75  ongest common su
d950: 62 73 65 71 75 65 6e 63 65 20 6f 66 20 70 68 72  bsequence of phr
d960: 61 73 65 20 6d 61 74 63 68 65 73 20 69 6e 20 65  ase matches in e
d970: 61 63 68 20 63 6f 6c 75 6d 6e 2e 3c 2f 69 3e 0a  ach column.</i>.
d980: 20 20 53 45 4c 45 43 54 20 6d 61 74 63 68 69 6e    SELECT matchin
d990: 66 6f 28 74 31 2c 20 27 6e 73 27 29 20 46 52 4f  fo(t1, 'ns') FRO
d9a0: 4d 20 74 31 20 57 48 45 52 45 20 74 31 20 4d 41  M t1 WHERE t1 MA
d9b0: 54 43 48 20 27 64 65 66 61 75 6c 74 20 74 72 61  TCH 'default tra
d9c0: 6e 73 61 63 74 69 6f 6e 27 3b 0a 3c 2f 63 6f 64  nsaction';.</cod
d9d0: 65 62 6c 6f 63 6b 3e 0a 0a 3c 70 3e 0a 20 20 54  eblock>..<p>.  T
d9e0: 68 65 20 6d 61 74 63 68 69 6e 66 6f 20 66 75 6e  he matchinfo fun
d9f0: 63 74 69 6f 6e 20 69 73 20 6d 75 63 68 20 66 61  ction is much fa
da00: 73 74 65 72 20 74 68 61 6e 20 65 69 74 68 65 72  ster than either
da10: 20 74 68 65 20 73 6e 69 70 70 65 74 20 6f 72 20   the snippet or 
da20: 6f 66 66 73 65 74 73 0a 20 20 66 75 6e 63 74 69  offsets.  functi
da30: 6f 6e 73 2e 20 54 68 69 73 20 69 73 20 62 65 63  ons. This is bec
da40: 61 75 73 65 20 74 68 65 20 69 6d 70 6c 65 6d 65  ause the impleme
da50: 6e 74 61 74 69 6f 6e 20 6f 66 20 62 6f 74 68 20  ntation of both 
da60: 73 6e 69 70 70 65 74 20 61 6e 64 20 6f 66 66 73  snippet and offs
da70: 65 74 73 0a 20 20 69 73 20 72 65 71 75 69 72 65  ets.  is require
da80: 64 20 74 6f 20 72 65 74 72 69 65 76 65 20 74 68  d to retrieve th
da90: 65 20 64 6f 63 75 6d 65 6e 74 73 20 62 65 69 6e  e documents bein
daa0: 67 20 61 6e 61 6c 79 7a 65 64 20 66 72 6f 6d 20  g analyzed from 
dab0: 64 69 73 6b 2c 20 77 68 65 72 65 61 73 0a 20 20  disk, whereas.  
dac0: 61 6c 6c 20 64 61 74 61 20 72 65 71 75 69 72 65  all data require
dad0: 64 20 62 79 20 6d 61 74 63 68 69 6e 66 6f 20 69  d by matchinfo i
dae0: 73 20 61 76 61 69 6c 61 62 6c 65 20 61 73 20 70  s available as p
daf0: 61 72 74 20 6f 66 20 74 68 65 20 73 61 6d 65 20  art of the same 
db00: 70 6f 72 74 69 6f 6e 73 0a 20 20 6f 66 20 74 68  portions.  of th
db10: 65 20 66 75 6c 6c 2d 74 65 78 74 20 69 6e 64 65  e full-text inde
db20: 78 20 74 68 61 74 20 61 72 65 20 72 65 71 75 69  x that are requi
db30: 72 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  red to implement
db40: 20 74 68 65 20 66 75 6c 6c 2d 74 65 78 74 20 71   the full-text q
db50: 75 65 72 79 0a 20 20 69 74 73 65 6c 66 2e 20 54  uery.  itself. T
db60: 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 6f  his means that o
db70: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
db80: 74 77 6f 20 71 75 65 72 69 65 73 2c 20 74 68 65  two queries, the
db90: 20 66 69 72 73 74 20 6d 61 79 20 62 65 0a 20 20   first may be.  
dba0: 61 6e 20 6f 72 64 65 72 20 6f 66 20 6d 61 67 6e  an order of magn
dbb0: 69 74 75 64 65 20 66 61 73 74 65 72 20 74 68 61  itude faster tha
dbc0: 6e 20 74 68 65 20 73 65 63 6f 6e 64 3a 0a 0a 3c  n the second:..<
dbd0: 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20 20 53 45 4c  codeblock>.  SEL
dbe0: 45 43 54 20 64 6f 63 69 64 2c 20 6d 61 74 63 68  ECT docid, match
dbf0: 69 6e 66 6f 28 74 62 6c 29 20 46 52 4f 4d 20 74  info(tbl) FROM t
dc00: 62 6c 20 57 48 45 52 45 20 74 62 6c 20 4d 41 54  bl WHERE tbl MAT
dc10: 43 48 20 26 6c 74 3b 71 75 65 72 79 20 65 78 70  CH &lt;query exp
dc20: 72 65 73 73 69 6f 6e 26 67 74 3b 3b 0a 20 20 53  ression&gt;;.  S
dc30: 45 4c 45 43 54 20 64 6f 63 69 64 2c 20 6f 66 66  ELECT docid, off
dc40: 73 65 74 73 28 74 62 6c 29 20 46 52 4f 4d 20 74  sets(tbl) FROM t
dc50: 62 6c 20 57 48 45 52 45 20 74 62 6c 20 4d 41 54  bl WHERE tbl MAT
dc60: 43 48 20 26 6c 74 3b 71 75 65 72 79 20 65 78 70  CH &lt;query exp
dc70: 72 65 73 73 69 6f 6e 26 67 74 3b 3b 0a 3c 2f 63  ression&gt;;.</c
dc80: 6f 64 65 62 6c 6f 63 6b 3e 0a 0a 3c 70 3e 0a 20  odeblock>..<p>. 
dc90: 20 54 68 65 20 6d 61 74 63 68 69 6e 66 6f 20 66   The matchinfo f
dca0: 75 6e 63 74 69 6f 6e 20 70 72 6f 76 69 64 65 73  unction provides
dcb0: 20 61 6c 6c 20 74 68 65 20 69 6e 66 6f 72 6d 61   all the informa
dcc0: 74 69 6f 6e 20 72 65 71 75 69 72 65 64 20 74 6f  tion required to
dcd0: 20 63 61 6c 63 75 6c 61 74 65 0a 20 20 70 72 6f   calculate.  pro
dce0: 62 61 62 69 6c 69 73 74 69 63 20 22 62 61 67 2d  babilistic "bag-
dcf0: 6f 66 2d 77 6f 72 64 73 22 20 72 65 6c 65 76 61  of-words" releva
dd00: 6e 63 79 20 73 63 6f 72 65 73 20 73 75 63 68 20  ncy scores such 
dd10: 61 73 20 0a 20 20 3c 61 20 68 72 65 66 3d 68 74  as .  <a href=ht
dd20: 74 70 3a 2f 2f 65 6e 2e 77 69 6b 69 70 65 64 69  tp://en.wikipedi
dd30: 61 2e 6f 72 67 2f 77 69 6b 69 2f 4f 6b 61 70 69  a.org/wiki/Okapi
dd40: 5f 42 4d 32 35 3e 4f 6b 61 70 69 20 42 4d 32 35  _BM25>Okapi BM25
dd50: 2f 42 4d 32 35 46 3c 2f 61 3e 20 74 68 61 74 20  /BM25F</a> that 
dd60: 6d 61 79 0a 20 20 62 65 20 75 73 65 64 20 74 6f  may.  be used to
dd70: 20 6f 72 64 65 72 20 72 65 73 75 6c 74 73 20 69   order results i
dd80: 6e 20 61 20 66 75 6c 6c 2d 74 65 78 74 20 73 65  n a full-text se
dd90: 61 72 63 68 20 61 70 70 6c 69 63 61 74 69 6f 6e  arch application
dda0: 2e 20 41 70 70 65 6e 64 69 78 20 41 20 6f 66 20  . Appendix A of 
ddb0: 74 68 69 73 20 0a 20 20 64 6f 63 75 6d 65 6e 74  this .  document
ddc0: 2c 20 22 5b 73 65 61 72 63 68 20 61 70 70 6c 69  , "[search appli
ddd0: 63 61 74 69 6f 6e 20 74 69 70 73 5d 22 2c 20 63  cation tips]", c
dde0: 6f 6e 74 61 69 6e 73 20 61 6e 20 65 78 61 6d 70  ontains an examp
ddf0: 6c 65 20 6f 66 20 75 73 69 6e 67 20 74 68 65 0a  le of using the.
de00: 20 20 6d 61 74 63 68 69 6e 66 6f 28 29 20 66 75    matchinfo() fu
de10: 6e 63 74 69 6f 6e 20 65 66 66 69 63 69 65 6e 74  nction efficient
de20: 6c 79 2e 0a 0a 3c 68 31 20 69 64 3d 66 74 73 34  ly...<h1 id=fts4
de30: 61 75 78 20 74 61 67 73 3d 22 66 74 73 34 61 75  aux tags="fts4au
de40: 78 22 3e 46 74 73 34 61 75 78 20 2d 20 44 69 72  x">Fts4aux - Dir
de50: 65 63 74 20 41 63 63 65 73 73 20 74 6f 20 74 68  ect Access to th
de60: 65 20 46 75 6c 6c 2d 54 65 78 74 20 49 6e 64 65  e Full-Text Inde
de70: 78 3c 2f 68 31 3e 0a 0a 3c 70 3e 0a 20 20 41 73  x</h1>..<p>.  As
de80: 20 6f 66 20 76 65 72 73 69 6f 6e 20 33 2e 37 2e   of version 3.7.
de90: 36 2c 20 53 51 4c 69 74 65 20 69 6e 63 6c 75 64  6, SQLite includ
dea0: 65 73 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c  es a new virtual
deb0: 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65 20 63 61   table module ca
dec0: 6c 6c 65 64 20 0a 20 20 22 66 74 73 34 61 75 78  lled .  "fts4aux
ded0: 22 2c 20 77 68 69 63 68 20 63 61 6e 20 62 65 20  ", which can be 
dee0: 75 73 65 64 20 74 6f 20 69 6e 73 70 65 63 74 20  used to inspect 
def0: 74 68 65 20 66 75 6c 6c 2d 74 65 78 74 20 69 6e  the full-text in
df00: 64 65 78 20 6f 66 20 61 6e 20 65 78 69 74 69 6e  dex of an exitin
df10: 67 0a 20 20 46 54 53 20 74 61 62 6c 65 20 64 69  g.  FTS table di
df20: 72 65 63 74 6c 79 2e 20 44 65 73 70 69 74 65 20  rectly. Despite 
df30: 69 74 73 20 6e 61 6d 65 2c 20 66 74 73 34 61 75  its name, fts4au
df40: 78 20 77 6f 72 6b 73 20 6a 75 73 74 20 61 73 20  x works just as 
df50: 77 65 6c 6c 20 77 69 74 68 20 46 54 53 33 0a 20  well with FTS3. 
df60: 20 74 61 62 6c 65 73 20 61 73 20 69 74 20 64 6f   tables as it do
df70: 65 73 20 77 69 74 68 20 46 54 53 34 20 74 61 62  es with FTS4 tab
df80: 6c 65 73 2e 20 46 74 73 34 61 75 78 20 74 61 62  les. Fts4aux tab
df90: 6c 65 73 20 61 72 65 20 72 65 61 64 2d 6f 6e 6c  les are read-onl
dfa0: 79 2e 20 54 68 65 20 6f 6e 6c 79 0a 20 20 77 61  y. The only.  wa
dfb0: 79 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20  y to modify the 
dfc0: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61 6e 20 66  contents of an f
dfd0: 74 73 34 61 75 78 20 74 61 62 6c 65 20 69 73 20  ts4aux table is 
dfe0: 62 79 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65  by modifying the
dff0: 0a 20 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  .  contents of t
e000: 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 46 54  he associated FT
e010: 53 20 74 61 62 6c 65 2e 20 54 68 65 20 66 74 73  S table. The fts
e020: 34 61 75 78 20 6d 6f 64 75 6c 65 20 69 73 20 61  4aux module is a
e030: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 0a 20 20 69  utomatically.  i
e040: 6e 63 6c 75 64 65 64 20 69 6e 20 61 6c 6c 20 5b  ncluded in all [
e050: 63 6f 6d 70 69 6c 65 20 66 74 73 7c 62 75 69 6c  compile fts|buil
e060: 64 73 20 74 68 61 74 20 69 6e 63 6c 75 64 65 20  ds that include 
e070: 46 54 53 5d 2e 0a 0a 3c 70 3e 0a 20 20 41 6e 20  FTS]...<p>.  An 
e080: 66 74 73 34 61 75 78 20 76 69 72 74 75 61 6c 20  fts4aux virtual 
e090: 74 61 62 6c 65 20 69 73 20 63 6f 6e 73 74 72 75  table is constru
e0a0: 63 74 65 64 20 77 69 74 68 20 61 20 73 69 6e 67  cted with a sing
e0b0: 6c 65 20 61 72 67 75 6d 65 6e 74 20 2d 20 74 68  le argument - th
e0c0: 65 20 0a 20 20 75 6e 71 75 61 6c 69 66 69 65 64  e .  unqualified
e0d0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 46 54 53   name of the FTS
e0e0: 20 74 61 62 6c 65 20 74 68 61 74 20 69 74 20 77   table that it w
e0f0: 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20 61  ill be used to a
e100: 63 63 65 73 73 2e 0a 20 20 46 6f 72 20 65 78 61  ccess..  For exa
e110: 6d 70 6c 65 3a 0a 0a 3c 63 6f 64 65 62 6c 6f 63  mple:..<codebloc
e120: 6b 3e 0a 20 20 3c 69 3e 2d 2d 20 43 72 65 61 74  k>.  <i>-- Creat
e130: 65 20 61 6e 20 46 54 53 34 20 74 61 62 6c 65 3c  e an FTS4 table<
e140: 2f 69 3e 0a 20 20 43 52 45 41 54 45 20 56 49 52  /i>.  CREATE VIR
e150: 54 55 41 4c 20 54 41 42 4c 45 20 66 74 20 55 53  TUAL TABLE ft US
e160: 49 4e 47 20 66 74 73 34 28 78 2c 20 79 29 3b 0a  ING fts4(x, y);.
e170: 0a 20 20 3c 69 3e 2d 2d 20 43 72 65 61 74 65 20  .  <i>-- Create 
e180: 61 6e 20 66 74 73 34 61 75 78 20 74 61 62 6c 65  an fts4aux table
e190: 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 66   to access the f
e1a0: 75 6c 6c 2d 74 65 78 74 20 69 6e 64 65 78 20 66  ull-text index f
e1b0: 6f 72 20 74 61 62 6c 65 20 22 66 74 22 3c 2f 69  or table "ft"</i
e1c0: 3e 0a 20 20 43 52 45 41 54 45 20 56 49 52 54 55  >.  CREATE VIRTU
e1d0: 41 4c 20 54 41 42 4c 45 20 66 74 5f 74 65 72 6d  AL TABLE ft_term
e1e0: 73 20 55 53 49 4e 47 20 66 74 73 34 61 75 78 28  s USING fts4aux(
e1f0: 66 74 29 3b 0a 3c 2f 63 6f 64 65 62 6c 6f 63 6b  ft);.</codeblock
e200: 3e 0a 0a 3c 70 3e 0a 20 20 46 6f 72 20 65 61 63  >..<p>.  For eac
e210: 68 20 74 65 72 6d 20 70 72 65 73 65 6e 74 20 69  h term present i
e220: 6e 20 74 68 65 20 46 54 53 20 74 61 62 6c 65 2c  n the FTS table,
e230: 20 74 68 65 72 65 20 61 72 65 20 62 65 74 77 65   there are betwe
e240: 65 6e 20 32 20 61 6e 64 20 4e 2b 31 20 72 6f 77  en 2 and N+1 row
e250: 73 0a 20 20 69 6e 20 74 68 65 20 66 74 73 34 61  s.  in the fts4a
e260: 75 78 20 74 61 62 6c 65 2c 20 77 68 65 72 65 20  ux table, where 
e270: 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  N is the number 
e280: 6f 66 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20  of user-defined 
e290: 63 6f 6c 75 6d 6e 73 20 69 6e 0a 20 20 74 68 65  columns in.  the
e2a0: 20 61 73 73 6f 63 69 61 74 65 64 20 46 54 53 20   associated FTS 
e2b0: 74 61 62 6c 65 2e 20 41 6e 20 66 74 73 34 61 75  table. An fts4au
e2c0: 78 20 74 61 62 6c 65 20 61 6c 77 61 79 73 20 68  x table always h
e2d0: 61 73 20 74 68 65 20 73 61 6d 65 20 66 6f 75 72  as the same four
e2e0: 20 63 6f 6c 75 6d 6e 73 2c 20 0a 20 20 61 73 20   columns, .  as 
e2f0: 66 6f 6c 6c 6f 77 73 2c 20 66 72 6f 6d 20 6c 65  follows, from le
e300: 66 74 20 74 6f 20 72 69 67 68 74 3a 0a 0a 3c 74  ft to right:..<t
e310: 61 62 6c 65 20 73 74 72 69 70 65 64 3d 31 3e 0a  able striped=1>.
e320: 20 20 3c 74 72 3e 3c 74 68 3e 43 6f 6c 75 6d 6e    <tr><th>Column
e330: 20 4e 61 6d 65 3c 74 68 3e 43 6f 6c 75 6d 6e 20   Name<th>Column 
e340: 43 6f 6e 74 65 6e 74 73 0a 20 20 3c 74 72 3e 3c  Contents.  <tr><
e350: 74 64 3e 74 65 72 6d 3c 74 64 3e 20 0a 20 20 20  td>term<td> .   
e360: 20 43 6f 6e 74 61 69 6e 73 20 74 68 65 20 74 65   Contains the te
e370: 78 74 20 6f 66 20 74 68 65 20 74 65 72 6d 20 66  xt of the term f
e380: 6f 72 20 74 68 69 73 20 72 6f 77 2e 0a 20 20 3c  or this row..  <
e390: 74 72 3e 3c 74 64 3e 63 6f 6c 3c 74 64 3e 20 0a  tr><td>col<td> .
e3a0: 20 20 20 20 54 68 69 73 20 63 6f 6c 75 6d 6e 20      This column 
e3b0: 6d 61 79 20 63 6f 6e 74 61 69 6e 20 65 69 74 68  may contain eith
e3c0: 65 72 20 74 68 65 20 74 65 78 74 20 76 61 6c 75  er the text valu
e3d0: 65 20 27 2a 27 20 28 69 2e 65 2e 20 61 20 73 69  e '*' (i.e. a si
e3e0: 6e 67 6c 65 20 0a 20 20 20 20 63 68 61 72 61 63  ngle .    charac
e3f0: 74 65 72 2c 20 55 54 46 20 63 6f 64 65 70 6f 69  ter, UTF codepoi
e400: 6e 74 20 34 32 29 20 6f 72 20 61 6e 20 69 6e 74  nt 42) or an int
e410: 65 67 65 72 20 62 65 74 77 65 65 6e 20 30 20 61  eger between 0 a
e420: 6e 64 20 4e 2d 31 2c 20 77 68 65 72 65 20 4e 20  nd N-1, where N 
e430: 69 73 0a 20 20 20 20 61 67 61 69 6e 20 74 68 65  is.    again the
e440: 20 6e 75 6d 62 65 72 20 6f 66 20 75 73 65 72 2d   number of user-
e450: 64 65 66 69 6e 65 64 20 63 6f 6c 75 6d 6e 73 20  defined columns 
e460: 69 6e 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  in the correspon
e470: 64 69 6e 67 20 46 54 53 20 74 61 62 6c 65 2e 0a  ding FTS table..
e480: 0a 20 20 3c 74 72 3e 3c 74 64 3e 64 6f 63 75 6d  .  <tr><td>docum
e490: 65 6e 74 73 3c 74 64 3e 0a 20 20 20 20 54 68 69  ents<td>.    Thi
e4a0: 73 20 63 6f 6c 75 6d 6e 20 61 6c 77 61 79 73 20  s column always 
e4b0: 63 6f 6e 74 61 69 6e 73 20 61 6e 20 69 6e 74 65  contains an inte
e4c0: 67 65 72 20 76 61 6c 75 65 20 67 72 65 61 74 65  ger value greate
e4d0: 72 20 74 68 61 6e 20 7a 65 72 6f 2e 0a 20 20 20  r than zero..   
e4e0: 20 3c 62 72 3e 3c 62 72 3e 0a 20 20 20 20 49 66   <br><br>.    If
e4f0: 20 74 68 65 20 22 63 6f 6c 22 20 63 6f 6c 75 6d   the "col" colum
e500: 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 76  n contains the v
e510: 61 6c 75 65 20 27 2a 27 2c 20 74 68 65 6e 20 74  alue '*', then t
e520: 68 69 73 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 63  his column.    c
e530: 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 75 6d 62  ontains the numb
e540: 65 72 20 6f 66 20 72 6f 77 73 20 6f 66 20 74 68  er of rows of th
e550: 65 20 46 54 53 20 74 61 62 6c 65 20 74 68 61 74  e FTS table that
e560: 20 63 6f 6e 74 61 69 6e 20 61 74 20 6c 65 61 73   contain at leas
e570: 74 20 6f 6e 65 0a 20 20 20 20 69 6e 73 74 61 6e  t one.    instan
e580: 63 65 20 6f 66 20 74 68 65 20 74 65 72 6d 20 28  ce of the term (
e590: 69 6e 20 61 6e 79 20 63 6f 6c 75 6d 6e 29 2e 20  in any column). 
e5a0: 49 66 20 63 6f 6c 20 63 6f 6e 74 61 69 6e 73 20  If col contains 
e5b0: 61 6e 20 69 6e 74 65 67 65 72 0a 20 20 20 20 76  an integer.    v
e5c0: 61 6c 75 65 2c 20 74 68 65 6e 20 74 68 69 73 20  alue, then this 
e5d0: 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20  column contains 
e5e0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
e5f0: 77 73 20 6f 66 20 74 68 65 20 46 54 53 20 74 61  ws of the FTS ta
e600: 62 6c 65 20 74 68 61 74 0a 20 20 20 20 63 6f 6e  ble that.    con
e610: 74 61 69 6e 20 61 74 20 6c 65 61 73 74 20 6f 6e  tain at least on
e620: 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  e instance of th
e630: 65 20 74 65 72 6d 20 69 6e 20 74 68 65 20 63 6f  e term in the co
e640: 6c 75 6d 6e 20 69 64 65 6e 74 69 66 69 65 64 20  lumn identified 
e650: 62 79 0a 20 20 20 20 74 68 65 20 63 6f 6c 20 76  by.    the col v
e660: 61 6c 75 65 2e 20 41 73 20 75 73 75 61 6c 2c 20  alue. As usual, 
e670: 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74  the columns of t
e680: 68 65 20 46 54 53 20 74 61 62 6c 65 20 61 72 65  he FTS table are
e690: 20 6e 75 6d 62 65 72 65 64 0a 20 20 20 20 66 72   numbered.    fr
e6a0: 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74  om left to right
e6b0: 2c 20 73 74 61 72 74 69 6e 67 20 77 69 74 68 20  , starting with 
e6c0: 7a 65 72 6f 2e 0a 0a 20 20 3c 74 72 3e 3c 74 64  zero...  <tr><td
e6d0: 3e 6f 63 63 75 72 72 65 6e 63 65 73 3c 74 64 3e  >occurrences<td>
e6e0: 0a 20 20 20 20 54 68 69 73 20 63 6f 6c 75 6d 6e  .    This column
e6f0: 20 61 6c 73 6f 20 61 6c 77 61 79 73 20 63 6f 6e   also always con
e700: 74 61 69 6e 73 20 61 6e 20 69 6e 74 65 67 65 72  tains an integer
e710: 20 76 61 6c 75 65 20 67 72 65 61 74 65 72 20 74   value greater t
e720: 68 61 6e 20 7a 65 72 6f 2e 0a 20 20 20 20 3c 62  han zero..    <b
e730: 72 3e 3c 62 72 3e 0a 20 20 20 20 49 66 20 74 68  r><br>.    If th
e740: 65 20 22 63 6f 6c 22 20 63 6f 6c 75 6d 6e 20 63  e "col" column c
e750: 6f 6e 74 61 69 6e 73 20 74 68 65 20 76 61 6c 75  ontains the valu
e760: 65 20 27 2a 27 2c 20 74 68 65 6e 20 74 68 69 73  e '*', then this
e770: 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 63 6f 6e 74   column.    cont
e780: 61 69 6e 73 20 74 68 65 20 74 6f 74 61 6c 20 6e  ains the total n
e790: 75 6d 62 65 72 20 6f 66 20 69 6e 73 74 61 6e 63  umber of instanc
e7a0: 65 73 20 6f 66 20 74 68 65 20 74 65 72 6d 20 69  es of the term i
e7b0: 6e 20 61 6c 6c 20 72 6f 77 73 20 6f 66 20 74 68  n all rows of th
e7c0: 65 20 0a 20 20 20 20 46 54 53 20 74 61 62 6c 65  e .    FTS table
e7d0: 20 28 69 6e 20 61 6e 79 20 63 6f 6c 75 6d 6e 29   (in any column)
e7e0: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  . Otherwise, if 
e7f0: 63 6f 6c 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20  col contains an 
e800: 69 6e 74 65 67 65 72 0a 20 20 20 20 76 61 6c 75  integer.    valu
e810: 65 2c 20 74 68 65 6e 20 74 68 69 73 20 63 6f 6c  e, then this col
e820: 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  umn contains the
e830: 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
e840: 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68   instances of th
e850: 65 0a 20 20 20 20 74 65 72 6d 20 74 68 61 74 20  e.    term that 
e860: 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 46 54  appear in the FT
e870: 53 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 69  S table column i
e880: 64 65 6e 74 69 66 69 65 64 20 62 79 20 74 68 65  dentified by the
e890: 20 63 6f 6c 0a 20 20 20 20 76 61 6c 75 65 2e 0a   col.    value..
e8a0: 3c 2f 74 61 62 6c 65 3e 0a 0a 3c 70 3e 0a 20 20  </table>..<p>.  
e8b0: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 75 73 69  For example, usi
e8c0: 6e 67 20 74 68 65 20 74 61 62 6c 65 73 20 63 72  ng the tables cr
e8d0: 65 61 74 65 64 20 61 62 6f 76 65 3a 0a 0a 3c 63  eated above:..<c
e8e0: 6f 64 65 62 6c 6f 63 6b 3e 0a 20 20 49 4e 53 45  odeblock>.  INSE
e8f0: 52 54 20 49 4e 54 4f 20 66 74 28 78 2c 20 79 29  RT INTO ft(x, y)
e900: 20 56 41 4c 55 45 53 28 27 41 70 70 6c 65 20 62   VALUES('Apple b
e910: 61 6e 61 6e 61 27 2c 20 27 43 68 65 72 72 79 27  anana', 'Cherry'
e920: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
e930: 20 66 74 28 78 2c 20 79 29 20 56 41 4c 55 45 53   ft(x, y) VALUES
e940: 28 27 42 61 6e 61 6e 61 20 44 61 74 65 20 44 61  ('Banana Date Da
e950: 74 65 27 2c 20 27 63 68 65 72 72 79 27 29 3b 0a  te', 'cherry');.
e960: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 66 74    INSERT INTO ft
e970: 28 78 2c 20 79 29 20 56 41 4c 55 45 53 28 27 43  (x, y) VALUES('C
e980: 68 65 72 72 79 20 45 6c 64 65 72 62 65 72 72 79  herry Elderberry
e990: 27 2c 20 27 45 6c 64 65 72 62 65 72 72 79 27 29  ', 'Elderberry')
e9a0: 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 54 68 65 20 66  ;..  <i>-- The f
e9b0: 6f 6c 6c 6f 77 69 6e 67 20 71 75 65 72 79 20 72  ollowing query r
e9c0: 65 74 75 72 6e 73 20 74 68 69 73 20 64 61 74 61  eturns this data
e9d0: 3a 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 3c 2f 69  :</i>.  <i>--</i
e9e0: 3e 0a 20 20 3c 69 3e 2d 2d 20 20 20 20 20 61 70  >.  <i>--     ap
e9f0: 70 6c 65 20 20 20 20 20 20 20 7c 20 20 2a 20 20  ple       |  *  
ea00: 7c 20 20 31 20 20 7c 20 20 31 3c 2f 69 3e 0a 20  |  1  |  1</i>. 
ea10: 20 3c 69 3e 2d 2d 20 20 20 20 20 61 70 70 6c 65   <i>--     apple
ea20: 20 20 20 20 20 20 20 7c 20 20 30 20 20 7c 20 20         |  0  |  
ea30: 31 20 20 7c 20 20 31 3c 2f 69 3e 0a 20 20 3c 69  1  |  1</i>.  <i
ea40: 3e 2d 2d 20 20 20 20 20 62 61 6e 61 6e 61 20 20  >--     banana  
ea50: 20 20 20 20 7c 20 20 2a 20 20 7c 20 20 32 20 20      |  *  |  2  
ea60: 7c 20 20 32 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d  |  2</i>.  <i>--
ea70: 20 20 20 20 20 62 61 6e 61 6e 61 20 20 20 20 20       banana     
ea80: 20 7c 20 20 30 20 20 7c 20 20 32 20 20 7c 20 20   |  0  |  2  |  
ea90: 32 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 20 20  2</i>.  <i>--   
eaa0: 20 20 63 68 65 72 72 79 20 20 20 20 20 20 7c 20    cherry      | 
eab0: 20 2a 20 20 7c 20 20 33 20 20 7c 20 20 33 3c 2f   *  |  3  |  3</
eac0: 69 3e 0a 20 20 3c 69 3e 2d 2d 20 20 20 20 20 63  i>.  <i>--     c
ead0: 68 65 72 72 79 20 20 20 20 20 20 7c 20 20 30 20  herry      |  0 
eae0: 20 7c 20 20 31 20 20 7c 20 20 31 3c 2f 69 3e 0a   |  1  |  1</i>.
eaf0: 20 20 3c 69 3e 2d 2d 20 20 20 20 20 63 68 65 72    <i>--     cher
eb00: 72 79 20 20 20 20 20 20 7c 20 20 31 20 20 7c 20  ry      |  1  | 
eb10: 20 32 20 20 7c 20 20 32 3c 2f 69 3e 0a 20 20 3c   2  |  2</i>.  <
eb20: 69 3e 2d 2d 20 20 20 20 20 64 61 74 65 20 20 20  i>--     date   
eb30: 20 20 20 20 20 7c 20 20 2a 20 20 7c 20 20 31 20       |  *  |  1 
eb40: 20 7c 20 20 32 3c 2f 69 3e 0a 20 20 3c 69 3e 2d   |  2</i>.  <i>-
eb50: 2d 20 20 20 20 20 64 61 74 65 20 20 20 20 20 20  -     date      
eb60: 20 20 7c 20 20 30 20 20 7c 20 20 31 20 20 7c 20    |  0  |  1  | 
eb70: 20 32 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 20   2</i>.  <i>--  
eb80: 20 20 20 65 6c 64 65 72 62 65 72 72 79 20 20 7c     elderberry  |
eb90: 20 20 2a 20 20 7c 20 20 31 20 20 7c 20 20 32 3c    *  |  1  |  2<
eba0: 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 20 20 20 20  /i>.  <i>--     
ebb0: 65 6c 64 65 72 62 65 72 72 79 20 20 7c 20 20 31  elderberry  |  1
ebc0: 20 20 7c 20 20 31 20 20 7c 20 20 31 3c 2f 69 3e    |  1  |  1</i>
ebd0: 0a 20 20 3c 69 3e 2d 2d 20 20 20 20 20 65 6c 64  .  <i>--     eld
ebe0: 65 72 62 65 72 72 79 20 20 7c 20 20 31 20 20 7c  erberry  |  1  |
ebf0: 20 20 31 20 20 7c 20 20 31 3c 2f 69 3e 0a 20 20    1  |  1</i>.  
ec00: 3c 69 3e 2d 2d 3c 2f 69 3e 0a 20 20 53 45 4c 45  <i>--</i>.  SELE
ec10: 43 54 20 74 65 72 6d 2c 20 63 6f 6c 2c 20 64 6f  CT term, col, do
ec20: 63 75 6d 65 6e 74 73 2c 20 6f 63 63 75 72 72 65  cuments, occurre
ec30: 6e 63 65 73 20 46 52 4f 4d 20 66 74 5f 74 65 72  nces FROM ft_ter
ec40: 6d 73 3b 0a 3c 2f 63 6f 64 65 62 6c 6f 63 6b 3e  ms;.</codeblock>
ec50: 0a 0a 3c 70 3e 0a 20 20 49 6e 20 74 68 65 20 65  ..<p>.  In the e
ec60: 78 61 6d 70 6c 65 2c 20 74 68 65 20 76 61 6c 75  xample, the valu
ec70: 65 73 20 69 6e 20 74 68 65 20 22 74 65 72 6d 22  es in the "term"
ec80: 20 63 6f 6c 75 6d 6e 20 61 72 65 20 61 6c 6c 20   column are all 
ec90: 6c 6f 77 65 72 20 63 61 73 65 2c 20 0a 20 20 65  lower case, .  e
eca0: 76 65 6e 20 74 68 6f 75 67 68 20 74 68 65 79 20  ven though they 
ecb0: 77 65 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e  were inserted in
ecc0: 74 6f 20 74 61 62 6c 65 20 22 66 74 22 20 69 6e  to table "ft" in
ecd0: 20 6d 69 78 65 64 20 63 61 73 65 2e 20 54 68 69   mixed case. Thi
ece0: 73 20 69 73 20 62 65 63 61 75 73 65 0a 20 20 61  s is because.  a
ecf0: 6e 20 66 74 73 33 61 75 78 20 74 61 62 6c 65 20  n fts3aux table 
ed00: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 74 65 72  contains the ter
ed10: 6d 73 20 61 73 20 65 78 74 72 61 63 74 65 64 20  ms as extracted 
ed20: 66 72 6f 6d 20 74 68 65 20 64 6f 63 75 6d 65 6e  from the documen
ed30: 74 20 74 65 78 74 0a 20 20 62 79 20 74 68 65 20  t text.  by the 
ed40: 5b 74 6f 6b 65 6e 69 7a 65 72 5d 2e 20 49 6e 20  [tokenizer]. In 
ed50: 74 68 69 73 20 63 61 73 65 2c 20 73 69 6e 63 65  this case, since
ed60: 20 74 61 62 6c 65 20 22 66 74 22 20 75 73 65 73   table "ft" uses
ed70: 20 74 68 65 20 0a 20 20 5b 74 6f 6b 65 6e 69 7a   the .  [tokeniz
ed80: 65 72 7c 73 69 6d 70 6c 65 20 74 6f 6b 65 6e 69  er|simple tokeni
ed90: 7a 65 72 5d 2c 20 74 68 69 73 20 6d 65 61 6e 73  zer], this means
eda0: 20 61 6c 6c 20 74 65 72 6d 73 20 68 61 76 65 20   all terms have 
edb0: 62 65 65 6e 20 66 6f 6c 64 65 64 20 74 6f 0a 20  been folded to. 
edc0: 20 6c 6f 77 65 72 20 63 61 73 65 2e 20 41 6c 73   lower case. Als
edd0: 6f 2c 20 74 68 65 72 65 20 69 73 20 28 66 6f 72  o, there is (for
ede0: 20 65 78 61 6d 70 6c 65 29 20 6e 6f 20 72 6f 77   example) no row
edf0: 20 77 69 74 68 20 63 6f 6c 75 6d 6e 20 22 74 65   with column "te
ee00: 72 6d 22 0a 20 20 73 65 74 20 74 6f 20 22 61 70  rm".  set to "ap
ee10: 70 6c 65 22 20 61 6e 64 20 63 6f 6c 75 6d 6e 20  ple" and column 
ee20: 22 63 6f 6c 22 20 73 65 74 20 74 6f 20 31 2e 20  "col" set to 1. 
ee30: 53 69 6e 63 65 20 74 68 65 72 65 20 61 72 65 20  Since there are 
ee40: 6e 6f 20 69 6e 73 74 61 6e 63 65 73 0a 20 20 6f  no instances.  o
ee50: 66 20 74 68 65 20 74 65 72 6d 20 22 61 70 70 6c  f the term "appl
ee60: 65 22 20 69 6e 20 63 6f 6c 75 6d 6e 20 31 2c 20  e" in column 1, 
ee70: 6e 6f 20 72 6f 77 20 69 73 20 70 72 65 73 65 6e  no row is presen
ee80: 74 20 69 6e 20 74 68 65 20 66 74 73 34 61 75 78  t in the fts4aux
ee90: 20 74 61 62 6c 65 2e 0a 0a 3c 70 3e 0a 20 20 44   table...<p>.  D
eea0: 75 72 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74  uring a transact
eeb0: 69 6f 6e 2c 20 73 6f 6d 65 20 6f 66 20 74 68 65  ion, some of the
eec0: 20 64 61 74 61 20 77 72 69 74 74 65 6e 20 74 6f   data written to
eed0: 20 61 6e 20 46 54 53 20 74 61 62 6c 65 20 6d 61   an FTS table ma
eee0: 79 20 62 65 20 0a 20 20 63 61 63 68 65 64 20 69  y be .  cached i
eef0: 6e 20 6d 65 6d 6f 72 79 20 61 6e 64 20 77 72 69  n memory and wri
ef00: 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61  tten to the data
ef10: 62 61 73 65 20 6f 6e 6c 79 20 77 68 65 6e 20 74  base only when t
ef20: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  he transaction i
ef30: 73 20 0a 20 20 63 6f 6d 6d 69 74 74 65 64 2e 20  s .  committed. 
ef40: 48 6f 77 65 76 65 72 20 74 68 65 20 69 6d 70 6c  However the impl
ef50: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
ef60: 65 20 66 74 73 34 61 75 78 20 6d 6f 64 75 6c 65  e fts4aux module
ef70: 20 69 73 20 6f 6e 6c 79 20 61 62 6c 65 20 0a 20   is only able . 
ef80: 20 74 6f 20 72 65 61 64 20 64 61 74 61 20 66 72   to read data fr
ef90: 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  om the database.
efa0: 20 49 6e 20 70 72 61 63 74 69 63 65 20 74 68 69   In practice thi
efb0: 73 20 6d 65 61 6e 73 20 74 68 61 74 20 69 66 20  s means that if 
efc0: 61 6e 20 66 74 73 34 61 75 78 20 0a 20 20 74 61  an fts4aux .  ta
efd0: 62 6c 65 20 69 73 20 71 75 65 72 69 65 64 20 66  ble is queried f
efe0: 72 6f 6d 20 77 69 74 68 69 6e 20 61 20 74 72 61  rom within a tra
eff0: 6e 73 61 63 74 69 6f 6e 20 69 6e 20 77 68 69 63  nsaction in whic
f000: 68 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64  h the associated
f010: 20 0a 20 20 46 54 53 20 74 61 62 6c 65 20 68 61   .  FTS table ha
f020: 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2c  s been modified,
f030: 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20   the results of 
f040: 74 68 65 20 71 75 65 72 79 20 61 72 65 20 6c 69  the query are li
f050: 6b 65 6c 79 20 74 6f 20 72 65 66 6c 65 63 74 20  kely to reflect 
f060: 0a 20 20 6f 6e 6c 79 20 61 20 28 70 6f 73 73 69  .  only a (possi
f070: 62 6c 79 20 65 6d 70 74 79 29 20 73 75 62 73 65  bly empty) subse
f080: 74 20 6f 66 20 74 68 65 20 63 68 61 6e 67 65 73  t of the changes
f090: 20 6d 61 64 65 2e 0a 0a 3c 68 31 20 69 64 3d 66   made...<h1 id=f
f0a0: 74 73 34 5f 6f 70 74 69 6f 6e 73 20 74 61 67 73  ts4_options tags
f0b0: 3d 22 46 54 53 34 20 6f 70 74 69 6f 6e 73 22 3e  ="FTS4 options">
f0c0: 46 54 53 34 20 4f 70 74 69 6f 6e 73 3c 2f 68 31  FTS4 Options</h1
f0d0: 3e 0a 0a 3c 70 3e 0a 20 20 49 66 20 74 68 65 20  >..<p>.  If the 
f0e0: 22 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20  "CREATE VIRTUAL 
f0f0: 54 41 42 4c 45 22 20 73 74 61 74 65 6d 65 6e 74  TABLE" statement
f100: 20 73 70 65 63 69 66 69 65 73 20 6d 6f 64 75 6c   specifies modul
f110: 65 20 46 54 53 34 20 28 6e 6f 74 20 46 54 53 33  e FTS4 (not FTS3
f120: 29 2c 20 0a 20 20 74 68 65 6e 20 73 70 65 63 69  ), .  then speci
f130: 61 6c 20 64 69 72 65 63 74 69 76 65 73 20 2d 20  al directives - 
f140: 46 54 53 34 20 6f 70 74 69 6f 6e 73 20 2d 20 73  FTS4 options - s
f150: 69 6d 69 6c 61 72 20 74 6f 20 74 68 65 20 22 74  imilar to the "t
f160: 6f 6b 65 6e 69 7a 65 3d 2a 22 20 6f 70 74 69 6f  okenize=*" optio
f170: 6e 0a 20 20 6d 61 79 20 61 6c 73 6f 20 61 70 70  n.  may also app
f180: 65 61 72 20 69 6e 20 70 6c 61 63 65 20 6f 66 20  ear in place of 
f190: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e 20 41 6e  column names. An
f1a0: 20 46 54 53 34 20 6f 70 74 69 6f 6e 20 63 6f 6e   FTS4 option con
f1b0: 73 69 73 74 73 20 6f 66 20 74 68 65 0a 20 20 6f  sists of the.  o
f1c0: 70 74 69 6f 6e 20 6e 61 6d 65 2c 20 66 6f 6c 6c  ption name, foll
f1d0: 6f 77 65 64 20 62 79 20 61 6e 20 22 3d 22 20 63  owed by an "=" c
f1e0: 68 61 72 61 63 74 65 72 2c 20 66 6f 6c 6c 6f 77  haracter, follow
f1f0: 65 64 20 62 79 20 74 68 65 20 6f 70 74 69 6f 6e  ed by the option
f200: 20 76 61 6c 75 65 2e 0a 20 20 54 68 65 20 6f 70   value..  The op
f210: 74 69 6f 6e 20 76 61 6c 75 65 20 6d 61 79 20 6f  tion value may o
f220: 70 74 69 6f 6e 61 6c 6c 79 20 62 65 20 65 6e 63  ptionally be enc
f230: 6c 6f 73 65 64 20 69 6e 20 73 69 6e 67 6c 65 20  losed in single 
f240: 6f 72 20 64 6f 75 62 6c 65 20 71 75 6f 74 65 73  or double quotes
f250: 2c 20 77 69 74 68 0a 20 20 65 6d 62 65 64 64 65  , with.  embedde
f260: 64 20 71 75 6f 74 65 20 63 68 61 72 61 63 74 65  d quote characte
f270: 72 73 20 65 73 63 61 70 65 64 20 69 6e 20 74 68  rs escaped in th
f280: 65 20 73 61 6d 65 20 77 61 79 20 61 73 20 66 6f  e same way as fo
f290: 72 20 53 51 4c 20 6c 69 74 65 72 61 6c 73 2e 20  r SQL literals. 
f2a0: 54 68 65 72 65 0a 20 20 6d 61 79 20 6e 6f 74 20  There.  may not 
f2b0: 62 65 20 77 68 69 74 65 73 70 61 63 65 20 6f 6e  be whitespace on
f2c0: 20 65 69 74 68 65 72 20 73 69 64 65 20 6f 66 20   either side of 
f2d0: 74 68 65 20 22 3d 22 20 63 68 61 72 61 63 74 65  the "=" characte
f2e0: 72 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 0a  r. For example,.
f2f0: 20 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20 46    to create an F
f300: 54 53 34 20 74 61 62 6c 65 20 77 69 74 68 20 74  TS4 table with t
f310: 68 65 20 76 61 6c 75 65 20 6f 66 20 6f 70 74 69  he value of opti
f320: 6f 6e 20 22 6d 61 74 63 68 69 6e 66 6f 22 20 73  on "matchinfo" s
f330: 65 74 20 74 6f 20 22 66 74 73 33 22 3a 0a 0a 3c  et to "fts3":..<
f340: 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20 20 3c 69 3e  codeblock>.  <i>
f350: 2d 2d 20 43 72 65 61 74 65 20 61 20 72 65 64 75  -- Create a redu
f360: 63 65 64 2d 66 6f 6f 74 70 72 69 6e 74 20 46 54  ced-footprint FT
f370: 53 34 20 74 61 62 6c 65 2e 3c 2f 69 3e 0a 20 20  S4 table.</i>.  
f380: 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54  CREATE VIRTUAL T
f390: 41 42 4c 45 20 70 61 70 65 72 73 20 55 53 49 4e  ABLE papers USIN
f3a0: 47 20 66 74 73 34 28 61 75 74 68 6f 72 2c 20 64  G fts4(author, d
f3b0: 6f 63 75 6d 65 6e 74 2c 20 6d 61 74 63 68 69 6e  ocument, matchin
f3c0: 66 6f 3d 66 74 73 33 29 3b 0a 3c 2f 63 6f 64 65  fo=fts3);.</code
f3d0: 62 6c 6f 63 6b 3e 0a 0a 3c 70 3e 0a 20 20 46 54  block>..<p>.  FT
f3e0: 53 34 20 63 75 72 72 65 6e 74 6c 79 20 73 75 70  S4 currently sup
f3f0: 70 6f 72 74 73 20 74 68 65 20 66 6f 6c 6c 6f 77  ports the follow
f400: 69 6e 67 20 6f 70 74 69 6f 6e 73 3a 0a 0a 3c 74  ing options:..<t
f410: 61 62 6c 65 20 73 74 72 69 70 65 64 3d 31 3e 0a  able striped=1>.
f420: 20 20 3c 74 72 3e 3c 74 68 3e 4f 70 74 69 6f 6e    <tr><th>Option
f430: 3c 74 68 3e 49 6e 74 65 72 70 72 65 74 61 74 69  <th>Interpretati
f440: 6f 6e 0a 20 20 3c 74 72 3e 3c 74 64 3e 63 6f 6d  on.  <tr><td>com
f450: 70 72 65 73 73 3c 74 64 3e 0a 20 20 20 20 5e 54  press<td>.    ^T
f460: 68 65 20 63 6f 6d 70 72 65 73 73 20 6f 70 74 69  he compress opti
f470: 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 73 70  on is used to sp
f480: 65 63 69 66 79 20 74 68 65 20 63 6f 6d 70 72 65  ecify the compre
f490: 73 73 20 66 75 6e 63 74 69 6f 6e 2e 20 5e 49 74  ss function. ^It
f4a0: 20 69 73 20 61 6e 20 65 72 72 6f 72 20 74 6f 0a   is an error to.
f4b0: 20 20 20 20 73 70 65 63 69 66 79 20 61 20 63 6f      specify a co
f4c0: 6d 70 72 65 73 73 20 66 75 6e 63 74 69 6f 6e 20  mpress function 
f4d0: 77 69 74 68 6f 75 74 20 61 6c 73 6f 20 73 70 65  without also spe
f4e0: 63 69 66 79 69 6e 67 20 61 6e 20 75 6e 63 6f 6d  cifying an uncom
f4f0: 70 72 65 73 73 0a 20 20 20 20 66 75 6e 63 74 69  press.    functi
f500: 6f 6e 2e 20 5b 66 74 73 34 20 63 6f 6d 70 72 65  on. [fts4 compre
f510: 73 73 20 6f 70 74 69 6f 6e 7c 53 65 65 20 62 65  ss option|See be
f520: 6c 6f 77 5d 20 66 6f 72 20 64 65 74 61 69 6c 73  low] for details
f530: 2e 0a 0a 20 20 3c 74 72 3e 3c 74 64 3e 63 6f 6e  ...  <tr><td>con
f540: 74 65 6e 74 3c 74 64 3e 0a 20 20 20 20 5e 54 68  tent<td>.    ^Th
f550: 65 20 63 6f 6e 74 65 6e 74 20 61 6c 6c 6f 77 73  e content allows
f560: 20 74 68 65 20 74 65 78 74 20 62 65 69 6e 67 20   the text being 
f570: 69 6e 64 65 78 65 64 20 74 6f 0a 20 20 20 20 73  indexed to.    s
f580: 74 6f 72 65 64 20 69 6e 20 61 20 73 65 70 61 72  tored in a separ
f590: 61 74 65 20 74 61 62 6c 65 20 64 69 73 74 69 6e  ate table distin
f5a0: 63 74 20 66 72 6f 6d 20 74 68 65 20 46 54 53 34  ct from the FTS4
f5b0: 20 74 61 62 6c 65 2c 20 6f 72 20 0a 20 20 20 20   table, or .    
f5c0: 6f 72 20 65 76 65 6e 20 6f 75 74 73 69 64 65 20  or even outside 
f5d0: 6f 66 20 53 51 4c 69 74 65 2e 0a 0a 20 20 3c 74  of SQLite...  <t
f5e0: 72 3e 3c 74 64 3e 6c 61 6e 67 75 61 67 65 69 64  r><td>languageid
f5f0: 3c 74 64 3e 0a 20 20 20 20 5e 54 68 65 20 6c 61  <td>.    ^The la
f600: 6e 67 75 61 67 65 69 64 20 6f 70 74 69 6f 6e 20  nguageid option 
f610: 63 61 75 73 65 73 20 74 68 65 20 46 54 53 34 20  causes the FTS4 
f620: 74 61 62 6c 65 20 74 6f 20 68 61 76 65 20 61 6e  table to have an
f630: 20 61 64 64 69 74 69 6f 6e 61 6c 20 68 69 64 64   additional hidd
f640: 65 6e 0a 20 20 20 20 69 6e 74 65 67 65 72 20 63  en.    integer c
f650: 6f 6c 75 6d 6e 20 74 68 61 74 20 69 64 65 6e 74  olumn that ident
f660: 69 66 69 65 73 20 74 68 65 20 6c 61 6e 67 75 61  ifies the langua
f670: 67 65 20 6f 66 20 74 68 65 20 74 65 78 74 20 63  ge of the text c
f680: 6f 6e 74 61 69 6e 65 64 20 69 6e 0a 20 20 20 20  ontained in.    
f690: 65 61 63 68 20 72 6f 77 2e 20 20 54 68 65 20 75  each row.  The u
f6a0: 73 65 20 6f 66 20 74 68 65 20 6c 61 6e 67 75 61  se of the langua
f6b0: 67 65 69 64 20 6f 70 74 69 6f 6e 20 61 6c 6c 6f  geid option allo
f6c0: 77 73 20 74 68 65 20 73 61 6d 65 20 46 54 53 34  ws the same FTS4
f6d0: 20 74 61 62 6c 65 0a 20 20 20 20 74 6f 20 68 6f   table.    to ho
f6e0: 6c 64 20 74 65 78 74 20 69 6e 20 6d 75 6c 74 69  ld text in multi
f6f0: 70 6c 65 20 6c 61 6e 67 75 61 67 65 73 20 6f 72  ple languages or
f700: 20 73 63 72 69 70 74 73 2c 20 65 61 63 68 20 77   scripts, each w
f710: 69 74 68 20 64 69 66 66 65 72 65 6e 74 20 74 6f  ith different to
f720: 6b 65 6e 69 7a 65 72 0a 20 20 20 20 72 75 6c 65  kenizer.    rule
f730: 73 2c 20 61 6e 64 20 74 6f 20 71 75 65 72 79 20  s, and to query 
f740: 65 61 63 68 20 6c 61 6e 67 75 61 67 65 20 69 6e  each language in
f750: 64 65 70 65 6e 64 65 6e 74 6c 79 20 6f 66 20 74  dependently of t
f760: 68 65 20 6f 74 68 65 72 73 2e 0a 20 20 20 20 0a  he others..    .
f770: 20 20 3c 74 72 3e 3c 74 64 3e 6d 61 74 63 68 69    <tr><td>matchi
f780: 6e 66 6f 3c 74 64 3e 20 0a 20 20 20 20 57 68 65  nfo<td> .    Whe
f790: 6e 20 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c  n set to the val
f7a0: 75 65 20 22 66 74 73 33 22 2c 20 74 68 65 20 6d  ue "fts3", the m
f7b0: 61 74 63 68 69 6e 66 6f 20 6f 70 74 69 6f 6e 20  atchinfo option 
f7c0: 72 65 64 75 63 65 73 20 74 68 65 20 61 6d 6f 75  reduces the amou
f7d0: 6e 74 20 6f 66 0a 20 20 20 20 69 6e 66 6f 72 6d  nt of.    inform
f7e0: 61 74 69 6f 6e 20 73 74 6f 72 65 64 20 62 79 20  ation stored by 
f7f0: 46 54 53 34 20 77 69 74 68 20 74 68 65 20 63 6f  FTS4 with the co
f800: 6e 73 65 71 75 65 6e 63 65 20 74 68 61 74 20 74  nsequence that t
f810: 68 65 20 22 6c 22 20 6f 70 74 69 6f 6e 20 6f 66  he "l" option of
f820: 0a 20 20 20 20 5b 6d 61 74 63 68 69 6e 66 6f 28  .    [matchinfo(
f830: 29 5d 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20  )] is no longer 
f840: 61 76 61 69 6c 61 62 6c 65 2e 0a 0a 20 20 3c 74  available...  <t
f850: 72 3e 3c 74 64 3e 6f 72 64 65 72 3c 74 64 3e 0a  r><td>order<td>.
f860: 20 20 20 20 3c 74 63 6c 3e 68 64 5f 66 72 61 67      <tcl>hd_frag
f870: 6d 65 6e 74 20 66 74 73 34 6f 72 64 65 72 20 7b  ment fts4order {
f880: 46 54 53 34 20 6f 72 64 65 72 20 6f 70 74 69 6f  FTS4 order optio
f890: 6e 7d 3c 2f 74 63 6c 3e 0a 20 20 20 20 5e 54 68  n}</tcl>.    ^Th
f8a0: 65 20 22 6f 72 64 65 72 22 20 6f 70 74 69 6f 6e  e "order" option
f8b0: 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20 65   may be set to e
f8c0: 69 74 68 65 72 20 22 44 45 53 43 22 20 6f 72 20  ither "DESC" or 
f8d0: 22 41 53 43 22 20 28 69 6e 20 75 70 70 65 72 20  "ASC" (in upper 
f8e0: 6f 72 0a 20 20 20 20 6c 6f 77 65 72 20 63 61 73  or.    lower cas
f8f0: 65 29 2e 20 5e 49 66 20 69 74 20 69 73 20 73 65  e). ^If it is se
f900: 74 20 74 6f 20 22 44 45 53 43 22 2c 20 74 68 65  t to "DESC", the
f910: 6e 20 46 54 53 34 20 73 74 6f 72 65 73 20 69 74  n FTS4 stores it
f920: 73 20 64 61 74 61 20 69 6e 20 73 75 63 68 0a 20  s data in such. 
f930: 20 20 20 61 20 77 61 79 20 61 73 20 74 6f 20 6f     a way as to o
f940: 70 74 69 6d 69 7a 65 20 72 65 74 75 72 6e 69 6e  ptimize returnin
f950: 67 20 72 65 73 75 6c 74 73 20 69 6e 20 64 65 73  g results in des
f960: 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 62 79  cending order by
f970: 20 64 6f 63 69 64 2e 0a 20 20 20 20 5e 49 66 20   docid..    ^If 
f980: 69 74 20 69 73 20 73 65 74 20 74 6f 20 22 41 53  it is set to "AS
f990: 43 22 20 28 74 68 65 20 64 65 66 61 75 6c 74 29  C" (the default)
f9a0: 2c 20 74 68 65 6e 20 74 68 65 20 64 61 74 61 20  , then the data 
f9b0: 73 74 72 75 63 74 75 72 65 73 20 61 72 65 20 0a  structures are .
f9c0: 20 20 20 20 6f 70 74 69 6d 69 7a 65 64 20 66 6f      optimized fo
f9d0: 72 20 72 65 74 75 72 6e 69 6e 67 20 72 65 73 75  r returning resu
f9e0: 6c 74 73 20 69 6e 20 61 73 63 65 6e 64 69 6e 67  lts in ascending
f9f0: 20 6f 72 64 65 72 20 62 79 20 64 6f 63 69 64 2e   order by docid.
fa00: 20 20 5e 49 6e 20 6f 74 68 65 72 0a 20 20 20 20    ^In other.    
fa10: 77 6f 72 64 73 2c 20 69 66 20 6d 61 6e 79 20 6f  words, if many o
fa20: 66 20 74 68 65 20 71 75 65 72 69 65 73 20 72 75  f the queries ru
fa30: 6e 20 61 67 61 69 6e 73 74 20 74 68 65 20 46 54  n against the FT
fa40: 53 34 20 74 61 62 6c 65 20 75 73 65 20 22 4f 52  S4 table use "OR
fa50: 44 45 52 20 42 59 0a 20 20 20 20 64 6f 63 69 64  DER BY.    docid
fa60: 20 44 45 53 43 22 2c 20 74 68 65 6e 20 69 74 20   DESC", then it 
fa70: 6d 61 79 20 69 6d 70 72 6f 76 65 20 70 65 72 66  may improve perf
fa80: 6f 72 6d 61 6e 63 65 20 74 6f 20 61 64 64 20 74  ormance to add t
fa90: 68 65 20 22 6f 72 64 65 72 3d 64 65 73 63 22 20  he "order=desc" 
faa0: 0a 20 20 20 20 6f 70 74 69 6f 6e 20 74 6f 20 74  .    option to t
fab0: 68 65 20 43 52 45 41 54 45 20 56 49 52 54 55 41  he CREATE VIRTUA
fac0: 4c 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  L TABLE statemen
fad0: 74 2e 0a 0a 20 20 3c 74 72 3e 3c 74 64 3e 70 72  t...  <tr><td>pr
fae0: 65 66 69 78 3c 74 64 3e 0a 20 20 20 20 54 68 69  efix<td>.    Thi
faf0: 73 20 6f 70 74 69 6f 6e 20 6d 61 79 20 62 65 20  s option may be 
fb00: 73 65 74 20 74 6f 20 61 20 63 6f 6d 6d 61 2d 73  set to a comma-s
fb10: 65 70 61 72 61 74 65 64 20 6c 69 73 74 20 6f 66  eparated list of
fb20: 20 70 6f 73 69 74 69 76 65 20 6e 6f 6e 2d 7a 65   positive non-ze
fb30: 72 6f 20 0a 20 20 20 20 69 6e 74 65 67 65 72 73  ro .    integers
fb40: 2e 20 46 6f 72 20 65 61 63 68 20 69 6e 74 65 67  . For each integ
fb50: 65 72 20 4e 20 69 6e 20 74 68 65 20 6c 69 73 74  er N in the list
fb60: 2c 20 61 20 73 65 70 61 72 61 74 65 20 69 6e 64  , a separate ind
fb70: 65 78 20 69 73 20 63 72 65 61 74 65 64 0a 20 20  ex is created.  
fb80: 20 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73    in the databas
fb90: 65 20 66 69 6c 65 20 74 6f 20 6f 70 74 69 6d 69  e file to optimi
fba0: 7a 65 20 5b 70 72 65 66 69 78 20 71 75 65 72 69  ze [prefix queri
fbb0: 65 73 5d 20 77 68 65 72 65 0a 20 20 20 20 74 68  es] where.    th
fbc0: 65 20 71 75 65 72 79 20 74 65 72 6d 20 69 73 20  e query term is 
fbd0: 4e 20 62 79 74 65 73 20 69 6e 20 6c 65 6e 67 74  N bytes in lengt
fbe0: 68 2c 20 6e 6f 74 20 69 6e 63 6c 75 64 69 6e 67  h, not including
fbf0: 20 74 68 65 20 27 2a 27 20 63 68 61 72 61 63 74   the '*' charact
fc00: 65 72 2c 0a 20 20 20 20 77 68 65 6e 20 65 6e 63  er,.    when enc
fc10: 6f 64 65 64 20 75 73 69 6e 67 20 55 54 46 2d 38  oded using UTF-8
fc20: 2e 20 5b 66 74 73 34 20 70 72 65 66 69 78 20 6f  . [fts4 prefix o
fc30: 70 74 69 6f 6e 7c 53 65 65 20 62 65 6c 6f 77 5d  ption|See below]
fc40: 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 0a 20   for details... 
fc50: 20 3c 74 72 3e 3c 74 64 3e 75 6e 63 6f 6d 70 72   <tr><td>uncompr
fc60: 65 73 73 3c 74 64 3e 0a 20 20 20 20 54 68 69 73  ess<td>.    This
fc70: 20 6f 70 74 69 6f 6e 20 69 73 20 75 73 65 64 20   option is used 
fc80: 74 6f 20 73 70 65 63 69 66 79 20 74 68 65 20 75  to specify the u
fc90: 6e 63 6f 6d 70 72 65 73 73 20 66 75 6e 63 74 69  ncompress functi
fca0: 6f 6e 2e 20 49 74 20 69 73 20 61 6e 20 65 72 72  on. It is an err
fcb0: 6f 72 20 74 6f 0a 20 20 20 20 73 70 65 63 69 66  or to.    specif
fcc0: 79 20 61 6e 20 75 6e 63 6f 6d 70 72 65 73 73 20  y an uncompress 
fcd0: 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 6f 75 74  function without
fce0: 20 61 6c 73 6f 20 73 70 65 63 69 66 79 69 6e 67   also specifying
fcf0: 20 61 20 63 6f 6d 70 72 65 73 73 0a 20 20 20 20   a compress.    
fd00: 66 75 6e 63 74 69 6f 6e 2e 20 5b 66 74 73 34 20  function. [fts4 
fd10: 63 6f 6d 70 72 65 73 73 20 6f 70 74 69 6f 6e 7c  compress option|
fd20: 53 65 65 20 62 65 6c 6f 77 5d 20 66 6f 72 20 64  See below] for d
fd30: 65 74 61 69 6c 73 2e 0a 3c 2f 74 61 62 6c 65 3e  etails..</table>
fd40: 0a 0a 3c 70 3e 0a 20 20 57 68 65 6e 20 75 73 69  ..<p>.  When usi
fd50: 6e 67 20 46 54 53 34 2c 20 73 70 65 63 69 66 79  ng FTS4, specify
fd60: 69 6e 67 20 61 20 63 6f 6c 75 6d 6e 20 6e 61 6d  ing a column nam
fd70: 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
fd80: 61 6e 20 22 3d 22 20 63 68 61 72 61 63 74 65 72  an "=" character
fd90: 0a 20 20 61 6e 64 20 69 73 20 6e 6f 74 20 65 69  .  and is not ei
fda0: 74 68 65 72 20 61 20 22 74 6f 6b 65 6e 69 7a 65  ther a "tokenize
fdb0: 3d 2a 22 20 73 70 65 63 69 66 69 63 61 74 69 6f  =*" specificatio
fdc0: 6e 20 6f 72 20 61 20 72 65 63 6f 67 6e 69 7a 65  n or a recognize
fdd0: 64 20 46 54 53 34 20 6f 70 74 69 6f 6e 0a 20 20  d FTS4 option.  
fde0: 69 73 20 61 6e 20 65 72 72 6f 72 2e 20 57 69 74  is an error. Wit
fdf0: 68 20 46 54 53 33 2c 20 74 68 65 20 66 69 72 73  h FTS3, the firs
fe00: 74 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20 75  t token in the u
fe10: 6e 72 65 63 6f 67 6e 69 7a 65 64 20 64 69 72 65  nrecognized dire
fe20: 63 74 69 76 65 20 69 73 20 0a 20 20 69 6e 74 65  ctive is .  inte
fe30: 72 70 72 65 74 65 64 20 61 73 20 61 20 63 6f 6c  rpreted as a col
fe40: 75 6d 6e 20 6e 61 6d 65 2e 20 53 69 6d 69 6c 61  umn name. Simila
fe50: 72 6c 79 2c 20 73 70 65 63 69 66 79 69 6e 67 20  rly, specifying 
fe60: 6d 75 6c 74 69 70 6c 65 20 22 74 6f 6b 65 6e 69  multiple "tokeni
fe70: 7a 65 3d 2a 22 0a 20 20 64 69 72 65 63 74 69 76  ze=*".  directiv
fe80: 65 73 20 69 6e 20 61 20 73 69 6e 67 6c 65 20 74  es in a single t
fe90: 61 62 6c 65 20 64 65 63 6c 61 72 61 74 69 6f 6e  able declaration
fea0: 20 69 73 20 61 6e 20 65 72 72 6f 72 20 77 68 65   is an error whe
feb0: 6e 20 75 73 69 6e 67 20 46 54 53 34 2c 20 77 68  n using FTS4, wh
fec0: 65 72 65 61 73 0a 20 20 74 68 65 20 73 65 63 6f  ereas.  the seco
fed0: 6e 64 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e  nd and subsequen
fee0: 74 20 22 74 6f 6b 65 6e 69 7a 65 3d 2a 22 20 64  t "tokenize=*" d
fef0: 69 72 65 63 74 69 76 65 73 20 61 72 65 20 69 6e  irectives are in
ff00: 74 65 72 70 72 65 74 65 64 20 61 73 20 63 6f 6c  terpreted as col
ff10: 75 6d 6e 0a 20 20 6e 61 6d 65 73 20 62 79 20 46  umn.  names by F
ff20: 54 53 33 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65  TS3. For example
ff30: 3a 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20  :..<codeblock>. 
ff40: 20 3c 69 3e 2d 2d 20 41 6e 20 65 72 72 6f 72 2e   <i>-- An error.
ff50: 20 46 54 53 34 20 64 6f 65 73 20 6e 6f 74 20 72   FTS4 does not r
ff60: 65 63 6f 67 6e 69 7a 65 20 74 68 65 20 64 69 72  ecognize the dir
ff70: 65 63 74 69 76 65 20 22 78 79 7a 3d 61 62 63 22  ective "xyz=abc"
ff80: 2e 3c 2f 69 3e 0a 20 20 43 52 45 41 54 45 20 56  .</i>.  CREATE V
ff90: 49 52 54 55 41 4c 20 54 41 42 4c 45 20 70 61 70  IRTUAL TABLE pap
ffa0: 65 72 73 20 55 53 49 4e 47 20 66 74 73 34 28 61  ers USING fts4(a
ffb0: 75 74 68 6f 72 2c 20 64 6f 63 75 6d 65 6e 74 2c  uthor, document,
ffc0: 20 78 79 7a 3d 61 62 63 29 3b 0a 0a 20 20 3c 69   xyz=abc);..  <i
ffd0: 3e 2d 2d 20 43 72 65 61 74 65 20 61 6e 20 46 54  >-- Create an FT
ffe0: 53 33 20 74 61 62 6c 65 20 77 69 74 68 20 74 68  S3 table with th
fff0: 72 65 65 20 63 6f 6c 75 6d 6e 73 20 2d 20 22 61  ree columns - "a
10000 75 74 68 6f 72 22 2c 20 22 64 6f 63 75 6d 65 6e  uthor", "documen
10010 74 22 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 61  t"</i>.  <i>-- a
10020 6e 64 20 22 78 79 7a 22 2e 3c 2f 69 3e 0a 20 20  nd "xyz".</i>.  
10030 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54  CREATE VIRTUAL T
10040 41 42 4c 45 20 70 61 70 65 72 73 20 55 53 49 4e  ABLE papers USIN
10050 47 20 66 74 73 33 28 61 75 74 68 6f 72 2c 20 64  G fts3(author, d
10060 6f 63 75 6d 65 6e 74 2c 20 78 79 7a 3d 61 62 63  ocument, xyz=abc
10070 29 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 41 6e 20 65  );..  <i>-- An e
10080 72 72 6f 72 2e 20 46 54 53 34 20 64 6f 65 73 20  rror. FTS4 does 
10090 6e 6f 74 20 61 6c 6c 6f 77 20 6d 75 6c 74 69 70  not allow multip
100a0 6c 65 20 74 6f 6b 65 6e 69 7a 65 3d 2a 20 64 69  le tokenize=* di
100b0 72 65 63 74 69 76 65 73 3c 2f 69 3e 0a 20 20 43  rectives</i>.  C
100c0 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41  REATE VIRTUAL TA
100d0 42 4c 45 20 70 61 70 65 72 73 20 55 53 49 4e 47  BLE papers USING
100e0 20 66 74 73 34 28 74 6f 6b 65 6e 69 7a 65 3d 70   fts4(tokenize=p
100f0 6f 72 74 65 72 2c 20 74 6f 6b 65 6e 69 7a 65 3d  orter, tokenize=
10100 73 69 6d 70 6c 65 29 3b 0a 0a 20 20 3c 69 3e 2d  simple);..  <i>-
10110 2d 20 43 72 65 61 74 65 20 61 6e 20 46 54 53 33  - Create an FTS3
10120 20 74 61 62 6c 65 20 77 69 74 68 20 61 20 73 69   table with a si
10130 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  ngle column name
10140 64 20 22 74 6f 6b 65 6e 69 7a 65 22 2e 20 54 68  d "tokenize". Th
10150 65 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 74 61  e</i>.  <i>-- ta
10160 62 6c 65 20 75 73 65 73 20 74 68 65 20 22 70 6f  ble uses the "po
10170 72 74 65 72 22 20 74 6f 6b 65 6e 69 7a 65 72 2e  rter" tokenizer.
10180 3c 2f 69 3e 0a 20 20 43 52 45 41 54 45 20 56 49  </i>.  CREATE VI
10190 52 54 55 41 4c 20 54 41 42 4c 45 20 70 61 70 65  RTUAL TABLE pape
101a0 72 73 20 55 53 49 4e 47 20 66 74 73 33 28 74 6f  rs USING fts3(to
101b0 6b 65 6e 69 7a 65 3d 70 6f 72 74 65 72 2c 20 74  kenize=porter, t
101c0 6f 6b 65 6e 69 7a 65 3d 73 69 6d 70 6c 65 29 3b  okenize=simple);
101d0 0a 0a 20 20 3c 69 3e 2d 2d 20 41 6e 20 65 72 72  ..  <i>-- An err
101e0 6f 72 2e 20 43 61 6e 6e 6f 74 20 63 72 65 61 74  or. Cannot creat
101f0 65 20 61 20 74 61 62 6c 65 20 77 69 74 68 20 74  e a table with t
10200 77 6f 20 63 6f 6c 75 6d 6e 73 20 6e 61 6d 65 64  wo columns named
10210 20 22 74 6f 6b 65 6e 69 7a 65 22 2e 3c 2f 69 3e   "tokenize".</i>
10220 0a 20 20 43 52 45 41 54 45 20 56 49 52 54 55 41  .  CREATE VIRTUA
10230 4c 20 54 41 42 4c 45 20 70 61 70 65 72 73 20 55  L TABLE papers U
10240 53 49 4e 47 20 66 74 73 33 28 74 6f 6b 65 6e 69  SING fts3(tokeni
10250 7a 65 3d 70 6f 72 74 65 72 2c 20 74 6f 6b 65 6e  ze=porter, token
10260 69 7a 65 3d 73 69 6d 70 6c 65 2c 20 74 6f 6b 65  ize=simple, toke
10270 6e 69 7a 65 3d 69 63 75 29 3b 0a 3c 2f 63 6f 64  nize=icu);.</cod
10280 65 62 6c 6f 63 6b 3e 0a 0a 3c 74 63 6c 3e 68 64  eblock>..<tcl>hd
10290 5f 66 72 61 67 6d 65 6e 74 20 2a 66 74 73 34 63  _fragment *fts4c
102a0 6f 6d 70 72 65 73 73 69 6f 6e 20 7b 63 6f 6d 70  ompression {comp
102b0 72 65 73 73 65 64 20 46 54 53 34 20 63 6f 6e 74  ressed FTS4 cont
102c0 65 6e 74 7d 3c 2f 74 63 6c 3e 0a 3c 68 32 20 74  ent}</tcl>.<h2 t
102d0 61 67 73 3d 22 66 74 73 34 20 63 6f 6d 70 72 65  ags="fts4 compre
102e0 73 73 20 6f 70 74 69 6f 6e 22 3e 54 68 65 20 63  ss option">The c
102f0 6f 6d 70 72 65 73 73 3d 20 61 6e 64 20 75 6e 63  ompress= and unc
10300 6f 6d 70 72 65 73 73 3d 20 6f 70 74 69 6f 6e 73  ompress= options
10310 3c 2f 68 32 3e 0a 0a 3c 70 3e 0a 20 20 54 68 65  </h2>..<p>.  The
10320 20 63 6f 6d 70 72 65 73 73 20 61 6e 64 20 75 6e   compress and un
10330 63 6f 6d 70 72 65 73 73 20 6f 70 74 69 6f 6e 73  compress options
10340 20 61 6c 6c 6f 77 20 46 54 53 34 20 63 6f 6e 74   allow FTS4 cont
10350 65 6e 74 20 74 6f 20 62 65 20 73 74 6f 72 65 64  ent to be stored
10360 20 69 6e 0a 20 20 74 68 65 20 64 61 74 61 62 61   in.  the databa
10370 73 65 20 69 6e 20 61 20 63 6f 6d 70 72 65 73 73  se in a compress
10380 65 64 20 66 6f 72 6d 2e 20 42 6f 74 68 20 6f 70  ed form. Both op
10390 74 69 6f 6e 73 20 73 68 6f 75 6c 64 20 62 65 20  tions should be 
103a0 73 65 74 20 74 6f 20 74 68 65 20 6e 61 6d 65 0a  set to the name.
103b0 20 20 6f 66 20 61 6e 20 53 51 4c 20 73 63 61 6c    of an SQL scal
103c0 61 72 20 66 75 6e 63 74 69 6f 6e 20 72 65 67 69  ar function regi
103d0 73 74 65 72 65 64 20 75 73 69 6e 67 20 5b 73 71  stered using [sq
103e0 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
103f0 63 74 69 6f 6e 28 29 5d 0a 20 20 74 68 61 74 20  ction()].  that 
10400 61 63 63 65 70 74 73 20 61 20 73 69 6e 67 6c 65  accepts a single
10410 20 61 72 67 75 6d 65 6e 74 2e 20 0a 0a 3c 70 3e   argument. ..<p>
10420 0a 20 20 54 68 65 20 63 6f 6d 70 72 65 73 73 20  .  The compress 
10430 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20  function should 
10440 72 65 74 75 72 6e 20 61 20 63 6f 6d 70 72 65 73  return a compres
10450 73 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 74  sed version of t
10460 68 65 20 76 61 6c 75 65 20 0a 20 20 70 61 73 73  he value .  pass
10470 65 64 20 74 6f 20 69 74 20 61 73 20 61 6e 20 61  ed to it as an a
10480 72 67 75 6d 65 6e 74 2e 20 45 61 63 68 20 74 69  rgument. Each ti
10490 6d 65 20 64 61 74 61 20 69 73 20 77 72 69 74 74  me data is writt
104a0 65 6e 20 74 6f 20 74 68 65 20 46 54 53 34 20 74  en to the FTS4 t
104b0 61 62 6c 65 2c 20 0a 20 20 65 61 63 68 20 63 6f  able, .  each co
104c0 6c 75 6d 6e 20 76 61 6c 75 65 20 69 73 20 70 61  lumn value is pa
104d0 73 73 65 64 20 74 6f 20 74 68 65 20 63 6f 6d 70  ssed to the comp
104e0 72 65 73 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e  ress function an
104f0 64 20 74 68 65 20 72 65 73 75 6c 74 20 76 61 6c  d the result val
10500 75 65 20 0a 20 20 73 74 6f 72 65 64 20 69 6e 20  ue .  stored in 
10510 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 54 68  the database. Th
10520 65 20 63 6f 6d 70 72 65 73 73 20 66 75 6e 63 74  e compress funct
10530 69 6f 6e 20 6d 61 79 20 72 65 74 75 72 6e 20 61  ion may return a
10540 6e 79 20 74 79 70 65 20 6f 66 20 53 51 4c 69 74  ny type of SQLit
10550 65 20 0a 20 20 76 61 6c 75 65 20 28 62 6c 6f 62  e .  value (blob
10560 2c 20 74 65 78 74 2c 20 72 65 61 6c 2c 20 69 6e  , text, real, in
10570 74 65 67 65 72 20 6f 72 20 6e 75 6c 6c 29 2e 0a  teger or null)..
10580 0a 3c 70 3e 0a 20 20 54 68 65 20 75 6e 63 6f 6d  .<p>.  The uncom
10590 70 72 65 73 73 20 66 75 6e 63 74 69 6f 6e 20 73  press function s
105a0 68 6f 75 6c 64 20 75 6e 63 6f 6d 70 72 65 73 73  hould uncompress
105b0 20 64 61 74 61 20 70 72 65 76 69 6f 75 73 6c 79   data previously
105c0 20 63 6f 6d 70 72 65 73 73 65 64 20 62 79 0a 20   compressed by. 
105d0 20 74 68 65 20 63 6f 6d 70 72 65 73 73 20 66 75   the compress fu
105e0 6e 63 74 69 6f 6e 2e 20 49 6e 20 6f 74 68 65 72  nction. In other
105f0 20 77 6f 72 64 73 2c 20 66 6f 72 20 61 6c 6c 20   words, for all 
10600 53 51 4c 69 74 65 20 76 61 6c 75 65 73 20 58 2c  SQLite values X,
10610 20 69 74 20 73 68 6f 75 6c 64 0a 20 20 62 65 20   it should.  be 
10620 74 72 75 65 20 74 68 61 74 20 75 6e 63 6f 6d 70  true that uncomp
10630 72 65 73 73 28 63 6f 6d 70 72 65 73 73 28 58 29  ress(compress(X)
10640 29 20 65 71 75 61 6c 73 20 58 2e 20 57 68 65 6e  ) equals X. When
10650 20 64 61 74 61 20 74 68 61 74 20 68 61 73 20 62   data that has b
10660 65 65 6e 0a 20 20 63 6f 6d 70 72 65 73 73 65 64  een.  compressed
10670 20 62 79 20 74 68 65 20 63 6f 6d 70 72 65 73 73   by the compress
10680 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 61   function is rea
10690 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  d from the datab
106a0 61 73 65 20 62 79 20 46 54 53 34 2c 20 69 74 0a  ase by FTS4, it.
106b0 20 20 69 73 20 70 61 73 73 65 64 20 74 6f 20 74    is passed to t
106c0 68 65 20 75 6e 63 6f 6d 70 72 65 73 73 20 66 75  he uncompress fu
106d0 6e 63 74 69 6f 6e 20 62 65 66 6f 72 65 20 69 74  nction before it
106e0 20 69 73 20 75 73 65 64 2e 0a 0a 3c 70 3e 0a 20   is used...<p>. 
106f0 20 49 66 20 74 68 65 20 73 70 65 63 69 66 69 65   If the specifie
10700 64 20 63 6f 6d 70 72 65 73 73 20 6f 72 20 75 6e  d compress or un
10710 63 6f 6d 70 72 65 73 73 20 66 75 6e 63 74 69 6f  compress functio
10720 6e 73 20 64 6f 20 6e 6f 74 20 65 78 69 73 74 2c  ns do not exist,
10730 20 74 68 65 20 74 61 62 6c 65 0a 20 20 6d 61 79   the table.  may
10740 20 73 74 69 6c 6c 20 62 65 20 63 72 65 61 74 65   still be create
10750 64 2e 20 41 6e 20 65 72 72 6f 72 20 69 73 20 6e  d. An error is n
10760 6f 74 20 72 65 74 75 72 6e 65 64 20 75 6e 74 69  ot returned unti
10770 6c 20 74 68 65 20 46 54 53 34 20 74 61 62 6c 65  l the FTS4 table
10780 20 69 73 0a 20 20 72 65 61 64 20 28 69 66 20 74   is.  read (if t
10790 68 65 20 75 6e 63 6f 6d 70 72 65 73 73 20 66 75  he uncompress fu
107a0 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20  nction does not 
107b0 65 78 69 73 74 29 20 6f 72 20 77 72 69 74 74 65  exist) or writte
107c0 6e 20 28 69 66 20 69 74 20 69 73 20 74 68 65 20  n (if it is the 
107d0 0a 20 20 63 6f 6d 70 72 65 73 73 20 66 75 6e 63  .  compress func
107e0 74 69 6f 6e 20 74 68 61 74 20 64 6f 65 73 20 6e  tion that does n
107f0 6f 74 20 65 78 69 73 74 29 2e 0a 0a 3c 63 6f 64  ot exist)...<cod
10800 65 62 6c 6f 63 6b 3e 0a 20 20 3c 69 3e 2d 2d 20  eblock>.  <i>-- 
10810 43 72 65 61 74 65 20 61 6e 20 46 54 53 34 20 74  Create an FTS4 t
10820 61 62 6c 65 20 74 68 61 74 20 73 74 6f 72 65 73  able that stores
10830 20 64 61 74 61 20 69 6e 20 63 6f 6d 70 72 65 73   data in compres
10840 73 65 64 20 66 6f 72 6d 2e 20 54 68 69 73 3c 2f  sed form. This</
10850 69 3e 0a 20 20 3c 69 3e 2d 2d 20 61 73 73 75 6d  i>.  <i>-- assum
10860 65 73 20 74 68 61 74 20 74 68 65 20 73 63 61 6c  es that the scal
10870 61 72 20 66 75 6e 63 74 69 6f 6e 73 20 7a 69 70  ar functions zip
10880 28 29 20 61 6e 64 20 75 6e 7a 69 70 28 29 20 68  () and unzip() h
10890 61 76 65 20 62 65 65 6e 20 28 6f 72 3c 2f 69 3e  ave been (or</i>
108a0 0a 20 20 3c 69 3e 2d 2d 20 77 69 6c 6c 20 62 65  .  <i>-- will be
108b0 29 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 64  ) added to the d
108c0 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 2e 3c  atabase handle.<
108d0 2f 69 3e 0a 20 20 43 52 45 41 54 45 20 56 49 52  /i>.  CREATE VIR
108e0 54 55 41 4c 20 54 41 42 4c 45 20 70 61 70 65 72  TUAL TABLE paper
108f0 73 20 55 53 49 4e 47 20 66 74 73 34 28 61 75 74  s USING fts4(aut
10900 68 6f 72 2c 20 64 6f 63 75 6d 65 6e 74 2c 20 63  hor, document, c
10910 6f 6d 70 72 65 73 73 3d 7a 69 70 2c 20 75 6e 63  ompress=zip, unc
10920 6f 6d 70 72 65 73 73 3d 75 6e 7a 69 70 29 3b 0a  ompress=unzip);.
10930 3c 2f 63 6f 64 65 62 6c 6f 63 6b 3e 0a 0a 3c 70  </codeblock>..<p
10940 3e 0a 20 20 57 68 65 6e 20 69 6d 70 6c 65 6d 65  >.  When impleme
10950 6e 74 69 6e 67 20 74 68 65 20 63 6f 6d 70 72 65  nting the compre
10960 73 73 20 61 6e 64 20 75 6e 63 6f 6d 70 72 65 73  ss and uncompres
10970 73 20 66 75 6e 63 74 69 6f 6e 73 20 69 74 20 69  s functions it i
10980 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 0a 20  s important to. 
10990 20 70 61 79 20 61 74 74 65 6e 74 69 6f 6e 20 74   pay attention t
109a0 6f 20 64 61 74 61 20 74 79 70 65 73 2e 20 53 70  o data types. Sp
109b0 65 63 69 66 69 63 61 6c 6c 79 2c 20 77 68 65 6e  ecifically, when
109c0 20 61 20 75 73 65 72 20 72 65 61 64 73 20 61 20   a user reads a 
109d0 76 61 6c 75 65 20 66 72 6f 6d 0a 20 20 61 20 63  value from.  a c
109e0 6f 6d 70 72 65 73 73 65 64 20 46 54 53 20 74 61  ompressed FTS ta
109f0 62 6c 65 2c 20 74 68 65 20 76 61 6c 75 65 20 72  ble, the value r
10a00 65 74 75 72 6e 65 64 20 62 79 20 46 54 53 20 69  eturned by FTS i
10a10 73 20 65 78 61 63 74 6c 79 20 74 68 65 20 73 61  s exactly the sa
10a20 6d 65 0a 20 20 61 73 20 74 68 65 20 76 61 6c 75  me.  as the valu
10a30 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  e returned by th
10a40 65 20 75 6e 63 6f 6d 70 72 65 73 73 20 66 75 6e  e uncompress fun
10a50 63 74 69 6f 6e 2c 20 69 6e 63 6c 75 64 69 6e 67  ction, including
10a60 20 74 68 65 20 64 61 74 61 20 74 79 70 65 2e 0a   the data type..
10a70 20 20 49 66 20 74 68 61 74 20 64 61 74 61 20 74    If that data t
10a80 79 70 65 20 69 73 20 6e 6f 74 20 74 68 65 20 73  ype is not the s
10a90 61 6d 65 20 61 73 20 74 68 65 20 64 61 74 61 20  ame as the data 
10aa0 74 79 70 65 20 6f 66 20 74 68 65 20 6f 72 69 67  type of the orig
10ab0 69 6e 61 6c 20 76 61 6c 75 65 20 61 73 0a 20 20  inal value as.  
10ac0 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 63 6f  passed to the co
10ad0 6d 70 72 65 73 73 20 66 75 6e 63 74 69 6f 6e 20  mpress function 
10ae0 28 66 6f 72 20 65 78 61 6d 70 6c 65 20 69 66 20  (for example if 
10af0 74 68 65 20 75 6e 63 6f 6d 70 72 65 73 73 20 66  the uncompress f
10b00 75 6e 63 74 69 6f 6e 20 69 73 0a 20 20 72 65 74  unction is.  ret
10b10 75 72 6e 69 6e 67 20 42 4c 4f 42 20 77 68 65 6e  urning BLOB when
10b20 20 63 6f 6d 70 72 65 73 73 20 77 61 73 20 6f 72   compress was or
10b30 69 67 69 6e 61 6c 6c 79 20 70 61 73 73 65 64 20  iginally passed 
10b40 54 45 58 54 29 2c 20 74 68 65 6e 20 74 68 65 20  TEXT), then the 
10b50 75 73 65 72 73 0a 20 20 71 75 65 72 79 20 6d 61  users.  query ma
10b60 79 20 6e 6f 74 20 66 75 6e 63 74 69 6f 6e 20 61  y not function a
10b70 73 20 65 78 70 65 63 74 65 64 2e 0a 0a 3c 74 63  s expected...<tc
10b80 6c 3e 68 64 5f 66 72 61 67 6d 65 6e 74 20 2a 66  l>hd_fragment *f
10b90 74 73 34 63 6f 6e 74 65 6e 74 20 7b 46 54 53 34  ts4content {FTS4
10ba0 20 63 6f 6e 74 65 6e 74 20 6f 70 74 69 6f 6e 7d   content option}
10bb0 3c 2f 74 63 6c 3e 0a 3c 68 32 20 74 61 67 73 3d  </tcl>.<h2 tags=
10bc0 22 66 74 73 34 20 63 6f 6e 74 65 6e 74 20 6f 70  "fts4 content op
10bd0 74 69 6f 6e 22 3e 54 68 65 20 63 6f 6e 74 65 6e  tion">The conten
10be0 74 3d 20 6f 70 74 69 6f 6e 20 3c 2f 68 32 3e 0a  t= option </h2>.
10bf0 0a 3c 70 3e 0a 20 20 54 68 65 20 63 6f 6e 74 65  .<p>.  The conte
10c00 6e 74 20 6f 70 74 69 6f 6e 20 61 6c 6c 6f 77 73  nt option allows
10c10 20 46 54 53 34 20 74 6f 20 66 6f 72 65 67 6f 20   FTS4 to forego 
10c20 73 74 6f 72 69 6e 67 20 74 68 65 20 74 65 78 74  storing the text
10c30 20 62 65 69 6e 67 20 69 6e 64 65 78 65 64 2e 0a   being indexed..
10c40 20 20 54 68 65 20 63 6f 6e 74 65 6e 74 20 6f 70    The content op
10c50 74 69 6f 6e 20 63 61 6e 20 62 65 20 75 73 65 64  tion can be used
10c60 20 69 6e 20 74 77 6f 20 77 61 79 73 3a 0a 0a 3c   in two ways:..<
10c70 75 6c 3e 0a 3c 6c 69 3e 3c 70 3e 20 54 68 65 20  ul>.<li><p> The 
10c80 69 6e 64 65 78 65 64 20 64 6f 63 75 6d 65 6e 74  indexed document
10c90 73 20 61 72 65 20 6e 6f 74 20 73 74 6f 72 65 64  s are not stored
10ca0 20 77 69 74 68 69 6e 20 74 68 65 20 53 51 4c 69   within the SQLi
10cb0 74 65 20 64 61 74 61 62 61 73 65 20 0a 20 20 20  te database .   
10cc0 20 20 20 20 20 61 74 20 61 6c 6c 20 28 61 20 22       at all (a "
10cd0 63 6f 6e 74 65 6e 74 6c 65 73 73 22 20 46 54 53  contentless" FTS
10ce0 34 20 74 61 62 6c 65 29 2c 20 6f 72 0a 0a 3c 6c  4 table), or..<l
10cf0 69 3e 3c 70 3e 20 54 68 65 20 69 6e 64 65 78 65  i><p> The indexe
10d00 64 20 64 6f 63 75 6d 65 6e 74 73 20 61 72 65 20  d documents are 
10d10 73 74 6f 72 65 64 20 69 6e 20 61 20 64 61 74 61  stored in a data
10d20 62 61 73 65 20 74 61 62 6c 65 20 63 72 65 61 74  base table creat
10d30 65 64 20 61 6e 64 0a 20 20 20 20 20 20 20 20 6d  ed and.        m
10d40 61 6e 61 67 65 64 20 62 79 20 74 68 65 20 75 73  anaged by the us
10d50 65 72 20 28 61 6e 20 22 65 78 74 65 72 6e 61 6c  er (an "external
10d60 20 63 6f 6e 74 65 6e 74 22 20 46 54 53 34 20 74   content" FTS4 t
10d70 61 62 6c 65 29 2e 0a 3c 2f 75 6c 3e 0a 0a 3c 70  able)..</ul>..<p
10d80 3e 0a 20 20 42 65 63 61 75 73 65 20 74 68 65 20  >.  Because the 
10d90 69 6e 64 65 78 65 64 20 64 6f 63 75 6d 65 6e 74  indexed document
10da0 73 20 74 68 65 6d 73 65 6c 76 65 73 20 61 72 65  s themselves are
10db0 20 75 73 75 61 6c 6c 79 20 6d 75 63 68 20 6c 61   usually much la
10dc0 72 67 65 72 20 74 68 61 6e 20 0a 20 20 74 68 65  rger than .  the
10dd0 20 66 75 6c 6c 2d 74 65 78 74 20 69 6e 64 65 78   full-text index
10de0 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 70  , the content op
10df0 74 69 6f 6e 20 63 61 6e 20 62 65 20 75 73 65 64  tion can be used
10e00 20 74 6f 20 61 63 68 69 65 76 65 20 0a 20 20 73   to achieve .  s
10e10 69 67 6e 69 66 69 63 61 6e 74 20 73 70 61 63 65  ignificant space
10e20 20 73 61 76 69 6e 67 73 2e 0a 0a 3c 68 33 3e 20   savings...<h3> 
10e30 43 6f 6e 74 65 6e 74 6c 65 73 73 20 46 54 53 34  Contentless FTS4
10e40 20 54 61 62 6c 65 73 20 3c 2f 68 33 3e 0a 0a 3c   Tables </h3>..<
10e50 70 3e 0a 20 20 49 6e 20 6f 72 64 65 72 20 74 6f  p>.  In order to
10e60 20 63 72 65 61 74 65 20 61 6e 20 46 54 53 34 20   create an FTS4 
10e70 74 61 62 6c 65 20 74 68 61 74 20 64 6f 65 73 20  table that does 
10e80 6e 6f 74 20 73 74 6f 72 65 20 61 20 63 6f 70 79  not store a copy
10e90 20 6f 66 20 74 68 65 20 69 6e 64 65 78 65 64 0a   of the indexed.
10ea0 20 20 64 6f 63 75 6d 65 6e 74 73 20 61 74 20 61    documents at a
10eb0 6c 6c 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  ll, the content 
10ec0 6f 70 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65  option should be
10ed0 20 73 65 74 20 74 6f 20 61 6e 20 65 6d 70 74 79   set to an empty
10ee0 20 73 74 72 69 6e 67 2e 0a 20 20 46 6f 72 20 65   string..  For e
10ef0 78 61 6d 70 6c 65 2c 20 74 68 65 20 66 6f 6c 6c  xample, the foll
10f00 6f 77 69 6e 67 20 53 51 4c 20 63 72 65 61 74 65  owing SQL create
10f10 73 20 73 75 63 68 20 61 6e 20 46 54 53 34 20 74  s such an FTS4 t
10f20 61 62 6c 65 20 77 69 74 68 20 74 68 72 65 65 0a  able with three.
10f30 20 20 63 6f 6c 75 6d 6e 73 20 2d 20 22 61 22 2c    columns - "a",
10f40 20 22 62 22 2c 20 61 6e 64 20 22 63 22 3a 0a 0a   "b", and "c":..
10f50 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20 20 43 52  <codeblock>.  CR
10f60 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42  EATE VIRTUAL TAB
10f70 4c 45 20 74 31 20 55 53 49 4e 47 20 66 74 73 34  LE t1 USING fts4
10f80 28 63 6f 6e 74 65 6e 74 3d 22 22 2c 20 61 2c 20  (content="", a, 
10f90 62 2c 20 63 29 3b 0a 3c 2f 63 6f 64 65 62 6c 6f  b, c);.</codeblo
10fa0 63 6b 3e 0a 0a 3c 70 3e 0a 20 20 44 61 74 61 20  ck>..<p>.  Data 
10fb0 63 61 6e 20 62 65 20 69 6e 73 65 72 74 65 64 20  can be inserted 
10fc0 69 6e 74 6f 20 73 75 63 68 20 61 6e 20 46 54 53  into such an FTS
10fd0 34 20 74 61 62 6c 65 20 75 73 69 6e 67 20 61 6e  4 table using an
10fe0 20 49 4e 53 45 52 54 20 73 74 61 74 65 6d 65 6e   INSERT statemen
10ff0 74 73 2e 0a 20 20 48 6f 77 65 76 65 72 2c 20 75  ts..  However, u
11000 6e 6c 69 6b 65 20 6f 72 64 69 6e 61 72 79 20 46  nlike ordinary F
11010 54 53 34 20 74 61 62 6c 65 73 2c 20 74 68 65 20  TS4 tables, the 
11020 75 73 65 72 20 6d 75 73 74 20 73 75 70 70 6c 79  user must supply
11030 20 61 6e 20 65 78 70 6c 69 63 69 74 0a 20 20 69   an explicit.  i
11040 6e 74 65 67 65 72 20 64 6f 63 69 64 20 76 61 6c  nteger docid val
11050 75 65 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a  ue. For example:
11060 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20 20  ..<codeblock>.  
11070 3c 69 3e 2d 2d 20 54 68 69 73 20 73 74 61 74 65  <i>-- This state
11080 6d 65 6e 74 20 69 73 20 4f 6b 3a 3c 2f 69 3e 0a  ment is Ok:</i>.
11090 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
110a0 28 64 6f 63 69 64 2c 20 61 2c 20 62 2c 20 63 29  (docid, a, b, c)
110b0 20 56 41 4c 55 45 53 28 31 2c 20 27 61 20 62 20   VALUES(1, 'a b 
110c0 63 27 2c 20 27 64 20 65 20 66 27 2c 20 27 67 20  c', 'd e f', 'g 
110d0 68 20 69 27 29 3b 0a 0a 20 20 3c 69 3e 2d 2d 20  h i');..  <i>-- 
110e0 54 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 63  This statement c
110f0 61 75 73 65 73 20 61 6e 20 65 72 72 6f 72 2c 20  auses an error, 
11100 61 73 20 6e 6f 20 64 6f 63 69 64 20 76 61 6c 75  as no docid valu
11110 65 20 68 61 73 20 62 65 65 6e 20 70 72 6f 76 69  e has been provi
11120 64 65 64 3a 3c 2f 69 3e 0a 20 20 49 4e 53 45 52  ded:</i>.  INSER
11130 54 20 49 4e 54 4f 20 74 31 28 61 2c 20 62 2c 20  T INTO t1(a, b, 
11140 63 29 20 56 41 4c 55 45 53 28 27 6a 20 6b 20 6c  c) VALUES('j k l
11150 27 2c 20 27 6d 20 6e 20 6f 27 2c 20 27 70 20 71  ', 'm n o', 'p q
11160 20 72 27 29 3b 0a 3c 2f 63 6f 64 65 62 6c 6f 63   r');.</codebloc
11170 6b 3e 0a 0a 3c 70 3e 0a 20 20 49 74 20 69 73 20  k>..<p>.  It is 
11180 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  not possible to 
11190 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45  UPDATE or DELETE
111a0 20 61 20 72 6f 77 20 73 74 6f 72 65 64 20 69 6e   a row stored in
111b0 20 61 20 63 6f 6e 74 65 6e 74 6c 65 73 73 20 46   a contentless F
111c0 54 53 34 0a 20 20 74 61 62 6c 65 2e 20 41 74 74  TS4.  table. Att
111d0 65 6d 70 74 69 6e 67 20 74 6f 20 64 6f 20 73 6f  empting to do so
111e0 20 69 73 20 61 6e 20 65 72 72 6f 72 2e 0a 0a 3c   is an error...<
111f0 70 3e 0a 20 20 43 6f 6e 74 65 6e 74 6c 65 73 73  p>.  Contentless
11200 20 46 54 53 34 20 74 61 62 6c 65 73 20 61 6c 73   FTS4 tables als
11210 6f 20 73 75 70 70 6f 72 74 20 53 45 4c 45 43 54  o support SELECT
11220 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 48 6f 77   statements. How
11230 65 76 65 72 2c 20 69 74 20 69 73 0a 20 20 61 6e  ever, it is.  an
11240 20 65 72 72 6f 72 20 74 6f 20 61 74 74 65 6d 70   error to attemp
11250 74 20 74 6f 20 72 65 74 72 69 65 76 65 20 74 68  t to retrieve th
11260 65 20 76 61 6c 75 65 20 6f 66 20 61 6e 79 20 74  e value of any t
11270 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 6f 74 68 65  able column othe
11280 72 20 74 68 61 6e 0a 20 20 74 68 65 20 64 6f 63  r than.  the doc
11290 69 64 20 63 6f 6c 75 6d 6e 2e 20 54 68 65 20 61  id column. The a
112a0 75 78 69 6c 69 61 72 79 20 66 75 6e 63 74 69 6f  uxiliary functio
112b0 6e 20 6d 61 74 63 68 69 6e 66 6f 28 29 20 6d 61  n matchinfo() ma
112c0 79 20 62 65 20 75 73 65 64 2c 20 62 75 74 0a 20  y be used, but. 
112d0 20 73 6e 69 70 70 65 74 28 29 20 61 6e 64 20 6f   snippet() and o
112e0 66 66 73 65 74 73 28 29 20 6d 61 79 20 6e 6f 74  ffsets() may not
112f0 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 0a  . For example:..
11300 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20 20 3c 69  <codeblock>.  <i
11310 3e 2d 2d 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  >-- The followin
11320 67 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65  g statements are
11330 20 4f 6b 3a 3c 2f 69 3e 0a 20 20 53 45 4c 45 43   Ok:</i>.  SELEC
11340 54 20 64 6f 63 69 64 20 46 52 4f 4d 20 74 31 20  T docid FROM t1 
11350 57 48 45 52 45 20 74 31 20 4d 41 54 43 48 20 27  WHERE t1 MATCH '
11360 78 78 78 27 3b 0a 20 20 53 45 4c 45 43 54 20 64  xxx';.  SELECT d
11370 6f 63 69 64 20 46 52 4f 4d 20 74 31 20 57 48 45  ocid FROM t1 WHE
11380 52 45 20 61 20 4d 41 54 43 48 20 27 78 78 78 27  RE a MATCH 'xxx'
11390 3b 0a 20 20 53 45 4c 45 43 54 20 6d 61 74 63 68  ;.  SELECT match
113a0 69 6e 66 6f 28 74 31 29 20 46 52 4f 4d 20 74 31  info(t1) FROM t1
113b0 20 57 48 45 52 45 20 74 31 20 4d 41 54 43 48 20   WHERE t1 MATCH 
113c0 27 78 78 78 27 3b 0a 0a 20 20 3c 69 3e 2d 2d 20  'xxx';..  <i>-- 
113d0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  The following st
113e0 61 74 65 6d 65 6e 74 73 20 61 6c 6c 20 63 61 75  atements all cau
113f0 73 65 20 65 72 72 6f 72 73 2c 20 61 73 20 74 68  se errors, as th
11400 65 20 76 61 6c 75 65 20 6f 66 20 63 6f 6c 75 6d  e value of colum
11410 6e 73 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 6f  ns</i>.  <i>-- o
11420 74 68 65 72 20 74 68 61 6e 20 64 6f 63 69 64 20  ther than docid 
11430 61 72 65 20 72 65 71 75 69 72 65 64 20 74 6f 20  are required to 
11440 65 76 61 6c 75 61 74 65 20 74 68 65 6d 2e 3c 2f  evaluate them.</
11450 69 3e 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52  i>.  SELECT * FR
11460 4f 4d 20 74 31 3b 0a 20 20 53 45 4c 45 43 54 20  OM t1;.  SELECT 
11470 61 2c 20 62 20 46 52 4f 4d 20 74 31 20 57 48 45  a, b FROM t1 WHE
11480 52 45 20 74 31 20 4d 41 54 43 48 20 27 78 78 78  RE t1 MATCH 'xxx
11490 27 3b 0a 20 20 53 45 4c 45 43 54 20 64 6f 63 69  ';.  SELECT doci
114a0 64 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  d FROM t1 WHERE 
114b0 61 20 4c 49 4b 45 20 27 78 78 78 25 27 3b 0a 20  a LIKE 'xxx%';. 
114c0 20 53 45 4c 45 43 54 20 73 6e 69 70 70 65 74 28   SELECT snippet(
114d0 74 31 29 20 46 52 4f 4d 20 74 31 20 57 48 45 52  t1) FROM t1 WHER
114e0 45 20 74 31 20 4d 41 54 43 48 20 27 78 78 78 27  E t1 MATCH 'xxx'
114f0 3b 0a 3c 2f 63 6f 64 65 62 6c 6f 63 6b 3e 0a 0a  ;.</codeblock>..
11500 3c 70 3e 0a 20 20 45 72 72 6f 72 73 20 72 65 6c  <p>.  Errors rel
11510 61 74 65 64 20 74 6f 20 61 74 74 65 6d 70 74 69  ated to attempti
11520 6e 67 20 74 6f 20 72 65 74 72 69 65 76 65 20 63  ng to retrieve c
11530 6f 6c 75 6d 6e 20 76 61 6c 75 65 73 20 6f 74 68  olumn values oth
11540 65 72 20 74 68 61 6e 20 64 6f 63 69 64 0a 20 20  er than docid.  
11550 61 72 65 20 72 75 6e 74 69 6d 65 20 65 72 72 6f  are runtime erro
11560 72 73 20 74 68 61 74 20 6f 63 63 75 72 20 77 69  rs that occur wi
11570 74 68 69 6e 20 73 71 6c 69 74 65 33 5f 73 74 65  thin sqlite3_ste
11580 70 28 29 2e 20 49 6e 20 73 6f 6d 65 20 63 61 73  p(). In some cas
11590 65 73 2c 20 66 6f 72 0a 20 20 65 78 61 6d 70 6c  es, for.  exampl
115a0 65 20 69 66 20 74 68 65 20 4d 41 54 43 48 20 65  e if the MATCH e
115b0 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 20 53  xpression in a S
115c0 45 4c 45 43 54 20 71 75 65 72 79 20 6d 61 74 63  ELECT query matc
115d0 68 65 73 20 7a 65 72 6f 20 72 6f 77 73 2c 20 74  hes zero rows, t
115e0 68 65 72 65 0a 20 20 6d 61 79 20 62 65 20 6e 6f  here.  may be no
115f0 20 65 72 72 6f 72 20 61 74 20 61 6c 6c 20 65 76   error at all ev
11600 65 6e 20 69 66 20 61 20 73 74 61 74 65 6d 65 6e  en if a statemen
11610 74 20 64 6f 65 73 20 72 65 66 65 72 20 74 6f 20  t does refer to 
11620 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 73 20 0a 20  column values . 
11630 20 6f 74 68 65 72 20 74 68 61 6e 20 64 6f 63 69   other than doci
11640 64 2e 0a 0a 3c 68 33 3e 20 45 78 74 65 72 6e 61  d...<h3> Externa
11650 6c 20 43 6f 6e 74 65 6e 74 20 46 54 53 34 20 54  l Content FTS4 T
11660 61 62 6c 65 73 20 3c 2f 68 33 3e 0a 0a 3c 70 3e  ables </h3>..<p>
11670 0a 20 20 41 6e 20 22 65 78 74 65 72 6e 61 6c 20  .  An "external 
11680 63 6f 6e 74 65 6e 74 22 20 46 54 53 34 20 74 61  content" FTS4 ta
11690 62 6c 65 20 69 73 20 73 69 6d 69 6c 61 72 20 74  ble is similar t
116a0 6f 20 61 20 63 6f 6e 74 65 6e 74 6c 65 73 73 20  o a contentless 
116b0 74 61 62 6c 65 2c 20 65 78 63 65 70 74 0a 20 20  table, except.  
116c0 74 68 61 74 20 69 66 20 65 76 61 6c 75 61 74 69  that if evaluati
116d0 6f 6e 20 6f 66 20 61 20 71 75 65 72 79 20 72 65  on of a query re
116e0 71 75 69 72 65 73 20 74 68 65 20 76 61 6c 75 65  quires the value
116f0 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 6f 74 68   of a column oth
11700 65 72 20 74 68 61 6e 20 0a 20 20 64 6f 63 69 64  er than .  docid
11710 2c 20 46 54 53 34 20 61 74 74 65 6d 70 74 73 20  , FTS4 attempts 
11720 74 6f 20 72 65 74 72 69 65 76 65 20 74 68 61 74  to retrieve that
11730 20 76 61 6c 75 65 20 66 72 6f 6d 20 61 20 74 61   value from a ta
11740 62 6c 65 20 28 6f 72 20 76 69 65 77 2c 20 6f 72  ble (or view, or
11750 20 0a 20 20 76 69 72 74 75 61 6c 20 74 61 62 6c   .  virtual tabl
11760 65 29 20 6e 6f 6d 69 6e 61 74 65 64 20 62 79 20  e) nominated by 
11770 74 68 65 20 75 73 65 72 20 28 68 65 72 65 61 66  the user (hereaf
11780 74 65 72 20 72 65 66 65 72 72 65 64 20 74 6f 20  ter referred to 
11790 61 73 20 74 68 65 20 22 63 6f 6e 74 65 6e 74 0a  as the "content.
117a0 20 20 74 61 62 6c 65 22 29 2e 20 54 68 65 20 46    table"). The F
117b0 54 53 34 20 6d 6f 64 75 6c 65 20 6e 65 76 65 72  TS4 module never
117c0 20 77 72 69 74 65 73 20 74 6f 20 74 68 65 20 63   writes to the c
117d0 6f 6e 74 65 6e 74 20 74 61 62 6c 65 2c 20 61 6e  ontent table, an
117e0 64 20 77 72 69 74 69 6e 67 0a 20 20 74 6f 20 74  d writing.  to t
117f0 68 65 20 63 6f 6e 74 65 6e 74 20 74 61 62 6c 65  he content table
11800 20 64 6f 65 73 20 6e 6f 74 20 61 66 66 65 63 74   does not affect
11810 20 74 68 65 20 66 75 6c 6c 2d 74 65 78 74 20 69   the full-text i
11820 6e 64 65 78 2e 20 49 74 20 69 73 20 74 68 65 0a  ndex. It is the.
11830 20 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79    responsibility
11840 20 6f 66 20 74 68 65 20 75 73 65 72 20 74 6f 20   of the user to 
11850 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20  ensure that the 
11860 63 6f 6e 74 65 6e 74 20 74 61 62 6c 65 20 61 6e  content table an
11870 64 20 74 68 65 20 0a 20 20 66 75 6c 6c 2d 74 65  d the .  full-te
11880 78 74 20 69 6e 64 65 78 20 61 72 65 20 63 6f 6e  xt index are con
11890 73 69 73 74 65 6e 74 2e 0a 0a 3c 70 3e 0a 20 20  sistent...<p>.  
118a0 41 6e 20 65 78 74 65 72 6e 61 6c 20 63 6f 6e 74  An external cont
118b0 65 6e 74 20 46 54 53 34 20 74 61 62 6c 65 20 69  ent FTS4 table i
118c0 73 20 63 72 65 61 74 65 64 20 62 79 20 73 65 74  s created by set
118d0 74 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74  ting the content
118e0 20 6f 70 74 69 6f 6e 0a 20 20 74 6f 20 74 68 65   option.  to the
118f0 20 6e 61 6d 65 20 6f 66 20 61 20 74 61 62 6c 65   name of a table
11900 20 28 6f 72 20 76 69 65 77 2c 20 6f 72 20 76 69   (or view, or vi
11910 72 74 75 61 6c 20 74 61 62 6c 65 29 20 74 68 61  rtual table) tha
11920 74 20 6d 61 79 20 62 65 20 71 75 65 72 69 65 64  t may be queried
11930 20 62 79 0a 20 20 46 54 53 34 20 74 6f 20 72 65   by.  FTS4 to re
11940 74 72 69 65 76 65 20 63 6f 6c 75 6d 6e 20 76 61  trieve column va
11950 6c 75 65 73 20 77 68 65 6e 20 72 65 71 75 69 72  lues when requir
11960 65 64 2e 20 49 66 20 74 68 65 20 6e 6f 6d 69 6e  ed. If the nomin
11970 61 74 65 64 20 74 61 62 6c 65 20 64 6f 65 73 0a  ated table does.
11980 20 20 6e 6f 74 20 65 78 69 73 74 2c 20 74 68 65    not exist, the
11990 6e 20 61 6e 20 65 78 74 65 72 6e 61 6c 20 63 6f  n an external co
119a0 6e 74 65 6e 74 20 74 61 62 6c 65 20 62 65 68 61  ntent table beha
119b0 76 65 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20  ves in the same 
119c0 77 61 79 20 61 73 0a 20 20 61 20 63 6f 6e 74 65  way as.  a conte
119d0 6e 74 6c 65 73 73 20 74 61 62 6c 65 2e 20 46 6f  ntless table. Fo
119e0 72 20 65 78 61 6d 70 6c 65 3a 0a 0a 3c 63 6f 64  r example:..<cod
119f0 65 62 6c 6f 63 6b 3e 0a 20 20 43 52 45 41 54 45  eblock>.  CREATE
11a00 20 54 41 42 4c 45 20 74 32 28 69 64 20 49 4e 54   TABLE t2(id INT
11a10 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
11a20 2c 20 61 2c 20 62 2c 20 63 29 3b 0a 20 20 43 52  , a, b, c);.  CR
11a30 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42  EATE VIRTUAL TAB
11a40 4c 45 20 74 33 20 55 53 49 4e 47 20 66 74 73 34  LE t3 USING fts4
11a50 28 63 6f 6e 74 65 6e 74 3d 22 74 32 22 2c 20 61  (content="t2", a
11a60 2c 20 63 29 3b 0a 3c 2f 63 6f 64 65 62 6c 6f 63  , c);.</codebloc
11a70 6b 3e 0a 0a 3c 70 3e 0a 20 20 41 73 73 75 6d 69  k>..<p>.  Assumi
11a80 6e 67 20 74 68 65 20 6e 6f 6d 69 6e 61 74 65 64  ng the nominated
11a90 20 74 61 62 6c 65 20 64 6f 65 73 20 65 78 69 73   table does exis
11aa0 74 2c 20 74 68 65 6e 20 69 74 73 20 63 6f 6c 75  t, then its colu
11ab0 6d 6e 73 20 6d 75 73 74 20 62 65 20 74 68 65 20  mns must be the 
11ac0 73 61 6d 65 20 0a 20 20 61 73 20 6f 72 20 61 20  same .  as or a 
11ad0 73 75 70 65 72 73 65 74 20 6f 66 20 74 68 6f 73  superset of thos
11ae0 65 20 64 65 66 69 6e 65 64 20 66 6f 72 20 74 68  e defined for th
11af0 65 20 46 54 53 20 74 61 62 6c 65 2e 0a 0a 3c 70  e FTS table...<p
11b00 3e 0a 20 20 57 68 65 6e 20 61 20 75 73 65 72 73  >.  When a users
11b10 20 71 75 65 72 79 20 6f 6e 20 74 68 65 20 46 54   query on the FT
11b20 53 20 74 61 62 6c 65 20 72 65 71 75 69 72 65 73  S table requires
11b30 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20   a column value 
11b40 6f 74 68 65 72 20 74 68 61 6e 0a 20 20 64 6f 63  other than.  doc
11b50 69 64 2c 20 46 54 53 20 61 74 74 65 6d 70 74 73  id, FTS attempts
11b60 20 74 6f 20 72 65 61 64 20 74 68 69 73 20 76 61   to read this va
11b70 6c 75 65 20 66 72 6f 6d 20 74 68 65 20 63 6f 72  lue from the cor
11b80 72 65 73 70 6f 6e 64 69 6e 67 20 63 6f 6c 75 6d  responding colum
11b90 6e 20 6f 66 0a 20 20 74 68 65 20 72 6f 77 20 69  n of.  the row i
11ba0 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 74 61  n the content ta
11bb0 62 6c 65 20 77 69 74 68 20 61 20 72 6f 77 69 64  ble with a rowid
11bc0 20 76 61 6c 75 65 20 65 71 75 61 6c 20 74 6f 20   value equal to 
11bd0 74 68 65 20 63 75 72 72 65 6e 74 20 46 54 53 0a  the current FTS.
11be0 20 20 64 6f 63 69 64 2e 20 4f 72 2c 20 69 66 20    docid. Or, if 
11bf0 73 75 63 68 20 61 20 72 6f 77 20 63 61 6e 6e 6f  such a row canno
11c00 74 20 62 65 20 66 6f 75 6e 64 20 69 6e 20 74 68  t be found in th
11c10 65 20 63 6f 6e 74 65 6e 74 20 74 61 62 6c 65 2c  e content table,
11c20 20 61 20 4e 55 4c 4c 0a 20 20 76 61 6c 75 65 20   a NULL.  value 
11c30 69 73 20 75 73 65 64 20 69 6e 73 74 65 61 64 2e  is used instead.
11c40 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 0a 3c   For example:..<
11c50 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20 20 43 52 45  codeblock>.  CRE
11c60 41 54 45 20 54 41 42 4c 45 20 74 32 28 69 64 20  ATE TABLE t2(id 
11c70 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
11c80 4b 45 59 2c 20 61 2c 20 62 2c 20 63 2c 20 64 29  KEY, a, b, c, d)
11c90 3b 0a 20 20 43 52 45 41 54 45 20 56 49 52 54 55  ;.  CREATE VIRTU
11ca0 41 4c 20 54 41 42 4c 45 20 74 33 20 55 53 49 4e  AL TABLE t3 USIN
11cb0 47 20 66 74 73 34 28 63 6f 6e 74 65 6e 74 3d 22  G fts4(content="
11cc0 74 32 22 2c 20 62 2c 20 63 29 3b 0a 20 20 0a 20  t2", b, c);.  . 
11cd0 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20   INSERT INTO t2 
11ce0 56 41 4c 55 45 53 28 32 2c 20 27 61 20 62 27 2c  VALUES(2, 'a b',
11cf0 20 27 63 20 64 27 2c 20 27 65 20 66 27 29 3b 0a   'c d', 'e f');.
11d00 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32    INSERT INTO t2
11d10 20 56 41 4c 55 45 53 28 33 2c 20 27 67 20 68 27   VALUES(3, 'g h'
11d20 2c 20 27 69 20 6a 27 2c 20 27 6b 20 6c 27 29 3b  , 'i j', 'k l');
11d30 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  .  INSERT INTO t
11d40 33 28 64 6f 63 69 64 2c 20 62 2c 20 63 29 20 53  3(docid, b, c) S
11d50 45 4c 45 43 54 20 69 64 2c 20 62 2c 20 63 20 46  ELECT id, b, c F
11d60 52 4f 4d 20 74 32 3b 0a 20 20 3c 69 3e 2d 2d 20  ROM t2;.  <i>-- 
11d70 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 71 75  The following qu
11d80 65 72 79 20 72 65 74 75 72 6e 73 20 61 20 73 69  ery returns a si
11d90 6e 67 6c 65 20 72 6f 77 20 77 69 74 68 20 74 77  ngle row with tw
11da0 6f 20 63 6f 6c 75 6d 6e 73 20 63 6f 6e 74 61 69  o columns contai
11db0 6e 69 6e 67 0a 20 20 2d 2d 20 74 68 65 20 74 65  ning.  -- the te
11dc0 78 74 20 76 61 6c 75 65 73 20 22 69 20 6a 22 20  xt values "i j" 
11dd0 61 6e 64 20 22 6b 20 6c 22 2e 0a 20 20 2d 2d 0a  and "k l"..  --.
11de0 20 20 2d 2d 20 54 68 65 20 71 75 65 72 79 20 75    -- The query u
11df0 73 65 73 20 74 68 65 20 66 75 6c 6c 2d 74 65 78  ses the full-tex
11e00 74 20 69 6e 64 65 78 20 74 6f 20 64 69 73 63 6f  t index to disco
11e10 76 65 72 20 74 68 61 74 20 74 68 65 20 4d 41 54  ver that the MAT
11e20 43 48 20 0a 20 20 2d 2d 20 74 65 72 6d 20 6d 61  CH .  -- term ma
11e30 74 63 68 65 73 20 74 68 65 20 72 6f 77 20 77 69  tches the row wi
11e40 74 68 20 64 6f 63 69 64 3d 33 2e 20 49 74 20 74  th docid=3. It t
11e50 68 65 6e 20 72 65 74 72 69 65 76 65 73 20 74 68  hen retrieves th
11e60 65 20 76 61 6c 75 65 73 0a 20 20 2d 2d 20 6f 66  e values.  -- of
11e70 20 63 6f 6c 75 6d 6e 73 20 62 20 61 6e 64 20 63   columns b and c
11e80 20 66 72 6f 6d 20 74 68 65 20 72 6f 77 20 77 69   from the row wi
11e90 74 68 20 72 6f 77 69 64 3d 33 20 69 6e 20 74 68  th rowid=3 in th
11ea0 65 20 63 6f 6e 74 65 6e 74 20 74 61 62 6c 65 0a  e content table.
11eb0 20 20 2d 2d 20 74 6f 20 72 65 74 75 72 6e 2e 0a    -- to return..
11ec0 20 20 2d 2d 3c 2f 69 3e 0a 20 20 53 45 4c 45 43    --</i>.  SELEC
11ed0 54 20 2a 20 46 52 4f 4d 20 74 33 20 57 48 45 52  T * FROM t3 WHER
11ee0 45 20 74 33 20 4d 41 54 43 48 20 27 6b 27 3b 0a  E t3 MATCH 'k';.
11ef0 0a 20 20 3c 69 3e 2d 2d 20 46 6f 6c 6c 6f 77 69  .  <i>-- Followi
11f00 6e 67 20 74 68 65 20 55 50 44 41 54 45 2c 20 74  ng the UPDATE, t
11f10 68 65 20 71 75 65 72 79 20 73 74 69 6c 6c 20 72  he query still r
11f20 65 74 75 72 6e 73 20 61 20 73 69 6e 67 6c 65 20  eturns a single 
11f30 72 6f 77 2c 20 74 68 69 73 0a 20 20 2d 2d 20 74  row, this.  -- t
11f40 69 6d 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ime containing t
11f50 68 65 20 74 65 78 74 20 76 61 6c 75 65 73 20 22  he text values "
11f60 78 78 78 22 20 61 6e 64 20 22 79 79 79 22 2e 20  xxx" and "yyy". 
11f70 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20  This is because 
11f80 74 68 65 0a 20 20 2d 2d 20 66 75 6c 6c 2d 74 65  the.  -- full-te
11f90 78 74 20 69 6e 64 65 78 20 73 74 69 6c 6c 20 69  xt index still i
11fa0 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74 68  ndicates that th
11fb0 65 20 72 6f 77 20 77 69 74 68 20 64 6f 63 69 64  e row with docid
11fc0 3d 33 20 6d 61 74 63 68 65 73 0a 20 20 2d 2d 20  =3 matches.  -- 
11fd0 74 68 65 20 46 54 53 34 20 71 75 65 72 79 20 27  the FTS4 query '
11fe0 6b 27 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 20  k', even though 
11ff0 74 68 65 20 64 6f 63 75 6d 65 6e 74 73 20 73 74  the documents st
12000 6f 72 65 64 20 69 6e 20 74 68 65 20 63 6f 6e 74  ored in the cont
12010 65 6e 74 0a 20 20 2d 2d 20 74 61 62 6c 65 20 68  ent.  -- table h
12020 61 76 65 20 62 65 65 6e 20 6d 6f 64 69 66 69 65  ave been modifie
12030 64 2e 0a 20 20 2d 2d 3c 2f 69 3e 0a 20 20 55 50  d..  --</i>.  UP
12040 44 41 54 45 20 74 32 20 53 45 54 20 62 20 3d 20  DATE t2 SET b = 
12050 27 78 78 78 27 2c 20 63 20 3d 20 27 79 79 79 27  'xxx', c = 'yyy'
12060 20 57 48 45 52 45 20 72 6f 77 69 64 20 3d 20 33   WHERE rowid = 3
12070 3b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  ;.  SELECT * FRO
12080 4d 20 74 33 20 57 48 45 52 45 20 74 33 20 4d 41  M t3 WHERE t3 MA
12090 54 43 48 20 27 6b 27 3b 0a 0a 20 20 3c 69 3e 2d  TCH 'k';..  <i>-
120a0 2d 20 46 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  - Following the 
120b0 44 45 4c 45 54 45 20 62 65 6c 6f 77 2c 20 74 68  DELETE below, th
120c0 65 20 71 75 65 72 79 20 72 65 74 75 72 6e 73 20  e query returns 
120d0 6f 6e 65 20 72 6f 77 20 63 6f 6e 74 61 69 6e 69  one row containi
120e0 6e 67 20 74 77 6f 0a 20 20 2d 2d 20 4e 55 4c 4c  ng two.  -- NULL
120f0 20 76 61 6c 75 65 73 2e 20 4e 55 4c 4c 20 76 61   values. NULL va
12100 6c 75 65 73 20 61 72 65 20 72 65 74 75 72 6e 65  lues are returne
12110 64 20 62 65 63 61 75 73 65 20 46 54 53 20 69 73  d because FTS is
12120 20 75 6e 61 62 6c 65 20 74 6f 20 66 69 6e 64 0a   unable to find.
12130 20 20 2d 2d 20 61 20 72 6f 77 20 77 69 74 68 20    -- a row with 
12140 72 6f 77 69 64 3d 33 20 77 69 74 68 69 6e 20 74  rowid=3 within t
12150 68 65 20 63 6f 6e 74 65 6e 74 20 74 61 62 6c 65  he content table
12160 2e 0a 20 20 2d 2d 3c 2f 69 3e 0a 20 20 44 45 4c  ..  --</i>.  DEL
12170 45 54 45 20 46 52 4f 4d 20 74 32 3b 0a 20 20 53  ETE FROM t2;.  S
12180 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 33 20  ELECT * FROM t3 
12190 57 48 45 52 45 20 74 33 20 4d 41 54 43 48 20 27  WHERE t3 MATCH '
121a0 6b 27 3b 0a 3c 2f 63 6f 64 65 62 6c 6f 63 6b 3e  k';.</codeblock>
121b0 0a 0a 3c 70 3e 0a 20 20 57 68 65 6e 20 61 20 72  ..<p>.  When a r
121c0 6f 77 20 69 73 20 64 65 6c 65 74 65 64 20 66 72  ow is deleted fr
121d0 6f 6d 20 61 6e 20 65 78 74 65 72 6e 61 6c 20 63  om an external c
121e0 6f 6e 74 65 6e 74 20 46 54 53 34 20 74 61 62 6c  ontent FTS4 tabl
121f0 65 2c 20 46 54 53 34 20 6e 65 65 64 73 20 74 6f  e, FTS4 needs to
12200 0a 20 20 72 65 74 72 69 65 76 65 20 74 68 65 20  .  retrieve the 
12210 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 73 20 6f 66  column values of
12220 20 74 68 65 20 72 6f 77 20 62 65 69 6e 67 20 64   the row being d
12230 65 6c 65 74 65 64 20 66 72 6f 6d 20 74 68 65 20  eleted from the 
12240 63 6f 6e 74 65 6e 74 20 74 61 62 6c 65 2e 0a 20  content table.. 
12250 20 54 68 69 73 20 69 73 20 73 6f 20 74 68 61 74   This is so that
12260 20 46 54 53 34 20 63 61 6e 20 75 70 64 61 74 65   FTS4 can update
12270 20 74 68 65 20 66 75 6c 6c 2d 74 65 78 74 20 69   the full-text i
12280 6e 64 65 78 20 65 6e 74 72 69 65 73 20 66 6f 72  ndex entries for
12290 20 65 61 63 68 20 74 6f 6b 65 6e 0a 20 20 74 68   each token.  th
122a0 61 74 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e  at occurs within
122b0 20 74 68 65 20 64 65 6c 65 74 65 64 20 72 6f 77   the deleted row
122c0 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61   to indicate tha
122d0 74 20 74 68 61 74 20 72 6f 77 20 68 61 73 20 62  t that row has b
122e0 65 65 6e 20 0a 20 20 64 65 6c 65 74 65 64 2e 20  een .  deleted. 
122f0 49 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 74  If the content t
12300 61 62 6c 65 20 72 6f 77 20 63 61 6e 6e 6f 74 20  able row cannot 
12310 62 65 20 66 6f 75 6e 64 2c 20 6f 72 20 69 66 20  be found, or if 
12320 69 74 20 63 6f 6e 74 61 69 6e 73 20 76 61 6c 75  it contains valu
12330 65 73 0a 20 20 69 6e 63 6f 6e 73 69 73 74 65 6e  es.  inconsisten
12340 74 20 77 69 74 68 20 74 68 65 20 63 6f 6e 74 65  t with the conte
12350 6e 74 73 20 6f 66 20 74 68 65 20 46 54 53 20 69  nts of the FTS i
12360 6e 64 65 78 2c 20 74 68 65 20 72 65 73 75 6c 74  ndex, the result
12370 73 20 63 61 6e 20 62 65 20 64 69 66 66 69 63 75  s can be difficu
12380 6c 74 0a 20 20 74 6f 20 70 72 65 64 69 63 74 2e  lt.  to predict.
12390 20 54 68 65 20 46 54 53 20 69 6e 64 65 78 20 6d   The FTS index m
123a0 61 79 20 62 65 20 6c 65 66 74 20 63 6f 6e 74 61  ay be left conta
123b0 69 6e 69 6e 67 20 65 6e 74 72 69 65 73 20 63 6f  ining entries co
123c0 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74  rresponding to t
123d0 68 65 0a 20 20 64 65 6c 65 74 65 64 20 72 6f 77  he.  deleted row
123e0 2c 20 77 68 69 63 68 20 63 61 6e 20 6c 65 61 64  , which can lead
123f0 20 74 6f 20 73 65 65 6d 69 6e 67 6c 79 20 6e 6f   to seemingly no
12400 6e 73 65 6e 73 69 63 61 6c 20 72 65 73 75 6c 74  nsensical result
12410 73 20 62 65 69 6e 67 20 72 65 74 75 72 6e 65 64  s being returned
12420 0a 20 20 62 79 20 73 75 62 73 65 71 75 65 6e 74  .  by subsequent
12430 20 53 45 4c 45 43 54 20 71 75 65 72 69 65 73 2e   SELECT queries.
12440 20 54 68 65 20 73 61 6d 65 20 61 70 70 6c 69 65   The same applie
12450 73 20 77 68 65 6e 20 61 20 72 6f 77 20 69 73 20  s when a row is 
12460 75 70 64 61 74 65 64 2c 20 61 73 0a 20 20 69 6e  updated, as.  in
12470 74 65 72 6e 61 6c 6c 79 20 61 6e 20 55 50 44 41  ternally an UPDA
12480 54 45 20 69 73 20 74 68 65 20 73 61 6d 65 20 61  TE is the same a
12490 73 20 61 20 44 45 4c 45 54 45 20 66 6f 6c 6c 6f  s a DELETE follo
124a0 77 65 64 20 62 79 20 61 6e 20 49 4e 53 45 52 54  wed by an INSERT
124b0 2e 0a 0a 3c 70 3e 20 20 0a 20 20 49 6e 73 74 65  ...<p>  .  Inste
124c0 61 64 20 6f 66 20 77 72 69 74 69 6e 67 20 73 65  ad of writing se
124d0 70 61 72 61 74 65 6c 79 20 74 6f 20 74 68 65 20  parately to the 
124e0 66 75 6c 6c 2d 74 65 78 74 20 69 6e 64 65 78 20  full-text index 
124f0 61 6e 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  and the content 
12500 74 61 62 6c 65 2c 0a 20 20 73 6f 6d 65 20 75 73  table,.  some us
12510 65 72 73 20 6d 61 79 20 77 69 73 68 20 74 6f 20  ers may wish to 
12520 75 73 65 20 64 61 74 61 62 61 73 65 20 74 72 69  use database tri
12530 67 67 65 72 73 20 74 6f 20 6b 65 65 70 20 74 68  ggers to keep th
12540 65 20 66 75 6c 6c 2d 74 65 78 74 20 69 6e 64 65  e full-text inde
12550 78 0a 20 20 75 70 20 74 6f 20 64 61 74 65 20 77  x.  up to date w
12560 69 74 68 20 72 65 73 70 65 63 74 20 74 6f 20 74  ith respect to t
12570 68 65 20 73 65 74 20 6f 66 20 64 6f 63 75 6d 65  he set of docume
12580 6e 74 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68  nts stored in th
12590 65 20 63 6f 6e 74 65 6e 74 20 74 61 62 6c 65 2e  e content table.
125a0 0a 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  .  For example, 
125b0 75 73 69 6e 67 20 74 68 65 20 74 61 62 6c 65 73  using the tables
125c0 20 66 72 6f 6d 20 65 61 72 6c 69 65 72 20 65 78   from earlier ex
125d0 61 6d 70 6c 65 73 3a 0a 0a 3c 63 6f 64 65 62 6c  amples:..<codebl
125e0 6f 63 6b 3e 0a 20 20 43 52 45 41 54 45 20 54 52  ock>.  CREATE TR
125f0 49 47 47 45 52 20 74 32 5f 62 75 20 42 45 46 4f  IGGER t2_bu BEFO
12600 52 45 20 55 50 44 41 54 45 20 4f 4e 20 74 32 20  RE UPDATE ON t2 
12610 42 45 47 49 4e 0a 20 20 20 20 44 45 4c 45 54 45  BEGIN.    DELETE
12620 20 46 52 4f 4d 20 74 33 20 57 48 45 52 45 20 64   FROM t3 WHERE d
12630 6f 63 69 64 3d 6f 6c 64 2e 72 6f 77 69 64 3b 0a  ocid=old.rowid;.
12640 20 20 45 4e 44 3b 0a 20 20 43 52 45 41 54 45 20    END;.  CREATE 
12650 54 52 49 47 47 45 52 20 74 32 5f 62 64 20 42 45  TRIGGER t2_bd BE
12660 46 4f 52 45 20 44 45 4c 45 54 45 20 4f 4e 20 74  FORE DELETE ON t
12670 32 20 42 45 47 49 4e 0a 20 20 20 20 44 45 4c 45  2 BEGIN.    DELE
12680 54 45 20 46 52 4f 4d 20 74 33 20 57 48 45 52 45  TE FROM t3 WHERE
12690 20 64 6f 63 69 64 3d 6f 6c 64 2e 72 6f 77 69 64   docid=old.rowid
126a0 3b 0a 20 20 45 4e 44 3b 0a 0a 20 20 43 52 45 41  ;.  END;..  CREA
126b0 54 45 20 54 52 49 47 47 45 52 20 74 32 5f 62 75  TE TRIGGER t2_bu
126c0 20 41 46 54 45 52 20 55 50 44 41 54 45 20 4f 4e   AFTER UPDATE ON
126d0 20 74 32 20 42 45 47 49 4e 0a 20 20 20 20 49 4e   t2 BEGIN.    IN
126e0 53 45 52 54 20 49 4e 54 4f 20 74 33 28 64 6f 63  SERT INTO t3(doc
126f0 69 64 2c 20 62 2c 20 63 29 20 56 41 4c 55 45 53  id, b, c) VALUES
12700 28 6e 65 77 2e 72 6f 77 69 64 2c 20 6e 65 77 2e  (new.rowid, new.
12710 62 2c 20 6e 65 77 2e 63 29 3b 0a 20 20 45 4e 44  b, new.c);.  END
12720 3b 0a 20 20 43 52 45 41 54 45 20 54 52 49 47 47  ;.  CREATE TRIGG
12730 45 52 20 74 32 5f 62 64 20 41 46 54 45 52 20 49  ER t2_bd AFTER I
12740 4e 53 45 52 54 20 4f 4e 20 74 32 20 42 45 47 49  NSERT ON t2 BEGI
12750 4e 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  N.    INSERT INT
12760 4f 20 74 33 28 64 6f 63 69 64 2c 20 62 2c 20 63  O t3(docid, b, c
12770 29 20 56 41 4c 55 45 53 28 6e 65 77 2e 72 6f 77  ) VALUES(new.row
12780 69 64 2c 20 6e 65 77 2e 62 2c 20 6e 65 77 2e 63  id, new.b, new.c
12790 29 3b 0a 20 20 45 4e 44 3b 0a 3c 2f 63 6f 64 65  );.  END;.</code
127a0 62 6c 6f 63 6b 3e 0a 0a 3c 70 3e 0a 20 20 54 68  block>..<p>.  Th
127b0 65 20 44 45 4c 45 54 45 20 74 72 69 67 67 65 72  e DELETE trigger
127c0 20 6d 75 73 74 20 62 65 20 66 69 72 65 64 20 62   must be fired b
127d0 65 66 6f 72 65 20 74 68 65 20 61 63 74 75 61 6c  efore the actual
127e0 20 64 65 6c 65 74 65 20 74 61 6b 65 73 20 70 6c   delete takes pl
127f0 61 63 65 0a 20 20 6f 6e 20 74 68 65 20 63 6f 6e  ace.  on the con
12800 74 65 6e 74 20 74 61 62 6c 65 2e 20 54 68 69 73  tent table. This
12810 20 69 73 20 73 6f 20 74 68 61 74 20 46 54 53 34   is so that FTS4
12820 20 63 61 6e 20 73 74 69 6c 6c 20 72 65 74 72 69   can still retri
12830 65 76 65 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  eve the original
12840 0a 20 20 76 61 6c 75 65 73 20 69 6e 20 6f 72 64  .  values in ord
12850 65 72 20 74 6f 20 75 70 64 61 74 65 20 74 68 65  er to update the
12860 20 66 75 6c 6c 2d 74 65 78 74 20 69 6e 64 65 78   full-text index
12870 2e 20 41 6e 64 20 74 68 65 20 49 4e 53 45 52 54  . And the INSERT
12880 20 74 72 69 67 67 65 72 20 6d 75 73 74 0a 20 20   trigger must.  
12890 62 65 20 66 69 72 65 64 20 61 66 74 65 72 20 74  be fired after t
128a0 68 65 20 6e 65 77 20 72 6f 77 20 69 73 20 69 6e  he new row is in
128b0 73 65 72 74 65 64 2c 20 73 6f 20 61 73 20 74 6f  serted, so as to
128c0 20 68 61 6e 64 6c 65 20 74 68 65 20 63 61 73 65   handle the case
128d0 20 77 68 65 72 65 20 74 68 65 0a 20 20 72 6f 77   where the.  row
128e0 69 64 20 69 73 20 61 73 73 69 67 6e 65 64 20 61  id is assigned a
128f0 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 77 69 74  utomatically wit
12900 68 69 6e 20 74 68 65 20 73 79 73 74 65 6d 2e 20  hin the system. 
12910 54 68 65 20 55 50 44 41 54 45 20 74 72 69 67 67  The UPDATE trigg
12920 65 72 20 6d 75 73 74 0a 20 20 62 65 20 73 70 6c  er must.  be spl
12930 69 74 20 69 6e 74 6f 20 74 77 6f 20 70 61 72 74  it into two part
12940 73 2c 20 6f 6e 65 20 66 69 72 65 64 20 62 65 66  s, one fired bef
12950 6f 72 65 20 61 6e 64 20 6f 6e 65 20 61 66 74 65  ore and one afte
12960 72 20 74 68 65 20 75 70 64 61 74 65 20 6f 66 20  r the update of 
12970 74 68 65 0a 20 20 63 6f 6e 74 65 6e 74 20 74 61  the.  content ta
12980 62 6c 65 2c 20 66 6f 72 20 74 68 65 20 73 61 6d  ble, for the sam
12990 65 20 72 65 61 73 6f 6e 73 2e 0a 0a 3c 70 3e 0a  e reasons...<p>.
129a0 20 20 54 68 65 20 5b 46 54 53 34 20 22 72 65 62    The [FTS4 "reb
129b0 75 69 6c 64 22 20 63 6f 6d 6d 61 6e 64 5d 0a 20  uild" command]. 
129c0 20 64 65 6c 65 74 65 73 20 74 68 65 20 65 6e 74   deletes the ent
129d0 69 72 65 20 66 75 6c 6c 2d 74 65 78 74 20 69 6e  ire full-text in
129e0 64 65 78 20 61 6e 64 20 72 65 62 75 69 6c 64 73  dex and rebuilds
129f0 20 69 74 20 62 61 73 65 64 20 6f 6e 20 74 68 65   it based on the
12a00 20 63 75 72 72 65 6e 74 0a 20 20 73 65 74 20 6f   current.  set o
12a10 66 20 64 6f 63 75 6d 65 6e 74 73 20 69 6e 20 74  f documents in t
12a20 68 65 20 63 6f 6e 74 65 6e 74 20 74 61 62 6c 65  he content table
12a30 2e 20 41 73 73 75 6d 69 6e 67 20 61 67 61 69 6e  . Assuming again
12a40 20 74 68 61 74 20 22 74 33 22 20 69 73 20 74 68   that "t3" is th
12a50 65 0a 20 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  e.  name of the 
12a60 65 78 74 65 72 6e 61 6c 20 63 6f 6e 74 65 6e 74  external content
12a70 20 46 54 53 34 20 74 61 62 6c 65 2c 20 74 68 65   FTS4 table, the
12a80 20 72 65 62 75 69 6c 64 20 63 6f 6d 6d 61 6e 64   rebuild command
12a90 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 74 68 69 73   looks like this
12aa0 3a 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20  :..<codeblock>. 
12ab0 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 28   INSERT INTO t3(
12ac0 74 33 29 20 56 41 4c 55 45 53 28 27 72 65 62 75  t3) VALUES('rebu
12ad0 69 6c 64 27 29 3b 0a 3c 2f 63 6f 64 65 62 6c 6f  ild');.</codeblo
12ae0 63 6b 3e 0a 0a 3c 70 3e 0a 20 20 54 68 69 73 20  ck>..<p>.  This 
12af0 63 6f 6d 6d 61 6e 64 20 6d 61 79 20 61 6c 73 6f  command may also
12b00 20 62 65 20 75 73 65 64 20 77 69 74 68 20 6f 72   be used with or
12b10 64 69 6e 61 72 79 20 46 54 53 34 20 74 61 62 6c  dinary FTS4 tabl
12b20 65 73 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 20  es, for example 
12b30 69 66 0a 20 20 74 68 65 20 69 6d 70 6c 65 6d 65  if.  the impleme
12b40 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 74  ntation of the t
12b50 6f 6b 65 6e 69 7a 65 72 20 63 68 61 6e 67 65 73  okenizer changes
12b60 2e 20 20 49 74 20 69 73 20 61 6e 0a 20 20 65 72  .  It is an.  er
12b70 72 6f 72 20 74 6f 20 61 74 74 65 6d 70 74 20 74  ror to attempt t
12b80 6f 20 72 65 62 75 69 6c 64 20 74 68 65 20 66 75  o rebuild the fu
12b90 6c 6c 2d 74 65 78 74 20 69 6e 64 65 78 20 6d 61  ll-text index ma
12ba0 69 6e 74 61 69 6e 65 64 20 62 79 20 61 20 63 6f  intained by a co
12bb0 6e 74 65 6e 74 6c 65 73 73 0a 20 20 46 54 53 34  ntentless.  FTS4
12bc0 20 74 61 62 6c 65 2c 20 73 69 6e 63 65 20 6e 6f   table, since no
12bd0 20 63 6f 6e 74 65 6e 74 20 77 69 6c 6c 20 62 65   content will be
12be0 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 64 6f   available to do
12bf0 20 74 68 65 20 72 65 62 75 69 6c 64 69 6e 67 2e   the rebuilding.
12c00 0a 0a 0a 3c 74 63 6c 3e 68 64 5f 66 72 61 67 6d  ...<tcl>hd_fragm
12c10 65 6e 74 20 2a 66 74 73 34 6c 61 6e 67 75 61 67  ent *fts4languag
12c20 65 69 64 20 7b 46 54 53 34 20 6c 61 6e 67 75 61  eid {FTS4 langua
12c30 67 65 69 64 20 6f 70 74 69 6f 6e 7d 3c 2f 74 63  geid option}</tc
12c40 6c 3e 0a 3c 68 32 20 74 61 67 73 3d 22 66 74 73  l>.<h2 tags="fts
12c50 34 20 6c 61 6e 67 75 61 67 65 69 64 20 6f 70 74  4 languageid opt
12c60 69 6f 6e 22 3e 54 68 65 20 6c 61 6e 67 75 61 67  ion">The languag
12c70 65 69 64 3d 20 6f 70 74 69 6f 6e 3c 2f 68 32 3e  eid= option</h2>
12c80 0a 0a 3c 70 3e 0a 20 20 57 68 65 6e 20 74 68 65  ..<p>.  When the
12c90 20 6c 61 6e 67 75 61 67 65 69 64 20 6f 70 74 69   languageid opti
12ca0 6f 6e 20 69 73 20 70 72 65 73 65 6e 74 2c 20 69  on is present, i
12cb0 74 20 73 70 65 63 69 66 69 65 73 20 74 68 65 20  t specifies the 
12cc0 6e 61 6d 65 20 6f 66 0a 20 20 61 6e 6f 74 68 65  name of.  anothe
12cd0 72 20 5b 68 69 64 64 65 6e 20 63 6f 6c 75 6d 6e  r [hidden column
12ce0 5d 20 74 68 61 74 20 69 73 20 61 64 64 65 64 20  ] that is added 
12cf0 74 6f 20 74 68 65 20 46 54 53 34 0a 20 20 74 61  to the FTS4.  ta
12d00 62 6c 65 20 61 6e 64 20 77 68 69 63 68 20 69 73  ble and which is
12d10 20 75 73 65 64 20 74 6f 20 73 70 65 63 69 66 79   used to specify
12d20 20 74 68 65 20 6c 61 6e 67 75 61 67 65 20 73 74   the language st
12d30 6f 72 65 64 20 69 6e 20 65 61 63 68 20 72 6f 77  ored in each row
12d40 0a 20 20 6f 66 20 74 68 65 20 46 54 53 34 20 74  .  of the FTS4 t
12d50 61 62 6c 65 2e 20 20 54 68 65 20 6e 61 6d 65 20  able.  The name 
12d60 6f 66 20 74 68 65 20 6c 61 6e 67 75 61 67 65 69  of the languagei
12d70 64 20 68 69 64 64 65 6e 20 63 6f 6c 75 6d 6e 20  d hidden column 
12d80 6d 75 73 74 0a 20 20 62 65 20 64 69 73 74 69 6e  must.  be distin
12d90 63 74 20 66 72 6f 6d 20 61 6c 6c 20 6f 74 68 65  ct from all othe
12da0 72 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69  r column names i
12db0 6e 20 74 68 65 20 46 54 53 34 20 74 61 62 6c 65  n the FTS4 table
12dc0 2e 20 20 45 78 61 6d 70 6c 65 3a 0a 0a 3c 63 6f  .  Example:..<co
12dd0 64 65 62 6c 6f 63 6b 3e 0a 20 20 43 52 45 41 54  deblock>.  CREAT
12de0 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20  E VIRTUAL TABLE 
12df0 74 31 20 55 53 49 4e 47 20 66 74 73 34 28 78 2c  t1 USING fts4(x,
12e00 20 79 2c 20 6c 61 6e 67 75 61 67 65 69 64 3d 22   y, languageid="
12e10 6c 69 64 22 29 0a 3c 2f 63 6f 64 65 62 6c 6f 63  lid").</codebloc
12e20 6b 3e 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 64 65  k>..<p>.  The de
12e30 66 61 75 6c 74 20 76 61 6c 75 65 20 6f 66 20 61  fault value of a
12e40 20 6c 61 6e 67 75 61 67 65 69 64 20 63 6f 6c 75   languageid colu
12e50 6d 6e 20 69 73 20 30 2e 20 41 6e 79 20 76 61 6c  mn is 0. Any val
12e60 75 65 20 69 6e 73 65 72 74 65 64 0a 20 20 69 6e  ue inserted.  in
12e70 74 6f 20 61 20 6c 61 6e 67 75 61 67 65 69 64 20  to a languageid 
12e80 63 6f 6c 75 6d 6e 20 69 73 20 63 6f 6e 76 65 72  column is conver
12e90 74 65 64 20 74 6f 20 61 20 33 32 2d 62 69 74 20  ted to a 32-bit 
12ea0 28 6e 6f 74 20 36 34 29 20 73 69 67 6e 65 64 0a  (not 64) signed.
12eb0 20 20 69 6e 74 65 67 65 72 2e 0a 0a 3c 70 3e 0a    integer...<p>.
12ec0 20 20 42 79 20 64 65 66 61 75 6c 74 2c 20 46 54    By default, FT
12ed0 53 20 71 75 65 72 69 65 73 20 28 74 68 6f 73 65  S queries (those
12ee0 20 74 68 61 74 20 75 73 65 20 74 68 65 20 4d 41   that use the MA
12ef0 54 43 48 20 6f 70 65 72 61 74 6f 72 29 0a 20 20  TCH operator).  
12f00 63 6f 6e 73 69 64 65 72 20 6f 6e 6c 79 20 74 68  consider only th
12f10 6f 73 65 20 72 6f 77 73 20 77 69 74 68 20 74 68  ose rows with th
12f20 65 20 6c 61 6e 67 75 61 67 65 69 64 20 63 6f 6c  e languageid col
12f30 75 6d 6e 20 73 65 74 20 74 6f 20 30 2e 20 54 6f  umn set to 0. To
12f40 0a 20 20 71 75 65 72 79 20 66 6f 72 20 72 6f 77  .  query for row
12f50 73 20 77 69 74 68 20 6f 74 68 65 72 20 6c 61 6e  s with other lan
12f60 67 75 61 67 65 69 64 20 76 61 6c 75 65 73 2c 20  guageid values, 
12f70 61 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 66 20  a constraint of 
12f80 74 68 65 0a 20 20 66 6f 72 6d 20 22 3c 6c 61 6e  the.  form "<lan
12f90 67 75 61 67 65 2d 69 64 3e 20 3d 20 3c 69 6e 74  guage-id> = <int
12fa0 65 67 65 72 3e 22 20 6d 75 73 74 20 62 65 20 61  eger>" must be a
12fb0 64 64 65 64 20 74 6f 20 74 68 65 20 71 75 65 72  dded to the quer
12fc0 69 65 73 0a 20 20 57 48 45 52 45 20 63 6c 61 75  ies.  WHERE clau
12fd0 73 65 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a  se. For example:
12fe0 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20 20  ..<codeblock>.  
12ff0 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
13000 20 57 48 45 52 45 20 74 31 20 4d 41 54 43 48 20   WHERE t1 MATCH 
13010 27 61 62 63 27 20 41 4e 44 20 6c 69 64 3d 35 3b  'abc' AND lid=5;
13020 0a 3c 2f 63 6f 64 65 62 6c 6f 63 6b 3e 0a 0a 3c  .</codeblock>..<
13030 70 3e 0a 20 20 49 74 20 69 73 20 6e 6f 74 20 70  p>.  It is not p
13040 6f 73 73 69 62 6c 65 20 66 6f 72 20 61 20 73 69  ossible for a si
13050 6e 67 6c 65 20 46 54 53 20 71 75 65 72 79 20 74  ngle FTS query t
13060 6f 20 72 65 74 75 72 6e 20 72 6f 77 73 20 77 69  o return rows wi
13070 74 68 0a 20 20 64 69 66 66 65 72 65 6e 74 20 6c  th.  different l
13080 61 6e 67 75 61 67 65 69 64 20 76 61 6c 75 65 73  anguageid values
13090 2e 20 54 68 65 20 72 65 73 75 6c 74 73 20 6f 66  . The results of
130a0 20 61 64 64 69 6e 67 20 57 48 45 52 45 20 63 6c   adding WHERE cl
130b0 61 75 73 65 73 0a 20 20 74 68 61 74 20 75 73 65  auses.  that use
130c0 20 6f 74 68 65 72 20 6f 70 65 72 61 74 6f 72 73   other operators
130d0 20 28 65 2e 67 2e 20 20 6c 69 64 21 3d 35 2c 20   (e.g.  lid!=5, 
130e0 6f 72 20 6c 69 64 26 6c 74 3b 3d 35 29 20 61 72  or lid&lt;=5) ar
130f0 65 20 75 6e 64 65 66 69 6e 65 64 2e 0a 0a 3c 70  e undefined...<p
13100 3e 0a 20 20 49 66 20 74 68 65 20 63 6f 6e 74 65  >.  If the conte
13110 6e 74 20 6f 70 74 69 6f 6e 20 69 73 20 75 73 65  nt option is use
13120 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65  d along with the
13130 20 6c 61 6e 67 75 61 67 65 69 64 20 6f 70 74 69   languageid opti
13140 6f 6e 2c 0a 20 20 74 68 65 6e 20 74 68 65 20 6e  on,.  then the n
13150 61 6d 65 64 20 6c 61 6e 67 75 61 67 65 69 64 20  amed languageid 
13160 63 6f 6c 75 6d 6e 20 6d 75 73 74 20 65 78 69 73  column must exis
13170 74 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74  t in the content
13180 3d 20 74 61 62 6c 65 0a 20 20 28 73 75 62 6a 65  = table.  (subje
13190 63 74 20 74 6f 20 74 68 65 20 75 73 75 61 6c 20  ct to the usual 
131a0 72 75 6c 65 73 20 2d 20 69 66 20 61 20 71 75 65  rules - if a que
131b0 72 79 20 6e 65 76 65 72 20 6e 65 65 64 73 20 74  ry never needs t
131c0 6f 20 72 65 61 64 20 74 68 65 0a 20 20 63 6f 6e  o read the.  con
131d0 74 65 6e 74 20 74 61 62 6c 65 20 74 68 65 6e 20  tent table then 
131e0 74 68 69 73 20 72 65 73 74 72 69 63 74 69 6f 6e  this restriction
131f0 20 64 6f 65 73 20 6e 6f 74 20 61 70 70 6c 79 29   does not apply)
13200 2e 0a 0a 3c 70 3e 0a 20 20 57 68 65 6e 20 74 68  ...<p>.  When th
13210 65 20 6c 61 6e 67 75 61 67 65 69 64 20 6f 70 74  e languageid opt
13220 69 6f 6e 20 69 73 20 75 73 65 64 2c 20 53 51 4c  ion is used, SQL
13230 69 74 65 20 69 6e 76 6f 6b 65 73 20 74 68 65 20  ite invokes the 
13240 78 4c 61 6e 67 75 61 67 65 69 64 28 29 0a 20 20  xLanguageid().  
13250 6f 6e 20 74 68 65 20 73 71 6c 69 74 65 33 5f 74  on the sqlite3_t
13260 6f 6b 65 6e 69 7a 65 72 5f 6d 6f 64 75 6c 65 20  okenizer_module 
13270 6f 62 6a 65 63 74 20 69 6d 6d 65 64 69 61 74 65  object immediate
13280 6c 79 20 61 66 74 65 72 20 74 68 65 20 6f 62 6a  ly after the obj
13290 65 63 74 0a 20 20 69 73 20 63 72 65 61 74 65 64  ect.  is created
132a0 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 70 61 73   in order to pas
132b0 73 20 69 6e 20 74 68 65 20 6c 61 6e 67 75 61 67  s in the languag
132c0 65 20 69 64 20 74 68 61 74 20 70 61 72 74 69 63  e id that partic
132d0 75 6c 61 72 0a 20 20 74 6f 6b 65 6e 69 7a 65 72  ular.  tokenizer
132e0 20 73 68 6f 75 6c 64 20 75 73 65 2e 20 20 54 68   should use.  Th
132f0 65 20 78 4c 61 6e 67 75 61 67 65 69 64 28 29 20  e xLanguageid() 
13300 6d 65 74 68 6f 64 20 77 69 6c 6c 20 6e 65 76 65  method will neve
13310 72 20 62 65 20 63 61 6c 6c 65 64 0a 20 20 6d 6f  r be called.  mo
13320 72 65 20 74 68 61 6e 20 6f 6e 63 65 20 66 6f 72  re than once for
13330 20 61 6e 79 20 73 69 6e 67 6c 65 20 74 6f 6b 65   any single toke
13340 6e 69 7a 65 72 20 6f 62 6a 65 63 74 2e 0a 20 20  nizer object..  
13350 0a 0a 0a 3c 74 63 6c 3e 68 64 5f 66 72 61 67 6d  ...<tcl>hd_fragm
13360 65 6e 74 20 66 74 73 34 6d 61 74 63 68 69 6e 66  ent fts4matchinf
13370 6f 20 7b 46 54 53 34 20 6d 61 74 63 68 69 6e 66  o {FTS4 matchinf
13380 6f 20 6f 70 74 69 6f 6e 7d 3c 2f 74 63 6c 3e 0a  o option}</tcl>.
13390 3c 68 32 20 74 61 67 73 3d 22 66 74 73 34 20 6d  <h2 tags="fts4 m
133a0 61 74 63 68 69 6e 66 6f 20 6f 70 74 69 6f 6e 22  atchinfo option"
133b0 3e 54 68 65 20 6d 61 74 63 68 69 6e 66 6f 3d 20  >The matchinfo= 
133c0 6f 70 74 69 6f 6e 3c 2f 68 32 3e 0a 0a 3c 70 3e  option</h2>..<p>
133d0 0a 20 20 54 68 65 20 6d 61 74 63 68 69 6e 66 6f  .  The matchinfo
133e0 20 6f 70 74 69 6f 6e 20 6d 61 79 20 6f 6e 6c 79   option may only
133f0 20 62 65 20 73 65 74 20 74 6f 20 74 68 65 20 76   be set to the v
13400 61 6c 75 65 20 22 66 74 73 33 22 2e 20 0a 20 20  alue "fts3". .  
13410 41 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 73 65  Attempting to se
13420 74 20 6d 61 74 63 68 69 6e 66 6f 20 74 6f 20 61  t matchinfo to a
13430 6e 79 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68  nything other th
13440 61 6e 20 22 66 74 73 33 22 20 69 73 20 61 6e 20  an "fts3" is an 
13450 65 72 72 6f 72 2e 0a 20 20 49 66 20 74 68 69 73  error..  If this
13460 20 6f 70 74 69 6f 6e 20 69 73 20 73 70 65 63 69   option is speci
13470 66 69 65 64 2c 20 74 68 65 6e 20 73 6f 6d 65 20  fied, then some 
13480 6f 66 20 74 68 65 20 65 78 74 72 61 20 69 6e 66  of the extra inf
13490 6f 72 6d 61 74 69 6f 6e 20 73 74 6f 72 65 64 20  ormation stored 
134a0 62 79 0a 20 20 46 54 53 34 20 69 73 20 6f 6d 69  by.  FTS4 is omi
134b0 74 74 65 64 2e 20 54 68 69 73 20 72 65 64 75 63  tted. This reduc
134c0 65 73 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66  es the amount of
134d0 20 64 69 73 6b 20 73 70 61 63 65 20 63 6f 6e 73   disk space cons
134e0 75 6d 65 64 20 62 79 0a 20 20 61 6e 20 46 54 53  umed by.  an FTS
134f0 34 20 74 61 62 6c 65 20 75 6e 74 69 6c 20 69 74  4 table until it
13500 20 69 73 20 61 6c 6d 6f 73 74 20 74 68 65 20 73   is almost the s
13510 61 6d 65 20 61 73 20 74 68 65 20 61 6d 6f 75 6e  ame as the amoun
13520 74 20 74 68 61 74 20 77 6f 75 6c 64 0a 20 20 62  t that would.  b
13530 65 20 75 73 65 64 20 62 79 20 74 68 65 20 65 71  e used by the eq
13540 75 69 76 61 6c 65 6e 74 20 46 54 53 33 20 74 61  uivalent FTS3 ta
13550 62 6c 65 2c 20 62 75 74 20 61 6c 73 6f 20 6d 65  ble, but also me
13560 61 6e 73 20 74 68 61 74 20 74 68 65 20 64 61 74  ans that the dat
13570 61 0a 20 20 61 63 63 65 73 73 65 64 20 62 79 20  a.  accessed by 
13580 70 61 73 73 69 6e 67 20 74 68 65 20 27 6c 27 20  passing the 'l' 
13590 66 6c 61 67 20 74 6f 20 74 68 65 20 5b 6d 61 74  flag to the [mat
135a0 63 68 69 6e 66 6f 28 29 5d 20 66 75 6e 63 74 69  chinfo()] functi
135b0 6f 6e 20 69 73 0a 20 20 6e 6f 74 20 61 76 61 69  on is.  not avai
135c0 6c 61 62 6c 65 2e 20 0a 0a 3c 74 63 6c 3e 68 64  lable. ..<tcl>hd
135d0 5f 66 72 61 67 6d 65 6e 74 20 66 74 73 34 70 72  _fragment fts4pr
135e0 65 66 69 78 20 7b 46 54 53 34 20 70 72 65 66 69  efix {FTS4 prefi
135f0 78 20 6f 70 74 69 6f 6e 7d 3c 2f 74 63 6c 3e 0a  x option}</tcl>.
13600 3c 68 32 20 74 61 67 73 3d 22 66 74 73 34 20 70  <h2 tags="fts4 p
13610 72 65 66 69 78 20 6f 70 74 69 6f 6e 22 3e 54 68  refix option">Th
13620 65 20 70 72 65 66 69 78 3d 20 6f 70 74 69 6f 6e  e prefix= option
13630 3c 2f 68 32 3e 0a 0a 3c 70 3e 0a 20 20 5e 54 68  </h2>..<p>.  ^Th
13640 65 20 46 54 53 34 20 70 72 65 66 69 78 20 6f 70  e FTS4 prefix op
13650 74 69 6f 6e 20 63 61 75 73 65 73 20 46 54 53 20  tion causes FTS 
13660 74 6f 20 69 6e 64 65 78 20 74 65 72 6d 20 70 72  to index term pr
13670 65 66 69 78 65 73 20 6f 66 20 73 70 65 63 69 66  efixes of specif
13680 69 65 64 20 6c 65 6e 67 74 68 73 0a 20 20 69 6e  ied lengths.  in
13690 20 74 68 65 20 73 61 6d 65 20 77 61 79 20 74 68   the same way th
136a0 61 74 20 69 74 20 61 6c 77 61 79 73 20 69 6e 64  at it always ind
136b0 65 78 65 73 20 63 6f 6d 70 6c 65 74 65 20 74 65  exes complete te
136c0 72 6d 73 2e 20 20 5e 54 68 65 20 70 72 65 66 69  rms.  ^The prefi
136d0 78 20 6f 70 74 69 6f 6e 0a 20 20 6d 75 73 74 20  x option.  must 
136e0 62 65 20 73 65 74 20 74 6f 20 61 20 63 6f 6d 6d  be set to a comm
136f0 61 20 73 65 70 61 72 61 74 65 64 20 6c 69 73 74  a separated list
13700 20 6f 66 20 70 6f 73 69 74 69 76 65 20 6e 6f 6e   of positive non
13710 2d 7a 65 72 6f 20 69 6e 74 65 67 65 72 73 2e 20  -zero integers. 
13720 0a 20 20 5e 46 6f 72 20 65 61 63 68 20 76 61 6c  .  ^For each val
13730 75 65 20 4e 20 69 6e 20 74 68 65 20 6c 69 73 74  ue N in the list
13740 2c 20 70 72 65 66 69 78 65 73 20 6f 66 20 6c 65  , prefixes of le
13750 6e 67 74 68 20 4e 20 62 79 74 65 73 20 28 77 68  ngth N bytes (wh
13760 65 6e 20 65 6e 63 6f 64 65 64 20 0a 20 20 75 73  en encoded .  us
13770 69 6e 67 20 55 54 46 2d 38 29 20 61 72 65 20 69  ing UTF-8) are i
13780 6e 64 65 78 65 64 2e 20 20 5e 46 54 53 34 20 75  ndexed.  ^FTS4 u
13790 73 65 73 20 74 65 72 6d 20 70 72 65 66 69 78 20  ses term prefix 
137a0 69 6e 64 65 78 65 73 20 74 6f 20 73 70 65 65 64  indexes to speed
137b0 20 75 70 0a 20 20 5b 70 72 65 66 69 78 20 71 75   up.  [prefix qu
137c0 65 72 69 65 73 5d 2e 20 54 68 65 20 63 6f 73 74  eries]. The cost
137d0 2c 20 6f 66 20 63 6f 75 72 73 65 2c 20 69 73 20  , of course, is 
137e0 74 68 61 74 20 69 6e 64 65 78 69 6e 67 20 74 65  that indexing te
137f0 72 6d 20 70 72 65 66 69 78 65 73 20 61 73 0a 20  rm prefixes as. 
13800 20 77 65 6c 6c 20 61 73 20 63 6f 6d 70 6c 65 74   well as complet
13810 65 20 74 65 72 6d 73 20 69 6e 63 72 65 61 73 65  e terms increase
13820 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  s the database s
13830 69 7a 65 20 61 6e 64 20 73 6c 6f 77 73 20 64 6f  ize and slows do
13840 77 6e 20 77 72 69 74 65 20 0a 20 20 6f 70 65 72  wn write .  oper
13850 61 74 69 6f 6e 73 20 6f 6e 20 74 68 65 20 46 54  ations on the FT
13860 53 34 20 74 61 62 6c 65 2e 0a 0a 3c 70 3e 0a 20  S4 table...<p>. 
13870 20 50 72 65 66 69 78 20 69 6e 64 65 78 65 73 20   Prefix indexes 
13880 6d 61 79 20 62 65 20 75 73 65 64 20 74 6f 20 6f  may be used to o
13890 70 74 69 6d 69 7a 65 20 5b 70 72 65 66 69 78 20  ptimize [prefix 
138a0 71 75 65 72 69 65 73 5d 20 69 6e 20 74 77 6f 20  queries] in two 
138b0 63 61 73 65 73 2e 0a 20 20 49 66 20 74 68 65 20  cases..  If the 
138c0 71 75 65 72 79 20 69 73 20 66 6f 72 20 61 20 70  query is for a p
138d0 72 65 66 69 78 20 6f 66 20 4e 20 62 79 74 65 73  refix of N bytes
138e0 2c 20 74 68 65 6e 20 61 20 70 72 65 66 69 78 20  , then a prefix 
138f0 69 6e 64 65 78 20 63 72 65 61 74 65 64 0a 20 20  index created.  
13900 77 69 74 68 20 22 70 72 65 66 69 78 3d 4e 22 20  with "prefix=N" 
13910 70 72 6f 76 69 64 65 73 20 74 68 65 20 62 65 73  provides the bes
13920 74 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20  t optimization. 
13930 4f 72 2c 20 69 66 20 6e 6f 20 22 70 72 65 66 69  Or, if no "prefi
13940 78 3d 4e 22 0a 20 20 69 6e 64 65 78 20 69 73 20  x=N".  index is 
13950 61 76 61 69 6c 61 62 6c 65 2c 20 61 20 22 70 72  available, a "pr
13960 65 66 69 78 3d 4e 2b 31 22 20 69 6e 64 65 78 20  efix=N+1" index 
13970 6d 61 79 20 62 65 20 75 73 65 64 20 69 6e 73 74  may be used inst
13980 65 61 64 2e 20 0a 20 20 55 73 69 6e 67 20 61 20  ead. .  Using a 
13990 22 70 72 65 66 69 78 3d 4e 2b 31 22 20 69 6e 64  "prefix=N+1" ind
139a0 65 78 20 69 73 20 6c 65 73 73 0a 20 20 65 66 66  ex is less.  eff
139b0 69 63 69 65 6e 74 20 74 68 61 6e 20 61 20 22 70  icient than a "p
139c0 72 65 66 69 78 3d 4e 22 20 69 6e 64 65 78 2c 20  refix=N" index, 
139d0 62 75 74 20 69 73 20 62 65 74 74 65 72 20 74 68  but is better th
139e0 61 6e 20 6e 6f 20 70 72 65 66 69 78 20 69 6e 64  an no prefix ind
139f0 65 78 20 61 74 20 61 6c 6c 2e 0a 0a 3c 63 6f 64  ex at all...<cod
13a00 65 62 6c 6f 63 6b 3e 0a 20 20 3c 69 3e 2d 2d 20  eblock>.  <i>-- 
13a10 43 72 65 61 74 65 20 61 6e 20 46 54 53 34 20 74  Create an FTS4 t
13a20 61 62 6c 65 20 77 69 74 68 20 69 6e 64 65 78 65  able with indexe
13a30 73 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20 32 20  s to optimize 2 
13a40 61 6e 64 20 34 20 62 79 74 65 20 70 72 65 66 69  and 4 byte prefi
13a50 78 20 71 75 65 72 69 65 73 2e 3c 2f 69 3e 0a 20  x queries.</i>. 
13a60 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20   CREATE VIRTUAL 
13a70 54 41 42 4c 45 20 74 31 20 55 53 49 4e 47 20 66  TABLE t1 USING f
13a80 74 73 34 28 63 31 2c 20 63 32 2c 20 70 72 65 66  ts4(c1, c2, pref
13a90 69 78 3d 22 32 2c 34 22 29 3b 0a 0a 20 20 3c 69  ix="2,4");..  <i
13aa0 3e 2d 2d 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  >-- The followin
13ab0 67 20 74 77 6f 20 71 75 65 72 69 65 73 20 61 72  g two queries ar
13ac0 65 20 62 6f 74 68 20 6f 70 74 69 6d 69 7a 65 64  e both optimized
13ad0 20 75 73 69 6e 67 20 74 68 65 20 70 72 65 66 69   using the prefi
13ae0 78 20 69 6e 64 65 78 65 73 2e 3c 2f 69 3e 0a 20  x indexes.</i>. 
13af0 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
13b00 31 20 57 48 45 52 45 20 74 31 20 4d 41 54 43 48  1 WHERE t1 MATCH
13b10 20 27 61 62 2a 27 3b 0a 20 20 53 45 4c 45 43 54   'ab*';.  SELECT
13b20 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   * FROM t1 WHERE
13b30 20 74 31 20 4d 41 54 43 48 20 27 61 62 63 64 2a   t1 MATCH 'abcd*
13b40 27 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 54 68 65 20  ';..  <i>-- The 
13b50 66 6f 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 71 75  following two qu
13b60 65 72 69 65 73 20 61 72 65 20 62 6f 74 68 20 70  eries are both p
13b70 61 72 74 69 61 6c 6c 79 20 6f 70 74 69 6d 69 7a  artially optimiz
13b80 65 64 20 75 73 69 6e 67 20 74 68 65 20 70 72 65  ed using the pre
13b90 66 69 78 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20  fix</i>.  <i>-- 
13ba0 69 6e 64 65 78 65 73 2e 20 54 68 65 20 6f 70 74  indexes. The opt
13bb0 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 6e 6f 74  imization is not
13bc0 20 61 73 20 70 72 6f 6e 6f 75 6e 63 65 64 20 61   as pronounced a
13bd0 73 20 69 74 20 69 73 20 66 6f 72 20 74 68 65 20  s it is for the 
13be0 71 75 65 72 69 65 73 3c 2f 69 3e 0a 20 20 3c 69  queries</i>.  <i
13bf0 3e 2d 2d 20 61 62 6f 76 65 2c 20 62 75 74 20 73  >-- above, but s
13c00 74 69 6c 6c 20 61 6e 20 69 6d 70 72 6f 76 65 6d  till an improvem
13c10 65 6e 74 20 6f 76 65 72 20 6e 6f 20 70 72 65 66  ent over no pref
13c20 69 78 20 69 6e 64 65 78 65 73 20 61 74 20 61 6c  ix indexes at al
13c30 6c 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45 43 54 20  l.</i>.  SELECT 
13c40 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  * FROM t1 WHERE 
13c50 74 31 20 4d 41 54 43 48 20 27 61 2a 27 3b 0a 20  t1 MATCH 'a*';. 
13c60 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
13c70 31 20 57 48 45 52 45 20 74 31 20 4d 41 54 43 48  1 WHERE t1 MATCH
13c80 20 27 61 62 63 2a 27 3b 0a 3c 2f 63 6f 64 65 62   'abc*';.</codeb
13c90 6c 6f 63 6b 3e 0a 0a 3c 74 63 6c 3e 68 64 5f 66  lock>..<tcl>hd_f
13ca0 72 61 67 6d 65 6e 74 20 2a 63 6d 64 73 20 7b 46  ragment *cmds {F
13cb0 54 53 34 20 63 6f 6d 6d 61 6e 64 73 7d 3c 2f 74  TS4 commands}</t
13cc0 63 6c 3e 0a 3c 68 31 20 69 64 3d 63 6f 6d 6d 61  cl>.<h1 id=comma
13cd0 6e 64 73 20 74 61 67 73 3d 22 63 6f 6d 6d 61 6e  nds tags="comman
13ce0 64 73 22 3e 53 70 65 63 69 61 6c 20 43 6f 6d 6d  ds">Special Comm
13cf0 61 6e 64 73 20 46 6f 72 20 46 54 53 33 20 61 6e  ands For FTS3 an
13d00 64 20 46 54 53 34 3c 2f 68 31 3e 0a 0a 3c 70 3e  d FTS4</h1>..<p>
13d10 0a 20 20 53 70 65 63 69 61 6c 20 49 4e 53 45 52  .  Special INSER
13d20 54 20 6f 70 65 72 61 74 65 73 20 63 61 6e 20 62  T operates can b
13d30 65 20 75 73 65 64 20 74 6f 20 69 73 73 75 65 20  e used to issue 
13d40 63 6f 6d 6d 61 6e 64 73 20 74 6f 20 46 54 53 33  commands to FTS3
13d50 20 61 6e 64 20 46 54 53 34 20 74 61 62 6c 65 73   and FTS4 tables
13d60 2e 0a 20 20 45 76 65 72 79 20 46 54 53 33 20 61  ..  Every FTS3 a
13d70 6e 64 20 46 54 53 34 20 68 61 73 20 61 20 68 69  nd FTS4 has a hi
13d80 64 64 65 6e 2c 20 72 65 61 64 2d 6f 6e 6c 79 20  dden, read-only 
13d90 63 6f 6c 75 6d 6e 20 77 68 69 63 68 20 69 73 20  column which is 
13da0 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 61 73  the same name as
13db0 0a 20 20 74 68 65 20 74 61 62 6c 65 20 69 74 73  .  the table its
13dc0 65 6c 66 2e 20 20 49 4e 53 45 52 54 73 20 69 6e  elf.  INSERTs in
13dd0 74 6f 20 74 68 69 73 20 68 69 64 64 65 6e 20 63  to this hidden c
13de0 6f 6c 75 6d 6e 20 61 72 65 20 69 6e 74 65 72 70  olumn are interp
13df0 72 65 74 65 64 20 61 73 20 63 6f 6d 6d 61 6e 64  reted as command
13e00 73 0a 20 20 74 6f 20 74 68 65 20 46 54 53 33 2f  s.  to the FTS3/
13e10 34 20 74 61 62 6c 65 2e 20 20 46 6f 72 20 61 20  4 table.  For a 
13e20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65 20 6e  table with the n
13e30 61 6d 65 20 22 78 79 7a 22 20 74 68 65 20 66 6f  ame "xyz" the fo
13e40 6c 6c 6f 77 69 6e 67 20 63 6f 6d 6d 61 6e 64 73  llowing commands
13e50 0a 20 20 61 72 65 20 73 75 70 70 6f 72 74 65 64  .  are supported
13e60 3a 0a 0a 3c 75 6c 3e 0a 3c 6c 69 3e 3c 70 3e 49  :..<ul>.<li><p>I
13e70 4e 53 45 52 54 20 49 4e 54 4f 20 78 79 7a 28 78  NSERT INTO xyz(x
13e80 79 7a 29 20 56 41 4c 55 45 53 28 27 6f 70 74 69  yz) VALUES('opti
13e90 6d 69 7a 65 27 29 3b 3c 2f 70 3e 0a 3c 6c 69 3e  mize');</p>.<li>
13ea0 3c 70 3e 49 4e 53 45 52 54 20 49 4e 54 4f 20 78  <p>INSERT INTO x
13eb0 79 7a 28 78 79 7a 29 20 56 41 4c 55 45 53 28 27  yz(xyz) VALUES('
13ec0 72 65 62 75 69 6c 64 27 29 3b 3c 2f 70 3e 0a 3c  rebuild');</p>.<
13ed0 6c 69 3e 3c 70 3e 49 4e 53 45 52 54 20 49 4e 54  li><p>INSERT INT
13ee0 4f 20 78 79 7a 28 78 79 7a 29 20 56 41 4c 55 45  O xyz(xyz) VALUE
13ef0 53 28 27 69 6e 74 65 67 72 69 74 79 2d 63 68 65  S('integrity-che
13f00 63 6b 27 29 3b 3c 2f 70 3e 0a 3c 6c 69 3e 3c 70  ck');</p>.<li><p
13f10 3e 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 79 7a  >INSERT INTO xyz
13f20 28 78 79 7a 29 20 56 41 4c 55 45 53 28 27 6d 65  (xyz) VALUES('me
13f30 72 67 65 3d 58 2c 59 27 29 3b 3c 2f 70 3e 0a 3c  rge=X,Y');</p>.<
13f40 6c 69 3e 3c 70 3e 49 4e 53 45 52 54 20 49 4e 54  li><p>INSERT INT
13f50 4f 20 78 79 7a 28 78 79 7a 29 20 56 41 4c 55 45  O xyz(xyz) VALUE
13f60 53 28 27 61 75 74 6f 6d 65 72 67 65 3d 42 27 29  S('automerge=B')
13f70 3b 3c 2f 70 3e 0a 3c 2f 75 6c 3e 0a 0a 3c 74 63  ;</p>.</ul>..<tc
13f80 6c 3e 68 64 5f 66 72 61 67 6d 65 6e 74 20 2a 66  l>hd_fragment *f
13f90 74 73 34 6f 70 74 63 6d 64 20 7b 46 54 53 34 20  ts4optcmd {FTS4 
13fa0 22 6f 70 74 69 6d 69 7a 65 22 20 63 6f 6d 6d 61  "optimize" comma
13fb0 6e 64 7d 20 5c 0a 20 20 20 20 20 20 20 20 20 20  nd} \.          
13fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13fd0 20 20 20 7b 22 6f 70 74 69 6d 69 7a 65 22 20 63     {"optimize" c
13fe0 6f 6d 6d 61 6e 64 7d 3c 2f 74 63 6c 3e 0a 3c 68  ommand}</tcl>.<h
13ff0 32 20 69 64 3d 6f 70 74 69 6d 69 7a 65 3e 54 68  2 id=optimize>Th
14000 65 20 22 6f 70 74 69 6d 69 7a 65 22 20 63 6f 6d  e "optimize" com
14010 6d 61 6e 64 3c 2f 68 32 3e 0a 0a 3c 70 3e 0a 20  mand</h2>..<p>. 
14020 20 54 68 65 20 22 6f 70 74 69 6d 69 7a 65 22 20   The "optimize" 
14030 63 6f 6d 6d 61 6e 64 20 63 61 75 73 65 73 20 46  command causes F
14040 54 53 33 2f 34 20 74 6f 20 6d 65 72 67 65 20 74  TS3/4 to merge t
14050 6f 67 65 74 68 65 72 20 61 6c 6c 20 6f 66 20 69  ogether all of i
14060 74 73 0a 20 20 69 6e 76 65 72 74 65 64 20 69 6e  ts.  inverted in
14070 64 65 78 20 62 2d 74 72 65 65 73 20 69 6e 74 6f  dex b-trees into
14080 20 6f 6e 65 20 6c 61 72 67 65 20 61 6e 64 20 63   one large and c
14090 6f 6d 70 6c 65 74 65 20 62 2d 74 72 65 65 2e 20  omplete b-tree. 
140a0 20 44 6f 69 6e 67 0a 20 20 61 6e 20 6f 70 74 69   Doing.  an opti
140b0 6d 69 7a 65 20 77 69 6c 6c 20 6d 61 6b 65 20 73  mize will make s
140c0 75 62 73 65 71 75 65 6e 74 20 71 75 65 72 69 65  ubsequent querie
140d0 73 20 72 75 6e 20 66 61 73 74 65 72 20 73 69 6e  s run faster sin
140e0 63 65 20 74 68 65 72 65 20 61 72 65 0a 20 20 66  ce there are.  f
140f0 65 77 65 72 20 62 2d 74 72 65 65 73 20 74 6f 20  ewer b-trees to 
14100 73 65 61 72 63 68 2c 20 61 6e 64 20 69 74 20 6d  search, and it m
14110 61 79 20 72 65 64 75 63 65 20 64 69 73 6b 20 75  ay reduce disk u
14120 73 61 67 65 20 62 79 20 63 6f 61 6c 65 73 63 69  sage by coalesci
14130 6e 67 0a 20 20 72 65 64 75 6e 64 61 6e 74 20 65  ng.  redundant e
14140 6e 74 72 69 65 73 2e 20 20 48 6f 77 65 76 65 72  ntries.  However
14150 2c 20 66 6f 72 20 61 20 6c 61 72 67 65 20 46 54  , for a large FT
14160 53 20 74 61 62 6c 65 2c 20 72 75 6e 6e 69 6e 67  S table, running
14170 20 6f 70 74 69 6d 69 7a 65 0a 20 20 63 61 6e 20   optimize.  can 
14180 62 65 20 61 73 20 65 78 70 65 6e 73 69 76 65 20  be as expensive 
14190 61 73 20 72 75 6e 6e 69 6e 67 20 5b 56 41 43 55  as running [VACU
141a0 55 4d 5d 2e 20 20 54 68 65 20 6f 70 74 69 6d 69  UM].  The optimi
141b0 7a 65 20 63 6f 6d 6d 61 6e 64 0a 20 20 65 73 73  ze command.  ess
141c0 65 6e 74 69 61 6c 6c 79 20 68 61 73 20 74 6f 20  entially has to 
141d0 72 65 61 64 20 61 6e 64 20 77 72 69 74 65 20 74  read and write t
141e0 68 65 20 65 6e 74 69 72 65 20 46 54 53 20 74 61  he entire FTS ta
141f0 62 6c 65 2c 20 72 65 73 75 6c 74 69 6e 67 0a 20  ble, resulting. 
14200 20 69 6e 20 61 20 6c 61 72 67 65 20 74 72 61 6e   in a large tran
14210 73 61 63 74 69 6f 6e 2e 0a 0a 3c 70 3e 0a 20 20  saction...<p>.  
14220 49 6e 20 62 61 74 63 68 2d 6d 6f 64 65 20 6f 70  In batch-mode op
14230 65 72 61 74 69 6f 6e 2c 20 77 68 65 72 65 20 61  eration, where a
14240 6e 20 46 54 53 20 74 61 62 6c 65 20 69 73 20 69  n FTS table is i
14250 6e 69 74 69 61 6c 6c 79 20 62 75 69 6c 74 20 75  nitially built u
14260 70 0a 20 20 75 73 69 6e 67 20 61 20 6c 61 72 67  p.  using a larg
14270 65 20 6e 75 6d 62 65 72 20 6f 66 20 49 4e 53 45  e number of INSE
14280 52 54 20 6f 70 65 72 61 74 69 6f 6e 73 2c 20 74  RT operations, t
14290 68 65 6e 20 71 75 65 72 69 65 64 20 72 65 70 65  hen queried repe
142a0 61 74 65 64 6c 79 0a 20 20 77 69 74 68 6f 75 74  atedly.  without
142b0 20 66 75 72 74 68 65 72 20 63 68 61 6e 67 65 73   further changes
142c0 2c 20 69 74 20 69 73 20 6f 66 74 65 6e 20 61 20  , it is often a 
142d0 67 6f 6f 64 20 69 64 65 61 0a 20 20 74 6f 20 72  good idea.  to r
142e0 75 6e 20 22 6f 70 74 69 6d 69 7a 65 22 20 61 66  un "optimize" af
142f0 74 65 72 20 74 68 65 20 6c 61 73 74 20 49 4e 53  ter the last INS
14300 45 52 54 20 61 6e 64 20 62 65 66 6f 72 65 20 74  ERT and before t
14310 68 65 20 66 69 72 73 74 20 71 75 65 72 79 2e 0a  he first query..
14320 0a 3c 74 63 6c 3e 68 64 5f 66 72 61 67 6d 65 6e  .<tcl>hd_fragmen
14330 74 20 2a 66 74 73 34 72 65 62 75 69 64 63 6d 64  t *fts4rebuidcmd
14340 20 7b 46 54 53 34 20 22 72 65 62 75 69 6c 64 22   {FTS4 "rebuild"
14350 20 63 6f 6d 6d 61 6e 64 7d 20 5c 0a 20 20 20 20   command} \.    
14360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14370 20 20 20 20 20 20 20 20 20 20 20 20 7b 22 72 65              {"re
14380 62 75 69 6c 64 22 20 63 6f 6d 6d 61 6e 64 7d 3c  build" command}<
14390 2f 74 63 6c 3e 0a 3c 68 32 20 69 64 3d 72 65 62  /tcl>.<h2 id=reb
143a0 75 69 6c 64 3e 54 68 65 20 22 72 65 62 75 69 6c  uild>The "rebuil
143b0 64 22 20 63 6f 6d 6d 61 6e 64 3c 2f 68 32 3e 0a  d" command</h2>.
143c0 0a 3c 70 3e 0a 20 20 54 68 65 20 22 72 65 62 75  .<p>.  The "rebu
143d0 69 6c 64 22 20 63 6f 6d 6d 61 6e 64 20 63 61 75  ild" command cau
143e0 73 65 73 20 53 51 4c 69 74 65 20 74 6f 20 64 69  ses SQLite to di
143f0 73 63 61 72 64 20 74 68 65 20 65 6e 74 69 72 65  scard the entire
14400 20 46 54 53 33 2f 34 0a 20 20 74 61 62 6c 65 20   FTS3/4.  table 
14410 61 6e 64 20 74 68 65 6e 20 72 65 62 75 69 6c 64  and then rebuild
14420 20 69 74 20 61 67 61 69 6e 20 66 72 6f 6d 20 6f   it again from o
14430 72 69 67 69 6e 61 6c 20 74 65 78 74 2e 20 20 54  riginal text.  T
14440 68 65 20 63 6f 6e 63 65 70 74 0a 20 20 69 73 20  he concept.  is 
14450 73 69 6d 69 6c 61 72 20 74 6f 20 5b 52 45 49 4e  similar to [REIN
14460 44 45 58 5d 2c 20 6f 6e 6c 79 20 74 68 61 74 20  DEX], only that 
14470 69 74 20 61 70 70 6c 69 65 73 20 74 6f 20 61 6e  it applies to an
14480 0a 20 20 46 54 53 33 2f 34 20 74 61 62 6c 65 20  .  FTS3/4 table 
14490 69 6e 73 74 65 61 64 20 6f 66 20 61 6e 20 6f 72  instead of an or
144a0 64 69 6e 61 72 79 20 69 6e 64 65 78 2e 0a 0a 3c  dinary index...<
144b0 70 3e 0a 20 20 54 68 65 20 22 72 65 62 75 69 6c  p>.  The "rebuil
144c0 64 22 20 63 6f 6d 6d 61 6e 64 20 73 68 6f 75 6c  d" command shoul
144d0 64 20 62 65 20 72 75 6e 20 77 68 65 6e 65 76 65  d be run wheneve
144e0 72 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  r the implementa
144f0 74 69 6f 6e 0a 20 20 6f 66 20 61 20 63 75 73 74  tion.  of a cust
14500 6f 6d 20 74 6f 6b 65 6e 69 7a 65 72 20 63 68 61  om tokenizer cha
14510 6e 67 65 73 2c 20 73 6f 20 74 68 61 74 20 61 6c  nges, so that al
14520 6c 20 63 6f 6e 74 65 6e 74 20 63 61 6e 20 62 65  l content can be
14530 20 72 65 74 6f 6b 65 6e 69 7a 65 64 2e 0a 20 20   retokenized..  
14540 54 68 65 20 22 72 65 62 75 69 6c 64 22 20 63 6f  The "rebuild" co
14550 6d 6d 61 6e 64 20 69 73 20 61 6c 73 6f 20 75 73  mmand is also us
14560 65 66 75 6c 20 77 68 65 6e 20 75 73 69 6e 67 20  eful when using 
14570 74 68 65 0a 20 20 5b 46 54 53 34 20 63 6f 6e 74  the.  [FTS4 cont
14580 65 6e 74 20 6f 70 74 69 6f 6e 5d 20 61 66 74 65  ent option] afte
14590 72 20 63 68 61 6e 67 65 73 20 68 61 76 65 20 62  r changes have b
145a0 65 65 6e 20 6d 61 64 65 20 74 6f 20 74 68 65 20  een made to the 
145b0 6f 72 69 67 69 6e 61 6c 0a 20 20 63 6f 6e 74 65  original.  conte
145c0 6e 74 20 74 61 62 6c 65 2e 0a 0a 3c 74 63 6c 3e  nt table...<tcl>
145d0 68 64 5f 66 72 61 67 6d 65 6e 74 20 2a 66 74 73  hd_fragment *fts
145e0 34 69 63 6b 63 6d 64 20 7b 46 54 53 34 20 22 69  4ickcmd {FTS4 "i
145f0 6e 74 65 67 72 69 74 79 2d 63 68 65 63 6b 22 20  ntegrity-check" 
14600 63 6f 6d 6d 61 6e 64 7d 3c 2f 74 63 6c 3e 0a 3c  command}</tcl>.<
14610 68 32 20 69 64 3d 69 6e 74 65 67 63 68 65 63 6b  h2 id=integcheck
14620 3e 54 68 65 20 22 69 6e 74 65 67 72 69 74 79 2d  >The "integrity-
14630 63 68 65 63 6b 22 20 63 6f 6d 6d 61 6e 64 3c 2f  check" command</
14640 68 32 3e 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 22  h2>..<p>.  The "
14650 69 6e 74 65 67 72 69 74 79 2d 63 68 65 63 6b 22  integrity-check"
14660 20 63 6f 6d 6d 61 6e 64 20 63 61 75 73 65 73 20   command causes 
14670 53 51 4c 69 74 65 20 74 6f 20 72 65 61 64 20 61  SQLite to read a
14680 6e 64 20 76 65 72 69 66 79 0a 20 20 74 68 65 20  nd verify.  the 
14690 61 63 63 75 72 61 63 79 20 6f 66 20 61 6c 6c 20  accuracy of all 
146a0 69 6e 76 65 72 74 65 64 20 69 6e 64 69 63 65 73  inverted indices
146b0 20 69 6e 20 61 6e 20 46 54 53 33 2f 34 20 74 61   in an FTS3/4 ta
146c0 62 6c 65 20 62 79 20 63 6f 6d 70 61 72 69 6e 67  ble by comparing
146d0 0a 20 20 74 68 6f 73 65 20 69 6e 76 65 72 74 65  .  those inverte
146e0 64 20 69 6e 64 69 63 65 73 20 61 67 61 69 6e 73  d indices agains
146f0 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 63  t the original c
14700 6f 6e 74 65 6e 74 2e 20 54 68 65 20 0a 20 20 22  ontent. The .  "
14710 69 6e 74 65 67 72 69 74 79 2d 63 68 65 63 6b 22  integrity-check"
14720 20 63 6f 6d 6d 61 6e 64 20 73 69 6c 65 6e 74 6c   command silentl
14730 79 20 73 75 63 63 65 65 64 73 20 69 66 20 74 68  y succeeds if th
14740 65 20 69 6e 76 65 72 74 65 64 0a 20 20 69 6e 64  e inverted.  ind
14750 69 63 65 73 20 61 72 65 20 61 6c 6c 20 6f 6b 2c  ices are all ok,
14760 20 62 75 74 20 77 69 6c 6c 20 66 61 69 6c 20 77   but will fail w
14770 69 74 68 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f  ith an SQLITE_CO
14780 52 52 55 50 54 20 65 72 72 6f 72 0a 20 20 69 66  RRUPT error.  if
14790 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73 20 61 72   any problems ar
147a0 65 20 66 6f 75 6e 64 2e 0a 0a 3c 70 3e 0a 20 20  e found...<p>.  
147b0 54 68 65 20 22 69 6e 74 65 67 72 69 74 79 2d 63  The "integrity-c
147c0 68 65 63 6b 22 20 63 6f 6d 6d 61 6e 64 20 69 73  heck" command is
147d0 20 73 69 6d 69 6c 61 72 20 69 6e 20 63 6f 6e 63   similar in conc
147e0 65 70 74 20 74 6f 0a 20 5b 50 52 41 47 4d 41 20  ept to. [PRAGMA 
147f0 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 5d  integrity_check]
14800 2e 20 20 49 6e 20 61 20 77 6f 72 6b 69 6e 67 20  .  In a working 
14810 73 79 73 74 65 6d 2c 20 74 68 65 20 22 69 6e 74  system, the "int
14820 65 67 72 69 74 79 2d 63 6f 6d 6d 61 6e 64 22 0a  egrity-command".
14830 20 73 68 6f 75 6c 64 20 61 77 61 79 73 20 62 65   should aways be
14840 20 73 75 63 63 65 73 73 66 75 6c 2e 20 20 50 6f   successful.  Po
14850 73 73 69 62 6c 65 20 63 61 75 73 65 73 20 6f 66  ssible causes of
14860 20 69 6e 74 65 67 72 69 74 79 2d 63 68 65 63 6b   integrity-check
14870 0a 20 66 61 69 6c 75 72 65 73 20 69 6e 63 6c 75  . failures inclu
14880 64 65 3a 0a 20 20 3c 75 6c 3e 0a 20 20 3c 6c 69  de:.  <ul>.  <li
14890 3e 20 54 68 65 20 61 70 70 6c 69 63 61 74 69 6f  > The applicatio
148a0 6e 20 68 61 73 20 6d 61 64 65 20 63 68 61 6e 67  n has made chang
148b0 65 73 20 74 6f 20 74 68 65 20 5b 46 54 53 20 73  es to the [FTS s
148c0 68 61 64 6f 77 20 74 61 62 6c 65 73 5d 0a 20 20  hadow tables].  
148d0 20 20 20 20 20 64 69 72 65 63 74 6c 79 2c 20 77       directly, w
148e0 69 74 68 6f 75 74 20 75 73 69 6e 67 20 74 68 65  ithout using the
148f0 20 46 54 53 33 2f 34 20 76 69 72 74 75 61 6c 20   FTS3/4 virtual 
14900 74 61 62 6c 65 2c 20 63 61 75 73 69 6e 67 0a 20  table, causing. 
14910 20 20 20 20 20 20 74 68 65 20 73 68 61 64 6f 77        the shadow
14920 20 74 61 62 6c 65 73 20 74 6f 20 62 65 63 6f 6d   tables to becom
14930 65 20 6f 75 74 20 6f 66 20 73 79 6e 63 20 77 69  e out of sync wi
14940 74 68 20 65 61 63 68 20 6f 74 68 65 72 2e 0a 20  th each other.. 
14950 20 3c 6c 69 3e 20 55 73 69 6e 67 20 74 68 65 20   <li> Using the 
14960 5b 46 54 53 34 20 63 6f 6e 74 65 6e 74 20 6f 70  [FTS4 content op
14970 74 69 6f 6e 5d 20 61 6e 64 20 66 61 69 6c 69 6e  tion] and failin
14980 67 20 74 6f 20 6d 61 6e 75 61 6c 6c 79 20 6b 65  g to manually ke
14990 65 70 0a 20 20 20 20 20 20 20 74 68 65 20 63 6f  ep.       the co
149a0 6e 74 65 6e 74 20 69 6e 20 73 79 6e 63 20 77 69  ntent in sync wi
149b0 74 68 20 74 68 65 20 46 54 53 34 20 69 6e 76 65  th the FTS4 inve
149c0 72 74 65 64 20 69 6e 64 69 63 65 73 2e 0a 20 20  rted indices..  
149d0 3c 6c 69 3e 20 42 75 67 73 20 69 6e 20 74 68 65  <li> Bugs in the
149e0 20 46 54 53 33 2f 34 20 76 69 72 74 75 61 6c 20   FTS3/4 virtual 
149f0 74 61 62 6c 65 2e 20 20 28 54 68 65 20 22 69 6e  table.  (The "in
14a00 74 65 67 72 69 74 79 2d 63 68 65 63 6b 22 0a 20  tegrity-check". 
14a10 20 20 20 20 20 20 63 6f 6d 6d 61 6e 64 20 77 61        command wa
14a20 73 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 63 65  s original conce
14a30 69 76 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  ived as part of 
14a40 74 68 65 20 74 65 73 74 20 73 75 69 74 65 0a 20  the test suite. 
14a50 20 20 20 20 20 20 66 6f 72 20 46 54 53 33 2f 34        for FTS3/4
14a60 2e 29 0a 20 20 3c 6c 69 3e 20 43 6f 72 72 75 70  .).  <li> Corrup
14a70 74 69 6f 6e 20 74 6f 20 74 68 65 20 75 6e 64 65  tion to the unde
14a80 72 6c 79 69 6e 67 20 53 51 4c 69 74 65 20 64 61  rlying SQLite da
14a90 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 28 53  tabase file.  (S
14aa0 65 65 0a 20 20 20 20 20 20 20 64 6f 63 75 6d 65  ee.       docume
14ab0 6e 74 61 74 69 6f 6e 20 6f 6e 20 5b 68 6f 77 20  ntation on [how 
14ac0 74 6f 20 63 6f 72 72 75 70 74 5d 20 61 6e 64 20  to corrupt] and 
14ad0 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65 20  SQLite database 
14ae0 66 6f 72 0a 20 20 20 20 20 20 20 61 64 64 69 74  for.       addit
14af0 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
14b00 6e 2e 29 0a 20 20 3c 2f 75 6c 3e 0a 0a 3c 74 63  n.).  </ul>..<tc
14b10 6c 3e 68 64 5f 66 72 61 67 6d 65 6e 74 20 2a 66  l>hd_fragment *f
14b20 74 73 34 6d 65 72 67 65 63 6d 64 20 7b 46 54 53  ts4mergecmd {FTS
14b30 34 20 22 6d 65 72 67 65 22 20 63 6f 6d 6d 61 6e  4 "merge" comman
14b40 64 7d 20 7b 22 6d 65 72 67 65 22 20 63 6f 6d 6d  d} {"merge" comm
14b50 61 6e 64 7d 3c 2f 74 63 6c 3e 0a 3c 68 32 20 69  and}</tcl>.<h2 i
14b60 64 3d 22 6d 65 72 67 65 63 6d 64 22 3e 54 68 65  d="mergecmd">The
14b70 20 22 6d 65 72 67 65 3d 58 2c 59 22 20 63 6f 6d   "merge=X,Y" com
14b80 6d 61 6e 64 3c 2f 68 32 3e 0a 0a 3c 70 3e 0a 20  mand</h2>..<p>. 
14b90 20 54 68 65 20 22 6d 65 72 67 65 3d 58 2c 59 22   The "merge=X,Y"
14ba0 20 63 6f 6d 6d 61 6e 64 20 28 77 68 65 72 65 20   command (where 
14bb0 58 20 61 6e 64 20 59 20 61 72 65 20 69 6e 74 65  X and Y are inte
14bc0 67 65 72 73 29 20 63 61 75 73 65 73 20 53 51 4c  gers) causes SQL
14bd0 69 74 65 0a 20 20 74 6f 20 64 6f 20 61 20 6c 69  ite.  to do a li
14be0 6d 69 74 65 64 20 61 6d 6f 75 6e 74 20 6f 66 20  mited amount of 
14bf0 77 6f 72 6b 20 74 6f 77 61 72 64 20 6d 65 72 67  work toward merg
14c00 69 6e 67 20 74 68 65 20 76 61 72 69 6f 75 73 20  ing the various 
14c10 69 6e 76 65 72 74 65 64 0a 20 20 69 6e 64 65 78  inverted.  index
14c20 20 62 2d 74 72 65 65 73 20 6f 66 20 61 6e 20 46   b-trees of an F
14c30 54 53 33 2f 34 20 74 61 62 6c 65 20 74 6f 67 65  TS3/4 table toge
14c40 74 68 65 72 20 69 6e 74 6f 20 6f 6e 65 20 6c 61  ther into one la
14c50 72 67 65 20 62 2d 74 72 65 65 2e 0a 20 20 54 68  rge b-tree..  Th
14c60 65 20 58 20 76 61 6c 75 65 20 69 73 20 74 68 65  e X value is the
14c70 20 74 61 72 67 65 74 20 6e 75 6d 62 65 72 20 6f   target number o
14c80 66 20 22 62 6c 6f 63 6b 73 22 20 74 6f 20 62 65  f "blocks" to be
14c90 20 6d 65 72 67 65 64 2c 20 61 6e 64 20 59 20 69   merged, and Y i
14ca0 73 0a 20 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20  s.  the minimum 
14cb0 6e 75 6d 62 65 72 20 6f 66 20 62 2d 74 72 65 65  number of b-tree
14cc0 20 73 65 67 6d 65 6e 74 73 20 6f 6e 20 61 20 6c   segments on a l
14cd0 65 76 65 6c 20 72 65 71 75 69 72 65 64 20 62 65  evel required be
14ce0 66 6f 72 65 0a 20 20 6d 65 72 67 69 6e 67 20 77  fore.  merging w
14cf0 69 6c 6c 20 62 65 20 61 70 70 6c 69 65 64 20 74  ill be applied t
14d00 6f 20 74 68 61 74 20 6c 65 76 65 6c 2e 20 20 54  o that level.  T
14d10 68 65 20 76 61 6c 75 65 20 6f 66 20 59 20 73 68  he value of Y sh
14d20 6f 75 6c 64 0a 20 20 62 65 20 62 65 74 77 65 65  ould.  be betwee
14d30 6e 20 32 20 61 6e 64 20 31 36 20 77 69 74 68 20  n 2 and 16 with 
14d40 61 20 72 65 63 6f 6d 6d 65 6e 64 65 64 20 76 61  a recommended va
14d50 6c 75 65 20 6f 66 20 38 2e 20 20 54 68 65 20 76  lue of 8.  The v
14d60 61 6c 75 65 20 6f 66 20 58 0a 20 20 63 61 6e 20  alue of X.  can 
14d70 62 65 20 61 6e 79 20 70 6f 73 69 74 69 76 65 20  be any positive 
14d80 69 6e 74 65 67 65 72 20 62 75 74 20 76 61 6c 75  integer but valu
14d90 65 73 20 6f 6e 20 74 68 65 20 6f 72 64 65 72 20  es on the order 
14da0 6f 66 20 31 30 30 20 74 6f 20 33 30 30 0a 20 20  of 100 to 300.  
14db0 61 72 65 20 72 65 63 6f 6d 6d 65 6e 64 65 64 2e  are recommended.
14dc0 0a 0a 3c 70 3e 0a 20 20 57 68 65 6e 20 61 6e 20  ..<p>.  When an 
14dd0 46 54 53 20 74 61 62 6c 65 20 61 63 63 75 6d 75  FTS table accumu
14de0 6c 61 74 65 73 20 31 36 20 62 2d 74 72 65 65 20  lates 16 b-tree 
14df0 73 65 67 6d 65 6e 74 73 20 61 74 20 74 68 65 20  segments at the 
14e00 73 61 6d 65 20 6c 65 76 65 6c 2c 0a 20 20 74 68  same level,.  th
14e10 65 20 6e 65 78 74 20 49 4e 53 45 52 54 20 69 6e  e next INSERT in
14e20 74 6f 20 74 68 61 74 20 74 61 62 6c 65 20 77 69  to that table wi
14e30 6c 6c 20 63 61 75 73 65 20 61 6c 6c 20 31 36 20  ll cause all 16 
14e40 73 65 67 6d 65 6e 74 73 20 74 6f 20 62 65 0a 20  segments to be. 
14e50 20 6d 65 72 67 65 64 20 69 6e 74 6f 20 61 20 73   merged into a s
14e60 69 6e 67 6c 65 20 62 2d 74 72 65 65 20 73 65 67  ingle b-tree seg
14e70 6d 65 6e 74 20 61 74 20 74 68 65 20 6e 65 78 74  ment at the next
14e80 20 68 69 67 68 65 72 20 6c 65 76 65 6c 2e 20 20   higher level.  
14e90 54 68 65 0a 20 20 65 66 66 65 63 74 20 6f 66 20  The.  effect of 
14ea0 74 68 65 73 65 20 6c 65 76 65 6c 20 6d 65 72 67  these level merg
14eb0 65 73 20 69 73 20 74 68 61 74 20 6d 6f 73 74 20  es is that most 
14ec0 49 4e 53 45 52 54 73 20 69 6e 74 6f 20 61 6e 20  INSERTs into an 
14ed0 46 54 53 20 74 61 62 6c 65 0a 20 20 61 72 65 20  FTS table.  are 
14ee0 76 65 72 79 20 66 61 73 74 20 61 6e 64 20 74 61  very fast and ta
14ef0 6b 65 20 6d 69 6e 69 6d 61 6c 20 6d 65 6d 6f 72  ke minimal memor
14f00 79 2c 20 62 75 74 20 61 6e 20 6f 63 63 61 73 69  y, but an occasi
14f10 6f 6e 61 6c 20 49 4e 53 45 52 54 20 69 73 0a 20  onal INSERT is. 
14f20 20 73 6c 6f 77 20 61 6e 64 20 67 65 6e 65 72 61   slow and genera
14f30 74 65 73 20 61 20 6c 61 72 67 65 20 74 72 61 6e  tes a large tran
14f40 73 61 63 74 69 6f 6e 20 62 65 63 61 75 73 65 20  saction because 
14f50 6f 66 20 74 68 65 20 6e 65 65 64 20 74 6f 0a 20  of the need to. 
14f60 20 64 6f 20 6d 65 72 67 69 6e 67 2e 20 54 68 69   do merging. Thi
14f70 73 20 72 65 73 75 6c 74 73 20 69 6e 20 22 73 70  s results in "sp
14f80 69 6b 79 22 20 70 65 72 66 6f 72 6d 61 6e 63 65  iky" performance
14f90 20 6f 66 20 49 4e 53 45 52 54 73 2e 0a 0a 3c 70   of INSERTs...<p
14fa0 3e 0a 20 20 54 6f 20 61 76 6f 69 64 20 73 70 69  >.  To avoid spi
14fb0 6b 79 20 49 4e 53 45 52 54 20 70 65 72 66 6f 72  ky INSERT perfor
14fc0 6d 61 6e 63 65 2c 20 61 6e 20 61 70 70 6c 69 63  mance, an applic
14fd0 61 74 69 6f 6e 20 63 61 6e 20 72 75 6e 20 74 68  ation can run th
14fe0 65 0a 20 20 22 6d 65 72 67 65 3d 58 2c 59 22 20  e.  "merge=X,Y" 
14ff0 63 6f 6d 6d 61 6e 64 20 70 65 72 69 6f 64 69 63  command periodic
15000 61 6c 6c 79 2c 20 70 6f 73 73 69 62 6c 79 20 69  ally, possibly i
15010 6e 20 61 6e 20 69 64 6c 65 20 74 68 72 65 61 64  n an idle thread
15020 20 6f 72 0a 20 20 69 64 6c 65 20 70 72 6f 63 65   or.  idle proce
15030 73 73 2c 20 74 6f 20 65 6e 73 75 72 65 20 74 68  ss, to ensure th
15040 61 74 20 74 68 65 20 46 54 53 20 74 61 62 6c 65  at the FTS table
15050 20 6e 65 76 65 72 20 61 63 63 75 6d 75 6c 61 74   never accumulat
15060 65 73 0a 20 20 74 6f 6f 20 6d 61 6e 79 20 62 2d  es.  too many b-
15070 74 72 65 65 20 73 65 67 6d 65 6e 74 73 20 61 74  tree segments at
15080 20 74 68 65 20 73 61 6d 65 20 6c 65 76 65 6c 2e   the same level.
15090 20 20 49 4e 53 45 52 54 20 70 65 72 66 6f 72 6d    INSERT perform
150a0 61 6e 63 65 0a 20 20 73 70 69 6b 65 73 20 63 61  ance.  spikes ca
150b0 6e 20 67 65 6e 65 72 61 6c 6c 79 20 62 65 20 61  n generally be a
150c0 76 6f 69 64 65 64 2c 20 61 6e 64 20 70 65 72 66  voided, and perf
150d0 6f 72 6d 61 6e 63 65 20 6f 66 20 46 54 53 33 2f  ormance of FTS3/
150e0 34 20 63 61 6e 20 62 65 0a 20 20 6d 61 78 69 6d  4 can be.  maxim
150f0 69 7a 65 64 2c 20 62 79 20 72 75 6e 6e 69 6e 67  ized, by running
15100 20 22 6d 65 72 67 65 3d 58 2c 59 22 20 61 66 74   "merge=X,Y" aft
15110 65 72 20 65 76 65 72 79 20 66 65 77 20 74 68 6f  er every few tho
15120 75 73 61 6e 64 0a 20 20 64 6f 63 75 6d 65 6e 74  usand.  document
15130 20 69 6e 73 65 72 74 73 2e 20 20 45 61 63 68 20   inserts.  Each 
15140 22 6d 65 72 67 65 3d 58 2c 59 22 20 63 6f 6d 6d  "merge=X,Y" comm
15150 61 6e 64 20 77 69 6c 6c 20 72 75 6e 20 69 6e 20  and will run in 
15160 61 20 73 65 70 61 72 61 74 65 0a 20 20 74 72 61  a separate.  tra
15170 6e 73 61 63 74 69 6f 6e 20 28 75 6e 6c 65 73 73  nsaction (unless
15180 20 74 68 65 79 20 61 72 65 20 67 72 6f 75 70 65   they are groupe
15190 64 20 74 6f 67 65 74 68 65 72 20 75 73 69 6e 67  d together using
151a0 20 5b 42 45 47 49 4e 5d 2e 2e 2e 5b 43 4f 4d 4d   [BEGIN]...[COMM
151b0 49 54 5d 2c 0a 20 20 6f 66 20 63 6f 75 72 73 65  IT],.  of course
151c0 29 2e 20 20 54 68 65 20 74 72 61 6e 73 61 63 74  ).  The transact
151d0 69 6f 6e 73 20 63 61 6e 20 62 65 20 6b 65 70 74  ions can be kept
151e0 20 73 6d 61 6c 6c 20 62 79 20 63 68 6f 6f 73 69   small by choosi
151f0 6e 67 20 61 20 76 61 6c 75 65 0a 20 20 66 6f 72  ng a value.  for
15200 20 58 20 69 6e 20 74 68 65 20 72 61 6e 67 65 20   X in the range 
15210 6f 66 20 31 30 30 20 74 6f 20 33 30 30 2e 20 20  of 100 to 300.  
15220 54 68 65 20 69 64 6c 65 20 74 68 72 65 61 64 20  The idle thread 
15230 74 68 61 74 20 69 73 20 72 75 6e 6e 69 6e 67 0a  that is running.
15240 20 20 74 68 65 20 6d 65 72 67 65 20 63 6f 6d 6d    the merge comm
15250 61 6e 64 73 20 63 61 6e 20 6b 6e 6f 77 20 77 68  ands can know wh
15260 65 6e 20 69 74 20 69 73 20 64 6f 6e 65 20 62 79  en it is done by
15270 20 63 68 65 63 6b 69 6e 67 20 74 68 65 20 64 69   checking the di
15280 66 66 65 72 65 6e 63 65 0a 20 20 69 6e 20 5b 73  fference.  in [s
15290 71 6c 69 74 65 33 5f 74 6f 74 61 6c 5f 63 68 61  qlite3_total_cha
152a0 6e 67 65 73 28 29 5d 20 62 65 66 6f 72 65 20 61  nges()] before a
152b0 6e 64 20 61 66 74 65 72 20 65 61 63 68 20 22 6d  nd after each "m
152c0 65 72 67 65 3d 58 2c 59 22 0a 20 20 63 6f 6d 6d  erge=X,Y".  comm
152d0 61 6e 64 20 61 6e 64 20 73 74 6f 70 70 69 6e 67  and and stopping
152e0 20 74 68 65 20 6c 6f 6f 70 20 77 68 65 6e 20 74   the loop when t
152f0 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 64 72  he difference dr
15300 6f 70 73 20 62 65 6c 6f 77 20 74 77 6f 2e 0a 0a  ops below two...
15310 3c 74 63 6c 3e 68 64 5f 66 72 61 67 6d 65 6e 74  <tcl>hd_fragment
15320 20 2a 66 74 73 34 61 75 74 6f 6d 65 72 67 65 63   *fts4automergec
15330 6d 64 20 7b 46 54 53 34 20 22 61 75 74 6f 6d 65  md {FTS4 "autome
15340 72 67 65 22 20 63 6f 6d 6d 61 6e 64 7d 20 5c 0a  rge" command} \.
15350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15370 20 20 20 7b 22 61 75 74 6f 6d 65 72 67 65 22 20     {"automerge" 
15380 63 6f 6d 6d 61 6e 64 7d 3c 2f 74 63 6c 3e 0a 3c  command}</tcl>.<
15390 68 32 20 69 64 3d 61 75 74 6f 6d 65 72 67 65 22  h2 id=automerge"
153a0 3e 54 68 65 20 22 61 75 74 6f 6d 65 72 67 65 3d  >The "automerge=
153b0 42 22 20 63 6f 6d 6d 61 6e 64 3c 2f 68 32 3e 0a  B" command</h2>.
153c0 0a 3c 70 3e 0a 20 20 54 68 65 20 22 61 75 74 6f  .<p>.  The "auto
153d0 6d 65 72 67 65 3d 42 22 20 63 6f 6d 6d 61 6e 64  merge=B" command
153e0 20 28 77 68 65 72 65 20 42 20 69 73 20 65 69 74   (where B is eit
153f0 68 65 72 20 22 31 22 20 6f 72 20 22 30 22 29 20  her "1" or "0") 
15400 64 69 73 61 62 6c 65 73 0a 20 20 6f 72 20 65 6e  disables.  or en
15410 61 62 6c 65 73 20 61 75 74 6f 6d 61 74 69 63 20  ables automatic 
15420 69 6e 63 72 65 6d 65 6e 74 61 6c 20 69 6e 76 65  incremental inve
15430 72 74 65 64 20 69 6e 64 65 78 20 6d 65 72 67 69  rted index mergi
15440 6e 67 20 66 6f 72 20 61 6e 0a 20 20 46 54 53 33  ng for an.  FTS3
15450 2f 34 20 74 61 62 6c 65 2e 20 20 54 68 65 20 64  /4 table.  The d
15460 65 66 61 75 6c 74 20 66 6f 72 20 6e 65 77 20 74  efault for new t
15470 61 62 6c 65 73 20 69 73 20 66 6f 72 20 61 75 74  ables is for aut
15480 6f 6d 61 74 69 63 20 69 6e 63 72 65 6d 65 6e 74  omatic increment
15490 61 6c 0a 20 20 6d 65 72 67 69 6e 67 20 74 6f 20  al.  merging to 
154a0 62 65 20 64 69 73 61 62 6c 65 64 2e 20 20 54 68  be disabled.  Th
154b0 65 20 22 61 75 74 6f 6d 65 72 67 65 3d 42 22 20  e "automerge=B" 
154c0 63 6f 6d 6d 61 6e 64 20 63 68 61 6e 67 65 73 20  command changes 
154d0 74 68 69 73 0a 20 20 73 65 74 74 69 6e 67 2e 20  this.  setting. 
154e0 20 54 68 65 20 63 68 61 6e 67 65 20 69 73 20 70   The change is p
154f0 65 72 73 69 73 74 65 6e 74 20 61 6e 64 20 63 6f  ersistent and co
15500 6e 74 69 6e 75 65 73 20 74 6f 20 62 65 20 69 6e  ntinues to be in
15510 20 65 66 66 65 63 74 0a 20 20 66 6f 72 20 61 6c   effect.  for al
15520 6c 20 73 75 62 73 65 71 75 65 6e 74 20 64 61 74  l subsequent dat
15530 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
15540 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20 64 61  s to the same da
15550 74 61 62 61 73 65 2e 0a 0a 3c 70 3e 0a 20 20 45  tabase...<p>.  E
15560 6e 61 62 6c 69 6e 67 20 61 75 74 6f 6d 61 74 69  nabling automati
15570 63 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 6d 65  c incremental me
15580 72 67 65 20 63 61 75 73 65 73 20 53 51 4c 69 74  rge causes SQLit
15590 65 20 74 6f 20 64 6f 20 61 20 73 6d 61 6c 6c 0a  e to do a small.
155a0 20 20 61 6d 6f 75 6e 74 20 6f 66 20 69 6e 76 65    amount of inve
155b0 72 74 65 64 20 69 6e 64 65 78 20 6d 65 72 67 69  rted index mergi
155c0 6e 67 20 61 66 74 65 72 20 65 76 65 72 79 20 49  ng after every I
155d0 4e 53 45 52 54 20 6f 70 65 72 61 74 69 6f 6e 2e  NSERT operation.
155e0 0a 20 20 54 68 65 20 61 6d 6f 75 6e 74 20 6f 66  .  The amount of
155f0 20 6d 65 72 67 69 6e 67 20 70 65 72 66 6f 72 6d   merging perform
15600 65 64 20 69 73 20 64 65 73 69 67 6e 65 64 20 73  ed is designed s
15610 6f 20 74 68 61 74 20 74 68 65 20 46 54 53 33 2f  o that the FTS3/
15620 34 0a 20 20 74 61 62 6c 65 20 6e 65 76 65 72 20  4.  table never 
15630 72 65 61 63 68 65 73 20 61 20 70 6f 69 6e 74 20  reaches a point 
15640 77 68 65 72 65 20 69 74 20 68 61 73 20 31 36 20  where it has 16 
15650 73 65 67 6d 65 6e 74 73 20 61 74 20 74 68 65 20  segments at the 
15660 73 61 6d 65 0a 20 20 6c 65 76 65 6c 20 61 6e 64  same.  level and
15670 20 68 65 6e 63 65 20 68 61 73 20 74 6f 20 64 6f   hence has to do
15680 20 61 20 6c 61 72 67 65 20 6d 65 72 67 65 20 69   a large merge i
15690 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f 6d 70 6c  n order to compl
156a0 65 74 65 20 61 6e 0a 20 20 69 6e 73 65 72 74 2e  ete an.  insert.
156b0 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
156c0 2c 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 63 72  , automatic incr
156d0 65 6d 65 6e 74 61 6c 20 6d 65 72 67 69 6e 67 20  emental merging 
156e0 69 73 20 64 65 73 69 67 6e 65 64 0a 20 20 74 6f  is designed.  to
156f0 20 70 72 65 76 65 6e 74 20 73 70 69 6b 79 20 49   prevent spiky I
15700 4e 53 45 52 54 20 70 65 72 66 6f 72 6d 61 6e 63  NSERT performanc
15710 65 2e 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 64 6f  e...<p>.  The do
15720 77 6e 73 69 64 65 20 6f 66 20 61 75 74 6f 6d 61  wnside of automa
15730 74 69 63 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20  tic incremental 
15740 6d 65 72 67 69 6e 67 20 69 73 20 74 68 61 74 20  merging is that 
15750 69 74 20 6d 61 6b 65 73 0a 20 20 65 76 65 72 79  it makes.  every
15760 20 49 4e 53 45 52 54 2c 20 55 50 44 41 54 45 2c   INSERT, UPDATE,
15770 20 61 6e 64 20 44 45 4c 45 54 45 20 6f 70 65 72   and DELETE oper
15780 61 74 69 6f 6e 20 6f 6e 20 61 6e 20 46 54 53 33  ation on an FTS3
15790 2f 34 20 74 61 62 6c 65 20 72 75 6e 0a 20 20 61  /4 table run.  a
157a0 20 6c 69 74 74 6c 65 20 73 6c 6f 77 65 72 2c 20   little slower, 
157b0 73 69 6e 63 65 20 65 78 74 72 61 20 74 69 6d 65  since extra time
157c0 20 6d 75 73 74 20 62 65 20 75 73 65 64 20 74 6f   must be used to
157d0 20 64 6f 20 74 68 65 20 69 6e 63 72 65 6d 65 6e   do the incremen
157e0 74 61 6c 0a 20 20 6d 65 72 67 65 2e 20 20 46 6f  tal.  merge.  Fo
157f0 72 20 6d 61 78 69 6d 75 6d 20 70 65 72 66 6f 72  r maximum perfor
15800 6d 61 6e 63 65 2c 20 69 74 20 69 73 20 72 65 63  mance, it is rec
15810 6f 6d 6d 65 6e 64 65 64 20 74 68 61 74 20 61 70  ommended that ap
15820 70 6c 69 63 61 74 69 6f 6e 73 0a 20 20 64 69 73  plications.  dis
15830 61 62 6c 65 20 61 75 74 6f 6d 61 74 69 63 20 69  able automatic i
15840 6e 63 72 65 6d 65 6e 74 61 6c 20 6d 65 72 67 65  ncremental merge
15850 20 61 6e 64 20 69 6e 73 74 65 61 64 20 75 73 65   and instead use
15860 20 74 68 65 20 0a 20 20 5b 22 6d 65 72 67 65 22   the .  ["merge"
15870 20 63 6f 6d 6d 61 6e 64 5d 20 69 6e 20 61 6e 20   command] in an 
15880 69 64 6c 65 20 70 72 6f 63 65 73 73 20 74 6f 20  idle process to 
15890 6b 65 65 70 20 74 68 65 20 69 6e 76 65 72 74 65  keep the inverte
158a0 64 20 69 6e 64 69 63 65 73 0a 20 20 77 65 6c 6c  d indices.  well
158b0 20 6d 65 72 67 65 64 2e 20 20 42 75 74 20 69 66   merged.  But if
158c0 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20 6f   the structure o
158d0 66 20 61 6e 20 61 70 70 6c 69 63 61 74 69 6f 6e  f an application
158e0 20 64 6f 65 73 20 6e 6f 74 20 65 61 73 69 6c 79   does not easily
158f0 0a 20 20 61 6c 6c 6f 77 20 66 6f 72 20 69 64 6c  .  allow for idl
15900 65 20 70 72 6f 63 65 73 73 65 73 2c 20 74 68 65  e processes, the
15910 20 75 73 65 20 6f 66 20 61 75 74 6f 6d 61 74 69   use of automati
15920 63 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 6d 65  c incremental me
15930 72 67 65 20 69 73 0a 20 20 61 20 76 65 72 79 20  rge is.  a very 
15940 72 65 61 73 6f 6e 61 62 6c 65 20 66 61 6c 6c 62  reasonable fallb
15950 61 63 6b 20 73 6f 6c 75 74 69 6f 6e 2e 0a 0a 0a  ack solution....
15960 3c 68 31 20 69 64 3d 74 6f 6b 65 6e 69 7a 65 72  <h1 id=tokenizer
15970 20 74 61 67 73 3d 22 74 6f 6b 65 6e 69 7a 65 72   tags="tokenizer
15980 22 3e 54 6f 6b 65 6e 69 7a 65 72 73 3c 2f 68 31  ">Tokenizers</h1
15990 3e 0a 0a 3c 70 3e 0a 20 20 41 6e 20 46 54 53 20  >..<p>.  An FTS 
159a0 74 6f 6b 65 6e 69 7a 65 72 20 69 73 20 61 20 73  tokenizer is a s
159b0 65 74 20 6f 66 20 72 75 6c 65 73 20 66 6f 72 20  et of rules for 
159c0 65 78 74 72 61 63 74 69 6e 67 20 74 65 72 6d 73  extracting terms
159d0 20 66 72 6f 6d 20 61 20 64 6f 63 75 6d 65 6e 74   from a document
159e0 20 0a 20 20 6f 72 20 62 61 73 69 63 20 46 54 53   .  or basic FTS
159f0 20 66 75 6c 6c 2d 74 65 78 74 20 71 75 65 72 79   full-text query
15a00 2e 20 0a 0a 3c 70 3e 0a 20 20 55 6e 6c 65 73 73  . ..<p>.  Unless
15a10 20 61 20 73 70 65 63 69 66 69 63 20 74 6f 6b 65   a specific toke
15a20 6e 69 7a 65 72 20 69 73 20 73 70 65 63 69 66 69  nizer is specifi
15a30 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68  ed as part of th
15a40 65 20 43 52 45 41 54 45 20 0a 20 20 56 49 52 54  e CREATE .  VIRT
15a50 55 41 4c 20 54 41 42 4c 45 20 73 74 61 74 65 6d  UAL TABLE statem
15a60 65 6e 74 20 75 73 65 64 20 74 6f 20 63 72 65 61  ent used to crea
15a70 74 65 20 74 68 65 20 46 54 53 20 74 61 62 6c 65  te the FTS table
15a80 2c 20 74 68 65 20 64 65 66 61 75 6c 74 20 0a 20  , the default . 
15a90 20 74 6f 6b 65 6e 69 7a 65 72 2c 20 22 73 69 6d   tokenizer, "sim
15aa0 70 6c 65 22 2c 20 69 73 20 75 73 65 64 2e 20 54  ple", is used. T
15ab0 68 65 20 73 69 6d 70 6c 65 20 74 6f 6b 65 6e 69  he simple tokeni
15ac0 7a 65 72 20 65 78 74 72 61 63 74 73 20 74 6f 6b  zer extracts tok
15ad0 65 6e 73 20 66 72 6f 6d 0a 20 20 61 20 64 6f 63  ens from.  a doc
15ae0 75 6d 65 6e 74 20 6f 72 20 62 61 73 69 63 20 46  ument or basic F
15af0 54 53 20 66 75 6c 6c 2d 74 65 78 74 20 71 75 65  TS full-text que
15b00 72 79 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  ry according to 
15b10 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a 20  the following . 
15b20 20 72 75 6c 65 73 3a 0a 0a 3c 75 6c 3e 0a 20 20   rules:..<ul>.  
15b30 3c 6c 69 3e 3c 70 3e 20 41 20 74 65 72 6d 20 69  <li><p> A term i
15b40 73 20 61 20 63 6f 6e 74 69 67 75 6f 75 73 20 73  s a contiguous s
15b50 65 71 75 65 6e 63 65 20 6f 66 20 65 6c 69 67 69  equence of eligi
15b60 62 6c 65 20 63 68 61 72 61 63 74 65 72 73 2c 20  ble characters, 
15b70 77 68 65 72 65 20 0a 20 20 20 20 65 6c 69 67 69  where .    eligi
15b80 62 6c 65 20 63 68 61 72 61 63 74 65 72 73 20 61  ble characters a
15b90 72 65 20 61 6c 6c 20 61 6c 70 68 61 6e 75 6d 65  re all alphanume
15ba0 72 69 63 20 63 68 61 72 61 63 74 65 72 73 20 61  ric characters a
15bb0 6e 64 20 61 6c 6c 20 63 68 61 72 61 63 74 65 72  nd all character
15bc0 73 20 77 69 74 68 0a 20 20 20 20 55 54 46 20 63  s with.    UTF c
15bd0 6f 64 65 70 6f 69 6e 74 73 20 67 72 65 61 74 65  odepoints greate
15be0 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  r than or equal 
15bf0 74 6f 20 31 32 38 2e 20 41 6c 6c 20 6f 74 68 65  to 128. All othe
15c00 72 20 63 68 61 72 61 63 74 65 72 73 20 61 72 65  r characters are
15c10 0a 20 20 20 20 64 69 73 63 61 72 64 65 64 20 77  .    discarded w
15c20 68 65 6e 20 73 70 6c 69 74 74 69 6e 67 20 61 20  hen splitting a 
15c30 64 6f 63 75 6d 65 6e 74 20 69 6e 74 6f 20 74 65  document into te
15c40 72 6d 73 2e 20 54 68 65 69 72 20 6f 6e 6c 79 20  rms. Their only 
15c50 63 6f 6e 74 72 69 62 75 74 69 6f 6e 20 69 73 0a  contribution is.
15c60 20 20 20 20 74 6f 20 73 65 70 61 72 61 74 65 20      to separate 
15c70 61 64 6a 61 63 65 6e 74 20 74 65 72 6d 73 2e 0a  adjacent terms..
15c80 0a 20 20 3c 6c 69 3e 3c 70 3e 20 41 6c 6c 20 75  .  <li><p> All u
15c90 70 70 65 72 63 61 73 65 20 63 68 61 72 61 63 74  ppercase charact
15ca0 65 72 73 20 77 69 74 68 69 6e 20 74 68 65 20 41  ers within the A
15cb0 53 43 49 49 20 72 61 6e 67 65 20 28 55 54 46 20  SCII range (UTF 
15cc0 63 6f 64 65 70 6f 69 6e 74 73 20 6c 65 73 73 20  codepoints less 
15cd0 0a 20 20 20 20 74 68 61 6e 20 31 32 38 29 2c 20  .    than 128), 
15ce0 61 72 65 20 74 72 61 6e 73 66 6f 72 6d 65 64 20  are transformed 
15cf0 74 6f 20 74 68 65 69 72 20 6c 6f 77 65 72 63 61  to their lowerca
15d00 73 65 20 65 71 75 69 76 61 6c 65 6e 74 73 20 61  se equivalents a
15d10 73 20 70 61 72 74 20 6f 66 20 74 68 65 0a 20 20  s part of the.  
15d20 20 20 74 6f 6b 65 6e 69 7a 61 74 69 6f 6e 20 70    tokenization p
15d30 72 6f 63 65 73 73 2e 20 54 68 75 73 2c 20 66 75  rocess. Thus, fu
15d40 6c 6c 2d 74 65 78 74 20 71 75 65 72 69 65 73 20  ll-text queries 
15d50 61 72 65 20 63 61 73 65 2d 69 6e 73 65 6e 73 69  are case-insensi
15d60 74 69 76 65 20 77 68 65 6e 0a 20 20 20 20 75 73  tive when.    us
15d70 69 6e 67 20 74 68 65 20 73 69 6d 70 6c 65 20 74  ing the simple t
15d80 6f 6b 65 6e 69 7a 65 72 2e 0a 3c 2f 75 6c 3e 0a  okenizer..</ul>.
15d90 0a 3c 70 3e 0a 20 20 46 6f 72 20 65 78 61 6d 70  .<p>.  For examp
15da0 6c 65 2c 20 77 68 65 6e 20 61 20 64 6f 63 75 6d  le, when a docum
15db0 65 6e 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ent containing t
15dc0 68 65 20 74 65 78 74 20 22 52 69 67 68 74 20 6e  he text "Right n
15dd0 6f 77 2c 20 74 68 65 79 27 72 65 20 76 65 72 79  ow, they're very
15de0 0a 20 20 66 72 75 73 74 72 61 74 65 64 2e 22 2c  .  frustrated.",
15df0 20 74 68 65 20 74 65 72 6d 73 20 65 78 74 72 61   the terms extra
15e00 63 74 65 64 20 66 72 6f 6d 20 74 68 65 20 64 6f  cted from the do
15e10 63 75 6d 65 6e 74 20 61 6e 64 20 61 64 64 65 64  cument and added
15e20 20 74 6f 20 74 68 65 20 0a 20 20 66 75 6c 6c 2d   to the .  full-
15e30 74 65 78 74 20 69 6e 64 65 78 20 61 72 65 2c 20  text index are, 
15e40 69 6e 20 6f 72 64 65 72 2c 20 22 72 69 67 68 74  in order, "right
15e50 20 6e 6f 77 20 74 68 65 79 20 72 65 20 76 65 72   now they re ver
15e60 79 20 66 72 75 73 74 72 61 74 65 64 22 2e 20 53  y frustrated". S
15e70 75 63 68 0a 20 20 61 20 64 6f 63 75 6d 65 6e 74  uch.  a document
15e80 20 77 6f 75 6c 64 20 6d 61 74 63 68 20 61 20 66   would match a f
15e90 75 6c 6c 2d 74 65 78 74 20 71 75 65 72 79 20 73  ull-text query s
15ea0 75 63 68 20 61 73 20 22 4d 41 54 43 48 20 27 46  uch as "MATCH 'F
15eb0 72 75 73 74 72 61 74 65 64 27 22 2c 20 0a 20 20  rustrated'", .  
15ec0 61 73 20 74 68 65 20 73 69 6d 70 6c 65 20 74 6f  as the simple to
15ed0 6b 65 6e 69 7a 65 72 20 74 72 61 6e 73 66 6f 72  kenizer transfor
15ee0 6d 73 20 74 68 65 20 74 65 72 6d 20 69 6e 20 74  ms the term in t
15ef0 68 65 20 71 75 65 72 79 20 74 6f 20 6c 6f 77 65  he query to lowe
15f00 72 63 61 73 65 0a 20 20 62 65 66 6f 72 65 20 73  rcase.  before s
15f10 65 61 72 63 68 69 6e 67 20 74 68 65 20 66 75 6c  earching the ful
15f20 6c 2d 74 65 78 74 20 69 6e 64 65 78 2e 0a 0a 3c  l-text index...<
15f30 70 3e 0a 20 20 41 73 20 77 65 6c 6c 20 61 73 20  p>.  As well as 
15f40 74 68 65 20 22 73 69 6d 70 6c 65 22 20 74 6f 6b  the "simple" tok
15f50 65 6e 69 7a 65 72 2c 20 74 68 65 20 46 54 53 20  enizer, the FTS 
15f60 73 6f 75 72 63 65 20 63 6f 64 65 20 66 65 61 74  source code feat
15f70 75 72 65 73 20 61 20 74 6f 6b 65 6e 69 7a 65 72  ures a tokenizer
15f80 20 0a 20 20 74 68 61 74 20 75 73 65 73 20 74 68   .  that uses th
15f90 65 20 3c 61 20 68 72 65 66 3d 22 68 74 74 70 3a  e <a href="http:
15fa0 2f 2f 74 61 72 74 61 72 75 73 2e 6f 72 67 2f 7e  //tartarus.org/~
15fb0 6d 61 72 74 69 6e 2f 50 6f 72 74 65 72 53 74 65  martin/PorterSte
15fc0 6d 6d 65 72 2f 22 3e 50 6f 72 74 65 72 20 0a 20  mmer/">Porter . 
15fd0 20 53 74 65 6d 6d 69 6e 67 20 61 6c 67 6f 72 69   Stemming algori
15fe0 74 68 6d 3c 2f 61 3e 2e 20 54 68 69 73 20 74 6f  thm</a>. This to
15ff0 6b 65 6e 69 7a 65 72 20 75 73 65 73 20 74 68 65  kenizer uses the
16000 20 73 61 6d 65 20 72 75 6c 65 73 20 74 6f 20 73   same rules to s
16010 65 70 61 72 61 74 65 0a 20 20 74 68 65 20 69 6e  eparate.  the in
16020 70 75 74 20 64 6f 63 75 6d 65 6e 74 20 69 6e 74  put document int
16030 6f 20 74 65 72 6d 73 2c 20 62 75 74 20 61 73 20  o terms, but as 
16040 77 65 6c 6c 20 61 73 20 66 6f 6c 64 69 6e 67 20  well as folding 
16050 61 6c 6c 20 74 65 72 6d 73 20 74 6f 20 6c 6f 77  all terms to low
16060 65 72 0a 20 20 63 61 73 65 20 69 74 20 75 73 65  er.  case it use
16070 73 20 74 68 65 20 50 6f 72 74 65 72 20 53 74 65  s the Porter Ste
16080 6d 6d 69 6e 67 20 61 6c 67 6f 72 69 74 68 6d 20  mming algorithm 
16090 74 6f 20 72 65 64 75 63 65 20 72 65 6c 61 74 65  to reduce relate
160a0 64 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61  d English langua
160b0 67 65 0a 20 20 77 6f 72 64 73 20 74 6f 20 61 20  ge.  words to a 
160c0 63 6f 6d 6d 6f 6e 20 72 6f 6f 74 2e 20 46 6f 72  common root. For
160d0 20 65 78 61 6d 70 6c 65 2c 20 75 73 69 6e 67 20   example, using 
160e0 74 68 65 20 73 61 6d 65 20 69 6e 70 75 74 20 64  the same input d
160f0 6f 63 75 6d 65 6e 74 20 61 73 20 69 6e 20 74 68  ocument as in th
16100 65 0a 20 20 70 61 72 61 67 72 61 70 68 20 61 62  e.  paragraph ab
16110 6f 76 65 2c 20 74 68 65 20 70 6f 72 74 65 72 20  ove, the porter 
16120 74 6f 6b 65 6e 69 7a 65 72 20 65 78 74 72 61 63  tokenizer extrac
16130 74 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ts the following
16140 20 74 6f 6b 65 6e 73 3a 0a 20 20 22 72 69 67 68   tokens:.  "righ
16150 74 20 6e 6f 77 20 74 68 65 69 20 76 65 72 69 20  t now thei veri 
16160 66 72 75 73 74 72 61 74 22 2e 20 45 76 65 6e 20  frustrat". Even 
16170 74 68 6f 75 67 68 20 73 6f 6d 65 20 6f 66 20 74  though some of t
16180 68 65 73 65 20 74 65 72 6d 73 20 61 72 65 20 6e  hese terms are n
16190 6f 74 20 65 76 65 6e 0a 20 20 45 6e 67 6c 69 73  ot even.  Englis
161a0 68 20 77 6f 72 64 73 2c 20 69 6e 20 73 6f 6d 65  h words, in some
161b0 20 63 61 73 65 73 20 75 73 69 6e 67 20 74 68 65   cases using the
161c0 6d 20 74 6f 20 62 75 69 6c 64 20 74 68 65 20 66  m to build the f
161d0 75 6c 6c 2d 74 65 78 74 20 69 6e 64 65 78 20 69  ull-text index i
161e0 73 20 6d 6f 72 65 0a 20 20 75 73 65 66 75 6c 20  s more.  useful 
161f0 74 68 61 6e 20 74 68 65 20 6d 6f 72 65 20 69 6e  than the more in
16200 74 65 6c 6c 69 67 69 62 6c 65 20 6f 75 74 70 75  telligible outpu
16210 74 20 70 72 6f 64 75 63 65 64 20 62 79 20 74 68  t produced by th
16220 65 20 73 69 6d 70 6c 65 20 74 6f 6b 65 6e 69 7a  e simple tokeniz
16230 65 72 2e 0a 20 20 55 73 69 6e 67 20 74 68 65 20  er..  Using the 
16240 70 6f 72 74 65 72 20 74 6f 6b 65 6e 69 7a 65 72  porter tokenizer
16250 2c 20 74 68 65 20 64 6f 63 75 6d 65 6e 74 20 6e  , the document n
16260 6f 74 20 6f 6e 6c 79 20 6d 61 74 63 68 65 73 20  ot only matches 
16270 66 75 6c 6c 2d 74 65 78 74 20 71 75 65 72 69 65  full-text querie
16280 73 0a 20 20 73 75 63 68 20 61 73 20 22 4d 41 54  s.  such as "MAT
16290 43 48 20 27 46 72 75 73 74 72 61 74 65 64 27 22  CH 'Frustrated'"
162a0 2c 20 62 75 74 20 61 6c 73 6f 20 71 75 65 72 69  , but also queri
162b0 65 73 20 73 75 63 68 20 61 73 20 22 4d 41 54 43  es such as "MATC
162c0 48 20 27 46 72 75 73 74 72 61 74 69 6f 6e 27 22  H 'Frustration'"
162d0 2c 0a 20 20 61 73 20 74 68 65 20 74 65 72 6d 20  ,.  as the term 
162e0 22 46 72 75 73 74 72 61 74 69 6f 6e 22 20 69 73  "Frustration" is
162f0 20 72 65 64 75 63 65 64 20 62 79 20 74 68 65 20   reduced by the 
16300 50 6f 72 74 65 72 20 73 74 65 6d 6d 65 72 20 61  Porter stemmer a
16310 6c 67 6f 72 69 74 68 6d 20 74 6f 20 0a 20 20 22  lgorithm to .  "
16320 66 72 75 73 74 72 61 74 22 20 2d 20 6a 75 73 74  frustrat" - just
16330 20 61 73 20 22 46 72 75 73 74 72 61 74 65 64 22   as "Frustrated"
16340 20 69 73 2e 20 53 6f 2c 20 77 68 65 6e 20 75 73   is. So, when us
16350 69 6e 67 20 74 68 65 20 70 6f 72 74 65 72 20 74  ing the porter t
16360 6f 6b 65 6e 69 7a 65 72 2c 0a 20 20 46 54 53 20  okenizer,.  FTS 
16370 69 73 20 61 62 6c 65 20 74 6f 20 66 69 6e 64 20  is able to find 
16380 6e 6f 74 20 6a 75 73 74 20 65 78 61 63 74 20 6d  not just exact m
16390 61 74 63 68 65 73 20 66 6f 72 20 71 75 65 72 69  atches for queri
163a0 65 64 20 74 65 72 6d 73 2c 20 62 75 74 20 6d 61  ed terms, but ma
163b0 74 63 68 65 73 0a 20 20 61 67 61 69 6e 73 74 20  tches.  against 
163c0 73 69 6d 69 6c 61 72 20 45 6e 67 6c 69 73 68 20  similar English 
163d0 6c 61 6e 67 75 61 67 65 20 74 65 72 6d 73 2e 20  language terms. 
163e0 46 6f 72 20 6d 6f 72 65 20 69 6e 66 6f 72 6d 61  For more informa
163f0 74 69 6f 6e 20 6f 6e 20 74 68 65 20 0a 20 20 50  tion on the .  P
16400 6f 72 74 65 72 20 53 74 65 6d 6d 65 72 20 61 6c  orter Stemmer al
16410 67 6f 72 69 74 68 6d 2c 20 70 6c 65 61 73 65 20  gorithm, please 
16420 72 65 66 65 72 20 74 6f 20 74 68 65 20 70 61 67  refer to the pag
16430 65 20 6c 69 6e 6b 65 64 20 61 62 6f 76 65 2e 0a  e linked above..
16440 0a 3c 70 3e 0a 20 20 45 78 61 6d 70 6c 65 20 69  .<p>.  Example i
16450 6c 6c 75 73 74 72 61 74 69 6e 67 20 74 68 65 20  llustrating the 
16460 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65  difference betwe
16470 65 6e 20 74 68 65 20 22 73 69 6d 70 6c 65 22 20  en the "simple" 
16480 61 6e 64 20 22 70 6f 72 74 65 72 22 0a 20 20 74  and "porter".  t
16490 6f 6b 65 6e 69 7a 65 72 73 3a 0a 0a 3c 63 6f 64  okenizers:..<cod
164a0 65 62 6c 6f 63 6b 3e 0a 20 20 3c 69 3e 2d 2d 20  eblock>.  <i>-- 
164b0 43 72 65 61 74 65 20 61 20 74 61 62 6c 65 20 75  Create a table u
164c0 73 69 6e 67 20 74 68 65 20 73 69 6d 70 6c 65 20  sing the simple 
164d0 74 6f 6b 65 6e 69 7a 65 72 2e 20 49 6e 73 65 72  tokenizer. Inser
164e0 74 20 61 20 64 6f 63 75 6d 65 6e 74 20 69 6e 74  t a document int
164f0 6f 20 69 74 2e 3c 2f 69 3e 0a 20 20 43 52 45 41  o it.</i>.  CREA
16500 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45  TE VIRTUAL TABLE
16510 20 73 69 6d 70 6c 65 20 55 53 49 4e 47 20 66 74   simple USING ft
16520 73 33 28 74 6f 6b 65 6e 69 7a 65 3d 73 69 6d 70  s3(tokenize=simp
16530 6c 65 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e  le);.  INSERT IN
16540 54 4f 20 73 69 6d 70 6c 65 20 56 41 4c 55 45 53  TO simple VALUES
16550 28 27 52 69 67 68 74 20 6e 6f 77 20 74 68 65 79  ('Right now they
16560 27 27 72 65 20 76 65 72 79 20 66 72 75 73 74 72  ''re very frustr
16570 61 74 65 64 27 29 3b 0a 0a 20 20 3c 69 3e 2d 2d  ated');..  <i>--
16580 20 54 68 65 20 66 69 72 73 74 20 6f 66 20 74 68   The first of th
16590 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 77 6f 20  e following two 
165a0 71 75 65 72 69 65 73 20 6d 61 74 63 68 65 73 20  queries matches 
165b0 74 68 65 20 64 6f 63 75 6d 65 6e 74 20 73 74 6f  the document sto
165c0 72 65 64 20 69 6e 3c 2f 69 3e 0a 20 20 3c 69 3e  red in</i>.  <i>
165d0 2d 2d 20 74 61 62 6c 65 20 22 73 69 6d 70 6c 65  -- table "simple
165e0 22 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 64 6f  ". The second do
165f0 65 73 20 6e 6f 74 2e 3c 2f 69 3e 0a 20 20 53 45  es not.</i>.  SE
16600 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 69 6d 70  LECT * FROM simp
16610 6c 65 20 57 48 45 52 45 20 73 69 6d 70 6c 65 20  le WHERE simple 
16620 4d 41 54 43 48 20 27 46 72 75 73 74 72 61 74 65  MATCH 'Frustrate
16630 64 27 3b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46  d';.  SELECT * F
16640 52 4f 4d 20 73 69 6d 70 6c 65 20 57 48 45 52 45  ROM simple WHERE
16650 20 73 69 6d 70 6c 65 20 4d 41 54 43 48 20 27 46   simple MATCH 'F
16660 72 75 73 74 72 61 74 69 6f 6e 27 3b 0a 0a 20 20  rustration';..  
16670 3c 69 3e 2d 2d 20 43 72 65 61 74 65 20 61 20 74  <i>-- Create a t
16680 61 62 6c 65 20 75 73 69 6e 67 20 74 68 65 20 70  able using the p
16690 6f 72 74 65 72 20 74 6f 6b 65 6e 69 7a 65 72 2e  orter tokenizer.
166a0 20 49 6e 73 65 72 74 20 74 68 65 20 73 61 6d 65   Insert the same
166b0 20 64 6f 63 75 6d 65 6e 74 20 69 6e 74 6f 20 69   document into i
166c0 74 3c 2f 69 3e 0a 20 20 43 52 45 41 54 45 20 56  t</i>.  CREATE V
166d0 49 52 54 55 41 4c 20 54 41 42 4c 45 20 70 6f 72  IRTUAL TABLE por
166e0 74 65 72 20 55 53 49 4e 47 20 66 74 73 33 28 74  ter USING fts3(t
166f0 6f 6b 65 6e 69 7a 65 3d 70 6f 72 74 65 72 29 3b  okenize=porter);
16700 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70  .  INSERT INTO p
16710 6f 72 74 65 72 20 56 41 4c 55 45 53 28 27 52 69  orter VALUES('Ri
16720 67 68 74 20 6e 6f 77 20 74 68 65 79 27 27 72 65  ght now they''re
16730 20 76 65 72 79 20 66 72 75 73 74 72 61 74 65 64   very frustrated
16740 27 29 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 42 6f 74  ');..  <i>-- Bot
16750 68 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  h of the followi
16760 6e 67 20 71 75 65 72 69 65 73 20 6d 61 74 63 68  ng queries match
16770 20 74 68 65 20 64 6f 63 75 6d 65 6e 74 20 73 74   the document st
16780 6f 72 65 64 20 69 6e 20 74 61 62 6c 65 20 22 70  ored in table "p
16790 6f 72 74 65 72 22 2e 3c 2f 69 3e 0a 20 20 53 45  orter".</i>.  SE
167a0 4c 45 43 54 20 2a 20 46 52 4f 4d 20 70 6f 72 74  LECT * FROM port
167b0 65 72 20 57 48 45 52 45 20 70 6f 72 74 65 72 20  er WHERE porter 
167c0 4d 41 54 43 48 20 27 46 72 75 73 74 72 61 74 65  MATCH 'Frustrate
167d0 64 27 3b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46  d';.  SELECT * F
167e0 52 4f 4d 20 70 6f 72 74 65 72 20 57 48 45 52 45  ROM porter WHERE
167f0 20 70 6f 72 74 65 72 20 4d 41 54 43 48 20 27 46   porter MATCH 'F
16800 72 75 73 74 72 61 74 69 6f 6e 27 3b 0a 3c 2f 63  rustration';.</c
16810 6f 64 65 62 6c 6f 63 6b 3e 0a 0a 3c 70 3e 0a 20  odeblock>..<p>. 
16820 20 49 66 20 74 68 69 73 20 65 78 74 65 6e 73 69   If this extensi
16830 6f 6e 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77  on is compiled w
16840 69 74 68 20 74 68 65 20 53 51 4c 49 54 45 5f 45  ith the SQLITE_E
16850 4e 41 42 4c 45 5f 49 43 55 20 70 72 65 2d 70 72  NABLE_ICU pre-pr
16860 6f 63 65 73 73 6f 72 0a 20 20 73 79 6d 62 6f 6c  ocessor.  symbol
16870 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 74   defined, then t
16880 68 65 72 65 20 65 78 69 73 74 73 20 61 20 62 75  here exists a bu
16890 69 6c 74 2d 69 6e 20 74 6f 6b 65 6e 69 7a 65 72  ilt-in tokenizer
168a0 20 6e 61 6d 65 64 20 22 69 63 75 22 0a 20 20 69   named "icu".  i
168b0 6d 70 6c 65 6d 65 6e 74 65 64 20 75 73 69 6e 67  mplemented using
168c0 20 74 68 65 20 49 43 55 20 6c 69 62 72 61 72 79   the ICU library
168d0 2e 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75  . The first argu
168e0 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74  ment passed to t
168f0 68 65 0a 20 20 78 43 72 65 61 74 65 28 29 20 6d  he.  xCreate() m
16900 65 74 68 6f 64 20 28 73 65 65 20 66 74 73 33 5f  ethod (see fts3_
16910 74 6f 6b 65 6e 69 7a 65 72 2e 68 29 20 6f 66 20  tokenizer.h) of 
16920 74 68 69 73 20 74 6f 6b 65 6e 69 7a 65 72 20 6d  this tokenizer m
16930 61 79 20 62 65 0a 20 20 61 6e 20 49 43 55 20 6c  ay be.  an ICU l
16940 6f 63 61 6c 65 20 69 64 65 6e 74 69 66 69 65 72  ocale identifier
16950 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 20 22 74  . For example "t
16960 72 5f 54 52 22 20 66 6f 72 20 54 75 72 6b 69 73  r_TR" for Turkis
16970 68 20 61 73 20 75 73 65 64 0a 20 20 69 6e 20 54  h as used.  in T
16980 75 72 6b 65 79 2c 20 6f 72 20 22 65 6e 5f 41 55  urkey, or "en_AU
16990 22 20 66 6f 72 20 45 6e 67 6c 69 73 68 20 61 73  " for English as
169a0 20 75 73 65 64 20 69 6e 20 41 75 73 74 72 61 6c   used in Austral
169b0 69 61 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a  ia. For example:
169c0 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20 20  ..<codeblock>.  
169d0 20 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c    CREATE VIRTUAL
169e0 20 54 41 42 4c 45 20 74 68 61 69 5f 74 65 78 74   TABLE thai_text
169f0 20 55 53 49 4e 47 20 66 74 73 33 28 74 65 78 74   USING fts3(text
16a00 2c 20 74 6f 6b 65 6e 69 7a 65 3d 69 63 75 20 74  , tokenize=icu t
16a10 68 5f 54 48 29 0a 3c 2f 63 6f 64 65 62 6c 6f 63  h_TH).</codebloc
16a20 6b 3e 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 49 43  k>..<p>.  The IC
16a30 55 20 74 6f 6b 65 6e 69 7a 65 72 20 69 6d 70 6c  U tokenizer impl
16a40 65 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20 76 65  ementation is ve
16a50 72 79 20 73 69 6d 70 6c 65 2e 20 49 74 20 73 70  ry simple. It sp
16a60 6c 69 74 73 20 74 68 65 20 69 6e 70 75 74 0a 20  lits the input. 
16a70 20 74 65 78 74 20 61 63 63 6f 72 64 69 6e 67 20   text according 
16a80 74 6f 20 74 68 65 20 49 43 55 20 72 75 6c 65 73  to the ICU rules
16a90 20 66 6f 72 20 66 69 6e 64 69 6e 67 20 77 6f 72   for finding wor
16aa0 64 20 62 6f 75 6e 64 61 72 69 65 73 20 61 6e 64  d boundaries and
16ab0 20 64 69 73 63 61 72 64 73 0a 20 20 61 6e 79 20   discards.  any 
16ac0 74 6f 6b 65 6e 73 20 74 68 61 74 20 63 6f 6e 73  tokens that cons
16ad0 69 73 74 20 65 6e 74 69 72 65 6c 79 20 6f 66 20  ist entirely of 
16ae0 77 68 69 74 65 2d 73 70 61 63 65 2e 20 54 68 69  white-space. Thi
16af0 73 20 6d 61 79 20 62 65 20 73 75 69 74 61 62 6c  s may be suitabl
16b00 65 0a 20 20 66 6f 72 20 73 6f 6d 65 20 61 70 70  e.  for some app
16b10 6c 69 63 61 74 69 6f 6e 73 20 69 6e 20 73 6f 6d  lications in som
16b20 65 20 6c 6f 63 61 6c 65 73 2c 20 62 75 74 20 6e  e locales, but n
16b30 6f 74 20 61 6c 6c 2e 20 49 66 20 6d 6f 72 65 20  ot all. If more 
16b40 63 6f 6d 70 6c 65 78 0a 20 20 70 72 6f 63 65 73  complex.  proces
16b50 73 69 6e 67 20 69 73 20 72 65 71 75 69 72 65 64  sing is required
16b60 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 20 74 6f  , for example to
16b70 20 69 6d 70 6c 65 6d 65 6e 74 20 73 74 65 6d 6d   implement stemm
16b80 69 6e 67 20 6f 72 0a 20 20 64 69 73 63 61 72 64  ing or.  discard
16b90 20 70 75 6e 63 74 75 61 74 69 6f 6e 2c 20 74 68   punctuation, th
16ba0 69 73 20 63 61 6e 20 62 65 20 64 6f 6e 65 20 62  is can be done b
16bb0 79 20 63 72 65 61 74 69 6e 67 20 61 20 74 6f 6b  y creating a tok
16bc0 65 6e 69 7a 65 72 0a 20 20 69 6d 70 6c 65 6d 65  enizer.  impleme
16bd0 6e 74 61 74 69 6f 6e 20 74 68 61 74 20 75 73 65  ntation that use
16be0 73 20 74 68 65 20 49 43 55 20 74 6f 6b 65 6e 69  s the ICU tokeni
16bf0 7a 65 72 20 61 73 20 70 61 72 74 20 6f 66 20 69  zer as part of i
16c00 74 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ts implementatio
16c10 6e 2e 0a 0a 3c 68 32 3e 43 75 73 74 6f 6d 20 28  n...<h2>Custom (
16c20 55 73 65 72 20 49 6d 70 6c 65 6d 65 6e 74 65 64  User Implemented
16c30 29 20 54 6f 6b 65 6e 69 7a 65 72 73 3c 2f 68 32  ) Tokenizers</h2
16c40 3e 0a 0a 3c 70 3e 0a 20 20 41 73 20 77 65 6c 6c  >..<p>.  As well
16c50 20 61 73 20 74 68 65 20 62 75 69 6c 74 2d 69 6e   as the built-in
16c60 20 22 73 69 6d 70 6c 65 22 2c 20 22 70 6f 72 74   "simple", "port
16c70 65 72 22 20 61 6e 64 20 28 70 6f 73 73 69 62 6c  er" and (possibl
16c80 79 29 20 22 69 63 75 22 20 74 6f 6b 65 6e 69 7a  y) "icu" tokeniz
16c90 65 72 73 2c 0a 20 20 46 54 53 20 65 78 70 6f 72  ers,.  FTS expor
16ca0 74 73 20 61 6e 20 69 6e 74 65 72 66 61 63 65 20  ts an interface 
16cb0 74 68 61 74 20 61 6c 6c 6f 77 73 20 75 73 65 72  that allows user
16cc0 73 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 63  s to implement c
16cd0 75 73 74 6f 6d 20 74 6f 6b 65 6e 69 7a 65 72 73  ustom tokenizers
16ce0 0a 20 20 75 73 69 6e 67 20 43 2e 20 54 68 65 20  .  using C. The 
16cf0 69 6e 74 65 72 66 61 63 65 20 75 73 65 64 20 74  interface used t
16d00 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 74  o create a new t
16d10 6f 6b 65 6e 69 7a 65 72 20 69 73 20 64 65 66 69  okenizer is defi
16d20 6e 65 64 20 61 6e 64 20 0a 20 20 64 65 73 63 72  ned and .  descr
16d30 69 62 65 64 20 69 6e 20 74 68 65 20 66 74 73 33  ibed in the fts3
16d40 5f 74 6f 6b 65 6e 69 7a 65 72 2e 68 20 73 6f 75  _tokenizer.h sou
16d50 72 63 65 20 66 69 6c 65 2e 0a 0a 3c 70 3e 0a 20  rce file...<p>. 
16d60 20 52 65 67 69 73 74 65 72 69 6e 67 20 61 20 6e   Registering a n
16d70 65 77 20 46 54 53 20 74 6f 6b 65 6e 69 7a 65 72  ew FTS tokenizer
16d80 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 72   is similar to r
16d90 65 67 69 73 74 65 72 69 6e 67 20 61 20 6e 65 77  egistering a new
16da0 0a 20 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  .  virtual table
16db0 20 6d 6f 64 75 6c 65 20 77 69 74 68 20 53 51 4c   module with SQL
16dc0 69 74 65 2e 20 54 68 65 20 75 73 65 72 20 70 61  ite. The user pa
16dd0 73 73 65 73 20 61 20 70 6f 69 6e 74 65 72 20 74  sses a pointer t
16de0 6f 20 61 0a 20 20 73 74 72 75 63 74 75 72 65 20  o a.  structure 
16df0 63 6f 6e 74 61 69 6e 69 6e 67 20 70 6f 69 6e 74  containing point
16e00 65 72 73 20 74 6f 20 76 61 72 69 6f 75 73 20 63  ers to various c
16e10 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e  allback function
16e20 73 20 74 68 61 74 0a 20 20 6d 61 6b 65 20 75 70  s that.  make up
16e30 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   the implementat
16e40 69 6f 6e 20 6f 66 20 74 68 65 20 6e 65 77 20 74  ion of the new t
16e50 6f 6b 65 6e 69 7a 65 72 20 74 79 70 65 2e 20 46  okenizer type. F
16e60 6f 72 20 74 6f 6b 65 6e 69 7a 65 72 73 2c 0a 20  or tokenizers,. 
16e70 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20 28   the structure (
16e80 64 65 66 69 6e 65 64 20 69 6e 20 66 74 73 33 5f  defined in fts3_
16e90 74 6f 6b 65 6e 69 7a 65 72 2e 68 29 20 69 73 20  tokenizer.h) is 
16ea0 63 61 6c 6c 65 64 0a 20 20 22 73 71 6c 69 74 65  called.  "sqlite
16eb0 33 5f 74 6f 6b 65 6e 69 7a 65 72 5f 6d 6f 64 75  3_tokenizer_modu
16ec0 6c 65 22 2e 0a 0a 3c 70 3e 0a 20 20 46 54 53 20  le"...<p>.  FTS 
16ed0 64 6f 65 73 20 6e 6f 74 20 65 78 70 6f 73 65 20  does not expose 
16ee0 61 20 43 2d 66 75 6e 63 74 69 6f 6e 20 74 68 61  a C-function tha
16ef0 74 20 75 73 65 72 73 20 63 61 6c 6c 20 74 6f 20  t users call to 
16f00 72 65 67 69 73 74 65 72 20 6e 65 77 0a 20 20 74  register new.  t
16f10 6f 6b 65 6e 69 7a 65 72 20 74 79 70 65 73 20 77  okenizer types w
16f20 69 74 68 20 61 20 64 61 74 61 62 61 73 65 20 68  ith a database h
16f30 61 6e 64 6c 65 2e 20 49 6e 73 74 65 61 64 2c 20  andle. Instead, 
16f40 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 75 73 74  the pointer must
16f50 0a 20 20 62 65 20 65 6e 63 6f 64 65 64 20 61 73  .  be encoded as
16f60 20 61 6e 20 53 51 4c 20 62 6c 6f 62 20 76 61 6c   an SQL blob val
16f70 75 65 20 61 6e 64 20 70 61 73 73 65 64 20 74 6f  ue and passed to
16f80 20 46 54 53 20 74 68 72 6f 75 67 68 20 74 68 65   FTS through the
16f90 20 53 51 4c 0a 20 20 65 6e 67 69 6e 65 20 62 79   SQL.  engine by
16fa0 20 65 76 61 6c 75 61 74 69 6e 67 20 61 20 73 70   evaluating a sp
16fb0 65 63 69 61 6c 20 73 63 61 6c 61 72 20 66 75 6e  ecial scalar fun
16fc0 63 74 69 6f 6e 2c 20 22 66 74 73 33 5f 74 6f 6b  ction, "fts3_tok
16fd0 65 6e 69 7a 65 72 28 29 22 2e 0a 20 20 54 68 65  enizer()"..  The
16fe0 20 66 74 73 33 5f 74 6f 6b 65 6e 69 7a 65 72 28   fts3_tokenizer(
16ff0 29 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62  ) function may b
17000 65 20 63 61 6c 6c 65 64 20 77 69 74 68 20 6f 6e  e called with on
17010 65 20 6f 72 20 74 77 6f 20 61 72 67 75 6d 65 6e  e or two argumen
17020 74 73 2c 0a 20 20 61 73 20 66 6f 6c 6c 6f 77 73  ts,.  as follows
17030 3a 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20  :..<codeblock>. 
17040 20 20 20 53 45 4c 45 43 54 20 66 74 73 33 5f 74     SELECT fts3_t
17050 6f 6b 65 6e 69 7a 65 72 28 26 6c 74 3b 74 6f 6b  okenizer(&lt;tok
17060 65 6e 69 7a 65 72 2d 6e 61 6d 65 26 67 74 3b 29  enizer-name&gt;)
17070 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 66 74 73  ;.    SELECT fts
17080 33 5f 74 6f 6b 65 6e 69 7a 65 72 28 26 6c 74 3b  3_tokenizer(&lt;
17090 74 6f 6b 65 6e 69 7a 65 72 2d 6e 61 6d 65 26 67  tokenizer-name&g
170a0 74 3b 2c 20 26 6c 74 3b 73 71 6c 69 74 65 33 5f  t;, &lt;sqlite3_
170b0 74 6f 6b 65 6e 69 7a 65 72 5f 6d 6f 64 75 6c 65  tokenizer_module
170c0 20 70 74 72 26 67 74 3b 29 3b 0a 3c 2f 63 6f 64   ptr&gt;);.</cod
170d0 65 62 6c 6f 63 6b 3e 0a 0a 3c 70 3e 0a 20 20 57  eblock>..<p>.  W
170e0 68 65 72 65 20 3c 74 6f 6b 65 6e 69 7a 65 72 2d  here <tokenizer-
170f0 6e 61 6d 65 3e 20 69 73 20 61 20 73 74 72 69 6e  name> is a strin
17100 67 20 69 64 65 6e 74 69 66 79 69 6e 67 20 74 68  g identifying th
17110 65 20 74 6f 6b 65 6e 69 7a 65 72 20 61 6e 64 0a  e tokenizer and.
17120 20 20 3c 73 71 6c 69 74 65 33 5f 74 6f 6b 65 6e    <sqlite3_token
17130 69 7a 65 72 5f 6d 6f 64 75 6c 65 20 70 74 72 3e  izer_module ptr>
17140 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
17150 20 61 6e 20 73 71 6c 69 74 65 33 5f 74 6f 6b 65   an sqlite3_toke
17160 6e 69 7a 65 72 5f 6d 6f 64 75 6c 65 0a 20 20 73  nizer_module.  s
17170 74 72 75 63 74 75 72 65 20 65 6e 63 6f 64 65 64  tructure encoded
17180 20 61 73 20 61 6e 20 53 51 4c 20 62 6c 6f 62 2e   as an SQL blob.
17190 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   If the second a
171a0 72 67 75 6d 65 6e 74 20 69 73 20 70 72 65 73 65  rgument is prese
171b0 6e 74 2c 0a 20 20 69 74 20 69 73 20 72 65 67 69  nt,.  it is regi
171c0 73 74 65 72 65 64 20 61 73 20 74 6f 6b 65 6e 69  stered as tokeni
171d0 7a 65 72 20 3c 74 6f 6b 65 6e 69 7a 65 72 2d 6e  zer <tokenizer-n
171e0 61 6d 65 3e 20 61 6e 64 20 61 20 63 6f 70 79 20  ame> and a copy 
171f0 6f 66 20 69 74 0a 20 20 72 65 74 75 72 6e 65 64  of it.  returned
17200 2e 20 49 66 20 6f 6e 6c 79 20 6f 6e 65 20 61 72  . If only one ar
17210 67 75 6d 65 6e 74 20 69 73 20 70 61 73 73 65 64  gument is passed
17220 2c 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  , a pointer to t
17230 68 65 20 74 6f 6b 65 6e 69 7a 65 72 0a 20 20 69  he tokenizer.  i
17240 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 63 75  mplementation cu
17250 72 72 65 6e 74 6c 79 20 72 65 67 69 73 74 65 72  rrently register
17260 65 64 20 61 73 20 3c 74 6f 6b 65 6e 69 7a 65 72  ed as <tokenizer
17270 2d 6e 61 6d 65 3e 20 69 73 20 72 65 74 75 72 6e  -name> is return
17280 65 64 2c 0a 20 20 65 6e 63 6f 64 65 64 20 61 73  ed,.  encoded as
17290 20 61 20 62 6c 6f 62 2e 20 4f 72 2c 20 69 66 20   a blob. Or, if 
172a0 6e 6f 20 73 75 63 68 20 74 6f 6b 65 6e 69 7a 65  no such tokenize
172b0 72 20 65 78 69 73 74 73 2c 20 61 6e 20 53 51 4c  r exists, an SQL
172c0 20 65 78 63 65 70 74 69 6f 6e 0a 20 20 28 65 72   exception.  (er
172d0 72 6f 72 29 20 69 73 20 72 61 69 73 65 64 2e 0a  ror) is raised..
172e0 0a 3c 70 3e 0a 20 20 3c 62 3e 53 45 43 55 52 49  .<p>.  <b>SECURI
172f0 54 59 20 57 41 52 4e 49 4e 47 3c 2f 62 3e 3a 20  TY WARNING</b>: 
17300 49 66 20 74 68 65 20 66 74 73 33 2f 34 20 65 78  If the fts3/4 ex
17310 74 65 6e 73 69 6f 6e 20 69 73 20 75 73 65 64 20  tension is used 
17320 69 6e 20 61 6e 20 65 6e 76 69 72 6f 6e 6d 65 6e  in an environmen
17330 74 0a 20 20 77 68 65 72 65 20 70 6f 74 65 6e 74  t.  where potent
17340 69 61 6c 6c 79 20 6d 61 6c 69 63 69 6f 75 73 20  ially malicious 
17350 75 73 65 72 73 20 6d 61 79 20 65 78 65 63 75 74  users may execut
17360 65 20 61 72 62 69 74 72 61 72 79 20 53 51 4c 2c  e arbitrary SQL,
17370 20 74 68 65 79 20 73 68 6f 75 6c 64 20 0a 20 20   they should .  
17380 62 65 20 70 72 65 76 65 6e 74 65 64 20 66 72 6f  be prevented fro
17390 6d 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 66  m invoking the f
173a0 74 73 33 5f 74 6f 6b 65 6e 69 7a 65 72 28 29 20  ts3_tokenizer() 
173b0 66 75 6e 63 74 69 6f 6e 2c 20 70 6f 73 73 69 62  function, possib
173c0 6c 79 20 75 73 69 6e 67 20 0a 20 20 74 68 65 20  ly using .  the 
173d0 5b 73 71 6c 69 74 65 33 5f 73 65 74 5f 61 75 74  [sqlite3_set_aut
173e0 68 6f 72 69 7a 65 72 28 29 7c 61 75 74 68 6f 72  horizer()|author
173f0 69 7a 61 74 69 6f 6e 20 63 61 6c 6c 62 61 63 6b  ization callback
17400 5d 2e 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 66 6f  ]...<p>.  The fo
17410 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 63 6f  llowing block co
17420 6e 74 61 69 6e 73 20 61 6e 20 65 78 61 6d 70 6c  ntains an exampl
17430 65 20 6f 66 20 63 61 6c 6c 69 6e 67 20 74 68 65  e of calling the
17440 20 66 74 73 33 5f 74 6f 6b 65 6e 69 7a 65 72 28   fts3_tokenizer(
17450 29 0a 20 20 66 75 6e 63 74 69 6f 6e 20 66 72 6f  ).  function fro
17460 6d 20 43 20 63 6f 64 65 3a 0a 0a 3c 63 6f 64 65  m C code:..<code
17470 62 6c 6f 63 6b 3e 0a 20 20 3c 69 3e 2f 2a 0a 20  block>.  <i>/*. 
17480 20 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 74   ** Register a t
17490 6f 6b 65 6e 69 7a 65 72 20 69 6d 70 6c 65 6d 65  okenizer impleme
174a0 6e 74 61 74 69 6f 6e 20 77 69 74 68 20 46 54 53  ntation with FTS
174b0 33 20 6f 72 20 46 54 53 34 2e 0a 20 20 2a 2f 3c  3 or FTS4..  */<
174c0 2f 69 3e 0a 20 20 69 6e 74 20 72 65 67 69 73 74  /i>.  int regist
174d0 65 72 54 6f 6b 65 6e 69 7a 65 72 28 0a 20 20 20  erTokenizer(.   
174e0 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20   sqlite3 *db,.  
174f0 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 0a 20    char *zName,. 
17500 20 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33     const sqlite3
17510 5f 74 6f 6b 65 6e 69 7a 65 72 5f 6d 6f 64 75 6c  _tokenizer_modul
17520 65 20 2a 70 0a 20 20 29 7b 0a 20 20 20 20 69 6e  e *p.  ){.    in
17530 74 20 72 63 3b 0a 20 20 20 20 73 71 6c 69 74 65  t rc;.    sqlite
17540 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20  3_stmt *pStmt;. 
17550 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
17560 53 71 6c 20 3d 20 22 53 45 4c 45 43 54 20 66 74  Sql = "SELECT ft
17570 73 33 5f 74 6f 6b 65 6e 69 7a 65 72 28 3f 2c 20  s3_tokenizer(?, 
17580 3f 29 22 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73  ?)";..    rc = s
17590 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
175a0 32 28 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20  2(db, zSql, -1, 
175b0 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20  &pStmt, 0);.    
175c0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
175d0 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
175e0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  n rc;.    }..   
175f0 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65   sqlite3_bind_te
17600 78 74 28 70 53 74 6d 74 2c 20 31 2c 20 7a 4e 61  xt(pStmt, 1, zNa
17610 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53  me, -1, SQLITE_S
17620 54 41 54 49 43 29 3b 0a 20 20 20 20 73 71 6c 69  TATIC);.    sqli
17630 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 53  te3_bind_blob(pS
17640 74 6d 74 2c 20 32 2c 20 26 70 2c 20 73 69 7a 65  tmt, 2, &p, size
17650 6f 66 28 70 29 2c 20 53 51 4c 49 54 45 5f 53 54  of(p), SQLITE_ST
17660 41 54 49 43 29 3b 0a 20 20 20 20 73 71 6c 69 74  ATIC);.    sqlit
17670 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a  e3_step(pStmt);.
17680 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
17690 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
176a0 6d 74 29 3b 0a 20 20 7d 0a 0a 20 20 3c 69 3e 2f  mt);.  }..  <i>/
176b0 2a 0a 20 20 2a 2a 20 51 75 65 72 79 20 46 54 53  *.  ** Query FTS
176c0 20 66 6f 72 20 74 68 65 20 74 6f 6b 65 6e 69 7a   for the tokeniz
176d0 65 72 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  er implementatio
176e0 6e 20 6e 61 6d 65 64 20 7a 4e 61 6d 65 2e 0a 20  n named zName.. 
176f0 20 2a 2f 3c 2f 69 3e 0a 20 20 69 6e 74 20 71 75   */</i>.  int qu
17700 65 72 79 54 6f 6b 65 6e 69 7a 65 72 28 0a 20 20  eryTokenizer(.  
17710 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20    sqlite3 *db,. 
17720 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 0a     char *zName,.
17730 20 20 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65      const sqlite
17740 33 5f 74 6f 6b 65 6e 69 7a 65 72 5f 6d 6f 64 75  3_tokenizer_modu
17750 6c 65 20 2a 2a 70 70 0a 20 20 29 7b 0a 20 20 20  le **pp.  ){.   
17760 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 73 71 6c   int rc;.    sql
17770 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
17780 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
17790 20 2a 7a 53 71 6c 20 3d 20 22 53 45 4c 45 43 54   *zSql = "SELECT
177a0 20 66 74 73 33 5f 74 6f 6b 65 6e 69 7a 65 72 28   fts3_tokenizer(
177b0 3f 29 22 3b 0a 0a 20 20 20 20 2a 70 70 20 3d 20  ?)";..    *pp = 
177c0 30 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  0;.    rc = sqli
177d0 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64  te3_prepare_v2(d
177e0 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53  b, zSql, -1, &pS
177f0 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  tmt, 0);.    if(
17800 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
17810 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
17820 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 71  c;.    }..    sq
17830 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28  lite3_bind_text(
17840 70 53 74 6d 74 2c 20 31 2c 20 7a 4e 61 6d 65 2c  pStmt, 1, zName,
17850 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54   -1, SQLITE_STAT
17860 49 43 29 3b 0a 20 20 20 20 69 66 28 20 53 51 4c  IC);.    if( SQL
17870 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33  ITE_ROW==sqlite3
17880 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b 0a  _step(pStmt) ){.
17890 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
178a0 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 28 70 53  3_column_type(pS
178b0 74 6d 74 2c 20 30 29 3d 3d 53 51 4c 49 54 45 5f  tmt, 0)==SQLITE_
178c0 42 4c 4f 42 20 29 7b 0a 20 20 20 20 20 20 20 20  BLOB ){.        
178d0 6d 65 6d 63 70 79 28 70 70 2c 20 73 71 6c 69 74  memcpy(pp, sqlit
178e0 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70  e3_column_blob(p
178f0 53 74 6d 74 2c 20 30 29 2c 20 73 69 7a 65 6f 66  Stmt, 0), sizeof
17900 28 2a 70 70 29 29 3b 0a 20 20 20 20 20 20 7d 0a  (*pp));.      }.
17910 20 20 20 20 7d 0a 0a 20 20 20 20 72 65 74 75 72      }..    retur
17920 6e 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69  n sqlite3_finali
17930 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 7d 0a 3c  ze(pStmt);.  }.<
17940 2f 63 6f 64 65 62 6c 6f 63 6b 3e 0a 0a 20 20 0a  /codeblock>..  .
17950 3c 68 31 20 74 61 67 73 3d 22 73 65 67 6d 65 6e  <h1 tags="segmen
17960 74 20 62 74 72 65 65 22 3e 44 61 74 61 20 53 74  t btree">Data St
17970 72 75 63 74 75 72 65 73 3c 2f 68 31 3e 0a 0a 3c  ructures</h1>..<
17980 70 3e 0a 20 20 54 68 69 73 20 73 65 63 74 69 6f  p>.  This sectio
17990 6e 20 64 65 73 63 72 69 62 65 73 20 61 74 20 61  n describes at a
179a0 20 68 69 67 68 2d 6c 65 76 65 6c 20 74 68 65 20   high-level the 
179b0 77 61 79 20 74 68 65 20 46 54 53 20 6d 6f 64 75  way the FTS modu
179c0 6c 65 20 73 74 6f 72 65 73 20 69 74 73 0a 20 20  le stores its.  
179d0 69 6e 64 65 78 20 61 6e 64 20 63 6f 6e 74 65 6e  index and conten
179e0 74 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  t in the databas
179f0 65 2e 20 49 74 20 69 73 20 3c 62 3e 6e 6f 74 20  e. It is <b>not 
17a00 6e 65 63 65 73 73 61 72 79 20 74 6f 20 72 65 61  necessary to rea
17a10 64 20 6f 72 20 0a 20 20 75 6e 64 65 72 73 74 61  d or .  understa
17a20 6e 64 20 74 68 65 20 6d 61 74 65 72 69 61 6c 20  nd the material 
17a30 69 6e 20 74 68 69 73 20 73 65 63 74 69 6f 6e 20  in this section 
17a40 69 6e 20 6f 72 64 65 72 20 74 6f 20 75 73 65 20  in order to use 
17a50 46 54 53 3c 2f 62 3e 20 69 6e 20 61 6e 20 0a 20  FTS</b> in an . 
17a60 20 61 70 70 6c 69 63 61 74 69 6f 6e 2e 20 48 6f   application. Ho
17a70 77 65 76 65 72 2c 20 69 74 20 6d 61 79 20 62 65  wever, it may be
17a80 20 75 73 65 66 75 6c 20 74 6f 20 61 70 70 6c 69   useful to appli
17a90 63 61 74 69 6f 6e 20 64 65 76 65 6c 6f 70 65 72  cation developer
17aa0 73 20 61 74 74 65 6d 70 74 69 6e 67 20 0a 20 20  s attempting .  
17ab0 74 6f 20 61 6e 61 6c 79 7a 65 20 61 6e 64 20 75  to analyze and u
17ac0 6e 64 65 72 73 74 61 6e 64 20 46 54 53 20 70 65  nderstand FTS pe
17ad0 72 66 6f 72 6d 61 6e 63 65 20 63 68 61 72 61 63  rformance charac
17ae0 74 65 72 69 73 74 69 63 73 2c 20 6f 72 20 74 6f  teristics, or to
17af0 20 64 65 76 65 6c 6f 70 65 72 73 20 0a 20 20 63   developers .  c
17b00 6f 6e 74 65 6d 70 6c 61 74 69 6e 67 20 65 6e 68  ontemplating enh
17b10 61 6e 63 65 6d 65 6e 74 73 20 74 6f 20 74 68 65  ancements to the
17b20 20 65 78 69 73 74 69 6e 67 20 46 54 53 20 66 65   existing FTS fe
17b30 61 74 75 72 65 20 73 65 74 2e 0a 0a 3c 74 63 6c  ature set...<tcl
17b40 3e 68 64 5f 66 72 61 67 6d 65 6e 74 20 2a 73 68  >hd_fragment *sh
17b50 61 64 6f 77 74 61 62 20 7b 46 54 53 20 73 68 61  adowtab {FTS sha
17b60 64 6f 77 20 74 61 62 6c 65 73 7d 20 7b 73 68 61  dow tables} {sha
17b70 64 6f 77 20 74 61 62 6c 65 73 7d 3c 2f 74 63 6c  dow tables}</tcl
17b80 3e 0a 3c 68 32 20 74 61 67 73 3d 22 73 68 61 64  >.<h2 tags="shad
17b90 6f 77 74 61 62 73 22 3e 53 68 61 64 6f 77 20 54  owtabs">Shadow T
17ba0 61 62 6c 65 73 3c 2f 68 32 3e 0a 3c 70 3e 0a 20  ables</h2>.<p>. 
17bb0 20 46 6f 72 20 65 61 63 68 20 46 54 53 20 76 69   For each FTS vi
17bc0 72 74 75 61 6c 20 74 61 62 6c 65 20 69 6e 20 61  rtual table in a
17bd0 20 64 61 74 61 62 61 73 65 2c 20 74 68 72 65 65   database, three
17be0 20 74 6f 20 66 69 76 65 20 72 65 61 6c 20 28 6e   to five real (n
17bf0 6f 6e 2d 76 69 72 74 75 61 6c 29 20 74 61 62 6c  on-virtual) tabl
17c00 65 73 0a 20 20 61 72 65 20 63 72 65 61 74 65 64  es.  are created
17c10 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 75 6e   to store the un
17c20 64 65 72 6c 79 69 6e 67 20 64 61 74 61 2e 20 20  derlying data.  
17c30 54 68 65 73 65 20 72 65 61 6c 20 74 61 62 6c 65  These real table
17c40 73 20 61 72 65 20 63 61 6c 6c 65 64 20 22 73 68  s are called "sh
17c50 61 64 6f 77 20 74 61 62 6c 65 73 22 2e 0a 20 20  adow tables"..  
17c60 54 68 65 20 72 65 61 6c 20 74 61 62 6c 65 73 20  The real tables 
17c70 61 72 65 20 6e 61 6d 65 64 20 22 25 5f 63 6f 6e  are named "%_con
17c80 74 65 6e 74 22 2c 0a 20 20 22 25 5f 73 65 67 64  tent",.  "%_segd
17c90 69 72 22 2c 20 22 25 5f 73 65 67 6d 65 6e 74 73  ir", "%_segments
17ca0 22 2c 20 22 25 5f 73 74 61 74 22 2c 20 61 6e 64  ", "%_stat", and
17cb0 20 22 25 5f 64 6f 63 73 69 7a 65 22 2c 20 77 68   "%_docsize", wh
17cc0 65 72 65 20 22 25 22 20 69 73 20 72 65 70 6c 61  ere "%" is repla
17cd0 63 65 64 20 62 79 20 74 68 65 20 6e 61 6d 65 0a  ced by the name.
17ce0 20 20 6f 66 20 74 68 65 20 46 54 53 20 76 69 72    of the FTS vir
17cf0 74 75 61 6c 20 74 61 62 6c 65 2e 0a 0a 3c 70 3e  tual table...<p>
17d00 0a 20 20 54 68 65 20 6c 65 66 74 6d 6f 73 74 20  .  The leftmost 
17d10 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 22 25  column of the "%
17d20 5f 63 6f 6e 74 65 6e 74 22 20 74 61 62 6c 65 20  _content" table 
17d30 69 73 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52  is an INTEGER PR
17d40 49 4d 41 52 59 20 4b 45 59 20 66 69 65 6c 64 0a  IMARY KEY field.
17d50 20 20 6e 61 6d 65 64 20 22 64 6f 63 69 64 22 2e    named "docid".
17d60 20 46 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20   Following this 
17d70 69 73 20 6f 6e 65 20 63 6f 6c 75 6d 6e 20 66 6f  is one column fo
17d80 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 6f 66  r each column of
17d90 20 74 68 65 20 46 54 53 0a 20 20 76 69 72 74 75   the FTS.  virtu
17da0 61 6c 20 74 61 62 6c 65 20 61 73 20 64 65 63 6c  al table as decl
17db0 61 72 65 64 20 62 79 20 74 68 65 20 75 73 65 72  ared by the user
17dc0 2c 20 6e 61 6d 65 64 20 62 79 20 70 72 65 70 65  , named by prepe
17dd0 6e 64 69 6e 67 20 74 68 65 20 63 6f 6c 75 6d 6e  nding the column
17de0 20 6e 61 6d 65 0a 20 20 73 75 70 70 6c 69 65 64   name.  supplied
17df0 20 62 79 20 74 68 65 20 75 73 65 72 20 77 69 74   by the user wit
17e00 68 20 22 63 3c 69 3e 4e 3c 2f 69 3e 22 2c 20 77  h "c<i>N</i>", w
17e10 68 65 72 65 20 3c 69 3e 4e 3c 2f 69 3e 20 69 73  here <i>N</i> is
17e20 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
17e30 65 20 0a 20 20 63 6f 6c 75 6d 6e 20 77 69 74 68  e .  column with
17e40 69 6e 20 74 68 65 20 74 61 62 6c 65 2c 20 6e 75  in the table, nu
17e50 6d 62 65 72 65 64 20 66 72 6f 6d 20 6c 65 66 74  mbered from left
17e60 20 74 6f 20 72 69 67 68 74 20 73 74 61 72 74 69   to right starti
17e70 6e 67 20 77 69 74 68 20 30 2e 20 44 61 74 61 0a  ng with 0. Data.
17e80 20 20 74 79 70 65 73 20 73 75 70 70 6c 69 65 64    types supplied
17e90 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   as part of the 
17ea0 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 64 65  virtual table de
17eb0 63 6c 61 72 61 74 69 6f 6e 20 61 72 65 20 6e 6f  claration are no
17ec0 74 20 75 73 65 64 20 61 73 0a 20 20 70 61 72 74  t used as.  part
17ed0 20 6f 66 20 74 68 65 20 25 5f 63 6f 6e 74 65 6e   of the %_conten
17ee0 74 20 74 61 62 6c 65 20 64 65 63 6c 61 72 61 74  t table declarat
17ef0 69 6f 6e 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65  ion. For example
17f00 3a 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20  :..<codeblock>. 
17f10 20 3c 69 3e 2d 2d 20 56 69 72 74 75 61 6c 20 74   <i>-- Virtual t
17f20 61 62 6c 65 20 64 65 63 6c 61 72 61 74 69 6f 6e  able declaration
17f30 3c 2f 69 3e 0a 20 20 43 52 45 41 54 45 20 56 49  </i>.  CREATE VI
17f40 52 54 55 41 4c 20 54 41 42 4c 45 20 61 62 63 20  RTUAL TABLE abc 
17f50 55 53 49 4e 47 20 66 74 73 34 28 61 20 4e 55 4d  USING fts4(a NUM
17f60 42 45 52 2c 20 62 20 54 45 58 54 2c 20 63 29 3b  BER, b TEXT, c);
17f70 0a 0a 20 20 3c 69 3e 2d 2d 20 43 6f 72 72 65 73  ..  <i>-- Corres
17f80 70 6f 6e 64 69 6e 67 20 25 5f 63 6f 6e 74 65 6e  ponding %_conten
17f90 74 20 74 61 62 6c 65 20 64 65 63 6c 61 72 61 74  t table declarat
17fa0 69 6f 6e 3c 2f 69 3e 0a 20 20 43 52 45 41 54 45  ion</i>.  CREATE
17fb0 20 54 41 42 4c 45 20 61 62 63 5f 63 6f 6e 74 65   TABLE abc_conte
17fc0 6e 74 28 64 6f 63 69 64 20 49 4e 54 45 47 45 52  nt(docid INTEGER
17fd0 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 63 30   PRIMARY KEY, c0
17fe0 61 2c 20 63 31 62 2c 20 63 32 63 29 3b 0a 3c 2f  a, c1b, c2c);.</
17ff0 63 6f 64 65 62 6c 6f 63 6b 3e 0a 0a 3c 70 3e 0a  codeblock>..<p>.
18000 20 20 54 68 65 20 25 5f 63 6f 6e 74 65 6e 74 20    The %_content 
18010 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74  table contains t
18020 68 65 20 75 6e 61 64 75 6c 74 65 72 61 74 65 64  he unadulterated
18030 20 64 61 74 61 20 69 6e 73 65 72 74 65 64 20 62   data inserted b
18040 79 20 74 68 65 20 75 73 65 72 20 0a 20 20 69 6e  y the user .  in
18050 74 6f 20 74 68 65 20 46 54 53 20 76 69 72 74 75  to the FTS virtu
18060 61 6c 20 74 61 62 6c 65 20 62 79 20 74 68 65 20  al table by the 
18070 75 73 65 72 2e 20 49 66 20 74 68 65 20 75 73 65  user. If the use
18080 72 20 64 6f 65 73 20 6e 6f 74 20 65 78 70 6c 69  r does not expli
18090 63 69 74 6c 79 0a 20 20 73 75 70 70 6c 79 20 61  citly.  supply a
180a0 20 22 64 6f 63 69 64 22 20 76 61 6c 75 65 20 77   "docid" value w
180b0 68 65 6e 20 69 6e 73 65 72 74 69 6e 67 20 72 65  hen inserting re
180c0 63 6f 72 64 73 2c 20 6f 6e 65 20 69 73 20 73 65  cords, one is se
180d0 6c 65 63 74 65 64 20 61 75 74 6f 6d 61 74 69 63  lected automatic
180e0 61 6c 6c 79 0a 20 20 62 79 20 74 68 65 20 73 79  ally.  by the sy
180f0 73 74 65 6d 2e 0a 0a 3c 70 3e 0a 20 20 54 68 65  stem...<p>.  The
18100 20 25 5f 73 74 61 74 20 61 6e 64 20 25 5f 64 6f   %_stat and %_do
18110 63 73 69 7a 65 20 74 61 62 6c 65 73 20 61 72 65  csize tables are
18120 20 6f 6e 6c 79 20 63 72 65 61 74 65 64 20 69 66   only created if
18130 20 74 68 65 20 46 54 53 20 74 61 62 6c 65 20 75   the FTS table u
18140 73 65 73 20 74 68 65 0a 20 20 46 54 53 34 20 6d  ses the.  FTS4 m
18150 6f 64 75 6c 65 2c 20 6e 6f 74 20 46 54 53 33 2e  odule, not FTS3.
18160 20 46 75 72 74 68 65 72 6d 6f 72 65 2c 20 74 68   Furthermore, th
18170 65 20 25 5f 64 6f 63 73 69 7a 65 20 74 61 62 6c  e %_docsize tabl
18180 65 20 69 73 20 6f 6d 69 74 74 65 64 20 69 66 20  e is omitted if 
18190 74 68 65 0a 20 20 46 54 53 34 20 74 61 62 6c 65  the.  FTS4 table
181a0 20 69 73 20 63 72 65 61 74 65 64 20 77 69 74 68   is created with
181b0 20 74 68 65 20 5b 46 54 53 34 20 6d 61 74 63 68   the [FTS4 match
181c0 69 6e 66 6f 20 6f 70 74 69 6f 6e 7c 22 6d 61 74  info option|"mat
181d0 63 68 69 6e 66 6f 3d 66 74 73 33 22 5d 20 64 69  chinfo=fts3"] di
181e0 72 65 63 74 69 76 65 0a 20 20 73 70 65 63 69 66  rective.  specif
181f0 69 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 74  ied as part of t
18200 68 65 20 43 52 45 41 54 45 20 56 49 52 54 55 41  he CREATE VIRTUA
18210 4c 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  L TABLE statemen
18220 74 2e 20 49 66 20 74 68 65 79 20 61 72 65 20 63  t. If they are c
18230 72 65 61 74 65 64 2c 0a 20 20 74 68 65 20 73 63  reated,.  the sc
18240 68 65 6d 61 20 6f 66 20 74 68 65 20 74 77 6f 20  hema of the two 
18250 74 61 62 6c 65 73 20 69 73 20 61 73 20 66 6f 6c  tables is as fol
18260 6c 6f 77 73 3a 0a 3c 63 6f 64 65 62 6c 6f 63 6b  lows:.<codeblock
18270 3e 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  >.  CREATE TABLE
18280 20 25 5f 73 74 61 74 28 0a 20 20 20 20 69 64 20   %_stat(.    id 
18290 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
182a0 4b 45 59 2c 20 0a 20 20 20 20 76 61 6c 75 65 20  KEY, .    value 
182b0 42 4c 4f 42 0a 20 20 29 3b 0a 0a 20 20 43 52 45  BLOB.  );..  CRE
182c0 41 54 45 20 54 41 42 4c 45 20 25 5f 64 6f 63 73  ATE TABLE %_docs
182d0 69 7a 65 28 0a 20 20 20 20 64 6f 63 69 64 20 49  ize(.    docid I
182e0 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
182f0 45 59 2c 0a 20 20 20 20 73 69 7a 65 20 42 4c 4f  EY,.    size BLO
18300 42 0a 20 20 29 3b 0a 3c 2f 63 6f 64 65 62 6c 6f  B.  );.</codeblo
18310 63 6b 3e 0a 0a 3c 70 3e 0a 20 20 46 6f 72 20 65  ck>..<p>.  For e
18320 61 63 68 20 72 6f 77 20 69 6e 20 74 68 65 20 46  ach row in the F
18330 54 53 20 74 61 62 6c 65 2c 20 74 68 65 20 25 5f  TS table, the %_
18340 64 6f 63 73 69 7a 65 20 74 61 62 6c 65 20 63 6f  docsize table co
18350 6e 74 61 69 6e 73 20 61 20 63 6f 72 72 65 73 70  ntains a corresp
18360 6f 6e 64 69 6e 67 0a 20 20 72 6f 77 20 77 69 74  onding.  row wit
18370 68 20 74 68 65 20 73 61 6d 65 20 22 64 6f 63 69  h the same "doci
18380 64 22 20 76 61 6c 75 65 2e 20 54 68 65 20 22 73  d" value. The "s
18390 69 7a 65 22 20 66 69 65 6c 64 20 63 6f 6e 74 61  ize" field conta
183a0 69 6e 73 20 61 20 62 6c 6f 62 20 63 6f 6e 73 69  ins a blob consi
183b0 73 74 69 6e 67 0a 20 20 6f 66 20 3c 69 3e 4e 3c  sting.  of <i>N<
183c0 2f 69 3e 20 46 54 53 20 76 61 72 69 6e 74 73 2c  /i> FTS varints,
183d0 20 77 68 65 72 65 20 3c 69 3e 4e 3c 2f 69 3e 20   where <i>N</i> 
183e0 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
183f0 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 63 6f   user-defined co
18400 6c 75 6d 6e 73 0a 20 20 69 6e 20 74 68 65 20 74  lumns.  in the t
18410 61 62 6c 65 2e 20 45 61 63 68 20 76 61 72 69 6e  able. Each varin
18420 74 20 69 6e 20 74 68 65 20 22 73 69 7a 65 22 20  t in the "size" 
18430 62 6c 6f 62 20 69 73 20 74 68 65 20 6e 75 6d 62  blob is the numb
18440 65 72 20 6f 66 20 74 6f 6b 65 6e 73 20 69 6e 20  er of tokens in 
18450 74 68 65 0a 20 20 63 6f 72 72 65 73 70 6f 6e 64  the.  correspond
18460 69 6e 67 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  ing column of th
18470 65 20 61 73 73 6f 63 69 61 74 65 64 20 72 6f 77  e associated row
18480 20 69 6e 20 74 68 65 20 46 54 53 20 74 61 62 6c   in the FTS tabl
18490 65 2e 20 54 68 65 20 25 5f 73 74 61 74 20 74 61  e. The %_stat ta
184a0 62 6c 65 0a 20 20 61 6c 77 61 79 73 20 63 6f 6e  ble.  always con
184b0 74 61 69 6e 73 20 61 20 73 69 6e 67 6c 65 20 72  tains a single r
184c0 6f 77 20 77 69 74 68 20 74 68 65 20 22 69 64 22  ow with the "id"
184d0 20 63 6f 6c 75 6d 6e 20 73 65 74 20 74 6f 20 30   column set to 0
184e0 2e 20 54 68 65 20 22 76 61 6c 75 65 22 20 0a 20  . The "value" . 
184f0 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73   column contains
18500 20 61 20 62 6c 6f 62 20 63 6f 6e 73 69 73 74 69   a blob consisti
18510 6e 67 20 6f 66 20 3c 69 3e 4e 2b 31 3c 2f 69 3e  ng of <i>N+1</i>
18520 20 46 54 53 20 76 61 72 69 6e 74 73 2c 20 77 68   FTS varints, wh
18530 65 72 65 20 3c 69 3e 4e 3c 2f 69 3e 0a 20 20 69  ere <i>N</i>.  i
18540 73 20 61 67 61 69 6e 20 74 68 65 20 6e 75 6d 62  s again the numb
18550 65 72 20 6f 66 20 75 73 65 72 2d 64 65 66 69 6e  er of user-defin
18560 65 64 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  ed columns in th
18570 65 20 46 54 53 20 74 61 62 6c 65 2e 20 54 68 65  e FTS table. The
18580 20 66 69 72 73 74 0a 20 20 76 61 72 69 6e 74 20   first.  varint 
18590 69 6e 20 74 68 65 20 62 6c 6f 62 20 69 73 20 73  in the blob is s
185a0 65 74 20 74 6f 20 74 68 65 20 74 6f 74 61 6c 20  et to the total 
185b0 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  number of rows i
185c0 6e 20 74 68 65 20 46 54 53 20 74 61 62 6c 65 2e  n the FTS table.
185d0 20 54 68 65 0a 20 20 73 65 63 6f 6e 64 20 61 6e   The.  second an
185e0 64 20 73 75 62 73 65 71 75 65 6e 74 20 76 61 72  d subsequent var
185f0 69 6e 74 73 20 63 6f 6e 74 61 69 6e 20 74 68 65  ints contain the
18600 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
18610 20 74 6f 6b 65 6e 73 20 73 74 6f 72 65 64 20 69   tokens stored i
18620 6e 0a 20 20 74 68 65 20 63 6f 72 72 65 73 70 6f  n.  the correspo
18630 6e 64 69 6e 67 20 63 6f 6c 75 6d 6e 20 66 6f 72  nding column for
18640 20 61 6c 6c 20 72 6f 77 73 20 6f 66 20 74 68 65   all rows of the
18650 20 46 54 53 20 74 61 62 6c 65 2e 0a 0a 3c 70 3e   FTS table...<p>
18660 0a 20 20 54 68 65 20 74 77 6f 20 72 65 6d 61 69  .  The two remai
18670 6e 69 6e 67 20 74 61 62 6c 65 73 2c 20 25 5f 73  ning tables, %_s
18680 65 67 6d 65 6e 74 73 20 61 6e 64 20 25 5f 73 65  egments and %_se
18690 67 64 69 72 2c 20 61 72 65 20 75 73 65 64 20 74  gdir, are used t
186a0 6f 20 73 74 6f 72 65 20 74 68 65 20 0a 20 20 66  o store the .  f
186b0 75 6c 6c 2d 74 65 78 74 20 69 6e 64 65 78 2e 20  ull-text index. 
186c0 43 6f 6e 63 65 70 74 75 61 6c 6c 79 2c 20 74 68  Conceptually, th
186d0 69 73 20 69 6e 64 65 78 20 69 73 20 61 20 6c 6f  is index is a lo
186e0 6f 6b 75 70 20 74 61 62 6c 65 20 74 68 61 74 20  okup table that 
186f0 6d 61 70 73 20 65 61 63 68 20 0a 20 20 74 65 72  maps each .  ter
18700 6d 20 28 77 6f 72 64 29 20 74 6f 20 74 68 65 20  m (word) to the 
18710 73 65 74 20 6f 66 20 64 6f 63 69 64 20 76 61 6c  set of docid val
18720 75 65 73 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  ues correspondin
18730 67 20 74 6f 20 72 65 63 6f 72 64 73 20 69 6e 20  g to records in 
18740 74 68 65 20 0a 20 20 25 5f 63 6f 6e 74 65 6e 74  the .  %_content
18750 20 74 61 62 6c 65 20 74 68 61 74 20 63 6f 6e 74   table that cont
18760 61 69 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  ain one or more 
18770 6f 63 63 75 72 72 65 6e 63 65 73 20 6f 66 20 74  occurrences of t
18780 68 65 20 74 65 72 6d 2e 20 54 6f 0a 20 20 72 65  he term. To.  re
18790 74 72 69 65 76 65 20 61 6c 6c 20 64 6f 63 75 6d  trieve all docum
187a0 65 6e 74 73 20 74 68 61 74 20 63 6f 6e 74 61 69  ents that contai
187b0 6e 20 61 20 73 70 65 63 69 66 69 65 64 20 74 65  n a specified te
187c0 72 6d 2c 20 74 68 65 20 46 54 53 20 6d 6f 64 75  rm, the FTS modu
187d0 6c 65 0a 20 20 71 75 65 72 69 65 73 20 74 68 69  le.  queries thi
187e0 73 20 69 6e 64 65 78 20 74 6f 20 64 65 74 65 72  s index to deter
187f0 6d 69 6e 65 20 74 68 65 20 73 65 74 20 6f 66 20  mine the set of 
18800 64 6f 63 69 64 20 76 61 6c 75 65 73 20 66 6f 72  docid values for
18810 20 72 65 63 6f 72 64 73 20 74 68 61 74 0a 20 20   records that.  
18820 63 6f 6e 74 61 69 6e 20 74 68 65 20 74 65 72 6d  contain the term
18830 2c 20 74 68 65 6e 20 72 65 74 72 69 65 76 65 73  , then retrieves
18840 20 74 68 65 20 72 65 71 75 69 72 65 64 20 64 6f   the required do
18850 63 75 6d 65 6e 74 73 20 66 72 6f 6d 20 74 68 65  cuments from the
18860 20 25 5f 63 6f 6e 74 65 6e 74 0a 20 20 74 61 62   %_content.  tab
18870 6c 65 2e 20 52 65 67 61 72 64 6c 65 73 73 20 6f  le. Regardless o
18880 66 20 74 68 65 20 73 63 68 65 6d 61 20 6f 66 20  f the schema of 
18890 74 68 65 20 46 54 53 20 76 69 72 74 75 61 6c 20  the FTS virtual 
188a0 74 61 62 6c 65 2c 20 74 68 65 20 25 5f 73 65 67  table, the %_seg
188b0 6d 65 6e 74 73 0a 20 20 61 6e 64 20 25 5f 73 65  ments.  and %_se
188c0 67 64 69 72 20 74 61 62 6c 65 73 20 61 72 65 20  gdir tables are 
188d0 61 6c 77 61 79 73 20 63 72 65 61 74 65 64 20 61  always created a
188e0 73 20 66 6f 6c 6c 6f 77 73 3a 0a 0a 3c 63 6f 64  s follows:..<cod
188f0 65 62 6c 6f 63 6b 3e 0a 20 20 43 52 45 41 54 45  eblock>.  CREATE
18900 20 54 41 42 4c 45 20 25 5f 73 65 67 6d 65 6e 74   TABLE %_segment
18910 73 28 0a 20 20 20 20 62 6c 6f 63 6b 69 64 20 49  s(.    blockid I
18920 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
18930 45 59 2c 20 20 20 20 20 20 20 3c 69 3e 2d 2d 20  EY,       <i>-- 
18940 42 2d 74 72 65 65 20 6e 6f 64 65 20 69 64 3c 2f  B-tree node id</
18950 69 3e 0a 20 20 20 20 62 6c 6f 63 6b 20 62 6c 6f  i>.    block blo
18960 62 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b               
18970 20 20 20 20 20 20 20 20 20 20 3c 69 3e 2d 2d 20            <i>-- 
18980 42 2d 74 72 65 65 20 6e 6f 64 65 20 64 61 74 61  B-tree node data
18990 3c 2f 69 3e 0a 20 20 29 3b 0a 0a 20 20 43 52 45  </i>.  );..  CRE
189a0 41 54 45 20 54 41 42 4c 45 20 25 5f 73 65 67 64  ATE TABLE %_segd
189b0 69 72 28 0a 20 20 20 20 6c 65 76 65 6c 20 49 4e  ir(.    level IN
189c0 54 45 47 45 52 2c 0a 20 20 20 20 69 64 78 20 49  TEGER,.    idx I
189d0 4e 54 45 47 45 52 2c 0a 20 20 20 20 73 74 61 72  NTEGER,.    star
189e0 74 5f 62 6c 6f 63 6b 20 49 4e 54 45 47 45 52 2c  t_block INTEGER,
189f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3c                 <
18a00 69 3e 2d 2d 20 42 6c 6f 63 6b 69 64 20 6f 66 20  i>-- Blockid of 
18a10 66 69 72 73 74 20 6e 6f 64 65 20 69 6e 20 25 5f  first node in %_
18a20 73 65 67 6d 65 6e 74 73 3c 2f 69 3e 0a 20 20 20  segments</i>.   
18a30 20 6c 65 61 76 65 73 5f 65 6e 64 5f 62 6c 6f 63   leaves_end_bloc
18a40 6b 20 49 4e 54 45 47 45 52 2c 20 20 20 20 20 20  k INTEGER,      
18a50 20 20 20 20 3c 69 3e 2d 2d 20 42 6c 6f 63 6b 69      <i>-- Blocki
18a60 64 20 6f 66 20 6c 61 73 74 20 6c 65 61 66 20 6e  d of last leaf n
18a70 6f 64 65 20 69 6e 20 25 5f 73 65 67 6d 65 6e 74  ode in %_segment
18a80 73 3c 2f 69 3e 0a 20 20 20 20 65 6e 64 5f 62 6c  s</i>.    end_bl
18a90 6f 63 6b 20 49 4e 54 45 47 45 52 2c 20 20 20 20  ock INTEGER,    
18aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 3c 69 3e               <i>
18ab0 2d 2d 20 42 6c 6f 63 6b 69 64 20 6f 66 20 6c 61  -- Blockid of la
18ac0 73 74 20 6e 6f 64 65 20 69 6e 20 25 5f 73 65 67  st node in %_seg
18ad0 6d 65 6e 74 73 3c 2f 69 3e 0a 20 20 20 20 72 6f  ments</i>.    ro
18ae0 6f 74 20 42 4c 4f 42 2c 20 20 20 20 20 20 20 20  ot BLOB,        
18af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18b00 20 3c 69 3e 2d 2d 20 42 2d 74 72 65 65 20 72 6f   <i>-- B-tree ro
18b10 6f 74 20 6e 6f 64 65 3c 2f 69 3e 0a 20 20 20 20  ot node</i>.    
18b20 50 52 49 4d 41 52 59 20 4b 45 59 28 6c 65 76 65  PRIMARY KEY(leve
18b30 6c 2c 20 69 64 78 29 0a 20 20 29 3b 0a 3c 2f 63  l, idx).  );.</c
18b40 6f 64 65 62 6c 6f 63 6b 3e 0a 0a 3c 70 3e 0a 20  odeblock>..<p>. 
18b50 20 54 68 65 20 73 63 68 65 6d 61 20 64 65 70 69   The schema depi
18b60 63 74 65 64 20 61 62 6f 76 65 20 69 73 20 6e 6f  cted above is no
18b70 74 20 64 65 73 69 67 6e 65 64 20 74 6f 20 73 74  t designed to st
18b80 6f 72 65 20 74 68 65 20 66 75 6c 6c 2d 74 65 78  ore the full-tex
18b90 74 20 69 6e 64 65 78 20 0a 20 20 64 69 72 65 63  t index .  direc
18ba0 74 6c 79 2e 20 49 6e 73 74 65 61 64 2c 20 69 74  tly. Instead, it
18bb0 20 69 73 20 75 73 65 64 20 74 6f 20 6f 6e 65 20   is used to one 
18bc0 6f 72 20 6d 6f 72 65 20 62 2d 74 72 65 65 20 73  or more b-tree s
18bd0 74 72 75 63 74 75 72 65 73 2e 20 54 68 65 72 65  tructures. There
18be0 0a 20 20 69 73 20 6f 6e 65 20 62 2d 74 72 65 65  .  is one b-tree
18bf0 20 66 6f 72 20 65 61 63 68 20 72 6f 77 20 69 6e   for each row in
18c00 20 74 68 65 20 25 5f 73 65 67 64 69 72 20 74 61   the %_segdir ta
18c10 62 6c 65 2e 20 54 68 65 20 25 5f 73 65 67 64 69  ble. The %_segdi
18c20 72 20 74 61 62 6c 65 0a 20 20 72 6f 77 20 63 6f  r table.  row co
18c30 6e 74 61 69 6e 73 20 74 68 65 20 72 6f 6f 74 20  ntains the root 
18c40 6e 6f 64 65 20 61 6e 64 20 76 61 72 69 6f 75 73  node and various
18c50 20 6d 65 74 61 2d 64 61 74 61 20 61 73 73 6f 63   meta-data assoc
18c60 69 61 74 65 64 20 77 69 74 68 20 74 68 65 0a 20  iated with the. 
18c70 20 62 2d 74 72 65 65 20 73 74 72 75 63 74 75 72   b-tree structur
18c80 65 2c 20 61 6e 64 20 74 68 65 20 25 5f 73 65 67  e, and the %_seg
18c90 6d 65 6e 74 73 20 74 61 62 6c 65 20 63 6f 6e 74  ments table cont
18ca0 61 69 6e 73 20 61 6c 6c 20 6f 74 68 65 72 20 28  ains all other (
18cb0 6e 6f 6e 2d 72 6f 6f 74 29 0a 20 20 62 2d 74 72  non-root).  b-tr
18cc0 65 65 20 6e 6f 64 65 73 2e 20 45 61 63 68 20 62  ee nodes. Each b
18cd0 2d 74 72 65 65 20 69 73 20 72 65 66 65 72 72 65  -tree is referre
18ce0 64 20 74 6f 20 61 73 20 61 20 22 73 65 67 6d 65  d to as a "segme
18cf0 6e 74 22 2e 20 4f 6e 63 65 20 69 74 20 68 61 73  nt". Once it has
18d00 0a 20 20 62 65 65 6e 20 63 72 65 61 74 65 64 2c  .  been created,
18d10 20 61 20 73 65 67 6d 65 6e 74 20 62 2d 74 72 65   a segment b-tre
18d20 65 20 69 73 20 6e 65 76 65 72 20 75 70 64 61 74  e is never updat
18d30 65 64 20 28 61 6c 74 68 6f 75 67 68 20 69 74 20  ed (although it 
18d40 6d 61 79 20 62 65 0a 20 20 64 65 6c 65 74 65 64  may be.  deleted
18d50 20 61 6c 74 6f 67 65 74 68 65 72 29 2e 0a 0a 3c   altogether)...<
18d60 70 3e 0a 20 20 54 68 65 20 6b 65 79 73 20 75 73  p>.  The keys us
18d70 65 64 20 62 79 20 65 61 63 68 20 73 65 67 6d 65  ed by each segme
18d80 6e 74 20 62 2d 74 72 65 65 20 61 72 65 20 74 65  nt b-tree are te
18d90 72 6d 73 20 28 77 6f 72 64 73 29 2e 20 41 73 20  rms (words). As 
18da0 77 65 6c 6c 20 61 73 20 74 68 65 0a 20 20 6b 65  well as the.  ke
18db0 79 2c 20 65 61 63 68 20 73 65 67 6d 65 6e 74 20  y, each segment 
18dc0 62 2d 74 72 65 65 20 65 6e 74 72 79 20 68 61 73  b-tree entry has
18dd0 20 61 6e 20 61 73 73 6f 63 69 61 74 65 64 20 22   an associated "
18de0 64 6f 63 6c 69 73 74 22 20 28 64 6f 63 75 6d 65  doclist" (docume
18df0 6e 74 20 6c 69 73 74 29 2e 0a 20 20 41 20 64 6f  nt list)..  A do
18e00 63 6c 69 73 74 20 63 6f 6e 73 69 73 74 73 20 6f  clist consists o
18e10 66 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 65  f zero or more e
18e20 6e 74 72 69 65 73 2c 20 77 68 65 72 65 20 65 61  ntries, where ea
18e30 63 68 20 65 6e 74 72 79 20 63 6f 6e 73 69 73 74  ch entry consist
18e40 73 20 6f 66 3a 0a 0a 3c 75 6c 3e 0a 20 20 3c 6c  s of:..<ul>.  <l
18e50 69 3e 20 41 20 64 6f 63 69 64 20 28 64 6f 63 75  i> A docid (docu
18e60 6d 65 6e 74 20 69 64 29 2c 20 61 6e 64 0a 20 20  ment id), and.  
18e70 3c 6c 69 3e 20 41 20 6c 69 73 74 20 6f 66 20 74  <li> A list of t
18e80 65 72 6d 20 6f 66 66 73 65 74 73 2c 20 6f 6e 65  erm offsets, one
18e90 20 66 6f 72 20 65 61 63 68 20 6f 63 63 75 72 72   for each occurr
18ea0 65 6e 63 65 20 6f 66 20 74 68 65 20 74 65 72 6d  ence of the term
18eb0 20 77 69 74 68 69 6e 0a 20 20 20 20 20 20 20 74   within.       t
18ec0 68 65 20 64 6f 63 75 6d 65 6e 74 2e 20 41 20 74  he document. A t
18ed0 65 72 6d 20 6f 66 66 73 65 74 20 69 6e 64 69 63  erm offset indic
18ee0 61 74 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20  ates the number 
18ef0 6f 66 20 74 6f 6b 65 6e 73 20 28 77 6f 72 64 73  of tokens (words
18f00 29 0a 20 20 20 20 20 20 20 74 68 61 74 20 6f 63  ).       that oc
18f10 63 75 72 20 62 65 66 6f 72 65 20 74 68 65 20 74  cur before the t
18f20 65 72 6d 20 69 6e 20 71 75 65 73 74 69 6f 6e 2c  erm in question,
18f30 20 6e 6f 74 20 74 68 65 20 6e 75 6d 62 65 72 20   not the number 
18f40 6f 66 20 63 68 61 72 61 63 74 65 72 73 0a 20 20  of characters.  
18f50 20 20 20 20 20 6f 72 20 62 79 74 65 73 2e 20 46       or bytes. F
18f60 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 20  or example, the 
18f70 74 65 72 6d 20 6f 66 66 73 65 74 20 6f 66 20 74  term offset of t
18f80 68 65 20 74 65 72 6d 20 22 77 61 72 22 20 69 6e  he term "war" in
18f90 20 74 68 65 0a 20 20 20 20 20 20 20 70 68 72 61   the.       phra
18fa0 73 65 20 22 41 6e 63 65 73 74 72 61 6c 20 76 6f  se "Ancestral vo
18fb0 69 63 65 73 20 70 72 6f 70 68 65 73 79 69 6e 67  ices prophesying
18fc0 20 77 61 72 21 22 20 69 73 20 33 2e 0a 3c 2f 75   war!" is 3..</u
18fd0 6c 3e 0a 0a 3c 70 3e 0a 20 20 45 6e 74 72 69 65  l>..<p>.  Entrie
18fe0 73 20 77 69 74 68 69 6e 20 61 20 64 6f 63 6c 69  s within a docli
18ff0 73 74 20 61 72 65 20 73 6f 72 74 65 64 20 62 79  st are sorted by
19000 20 64 6f 63 69 64 2e 20 50 6f 73 69 74 69 6f 6e   docid. Position
19010 73 20 77 69 74 68 69 6e 20 61 20 64 6f 63 6c 69  s within a docli
19020 73 74 0a 20 20 65 6e 74 72 79 20 61 72 65 20 73  st.  entry are s
19030 74 6f 72 65 64 20 69 6e 20 61 73 63 65 6e 64 69  tored in ascendi
19040 6e 67 20 6f 72 64 65 72 2e 0a 0a 3c 70 3e 0a 20  ng order...<p>. 
19050 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   The contents of
19060 20 74 68 65 20 6c 6f 67 69 63 61 6c 20 66 75 6c   the logical ful
19070 6c 2d 74 65 78 74 20 69 6e 64 65 78 20 69 73 20  l-text index is 
19080 66 6f 75 6e 64 20 62 79 20 6d 65 72 67 69 6e 67  found by merging
19090 20 74 68 65 0a 20 20 63 6f 6e 74 65 6e 74 73 20   the.  contents 
190a0 6f 66 20 61 6c 6c 20 73 65 67 6d 65 6e 74 20 62  of all segment b
190b0 2d 74 72 65 65 73 2e 20 49 66 20 61 20 74 65 72  -trees. If a ter
190c0 6d 20 69 73 20 70 72 65 73 65 6e 74 20 69 6e 20  m is present in 
190d0 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 0a 20 20  more than one.  
190e0 73 65 67 6d 65 6e 74 20 62 2d 74 72 65 65 2c 20  segment b-tree, 
190f0 74 68 65 6e 20 69 74 20 6d 61 70 73 20 74 6f 20  then it maps to 
19100 74 68 65 20 75 6e 69 6f 6e 20 6f 66 20 65 61 63  the union of eac
19110 68 20 69 6e 64 69 76 69 64 75 61 6c 20 64 6f 63  h individual doc
19120 6c 69 73 74 2e 20 49 66 2c 0a 20 20 66 6f 72 20  list. If,.  for 
19130 61 20 73 69 6e 67 6c 65 20 74 65 72 6d 2c 20 74  a single term, t
19140 68 65 20 73 61 6d 65 20 64 6f 63 69 64 20 6f 63  he same docid oc
19150 63 75 72 73 20 69 6e 20 6d 6f 72 65 20 74 68 61  curs in more tha
19160 6e 20 6f 6e 65 20 64 6f 63 6c 69 73 74 2c 20 74  n one doclist, t
19170 68 65 6e 20 6f 6e 6c 79 0a 20 20 74 68 65 20 64  hen only.  the d
19180 6f 63 6c 69 73 74 20 74 68 61 74 20 69 73 20 70  oclist that is p
19190 61 72 74 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  art of the most 
191a0 72 65 63 65 6e 74 6c 79 20 63 72 65 61 74 65 64  recently created
191b0 20 73 65 67 6d 65 6e 74 20 62 2d 74 72 65 65 20   segment b-tree 
191c0 69 73 20 0a 20 20 63 6f 6e 73 69 64 65 72 65 64  is .  considered
191d0 20 76 61 6c 69 64 2e 20 0a 0a 3c 70 3e 0a 20 20   valid. ..<p>.  
191e0 4d 75 6c 74 69 70 6c 65 20 62 2d 74 72 65 65 20  Multiple b-tree 
191f0 73 74 72 75 63 74 75 72 65 73 20 61 72 65 20 75  structures are u
19200 73 65 64 20 69 6e 73 74 65 61 64 20 6f 66 20 61  sed instead of a
19210 20 73 69 6e 67 6c 65 20 62 2d 74 72 65 65 20 74   single b-tree t
19220 6f 20 72 65 64 75 63 65 0a 20 20 74 68 65 20 63  o reduce.  the c
19230 6f 73 74 20 6f 66 20 69 6e 73 65 72 74 69 6e 67  ost of inserting
19240 20 72 65 63 6f 72 64 73 20 69 6e 74 6f 20 46 54   records into FT
19250 53 20 74 61 62 6c 65 73 2e 20 57 68 65 6e 20 61  S tables. When a
19260 20 6e 65 77 20 72 65 63 6f 72 64 20 69 73 20 0a   new record is .
19270 20 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20    inserted into 
19280 61 6e 20 46 54 53 20 74 61 62 6c 65 20 74 68 61  an FTS table tha
19290 74 20 61 6c 72 65 61 64 79 20 63 6f 6e 74 61 69  t already contai
192a0 6e 73 20 61 20 6c 6f 74 20 6f 66 20 64 61 74 61  ns a lot of data
192b0 2c 20 69 74 20 69 73 0a 20 20 6c 69 6b 65 6c 79  , it is.  likely
192c0 20 74 68 61 74 20 6d 61 6e 79 20 6f 66 20 74 68   that many of th
192d0 65 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 6e  e terms in the n
192e0 65 77 20 72 65 63 6f 72 64 20 61 72 65 20 61 6c  ew record are al
192f0 72 65 61 64 79 20 70 72 65 73 65 6e 74 20 69 6e  ready present in
19300 0a 20 20 61 20 6c 61 72 67 65 20 6e 75 6d 62 65  .  a large numbe
19310 72 20 6f 66 20 65 78 69 73 74 69 6e 67 20 72 65  r of existing re
19320 63 6f 72 64 73 2e 20 49 66 20 61 20 73 69 6e 67  cords. If a sing
19330 6c 65 20 62 2d 74 72 65 65 20 77 65 72 65 20 75  le b-tree were u
19340 73 65 64 2c 20 74 68 65 6e 0a 20 20 6c 61 72 67  sed, then.  larg
19350 65 20 64 6f 63 6c 69 73 74 20 73 74 72 75 63 74  e doclist struct
19360 75 72 65 73 20 77 6f 75 6c 64 20 68 61 76 65 20  ures would have 
19370 74 6f 20 62 65 20 6c 6f 61 64 65 64 20 66 72 6f  to be loaded fro
19380 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 0a  m the database,.
19390 20 20 61 6d 65 6e 64 65 64 20 74 6f 20 69 6e 63    amended to inc
193a0 6c 75 64 65 20 74 68 65 20 6e 65 77 20 64 6f 63  lude the new doc
193b0 69 64 20 61 6e 64 20 74 65 72 6d 2d 6f 66 66 73  id and term-offs
193c0 65 74 20 6c 69 73 74 2c 20 74 68 65 6e 20 77 72  et list, then wr
193d0 69 74 74 65 6e 20 62 61 63 6b 0a 20 20 74 6f 20  itten back.  to 
193e0 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 55 73  the database. Us
193f0 69 6e 67 20 6d 75 6c 74 69 70 6c 65 20 62 2d 74  ing multiple b-t
19400 72 65 65 20 74 61 62 6c 65 73 20 61 6c 6c 6f 77  ree tables allow
19410 73 20 74 68 69 73 20 74 6f 20 62 65 20 61 76 6f  s this to be avo
19420 69 64 65 64 0a 20 20 62 79 20 63 72 65 61 74 69  ided.  by creati
19430 6e 67 20 61 20 6e 65 77 20 62 2d 74 72 65 65 20  ng a new b-tree 
19440 77 68 69 63 68 20 63 61 6e 20 62 65 20 6d 65 72  which can be mer
19450 67 65 64 20 77 69 74 68 20 74 68 65 20 65 78 69  ged with the exi
19460 73 74 69 6e 67 20 62 2d 74 72 65 65 0a 20 20 28  sting b-tree.  (
19470 6f 72 20 62 2d 74 72 65 65 73 29 20 6c 61 74 65  or b-trees) late
19480 72 20 6f 6e 2e 20 4d 65 72 67 69 6e 67 20 6f 66  r on. Merging of
19490 20 62 2d 74 72 65 65 20 73 74 72 75 63 74 75 72   b-tree structur
194a0 65 73 20 63 61 6e 20 62 65 20 70 65 72 66 6f 72  es can be perfor
194b0 6d 65 64 20 61 73 0a 20 20 61 20 62 61 63 6b 67  med as.  a backg
194c0 72 6f 75 6e 64 20 74 61 73 6b 2c 20 6f 72 20 6f  round task, or o
194d0 6e 63 65 20 61 20 63 65 72 74 61 69 6e 20 6e 75  nce a certain nu
194e0 6d 62 65 72 20 6f 66 20 73 65 70 61 72 61 74 65  mber of separate
194f0 20 62 2d 74 72 65 65 20 73 74 72 75 63 74 75 72   b-tree structur
19500 65 73 0a 20 20 68 61 76 65 20 62 65 65 6e 20 61  es.  have been a
19510 63 63 75 6d 75 6c 61 74 65 64 2e 20 4f 66 20 63  ccumulated. Of c
19520 6f 75 72 73 65 2c 20 74 68 69 73 20 73 63 68 65  ourse, this sche
19530 6d 65 20 6d 61 6b 65 73 20 71 75 65 72 69 65 73  me makes queries
19540 20 6d 6f 72 65 20 65 78 70 65 6e 73 69 76 65 0a   more expensive.
19550 20 20 28 61 73 20 74 68 65 20 46 54 53 20 63 6f    (as the FTS co
19560 64 65 20 6d 61 79 20 68 61 76 65 20 74 6f 20 6c  de may have to l
19570 6f 6f 6b 20 75 70 20 69 6e 64 69 76 69 64 75 61  ook up individua
19580 6c 20 74 65 72 6d 73 20 69 6e 20 6d 6f 72 65 20  l terms in more 
19590 74 68 61 6e 20 6f 6e 65 0a 20 20 62 2d 74 72 65  than one.  b-tre
195a0 65 20 61 6e 64 20 6d 65 72 67 65 20 74 68 65 20  e and merge the 
195b0 72 65 73 75 6c 74 73 29 2c 20 62 75 74 20 69 74  results), but it
195c0 20 68 61 73 20 62 65 65 6e 20 66 6f 75 6e 64 20   has been found 
195d0 74 68 61 74 20 69 6e 20 70 72 61 63 74 69 63 65  that in practice
195e0 20 74 68 69 73 0a 20 20 6f 76 65 72 68 65 61 64   this.  overhead
195f0 20 69 73 20 6f 66 74 65 6e 20 6e 65 67 6c 69 67   is often neglig
19600 69 62 6c 65 2e 0a 20 20 0a 3c 68 32 3e 56 61 72  ible..  .<h2>Var
19610 69 61 62 6c 65 20 4c 65 6e 67 74 68 20 49 6e 74  iable Length Int
19620 65 67 65 72 20 28 76 61 72 69 6e 74 29 20 46 6f  eger (varint) Fo
19630 72 6d 61 74 3c 2f 68 32 3e 0a 0a 3c 70 3e 0a 20  rmat</h2>..<p>. 
19640 20 49 6e 74 65 67 65 72 20 76 61 6c 75 65 73 20   Integer values 
19650 73 74 6f 72 65 64 20 61 73 20 70 61 72 74 20 6f  stored as part o
19660 66 20 73 65 67 6d 65 6e 74 20 62 2d 74 72 65 65  f segment b-tree
19670 20 6e 6f 64 65 73 20 61 72 65 20 65 6e 63 6f 64   nodes are encod
19680 65 64 20 75 73 69 6e 67 20 74 68 65 0a 20 20 46  ed using the.  F
19690 54 53 20 76 61 72 69 6e 74 20 66 6f 72 6d 61 74  TS varint format
196a0 2e 20 54 68 69 73 20 65 6e 63 6f 64 69 6e 67 20  . This encoding 
196b0 69 73 20 73 69 6d 69 6c 61 72 2c 20 62 75 74 20  is similar, but 
196c0 3c 62 3e 6e 6f 74 20 69 64 65 6e 74 69 63 61 6c  <b>not identical
196d0 3c 2f 62 3e 2c 20 74 6f 0a 20 20 74 68 65 20 3c  </b>, to.  the <
196e0 61 20 68 72 65 66 3d 22 66 69 6c 65 66 6f 72 6d  a href="fileform
196f0 61 74 2e 68 74 6d 6c 23 76 61 72 69 6e 74 5f 66  at.html#varint_f
19700 6f 72 6d 61 74 22 3e 53 51 4c 69 74 65 20 76 61  ormat">SQLite va
19710 72 69 6e 74 20 66 6f 72 6d 61 74 3c 2f 61 3e 2e  rint format</a>.
19720 0a 0a 3c 70 3e 0a 20 20 41 6e 20 65 6e 63 6f 64  ..<p>.  An encod
19730 65 64 20 46 54 53 20 76 61 72 69 6e 74 20 63 6f  ed FTS varint co
19740 6e 73 75 6d 65 73 20 62 65 74 77 65 65 6e 20 6f  nsumes between o
19750 6e 65 20 61 6e 64 20 74 65 6e 20 62 79 74 65 73  ne and ten bytes
19760 20 6f 66 20 73 70 61 63 65 2e 20 54 68 65 0a 20   of space. The. 
19770 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
19780 20 72 65 71 75 69 72 65 64 20 69 73 20 64 65 74   required is det
19790 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 73  ermined by the s
197a0 69 67 6e 20 61 6e 64 20 6d 61 67 6e 69 74 75 64  ign and magnitud
197b0 65 20 6f 66 20 74 68 65 0a 20 20 69 6e 74 65 67  e of the.  integ
197c0 65 72 20 76 61 6c 75 65 20 65 6e 63 6f 64 65 64  er value encoded
197d0 2e 20 4d 6f 72 65 20 61 63 63 75 72 61 74 65 6c  . More accuratel
197e0 79 2c 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  y, the number of
197f0 20 62 79 74 65 73 20 75 73 65 64 20 74 6f 20 73   bytes used to s
19800 74 6f 72 65 0a 20 20 74 68 65 20 65 6e 63 6f 64  tore.  the encod
19810 65 64 20 69 6e 74 65 67 65 72 20 64 65 70 65 6e  ed integer depen
19820 64 73 20 6f 6e 20 74 68 65 20 70 6f 73 69 74 69  ds on the positi
19830 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 73  on of the most s
19840 69 67 6e 69 66 69 63 61 6e 74 20 73 65 74 20 62  ignificant set b
19850 69 74 0a 20 20 69 6e 20 74 68 65 20 36 34 2d 62  it.  in the 64-b
19860 69 74 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65  it twos-compleme
19870 6e 74 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  nt representatio
19880 6e 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72  n of the integer
19890 20 76 61 6c 75 65 2e 20 4e 65 67 61 74 69 76 65   value. Negative
198a0 0a 20 20 76 61 6c 75 65 73 20 61 6c 77 61 79 73  .  values always
198b0 20 68 61 76 65 20 74 68 65 20 6d 6f 73 74 20 73   have the most s
198c0 69 67 6e 69 66 69 63 61 6e 74 20 62 69 74 20 73  ignificant bit s
198d0 65 74 20 28 74 68 65 20 73 69 67 6e 20 62 69 74  et (the sign bit
198e0 29 2c 20 61 6e 64 20 73 6f 20 61 72 65 0a 20 20  ), and so are.  
198f0 61 6c 77 61 79 73 20 73 74 6f 72 65 64 20 75 73  always stored us
19900 69 6e 67 20 74 68 65 20 66 75 6c 6c 20 74 65 6e  ing the full ten
19910 20 62 79 74 65 73 2e 20 50 6f 73 69 74 69 76 65   bytes. Positive
19920 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 73 20   integer values 
19930 6d 61 79 20 62 65 0a 20 20 73 74 6f 72 65 64 20  may be.  stored 
19940 75 73 69 6e 67 20 6c 65 73 73 20 73 70 61 63 65  using less space
19950 2e 0a 0a 3c 70 3e 0a 20 20 54 68 65 20 66 69 6e  ...<p>.  The fin
19960 61 6c 20 62 79 74 65 20 6f 66 20 61 6e 20 65 6e  al byte of an en
19970 63 6f 64 65 64 20 46 54 53 20 76 61 72 69 6e 74  coded FTS varint
19980 20 68 61 73 20 69 74 73 20 6d 6f 73 74 20 73 69   has its most si
19990 67 6e 69 66 69 63 61 6e 74 20 62 69 74 20 0a 20  gnificant bit . 
199a0 20 63 6c 65 61 72 65 64 2e 20 41 6c 6c 20 70 72   cleared. All pr
199b0 65 63 65 64 69 6e 67 20 62 79 74 65 73 20 68 61  eceding bytes ha
199c0 76 65 20 74 68 65 20 6d 6f 73 74 20 73 69 67 6e  ve the most sign
199d0 69 66 69 63 61 6e 74 20 62 69 74 20 73 65 74 2e  ificant bit set.
199e0 20 44 61 74 61 0a 20 20 69 73 20 73 74 6f 72 65   Data.  is store
199f0 64 20 69 6e 20 74 68 65 20 72 65 6d 61 69 6e 69  d in the remaini
19a00 6e 67 20 73 65 76 65 6e 20 6c 65 61 73 74 20 73  ng seven least s
19a10 69 67 6e 69 66 69 63 61 6e 74 20 62 69 74 73 20  ignificant bits 
19a20 6f 66 20 65 61 63 68 20 62 79 74 65 2e 0a 20 20  of each byte..  
19a30 54 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f  The first byte o
19a40 66 20 74 68 65 20 65 6e 63 6f 64 65 64 20 72 65  f the encoded re
19a50 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 63 6f 6e  presentation con
19a60 74 61 69 6e 73 20 74 68 65 20 6c 65 61 73 74 20  tains the least 
19a70 73 69 67 6e 69 66 69 63 61 6e 74 0a 20 20 73 65  significant.  se
19a80 76 65 6e 20 62 69 74 73 20 6f 66 20 74 68 65 20  ven bits of the 
19a90 65 6e 63 6f 64 65 64 20 69 6e 74 65 67 65 72 20  encoded integer 
19aa0 76 61 6c 75 65 2e 20 54 68 65 20 73 65 63 6f 6e  value. The secon
19ab0 64 20 62 79 74 65 20 6f 66 20 74 68 65 20 65 6e  d byte of the en
19ac0 63 6f 64 65 64 0a 20 20 72 65 70 72 65 73 65 6e  coded.  represen
19ad0 74 61 74 69 6f 6e 2c 20 69 66 20 69 74 20 69 73  tation, if it is
19ae0 20 70 72 65 73 65 6e 74 2c 20 63 6f 6e 74 61 69   present, contai
19af0 6e 73 20 74 68 65 20 73 65 76 65 6e 20 6e 65 78  ns the seven nex
19b00 74 20 6c 65 61 73 74 20 73 69 67 6e 69 66 69 63  t least signific
19b10 61 6e 74 0a 20 20 62 69 74 73 20 6f 66 20 74 68  ant.  bits of th
19b20 65 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 2c  e integer value,
19b30 20 61 6e 64 20 73 6f 20 6f 6e 2e 20 54 68 65 20   and so on. The 
19b40 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65 20  following table 
19b50 63 6f 6e 74 61 69 6e 73 20 65 78 61 6d 70 6c 65  contains example
19b60 73 0a 20 20 6f 66 20 65 6e 63 6f 64 65 64 20 69  s.  of encoded i
19b70 6e 74 65 67 65 72 20 76 61 6c 75 65 73 3a 0a 0a  nteger values:..
19b80 3c 74 61 62 6c 65 20 73 74 72 69 70 65 64 3d 31  <table striped=1
19b90 3e 0a 20 20 3c 74 72 3e 3c 74 68 3e 44 65 63 69  >.  <tr><th>Deci
19ba0 6d 61 6c 3c 74 68 3e 48 65 78 61 64 65 63 69 6d  mal<th>Hexadecim
19bb0 61 6c 3c 74 68 20 77 69 64 74 68 3d 31 30 30 25  al<th width=100%
19bc0 3e 45 6e 63 6f 64 65 64 20 52 65 70 72 65 73 65  >Encoded Represe
19bd0 6e 74 61 74 69 6f 6e 0a 20 20 3c 74 72 3e 3c 74  ntation.  <tr><t
19be0 64 3e 34 33 3c 74 64 3e 30 78 30 30 30 30 30 30  d>43<td>0x000000
19bf0 30 30 30 30 30 30 30 30 32 42 3c 74 64 3e 30 78  000000002B<td>0x
19c00 32 42 20 0a 20 20 3c 74 72 3e 3c 74 64 3e 32 30  2B .  <tr><td>20
19c10 30 38 31 35 3c 74 64 3e 30 78 30 30 30 30 30 30  0815<td>0x000000
19c20 30 30 30 30 30 33 31 30 36 46 3c 74 64 3e 30 78  000003106F<td>0x
19c30 39 43 20 30 78 41 30 20 30 78 30 43 0a 20 20 3c  9C 0xA0 0x0C.  <
19c40 74 72 3e 3c 74 64 3e 2d 31 3c 74 64 3e 30 78 46  tr><td>-1<td>0xF
19c50 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 3c  FFFFFFFFFFFFFFF<
19c60 74 64 3e 30 78 46 46 20 30 78 46 46 20 30 78 46  td>0xFF 0xFF 0xF
19c70 46 20 30 78 46 46 20 30 78 46 46 20 30 78 46 46  F 0xFF 0xFF 0xFF
19c80 20 30 78 46 46 20 30 78 46 46 20 30 78 46 46 20   0xFF 0xFF 0xFF 
19c90 30 78 30 31 0a 3c 2f 74 61 62 6c 65 3e 0a 20 20  0x01.</table>.  
19ca0 0a 0a 3c 68 32 3e 53 65 67 6d 65 6e 74 20 42 2d  ..<h2>Segment B-
19cb0 54 72 65 65 20 46 6f 72 6d 61 74 3c 2f 68 32 3e  Tree Format</h2>
19cc0 0a 0a 3c 70 3e 0a 20 20 53 65 67 6d 65 6e 74 20  ..<p>.  Segment 
19cd0 62 2d 74 72 65 65 73 20 61 72 65 20 70 72 65 66  b-trees are pref
19ce0 69 78 2d 63 6f 6d 70 72 65 73 73 65 64 20 62 2b  ix-compressed b+
19cf0 2d 74 72 65 65 73 2e 20 54 68 65 72 65 20 69 73  -trees. There is
19d00 20 6f 6e 65 20 73 65 67 6d 65 6e 74 20 62 2d 74   one segment b-t
19d10 72 65 65 0a 20 20 66 6f 72 20 65 61 63 68 20 72  ree.  for each r
19d20 6f 77 20 69 6e 20 74 68 65 20 25 5f 73 65 67 64  ow in the %_segd
19d30 69 72 20 74 61 62 6c 65 20 28 73 65 65 20 61 62  ir table (see ab
19d40 6f 76 65 29 2e 20 54 68 65 20 72 6f 6f 74 20 6e  ove). The root n
19d50 6f 64 65 20 6f 66 20 74 68 65 20 73 65 67 6d 65  ode of the segme
19d60 6e 74 0a 20 20 62 2d 74 72 65 65 20 69 73 20 73  nt.  b-tree is s
19d70 74 6f 72 65 64 20 61 73 20 61 20 62 6c 6f 62 20  tored as a blob 
19d80 69 6e 20 74 68 65 20 22 72 6f 6f 74 22 20 66 69  in the "root" fi
19d90 65 6c 64 20 6f 66 20 74 68 65 20 63 6f 72 72 65  eld of the corre
19da0 73 70 6f 6e 64 69 6e 67 20 72 6f 77 0a 20 20 6f  sponding row.  o
19db0 66 20 74 68 65 20 25 5f 73 65 67 64 69 72 20 74  f the %_segdir t
19dc0 61 62 6c 65 2e 20 41 6c 6c 20 6f 74 68 65 72 20  able. All other 
19dd0 6e 6f 64 65 73 20 28 69 66 20 61 6e 79 20 65 78  nodes (if any ex
19de0 69 73 74 29 20 61 72 65 20 73 74 6f 72 65 64 20  ist) are stored 
19df0 69 6e 20 74 68 65 20 0a 20 20 22 62 6c 6f 62 22  in the .  "blob"
19e00 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 25   column of the %
19e10 5f 73 65 67 6d 65 6e 74 73 20 74 61 62 6c 65 2e  _segments table.
19e20 20 4e 6f 64 65 73 20 77 69 74 68 69 6e 20 74 68   Nodes within th
19e30 65 20 25 5f 73 65 67 6d 65 6e 74 73 20 74 61 62  e %_segments tab
19e40 6c 65 20 61 72 65 0a 20 20 69 64 65 6e 74 69 66  le are.  identif
19e50 69 65 64 20 62 79 20 74 68 65 20 69 6e 74 65 67  ied by the integ
19e60 65 72 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20  er value in the 
19e70 62 6c 6f 63 6b 69 64 20 66 69 65 6c 64 20 6f 66  blockid field of
19e80 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
19e90 6e 67 0a 20 20 72 6f 77 2e 20 54 68 65 20 66 6f  ng.  row. The fo
19ea0 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65 20 64 65  llowing table de
19eb0 73 63 72 69 62 65 73 20 74 68 65 20 66 69 65 6c  scribes the fiel
19ec0 64 73 20 6f 66 20 74 68 65 20 25 5f 73 65 67 64  ds of the %_segd
19ed0 69 72 20 74 61 62 6c 65 3a 0a 0a 3c 74 61 62 6c  ir table:..<tabl
19ee0 65 20 73 74 72 69 70 65 64 3d 31 3e 0a 20 20 3c  e striped=1>.  <
19ef0 74 72 3e 3c 74 68 3e 43 6f 6c 75 6d 6e 20 20 20  tr><th>Column   
19f00 20 20 20 20 20 20 20 20 3c 74 68 20 77 69 64 74          <th widt
19f10 68 3d 31 30 30 25 3e 49 6e 74 65 72 70 72 65 74  h=100%>Interpret
19f20 61 74 69 6f 6e 0a 20 20 3c 74 72 3e 3c 74 64 3e  ation.  <tr><td>
19f30 6c 65 76 65 6c 20 20 20 20 20 20 20 20 20 20 20  level           
19f40 20 3c 74 64 3e 20 0a 20 20 20 20 42 65 74 77 65   <td> .    Betwe
19f50 65 6e 20 74 68 65 6d 2c 20 74 68 65 20 63 6f 6e  en them, the con
19f60 74 65 6e 74 73 20 6f 66 20 74 68 65 20 22 6c 65  tents of the "le
19f70 76 65 6c 22 20 61 6e 64 20 22 69 64 78 22 20 66  vel" and "idx" f
19f80 69 65 6c 64 73 20 64 65 66 69 6e 65 20 74 68 65  ields define the
19f90 0a 20 20 20 20 72 65 6c 61 74 69 76 65 20 61 67  .    relative ag
19fa0 65 20 6f 66 20 74 68 65 20 73 65 67 6d 65 6e 74  e of the segment
19fb0 20 62 2d 74 72 65 65 2e 20 54 68 65 20 73 6d 61   b-tree. The sma
19fc0 6c 6c 65 72 20 74 68 65 20 76 61 6c 75 65 20 73  ller the value s
19fd0 74 6f 72 65 64 20 69 6e 20 74 68 65 0a 20 20 20  tored in the.   
19fe0 20 22 6c 65 76 65 6c 22 20 66 69 65 6c 64 2c 20   "level" field, 
19ff0 74 68 65 20 6d 6f 72 65 20 72 65 63 65 6e 74 6c  the more recentl
1a000 79 20 74 68 65 20 73 65 67 6d 65 6e 74 20 62 2d  y the segment b-
1a010 74 72 65 65 20 77 61 73 20 63 72 65 61 74 65 64  tree was created
1a020 2e 20 49 66 20 74 77 6f 0a 20 20 20 20 73 65 67  . If two.    seg
1a030 6d 65 6e 74 20 62 2d 74 72 65 65 73 20 61 72 65  ment b-trees are
1a040 20 6f 66 20 74 68 65 20 73 61 6d 65 20 22 6c 65   of the same "le
1a050 76 65 6c 22 2c 20 74 68 65 20 73 65 67 6d 65 6e  vel", the segmen
1a060 74 20 77 69 74 68 20 74 68 65 20 6c 61 72 67 65  t with the large
1a070 72 0a 20 20 20 20 76 61 6c 75 65 20 73 74 6f 72  r.    value stor
1a080 65 64 20 69 6e 20 74 68 65 20 22 69 64 78 22 20  ed in the "idx" 
1a090 63 6f 6c 75 6d 6e 20 69 73 20 6d 6f 72 65 20 72  column is more r
1a0a0 65 63 65 6e 74 2e 20 54 68 65 20 50 52 49 4d 41  ecent. The PRIMA
1a0b0 52 59 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e  RY KEY constrain
1a0c0 74 0a 20 20 20 20 6f 6e 20 74 68 65 20 25 5f 73  t.    on the %_s
1a0d0 65 67 64 69 72 20 74 61 62 6c 65 20 70 72 65 76  egdir table prev
1a0e0 65 6e 74 73 20 61 6e 79 20 74 77 6f 20 73 65 67  ents any two seg
1a0f0 6d 65 6e 74 73 20 66 72 6f 6d 20 68 61 76 69 6e  ments from havin
1a100 67 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75 65  g the same value
1a110 0a 20 20 20 20 66 6f 72 20 62 6f 74 68 20 74 68  .    for both th
1a120 65 20 22 6c 65 76 65 6c 22 20 61 6e 64 20 22 69  e "level" and "i
1a130 64 78 22 20 66 69 65 6c 64 73 2e 0a 20 20 3c 74  dx" fields..  <t
1a140 72 3e 3c 74 64 3e 69 64 78 20 20 20 20 20 20 20  r><td>idx       
1a150 20 20 20 20 20 20 20 3c 74 64 3e 20 53 65 65 20         <td> See 
1a160 61 62 6f 76 65 2e 0a 20 20 3c 74 72 3e 3c 74 64  above..  <tr><td
1a170 3e 73 74 61 72 74 5f 62 6c 6f 63 6b 20 20 20 20  >start_block    
1a180 20 20 3c 74 64 3e 0a 20 20 20 20 54 68 65 20 62    <td>.    The b
1a190 6c 6f 63 6b 69 64 20 74 68 61 74 20 63 6f 72 72  lockid that corr
1a1a0 65 73 70 6f 6e 64 73 20 74 6f 20 74 68 65 20 6e  esponds to the n
1a1b0 6f 64 65 20 77 69 74 68 20 74 68 65 20 73 6d 61  ode with the sma
1a1c0 6c 6c 65 73 74 20 62 6c 6f 63 6b 69 64 20 74 68  llest blockid th
1a1d0 61 74 20 0a 20 20 20 20 62 65 6c 6f 6e 67 73 20  at .    belongs 
1a1e0 74 6f 20 74 68 69 73 20 73 65 67 6d 65 6e 74 20  to this segment 
1a1f0 62 2d 74 72 65 65 2e 20 4f 72 20 7a 65 72 6f 20  b-tree. Or zero 
1a200 69 66 20 74 68 65 20 65 6e 74 69 72 65 20 73 65  if the entire se
1a210 67 6d 65 6e 74 20 62 2d 74 72 65 65 0a 20 20 20  gment b-tree.   
1a220 20 66 69 74 73 20 6f 6e 20 74 68 65 20 72 6f 6f   fits on the roo
1a230 74 20 6e 6f 64 65 2e 20 49 66 20 69 74 20 65 78  t node. If it ex
1a240 69 73 74 73 2c 20 74 68 69 73 20 6e 6f 64 65 20  ists, this node 
1a250 69 73 20 61 6c 77 61 79 73 20 61 20 6c 65 61 66  is always a leaf
1a260 20 6e 6f 64 65 2e 0a 20 20 3c 74 72 3e 3c 74 64   node..  <tr><td
1a270 3e 6c 65 61 76 65 73 5f 65 6e 64 5f 62 6c 6f 63  >leaves_end_bloc
1a280 6b 20 3c 74 64 3e 0a 20 20 20 20 54 68 65 20 62  k <td>.    The b
1a290 6c 6f 63 6b 69 64 20 74 68 61 74 20 63 6f 72 72  lockid that corr
1a2a0 65 73 70 6f 6e 64 73 20 74 6f 20 74 68 65 20 6c  esponds to the l
1a2b0 65 61 66 20 6e 6f 64 65 20 77 69 74 68 20 74 68  eaf node with th
1a2c0 65 20 6c 61 72 67 65 73 74 20 62 6c 6f 63 6b 69  e largest blocki
1a2d0 64 20 0a 20 20 20 20 74 68 61 74 20 62 65 6c 6f  d .    that belo
1a2e0 6e 67 73 20 74 6f 20 74 68 69 73 20 73 65 67 6d  ngs to this segm
1a2f0 65 6e 74 20 62 2d 74 72 65 65 2e 20 4f 72 20 7a  ent b-tree. Or z
1a300 65 72 6f 20 69 66 20 74 68 65 20 65 6e 74 69 72  ero if the entir
1a310 65 20 73 65 67 6d 65 6e 74 20 62 2d 74 72 65 65  e segment b-tree
1a320 0a 20 20 20 20 66 69 74 73 20 6f 6e 20 74 68 65  .    fits on the
1a330 20 72 6f 6f 74 20 6e 6f 64 65 2e 0a 20 20 3c 74   root node..  <t
1a340 72 3e 3c 74 64 3e 65 6e 64 5f 62 6c 6f 63 6b 20  r><td>end_block 
1a350 3c 74 64 3e 0a 20 20 20 20 54 68 65 20 62 6c 6f  <td>.    The blo
1a360 63 6b 69 64 20 74 68 61 74 20 63 6f 72 72 65 73  ckid that corres
1a370 70 6f 6e 64 73 20 74 6f 20 74 68 65 20 69 6e 74  ponds to the int
1a380 65 72 69 6f 72 20 6e 6f 64 65 20 77 69 74 68 20  erior node with 
1a390 74 68 65 20 6c 61 72 67 65 73 74 20 0a 20 20 20  the largest .   
1a3a0 20 62 6c 6f 63 6b 69 64 20 74 68 61 74 20 62 65   blockid that be
1a3b0 6c 6f 6e 67 73 20 74 6f 20 74 68 69 73 20 73 65  longs to this se
1a3c0 67 6d 65 6e 74 20 62 2d 74 72 65 65 2e 20 20 4f  gment b-tree.  O
1a3d0 72 20 7a 65 72 6f 20 69 66 20 74 68 65 20 65 6e  r zero if the en
1a3e0 74 69 72 65 20 73 65 67 6d 65 6e 74 0a 20 20 20  tire segment.   
1a3f0 20 62 2d 74 72 65 65 20 66 69 74 73 20 6f 6e 20   b-tree fits on 
1a400 74 68 65 20 72 6f 6f 74 20 6e 6f 64 65 2e 20 49  the root node. I
1a410 66 20 69 74 20 65 78 69 73 74 73 2c 20 74 68 69  f it exists, thi
1a420 73 20 6e 6f 64 65 20 69 73 20 61 6c 77 61 79 73  s node is always
1a430 20 61 6e 0a 20 20 20 20 69 6e 74 65 72 69 6f 72   an.    interior
1a440 20 6e 6f 64 65 2e 0a 20 20 3c 74 72 3e 3c 74 64   node..  <tr><td
1a450 3e 72 6f 6f 74 20 20 20 20 20 20 20 20 20 20 20  >root           
1a460 20 20 3c 74 64 3e 0a 20 20 20 20 42 6c 6f 62 20    <td>.    Blob 
1a470 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 72  containing the r
1a480 6f 6f 74 20 6e 6f 64 65 20 6f 66 20 74 68 65 20  oot node of the 
1a490 73 65 67 6d 65 6e 74 20 62 2d 74 72 65 65 2e 0a  segment b-tree..
1a4a0 3c 2f 74 61 62 6c 65 3e 0a 0a 3c 70 3e 0a 20 20  </table>..<p>.  
1a4b0 41 70 61 72 74 20 66 72 6f 6d 20 74 68 65 20 72  Apart from the r
1a4c0 6f 6f 74 20 6e 6f 64 65 2c 20 74 68 65 20 6e 6f  oot node, the no
1a4d0 64 65 73 20 74 68 61 74 20 6d 61 6b 65 20 75 70  des that make up
1a4e0 20 61 20 73 69 6e 67 6c 65 20 73 65 67 6d 65 6e   a single segmen
1a4f0 74 20 62 2d 74 72 65 65 20 61 72 65 0a 20 20 61  t b-tree are.  a
1a500 6c 77 61 79 73 20 73 74 6f 72 65 64 20 75 73 69  lways stored usi
1a510 6e 67 20 61 20 63 6f 6e 74 69 67 75 6f 75 73 20  ng a contiguous 
1a520 73 65 71 75 65 6e 63 65 20 6f 66 20 62 6c 6f 63  sequence of bloc
1a530 6b 69 64 73 2e 20 46 75 72 74 68 65 72 6d 6f 72  kids. Furthermor
1a540 65 2c 20 74 68 65 0a 20 20 6e 6f 64 65 73 20 74  e, the.  nodes t
1a550 68 61 74 20 6d 61 6b 65 20 75 70 20 61 20 73 69  hat make up a si
1a560 6e 67 6c 65 20 6c 65 76 65 6c 20 6f 66 20 74 68  ngle level of th
1a570 65 20 62 2d 74 72 65 65 20 61 72 65 20 74 68 65  e b-tree are the
1a580 6d 73 65 6c 76 65 73 20 73 74 6f 72 65 64 20 61  mselves stored a
1a590 73 0a 20 20 61 20 63 6f 6e 74 69 67 75 6f 75 73  s.  a contiguous
1a5a0 20 62 6c 6f 63 6b 2c 20 69 6e 20 62 2d 74 72 65   block, in b-tre
1a5b0 65 20 6f 72 64 65 72 2e 20 54 68 65 20 63 6f 6e  e order. The con
1a5c0 74 69 67 75 6f 75 73 20 73 65 71 75 65 6e 63 65  tiguous sequence
1a5d0 20 6f 66 20 62 6c 6f 63 6b 69 64 73 0a 20 20 75   of blockids.  u
1a5e0 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65  sed to store the
1a5f0 20 62 2d 74 72 65 65 20 6c 65 61 76 65 73 20 61   b-tree leaves a
1a600 72 65 20 61 6c 6c 6f 63 61 74 65 64 20 73 74 61  re allocated sta
1a610 72 74 69 6e 67 20 77 69 74 68 20 74 68 65 20 62  rting with the b
1a620 6c 6f 63 6b 69 64 0a 20 20 76 61 6c 75 65 20 73  lockid.  value s
1a630 74 6f 72 65 64 20 69 6e 20 74 68 65 20 22 73 74  tored in the "st
1a640 61 72 74 5f 62 6c 6f 63 6b 22 20 63 6f 6c 75 6d  art_block" colum
1a650 6e 20 6f 66 20 74 68 65 20 63 6f 72 72 65 73 70  n of the corresp
1a660 6f 6e 64 69 6e 67 20 25 5f 73 65 67 64 69 72 20  onding %_segdir 
1a670 72 6f 77 2c 0a 20 20 61 6e 64 20 66 69 6e 69 73  row,.  and finis
1a680 68 69 6e 67 20 61 74 20 74 68 65 20 62 6c 6f 63  hing at the bloc
1a690 6b 69 64 20 76 61 6c 75 65 20 73 74 6f 72 65 64  kid value stored
1a6a0 20 69 6e 20 74 68 65 20 22 6c 65 61 76 65 73 5f   in the "leaves_
1a6b0 65 6e 64 5f 62 6c 6f 63 6b 22 0a 20 20 66 69 65  end_block".  fie
1a6c0 6c 64 20 6f 66 20 74 68 65 20 73 61 6d 65 20 72  ld of the same r
1a6d0 6f 77 2e 20 49 74 20 69 73 20 74 68 65 72 65 66  ow. It is theref
1a6e0 6f 72 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  ore possible to 
1a6f0 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  iterate through 
1a700 61 6c 6c 20 74 68 65 0a 20 20 6c 65 61 76 65 73  all the.  leaves
1a710 20 6f 66 20 61 20 73 65 67 6d 65 6e 74 20 62 2d   of a segment b-
1a720 74 72 65 65 2c 20 69 6e 20 6b 65 79 20 6f 72 64  tree, in key ord
1a730 65 72 2c 20 62 79 20 74 72 61 76 65 72 73 69 6e  er, by traversin
1a740 67 20 74 68 65 20 25 5f 73 65 67 6d 65 6e 74 73  g the %_segments
1a750 20 0a 20 20 74 61 62 6c 65 20 69 6e 20 62 6c 6f   .  table in blo
1a760 63 6b 69 64 20 6f 72 64 65 72 20 66 72 6f 6d 20  ckid order from 
1a770 22 73 74 61 72 74 5f 62 6c 6f 63 6b 22 20 74 6f  "start_block" to
1a780 20 22 6c 65 61 76 65 73 5f 65 6e 64 5f 62 6c 6f   "leaves_end_blo
1a790 63 6b 22 2e 20 20 0a 0a 3c 68 33 3e 53 65 67 6d  ck".  ..<h3>Segm
1a7a0 65 6e 74 20 42 2d 54 72 65 65 20 4c 65 61 66 20  ent B-Tree Leaf 
1a7b0 4e 6f 64 65 73 3c 2f 68 33 3e 0a 0a 3c 70 3e 0a  Nodes</h3>..<p>.
1a7c0 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
1a7d0 64 69 61 67 72 61 6d 20 64 65 70 69 63 74 73 20  diagram depicts 
1a7e0 74 68 65 20 66 6f 72 6d 61 74 20 6f 66 20 61 20  the format of a 
1a7f0 73 65 67 6d 65 6e 74 20 62 2d 74 72 65 65 20 6c  segment b-tree l
1a800 65 61 66 20 6e 6f 64 65 2e 0a 0a 3c 63 65 6e 74  eaf node...<cent
1a810 65 72 3e 0a 20 20 3c 69 6d 67 20 73 72 63 3d 69  er>.  <img src=i
1a820 6d 61 67 65 73 2f 66 74 73 33 5f 6c 65 61 66 5f  mages/fts3_leaf_
1a830 6e 6f 64 65 2e 70 6e 67 3e 0a 20 20 3c 70 3e 20  node.png>.  <p> 
1a840 53 65 67 6d 65 6e 74 20 42 2d 54 72 65 65 20 4c  Segment B-Tree L
1a850 65 61 66 20 4e 6f 64 65 20 46 6f 72 6d 61 74 0a  eaf Node Format.
1a860 3c 2f 63 65 6e 74 65 72 3e 0a 0a 3c 70 3e 0a 20  </center>..<p>. 
1a870 20 54 68 65 20 66 69 72 73 74 20 74 65 72 6d 20   The first term 
1a880 73 74 6f 72 65 64 20 6f 6e 20 65 61 63 68 20 6e  stored on each n
1a890 6f 64 65 20 28 22 54 65 72 6d 20 31 22 20 69 6e  ode ("Term 1" in
1a8a0 20 74 68 65 20 66 69 67 75 72 65 20 61 62 6f 76   the figure abov
1a8b0 65 29 20 69 73 0a 20 20 73 74 6f 72 65 64 20 76  e) is.  stored v
1a8c0 65 72 62 61 74 69 6d 2e 20 45 61 63 68 20 73 75  erbatim. Each su
1a8d0 62 73 65 71 75 65 6e 74 20 74 65 72 6d 20 69 73  bsequent term is
1a8e0 20 70 72 65 66 69 78 2d 63 6f 6d 70 72 65 73 73   prefix-compress
1a8f0 65 64 20 77 69 74 68 20 72 65 73 70 65 63 74 0a  ed with respect.
1a900 20 20 74 6f 20 69 74 73 20 70 72 65 64 65 63 65    to its predece
1a910 73 73 6f 72 2e 20 54 65 72 6d 73 20 61 72 65 20  ssor. Terms are 
1a920 73 74 6f 72 65 64 20 77 69 74 68 69 6e 20 61 20  stored within a 
1a930 70 61 67 65 20 69 6e 20 73 6f 72 74 65 64 20 28  page in sorted (
1a940 6d 65 6d 63 6d 70 29 0a 20 20 6f 72 64 65 72 2e  memcmp).  order.
1a950 0a 0a 3c 68 33 3e 53 65 67 6d 65 6e 74 20 42 2d  ..<h3>Segment B-
1a960 54 72 65 65 20 49 6e 74 65 72 69 6f 72 20 4e 6f  Tree Interior No
1a970 64 65 73 3c 2f 68 33 3e 0a 0a 3c 70 3e 0a 20 20  des</h3>..<p>.  
1a980 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 64 69  The following di
1a990 61 67 72 61 6d 20 64 65 70 69 63 74 73 20 74 68  agram depicts th
1a9a0 65 20 66 6f 72 6d 61 74 20 6f 66 20 61 20 73 65  e format of a se
1a9b0 67 6d 65 6e 74 20 62 2d 74 72 65 65 20 69 6e 74  gment b-tree int
1a9c0 65 72 69 6f 72 20 0a 20 20 28 6e 6f 6e 2d 6c 65  erior .  (non-le
1a9d0 61 66 29 20 6e 6f 64 65 2e 0a 0a 3c 63 65 6e 74  af) node...<cent
1a9e0 65 72 3e 0a 20 20 3c 69 6d 67 20 73 72 63 3d 69  er>.  <img src=i
1a9f0 6d 61 67 65 73 2f 66 74 73 33 5f 69 6e 74 65 72  mages/fts3_inter
1aa00 69 6f 72 5f 6e 6f 64 65 2e 70 6e 67 3e 0a 20 20  ior_node.png>.  
1aa10 3c 70 3e 20 53 65 67 6d 65 6e 74 20 42 2d 54 72  <p> Segment B-Tr
1aa20 65 65 20 49 6e 74 65 72 69 6f 72 20 4e 6f 64 65  ee Interior Node
1aa30 20 46 6f 72 6d 61 74 0a 3c 2f 63 65 6e 74 65 72   Format.</center
1aa40 3e 0a 0a 0a 3c 68 32 3e 44 6f 63 6c 69 73 74 20  >...<h2>Doclist 
1aa50 46 6f 72 6d 61 74 3c 2f 68 32 3e 0a 0a 3c 70 3e  Format</h2>..<p>
1aa60 0a 20 20 41 20 64 6f 63 6c 69 73 74 20 63 6f 6e  .  A doclist con
1aa70 73 69 73 74 73 20 6f 66 20 61 6e 20 61 72 72 61  sists of an arra
1aa80 79 20 6f 66 20 36 34 2d 62 69 74 20 73 69 67 6e  y of 64-bit sign
1aa90 65 64 20 69 6e 74 65 67 65 72 73 2c 20 73 65 72  ed integers, ser
1aaa0 69 61 6c 69 7a 65 64 20 75 73 69 6e 67 0a 20 20  ialized using.  
1aab0 74 68 65 20 46 54 53 20 76 61 72 69 6e 74 20 66  the FTS varint f
1aac0 6f 72 6d 61 74 2e 20 45 61 63 68 20 64 6f 63 6c  ormat. Each docl
1aad0 69 73 74 20 65 6e 74 72 79 20 69 73 20 6d 61 64  ist entry is mad
1aae0 65 20 75 70 20 6f 66 20 61 20 73 65 72 69 65 73  e up of a series
1aaf0 20 6f 66 20 74 77 6f 20 0a 20 20 6f 72 20 6d 6f   of two .  or mo
1ab00 72 65 20 69 6e 74 65 67 65 72 73 2c 20 61 73 20  re integers, as 
1ab10 66 6f 6c 6c 6f 77 73 3a 0a 0a 3c 6f 6c 3e 0a 20  follows:..<ol>. 
1ab20 20 3c 6c 69 3e 20 54 68 65 20 64 6f 63 69 64 20   <li> The docid 
1ab30 76 61 6c 75 65 2e 20 54 68 65 20 66 69 72 73 74  value. The first
1ab40 20 65 6e 74 72 79 20 69 6e 20 61 20 64 6f 63 6c   entry in a docl
1ab50 69 73 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  ist contains the
1ab60 20 6c 69 74 65 72 61 6c 20 64 6f 63 69 64 0a 20   literal docid. 
1ab70 20 20 20 20 20 20 76 61 6c 75 65 2e 20 54 68 65        value. The
1ab80 20 66 69 72 73 74 20 66 69 65 6c 64 20 6f 66 20   first field of 
1ab90 65 61 63 68 20 73 75 62 73 65 71 75 65 6e 74 20  each subsequent 
1aba0 64 6f 63 6c 69 73 74 20 65 6e 74 72 79 20 63 6f  doclist entry co
1abb0 6e 74 61 69 6e 73 20 74 68 65 20 0a 20 20 20 20  ntains the .    
1abc0 20 20 20 64 69 66 66 65 72 65 6e 63 65 20 62 65     difference be
1abd0 74 77 65 65 6e 20 74 68 65 20 6e 65 77 20 64 6f  tween the new do
1abe0 63 69 64 20 61 6e 64 20 74 68 65 20 70 72 65 76  cid and the prev
1abf0 69 6f 75 73 20 6f 6e 65 20 28 61 6c 77 61 79 73  ious one (always
1ac00 20 61 20 70 6f 73 69 74 69 76 65 20 0a 20 20 20   a positive .   
1ac10 20 20 20 20 6e 75 6d 62 65 72 29 2e 0a 20 20 3c      number)..  <
1ac20 6c 69 3e 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65  li> Zero or more
1ac30 20 74 65 72 6d 2d 6f 66 66 73 65 74 20 6c 69 73   term-offset lis
1ac40 74 73 2e 20 41 20 74 65 72 6d 2d 6f 66 66 73 65  ts. A term-offse
1ac50 74 20 6c 69 73 74 20 69 73 20 70 72 65 73 65 6e  t list is presen
1ac60 74 20 66 6f 72 20 65 61 63 68 0a 20 20 20 20 20  t for each.     
1ac70 20 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20    column of the 
1ac80 46 54 53 20 76 69 72 74 75 61 6c 20 74 61 62 6c  FTS virtual tabl
1ac90 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
1aca0 74 68 65 20 74 65 72 6d 2e 20 41 20 74 65 72 6d  the term. A term
1acb0 2d 6f 66 66 73 65 74 0a 20 20 20 20 20 20 20 6c  -offset.       l
1acc0 69 73 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  ist consists of 
1acd0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20  the following:. 
1ace0 20 20 20 20 3c 6f 6c 3e 0a 20 20 20 20 20 20 20      <ol>.       
1acf0 3c 6c 69 3e 20 43 6f 6e 73 74 61 6e 74 20 76 61  <li> Constant va
1ad00 6c 75 65 20 31 2e 20 54 68 69 73 20 66 69 65 6c  lue 1. This fiel
1ad10 64 20 69 73 20 6f 6d 69 74 74 65 64 20 66 6f 72  d is omitted for
1ad20 20 61 6e 79 20 74 65 72 6d 2d 6f 66 66 73 65 74   any term-offset
1ad30 20 6c 69 73 74 0a 20 20 20 20 20 20 20 20 20 20   list.          
1ad40 20 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74    associated wit
1ad50 68 20 63 6f 6c 75 6d 6e 20 30 2e 0a 20 20 20 20  h column 0..    
1ad60 20 20 20 3c 6c 69 3e 20 54 68 65 20 63 6f 6c 75     <li> The colu
1ad70 6d 6e 20 6e 75 6d 62 65 72 20 28 31 20 66 6f 72  mn number (1 for
1ad80 20 74 68 65 20 73 65 63 6f 6e 64 20 6c 65 66 74   the second left
1ad90 6d 6f 73 74 20 63 6f 6c 75 6d 6e 2c 20 65 74 63  most column, etc
1ada0 2e 29 2e 20 54 68 69 73 0a 20 20 20 20 20 20 20  .). This.       
1adb0 20 20 20 20 20 66 69 65 6c 64 20 69 73 20 6f 6d       field is om
1adc0 69 74 74 65 64 20 66 6f 72 20 61 6e 79 20 74 65  itted for any te
1add0 72 6d 2d 6f 66 66 73 65 74 20 6c 69 73 74 20 61  rm-offset list a
1ade0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 63  ssociated with c
1adf0 6f 6c 75 6d 6e 20 30 2e 0a 20 20 20 20 20 20 20  olumn 0..       
1ae00 3c 6c 69 3e 20 41 20 6c 69 73 74 20 6f 66 20 74  <li> A list of t
1ae10 65 72 6d 2d 6f 66 66 73 65 74 73 2c 20 73 6f 72  erm-offsets, sor
1ae20 74 65 64 20 66 72 6f 6d 20 73 6d 61 6c 6c 65 73  ted from smalles
1ae30 74 20 74 6f 20 6c 61 72 67 65 73 74 2e 20 49 6e  t to largest. In
1ae40 73 74 65 61 64 0a 20 20 20 20 20 20 20 20 20 20  stead.          
1ae50 20 20 6f 66 20 73 74 6f 72 69 6e 67 20 74 68 65    of storing the
1ae60 20 74 65 72 6d 2d 6f 66 66 73 65 74 20 76 61 6c   term-offset val
1ae70 75 65 20 6c 69 74 65 72 61 6c 6c 79 2c 20 65 61  ue literally, ea
1ae80 63 68 20 69 6e 74 65 67 65 72 20 73 74 6f 72 65  ch integer store
1ae90 64 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  d .            i
1aea0 73 20 74 68 65 20 64 69 66 66 65 72 65 6e 63 65  s the difference
1aeb0 20 62 65 74 77 65 65 6e 20 74 68 65 20 63 75 72   between the cur
1aec0 72 65 6e 74 20 74 65 72 6d 2d 6f 66 66 73 65 74  rent term-offset
1aed0 20 61 6e 64 20 74 68 65 20 70 72 65 76 69 6f 75   and the previou
1aee0 73 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f  s .            o
1aef0 6e 65 20 28 6f 72 20 7a 65 72 6f 20 69 66 20 74  ne (or zero if t
1af00 68 65 20 63 75 72 72 65 6e 74 20 74 65 72 6d 2d  he current term-
1af10 6f 66 66 73 65 74 20 69 73 20 74 68 65 20 66 69  offset is the fi
1af20 72 73 74 29 2c 20 70 6c 75 73 20 32 2e 0a 20 20  rst), plus 2..  
1af30 20 20 20 3c 2f 6f 6c 3e 0a 20 20 3c 6c 69 3e 20     </ol>.  <li> 
1af40 43 6f 6e 73 74 61 6e 74 20 76 61 6c 75 65 20 30  Constant value 0
1af50 2e 0a 3c 2f 6f 6c 3e 0a 0a 3c 63 65 6e 74 65 72  ..</ol>..<center
1af60 3e 0a 20 20 3c 69 6d 67 20 73 72 63 3d 69 6d 61  >.  <img src=ima
1af70 67 65 73 2f 66 74 73 33 5f 64 6f 63 6c 69 73 74  ges/fts3_doclist
1af80 32 2e 70 6e 67 3e 0a 20 20 3c 70 3e 20 46 54 53  2.png>.  <p> FTS
1af90 33 20 44 6f 63 6c 69 73 74 20 46 6f 72 6d 61 74  3 Doclist Format
1afa0 0a 3c 2f 63 65 6e 74 65 72 3e 0a 0a 3c 63 65 6e  .</center>..<cen
1afb0 74 65 72 3e 0a 20 20 3c 69 6d 67 20 73 72 63 3d  ter>.  <img src=
1afc0 69 6d 61 67 65 73 2f 66 74 73 33 5f 64 6f 63 6c  images/fts3_docl
1afd0 69 73 74 2e 70 6e 67 3e 0a 20 20 3c 70 3e 20 46  ist.png>.  <p> F
1afe0 54 53 20 44 6f 63 6c 69 73 74 20 45 6e 74 72 79  TS Doclist Entry
1aff0 20 46 6f 72 6d 61 74 0a 3c 2f 63 65 6e 74 65 72   Format.</center
1b000 3e 0a 0a 3c 70 3e 0a 20 20 46 6f 72 20 64 6f 63  >..<p>.  For doc
1b010 6c 69 73 74 73 20 66 6f 72 20 77 68 69 63 68 20  lists for which 
1b020 74 68 65 20 74 65 72 6d 20 61 70 70 65 61 72 73  the term appears
1b030 20 69 6e 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e   in more than on
1b040 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  e column of the 
1b050 46 54 53 0a 20 20 76 69 72 74 75 61 6c 20 74 61  FTS.  virtual ta
1b060 62 6c 65 2c 20 74 65 72 6d 2d 6f 66 66 73 65 74  ble, term-offset
1b070 20 6c 69 73 74 73 20 77 69 74 68 69 6e 20 74 68   lists within th
1b080 65 20 64 6f 63 6c 69 73 74 20 61 72 65 20 73 74  e doclist are st
1b090 6f 72 65 64 20 69 6e 20 63 6f 6c 75 6d 6e 20 0a  ored in column .
1b0a0 20 20 6e 75 6d 62 65 72 20 6f 72 64 65 72 2e 20    number order. 
1b0b0 54 68 69 73 20 65 6e 73 75 72 65 73 20 74 68 61  This ensures tha
1b0c0 74 20 74 68 65 20 74 65 72 6d 2d 6f 66 66 73 65  t the term-offse
1b0d0 74 20 6c 69 73 74 20 61 73 73 6f 63 69 61 74 65  t list associate
1b0e0 64 20 77 69 74 68 20 0a 20 20 63 6f 6c 75 6d 6e  d with .  column
1b0f0 20 30 20 28 69 66 20 61 6e 79 29 20 69 73 20 61   0 (if any) is a
1b100 6c 77 61 79 73 20 66 69 72 73 74 2c 20 61 6c 6c  lways first, all
1b110 6f 77 69 6e 67 20 74 68 65 20 66 69 72 73 74 20  owing the first 
1b120 74 77 6f 20 66 69 65 6c 64 73 20 6f 66 20 74 68  two fields of th
1b130 65 0a 20 20 74 65 72 6d 2d 6f 66 66 73 65 74 20  e.  term-offset 
1b140 6c 69 73 74 20 74 6f 20 62 65 20 6f 6d 69 74 74  list to be omitt
1b150 65 64 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ed in this case.
1b160 0a 0a 3c 68 31 20 69 64 3d 61 70 70 65 6e 64 69  ..<h1 id=appendi
1b170 78 5f 61 20 6e 6f 6e 75 6d 62 65 72 20 74 61 67  x_a nonumber tag
1b180 73 3d 22 73 65 61 72 63 68 20 61 70 70 6c 69 63  s="search applic
1b190 61 74 69 6f 6e 20 74 69 70 73 22 3e 0a 20 20 41  ation tips">.  A
1b1a0 70 70 65 6e 64 69 78 20 41 3a 20 53 65 61 72 63  ppendix A: Searc
1b1b0 68 20 41 70 70 6c 69 63 61 74 69 6f 6e 20 54 69  h Application Ti
1b1c0 70 73 0a 3c 2f 68 31 3e 0a 0a 3c 70 3e 0a 20 20  ps.</h1>..<p>.  
1b1d0 46 54 53 20 69 73 20 70 72 69 6d 61 72 69 6c 79  FTS is primarily
1b1e0 20 64 65 73 69 67 6e 65 64 20 74 6f 20 73 75 70   designed to sup
1b1f0 70 6f 72 74 20 42 6f 6f 6c 65 61 6e 20 66 75 6c  port Boolean ful
1b200 6c 2d 74 65 78 74 20 71 75 65 72 69 65 73 20 2d  l-text queries -
1b210 20 71 75 65 72 69 65 73 0a 20 20 74 6f 20 66 69   queries.  to fi
1b220 6e 64 20 74 68 65 20 73 65 74 20 6f 66 20 64 6f  nd the set of do
1b230 63 75 6d 65 6e 74 73 20 74 68 61 74 20 6d 61 74  cuments that mat
1b240 63 68 20 61 20 73 70 65 63 69 66 69 65 64 20 63  ch a specified c
1b250 72 69 74 65 72 69 61 2e 20 48 6f 77 65 76 65 72  riteria. However
1b260 2c 20 6d 61 6e 79 20 0a 20 20 28 6d 6f 73 74 3f  , many .  (most?
1b270 29 20 73 65 61 72 63 68 20 61 70 70 6c 69 63 61  ) search applica
1b280 74 69 6f 6e 73 20 72 65 71 75 69 72 65 20 74 68  tions require th
1b290 61 74 20 72 65 73 75 6c 74 73 20 61 72 65 20 73  at results are s
1b2a0 6f 6d 65 68 6f 77 20 72 61 6e 6b 65 64 20 69 6e  omehow ranked in
1b2b0 20 6f 72 64 65 72 0a 20 20 6f 66 20 22 72 65 6c   order.  of "rel
1b2c0 65 76 61 6e 63 65 22 2c 20 77 68 65 72 65 20 22  evance", where "
1b2d0 72 65 6c 65 76 61 6e 63 65 22 20 69 73 20 64 65  relevance" is de
1b2e0 66 69 6e 65 64 20 61 73 20 74 68 65 20 6c 69 6b  fined as the lik
1b2f0 65 6c 69 68 6f 6f 64 20 74 68 61 74 20 74 68 65  elihood that the
1b300 20 75 73 65 72 0a 20 20 77 68 6f 20 70 65 72 66   user.  who perf
1b310 6f 72 6d 65 64 20 74 68 65 20 73 65 61 72 63 68  ormed the search
1b320 20 69 73 20 69 6e 74 65 72 65 73 74 65 64 20 69   is interested i
1b330 6e 20 61 20 73 70 65 63 69 66 69 63 20 65 6c 65  n a specific ele
1b340 6d 65 6e 74 20 6f 66 20 74 68 65 20 72 65 74 75  ment of the retu
1b350 72 6e 65 64 0a 20 20 73 65 74 20 6f 66 20 64 6f  rned.  set of do
1b360 63 75 6d 65 6e 74 73 2e 20 57 68 65 6e 20 75 73  cuments. When us
1b370 69 6e 67 20 61 20 73 65 61 72 63 68 20 65 6e 67  ing a search eng
1b380 69 6e 65 20 74 6f 20 66 69 6e 64 20 64 6f 63 75  ine to find docu
1b390 6d 65 6e 74 73 20 6f 6e 20 74 68 65 20 77 6f 72  ments on the wor
1b3a0 6c 64 0a 20 20 77 69 64 65 20 77 65 62 2c 20 74  ld.  wide web, t
1b3b0 68 65 20 75 73 65 72 20 65 78 70 65 63 74 73 20  he user expects 
1b3c0 74 68 61 74 20 74 68 65 20 6d 6f 73 74 20 75 73  that the most us
1b3d0 65 66 75 6c 2c 20 6f 72 20 22 72 65 6c 65 76 61  eful, or "releva
1b3e0 6e 74 22 2c 20 64 6f 63 75 6d 65 6e 74 73 20 0a  nt", documents .
1b3f0 20 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e    will be return
1b400 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
1b410 70 61 67 65 20 6f 66 20 72 65 73 75 6c 74 73 2c  page of results,
1b420 20 61 6e 64 20 74 68 61 74 20 65 61 63 68 20 73   and that each s
1b430 75 62 73 65 71 75 65 6e 74 20 70 61 67 65 20 0a  ubsequent page .
1b440 20 20 63 6f 6e 74 61 69 6e 73 20 70 72 6f 67 72    contains progr
1b450 65 73 73 69 76 65 6c 79 20 6c 65 73 73 20 72 65  essively less re
1b460 6c 65 76 61 6e 74 20 72 65 73 75 6c 74 73 2e 20  levant results. 
1b470 45 78 61 63 74 6c 79 20 68 6f 77 20 61 20 6d 61  Exactly how a ma
1b480 63 68 69 6e 65 20 63 61 6e 20 0a 20 20 64 65 74  chine can .  det
1b490 65 72 6d 69 6e 65 20 64 6f 63 75 6d 65 6e 74 20  ermine document 
1b4a0 72 65 6c 65 76 61 6e 63 65 20 62 61 73 65 64 20  relevance based 
1b4b0 6f 6e 20 61 20 75 73 65 72 73 20 71 75 65 72 79  on a users query
1b4c0 20 69 73 20 61 20 63 6f 6d 70 6c 69 63 61 74 65   is a complicate
1b4d0 64 20 70 72 6f 62 6c 65 6d 0a 20 20 61 6e 64 20  d problem.  and 
1b4e0 74 68 65 20 73 75 62 6a 65 63 74 20 6f 66 20 6d  the subject of m
1b4f0 75 63 68 20 6f 6e 67 6f 69 6e 67 20 72 65 73 65  uch ongoing rese
1b500 61 72 63 68 2e 0a 0a 3c 70 3e 0a 20 20 4f 6e 65  arch...<p>.  One
1b510 20 76 65 72 79 20 73 69 6d 70 6c 65 20 73 63 68   very simple sch
1b520 65 6d 65 20 6d 69 67 68 74 20 62 65 20 74 6f 20  eme might be to 
1b530 63 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72  count the number
1b540 20 6f 66 20 69 6e 73 74 61 6e 63 65 73 20 6f 66   of instances of
1b550 20 74 68 65 20 0a 20 20 75 73 65 72 73 20 73 65   the .  users se
1b560 61 72 63 68 20 74 65 72 6d 73 20 69 6e 20 65 61  arch terms in ea
1b570 63 68 20 72 65 73 75 6c 74 20 64 6f 63 75 6d 65  ch result docume
1b580 6e 74 2e 20 54 68 6f 73 65 20 64 6f 63 75 6d 65  nt. Those docume
1b590 6e 74 73 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  nts that contain
1b5a0 0a 20 20 6d 61 6e 79 20 69 6e 73 74 61 6e 63 65  .  many instance
1b5b0 73 20 6f 66 20 74 68 65 20 74 65 72 6d 73 20 61  s of the terms a
1b5c0 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20 6d 6f  re considered mo
1b5d0 72 65 20 72 65 6c 65 76 61 6e 74 20 74 68 61 6e  re relevant than
1b5e0 20 74 68 6f 73 65 20 77 69 74 68 0a 20 20 61 20   those with.  a 
1b5f0 73 6d 61 6c 6c 20 6e 75 6d 62 65 72 20 6f 66 20  small number of 
1b600 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 65 61 63  instances of eac
1b610 68 20 74 65 72 6d 2e 20 49 6e 20 61 6e 20 46 54  h term. In an FT
1b620 53 20 61 70 70 6c 69 63 61 74 69 6f 6e 2c 20 74  S application, t
1b630 68 65 20 0a 20 20 6e 75 6d 62 65 72 20 6f 66 20  he .  number of 
1b640 74 65 72 6d 20 69 6e 73 74 61 6e 63 65 73 20 69  term instances i
1b650 6e 20 65 61 63 68 20 72 65 73 75 6c 74 20 63 6f  n each result co
1b660 75 6c 64 20 62 65 20 64 65 74 65 72 6d 69 6e 65  uld be determine
1b670 64 20 62 79 20 63 6f 75 6e 74 69 6e 67 0a 20 20  d by counting.  
1b680 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e  the number of in
1b690 74 65 67 65 72 73 20 69 6e 20 74 68 65 20 72 65  tegers in the re
1b6a0 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 74 68  turn value of th
1b6b0 65 20 5b 6f 66 66 73 65 74 73 5d 20 66 75 6e 63  e [offsets] func
1b6c0 74 69 6f 6e 2e 0a 20 20 54 68 65 20 66 6f 6c 6c  tion..  The foll
1b6d0 6f 77 69 6e 67 20 65 78 61 6d 70 6c 65 20 73 68  owing example sh
1b6e0 6f 77 73 20 61 20 71 75 65 72 79 20 74 68 61 74  ows a query that
1b6f0 20 63 6f 75 6c 64 20 62 65 20 75 73 65 64 20 74   could be used t
1b700 6f 20 6f 62 74 61 69 6e 20 74 68 65 0a 20 20 74  o obtain the.  t
1b710 65 6e 20 6d 6f 73 74 20 72 65 6c 65 76 61 6e 74  en most relevant
1b720 20 72 65 73 75 6c 74 73 20 66 6f 72 20 61 20 71   results for a q
1b730 75 65 72 79 20 65 6e 74 65 72 65 64 20 62 79 20  uery entered by 
1b740 74 68 65 20 75 73 65 72 3a 0a 0a 3c 63 6f 64 65  the user:..<code
1b750 62 6c 6f 63 6b 3e 0a 20 20 3c 69 3e 2d 2d 20 54  block>.  <i>-- T
1b760 68 69 73 20 65 78 61 6d 70 6c 65 20 28 61 6e 64  his example (and
1b770 20 61 6c 6c 20 6f 74 68 65 72 73 20 69 6e 20 74   all others in t
1b780 68 69 73 20 73 65 63 74 69 6f 6e 29 20 61 73 73  his section) ass
1b790 75 6d 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69  umes the followi
1b7a0 6e 67 20 73 63 68 65 6d 61 3c 2f 69 3e 0a 20 20  ng schema</i>.  
1b7b0 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54  CREATE VIRTUAL T
1b7c0 41 42 4c 45 20 64 6f 63 75 6d 65 6e 74 73 20 55  ABLE documents U
1b7d0 53 49 4e 47 20 66 74 73 33 28 74 69 74 6c 65 2c  SING fts3(title,
1b7e0 20 63 6f 6e 74 65 6e 74 29 3b 0a 0a 20 20 3c 69   content);..  <i
1b7f0 3e 2d 2d 20 41 73 73 75 6d 69 6e 67 20 74 68 65  >-- Assuming the
1b800 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 68 61 73   application has
1b810 20 73 75 70 70 6c 69 65 64 20 61 6e 20 53 51 4c   supplied an SQL
1b820 69 74 65 20 75 73 65 72 20 66 75 6e 63 74 69 6f  ite user functio
1b830 6e 20 6e 61 6d 65 64 20 22 63 6f 75 6e 74 69 6e  n named "countin
1b840 74 65 67 65 72 73 22 3c 2f 69 3e 0a 20 20 3c 69  tegers"</i>.  <i
1b850 3e 2d 2d 20 74 68 61 74 20 72 65 74 75 72 6e 73  >-- that returns
1b860 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73   the number of s
1b870 70 61 63 65 2d 73 65 70 61 72 61 74 65 64 20 69  pace-separated i
1b880 6e 74 65 67 65 72 73 20 63 6f 6e 74 61 69 6e 65  ntegers containe
1b890 64 20 69 6e 20 69 74 73 20 6f 6e 6c 79 20 61 72  d in its only ar
1b8a0 67 75 6d 65 6e 74 2c 3c 2f 69 3e 0a 20 20 3c 69  gument,</i>.  <i
1b8b0 3e 2d 2d 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  >-- the followin
1b8c0 67 20 71 75 65 72 79 20 63 6f 75 6c 64 20 62 65  g query could be
1b8d0 20 75 73 65 64 20 74 6f 20 72 65 74 75 72 6e 20   used to return 
1b8e0 74 68 65 20 74 69 74 6c 65 73 20 6f 66 20 74 68  the titles of th
1b8f0 65 20 31 30 20 64 6f 63 75 6d 65 6e 74 73 20 74  e 10 documents t
1b900 68 61 74 20 63 6f 6e 74 61 69 6e 3c 2f 69 3e 0a  hat contain</i>.
1b910 20 20 3c 69 3e 2d 2d 20 74 68 65 20 67 72 65 61    <i>-- the grea
1b920 74 65 73 74 20 6e 75 6d 62 65 72 20 6f 66 20 69  test number of i
1b930 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68 65 20  nstances of the 
1b940 75 73 65 72 73 20 71 75 65 72 79 20 74 65 72 6d  users query term
1b950 73 2e 20 48 6f 70 65 66 75 6c 6c 79 2c 20 74 68  s. Hopefully, th
1b960 65 73 65 20 31 30 3c 2f 69 3e 0a 20 20 3c 69 3e  ese 10</i>.  <i>
1b970 2d 2d 20 64 6f 63 75 6d 65 6e 74 73 20 77 69 6c  -- documents wil
1b980 6c 20 62 65 20 74 68 6f 73 65 20 74 68 61 74 20  l be those that 
1b990 74 68 65 20 75 73 65 72 73 20 63 6f 6e 73 69 64  the users consid
1b9a0 65 72 73 20 6d 6f 72 65 20 6f 72 20 6c 65 73 73  ers more or less
1b9b0 20 74 68 65 20 6d 6f 73 74 20 22 72 65 6c 65 76   the most "relev
1b9c0 61 6e 74 22 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45  ant".</i>.  SELE
1b9d0 43 54 20 74 69 74 6c 65 20 46 52 4f 4d 20 64 6f  CT title FROM do
1b9e0 63 75 6d 65 6e 74 73 20 0a 20 20 20 20 57 48 45  cuments .    WHE
1b9f0 52 45 20 64 6f 63 75 6d 65 6e 74 73 20 4d 41 54  RE documents MAT
1ba00 43 48 20 26 6c 74 3b 71 75 65 72 79 26 67 74 3b  CH &lt;query&gt;
1ba10 0a 20 20 20 20 4f 52 44 45 52 20 42 59 20 63 6f  .    ORDER BY co
1ba20 75 6e 74 69 6e 74 65 67 65 72 73 28 6f 66 66 73  untintegers(offs
1ba30 65 74 73 28 64 6f 63 75 6d 65 6e 74 73 29 29 20  ets(documents)) 
1ba40 44 45 53 43 0a 20 20 20 20 4c 49 4d 49 54 20 31  DESC.    LIMIT 1
1ba50 30 20 4f 46 46 53 45 54 20 30 0a 3c 2f 63 6f 64  0 OFFSET 0.</cod
1ba60 65 62 6c 6f 63 6b 3e 0a 0a 3c 70 3e 0a 20 20 54  eblock>..<p>.  T
1ba70 68 65 20 71 75 65 72 79 20 61 62 6f 76 65 20 63  he query above c
1ba80 6f 75 6c 64 20 62 65 20 6d 61 64 65 20 74 6f 20  ould be made to 
1ba90 72 75 6e 20 66 61 73 74 65 72 20 62 79 20 75 73  run faster by us
1baa0 69 6e 67 20 74 68 65 20 46 54 53 20 5b 6d 61 74  ing the FTS [mat
1bab0 63 68 69 6e 66 6f 5d 0a 20 20 66 75 6e 63 74 69  chinfo].  functi
1bac0 6f 6e 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  on to determine 
1bad0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 71 75  the number of qu
1bae0 65 72 79 20 74 65 72 6d 20 69 6e 73 74 61 6e 63  ery term instanc
1baf0 65 73 20 74 68 61 74 20 61 70 70 65 61 72 20 69  es that appear i
1bb00 6e 20 65 61 63 68 0a 20 20 72 65 73 75 6c 74 2e  n each.  result.
1bb10 20 54 68 65 20 6d 61 74 63 68 69 6e 66 6f 20 66   The matchinfo f
1bb20 75 6e 63 74 69 6f 6e 20 69 73 20 6d 75 63 68 20  unction is much 
1bb30 6d 6f 72 65 20 65 66 66 69 63 69 65 6e 74 20 74  more efficient t
1bb40 68 61 6e 20 74 68 65 20 6f 66 66 73 65 74 73 20  han the offsets 
1bb50 0a 20 20 66 75 6e 63 74 69 6f 6e 2e 20 46 75 72  .  function. Fur
1bb60 74 68 65 72 6d 6f 72 65 2c 20 74 68 65 20 6d 61  thermore, the ma
1bb70 74 63 68 69 6e 66 6f 20 66 75 6e 63 74 69 6f 6e  tchinfo function
1bb80 20 70 72 6f 76 69 64 65 73 20 65 78 74 72 61 20   provides extra 
1bb90 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 20 20 72 65  information.  re
1bba0 67 61 72 64 69 6e 67 20 74 68 65 20 6f 76 65 72  garding the over
1bbb0 61 6c 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6f 63  all number of oc
1bbc0 63 75 72 72 65 6e 63 65 73 20 6f 66 20 65 61 63  currences of eac
1bbd0 68 20 71 75 65 72 79 20 74 65 72 6d 20 69 6e 20  h query term in 
1bbe0 74 68 65 20 65 6e 74 69 72 65 0a 20 20 64 6f 63  the entire.  doc
1bbf0 75 6d 65 6e 74 20 73 65 74 20 28 6e 6f 74 20 6a  ument set (not j
1bc00 75 73 74 20 74 68 65 20 63 75 72 72 65 6e 74 20  ust the current 
1bc10 72 6f 77 29 20 61 6e 64 20 74 68 65 20 6e 75 6d  row) and the num
1bc20 62 65 72 20 6f 66 20 64 6f 63 75 6d 65 6e 74 73  ber of documents
1bc30 20 69 6e 20 77 68 69 63 68 20 0a 20 20 65 61 63   in which .  eac
1bc40 68 20 71 75 65 72 79 20 74 65 72 6d 20 61 70 70  h query term app
1bc50 65 61 72 73 2e 20 54 68 69 73 20 6d 61 79 20 62  ears. This may b
1bc60 65 20 75 73 65 64 20 28 66 6f 72 20 65 78 61 6d  e used (for exam
1bc70 70 6c 65 29 20 74 6f 20 61 74 74 61 63 68 20 61  ple) to attach a
1bc80 20 68 69 67 68 65 72 0a 20 20 77 65 69 67 68 74   higher.  weight
1bc90 20 74 6f 20 6c 65 73 73 20 63 6f 6d 6d 6f 6e 20   to less common 
1bca0 74 65 72 6d 73 20 77 68 69 63 68 20 6d 61 79 20  terms which may 
1bcb0 69 6e 63 72 65 61 73 65 20 74 68 65 20 6f 76 65  increase the ove
1bcc0 72 61 6c 6c 20 63 6f 6d 70 75 74 65 64 20 72 65  rall computed re
1bcd0 6c 65 76 61 6e 63 79 20 0a 20 20 6f 66 20 74 68  levancy .  of th
1bce0 6f 73 65 20 72 65 73 75 6c 74 73 20 74 68 65 20  ose results the 
1bcf0 75 73 65 72 20 63 6f 6e 73 69 64 65 72 73 20 6d  user considers m
1bd00 6f 72 65 20 69 6e 74 65 72 65 73 74 69 6e 67 2e  ore interesting.
1bd10 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20 20  ..<codeblock>.  
1bd20 3c 69 3e 2d 2d 20 49 66 20 74 68 65 20 61 70 70  <i>-- If the app
1bd30 6c 69 63 61 74 69 6f 6e 20 73 75 70 70 6c 69 65  lication supplie
1bd40 73 20 61 6e 20 53 51 4c 69 74 65 20 75 73 65 72  s an SQLite user
1bd50 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64   function called
1bd60 20 22 72 61 6e 6b 22 20 74 68 61 74 3c 2f 69 3e   "rank" that</i>
1bd70 0a 20 20 3c 69 3e 2d 2d 20 69 6e 74 65 72 70 72  .  <i>-- interpr
1bd80 65 74 73 20 74 68 65 20 62 6c 6f 62 20 6f 66 20  ets the blob of 
1bd90 64 61 74 61 20 72 65 74 75 72 6e 65 64 20 62 79  data returned by
1bda0 20 6d 61 74 63 68 69 6e 66 6f 20 61 6e 64 20 72   matchinfo and r
1bdb0 65 74 75 72 6e 73 20 61 20 6e 75 6d 65 72 69 63  eturns a numeric
1bdc0 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 72 65 6c  </i>.  <i>-- rel
1bdd0 65 76 61 6e 63 79 20 62 61 73 65 64 20 6f 6e 20  evancy based on 
1bde0 69 74 2c 20 74 68 65 6e 20 74 68 65 20 66 6f 6c  it, then the fol
1bdf0 6c 6f 77 69 6e 67 20 53 51 4c 20 6d 61 79 20 62  lowing SQL may b
1be00 65 20 75 73 65 64 20 74 6f 20 72 65 74 75 72 6e  e used to return
1be10 20 74 68 65 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d   the</i>.  <i>--
1be20 20 74 69 74 6c 65 73 20 6f 66 20 74 68 65 20 31   titles of the 1
1be30 30 20 6d 6f 73 74 20 72 65 6c 65 76 61 6e 74 20  0 most relevant 
1be40 64 6f 63 75 6d 65 6e 74 73 20 69 6e 20 74 68 65  documents in the
1be50 20 64 61 74 61 73 65 74 20 66 6f 72 20 61 20 75   dataset for a u
1be60 73 65 72 73 20 71 75 65 72 79 2e 3c 2f 69 3e 0a  sers query.</i>.
1be70 20 20 53 45 4c 45 43 54 20 74 69 74 6c 65 20 46    SELECT title F
1be80 52 4f 4d 20 64 6f 63 75 6d 65 6e 74 73 20 0a 20  ROM documents . 
1be90 20 20 20 57 48 45 52 45 20 64 6f 63 75 6d 65 6e     WHERE documen
1bea0 74 73 20 4d 41 54 43 48 20 26 6c 74 3b 71 75 65  ts MATCH &lt;que
1beb0 72 79 26 67 74 3b 0a 20 20 20 20 4f 52 44 45 52  ry&gt;.    ORDER
1bec0 20 42 59 20 72 61 6e 6b 28 6d 61 74 63 68 69 6e   BY rank(matchin
1bed0 66 6f 28 64 6f 63 75 6d 65 6e 74 73 29 29 20 44  fo(documents)) D
1bee0 45 53 43 0a 20 20 20 20 4c 49 4d 49 54 20 31 30  ESC.    LIMIT 10
1bef0 20 4f 46 46 53 45 54 20 30 0a 3c 2f 63 6f 64 65   OFFSET 0.</code
1bf00 62 6c 6f 63 6b 3e 0a 0a 3c 70 3e 0a 20 20 54 68  block>..<p>.  Th
1bf10 65 20 53 51 4c 20 71 75 65 72 79 20 69 6e 20 74  e SQL query in t
1bf20 68 65 20 65 78 61 6d 70 6c 65 20 61 62 6f 76 65  he example above
1bf30 20 75 73 65 73 20 6c 65 73 73 20 43 50 55 20 74   uses less CPU t
1bf40 68 61 6e 20 74 68 65 20 66 69 72 73 74 20 65 78  han the first ex
1bf50 61 6d 70 6c 65 0a 20 20 69 6e 20 74 68 69 73 20  ample.  in this 
1bf60 73 65 63 74 69 6f 6e 2c 20 62 75 74 20 73 74 69  section, but sti
1bf70 6c 6c 20 68 61 73 20 61 20 6e 6f 6e 2d 6f 62 76  ll has a non-obv
1bf80 69 6f 75 73 20 70 65 72 66 6f 72 6d 61 6e 63 65  ious performance
1bf90 20 70 72 6f 62 6c 65 6d 2e 20 53 51 4c 69 74 65   problem. SQLite
1bfa0 0a 20 20 73 61 74 69 73 66 69 65 73 20 74 68 69  .  satisfies thi
1bfb0 73 20 71 75 65 72 79 20 62 79 20 72 65 74 72 69  s query by retri
1bfc0 65 76 69 6e 67 20 74 68 65 20 76 61 6c 75 65 20  eving the value 
1bfd0 6f 66 20 74 68 65 20 22 74 69 74 6c 65 22 20 63  of the "title" c
1bfe0 6f 6c 75 6d 6e 20 61 6e 64 0a 20 20 6d 61 74 63  olumn and.  matc
1bff0 68 69 6e 66 6f 20 64 61 74 61 20 66 72 6f 6d 20  hinfo data from 
1c000 74 68 65 20 46 54 53 20 6d 6f 64 75 6c 65 20 66  the FTS module f
1c010 6f 72 20 65 76 65 72 79 20 72 6f 77 20 6d 61 74  or every row mat
1c020 63 68 65 64 20 62 79 20 74 68 65 20 75 73 65 72  ched by the user
1c030 73 0a 20 20 71 75 65 72 79 20 62 65 66 6f 72 65  s.  query before
1c040 20 69 74 20 73 6f 72 74 73 20 61 6e 64 20 6c 69   it sorts and li
1c050 6d 69 74 73 20 74 68 65 20 72 65 73 75 6c 74 73  mits the results
1c060 2e 20 42 65 63 61 75 73 65 20 6f 66 20 74 68 65  . Because of the
1c070 20 77 61 79 20 53 51 4c 69 74 65 27 73 0a 20 20   way SQLite's.  
1c080 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 69 6e  virtual table in
1c090 74 65 72 66 61 63 65 20 77 6f 72 6b 73 2c 20 72  terface works, r
1c0a0 65 74 72 69 65 76 69 6e 67 20 74 68 65 20 76 61  etrieving the va
1c0b0 6c 75 65 20 6f 66 20 74 68 65 20 22 74 69 74 6c  lue of the "titl
1c0c0 65 22 20 63 6f 6c 75 6d 6e 0a 20 20 72 65 71 75  e" column.  requ
1c0d0 69 72 65 73 20 6c 6f 61 64 69 6e 67 20 74 68 65  ires loading the
1c0e0 20 65 6e 74 69 72 65 20 72 6f 77 20 66 72 6f 6d   entire row from
1c0f0 20 64 69 73 6b 20 28 69 6e 63 6c 75 64 69 6e 67   disk (including
1c100 20 74 68 65 20 22 63 6f 6e 74 65 6e 74 22 20 66   the "content" f
1c110 69 65 6c 64 2c 0a 20 20 77 68 69 63 68 20 6d 61  ield,.  which ma
1c120 79 20 62 65 20 71 75 69 74 65 20 6c 61 72 67 65  y be quite large
1c130 29 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68  ). This means th
1c140 61 74 20 69 66 20 74 68 65 20 75 73 65 72 73 20  at if the users 
1c150 71 75 65 72 79 20 6d 61 74 63 68 65 73 0a 20 20  query matches.  
1c160 73 65 76 65 72 61 6c 20 74 68 6f 75 73 61 6e 64  several thousand
1c170 20 64 6f 63 75 6d 65 6e 74 73 2c 20 6d 61 6e 79   documents, many
1c180 20 6d 65 67 61 62 79 74 65 73 20 6f 66 20 22 74   megabytes of "t
1c190 69 74 6c 65 22 20 61 6e 64 20 22 63 6f 6e 74 65  itle" and "conte
1c1a0 6e 74 22 20 64 61 74 61 0a 20 20 6d 61 79 20 62  nt" data.  may b
1c1b0 65 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20 64 69  e loaded from di
1c1c0 73 6b 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 65  sk into memory e
1c1d0 76 65 6e 20 74 68 6f 75 67 68 20 74 68 65 79 20  ven though they 
1c1e0 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 75 73  will never be us
1c1f0 65 64 0a 20 20 66 6f 72 20 61 6e 79 20 70 75 72  ed.  for any pur
1c200 70 6f 73 65 2e 20 0a 0a 3c 70 3e 0a 20 20 54 68  pose. ..<p>.  Th
1c210 65 20 53 51 4c 20 71 75 65 72 79 20 69 6e 20 74  e SQL query in t
1c220 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 78 61  he following exa
1c230 6d 70 6c 65 20 62 6c 6f 63 6b 20 69 73 20 6f 6e  mple block is on
1c240 65 20 73 6f 6c 75 74 69 6f 6e 20 74 6f 20 74 68  e solution to th
1c250 69 73 20 0a 20 20 70 72 6f 62 6c 65 6d 2e 20 49  is .  problem. I
1c260 6e 20 53 51 4c 69 74 65 2c 20 77 68 65 6e 20 61  n SQLite, when a
1c270 20 3c 61 20 68 72 65 66 3d 22 6f 70 74 6f 76 65   <a href="optove
1c280 72 76 69 65 77 2e 68 74 6d 6c 23 66 6c 61 74 74  rview.html#flatt
1c290 65 6e 69 6e 67 22 3e 73 75 62 2d 71 75 65 72 79  ening">sub-query
1c2a0 20 0a 20 20 75 73 65 64 20 69 6e 20 61 20 6a 6f   .  used in a jo
1c2b0 69 6e 20 63 6f 6e 74 61 69 6e 73 20 61 20 4c 49  in contains a LI
1c2c0 4d 49 54 20 63 6c 61 75 73 65 3c 2f 61 3e 2c 20  MIT clause</a>, 
1c2d0 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74  the results of t
1c2e0 68 65 20 73 75 62 2d 71 75 65 72 79 20 61 72 65  he sub-query are
1c2f0 0a 20 20 63 61 6c 63 75 6c 61 74 65 64 20 61 6e  .  calculated an
1c300 64 20 73 74 6f 72 65 64 20 69 6e 20 74 65 6d 70  d stored in temp
1c310 6f 72 61 72 79 20 74 61 62 6c 65 20 62 65 66 6f  orary table befo
1c320 72 65 20 74 68 65 20 6d 61 69 6e 20 71 75 65 72  re the main quer
1c330 79 20 69 73 20 65 78 65 63 75 74 65 64 2e 0a 20  y is executed.. 
1c340 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74   This means that
1c350 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 6c 6f 61   SQLite will loa
1c360 64 20 6f 6e 6c 79 20 74 68 65 20 64 6f 63 69 64  d only the docid
1c370 20 61 6e 64 20 6d 61 74 63 68 69 6e 66 6f 20 64   and matchinfo d
1c380 61 74 61 20 66 6f 72 20 65 61 63 68 0a 20 20 72  ata for each.  r
1c390 6f 77 20 6d 61 74 63 68 69 6e 67 20 74 68 65 20  ow matching the 
1c3a0 75 73 65 72 73 20 71 75 65 72 79 20 69 6e 74 6f  users query into
1c3b0 20 6d 65 6d 6f 72 79 2c 20 64 65 74 65 72 6d 69   memory, determi
1c3c0 6e 65 20 74 68 65 20 64 6f 63 69 64 20 76 61 6c  ne the docid val
1c3d0 75 65 73 0a 20 20 63 6f 72 72 65 73 70 6f 6e 64  ues.  correspond
1c3e0 69 6e 67 20 74 6f 20 74 68 65 20 74 65 6e 20 6d  ing to the ten m
1c3f0 6f 73 74 20 72 65 6c 65 76 61 6e 74 20 64 6f 63  ost relevant doc
1c400 75 6d 65 6e 74 73 2c 20 74 68 65 6e 20 6c 6f 61  uments, then loa
1c410 64 20 6f 6e 6c 79 20 74 68 65 20 74 69 74 6c 65  d only the title
1c420 0a 20 20 61 6e 64 20 63 6f 6e 74 65 6e 74 20 69  .  and content i
1c430 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74  nformation for t
1c440 68 6f 73 65 20 31 30 20 64 6f 63 75 6d 65 6e 74  hose 10 document
1c450 73 20 6f 6e 6c 79 2e 20 42 65 63 61 75 73 65 20  s only. Because 
1c460 62 6f 74 68 20 74 68 65 20 6d 61 74 63 68 69 6e  both the matchin
1c470 66 6f 0a 20 20 61 6e 64 20 64 6f 63 69 64 20 76  fo.  and docid v
1c480 61 6c 75 65 73 20 61 72 65 20 67 6c 65 61 6e 65  alues are gleane
1c490 64 20 65 6e 74 69 72 65 6c 79 20 66 72 6f 6d 20  d entirely from 
1c4a0 74 68 65 20 66 75 6c 6c 2d 74 65 78 74 20 69 6e  the full-text in
1c4b0 64 65 78 2c 20 74 68 69 73 20 72 65 73 75 6c 74  dex, this result
1c4c0 73 0a 20 20 69 6e 20 64 72 61 6d 61 74 69 63 61  s.  in dramatica
1c4d0 6c 6c 79 20 6c 65 73 73 20 64 61 74 61 20 62 65  lly less data be
1c4e0 69 6e 67 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20  ing loaded from 
1c4f0 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6e 74  the database int
1c500 6f 20 6d 65 6d 6f 72 79 2e 0a 0a 3c 63 6f 64 65  o memory...<code
1c510 62 6c 6f 63 6b 3e 0a 20 20 53 45 4c 45 43 54 20  block>.  SELECT 
1c520 74 69 74 6c 65 20 46 52 4f 4d 20 64 6f 63 75 6d  title FROM docum
1c530 65 6e 74 73 20 4a 4f 49 4e 20 28 20 0a 20 20 20  ents JOIN ( .   
1c540 20 20 20 53 45 4c 45 43 54 20 64 6f 63 69 64 2c     SELECT docid,
1c550 20 72 61 6e 6b 28 6d 61 74 63 68 69 6e 66 6f 28   rank(matchinfo(
1c560 64 6f 63 75 6d 65 6e 74 73 29 29 20 41 53 20 72  documents)) AS r
1c570 61 6e 6b 20 0a 20 20 20 20 20 20 46 52 4f 4d 20  ank .      FROM 
1c580 64 6f 63 75 6d 65 6e 74 73 0a 20 20 20 20 20 20  documents.      
1c590 57 48 45 52 45 20 64 6f 63 75 6d 65 6e 74 73 20  WHERE documents 
1c5a0 4d 41 54 43 48 20 26 6c 74 3b 71 75 65 72 79 26  MATCH &lt;query&
1c5b0 67 74 3b 0a 20 20 20 20 20 20 4f 52 44 45 52 20  gt;.      ORDER 
1c5c0 42 59 20 72 61 6e 6b 20 44 45 53 43 20 0a 20 20  BY rank DESC .  
1c5d0 20 20 20 20 4c 49 4d 49 54 20 31 30 20 4f 46 46      LIMIT 10 OFF
1c5e0 53 45 54 20 30 0a 20 20 29 20 41 53 20 72 61 6e  SET 0.  ) AS ran
1c5f0 6b 74 61 62 6c 65 20 55 53 49 4e 47 28 64 6f 63  ktable USING(doc
1c600 69 64 29 0a 20 20 4f 52 44 45 52 20 42 59 20 72  id).  ORDER BY r
1c610 61 6e 6b 74 61 62 6c 65 2e 72 61 6e 6b 20 44 45  anktable.rank DE
1c620 53 43 0a 3c 2f 63 6f 64 65 62 6c 6f 63 6b 3e 0a  SC.</codeblock>.
1c630 0a 3c 70 3e 0a 20 20 54 68 65 20 6e 65 78 74 20  .<p>.  The next 
1c640 62 6c 6f 63 6b 20 6f 66 20 53 51 4c 20 65 6e 68  block of SQL enh
1c650 61 6e 63 65 73 20 74 68 65 20 71 75 65 72 79 20  ances the query 
1c660 77 69 74 68 20 73 6f 6c 75 74 69 6f 6e 73 20 74  with solutions t
1c670 6f 20 74 77 6f 20 6f 74 68 65 72 20 70 72 6f 62  o two other prob
1c680 6c 65 6d 73 0a 20 20 74 68 61 74 20 6d 61 79 20  lems.  that may 
1c690 61 72 69 73 65 20 69 6e 20 64 65 76 65 6c 6f 70  arise in develop
1c6a0 69 6e 67 20 73 65 61 72 63 68 20 61 70 70 6c 69  ing search appli
1c6b0 63 61 74 69 6f 6e 73 20 75 73 69 6e 67 20 46 54  cations using FT
1c6c0 53 3a 0a 0a 3c 6f 6c 3e 0a 20 20 3c 6c 69 3e 20  S:..<ol>.  <li> 
1c6d0 3c 70 3e 0a 20 20 20 20 20 20 20 54 68 65 20 5b  <p>.       The [
1c6e0 73 6e 69 70 70 65 74 5d 20 66 75 6e 63 74 69 6f  snippet] functio
1c6f0 6e 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64  n cannot be used
1c700 20 77 69 74 68 20 74 68 65 20 61 62 6f 76 65 20   with the above 
1c710 71 75 65 72 79 2e 20 42 65 63 61 75 73 65 0a 20  query. Because. 
1c720 20 20 20 20 20 20 74 68 65 20 6f 75 74 65 72 20        the outer 
1c730 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 69  query does not i
1c740 6e 63 6c 75 64 65 20 61 20 22 57 48 45 52 45 20  nclude a "WHERE 
1c750 2e 2e 2e 20 4d 41 54 43 48 22 20 63 6c 61 75 73  ... MATCH" claus
1c760 65 2c 20 74 68 65 20 73 6e 69 70 70 65 74 20 0a  e, the snippet .
1c770 20 20 20 20 20 20 20 66 75 6e 63 74 69 6f 6e 20         function 
1c780 6d 61 79 20 6e 6f 74 20 62 65 20 75 73 65 64 20  may not be used 
1c790 77 69 74 68 20 69 74 2e 20 4f 6e 65 20 73 6f 6c  with it. One sol
1c7a0 75 74 69 6f 6e 20 69 73 20 74 6f 20 64 75 70 6c  ution is to dupl
1c7b0 69 63 61 74 65 20 74 68 65 20 57 48 45 52 45 0a  icate the WHERE.
1c7c0 20 20 20 20 20 20 20 63 6c 61 75 73 65 20 75 73         clause us
1c7d0 65 64 20 62 79 20 74 68 65 20 73 75 62 2d 71 75  ed by the sub-qu
1c7e0 65 72 79 20 69 6e 20 74 68 65 20 6f 75 74 65 72  ery in the outer
1c7f0 20 71 75 65 72 79 2e 20 54 68 65 20 6f 76 65 72   query. The over
1c800 68 65 61 64 20 61 73 73 6f 63 69 61 74 65 64 0a  head associated.
1c810 20 20 20 20 20 20 20 77 69 74 68 20 74 68 69 73         with this
1c820 20 69 73 20 75 73 75 61 6c 6c 79 20 6e 65 67 6c   is usually negl
1c830 69 67 69 62 6c 65 2e 0a 20 20 3c 6c 69 3e 20 3c  igible..  <li> <
1c840 70 3e 0a 20 20 20 20 20 20 20 54 68 65 20 72 65  p>.       The re
1c850 6c 65 76 61 6e 63 79 20 6f 66 20 61 20 64 6f 63  levancy of a doc
1c860 75 6d 65 6e 74 20 6d 61 79 20 64 65 70 65 6e 64  ument may depend
1c870 20 6f 6e 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74   on something ot
1c880 68 65 72 20 74 68 61 6e 20 6a 75 73 74 0a 20 20  her than just.  
1c890 20 20 20 20 20 74 68 65 20 64 61 74 61 20 61 76       the data av
1c8a0 61 69 6c 61 62 6c 65 20 69 6e 20 74 68 65 20 72  ailable in the r
1c8b0 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 6d  eturn value of m
1c8c0 61 74 63 68 69 6e 66 6f 2e 20 46 6f 72 20 65 78  atchinfo. For ex
1c8d0 61 6d 70 6c 65 0a 20 20 20 20 20 20 20 65 61 63  ample.       eac
1c8e0 68 20 64 6f 63 75 6d 65 6e 74 20 69 6e 20 74 68  h document in th
1c8f0 65 20 64 61 74 61 62 61 73 65 20 6d 61 79 20 62  e database may b
1c900 65 20 61 73 73 69 67 6e 65 64 20 61 20 73 74 61  e assigned a sta
1c910 74 69 63 20 77 65 69 67 68 74 20 62 61 73 65 64  tic weight based
1c920 0a 20 20 20 20 20 20 20 6f 6e 20 66 61 63 74 6f  .       on facto
1c930 72 73 20 75 6e 72 65 6c 61 74 65 64 20 74 6f 20  rs unrelated to 
1c940 69 74 73 20 63 6f 6e 74 65 6e 74 20 28 6f 72 69  its content (ori
1c950 67 69 6e 2c 20 61 75 74 68 6f 72 2c 20 61 67 65  gin, author, age
1c960 2c 20 6e 75 6d 62 65 72 0a 20 20 20 20 20 20 20  , number.       
1c970 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 65 74  of references et
1c980 63 2e 29 2e 20 54 68 65 73 65 20 76 61 6c 75 65  c.). These value
1c990 73 20 63 61 6e 20 62 65 20 73 74 6f 72 65 64 20  s can be stored 
1c9a0 62 79 20 74 68 65 20 61 70 70 6c 69 63 61 74 69  by the applicati
1c9b0 6f 6e 0a 20 20 20 20 20 20 20 69 6e 20 61 20 73  on.       in a s
1c9c0 65 70 61 72 61 74 65 20 74 61 62 6c 65 20 74 68  eparate table th
1c9d0 61 74 20 63 61 6e 20 62 65 20 6a 6f 69 6e 65 64  at can be joined
1c9e0 20 61 67 61 69 6e 73 74 20 74 68 65 20 64 6f 63   against the doc
1c9f0 75 6d 65 6e 74 73 20 74 61 62 6c 65 0a 20 20 20  uments table.   
1ca00 20 20 20 20 69 6e 20 74 68 65 20 73 75 62 2d 71      in the sub-q
1ca10 75 65 72 79 20 73 6f 20 74 68 61 74 20 74 68 65  uery so that the
1ca20 20 72 61 6e 6b 20 66 75 6e 63 74 69 6f 6e 20 6d   rank function m
1ca30 61 79 20 61 63 63 65 73 73 20 74 68 65 6d 2e 0a  ay access them..
1ca40 3c 2f 6f 6c 3e 0a 0a 3c 70 3e 0a 20 20 54 68 69  </ol>..<p>.  Thi
1ca50 73 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65  s version of the
1ca60 20 71 75 65 72 79 20 69 73 20 76 65 72 79 20 73   query is very s
1ca70 69 6d 69 6c 61 72 20 74 6f 20 74 68 61 74 20 75  imilar to that u
1ca80 73 65 64 20 62 79 20 74 68 65 20 0a 20 20 3c 61  sed by the .  <a
1ca90 20 68 72 65 66 3d 22 68 74 74 70 3a 2f 2f 77 77   href="http://ww
1caa0 77 2e 73 71 6c 69 74 65 2e 6f 72 67 2f 73 65 61  w.sqlite.org/sea
1cab0 72 63 68 3f 71 3d 66 74 73 33 22 3e 73 71 6c 69  rch?q=fts3">sqli
1cac0 74 65 2e 6f 72 67 20 64 6f 63 75 6d 65 6e 74 61  te.org documenta
1cad0 74 69 6f 6e 20 73 65 61 72 63 68 3c 2f 61 3e 20  tion search</a> 
1cae0 0a 20 20 61 70 70 6c 69 63 61 74 69 6f 6e 2e 0a  .  application..
1caf0 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a 20 20 3c  .<codeblock>.  <
1cb00 69 3e 2d 2d 20 54 68 69 73 20 74 61 62 6c 65 20  i>-- This table 
1cb10 73 74 6f 72 65 73 20 74 68 65 20 73 74 61 74 69  stores the stati
1cb20 63 20 77 65 69 67 68 74 20 61 73 73 69 67 6e 65  c weight assigne
1cb30 64 20 74 6f 20 65 61 63 68 20 64 6f 63 75 6d 65  d to each docume
1cb40 6e 74 20 69 6e 20 46 54 53 20 74 61 62 6c 65 3c  nt in FTS table<
1cb50 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 22 64 6f 63  /i>.  <i>-- "doc
1cb60 75 6d 65 6e 74 73 22 2e 20 46 6f 72 20 65 61 63  uments". For eac
1cb70 68 20 72 6f 77 20 69 6e 20 74 68 65 20 64 6f 63  h row in the doc
1cb80 75 6d 65 6e 74 73 20 74 61 62 6c 65 20 74 68 65  uments table the
1cb90 72 65 20 69 73 20 61 20 63 6f 72 72 65 73 70 6f  re is a correspo
1cba0 6e 64 69 6e 67 20 72 6f 77 3c 2f 69 3e 0a 20 20  nding row</i>.  
1cbb0 3c 69 3e 2d 2d 20 77 69 74 68 20 74 68 65 20 73  <i>-- with the s
1cbc0 61 6d 65 20 64 6f 63 69 64 20 76 61 6c 75 65 20  ame docid value 
1cbd0 69 6e 20 74 68 69 73 20 74 61 62 6c 65 2e 3c 2f  in this table.</
1cbe0 69 3e 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c  i>.  CREATE TABL
1cbf0 45 20 64 6f 63 75 6d 65 6e 74 73 5f 64 61 74 61  E documents_data
1cc00 28 64 6f 63 69 64 20 49 4e 54 45 47 45 52 20 50  (docid INTEGER P
1cc10 52 49 4d 41 52 59 20 4b 45 59 2c 20 77 65 69 67  RIMARY KEY, weig
1cc20 68 74 29 3b 0a 0a 20 20 3c 69 3e 2d 2d 20 54 68  ht);..  <i>-- Th
1cc30 69 73 20 71 75 65 72 79 20 69 73 20 73 69 6d 69  is query is simi
1cc40 6c 61 72 20 74 6f 20 74 68 65 20 6f 6e 65 20 69  lar to the one i
1cc50 6e 20 74 68 65 20 62 6c 6f 63 6b 20 61 62 6f 76  n the block abov
1cc60 65 2c 20 65 78 63 65 70 74 20 74 68 61 74 3a 3c  e, except that:<
1cc70 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 3c 2f 69 3e 0a  /i>.  <i>--</i>.
1cc80 20 20 3c 69 3e 2d 2d 20 20 20 31 2e 20 49 74 20    <i>--   1. It 
1cc90 72 65 74 75 72 6e 73 20 61 20 22 73 6e 69 70 70  returns a "snipp
1cca0 65 74 22 20 6f 66 20 74 65 78 74 20 61 6c 6f 6e  et" of text alon
1ccb0 67 20 77 69 74 68 20 74 68 65 20 64 6f 63 75 6d  g with the docum
1ccc0 65 6e 74 20 74 69 74 6c 65 20 66 6f 72 20 64 69  ent title for di
1ccd0 73 70 6c 61 79 2e 20 53 6f 3c 2f 69 3e 0a 20 20  splay. So</i>.  
1cce0 3c 69 3e 2d 2d 20 20 20 20 20 20 74 68 61 74 20  <i>--      that 
1ccf0 74 68 65 20 73 6e 69 70 70 65 74 20 66 75 6e 63  the snippet func
1cd00 74 69 6f 6e 20 6d 61 79 20 62 65 20 75 73 65 64  tion may be used
1cd10 2c 20 74 68 65 20 22 57 48 45 52 45 20 2e 2e 2e  , the "WHERE ...
1cd20 20 4d 41 54 43 48 20 2e 2e 2e 22 20 63 6c 61 75   MATCH ..." clau
1cd30 73 65 20 66 72 6f 6d 3c 2f 69 3e 0a 20 20 3c 69  se from</i>.  <i
1cd40 3e 2d 2d 20 20 20 20 20 20 74 68 65 20 73 75 62  >--      the sub
1cd50 2d 71 75 65 72 79 20 69 73 20 64 75 70 6c 69 63  -query is duplic
1cd60 61 74 65 64 20 69 6e 20 74 68 65 20 6f 75 74 65  ated in the oute
1cd70 72 20 71 75 65 72 79 2e 3c 2f 69 3e 0a 20 20 3c  r query.</i>.  <
1cd80 69 3e 2d 2d 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d  i>--</i>.  <i>--
1cd90 20 20 20 32 2e 20 54 68 65 20 73 75 62 2d 71 75     2. The sub-qu
1cda0 65 72 79 20 6a 6f 69 6e 73 20 74 68 65 20 64 6f  ery joins the do
1cdb0 63 75 6d 65 6e 74 73 20 74 61 62 6c 65 20 77 69  cuments table wi
1cdc0 74 68 20 74 68 65 20 64 6f 63 75 6d 65 6e 74 5f  th the document_
1cdd0 64 61 74 61 20 74 61 62 6c 65 2c 20 73 6f 20 74  data table, so t
1cde0 68 61 74 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20  hat</i>.  <i>-- 
1cdf0 20 20 20 20 20 69 6d 70 6c 65 6d 65 6e 74 61 74       implementat
1ce00 69 6f 6e 20 6f 66 20 74 68 65 20 72 61 6e 6b 20  ion of the rank 
1ce10 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 61 63 63  function has acc
1ce20 65 73 73 20 74 6f 20 74 68 65 20 73 74 61 74 69  ess to the stati
1ce30 63 20 77 65 69 67 68 74 20 61 73 73 69 67 6e 65  c weight assigne
1ce40 64 3c 2f 69 3e 0a 20 20 3c 69 3e 2d 2d 20 20 20  d</i>.  <i>--   
1ce50 20 20 20 74 6f 20 65 61 63 68 20 64 6f 63 75 6d     to each docum
1ce60 65 6e 74 2e 3c 2f 69 3e 0a 20 20 53 45 4c 45 43  ent.</i>.  SELEC
1ce70 54 20 74 69 74 6c 65 2c 20 73 6e 69 70 70 65 74  T title, snippet
1ce80 28 64 6f 63 75 6d 65 6e 74 73 29 20 46 52 4f 4d  (documents) FROM
1ce90 20 64 6f 63 75 6d 65 6e 74 73 20 4a 4f 49 4e 20   documents JOIN 
1cea0 28 20 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20  ( .      SELECT 
1ceb0 64 6f 63 69 64 2c 20 72 61 6e 6b 28 6d 61 74 63  docid, rank(matc
1cec0 68 69 6e 66 6f 28 64 6f 63 75 6d 65 6e 74 73 29  hinfo(documents)
1ced0 2c 20 64 6f 63 75 6d 65 6e 74 73 5f 64 61 74 61  , documents_data
1cee0 2e 77 65 69 67 68 74 29 20 41 53 20 72 61 6e 6b  .weight) AS rank
1cef0 0a 20 20 20 20 20 20 46 52 4f 4d 20 64 6f 63 75  .      FROM docu
1cf00 6d 65 6e 74 73 20 4a 4f 49 4e 20 64 6f 63 75 6d  ments JOIN docum
1cf10 65 6e 74 73 5f 64 61 74 61 20 55 53 49 4e 47 28  ents_data USING(
1cf20 64 6f 63 69 64 29 0a 20 20 20 20 20 20 57 48 45  docid).      WHE
1cf30 52 45 20 64 6f 63 75 6d 65 6e 74 73 20 4d 41 54  RE documents MAT
1cf40 43 48 20 26 6c 74 3b 71 75 65 72 79 26 67 74 3b  CH &lt;query&gt;
1cf50 0a 20 20 20 20 20 20 4f 52 44 45 52 20 42 59 20  .      ORDER BY 
1cf60 72 61 6e 6b 20 44 45 53 43 20 0a 20 20 20 20 20  rank DESC .     
1cf70 20 4c 49 4d 49 54 20 31 30 20 4f 46 46 53 45 54   LIMIT 10 OFFSET
1cf80 20 30 0a 20 20 29 20 41 53 20 72 61 6e 6b 74 61   0.  ) AS rankta
1cf90 62 6c 65 20 55 53 49 4e 47 28 64 6f 63 69 64 29  ble USING(docid)
1cfa0 0a 20 20 57 48 45 52 45 20 64 6f 63 75 6d 65 6e  .  WHERE documen
1cfb0 74 73 20 4d 41 54 43 48 20 26 6c 74 3b 71 75 65  ts MATCH &lt;que
1cfc0 72 79 26 67 74 3b 0a 20 20 4f 52 44 45 52 20 42  ry&gt;.  ORDER B
1cfd0 59 20 72 61 6e 6b 74 61 62 6c 65 2e 72 61 6e 6b  Y ranktable.rank
1cfe0 20 44 45 53 43 0a 3c 2f 63 6f 64 65 62 6c 6f 63   DESC.</codebloc
1cff0 6b 3e 0a 0a 3c 70 3e 0a 20 20 41 6c 6c 20 74 68  k>..<p>.  All th
1d000 65 20 65 78 61 6d 70 6c 65 20 71 75 65 72 69 65  e example querie
1d010 73 20 61 62 6f 76 65 20 72 65 74 75 72 6e 20 74  s above return t
1d020 68 65 20 74 65 6e 20 6d 6f 73 74 20 72 65 6c 65  he ten most rele
1d030 76 61 6e 74 20 71 75 65 72 79 20 72 65 73 75 6c  vant query resul
1d040 74 73 2e 0a 20 20 42 79 20 6d 6f 64 69 66 79 69  ts..  By modifyi
1d050 6e 67 20 74 68 65 20 76 61 6c 75 65 73 20 75 73  ng the values us
1d060 65 64 20 77 69 74 68 20 74 68 65 20 4f 46 46 53  ed with the OFFS
1d070 45 54 20 61 6e 64 20 4c 49 4d 49 54 20 63 6c 61  ET and LIMIT cla
1d080 75 73 65 73 2c 20 61 20 71 75 65 72 79 20 0a 20  uses, a query . 
1d090 20 74 6f 20 72 65 74 75 72 6e 20 28 73 61 79 29   to return (say)
1d0a0 20 74 68 65 20 6e 65 78 74 20 74 65 6e 20 6d 6f   the next ten mo
1d0b0 73 74 20 72 65 6c 65 76 61 6e 74 20 72 65 73 75  st relevant resu
1d0c0 6c 74 73 20 69 73 20 65 61 73 79 20 74 6f 20 63  lts is easy to c
1d0d0 6f 6e 73 74 72 75 63 74 2e 20 0a 20 20 54 68 69  onstruct. .  Thi
1d0e0 73 20 6d 61 79 20 62 65 20 75 73 65 64 20 74 6f  s may be used to
1d0f0 20 6f 62 74 61 69 6e 20 74 68 65 20 64 61 74 61   obtain the data
1d100 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 61 20   required for a 
1d110 73 65 61 72 63 68 20 61 70 70 6c 69 63 61 74 69  search applicati
1d120 6f 6e 73 20 73 65 63 6f 6e 64 0a 20 20 61 6e 64  ons second.  and
1d130 20 73 75 62 73 65 71 75 65 6e 74 20 70 61 67 65   subsequent page
1d140 73 20 6f 66 20 72 65 73 75 6c 74 73 2e 0a 0a 3c  s of results...<
1d150 70 3e 0a 20 20 54 68 65 20 6e 65 78 74 20 62 6c  p>.  The next bl
1d160 6f 63 6b 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20  ock contains an 
1d170 65 78 61 6d 70 6c 65 20 72 61 6e 6b 20 66 75 6e  example rank fun
1d180 63 74 69 6f 6e 20 74 68 61 74 20 75 73 65 73 20  ction that uses 
1d190 6d 61 74 63 68 69 6e 66 6f 20 64 61 74 61 20 0a  matchinfo data .
1d1a0 20 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 69 6e    implemented in
1d1b0 20 43 2e 20 49 6e 73 74 65 61 64 20 6f 66 20 61   C. Instead of a
1d1c0 20 73 69 6e 67 6c 65 20 77 65 69 67 68 74 2c 20   single weight, 
1d1d0 69 74 20 61 6c 6c 6f 77 73 20 61 20 77 65 69 67  it allows a weig
1d1e0 68 74 20 74 6f 20 62 65 20 0a 20 20 65 78 74 65  ht to be .  exte
1d1f0 72 6e 61 6c 6c 79 20 61 73 73 69 67 6e 65 64 20  rnally assigned 
1d200 74 6f 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 6f  to each column o
1d210 66 20 65 61 63 68 20 64 6f 63 75 6d 65 6e 74 2e  f each document.
1d220 20 49 74 20 6d 61 79 20 62 65 20 72 65 67 69 73   It may be regis
1d230 74 65 72 65 64 0a 20 20 77 69 74 68 20 53 51 4c  tered.  with SQL
1d240 69 74 65 20 6c 69 6b 65 20 61 6e 79 20 6f 74 68  ite like any oth
1d250 65 72 20 75 73 65 72 20 66 75 6e 63 74 69 6f 6e  er user function
1d260 20 75 73 69 6e 67 20 5b 73 71 6c 69 74 65 33 5f   using [sqlite3_
1d270 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5d  create_function]
1d280 2e 0a 0a 3c 63 6f 64 65 62 6c 6f 63 6b 3e 0a 3c  ...<codeblock>.<
1d290 69 3e 2f 2a 3c 2f 69 3e 0a 3c 69 3e 2a 2a 20 53  i>/*</i>.<i>** S
1d2a0 51 4c 69 74 65 20 75 73 65 72 20 64 65 66 69 6e  QLite user defin
1d2b0 65 64 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 75  ed function to u
1d2c0 73 65 20 77 69 74 68 20 6d 61 74 63 68 69 6e 66  se with matchinf
1d2d0 6f 28 29 20 74 6f 20 63 61 6c 63 75 6c 61 74 65  o() to calculate
1d2e0 20 74 68 65 3c 2f 69 3e 0a 3c 69 3e 2a 2a 20 72   the</i>.<i>** r
1d2f0 65 6c 65 76 61 6e 63 79 20 6f 66 20 61 6e 20 46  elevancy of an F
1d300 54 53 20 6d 61 74 63 68 2e 20 54 68 65 20 76 61  TS match. The va
1d310 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20  lue returned is 
1d320 74 68 65 20 72 65 6c 65 76 61 6e 63 79 20 73 63  the relevancy sc
1d330 6f 72 65 3c 2f 69 3e 0a 3c 69 3e 2a 2a 20 28 61  ore</i>.<i>** (a
1d340 20 72 65 61 6c 20 76 61 6c 75 65 20 67 72 65 61   real value grea
1d350 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ter than or equa
1d360 6c 20 74 6f 20 7a 65 72 6f 29 2e 20 41 20 6c 61  l to zero). A la
1d370 72 67 65 72 20 76 61 6c 75 65 20 69 6e 64 69 63  rger value indic
1d380 61 74 65 73 20 3c 2f 69 3e 0a 3c 69 3e 2a 2a 20  ates </i>.<i>** 
1d390 61 20 6d 6f 72 65 20 72 65 6c 65 76 61 6e 74 20  a more relevant 
1d3a0 64 6f 63 75 6d 65 6e 74 2e 3c 2f 69 3e 0a 3c 69  document.</i>.<i
1d3b0 3e 2a 2a 3c 2f 69 3e 0a 3c 69 3e 2a 2a 20 54 68  >**</i>.<i>** Th
1d3c0 65 20 6f 76 65 72 61 6c 6c 20 72 65 6c 65 76 61  e overall releva
1d3d0 6e 63 79 20 72 65 74 75 72 6e 65 64 20 69 73 20  ncy returned is 
1d3e0 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 72  the sum of the r
1d3f0 65 6c 65 76 61 6e 63 69 65 73 20 6f 66 20 65 61  elevancies of ea
1d400 63 68 20 3c 2f 69 3e 0a 3c 69 3e 2a 2a 20 63 6f  ch </i>.<i>** co
1d410 6c 75 6d 6e 20 76 61 6c 75 65 20 69 6e 20 74 68  lumn value in th
1d420 65 20 46 54 53 20 74 61 62 6c 65 2e 20 54 68 65  e FTS table. The
1d430 20 72 65 6c 65 76 61 6e 63 79 20 6f 66 20 61 20   relevancy of a 
1d440 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69 73 20  column value is 
1d450 74 68 65 3c 2f 69 3e 0a 3c 69 3e 2a 2a 20 73 75  the</i>.<i>** su
1d460 6d 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  m of the followi
1d470 6e 67 20 66 6f 72 20 65 61 63 68 20 72 65 70 6f  ng for each repo
1d480 72 74 61 62 6c 65 20 70 68 72 61 73 65 20 69 6e  rtable phrase in
1d490 20 74 68 65 20 46 54 53 20 71 75 65 72 79 3a 3c   the FTS query:<
1d4a0 2f 69 3e 0a 3c 69 3e 2a 2a 3c 2f 69 3e 0a 3c 69  /i>.<i>**</i>.<i
1d4b0 3e 2a 2a 20 20 20 28 26 6c 74 3b 68 69 74 20 63  >**   (&lt;hit c
1d4c0 6f 75 6e 74 26 67 74 3b 20 2f 20 26 6c 74 3b 67  ount&gt; / &lt;g
1d4d0 6c 6f 62 61 6c 20 68 69 74 20 63 6f 75 6e 74 26  lobal hit count&
1d4e0 67 74 29 20 2a 20 26 6c 74 3b 63 6f 6c 75 6d 6e  gt) * &lt;column
1d4f0 20 77 65 69 67 68 74 26 67 74 3b 3c 2f 69 3e 0a   weight&gt;</i>.
1d500 3c 69 3e 2a 2a 3c 2f 69 3e 0a 3c 69 3e 2a 2a 20  <i>**</i>.<i>** 
1d510 77 68 65 72 65 20 26 6c 74 3b 68 69 74 20 63 6f  where &lt;hit co
1d520 75 6e 74 26 67 74 3b 20 69 73 20 74 68 65 20 6e  unt&gt; is the n
1d530 75 6d 62 65 72 20 6f 66 20 69 6e 73 74 61 6e 63  umber of instanc
1d540 65 73 20 6f 66 20 74 68 65 20 70 68 72 61 73 65  es of the phrase
1d550 20 69 6e 20 74 68 65 3c 2f 69 3e 0a 3c 69 3e 2a   in the</i>.<i>*
1d560 2a 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 6f  * column value o
1d570 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f  f the current ro
1d580 77 20 61 6e 64 20 26 6c 74 3b 67 6c 6f 62 61 6c  w and &lt;global
1d590 20 68 69 74 20 63 6f 75 6e 74 26 67 74 3b 20 69   hit count&gt; i
1d5a0 73 20 74 68 65 20 6e 75 6d 62 65 72 3c 2f 69 3e  s the number</i>
1d5b0 0a 3c 69 3e 2a 2a 20 6f 66 20 69 6e 73 74 61 6e  .<i>** of instan
1d5c0 63 65 73 20 6f 66 20 74 68 65 20 70 68 72 61 73  ces of the phras
1d5d0 65 20 69 6e 20 74 68 65 20 73 61 6d 65 20 63 6f  e in the same co
1d5e0 6c 75 6d 6e 20 6f 66 20 61 6c 6c 20 72 6f 77 73  lumn of all rows
1d5f0 20 69 6e 20 74 68 65 20 46 54 53 3c 2f 69 3e 0a   in the FTS</i>.
1d600 3c 69 3e 2a 2a 20 74 61 62 6c 65 2e 20 54 68 65  <i>** table. The
1d610 20 26 6c 74 3b 63 6f 6c 75 6d 6e 20 77 65 69 67   &lt;column weig
1d620 68 74 26 67 74 3b 20 69 73 20 61 20 77 65 69 67  ht&gt; is a weig
1d630 68 74 69 6e 67 20 66 61 63 74 6f 72 20 61 73 73  hting factor ass
1d640 69 67 6e 65 64 20 74 6f 20 65 61 63 68 3c 2f 69  igned to each</i
1d650 3e 0a 3c 69 3e 2a 2a 20 63 6f 6c 75 6d 6e 20 62  >.<i>** column b
1d660 79 20 74 68 65 20 63 61 6c 6c 65 72 20 28 73 65  y the caller (se
1d670 65 20 62 65 6c 6f 77 29 2e 3c 2f 69 3e 0a 3c 69  e below).</i>.<i
1d680 3e 2a 2a 3c 2f 69 3e 0a 3c 69 3e 2a 2a 20 54 68  >**</i>.<i>** Th
1d690 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
1d6a0 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
1d6b0 6e 20 6d 75 73 74 20 62 65 20 74 68 65 20 72 65  n must be the re
1d6c0 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 74 68  turn value of th
1d6d0 65 20 46 54 53 20 3c 2f 69 3e 0a 3c 69 3e 2a 2a  e FTS </i>.<i>**
1d6e0 20 6d 61 74 63 68 69 6e 66 6f 28 29 20 66 75 6e   matchinfo() fun
1d6f0 63 74 69 6f 6e 2e 20 46 6f 6c 6c 6f 77 69 6e 67  ction. Following
1d700 20 74 68 69 73 20 6d 75 73 74 20 62 65 20 6f 6e   this must be on
1d710 65 20 61 72 67 75 6d 65 6e 74 20 66 6f 72 20 65  e argument for e
1d720 61 63 68 20 63 6f 6c 75 6d 6e 20 3c 2f 69 3e 0a  ach column </i>.
1d730 3c 69 3e 2a 2a 20 6f 66 20 74 68 65 20 46 54 53  <i>** of the FTS
1d740 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e   table containin
1d750 67 20 61 20 6e 75 6d 65 72 69 63 20 77 65 69 67  g a numeric weig
1d760 68 74 20 66 61 63 74 6f 72 20 66 6f 72 20 74 68  ht factor for th
1d770 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
1d780 3c 2f 69 3e 0a 3c 69 3e 2a 2a 20 63 6f 6c 75 6d  </i>.<i>** colum
1d790 6e 2e 20 45 78 61 6d 70 6c 65 3a 3c 2f 69 3e 0a  n. Example:</i>.
1d7a0 3c 69 3e 2a 2a 3c 2f 69 3e 0a 3c 69 3e 2a 2a 20  <i>**</i>.<i>** 
1d7b0 20 20 20 20 43 52 45 41 54 45 20 56 49 52 54 55      CREATE VIRTU
1d7c0 41 4c 20 54 41 42 4c 45 20 64 6f 63 75 6d 65 6e  AL TABLE documen
1d7d0 74 73 20 55 53 49 4e 47 20 66 74 73 33 28 74 69  ts USING fts3(ti
1d7e0 74 6c 65 2c 20 63 6f 6e 74 65 6e 74 29 3c 2f 69  tle, content)</i
1d7f0 3e 0a 3c 69 3e 2a 2a 3c 2f 69 3e 0a 3c 69 3e 2a  >.<i>**</i>.<i>*
1d800 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
1d810 71 75 65 72 79 20 72 65 74 75 72 6e 73 20 74 68  query returns th
1d820 65 20 64 6f 63 69 64 73 20 6f 66 20 64 6f 63 75  e docids of docu
1d830 6d 65 6e 74 73 20 74 68 61 74 20 6d 61 74 63 68  ments that match
1d840 20 74 68 65 20 66 75 6c 6c 2d 74 65 78 74 3c 2f   the full-text</
1d850 69 3e 0a 3c 69 3e 2a 2a 20 71 75 65 72 79 20 26  i>.<i>** query &
1d860 6c 74 3b 71 75 65 72 79 26 67 74 3b 20 73 6f 72  lt;query&gt; sor
1d870 74 65 64 20 66 72 6f 6d 20 6d 6f 73 74 20 74 6f  ted from most to
1d880 20 6c 65 61 73 74 20 72 65 6c 65 76 61 6e 74 2e   least relevant.
1d890 20 57 68 65 6e 20 63 61 6c 63 75 6c 61 74 69 6e   When calculatin
1d8a0 67 3c 2f 69 3e 0a 3c 69 3e 2a 2a 20 72 65 6c 65  g</i>.<i>** rele
1d8b0 76 61 6e 63 65 2c 20 71 75 65 72 79 20 74 65 72  vance, query ter
1d8c0 6d 20 69 6e 73 74 61 6e 63 65 73 20 69 6e 20 74  m instances in t
1d8d0 68 65 20 27 74 69 74 6c 65 27 20 63 6f 6c 75 6d  he 'title' colum
1d8e0 6e 20 61 72 65 20 67 69 76 65 6e 20 74 77 69 63  n are given twic
1d8f0 65 20 74 68 65 3c 2f 69 3e 0a 3c 69 3e 2a 2a 20  e the</i>.<i>** 
1d900 77 65 69 67 68 74 69 6e 67 20 6f 66 20 74 68 6f  weighting of tho
1d910 73 65 20 69 6e 20 74 68 65 20 27 63 6f 6e 74 65  se in the 'conte
1d920 6e 74 27 20 63 6f 6c 75 6d 6e 2e 3c 2f 69 3e 0a  nt' column.</i>.
1d930 3c 69 3e 2a 2a 3c 2f 69 3e 0a 3c 69 3e 2a 2a 20  <i>**</i>.<i>** 
1d940 20 20 20 20 53 45 4c 45 43 54 20 64 6f 63 69 64      SELECT docid
1d950 20 46 52 4f 4d 20 64 6f 63 75 6d 65 6e 74 73 20   FROM documents 
1d960 3c 2f 69 3e 0a 3c 69 3e 2a 2a 20 20 20 20 20 57  </i>.<i>**     W
1d970 48 45 52 45 20 64 6f 63 75 6d 65 6e 74 73 20 4d  HERE documents M
1d980 41 54 43 48 20 26 6c 74 3b 71 75 65 72 79 26 67  ATCH &lt;query&g
1d990 74 3b 20 3c 2f 69 3e 0a 3c 69 3e 2a 2a 20 20 20  t; </i>.<i>**   
1d9a0 20 20 4f 52 44 45 52 20 42 59 20 72 61 6e 6b 28    ORDER BY rank(
1d9b0 6d 61 74 63 68 69 6e 66 6f 28 64 6f 63 75 6d 65  matchinfo(docume
1d9c0 6e 74 73 29 2c 20 31 2e 30 2c 20 30 2e 35 29 20  nts), 1.0, 0.5) 
1d9d0 44 45 53 43 3c 2f 69 3e 0a 3c 69 3e 2a 2f 3c 2f  DESC</i>.<i>*/</
1d9e0 69 3e 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  i>.static void r
1d9f0 61 6e 6b 66 75 6e 63 28 73 71 6c 69 74 65 33 5f  ankfunc(sqlite3_
1da00 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 69  context *pCtx, i
1da10 6e 74 20 6e 56 61 6c 2c 20 73 71 6c 69 74 65 33  nt nVal, sqlite3
1da20 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c 29 7b  _value **apVal){
1da30 0a 20 20 69 6e 74 20 2a 61 4d 61 74 63 68 69 6e  .  int *aMatchin
1da40 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  fo;             
1da50 20 20 20 3c 69 3e 2f 2a 20 52 65 74 75 72 6e 20     <i>/* Return 
1da60 76 61 6c 75 65 20 6f 66 20 6d 61 74 63 68 69 6e  value of matchin
1da70 66 6f 28 29 20 2a 2f 3c 2f 69 3e 0a 20 20 69 6e  fo() */</i>.  in
1da80 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  t nCol;         
1da90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3c 69                <i
1daa0 3e 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f  >/* Number of co
1dab0 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 74 61 62  lumns in the tab
1dac0 6c 65 20 2a 2f 3c 2f 69 3e 0a 20 20 69 6e 74 20  le */</i>.  int 
1dad0 6e 50 68 72 61 73 65 3b 20 20 20 20 20 20 20 20  nPhrase;        
1dae0 20 20 20 20 20 20 20 20 20 20 20 20 3c 69 3e 2f              <i>/
1daf0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 68 72 61  * Number of phra
1db00 73 65 73 20 69 6e 20 74 68 65 20 71 75 65 72 79  ses in the query
1db10 20 2a 2f 3c 2f 69 3e 0a 20 20 69 6e 74 20 69 50   */</i>.  int iP
1db20 68 72 61 73 65 3b 20 20 20 20 20 20 20 20 20 20  hrase;          
1db30 20 20 20 20 20 20 20 20 20 20 3c 69 3e 2f 2a 20            <i>/* 
1db40 43 75 72 72 65 6e 74 20 70 68 72 61 73 65 20 2a  Current phrase *
1db50 2f 3c 2f 69 3e 0a 20 20 64 6f 75 62 6c 65 20 73  /</i>.  double s
1db60 63 6f 72 65 20 3d 20 30 2e 30 3b 20 20 20 20 20  core = 0.0;     
1db70 20 20 20 20 20 20 20 20 3c 69 3e 2f 2a 20 56 61          <i>/* Va
1db80 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  lue to return */
1db90 3c 2f 69 3e 0a 0a 20 20 61 73 73 65 72 74 28 20  </i>..  assert( 
1dba0 73 69 7a 65 6f 66 28 69 6e 74 29 3d 3d 34 20 29  sizeof(int)==4 )
1dbb0 3b 0a 0a 3c 69 3e 20 20 2f 2a 20 43 68 65 63 6b  ;..<i>  /* Check
1dbc0 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72   that the number
1dbd0 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 70 61   of arguments pa
1dbe0 73 73 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e  ssed to this fun
1dbf0 63 74 69 6f 6e 20 69 73 20 63 6f 72 72 65 63 74  ction is correct
1dc00 2e 3c 2f 69 3e 0a 3c 69 3e 20 20 2a 2a 20 49 66  .</i>.<i>  ** If
1dc10 20 6e 6f 74 2c 20 6a 75 6d 70 20 74 6f 20 77 72   not, jump to wr
1dc20 6f 6e 67 5f 6e 75 6d 62 65 72 5f 61 72 67 73 2e  ong_number_args.
1dc30 20 53 65 74 20 61 4d 61 74 63 68 69 6e 66 6f 20   Set aMatchinfo 
1dc40 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
1dc50 61 72 72 61 79 3c 2f 69 3e 0a 3c 69 3e 20 20 2a  array</i>.<i>  *
1dc60 2a 20 6f 66 20 75 6e 73 69 67 6e 65 64 20 69 6e  * of unsigned in
1dc70 74 65 67 65 72 20 76 61 6c 75 65 73 20 72 65 74  teger values ret
1dc80 75 72 6e 65 64 20 62 79 20 46 54 53 20 66 75 6e  urned by FTS fun
1dc90 63 74 69 6f 6e 20 6d 61 74 63 68 69 6e 66 6f 2e  ction matchinfo.
1dca0 20 53 65 74 3c 2f 69 3e 0a 3c 69 3e 20 20 2a 2a   Set</i>.<i>  **
1dcb0 20 6e 50 68 72 61 73 65 20 74 6f 20 63 6f 6e 74   nPhrase to cont
1dcc0 61 69 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ain the number o
1dcd0 66 20 72 65 70 6f 72 74 61 62 6c 65 20 70 68 72  f reportable phr
1dce0 61 73 65 73 20 69 6e 20 74 68 65 20 75 73 65 72  ases in the user
1dcf0 73 20 66 75 6c 6c 2d 74 65 78 74 3c 2f 69 3e 0a  s full-text</i>.
1dd00 3c 69 3e 20 20 2a 2a 20 71 75 65 72 79 2c 20 61  <i>  ** query, a
1dd10 6e 64 20 6e 43 6f 6c 20 74 6f 20 74 68 65 20 6e  nd nCol to the n
1dd20 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
1dd30 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 3c 2f   in the table.</
1dd40 69 3e 0a 3c 69 3e 20 20 2a 2f 3c 2f 69 3e 0a 20  i>.<i>  */</i>. 
1dd50 20 69 66 28 20 6e 56 61 6c 26 6c 74 3b 31 20 29   if( nVal&lt;1 )
1dd60 20 67 6f 74 6f 20 77 72 6f 6e 67 5f 6e 75 6d 62   goto wrong_numb
1dd70 65 72 5f 61 72 67 73 3b 0a 20 20 61 4d 61 74 63  er_args;.  aMatc
1dd80 68 69 6e 66 6f 20 3d 20 28 75 6e 73 69 67 6e 65  hinfo = (unsigne
1dd90 64 20 69 6e 74 20 2a 29 73 71 6c 69 74 65 33 5f  d int *)sqlite3_
1dda0 76 61 6c 75 65 5f 62 6c 6f 62 28 61 70 56 61 6c  value_blob(apVal
1ddb0 26 23 78 35 42 3b 30 26 23 78 35 44 3b 29 3b 0a  &#x5B;0&#x5D;);.
1ddc0 20 20 6e 50 68 72 61 73 65 20 3d 20 61 4d 61 74    nPhrase = aMat
1ddd0 63 68 69 6e 66 6f 26 23 78 35 42 3b 30 26 23 78  chinfo&#x5B;0&#x
1dde0 35 44 3b 3b 0a 20 20 6e 43 6f 6c 20 3d 20 61 4d  5D;;.  nCol = aM
1ddf0 61 74 63 68 69 6e 66 6f 26 23 78 35 42 3b 31 26  atchinfo&#x5B;1&
1de00 23 78 35 44 3b 3b 0a 20 20 69 66 28 20 6e 56 61  #x5D;;.  if( nVa
1de10 6c 21 3d 28 31 2b 6e 43 6f 6c 29 20 29 20 67 6f  l!=(1+nCol) ) go
1de20 74 6f 20 77 72 6f 6e 67 5f 6e 75 6d 62 65 72 5f  to wrong_number_
1de30 61 72 67 73 3b 0a 0a 3c 69 3e 20 20 2f 2a 20 49  args;..<i>  /* I
1de40 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 65  terate through e
1de50 61 63 68 20 70 68 72 61 73 65 20 69 6e 20 74 68  ach phrase in th
1de60 65 20 75 73 65 72 73 20 71 75 65 72 79 2e 20 2a  e users query. *
1de70 2f 3c 2f 69 3e 0a 20 20 66 6f 72 28 69 50 68 72  /</i>.  for(iPhr
1de80 61 73 65 3d 30 3b 20 69 50 68 72 61 73 65 26 6c  ase=0; iPhrase&l
1de90 74 3b 6e 50 68 72 61 73 65 3b 20 69 50 68 72 61  t;nPhrase; iPhra
1dea0 73 65 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 69  se++){.    int i
1deb0 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
1dec0 20 20 20 20 20 20 20 20 20 3c 69 3e 2f 2a 20 43           <i>/* C
1ded0 75 72 72 65 6e 74 20 63 6f 6c 75 6d 6e 20 2a 2f  urrent column */
1dee0 3c 2f 69 3e 0a 0a 3c 69 3e 20 20 20 20 2f 2a 20  </i>..<i>    /* 
1def0 4e 6f 77 20 69 74 65 72 61 74 65 20 74 68 72 6f  Now iterate thro
1df00 75 67 68 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20  ugh each column 
1df10 69 6e 20 74 68 65 20 75 73 65 72 73 20 71 75 65  in the users que
1df20 72 79 2e 20 46 6f 72 20 65 61 63 68 20 63 6f 6c  ry. For each col
1df30 75 6d 6e 2c 3c 2f 69 3e 0a 3c 69 3e 20 20 20 20  umn,</i>.<i>    
1df40 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65  ** increment the
1df50 20 72 65 6c 65 76 61 6e 63 79 20 73 63 6f 72 65   relevancy score
1df60 20 62 79 3a 3c 2f 69 3e 0a 3c 69 3e 20 20 20 20   by:</i>.<i>    
1df70 2a 2a 3c 2f 69 3e 0a 3c 69 3e 20 20 20 20 2a 2a  **</i>.<i>    **
1df80 20 20 20 28 26 6c 74 3b 68 69 74 20 63 6f 75 6e     (&lt;hit coun
1df90 74 26 67 74 3b 20 2f 20 26 6c 74 3b 67 6c 6f 62  t&gt; / &lt;glob
1dfa0 61 6c 20 68 69 74 20 63 6f 75 6e 74 26 67 74 29  al hit count&gt)
1dfb0 20 2a 20 26 6c 74 3b 63 6f 6c 75 6d 6e 20 77 65   * &lt;column we
1dfc0 69 67 68 74 26 67 74 3b 3c 2f 69 3e 0a 3c 69 3e  ight&gt;</i>.<i>
1dfd0 20 20 20 20 2a 2a 3c 2f 69 3e 0a 3c 69 3e 20 20      **</i>.<i>  
1dfe0 20 20 2a 2a 20 61 50 68 72 61 73 65 69 6e 66 6f    ** aPhraseinfo
1dff0 26 23 78 35 42 3b 26 23 78 35 44 3b 20 70 6f 69  &#x5B;&#x5D; poi
1e000 6e 74 73 20 74 6f 20 74 68 65 20 73 74 61 72 74  nts to the start
1e010 20 6f 66 20 74 68 65 20 64 61 74 61 20 66 6f 72   of the data for
1e020 20 70 68 72 61 73 65 20 69 50 68 72 61 73 65 2e   phrase iPhrase.
1e030 20 53 6f 3c 2f 69 3e 0a 3c 69 3e 20 20 20 20 2a   So</i>.<i>    *
1e040 2a 20 74 68 65 20 68 69 74 20 63 6f 75 6e 74 20  * the hit count 
1e050 61 6e 64 20 67 6c 6f 62 61 6c 20 68 69 74 20 63  and global hit c
1e060 6f 75 6e 74 73 20 66 6f 72 20 65 61 63 68 20 63  ounts for each c
1e070 6f 6c 75 6d 6e 20 61 72 65 20 66 6f 75 6e 64 20  olumn are found 
1e080 69 6e 20 3c 2f 69 3e 0a 3c 69 3e 20 20 20 20 2a  in </i>.<i>    *
1e090 2a 20 61 50 68 72 61 73 65 69 6e 66 6f 26 23 78  * aPhraseinfo&#x
1e0a0 35 42 3b 69 43 6f 6c 2a 33 26 23 78 35 44 3b 20  5B;iCol*3&#x5D; 
1e0b0 61 6e 64 20 61 50 68 72 61 73 65 69 6e 66 6f 26  and aPhraseinfo&
1e0c0 23 78 35 42 3b 69 43 6f 6c 2a 33 2b 31 26 23 78  #x5B;iCol*3+1&#x
1e0d0 35 44 3b 2c 20 72 65 73 70 65 63 74 69 76 65 6c  5D;, respectivel
1e0e0 79 2e 3c 2f 69 3e 0a 3c 69 3e 20 20 20 20 2a 2f  y.</i>.<i>    */
1e0f0 3c 2f 69 3e 0a 20 20 20 20 69 6e 74 20 2a 61 50  </i>.    int *aP
1e100 68 72 61 73 65 69 6e 66 6f 20 3d 20 26 61 4d 61  hraseinfo = &aMa
1e110 74 63 68 69 6e 66 6f 26 23 78 35 42 3b 32 20 2b  tchinfo&#x5B;2 +
1e120 20 69 50 68 72 61 73 65 2a 6e 43 6f 6c 2a 33 26   iPhrase*nCol*3&
1e130 23 78 35 44 3b 3b 0a 20 20 20 20 66 6f 72 28 69  #x5D;;.    for(i
1e140 43 6f 6c 3d 30 3b 20 69 43 6f 6c 26 6c 74 3b 6e  Col=0; iCol&lt;n
1e150 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20  Col; iCol++){.  
1e160 20 20 20 20 69 6e 74 20 6e 48 69 74 43 6f 75 6e      int nHitCoun
1e170 74 20 3d 20 61 50 68 72 61 73 65 69 6e 66 6f 26  t = aPhraseinfo&
1e180 23 78 35 42 3b 33 2a 69 43 6f 6c 26 23 78 35 44  #x5B;3*iCol&#x5D
1e190 3b 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 47 6c  ;;.      int nGl
1e1a0 6f 62 61 6c 48 69 74 43 6f 75 6e 74 20 3d 20 61  obalHitCount = a
1e1b0 50 68 72 61 73 65 69 6e 66 6f 26 23 78 35 42 3b  Phraseinfo&#x5B;
1e1c0 33 2a 69 43 6f 6c 2b 31 26 23 78 35 44 3b 3b 0a  3*iCol+1&#x5D;;.
1e1d0 20 20 20 20 20 20 64 6f 75 62 6c 65 20 77 65 69        double wei
1e1e0 67 68 74 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  ght = sqlite3_va
1e1f0 6c 75 65 5f 64 6f 75 62 6c 65 28 61 70 56 61 6c  lue_double(apVal
1e200 26 23 78 35 42 3b 69 43 6f 6c 2b 31 26 23 78 35  &#x5B;iCol+1&#x5
1e210 44 3b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  D;);.      if( n
1e220 48 69 74 43 6f 75 6e 74 3e 30 20 29 7b 0a 20 20  HitCount>0 ){.  
1e230 20 20 20 20 20 20 73 63 6f 72 65 20 2b 3d 20 28        score += (
1e240 28 64 6f 75 62 6c 65 29 6e 48 69 74 43 6f 75 6e  (double)nHitCoun
1e250 74 20 2f 20 28 64 6f 75 62 6c 65 29 6e 47 6c 6f  t / (double)nGlo
1e260 62 61 6c 48 69 74 43 6f 75 6e 74 29 20 2a 20 77  balHitCount) * w
1e270 65 69 67 68 74 3b 0a 20 20 20 20 20 20 7d 0a 20  eight;.      }. 
1e280 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69     }.  }..  sqli
1e290 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c  te3_result_doubl
1e2a0 65 28 70 43 74 78 2c 20 73 63 6f 72 65 29 3b 0a  e(pCtx, score);.
1e2b0 20 20 72 65 74 75 72 6e 3b 0a 0a 3c 69 3e 20 20    return;..<i>  
1e2c0 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20  /* Jump here if 
1e2d0 74 68 65 20 77 72 6f 6e 67 20 6e 75 6d 62 65 72  the wrong number
1e2e0 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 61 72   of arguments ar
1e2f0 65 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73  e passed to this
1e300 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 3c 2f 69 3e   function */</i>
1e310 0a 77 72 6f 6e 67 5f 6e 75 6d 62 65 72 5f 61 72  .wrong_number_ar
1e320 67 73 3a 0a 20 20 73 71 6c 69 74 65 33 5f 72 65  gs:.  sqlite3_re
1e330 73 75 6c 74 5f 65 72 72 6f 72 28 70 43 74 78 2c  sult_error(pCtx,
1e340 20 22 77 72 6f 6e 67 20 6e 75 6d 62 65 72 20 6f   "wrong number o
1e350 66 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 66  f arguments to f
1e360 75 6e 63 74 69 6f 6e 20 72 61 6e 6b 28 29 22 2c  unction rank()",
1e370 20 2d 31 29 3b 0a 7d 0a 3c 2f 63 6f 64 65 62 6c   -1);.}.</codebl
1e380 6f 63 6b 3e 0a                                   ock>.